multimedia_paradise 1.1.344

Sign up to get free protection for your applications and to get access to all the features.
Files changed (382) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +2720 -0
  3. data/bin/audio_player +12 -0
  4. data/bin/auto_title +7 -0
  5. data/bin/convert_audio_to_mp4video_with_image +7 -0
  6. data/bin/cut_audio +7 -0
  7. data/bin/cut_multimedia +7 -0
  8. data/bin/extract_audio +7 -0
  9. data/bin/extract_images_from_this_video_file +7 -0
  10. data/bin/ffmpeg_merge +7 -0
  11. data/bin/file_duration +7 -0
  12. data/bin/gtk_radio +7 -0
  13. data/bin/has_audio +7 -0
  14. data/bin/loop_this_video +7 -0
  15. data/bin/merge_avi_files +7 -0
  16. data/bin/merge_mp3 +7 -0
  17. data/bin/missing_video_files +7 -0
  18. data/bin/movie_searcher +7 -0
  19. data/bin/mp3_to_opus +7 -0
  20. data/bin/mpg_to_mp4 +7 -0
  21. data/bin/mplayer_wrapper +7 -0
  22. data/bin/multimedia_information +11 -0
  23. data/bin/multimedia_paradise +9 -0
  24. data/bin/multimedia_paradise_sinatra +7 -0
  25. data/bin/play_random_simpsons_video +7 -0
  26. data/bin/playlist +7 -0
  27. data/bin/random_video +7 -0
  28. data/bin/remove_audio +9 -0
  29. data/bin/remove_last_second +7 -0
  30. data/bin/remove_subtitles +7 -0
  31. data/bin/reverse_video +7 -0
  32. data/bin/rubio +58 -0
  33. data/bin/tag_mp3_files +7 -0
  34. data/bin/to_aiff +10 -0
  35. data/bin/to_mp4 +7 -0
  36. data/bin/verbose_analyse_this_mp3_file_for_id3_tags +9 -0
  37. data/bin/video_codec +7 -0
  38. data/bin/video_information +8 -0
  39. data/bin/video_player +11 -0
  40. data/bin/video_thumbnail +7 -0
  41. data/bin/video_to_images +7 -0
  42. data/bin/vp9 +9 -0
  43. data/bin/waveform +73 -0
  44. data/doc/CHANGELOG.md +44 -0
  45. data/doc/LINKS.md +6 -0
  46. data/doc/MOTIVATION_FOR_THIS_PROJECT.md +22 -0
  47. data/doc/MergingVideoLectures.md +12 -0
  48. data/doc/README.gen +2658 -0
  49. data/doc/Readme_for_the_cut_audio_component.md +168 -0
  50. data/doc/todo/todo_for_the_GUIs.md +0 -0
  51. data/doc/todo/todo_for_the_multimedia_paradise_project.md +111 -0
  52. data/lib/multimedia_paradise/audio/audio_player/audio_player.rb +1143 -0
  53. data/lib/multimedia_paradise/audio/audio_tag_reader/README.md +7 -0
  54. data/lib/multimedia_paradise/audio/audio_tag_reader/audio_tag_reader.rb +503 -0
  55. data/lib/multimedia_paradise/audio/base.rb +67 -0
  56. data/lib/multimedia_paradise/audio/compress.rb +97 -0
  57. data/lib/multimedia_paradise/audio/create_m3u_playlist.rb +256 -0
  58. data/lib/multimedia_paradise/audio/extract_audio/constants.rb +37 -0
  59. data/lib/multimedia_paradise/audio/extract_audio/extract_audio.rb +417 -0
  60. data/lib/multimedia_paradise/audio/file_duration/constants.rb +53 -0
  61. data/lib/multimedia_paradise/audio/file_duration/file_duration.rb +606 -0
  62. data/lib/multimedia_paradise/audio/genres/boogie.rb +35 -0
  63. data/lib/multimedia_paradise/audio/genres/concerts.rb +35 -0
  64. data/lib/multimedia_paradise/audio/genres/constants.rb +53 -0
  65. data/lib/multimedia_paradise/audio/genres/eurodance.rb +35 -0
  66. data/lib/multimedia_paradise/audio/genres/genre.rb +696 -0
  67. data/lib/multimedia_paradise/audio/genres/hip_hop.rb +35 -0
  68. data/lib/multimedia_paradise/audio/genres/italian_songs.rb +35 -0
  69. data/lib/multimedia_paradise/audio/genres/the_1980s.rb +35 -0
  70. data/lib/multimedia_paradise/audio/genres/trance.rb +35 -0
  71. data/lib/multimedia_paradise/audio/lyrics_fetcher.rb +238 -0
  72. data/lib/multimedia_paradise/audio/merge_audio_files.rb +114 -0
  73. data/lib/multimedia_paradise/audio/modify_year_of_audio_file.rb +136 -0
  74. data/lib/multimedia_paradise/audio/n_audio_songs.rb +208 -0
  75. data/lib/multimedia_paradise/audio/play_all_audio_files.rb +122 -0
  76. data/lib/multimedia_paradise/audio/playlist/playlist.rb +1636 -0
  77. data/lib/multimedia_paradise/audio/remove_audio.rb +98 -0
  78. data/lib/multimedia_paradise/audio/remove_last_second.rb +83 -0
  79. data/lib/multimedia_paradise/audio/report_missing_id.rb +131 -0
  80. data/lib/multimedia_paradise/audio/streamripper/constants.rb +51 -0
  81. data/lib/multimedia_paradise/audio/streamripper/streamripper_wrapper.rb +279 -0
  82. data/lib/multimedia_paradise/audio/to_mp3.rb +138 -0
  83. data/lib/multimedia_paradise/audio/to_ogg.rb +104 -0
  84. data/lib/multimedia_paradise/audio/wav_to_mp3.rb +87 -0
  85. data/lib/multimedia_paradise/audio/waveform/class.rb +341 -0
  86. data/lib/multimedia_paradise/audio/waveform/constants.rb +38 -0
  87. data/lib/multimedia_paradise/audio/waveform/log.rb +101 -0
  88. data/lib/multimedia_paradise/autoinclude.rb +3 -0
  89. data/lib/multimedia_paradise/autoinclude_remove_audio.rb +6 -0
  90. data/lib/multimedia_paradise/base/base.rb +34 -0
  91. data/lib/multimedia_paradise/base/colours.rb +391 -0
  92. data/lib/multimedia_paradise/base/commandline_arguments.rb +60 -0
  93. data/lib/multimedia_paradise/base/constants.rb +19 -0
  94. data/lib/multimedia_paradise/base/encoding.rb +31 -0
  95. data/lib/multimedia_paradise/base/misc.rb +665 -0
  96. data/lib/multimedia_paradise/base/namespace.rb +36 -0
  97. data/lib/multimedia_paradise/base/time.rb +25 -0
  98. data/lib/multimedia_paradise/colours/colours.rb +89 -0
  99. data/lib/multimedia_paradise/commandline/menu.rb +463 -0
  100. data/lib/multimedia_paradise/configuration/play_zoomed.yml +1 -0
  101. data/lib/multimedia_paradise/constants/constants.rb +23 -0
  102. data/lib/multimedia_paradise/constants/conversions.rb +62 -0
  103. data/lib/multimedia_paradise/constants/directory_constants.rb +139 -0
  104. data/lib/multimedia_paradise/constants/encodings.rb +26 -0
  105. data/lib/multimedia_paradise/constants/file_constants.rb +176 -0
  106. data/lib/multimedia_paradise/constants/misc.rb +80 -0
  107. data/lib/multimedia_paradise/constants/my_video_directory.rb +30 -0
  108. data/lib/multimedia_paradise/constants/namespace.rb +14 -0
  109. data/lib/multimedia_paradise/constants/newline.rb +14 -0
  110. data/lib/multimedia_paradise/constants/video_filetypes.rb +27 -0
  111. data/lib/multimedia_paradise/constants/web_constants.rb +150 -0
  112. data/lib/multimedia_paradise/conversions/README.md +2 -0
  113. data/lib/multimedia_paradise/conversions/conversions.rb +930 -0
  114. data/lib/multimedia_paradise/css/project.css +15 -0
  115. data/lib/multimedia_paradise/data/asoundrc +12 -0
  116. data/lib/multimedia_paradise/ffmpeg/README.md +2 -0
  117. data/lib/multimedia_paradise/ffmpeg/ffmpeg.rb +620 -0
  118. data/lib/multimedia_paradise/gui/fox/play_from_radio_station.rb +75 -0
  119. data/lib/multimedia_paradise/gui/glimmer/rubio/model/bookmark.rb +61 -0
  120. data/lib/multimedia_paradise/gui/glimmer/rubio/model/player.rb +226 -0
  121. data/lib/multimedia_paradise/gui/glimmer/rubio/model/radio_browser.rb +57 -0
  122. data/lib/multimedia_paradise/gui/glimmer/rubio/model/radio_presenter.rb +132 -0
  123. data/lib/multimedia_paradise/gui/glimmer/rubio/model/station.rb +48 -0
  124. data/lib/multimedia_paradise/gui/glimmer/rubio/view/radio.rb +296 -0
  125. data/lib/multimedia_paradise/gui/gosu/video_player/video_player.rb +109 -0
  126. data/lib/multimedia_paradise/gui/gtk2/multimedia_converter/multimedia_converter.rb +33 -0
  127. data/lib/multimedia_paradise/gui/gtk2/notebook.rb +144 -0
  128. data/lib/multimedia_paradise/gui/gtk2/play_video_from_my_collection/play_video_from_my_collection.rb +43 -0
  129. data/lib/multimedia_paradise/gui/gtk2/simple_play_widget/README.md +12 -0
  130. data/lib/multimedia_paradise/gui/gtk2/simple_play_widget/simple_play_widget.rb +40 -0
  131. data/lib/multimedia_paradise/gui/gtk2/widget_increase_or_decrease_audio/widget_increase_or_decrease_audio.rb +42 -0
  132. data/lib/multimedia_paradise/gui/gtk2/youtube_downloader/youtube_downloader.rb +32 -0
  133. data/lib/multimedia_paradise/gui/gtk3/lyrics/lyrics.rb +0 -0
  134. data/lib/multimedia_paradise/gui/gtk3/multimedia_converter/multimedia_converter.rb +34 -0
  135. data/lib/multimedia_paradise/gui/gtk3/multimedia_notebook/multimedia_notebook.rb +34 -0
  136. data/lib/multimedia_paradise/gui/gtk3/play_video_from_my_collection/play_video_from_my_collection.rb +34 -0
  137. data/lib/multimedia_paradise/gui/gtk3/playlist/playlist.rb +34 -0
  138. data/lib/multimedia_paradise/gui/gtk3/simple_play_widget/simple_play_widget.rb +38 -0
  139. data/lib/multimedia_paradise/gui/gtk3/video_editor/video_editor.rb +34 -0
  140. data/lib/multimedia_paradise/gui/gtk3/video_player/video_player.rb +34 -0
  141. data/lib/multimedia_paradise/gui/gtk3/webcam_widget/webcam_widget.rb +425 -0
  142. data/lib/multimedia_paradise/gui/gtk3/widget_increase_or_decrease_audio/widget_increase_or_decrease_audio.rb +36 -0
  143. data/lib/multimedia_paradise/gui/gtk3/youtube_channels/youtube_channels.rb +210 -0
  144. data/lib/multimedia_paradise/gui/gtk3/youtube_downloader/youtube_downloader.rb +32 -0
  145. data/lib/multimedia_paradise/gui/gui_base.rb +92 -0
  146. data/lib/multimedia_paradise/gui/libui/change_metadata_widget/change_metadata_widget.rb +115 -0
  147. data/lib/multimedia_paradise/gui/libui/cut_multimedia/cut_multimedia.rb +119 -0
  148. data/lib/multimedia_paradise/gui/libui/lyrics/lyrics.rb +67 -0
  149. data/lib/multimedia_paradise/gui/libui/simple_play_widget/simple_play_widget.rb +119 -0
  150. data/lib/multimedia_paradise/gui/libui/video_player/video_player.rb +81 -0
  151. data/lib/multimedia_paradise/gui/libui/widget_increase_or_decrease_audio/widget_increase_or_decrease_audio.rb +126 -0
  152. data/lib/multimedia_paradise/gui/libui/youtube_channels/youtube_channels.rb +116 -0
  153. data/lib/multimedia_paradise/gui/libui/youtube_downloader/youtube_downloader.rb +107 -0
  154. data/lib/multimedia_paradise/gui/shared_code/lyrics/lyrics_module.rb +0 -0
  155. data/lib/multimedia_paradise/gui/shared_code/multimedia_converter/multimedia_converter_module.rb +478 -0
  156. data/lib/multimedia_paradise/gui/shared_code/multimedia_notebook/multimedia_notebook_module.rb +171 -0
  157. data/lib/multimedia_paradise/gui/shared_code/play_video_from_my_collection/play_video_from_my_collection_module.rb +464 -0
  158. data/lib/multimedia_paradise/gui/shared_code/playlist/playlist_module.rb +151 -0
  159. data/lib/multimedia_paradise/gui/shared_code/simple_play_widget/simple_play_widget_module.rb +257 -0
  160. data/lib/multimedia_paradise/gui/shared_code/sound_effect_widget/sound_effect_widget_module.rb +0 -0
  161. data/lib/multimedia_paradise/gui/shared_code/video_editor/video_editor_module.rb +287 -0
  162. data/lib/multimedia_paradise/gui/shared_code/video_player/video_player_module.rb +185 -0
  163. data/lib/multimedia_paradise/gui/shared_code/widget_increase_or_decrease_audio/widget_increase_or_decrease_audio_module.rb +310 -0
  164. data/lib/multimedia_paradise/gui/shared_code/youtube_downloader/youtube_downloader_module.rb +339 -0
  165. data/lib/multimedia_paradise/gui/tk/tk_multimedia_wrapper.rb +60 -0
  166. data/lib/multimedia_paradise/gui/universal_widgets/change_metadata_widget/README.md +3 -0
  167. data/lib/multimedia_paradise/gui/universal_widgets/change_metadata_widget/change_metadata_widget.rb +751 -0
  168. data/lib/multimedia_paradise/gui/universal_widgets/cut_multimedia/cut_multimedia.rb +657 -0
  169. data/lib/multimedia_paradise/gui/universal_widgets/information_about_a_mp3_file/information_about_a_mp3_file.rb +597 -0
  170. data/lib/multimedia_paradise/gui/universal_widgets/lyrics/lyrics.rb +265 -0
  171. data/lib/multimedia_paradise/gui/universal_widgets/radio/radio.rb +1364 -0
  172. data/lib/multimedia_paradise/gui/universal_widgets/sound_effect_widget/sound_effect_widget.rb +265 -0
  173. data/lib/multimedia_paradise/gui/universal_widgets/tag_mp3_files/tag_mp3_files.config +6 -0
  174. data/lib/multimedia_paradise/gui/universal_widgets/tag_mp3_files/tag_mp3_files.rb +2429 -0
  175. data/lib/multimedia_paradise/gui/universal_widgets/video_collection/video_collection.rb +246 -0
  176. data/lib/multimedia_paradise/help/help.rb +75 -0
  177. data/lib/multimedia_paradise/images/MULTIMEDIA.jpg +0 -0
  178. data/lib/multimedia_paradise/images/MULTIMEDIA_PARADISE_ID_TAG_GUI_IN_RUBY_GTK3.png +0 -0
  179. data/lib/multimedia_paradise/images/MULTIMEDIA_PARADISE_LOGO.png +0 -0
  180. data/lib/multimedia_paradise/images/UK_flag.png +0 -0
  181. data/lib/multimedia_paradise/images/US_flag.png +0 -0
  182. data/lib/multimedia_paradise/images/austrian_flag.png +0 -0
  183. data/lib/multimedia_paradise/images/french_flag.png +0 -0
  184. data/lib/multimedia_paradise/images/german_flag.png +0 -0
  185. data/lib/multimedia_paradise/images/radio_image.png +0 -0
  186. data/lib/multimedia_paradise/images/trance.png +0 -0
  187. data/lib/multimedia_paradise/java/AudioPlayer.class +0 -0
  188. data/lib/multimedia_paradise/java/AudioPlayer.java +103 -0
  189. data/lib/multimedia_paradise/java/README.md +3 -0
  190. data/lib/multimedia_paradise/misc/long_format_to_milliseconds_converter.rb +182 -0
  191. data/lib/multimedia_paradise/misc/milliseconds_to_long_format_converter.rb +186 -0
  192. data/lib/multimedia_paradise/multimedia/analyse_multimedia_file.rb +180 -0
  193. data/lib/multimedia_paradise/multimedia/avisynth/README.md +4 -0
  194. data/lib/multimedia_paradise/multimedia/avisynth/avisynth_code.avs +471 -0
  195. data/lib/multimedia_paradise/multimedia/base.rb +60 -0
  196. data/lib/multimedia_paradise/multimedia/chord.rb +174 -0
  197. data/lib/multimedia_paradise/multimedia/convert_audio_to_video_with_image.rb +171 -0
  198. data/lib/multimedia_paradise/multimedia/cut_multimedia/10_minutes_chop.rb +29 -0
  199. data/lib/multimedia_paradise/multimedia/cut_multimedia/15_minutes_chop.rb +29 -0
  200. data/lib/multimedia_paradise/multimedia/cut_multimedia/30_minutes_chop.rb +29 -0
  201. data/lib/multimedia_paradise/multimedia/cut_multimedia/5_minutes_chop.rb +29 -0
  202. data/lib/multimedia_paradise/multimedia/cut_multimedia/cut_multimedia.rb +2021 -0
  203. data/lib/multimedia_paradise/multimedia/cut_multimedia/evaluate_from_this_file.rb +79 -0
  204. data/lib/multimedia_paradise/multimedia/cut_multimedia/interactive_menu.rb +525 -0
  205. data/lib/multimedia_paradise/multimedia/interactive_shell.rb +84 -0
  206. data/lib/multimedia_paradise/multimedia/merge_multimedia.rb +127 -0
  207. data/lib/multimedia_paradise/multimedia/note.rb +500 -0
  208. data/lib/multimedia_paradise/multimedia/play_from_this_list.rb +163 -0
  209. data/lib/multimedia_paradise/multimedia/read_meta_tags.rb +173 -0
  210. data/lib/multimedia_paradise/multimedia/simulate_youtube_playlist.rb +209 -0
  211. data/lib/multimedia_paradise/multimedia/start_length_duration.rb +205 -0
  212. data/lib/multimedia_paradise/multimedia/video_downloader/video_downloader.rb +135 -0
  213. data/lib/multimedia_paradise/project/project.rb +47 -0
  214. data/lib/multimedia_paradise/requires/require_audio_files.rb +74 -0
  215. data/lib/multimedia_paradise/requires/require_cut_multimedia.rb +7 -0
  216. data/lib/multimedia_paradise/requires/require_extract_audio.rb +7 -0
  217. data/lib/multimedia_paradise/requires/require_file_duration.rb +7 -0
  218. data/lib/multimedia_paradise/requires/require_streamripper.rb +7 -0
  219. data/lib/multimedia_paradise/requires/require_the_audio_player.rb +7 -0
  220. data/lib/multimedia_paradise/requires/require_the_multimedia_paradise_project.rb +38 -0
  221. data/lib/multimedia_paradise/requires/require_the_sinatra_components.rb +7 -0
  222. data/lib/multimedia_paradise/requires/require_toplevel_methods_files.rb +25 -0
  223. data/lib/multimedia_paradise/requires/require_video_files.rb +25 -0
  224. data/lib/multimedia_paradise/requires/require_video_player.rb +7 -0
  225. data/lib/multimedia_paradise/sinatra/app.rb +318 -0
  226. data/lib/multimedia_paradise/sinatra/embeddable_interface.rb +379 -0
  227. data/lib/multimedia_paradise/sound_effects/README.md +12 -0
  228. data/lib/multimedia_paradise/sound_effects/cat_meow.mp3 +0 -0
  229. data/lib/multimedia_paradise/sound_effects/channel_opened.mp3 +0 -0
  230. data/lib/multimedia_paradise/sound_effects/phone_ring.mp3 +0 -0
  231. data/lib/multimedia_paradise/statistics/README.md +5 -0
  232. data/lib/multimedia_paradise/statistics/video.rb +84 -0
  233. data/lib/multimedia_paradise/toplevel_cut_audio.rb +16 -0
  234. data/lib/multimedia_paradise/toplevel_methods/analyze_audio_stream.rb +31 -0
  235. data/lib/multimedia_paradise/toplevel_methods/chop_into_segments_of_n_seconds_size.rb +32 -0
  236. data/lib/multimedia_paradise/toplevel_methods/chop_off_first_five_minutes.rb +22 -0
  237. data/lib/multimedia_paradise/toplevel_methods/chop_off_first_n_seconds.rb +92 -0
  238. data/lib/multimedia_paradise/toplevel_methods/chop_off_first_ten_minutes.rb +22 -0
  239. data/lib/multimedia_paradise/toplevel_methods/chop_off_first_two_minutes.rb +24 -0
  240. data/lib/multimedia_paradise/toplevel_methods/codecs.rb +50 -0
  241. data/lib/multimedia_paradise/toplevel_methods/copy_and_merge_this_video_n_times.rb +51 -0
  242. data/lib/multimedia_paradise/toplevel_methods/copy_file.rb +18 -0
  243. data/lib/multimedia_paradise/toplevel_methods/create_video_from_this_audio.rb +65 -0
  244. data/lib/multimedia_paradise/toplevel_methods/cut_from_to.rb +156 -0
  245. data/lib/multimedia_paradise/toplevel_methods/delay_audio.rb +31 -0
  246. data/lib/multimedia_paradise/toplevel_methods/denoise.rb +90 -0
  247. data/lib/multimedia_paradise/toplevel_methods/deshake.rb +43 -0
  248. data/lib/multimedia_paradise/toplevel_methods/e.rb +16 -0
  249. data/lib/multimedia_paradise/toplevel_methods/encode_this_video.rb +49 -0
  250. data/lib/multimedia_paradise/toplevel_methods/ensure_that_the_output_directory_exists.rb +27 -0
  251. data/lib/multimedia_paradise/toplevel_methods/esystem.rb +43 -0
  252. data/lib/multimedia_paradise/toplevel_methods/files_and_directories.rb +92 -0
  253. data/lib/multimedia_paradise/toplevel_methods/flip_and_rotate.rb +58 -0
  254. data/lib/multimedia_paradise/toplevel_methods/has_audio.rb +48 -0
  255. data/lib/multimedia_paradise/toplevel_methods/increase_volume_of_this_audio_file.rb +61 -0
  256. data/lib/multimedia_paradise/toplevel_methods/is_a_multimedia_file.rb +27 -0
  257. data/lib/multimedia_paradise/toplevel_methods/is_audio_file.rb +27 -0
  258. data/lib/multimedia_paradise/toplevel_methods/is_image_file.rb +31 -0
  259. data/lib/multimedia_paradise/toplevel_methods/is_on_roebe.rb +17 -0
  260. data/lib/multimedia_paradise/toplevel_methods/is_video_file.rb +62 -0
  261. data/lib/multimedia_paradise/toplevel_methods/merge_multimedia_file.rb +331 -0
  262. data/lib/multimedia_paradise/toplevel_methods/merge_these_videos.rb +106 -0
  263. data/lib/multimedia_paradise/toplevel_methods/misc.rb +964 -0
  264. data/lib/multimedia_paradise/toplevel_methods/opn.rb +24 -0
  265. data/lib/multimedia_paradise/toplevel_methods/output_directory.rb +61 -0
  266. data/lib/multimedia_paradise/toplevel_methods/player_in_use.rb +80 -0
  267. data/lib/multimedia_paradise/toplevel_methods/query_the_audio_codec_of_this_file.rb +24 -0
  268. data/lib/multimedia_paradise/toplevel_methods/radio.rb +381 -0
  269. data/lib/multimedia_paradise/toplevel_methods/rds.rb +24 -0
  270. data/lib/multimedia_paradise/toplevel_methods/return_all_video_files.rb +64 -0
  271. data/lib/multimedia_paradise/toplevel_methods/return_data_from_video_collection_file_for_this_entry.rb +38 -0
  272. data/lib/multimedia_paradise/toplevel_methods/return_duration_of_this_multimedia_file.rb +27 -0
  273. data/lib/multimedia_paradise/toplevel_methods/return_full_name_for_video_at_this_position.rb +54 -0
  274. data/lib/multimedia_paradise/toplevel_methods/return_path_to_random_simpsons_video_file.rb +43 -0
  275. data/lib/multimedia_paradise/toplevel_methods/return_random_video_file_from_the_video_collection.rb +73 -0
  276. data/lib/multimedia_paradise/toplevel_methods/return_screen_resolution.rb +24 -0
  277. data/lib/multimedia_paradise/toplevel_methods/run_sys_command.rb +30 -0
  278. data/lib/multimedia_paradise/toplevel_methods/scale_video.rb +27 -0
  279. data/lib/multimedia_paradise/toplevel_methods/set_title_of.rb +65 -0
  280. data/lib/multimedia_paradise/toplevel_methods/slow_down_this_video_file.rb +33 -0
  281. data/lib/multimedia_paradise/toplevel_methods/start_screencast.rb +70 -0
  282. data/lib/multimedia_paradise/toplevel_methods/subtitles.rb +59 -0
  283. data/lib/multimedia_paradise/toplevel_methods/to_flac.rb +30 -0
  284. data/lib/multimedia_paradise/toplevel_methods/to_mp4.rb +24 -0
  285. data/lib/multimedia_paradise/toplevel_methods/total_duration.rb +35 -0
  286. data/lib/multimedia_paradise/toplevel_methods/use_lame_codec.rb +32 -0
  287. data/lib/multimedia_paradise/toplevel_methods/video_dataset.rb +76 -0
  288. data/lib/multimedia_paradise/version/version.rb +28 -0
  289. data/lib/multimedia_paradise/video/all_videos.rb +101 -0
  290. data/lib/multimedia_paradise/video/capture_screen.rb +285 -0
  291. data/lib/multimedia_paradise/video/check_numbers.rb +215 -0
  292. data/lib/multimedia_paradise/video/columbo/columbo.rb +139 -0
  293. data/lib/multimedia_paradise/video/copy_missing_video_files.rb +292 -0
  294. data/lib/multimedia_paradise/video/copy_random_video.rb +98 -0
  295. data/lib/multimedia_paradise/video/correct_video_numbers.rb +263 -0
  296. data/lib/multimedia_paradise/video/create_dvd.rb +50 -0
  297. data/lib/multimedia_paradise/video/create_video_thumbnails.rb +137 -0
  298. data/lib/multimedia_paradise/video/encode_video.rb +81 -0
  299. data/lib/multimedia_paradise/video/ffmpeg_options.rb +156 -0
  300. data/lib/multimedia_paradise/video/find_video/find_video.rb +668 -0
  301. data/lib/multimedia_paradise/video/fix_married_with_children_videos.rb +70 -0
  302. data/lib/multimedia_paradise/video/genres.rb +333 -0
  303. data/lib/multimedia_paradise/video/guess_video_name.rb +189 -0
  304. data/lib/multimedia_paradise/video/imdb_rating/imdb_rating.rb +133 -0
  305. data/lib/multimedia_paradise/video/mike_hammer/mike_hammer.rb +74 -0
  306. data/lib/multimedia_paradise/video/missing_video_files/missing_video_files.rb +286 -0
  307. data/lib/multimedia_paradise/video/movie_searcher.rb +281 -0
  308. data/lib/multimedia_paradise/video/mplayer_wrapper.rb +504 -0
  309. data/lib/multimedia_paradise/video/n_videos.rb +142 -0
  310. data/lib/multimedia_paradise/video/play_random_file.rb +91 -0
  311. data/lib/multimedia_paradise/video/play_random_realvideo.rb +92 -0
  312. data/lib/multimedia_paradise/video/prepare_video_lecture.rb +267 -0
  313. data/lib/multimedia_paradise/video/random_video.rb +302 -0
  314. data/lib/multimedia_paradise/video/registered_video_file.rb +131 -0
  315. data/lib/multimedia_paradise/video/remove_metadata.rb +52 -0
  316. data/lib/multimedia_paradise/video/rename_video_file.rb +149 -0
  317. data/lib/multimedia_paradise/video/report_local_videos.rb +106 -0
  318. data/lib/multimedia_paradise/video/report_missing_videos_in_the_yaml_file.rb +107 -0
  319. data/lib/multimedia_paradise/video/resolution.rb +194 -0
  320. data/lib/multimedia_paradise/video/reverse_video.rb +74 -0
  321. data/lib/multimedia_paradise/video/simpsons.rb +129 -0
  322. data/lib/multimedia_paradise/video/smart_animals/smart_animals.rb +188 -0
  323. data/lib/multimedia_paradise/video/speed_up_video.rb +135 -0
  324. data/lib/multimedia_paradise/video/split_this_video.rb +126 -0
  325. data/lib/multimedia_paradise/video/srt_regex.rb +211 -0
  326. data/lib/multimedia_paradise/video/store_available_video_files.rb +138 -0
  327. data/lib/multimedia_paradise/video/the_simpsons/README.md +9 -0
  328. data/lib/multimedia_paradise/video/the_simpsons/good_the_simpsons_episodes.rb +107 -0
  329. data/lib/multimedia_paradise/video/the_simpsons/the_simpsons.rb +87 -0
  330. data/lib/multimedia_paradise/video/video.rb +14 -0
  331. data/lib/multimedia_paradise/video/video_encoding_settings.rb +57 -0
  332. data/lib/multimedia_paradise/video/video_information.rb +445 -0
  333. data/lib/multimedia_paradise/video/video_metadata.rb +132 -0
  334. data/lib/multimedia_paradise/video/video_player.rb +580 -0
  335. data/lib/multimedia_paradise/video/video_renamer.rb +161 -0
  336. data/lib/multimedia_paradise/video/watermark.rb +282 -0
  337. data/lib/multimedia_paradise/video/youtube/youtube.rb +17 -0
  338. data/lib/multimedia_paradise/video/youtube_embedder.rb +235 -0
  339. data/lib/multimedia_paradise/yaml/audio_formats.yml +14 -0
  340. data/lib/multimedia_paradise/yaml/best_songs_in_an_era/eurodance/top20.yml +28 -0
  341. data/lib/multimedia_paradise/yaml/game_shows/ruck_zuck/ruck_zuck.yml +25 -0
  342. data/lib/multimedia_paradise/yaml/genres/1980s.yml +198 -0
  343. data/lib/multimedia_paradise/yaml/genres/README.md +5 -0
  344. data/lib/multimedia_paradise/yaml/genres/boogie.yml +68 -0
  345. data/lib/multimedia_paradise/yaml/genres/concerts.yml +29 -0
  346. data/lib/multimedia_paradise/yaml/genres/eurodance.yml +456 -0
  347. data/lib/multimedia_paradise/yaml/genres/hip_hop.yml +49 -0
  348. data/lib/multimedia_paradise/yaml/genres/italian_songs.yml +53 -0
  349. data/lib/multimedia_paradise/yaml/genres/trance.yml +167 -0
  350. data/lib/multimedia_paradise/yaml/good_horror_movies/good_horror_movies.yml +12 -0
  351. data/lib/multimedia_paradise/yaml/good_movie_actors/good_movie_actors.yml +6 -0
  352. data/lib/multimedia_paradise/yaml/image_formats.yml +8 -0
  353. data/lib/multimedia_paradise/yaml/internal/README.md +2 -0
  354. data/lib/multimedia_paradise/yaml/internal/installed_binaries.yml +31 -0
  355. data/lib/multimedia_paradise/yaml/lyrics.yml +6323 -0
  356. data/lib/multimedia_paradise/yaml/movie_reviews/the_hateful_eight_september_2016.md +305 -0
  357. data/lib/multimedia_paradise/yaml/music_genres.yml +51 -0
  358. data/lib/multimedia_paradise/yaml/playlist.yml +130 -0
  359. data/lib/multimedia_paradise/yaml/radio/README.md +5 -0
  360. data/lib/multimedia_paradise/yaml/radio/radio_stations.yml +359 -0
  361. data/lib/multimedia_paradise/yaml/song_tags.yml +818 -0
  362. data/lib/multimedia_paradise/yaml/tales_from_the_crypt/tales_from_the_crypt.yml +426 -0
  363. data/lib/multimedia_paradise/yaml/tom_and_jerry/README.md +2 -0
  364. data/lib/multimedia_paradise/yaml/tom_and_jerry/tom_and_jerry_episodes.yml +27 -0
  365. data/lib/multimedia_paradise/yaml/tv_channels/tv_channels.yml +46 -0
  366. data/lib/multimedia_paradise/yaml/use_this_video_player.yml +1 -0
  367. data/lib/multimedia_paradise/yaml/video/video.yml +26 -0
  368. data/lib/multimedia_paradise/yaml/video_collection/video_collection.yml +1933 -0
  369. data/lib/multimedia_paradise/yaml/video_encoding_settings.yml +62 -0
  370. data/lib/multimedia_paradise/yaml/video_filter_aliases.yml +221 -0
  371. data/lib/multimedia_paradise/yaml/youtube/alltagsgeschichte/alltagsgeschichte.yml +190 -0
  372. data/lib/multimedia_paradise/yaml/youtube/songs/README.md +3 -0
  373. data/lib/multimedia_paradise/yaml/youtube/songs/songs.yml +6 -0
  374. data/lib/multimedia_paradise/yaml/youtube_playlist/youtube_playlist.yml +6 -0
  375. data/lib/multimedia_paradise.rb +5 -0
  376. data/multimedia_paradise.gemspec +74 -0
  377. data/test/testing_audio_player.rb +15 -0
  378. data/test/testing_ffmpeg_options.rb +14 -0
  379. data/test/testing_file_duration.rb +17 -0
  380. data/test/testing_modify_year_of_audio_file.rb +14 -0
  381. data/test/testing_multimedia_paradise_project.rb +151 -0
  382. metadata +560 -0
@@ -0,0 +1,1143 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # === MultimediaParadise::AudioPlayer
6
+ #
7
+ # This is an "audio player".
8
+ #
9
+ # In other words - it plays audio files.
10
+ #
11
+ # For this to work, it distinguishes between different playmodes as will
12
+ # be explained here.
13
+ #
14
+ # - If the argument given is an existing audio file, we will play it, then
15
+ # exit.
16
+ #
17
+ # - If we pass an array of files, we will store this array in our playlist
18
+ # and play all of them before we will then exit.
19
+ #
20
+ # - If we omit any argument then we will default to a neverending 'loop'.
21
+ # This also is the case when we pass 'loop' or nil as argument. Note
22
+ # that the loop is not unlimited; it will honour a threshold determined
23
+ # by an instance variable.
24
+ #
25
+ # - If we pass 'once', then we will play all audio files, and
26
+ # then exit.
27
+ #
28
+ # - If we pass 'one' or 'rand' as argument, we will play one
29
+ # random song, only ONCE, and then quit.
30
+ #
31
+ # - If we pass 'one_song', then we will play only this song.
32
+ #
33
+ # - If we pass in a number such as '3' then we will assume
34
+ # that the user wants to play exactly 3 files.
35
+ #
36
+ # Usage example:
37
+ #
38
+ # MultimediaParadise::AudioPlayer.new(ARGV)
39
+ #
40
+ # =========================================================================== #
41
+ # require 'multimedia_paradise/audio/audio_player/audio_player.rb'
42
+ # =========================================================================== #
43
+ require 'multimedia_paradise/audio/base.rb'
44
+
45
+ module MultimediaParadise
46
+
47
+ class AudioPlayer < AudioBase # === MultimediaParadise::AudioPlayer
48
+
49
+ begin
50
+ require 'x/tools/mrxvt_options.rb'
51
+ rescue LoadError; end
52
+
53
+ begin
54
+ require 'roebe/classes/kde/kde_konsole/kde_konsole.rb'
55
+ rescue LoadError; end
56
+
57
+ begin
58
+ require 'x/audio/playlist_profile.rb' # PlaylistProfile is declared here.
59
+ rescue LoadError; end # bl $RUBY_AUD/playlist_profile.rb
60
+
61
+ require 'multimedia_paradise/multimedia/play_from_this_list.rb'
62
+
63
+ # ========================================================================= #
64
+ # === NAMESPACE
65
+ # ========================================================================= #
66
+ NAMESPACE = inspect
67
+
68
+ # ========================================================================= #
69
+ # === MY_SONGS
70
+ # ========================================================================= #
71
+ MY_SONGS = AUDIO_DIRECTORY
72
+ AUDIO_DIR = MY_SONGS # === AUDIO_DIR
73
+
74
+ # ========================================================================= #
75
+ # === RENAME_KDE_KONSOLE_TAB
76
+ # ========================================================================= #
77
+ RENAME_KDE_KONSOLE_TAB = true
78
+
79
+ # ========================================================================= #
80
+ # === DEFAULT_DELAY_PLAYING_SONGS
81
+ #
82
+ # The following constant is used for determining the audio delay between
83
+ # two songs.
84
+ #
85
+ # A value of 0.0 would mean no delay, aka "instant play", logically.
86
+ # ========================================================================= #
87
+ DEFAULT_DELAY_PLAYING_SONGS = 1.8
88
+
89
+ # ========================================================================= #
90
+ # === MAIN_AUDIO_PLAYER_TO_USE
91
+ #
92
+ # The entry of this constant will become the instance variable
93
+ # @audio_player_to_use.
94
+ #
95
+ # As of May 2015 we can dynamically set this.
96
+ # ========================================================================= #
97
+ _ = "#{::MultimediaParadise.project_yaml_dir?}video/video.yml"
98
+ if File.exist? _
99
+ _ = YAML.load_file(_)
100
+ if _.has_key? 'MAIN_VIDEO_PLAYER'
101
+ MAIN_AUDIO_PLAYER_TO_USE = _['MAIN_VIDEO_PLAYER']
102
+ end
103
+ else # We default to mpv since as of 2021.
104
+ MAIN_AUDIO_PLAYER_TO_USE = 'mpv' # mplayer'
105
+ end
106
+
107
+ # ========================================================================= #
108
+ # === LAST_SONG_PLAYED
109
+ # ========================================================================= #
110
+ LAST_SONG_PLAYED = 'LAST_SONG_PLAYED.md'
111
+
112
+ # ========================================================================= #
113
+ # === USE_OSS_FOR_AUDIO_PLAYER
114
+ # ========================================================================= #
115
+ USE_OSS_FOR_AUDIO_PLAYER = false
116
+
117
+ # ========================================================================= #
118
+ # === FULL_LOCATION_FOR_LAST_SONG_PLAYED
119
+ # ========================================================================= #
120
+ FULL_LOCATION_FOR_LAST_SONG_PLAYED = HOME+LAST_SONG_PLAYED # Specify the path to our file here.
121
+
122
+ # ========================================================================= #
123
+ # === MAXIMUM_ALLOWED_FILE_SIZE
124
+ # ========================================================================= #
125
+ MAXIMUM_ALLOWED_FILE_SIZE = 1_350_000 # Shall not become larger than that, else we remove the file "last song played".
126
+
127
+ # ========================================================================= #
128
+ # === DEFAULT_PLAYMODE
129
+ # ========================================================================= #
130
+ DEFAULT_PLAYMODE = 'once'
131
+
132
+ # ========================================================================= #
133
+ # === NAME_OF_AUDIO_PLAYER
134
+ # ========================================================================= #
135
+ NAME_OF_AUDIO_PLAYER = 'AudioPlayer' # The name of the audio player.
136
+
137
+ # ========================================================================= #
138
+ # === PLAY_MAX_N_SONGS
139
+ # ========================================================================= #
140
+ PLAY_MAX_N_SONGS = 1250 # We won't play more than n songs.
141
+
142
+ # ========================================================================= #
143
+ # === USE_FAVOURITE_PLAYLIST
144
+ # ========================================================================= #
145
+ USE_FAVOURITE_PLAYLIST = false # If true we play only songs from this list
146
+
147
+ # ========================================================================= #
148
+ # === AVAILABLE_SONGS
149
+ #
150
+ # Obtain all available songs - and shuffle them a bit.
151
+ # ========================================================================= #
152
+ AVAILABLE_SONGS = Dir["#{MY_SONGS}*"].shuffle
153
+
154
+ # ========================================================================= #
155
+ # === SHALL_WE_DEBUG
156
+ # ========================================================================= #
157
+ SHALL_WE_DEBUG = false # If true we output debug info
158
+
159
+ # ========================================================================= #
160
+ # === PLAYLIST_CONSTANTS
161
+ #
162
+ # Whether we have the PlaylistProfile defined or not. If we have, we will
163
+ # make use of it.
164
+ # ========================================================================= #
165
+ if Object.const_defined? :PlaylistProfile
166
+ PLAYLIST_CONSTANTS = PlaylistProfile.constants
167
+ end
168
+
169
+ # ========================================================================= #
170
+ # === THE_LOG_FILE_IS_STORED_HERE
171
+ # ========================================================================= #
172
+ THE_LOG_FILE_IS_STORED_HERE =
173
+ "#{MultimediaParadise.log_dir?}"\
174
+ "log_file_for_played_songs_via_the_audio_player.md"
175
+
176
+ require 'multimedia_paradise/requires/require_file_duration.rb'
177
+ # ========================================================================= #
178
+ # === obtain_file_duration_from_this_file(i)
179
+ # ========================================================================= #
180
+ def obtain_file_duration_from_this_file(i)
181
+ MultimediaParadise::FileDuration[i]
182
+ end
183
+
184
+ # ========================================================================= #
185
+ # === initialize
186
+ # ========================================================================= #
187
+ def initialize(
188
+ i = nil,
189
+ run_already = true
190
+ )
191
+ register_sigint { :pretty }
192
+ reset
193
+ if i
194
+ i = set_commandline_options_and_return_the_other_options(i)
195
+ menu(i)
196
+ end
197
+ case run_already
198
+ # ======================================================================= #
199
+ # === :dont_run_yet
200
+ # ======================================================================= #
201
+ when :dont_run_yet,
202
+ :do_not_run_yet
203
+ run_already = false
204
+ end
205
+ run if run_already
206
+ end
207
+
208
+ # ========================================================================= #
209
+ # === reset (reset tag)
210
+ # ========================================================================= #
211
+ def reset
212
+ super()
213
+ clear_playlist
214
+ set_delay # Set @delay here.
215
+ set_shall_we_exit
216
+ infer_the_namespace
217
+ # ======================================================================= #
218
+ # === @use_colours
219
+ # ======================================================================= #
220
+ @use_colours = true # If true then we will use colours.
221
+ # ======================================================================= #
222
+ # === @main_colour
223
+ # ======================================================================= #
224
+ @main_colour = Colours.parse('green')
225
+ # ======================================================================= #
226
+ # === @play_in_a_loop
227
+ # ======================================================================= #
228
+ @play_in_a_loop = false
229
+ determine_which_audio_player_to_use
230
+ # ======================================================================= #
231
+ # === @debug
232
+ # ======================================================================= #
233
+ @debug = SHALL_WE_DEBUG
234
+ # ======================================================================= #
235
+ # === @hash_songs_played
236
+ # ======================================================================= #
237
+ @hash_songs_played = {} # We keep track of all the files that we played.
238
+ # ======================================================================= #
239
+ # === @play_max_n_songs
240
+ # ======================================================================= #
241
+ @play_max_n_songs = PLAY_MAX_N_SONGS # Safeguard.
242
+ if Object.const_defined? :MrxvtOptions
243
+ @mrxvt = MrxvtOptions.new
244
+ else
245
+ @mrxvt = nil
246
+ end
247
+ # ======================================================================= #
248
+ # === @use_oss_for_audio_player
249
+ # ======================================================================= #
250
+ @use_oss_for_audio_player = USE_OSS_FOR_AUDIO_PLAYER
251
+ # ======================================================================= #
252
+ # === @file_duration_in_seconds
253
+ # ======================================================================= #
254
+ @file_duration_in_seconds = 0 # Keeps the duration of the file in question.
255
+ # ======================================================================= #
256
+ # === @n_songs_played
257
+ # ======================================================================= #
258
+ @n_songs_played = 0 # How many songs we already played.
259
+ # ======================================================================= #
260
+ # === @available_genres
261
+ # ======================================================================= #
262
+ @available_genres = nil # Default.
263
+ @available_genres = PLAYLIST_CONSTANTS.map {|song|
264
+ song.to_s.sub(/GOOD_/,'').
265
+ sub(/_SONGS/,'').
266
+ sub(/MY_/,'').
267
+ sub(/CURRENT_/,'')
268
+ } if defined? PLAYLIST_CONSTANTS
269
+ end
270
+
271
+ # ========================================================================= #
272
+ # === determine_which_audio_player_to_use
273
+ #
274
+ # This method will determine which audio play is to be used, for playing
275
+ # the audio files. Currently the two primary ones that I use are mplayer
276
+ # and mpv. Note that the environment variable MAIN_AUDIO_PLAYER can
277
+ # overrule this completely, if set.
278
+ # ========================================================================= #
279
+ def determine_which_audio_player_to_use(
280
+ i = MAIN_AUDIO_PLAYER_TO_USE,
281
+ overrule_if_environment_variable_was_set = true
282
+ )
283
+ case overrule_if_environment_variable_was_set
284
+ # ======================================================================= #
285
+ # === :ignore_environment_variable
286
+ # ======================================================================= #
287
+ when :ignore_environment_variable
288
+ overrule_if_environment_variable_was_set = false
289
+ end
290
+ case i
291
+ # ======================================================================= #
292
+ # === sox
293
+ # ======================================================================= #
294
+ when 'sox',
295
+ :sox
296
+ i = 'play' # The binary from sox is actually called "play", hence this line.
297
+ end
298
+ if overrule_if_environment_variable_was_set
299
+ if ENV.has_key? 'MAIN_AUDIO_PLAYER'
300
+ i = ENV['MAIN_AUDIO_PLAYER'].to_s.dup
301
+ end
302
+ end
303
+ @audio_player_to_use = i.to_s # Which audio player to use.
304
+ end
305
+
306
+ # ========================================================================= #
307
+ # === report_which_audio_player_to_use
308
+ # ========================================================================= #
309
+ def report_which_audio_player_to_use
310
+ opne 'The audio player '+sfancy(@audio_player_to_use)+
311
+ ' will be used.'
312
+ end
313
+
314
+ # ========================================================================= #
315
+ # === show_startup_message
316
+ #
317
+ # Display a fancy startup message.
318
+ # ========================================================================= #
319
+ def show_startup_message
320
+ e N+main_colour?+' => Starting Audio Player '+
321
+ simp(use_which_audio_player?)+main_colour?+' ('+
322
+ sfancy('Default delay: ')+delay?+mcol?+').'+N
323
+ end
324
+
325
+ # ========================================================================= #
326
+ # === set_commandline_options_and_return_the_other_options
327
+ # ========================================================================= #
328
+ def set_commandline_options_and_return_the_other_options(i)
329
+ unless i.is_a? Symbol
330
+ if i.respond_to?(:any?) and i.any? {|line|
331
+ line.start_with? '--'
332
+ }
333
+ @commandline_options = i.select {|inner_line|
334
+ inner_line.start_with? '--'
335
+ }
336
+ menu(@commandline_options)
337
+ # ===================================================================== #
338
+ # And finally, remove these entries that were found.
339
+ # ===================================================================== #
340
+ i.reject! {|entry|
341
+ entry.start_with? '--'
342
+ }
343
+ end
344
+ end
345
+ i
346
+ end
347
+
348
+ # ========================================================================= #
349
+ # === populate_hash_songs_played
350
+ #
351
+ # Fills up our hash with available data for the first time.
352
+ # Basically right now, only manipulates @hash_songs_played
353
+ # ========================================================================= #
354
+ def populate_hash_songs_played
355
+ playlist?.each { |song|
356
+ song = File.basename(song)
357
+ @hash_songs_played[song] = 0
358
+ }
359
+ end
360
+
361
+ # ========================================================================= #
362
+ # === set_delay
363
+ #
364
+ # This sets the default delay, when playing the audio songs in
365
+ # a loop.
366
+ # ========================================================================= #
367
+ def set_delay(i = DEFAULT_DELAY_PLAYING_SONGS)
368
+ @delay = i
369
+ end
370
+
371
+ # ========================================================================= #
372
+ # === get_file_size
373
+ # ========================================================================= #
374
+ def get_file_size(
375
+ of_this_file = the_songs_played_will_be_stored_where?
376
+ )
377
+ size = 0
378
+ size = File.size(of_this_file) if File.exist?(of_this_file)
379
+ size
380
+ end
381
+
382
+ # ========================================================================= #
383
+ # === set_shall_we_exit
384
+ # ========================================================================= #
385
+ def set_shall_we_exit(i = true)
386
+ @shall_we_exit = i
387
+ end
388
+
389
+ # ========================================================================= #
390
+ # === show_available_genres
391
+ # ========================================================================= #
392
+ def show_available_genres
393
+ opne 'The available genres are:'
394
+ pp @available_genres
395
+ end
396
+
397
+ # ========================================================================= #
398
+ # === shall_we_exit?
399
+ # ========================================================================= #
400
+ def shall_we_exit?
401
+ @shall_we_exit
402
+ end
403
+
404
+ # ========================================================================= #
405
+ # === show_last_file_played
406
+ #
407
+ # This method will show the last song played.
408
+ # ========================================================================= #
409
+ def show_last_file_played(
410
+ _ = the_songs_played_will_be_stored_where?
411
+ )
412
+ if File.exist? _
413
+ e 'The last song played was:'
414
+ efancy(' '+File.readlines(_)[-1])
415
+ exit_program
416
+ else
417
+ ewarn 'But the file '+sfile(_)+RED+' does not exist.'
418
+ end
419
+ end
420
+
421
+ # ========================================================================= #
422
+ # === the_songs_played_will_be_stored_where?
423
+ # ========================================================================= #
424
+ def the_songs_played_will_be_stored_where?
425
+ FULL_LOCATION_FOR_LAST_SONG_PLAYED
426
+ end
427
+
428
+ # ========================================================================= #
429
+ # === add_random_song
430
+ #
431
+ # This will add exactly one random song.
432
+ # ========================================================================= #
433
+ def add_random_song
434
+ add_song(return_random_song)
435
+ end
436
+
437
+ # ========================================================================= #
438
+ # === shuffle_the_playlist
439
+ # ========================================================================= #
440
+ def shuffle_the_playlist
441
+ playlist?.shuffle!
442
+ end; alias shuffle shuffle_the_playlist # shuffle
443
+
444
+ # ========================================================================= #
445
+ # === do_play_in_a_loop
446
+ # ========================================================================= #
447
+ def do_play_in_a_loop
448
+ @play_in_a_loop = true
449
+ end
450
+
451
+ # ========================================================================= #
452
+ # === try_to_play_playlist
453
+ # ========================================================================= #
454
+ def try_to_play_playlist
455
+ begin
456
+ require 'x/AUD/playlist.rb'
457
+ add(Playlist.playlist?)
458
+ shuffle
459
+ rescue LoadError; end
460
+ end
461
+
462
+ # ========================================================================= #
463
+ # === show_the_playlist
464
+ # ========================================================================= #
465
+ def show_the_playlist
466
+ opne 'The playlist is:'
467
+ pp playlist?
468
+ end; alias show_songs show_the_playlist # === show_songs
469
+
470
+ # ========================================================================= #
471
+ # === main_colour?
472
+ # ========================================================================= #
473
+ def main_colour?
474
+ @main_colour
475
+ end; alias mcol? main_colour? # mcol?
476
+
477
+ # ========================================================================= #
478
+ # === return_all_songs
479
+ #
480
+ # By default, we will shuffle.
481
+ # ========================================================================= #
482
+ def return_all_songs
483
+ return AVAILABLE_SONGS.shuffle
484
+ end; alias all_songs return_all_songs # === all_songs
485
+ alias get_all_songs return_all_songs # === get_all_songs
486
+ alias determine_available_songs return_all_songs # === determine_available_songs
487
+ alias all_songs? return_all_songs # === all_songs?
488
+
489
+ # ========================================================================= #
490
+ # === return_random_song
491
+ #
492
+ # This method will return one random song.
493
+ # ========================================================================= #
494
+ def return_random_song
495
+ return_all_songs.first
496
+ end; alias fetch_random_song return_random_song
497
+ alias get_random_song return_random_song
498
+
499
+ # ========================================================================= #
500
+ # === reset_playlist
501
+ # ========================================================================= #
502
+ def reset_playlist
503
+ @array_play_these_songs = [] # Keep all files that we wish to play in this Array.
504
+ end; alias clear_playlist reset_playlist
505
+
506
+ # ========================================================================= #
507
+ # === audio_dir?
508
+ # ========================================================================= #
509
+ def audio_dir?
510
+ AUDIO_DIR
511
+ end
512
+
513
+ # ========================================================================= #
514
+ # === register_this_song
515
+ #
516
+ # This method should be invoked whenever you want to play a new song.
517
+ #
518
+ # We will only keep the filename, not the full location.
519
+ # ========================================================================= #
520
+ def register_this_song(this_song)
521
+ if @hash_songs_played
522
+ this_song = File.basename(this_song)
523
+ if @hash_songs_played.has_key? this_song
524
+ @hash_songs_played[this_song] = @hash_songs_played[this_song] + 1
525
+ else
526
+ @hash_songs_played[this_song] = 1 # Initialize at 1 then.
527
+ end
528
+ end
529
+ end
530
+
531
+ # ========================================================================= #
532
+ # === add_all_songs
533
+ # ========================================================================= #
534
+ def add_all_songs
535
+ add(all_songs?)
536
+ end
537
+
538
+ # ========================================================================= #
539
+ # === refresh_playlist
540
+ #
541
+ # First clears the playlist, then adds all available songs.
542
+ # ========================================================================= #
543
+ def refresh_playlist
544
+ clear_playlist
545
+ add_all_songs
546
+ end
547
+
548
+ # ========================================================================= #
549
+ # === perform_cleanup
550
+ #
551
+ # We get rid of @ivars which are not too useful.
552
+ # ========================================================================= #
553
+ def perform_cleanup
554
+ remove_instance_variable :@available_genres
555
+ end
556
+
557
+ # ========================================================================= #
558
+ # === check_whether_the_song_directory_is_empty
559
+ # ========================================================================= #
560
+ def check_whether_the_song_directory_is_empty
561
+ if return_all_songs.empty?
562
+ opne 'No songs found in `'+sdir(audio_dir?)+'`.'
563
+ opne 'Perhaps you forgot to copy some songs first?'
564
+ exit_program(:force_exit)
565
+ end
566
+ end
567
+
568
+ # ========================================================================= #
569
+ # === exit_program
570
+ #
571
+ # This method can be used to exit this program.
572
+ # ========================================================================= #
573
+ def exit_program(
574
+ shall_we_exit = shall_we_exit?,
575
+ be_verbose = true,
576
+ &block
577
+ )
578
+
579
+ case shall_we_exit
580
+ # ======================================================================= #
581
+ # === :force_exit
582
+ # ======================================================================= #
583
+ when :force_exit
584
+ shall_we_exit = true
585
+ # ======================================================================= #
586
+ # === :force_exit_but_be_quiet
587
+ # ======================================================================= #
588
+ when :force_exit_but_be_quiet
589
+ shall_we_exit = true
590
+ be_verbose = false
591
+ end
592
+ # ======================================================================= #
593
+ # === Handle blocks next
594
+ # ======================================================================= #
595
+ if block_given?
596
+ yielded = yield
597
+ case yielded
598
+ # ===================================================================== #
599
+ # === :be_quiet
600
+ # ===================================================================== #
601
+ when :be_quiet
602
+ be_verbose = false
603
+ end
604
+ end
605
+ if shall_we_exit
606
+ @mrxvt.set_title('') if @mrxvt
607
+ if be_verbose
608
+ efancy 'Leaving ...'
609
+ efancy 'Hopefully you had fun and found class'\
610
+ 'MultimediaParadise::AudioPlayer useful. Bye!'
611
+ end
612
+ consider_resetting_kde_konsole_tab
613
+ exit
614
+ else
615
+ e "Won't exit as we are not allowed to exit."
616
+ end
617
+ end
618
+
619
+ # ========================================================================= #
620
+ # === input?
621
+ # ========================================================================= #
622
+ def input?
623
+ @array_play_these_songs
624
+ end; alias play_these_songs input? # === play_thse_songs
625
+ alias playlist? input? # === playlist?
626
+
627
+ # ========================================================================= #
628
+ # === sanitize_songs
629
+ # ========================================================================= #
630
+ def sanitize_songs
631
+ playlist?.flatten! # Always flatten it afterwards.
632
+ end
633
+
634
+ # ========================================================================= #
635
+ # === add_song (add tag)
636
+ #
637
+ # This method will add the particular song to the playlist.
638
+ #
639
+ # It will check whether it is an multimedia-file prior to adding it,
640
+ # though.
641
+ # ========================================================================= #
642
+ def add_song(
643
+ i = nil
644
+ )
645
+ unless i.nil?
646
+ [i].flatten.compact.each {|this_song|
647
+ if is_a_multimedia_file?(this_song)
648
+ @array_play_these_songs << this_song
649
+ end
650
+ }
651
+ sanitize_songs
652
+ end
653
+ end; alias add add_song # === add
654
+ alias add_to_playlist add_song # === add_to_playlist
655
+ alias add_this_song_to_playlist add_song # === add_this_song_to_playlist
656
+ alias add_this_song add_song # === add_this_song
657
+ alias add_songs add_song # === add_songs
658
+
659
+ # ========================================================================= #
660
+ # === register_sigint
661
+ #
662
+ # Will act upon SIGINT recieved, and properly shut down.
663
+ # ========================================================================= #
664
+ def register_sigint
665
+ Signal.trap('SIGINT') {
666
+ consider_resetting_kde_konsole_tab
667
+ exit_program(true)
668
+ }
669
+ end
670
+
671
+ # ========================================================================= #
672
+ # === consider_resetting_kde_konsole_tab
673
+ #
674
+ # This method can be used to re-set the KDE konsole tab name.
675
+ # ========================================================================= #
676
+ def consider_resetting_kde_konsole_tab(
677
+ use_this_as_the_new_title = '.'
678
+ )
679
+ do_rename_konsole(
680
+ use_this_as_the_new_title, RENAME_KDE_KONSOLE_TAB
681
+ )
682
+ end
683
+
684
+ # ========================================================================= #
685
+ # === try_to_find_genre_song
686
+ #
687
+ # This tries to find a (random) genre song.
688
+ # ========================================================================= #
689
+ def try_to_find_genre_song(i)
690
+ upcased = i.to_s.upcase
691
+ if @available_genres.grep(/#{upcased}/)
692
+ matches = PLAYLIST_CONSTANTS.select {|entry| entry =~ /#{upcased}/ }[0]
693
+ if matches.nil? # Then try without playlist
694
+ these_songs = Dir[audio_dir?+'*'+i+'*']
695
+ end
696
+ these_songs = PlaylistProfile.module_eval(matches.to_s).map {|entry|
697
+ audio_dir?+entry
698
+ } if matches
699
+ add_song(these_songs.shuffle)
700
+ end if @available_genres
701
+ end
702
+
703
+ # ========================================================================= #
704
+ # === pause (pause tag)
705
+ #
706
+ # Pause for n_seconds (the first input to this method).
707
+ #
708
+ # This method will NOT seet a new, random song - for this,
709
+ # you need to use another method.
710
+ # ========================================================================= #
711
+ def pause(
712
+ n_seconds = delay?
713
+ )
714
+ n_seconds = n_seconds.to_f # Always keep it as a float here.
715
+ cliner
716
+ e "#{true_rev}We will pause for #{sfancy(n_seconds)} #{rev}seconds."
717
+ cliner_with_time_stamp
718
+ e "#{rev}The next song will be: #{sfancy(playlist?[@n_songs_played])}"
719
+ cliner
720
+ sleep(n_seconds)
721
+ end
722
+
723
+ # ========================================================================= #
724
+ # === play_this_song (play tag)
725
+ #
726
+ # This is the actual method that will play the song.
727
+ #
728
+ # We will also append the filename last played.
729
+ # ========================================================================= #
730
+ def play_this_song(
731
+ i, be_verbose = true
732
+ )
733
+ if be_verbose
734
+ e; opne 'The next song we will play via '+
735
+ simp(audio_player_to_use?)+' is:'
736
+ e "#{N} #{sfancy(i)}#{N}#{N}"
737
+ end
738
+ # ======================================================================= #
739
+ # Next, act on .mp3 files.
740
+ # ======================================================================= #
741
+ if File.extname(i) == '.mp3'
742
+ begin
743
+ @file_duration_in_seconds = obtain_file_duration_from_this_file(i)
744
+ if be_verbose
745
+ e "#{rev}The length of this song is: "+
746
+ sfancy(@file_duration_in_seconds.to_i)+rev+' seconds.'
747
+ end
748
+ rescue Exception => error
749
+ e error
750
+ end
751
+ end
752
+ e " #{sfile(i)}" if be_verbose
753
+ consider_renaming_the_kde_konsole_tab(i)
754
+ _ = audio_player?.dup
755
+ _ << ' -ao oss' if @use_oss_for_audio_player
756
+ _ << ' '+i.dup
757
+ # ======================================================================= #
758
+ # Register which song was played. We do this before we actually play
759
+ # the song.
760
+ # ======================================================================= #
761
+ register_which_song_will_be_played_next(i)
762
+ esystem _
763
+ @n_songs_played += 1
764
+ end
765
+
766
+ # ========================================================================= #
767
+ # === do_rename_konsole
768
+ # ========================================================================= #
769
+ def do_rename_konsole(
770
+ i = '.', *optional_arguments_that_are_irrelevant
771
+ )
772
+ if Object.const_defined? :Roebe
773
+ Roebe.rename_konsole(i)
774
+ end
775
+ end
776
+
777
+ # ========================================================================= #
778
+ # === store_data_about_this_song_into_a_local_file
779
+ # ========================================================================= #
780
+ def store_data_about_this_song_into_a_local_file(
781
+ this_song
782
+ )
783
+ into = THE_LOG_FILE_IS_STORED_HERE
784
+ what = "song name: #{this_song.ljust(30)}, "\
785
+ "played on #{dd_mm_yyyy}, #{hh_mm_ss}\n"
786
+ dirname = File.dirname(into)
787
+ mkdir(dirname) unless File.directory? dirname
788
+ append_what_into(what, into)
789
+ end
790
+
791
+ # ========================================================================= #
792
+ # === show_the_log_file_if_it_exists
793
+ #
794
+ # Invocation example:
795
+ #
796
+ # rsong --log?
797
+ #
798
+ # ========================================================================= #
799
+ def show_the_log_file_if_it_exists(
800
+ log_file = THE_LOG_FILE_IS_STORED_HERE
801
+ )
802
+ if File.exist? log_file
803
+ opne 'Displaying the content of the file at'
804
+ opne '`'+sfile(log_file)+'`:'
805
+ dataset = File.readlines(log_file).map {|entry| entry.rstrip }
806
+ e
807
+ e mediumpurple(
808
+ dataset.map {|entry| " #{entry}" }.join("\n")
809
+ )
810
+ else
811
+ opne 'No file exists at '+sfile(log_file)+'.'
812
+ end
813
+ end
814
+
815
+ # ========================================================================= #
816
+ # === audio_player_to_use?
817
+ # ========================================================================= #
818
+ def audio_player_to_use?
819
+ @audio_player_to_use
820
+ end; alias audio_player? audio_player_to_use? # === audio_player?
821
+ alias use_which_audio_player? audio_player_to_use? # === use_which_audio_player?
822
+
823
+ # ========================================================================= #
824
+ # === delay?
825
+ # ========================================================================= #
826
+ def delay?
827
+ @delay.to_s
828
+ end
829
+
830
+ # ========================================================================= #
831
+ # === show_help (help tag)
832
+ #
833
+ # Show help here, then exit.
834
+ # ========================================================================= #
835
+ def show_help(
836
+ optional_shall_we_exit = false
837
+ )
838
+ cliner
839
+ opne 'Showing the available help options next:'
840
+ e
841
+ colourized_comment ' - OPEN # open this file in the editor'
842
+ colourized_comment ' - loop # play in an eternal loop'
843
+ colourized_comment ' - rand # play one random song'
844
+ colourized_comment ' - once # play all songs once, then quit'
845
+ colourized_comment ' - last? # show the last song played'
846
+ colourized_comment ' - player? # show which multimedia-player we will use'
847
+ colourized_comment ' - log? # show the log file of last-songs-played (if this file exists)'
848
+ colourized_comment ' - last-songs? # show the last songs that '\
849
+ 'were played, in a time-sorted manner'
850
+ e
851
+ cliner
852
+ exit_program(true, false) if optional_shall_we_exit == :then_exit
853
+ end
854
+
855
+ # ========================================================================= #
856
+ # === play_the_playlist
857
+ # ========================================================================= #
858
+ def play_the_playlist
859
+ if @play_in_a_loop # We wish to play in a never-ending loop.
860
+ counter = 0
861
+ loop {
862
+ playlist?.each {|song|
863
+ play_this_song(song)
864
+ pause unless @n_songs_played == playlist?.size
865
+ counter += 1
866
+ break if counter > @play_max_n_songs
867
+ }
868
+ refresh_playlist
869
+ }
870
+ else
871
+ playlist?.each {|song|
872
+ play_this_song(song)
873
+ pause unless @n_songs_played == playlist?.size
874
+ } # Afterwards, we will have exited.
875
+ end
876
+ end
877
+
878
+ # ========================================================================= #
879
+ # === register_which_song_was_last_played
880
+ #
881
+ # This method will also check if the file that is being played is too
882
+ # big. If it is, we will remove the log-file.
883
+ # ========================================================================= #
884
+ def register_which_song_was_last_played(
885
+ this_song,
886
+ store_where_to = the_songs_played_will_be_stored_where?
887
+ )
888
+ $stdout.flush # Unsure why we wish to do this.
889
+ FileUtils.touch(store_where_to) unless File.exist?(store_where_to)
890
+ if get_file_size(store_where_to) > MAXIMUM_ALLOWED_FILE_SIZE
891
+ remove_file(store_where_to)
892
+ end
893
+ unless store_where_to.include? '/'
894
+ store_where_to = HOME_DIRECTORY+store_where_to
895
+ end # store_where_to now defaults to: /root/LAST_SONG_PLAYED
896
+ append_what_into(this_song+N, store_where_to)
897
+ register_this_song(this_song)
898
+ # ======================================================================= #
899
+ # Since as of September 2021 this class will also try to store into
900
+ # a log file, if possible.
901
+ # ======================================================================= #
902
+ store_data_about_this_song_into_a_local_file(this_song)
903
+ end; alias register_which_song_will_be_played_next register_which_song_was_last_played # === register_which_song_will_be_played_next
904
+
905
+ # ========================================================================= #
906
+ # === show_the_last_songs_that_were_played
907
+ #
908
+ # The songs played will be stored in a .md file.
909
+ #
910
+ # Invocation example:
911
+ #
912
+ # rsong --last-songs?
913
+ #
914
+ # ========================================================================= #
915
+ def show_the_last_songs_that_were_played
916
+ _ = the_songs_played_will_be_stored_where?
917
+ if File.exist? _
918
+ dataset = File.readlines(_)
919
+ dataset.each {|this_song| e steelblue(this_song.strip) }
920
+ else
921
+ no_file_exists_at(_)
922
+ end
923
+ end
924
+
925
+ # ========================================================================= #
926
+ # === consider_renaming_the_kde_konsole_tab
927
+ # ========================================================================= #
928
+ def consider_renaming_the_kde_konsole_tab(i)
929
+ # ======================================================================= #
930
+ # === Rename the KDE Konsole tab here
931
+ # ======================================================================= #
932
+ if Object.const_defined? :Roebe
933
+ begin
934
+ i = File.basename(i).
935
+ gsub(/#{File.extname(i)}$/,'').
936
+ tr('_',' ')
937
+ # ===================================================================== #
938
+ # Must rescue this, in case of errors such as:
939
+ # invalid byte sequence in UTF-8
940
+ # ===================================================================== #
941
+ rescue ArgumentError => error
942
+ opne 'An error happened (ArgumentError) which is now displayed:'
943
+ pp error
944
+ end
945
+ Roebe.rename_konsole(i)
946
+ end if RENAME_KDE_KONSOLE_TAB
947
+ end
948
+
949
+ # ========================================================================= #
950
+ # === menu (menu tag)
951
+ # ========================================================================= #
952
+ def menu(i)
953
+ if i.is_a? Array
954
+ if i.empty?
955
+ i = 'loop'
956
+ else
957
+ i = i.join(' ').strip
958
+ end
959
+ end
960
+ i = i.to_s.strip
961
+ if i =~ /^\d+$/ # If input consists of only numbers.
962
+ opnn; e 'We will next play '+simp(i.to_s)+' songs.'
963
+ i.to_i.times { add_random_song }
964
+ # ======================================================================= #
965
+ # === 11:22:33
966
+ #
967
+ # Handle time-formats next.
968
+ # ======================================================================= #
969
+ elsif i =~ /^\d{1,2}:\d{1,2}:\d{1,2}$/ # If input consists of only numbers and ':'.
970
+ # ===================================================================== #
971
+ # User did input a time format such as "11:22:33". We will assume this
972
+ # to mean to enter idle mode, and then play the songs via a loop.
973
+ # ===================================================================== #
974
+ begin
975
+ require 'roebe/classes/at.rb'
976
+ Roebe::At.new(i)
977
+ do_play_in_a_loop # We play in a loop in this case.
978
+ rescue LoadError
979
+ e 'The file roebe/classes/at.rb is not available.'
980
+ end
981
+ else
982
+ case i # case tag
983
+ # ===================================================================== #
984
+ # === help
985
+ #
986
+ # This entry point can be used to show the help section.
987
+ # ===================================================================== #
988
+ when *ARRAY_HELP_OPTIONS
989
+ show_help :then_exit
990
+ # ===================================================================== #
991
+ # === rsong --last-songs?
992
+ # ===================================================================== #
993
+ when /^-?-?last(-|_)?songs\??$/i
994
+ show_the_last_songs_that_were_played
995
+ exit_program { :be_quiet }
996
+ # ===================================================================== #
997
+ # === --use-sox
998
+ # ===================================================================== #
999
+ when /^-?-?use(-|_)?sox/
1000
+ determine_which_audio_player_to_use(
1001
+ :sox, :ignore_environment_variable
1002
+ )
1003
+ # ===================================================================== #
1004
+ # === --use-mplayer
1005
+ # ===================================================================== #
1006
+ when /^-?-?use(-|_)?mplayer/
1007
+ determine_which_audio_player_to_use(
1008
+ :mplayer, :ignore_environment_variable
1009
+ )
1010
+ # ===================================================================== #
1011
+ # === rsong --log?
1012
+ # ===================================================================== #
1013
+ when /^-?-?log\??$/i
1014
+ show_the_log_file_if_it_exists
1015
+ exit_program(:force_exit_but_be_quiet)
1016
+ # ===================================================================== #
1017
+ # === OPEN
1018
+ # ===================================================================== #
1019
+ when /^-?-?OPEN$/i
1020
+ esystem "bluefish #{__FILE__}"
1021
+ exit_program(:force_exit)
1022
+ # ===================================================================== #
1023
+ # === rsong --player?
1024
+ # ===================================================================== #
1025
+ when /^-?-?player\??$/
1026
+ report_which_audio_player_to_use
1027
+ exit_program { :be_quiet }
1028
+ # ===================================================================== #
1029
+ # === random
1030
+ # ===================================================================== #
1031
+ when 'random',
1032
+ 'return_random_song',
1033
+ 'rand',
1034
+ 'one' # Only add one song.
1035
+ add_random_song
1036
+ # ===================================================================== #
1037
+ # === chill
1038
+ # ===================================================================== #
1039
+ when 'list','chill','1'
1040
+ if Object.const_defined? :PlaylistProfile
1041
+ these_songs = PlaylistProfile::GOOD_CHILL_SONGS.map {|entry|
1042
+ audio_dir?+entry
1043
+ }
1044
+ add(these_songs.shuffle)
1045
+ end
1046
+ # ===================================================================== #
1047
+ # === playlist
1048
+ # ===================================================================== #
1049
+ when /playlist\??/i
1050
+ try_to_play_playlist
1051
+ # ===================================================================== #
1052
+ # === last?
1053
+ # ===================================================================== #
1054
+ when 'last?'
1055
+ show_last_file_played
1056
+ # ===================================================================== #
1057
+ # === once
1058
+ # ===================================================================== #
1059
+ when 'once','noloop','default','all', # This means we play every song exactly once, then quit.
1060
+ '','true','false',
1061
+ 'all_songs',
1062
+ 'play_all_songs'
1063
+ opnn; e 'We will play all available Audio files once.'
1064
+ add_all_songs
1065
+ # ===================================================================== #
1066
+ # === dance
1067
+ # ===================================================================== #
1068
+ when 'dance','bdance','breakdance' # Im Moment hardcoded auf bdance
1069
+ these_songs = PlaylistProfile::GOOD_BDANCE_SONGS.shuffle.map {|entry|
1070
+ audio_dir?+entry
1071
+ }
1072
+ add(these_songs.shuffle)
1073
+ # ===================================================================== #
1074
+ # === loop
1075
+ # ===================================================================== #
1076
+ when 'loop','l','nil'
1077
+ # Notify the user what we are doing next.
1078
+ opnn; e "#{main_colour?}Playing in a neverending #{sfancy('loop')}"\
1079
+ "#{main_colour?} next:"
1080
+ do_play_in_a_loop
1081
+ # ===================================================================== #
1082
+ # === genre
1083
+ # ===================================================================== #
1084
+ when 'genre','GENRES','genres','GENRE'
1085
+ unless ARGV[1]
1086
+ show_available_genres
1087
+ exit_program(:force_exit)
1088
+ end
1089
+ else # else tag
1090
+ # =================================================================== #
1091
+ # Grab all entries from the current directory that can match to the
1092
+ # input.
1093
+ # =================================================================== #
1094
+ entries = Dir['*'+i+'*']
1095
+ unless entries.empty?
1096
+ add_songs(entries)
1097
+ else
1098
+ try_to_find_genre_song(i)
1099
+ end
1100
+ end
1101
+ end
1102
+ end; alias check_against_menu menu # === check_against_menu
1103
+
1104
+ # ========================================================================= #
1105
+ # === run (run tag)
1106
+ # ========================================================================= #
1107
+ def run
1108
+ populate_hash_songs_played
1109
+ show_startup_message
1110
+ check_whether_the_song_directory_is_empty
1111
+ play_the_playlist
1112
+ perform_cleanup
1113
+ end
1114
+
1115
+ end
1116
+
1117
+ # =========================================================================== #
1118
+ # === MultimediaParadise.audio_player
1119
+ #
1120
+ # We also want to use a simpler module-method for the audio player.
1121
+ # =========================================================================== #
1122
+ def self.audio_player(options = nil)
1123
+ MultimediaParadise::AudioPlayer.new(options)
1124
+ end; self.instance_eval { alias audio_play audio_player } # === MultimediaParadise.audio_play
1125
+ self.instance_eval { alias play audio_player } # === MultimediaParadise.play
1126
+ self.instance_eval { alias [] audio_player } # === MultimediaParadise[]
1127
+
1128
+ end
1129
+
1130
+ if __FILE__ == $PROGRAM_NAME
1131
+ # pp MultimediaParadise::AudioPlayer
1132
+ _ = MultimediaParadise::AudioPlayer.new(ARGV, :dont_run_yet)
1133
+ if ARGV[1]
1134
+ _.try_to_find_genre_song(ARGV[1]) # To test this, try: rsong genre GOOD_BDANCE_SONGS
1135
+ end
1136
+ _.run
1137
+ end # rsong power
1138
+ #
1139
+ # If you do this:
1140
+ # rsong ELE
1141
+ # We load all ELE songs in our playlist
1142
+ # rsong playlist
1143
+ # Will play our playlist.