multimedia_paradise 1.1.314

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of multimedia_paradise might be problematic. Click here for more details.

Files changed (417) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +2340 -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/ffmpeg_merge +7 -0
  10. data/bin/file_duration +7 -0
  11. data/bin/gtk_radio +7 -0
  12. data/bin/loop_this_video +7 -0
  13. data/bin/merge_avi_files +7 -0
  14. data/bin/merge_mp3 +7 -0
  15. data/bin/missing_video_files +7 -0
  16. data/bin/movie_searcher +7 -0
  17. data/bin/mp3_to_opus +7 -0
  18. data/bin/mplayer_wrapper +7 -0
  19. data/bin/multimedia_information +11 -0
  20. data/bin/multimedia_paradise +9 -0
  21. data/bin/multimedia_paradise_sinatra +7 -0
  22. data/bin/play_random_simpsons_video +7 -0
  23. data/bin/playlist +7 -0
  24. data/bin/random_video +7 -0
  25. data/bin/remove_audio +9 -0
  26. data/bin/remove_last_second +7 -0
  27. data/bin/remove_subtitles +7 -0
  28. data/bin/tag_mp3_files +7 -0
  29. data/bin/to_aiff +10 -0
  30. data/bin/to_mp4 +7 -0
  31. data/bin/verbose_analyse_this_mp3_file_for_id3_tags +9 -0
  32. data/bin/video_codec +7 -0
  33. data/bin/video_information +8 -0
  34. data/bin/video_player +11 -0
  35. data/bin/video_to_images +7 -0
  36. data/bin/vp9 +9 -0
  37. data/bin/waveform +73 -0
  38. data/doc/CHANGELOG.md +44 -0
  39. data/doc/LINKS.md +6 -0
  40. data/doc/MOTIVATION_FOR_THIS_PROJECT.md +22 -0
  41. data/doc/MergingVideoLectures.md +12 -0
  42. data/doc/README.gen +2300 -0
  43. data/doc/Readme_for_the_cut_audio_component.md +168 -0
  44. data/doc/todo/todo_for_the_GUIs.md +0 -0
  45. data/doc/todo/todo_for_the_multimedia_paradise_project.md +111 -0
  46. data/lib/multimedia_paradise/audio/audio_player/audio_player.rb +83 -0
  47. data/lib/multimedia_paradise/audio/audio_player/constants.rb +136 -0
  48. data/lib/multimedia_paradise/audio/audio_player/menu.rb +164 -0
  49. data/lib/multimedia_paradise/audio/audio_player/misc.rb +718 -0
  50. data/lib/multimedia_paradise/audio/audio_player/reset.rb +77 -0
  51. data/lib/multimedia_paradise/audio/audio_player/tab.rb +35 -0
  52. data/lib/multimedia_paradise/audio/audio_tag_reader/README.md +7 -0
  53. data/lib/multimedia_paradise/audio/audio_tag_reader/audio_tag_reader.rb +503 -0
  54. data/lib/multimedia_paradise/audio/base.rb +67 -0
  55. data/lib/multimedia_paradise/audio/compress.rb +97 -0
  56. data/lib/multimedia_paradise/audio/create_m3u_playlist.rb +245 -0
  57. data/lib/multimedia_paradise/audio/extract_audio/constants.rb +37 -0
  58. data/lib/multimedia_paradise/audio/extract_audio/extract_audio.rb +417 -0
  59. data/lib/multimedia_paradise/audio/file_duration/constants.rb +53 -0
  60. data/lib/multimedia_paradise/audio/file_duration/file_duration.rb +602 -0
  61. data/lib/multimedia_paradise/audio/genres/boogie.rb +35 -0
  62. data/lib/multimedia_paradise/audio/genres/concerts.rb +35 -0
  63. data/lib/multimedia_paradise/audio/genres/constants.rb +53 -0
  64. data/lib/multimedia_paradise/audio/genres/eurodance.rb +35 -0
  65. data/lib/multimedia_paradise/audio/genres/genre.rb +696 -0
  66. data/lib/multimedia_paradise/audio/genres/hip_hop.rb +35 -0
  67. data/lib/multimedia_paradise/audio/genres/italian_songs.rb +35 -0
  68. data/lib/multimedia_paradise/audio/genres/the_1980s.rb +35 -0
  69. data/lib/multimedia_paradise/audio/genres/trance.rb +35 -0
  70. data/lib/multimedia_paradise/audio/lyrics_fetcher.rb +238 -0
  71. data/lib/multimedia_paradise/audio/merge_audio_files.rb +136 -0
  72. data/lib/multimedia_paradise/audio/modify_year_of_audio_file.rb +151 -0
  73. data/lib/multimedia_paradise/audio/n_audio_songs.rb +216 -0
  74. data/lib/multimedia_paradise/audio/play_all_audio_files.rb +122 -0
  75. data/lib/multimedia_paradise/audio/playlist/playlist.rb +1559 -0
  76. data/lib/multimedia_paradise/audio/remove_audio.rb +98 -0
  77. data/lib/multimedia_paradise/audio/remove_last_second.rb +83 -0
  78. data/lib/multimedia_paradise/audio/report_missing_id.rb +139 -0
  79. data/lib/multimedia_paradise/audio/streamripper/constants.rb +51 -0
  80. data/lib/multimedia_paradise/audio/streamripper/streamripper_wrapper.rb +279 -0
  81. data/lib/multimedia_paradise/audio/to_mp3.rb +138 -0
  82. data/lib/multimedia_paradise/audio/to_ogg.rb +104 -0
  83. data/lib/multimedia_paradise/audio/wav_to_mp3.rb +87 -0
  84. data/lib/multimedia_paradise/audio/waveform/class.rb +341 -0
  85. data/lib/multimedia_paradise/audio/waveform/constants.rb +38 -0
  86. data/lib/multimedia_paradise/audio/waveform/log.rb +101 -0
  87. data/lib/multimedia_paradise/autoinclude.rb +3 -0
  88. data/lib/multimedia_paradise/autoinclude_remove_audio.rb +6 -0
  89. data/lib/multimedia_paradise/base/base.rb +34 -0
  90. data/lib/multimedia_paradise/base/colours.rb +354 -0
  91. data/lib/multimedia_paradise/base/commandline_arguments.rb +52 -0
  92. data/lib/multimedia_paradise/base/constants.rb +19 -0
  93. data/lib/multimedia_paradise/base/encoding.rb +31 -0
  94. data/lib/multimedia_paradise/base/misc.rb +618 -0
  95. data/lib/multimedia_paradise/base/namespace.rb +36 -0
  96. data/lib/multimedia_paradise/base/time.rb +25 -0
  97. data/lib/multimedia_paradise/colours/colours.rb +82 -0
  98. data/lib/multimedia_paradise/commandline/menu.rb +498 -0
  99. data/lib/multimedia_paradise/configuration/play_zoomed.yml +1 -0
  100. data/lib/multimedia_paradise/constants/constants.rb +23 -0
  101. data/lib/multimedia_paradise/constants/conversions.rb +62 -0
  102. data/lib/multimedia_paradise/constants/directory_constants.rb +133 -0
  103. data/lib/multimedia_paradise/constants/encodings.rb +26 -0
  104. data/lib/multimedia_paradise/constants/file_constants.rb +171 -0
  105. data/lib/multimedia_paradise/constants/misc.rb +80 -0
  106. data/lib/multimedia_paradise/constants/my_video_directory.rb +30 -0
  107. data/lib/multimedia_paradise/constants/namespace.rb +14 -0
  108. data/lib/multimedia_paradise/constants/newline.rb +14 -0
  109. data/lib/multimedia_paradise/constants/video_filetypes.rb +27 -0
  110. data/lib/multimedia_paradise/constants/web_constants.rb +150 -0
  111. data/lib/multimedia_paradise/conversions/README.md +2 -0
  112. data/lib/multimedia_paradise/conversions/conversions.rb +930 -0
  113. data/lib/multimedia_paradise/css/project.css +15 -0
  114. data/lib/multimedia_paradise/data/asoundrc +12 -0
  115. data/lib/multimedia_paradise/ffmpeg/README.md +2 -0
  116. data/lib/multimedia_paradise/ffmpeg/ffmpeg.rb +620 -0
  117. data/lib/multimedia_paradise/gui/fox/play_from_radio_station.rb +75 -0
  118. data/lib/multimedia_paradise/gui/gosu/video_player/video_player.rb +109 -0
  119. data/lib/multimedia_paradise/gui/gtk2/lyrics/lyrics.rb +33 -0
  120. data/lib/multimedia_paradise/gui/gtk2/multimedia_converter/multimedia_converter.rb +33 -0
  121. data/lib/multimedia_paradise/gui/gtk2/notebook.rb +144 -0
  122. data/lib/multimedia_paradise/gui/gtk2/play_video_from_my_collection/play_video_from_my_collection.rb +43 -0
  123. data/lib/multimedia_paradise/gui/gtk2/simple_play_widget/README.md +12 -0
  124. data/lib/multimedia_paradise/gui/gtk2/simple_play_widget/simple_play_widget.rb +40 -0
  125. data/lib/multimedia_paradise/gui/gtk2/video_collection/video_collection.rb +56 -0
  126. data/lib/multimedia_paradise/gui/gtk2/widget_increase_or_decrease_audio/widget_increase_or_decrease_audio.rb +42 -0
  127. data/lib/multimedia_paradise/gui/gtk2/youtube_downloader/youtube_downloader.rb +32 -0
  128. data/lib/multimedia_paradise/gui/gtk3/change_metadata_widget/README.md +3 -0
  129. data/lib/multimedia_paradise/gui/gtk3/change_metadata_widget/change_metadata_widget.rb +150 -0
  130. data/lib/multimedia_paradise/gui/gtk3/cut_multimedia/cut_multimedia.rb +321 -0
  131. data/lib/multimedia_paradise/gui/gtk3/information_about_a_mp3_file/information_about_a_mp3_file.rb +421 -0
  132. data/lib/multimedia_paradise/gui/gtk3/lyrics/lyrics.rb +33 -0
  133. data/lib/multimedia_paradise/gui/gtk3/multimedia_converter/multimedia_converter.rb +34 -0
  134. data/lib/multimedia_paradise/gui/gtk3/multimedia_notebook/multimedia_notebook.rb +34 -0
  135. data/lib/multimedia_paradise/gui/gtk3/play_video_from_my_collection/play_video_from_my_collection.rb +34 -0
  136. data/lib/multimedia_paradise/gui/gtk3/playlist/playlist.rb +34 -0
  137. data/lib/multimedia_paradise/gui/gtk3/radio/misc.rb +487 -0
  138. data/lib/multimedia_paradise/gui/gtk3/radio/radio.rb +698 -0
  139. data/lib/multimedia_paradise/gui/gtk3/simple_play_widget/simple_play_widget.rb +38 -0
  140. data/lib/multimedia_paradise/gui/gtk3/sound_effect_widget/sound_effect_widget.rb +34 -0
  141. data/lib/multimedia_paradise/gui/gtk3/tag_mp3_files/connect_skeleton.rb +61 -0
  142. data/lib/multimedia_paradise/gui/gtk3/tag_mp3_files/create.rb +405 -0
  143. data/lib/multimedia_paradise/gui/gtk3/tag_mp3_files/misc.rb +1820 -0
  144. data/lib/multimedia_paradise/gui/gtk3/tag_mp3_files/tag_mp3_files.config +6 -0
  145. data/lib/multimedia_paradise/gui/gtk3/tag_mp3_files/tag_mp3_files.rb +66 -0
  146. data/lib/multimedia_paradise/gui/gtk3/video_collection/video_collection.rb +43 -0
  147. data/lib/multimedia_paradise/gui/gtk3/video_editor/video_editor.rb +34 -0
  148. data/lib/multimedia_paradise/gui/gtk3/video_player/video_player.rb +34 -0
  149. data/lib/multimedia_paradise/gui/gtk3/webcam_widget/webcam_widget.rb +425 -0
  150. data/lib/multimedia_paradise/gui/gtk3/widget_increase_or_decrease_audio/widget_increase_or_decrease_audio.rb +36 -0
  151. data/lib/multimedia_paradise/gui/gtk3/youtube_channels/youtube_channels.rb +210 -0
  152. data/lib/multimedia_paradise/gui/gtk3/youtube_downloader/youtube_downloader.rb +32 -0
  153. data/lib/multimedia_paradise/gui/gui_base.rb +92 -0
  154. data/lib/multimedia_paradise/gui/libui/change_metadata_widget/change_metadata_widget.rb +115 -0
  155. data/lib/multimedia_paradise/gui/libui/cut_multimedia/cut_multimedia.rb +119 -0
  156. data/lib/multimedia_paradise/gui/libui/lyrics/lyrics.rb +67 -0
  157. data/lib/multimedia_paradise/gui/libui/simple_play_widget/simple_play_widget.rb +119 -0
  158. data/lib/multimedia_paradise/gui/libui/tag_mp3_files/tag_mp3_files.rb +268 -0
  159. data/lib/multimedia_paradise/gui/libui/video_player/video_player.rb +81 -0
  160. data/lib/multimedia_paradise/gui/libui/widget_increase_or_decrease_audio/widget_increase_or_decrease_audio.rb +126 -0
  161. data/lib/multimedia_paradise/gui/libui/youtube_channels/youtube_channels.rb +116 -0
  162. data/lib/multimedia_paradise/gui/libui/youtube_downloader/youtube_downloader.rb +107 -0
  163. data/lib/multimedia_paradise/gui/shared_code/change_metadata_widget/change_metadata_widget_module.rb +538 -0
  164. data/lib/multimedia_paradise/gui/shared_code/cut_multimedia/cut_multimedia_module.rb +268 -0
  165. data/lib/multimedia_paradise/gui/shared_code/information_about_a_mp3_file/information_about_a_mp3_file_module.rb +120 -0
  166. data/lib/multimedia_paradise/gui/shared_code/lyrics/lyrics_module.rb +141 -0
  167. data/lib/multimedia_paradise/gui/shared_code/multimedia_converter/multimedia_converter_module.rb +478 -0
  168. data/lib/multimedia_paradise/gui/shared_code/multimedia_notebook/multimedia_notebook_module.rb +171 -0
  169. data/lib/multimedia_paradise/gui/shared_code/play_video_from_my_collection/play_video_from_my_collection_module.rb +464 -0
  170. data/lib/multimedia_paradise/gui/shared_code/playlist/playlist_module.rb +151 -0
  171. data/lib/multimedia_paradise/gui/shared_code/simple_play_widget/simple_play_widget_module.rb +257 -0
  172. data/lib/multimedia_paradise/gui/shared_code/sound_effect_widget/sound_effect_widget_module.rb +173 -0
  173. data/lib/multimedia_paradise/gui/shared_code/tag_mp3_files/tag_mp3_files_module.rb +73 -0
  174. data/lib/multimedia_paradise/gui/shared_code/video_editor/video_editor_module.rb +287 -0
  175. data/lib/multimedia_paradise/gui/shared_code/video_player/video_player_module.rb +185 -0
  176. data/lib/multimedia_paradise/gui/shared_code/widget_increase_or_decrease_audio/widget_increase_or_decrease_audio_module.rb +310 -0
  177. data/lib/multimedia_paradise/gui/shared_code/youtube_downloader/youtube_downloader_module.rb +339 -0
  178. data/lib/multimedia_paradise/gui/tk/tk_multimedia_wrapper.rb +60 -0
  179. data/lib/multimedia_paradise/help/help.rb +75 -0
  180. data/lib/multimedia_paradise/images/MULTIMEDIA.jpg +0 -0
  181. data/lib/multimedia_paradise/images/MULTIMEDIA_PARADISE_ID_TAG_GUI_IN_RUBY_GTK3.png +0 -0
  182. data/lib/multimedia_paradise/images/MULTIMEDIA_PARADISE_LOGO.png +0 -0
  183. data/lib/multimedia_paradise/images/UK_flag.png +0 -0
  184. data/lib/multimedia_paradise/images/US_flag.png +0 -0
  185. data/lib/multimedia_paradise/images/austrian_flag.png +0 -0
  186. data/lib/multimedia_paradise/images/french_flag.png +0 -0
  187. data/lib/multimedia_paradise/images/german_flag.png +0 -0
  188. data/lib/multimedia_paradise/images/radio_image.png +0 -0
  189. data/lib/multimedia_paradise/images/trance.png +0 -0
  190. data/lib/multimedia_paradise/java/AudioPlayer.class +0 -0
  191. data/lib/multimedia_paradise/java/AudioPlayer.java +103 -0
  192. data/lib/multimedia_paradise/java/README.md +3 -0
  193. data/lib/multimedia_paradise/misc/long_format_to_milliseconds_converter.rb +182 -0
  194. data/lib/multimedia_paradise/misc/milliseconds_to_long_format_converter.rb +186 -0
  195. data/lib/multimedia_paradise/multimedia/analyse_multimedia_file.rb +180 -0
  196. data/lib/multimedia_paradise/multimedia/avisynth/README.md +4 -0
  197. data/lib/multimedia_paradise/multimedia/avisynth/avisynth_code.avs +471 -0
  198. data/lib/multimedia_paradise/multimedia/base.rb +60 -0
  199. data/lib/multimedia_paradise/multimedia/chord.rb +174 -0
  200. data/lib/multimedia_paradise/multimedia/convert_audio_to_video_with_image.rb +171 -0
  201. data/lib/multimedia_paradise/multimedia/cut_multimedia/10_minutes_chop.rb +29 -0
  202. data/lib/multimedia_paradise/multimedia/cut_multimedia/15_minutes_chop.rb +29 -0
  203. data/lib/multimedia_paradise/multimedia/cut_multimedia/30_minutes_chop.rb +29 -0
  204. data/lib/multimedia_paradise/multimedia/cut_multimedia/5_minutes_chop.rb +29 -0
  205. data/lib/multimedia_paradise/multimedia/cut_multimedia/cut_multimedia.rb +2017 -0
  206. data/lib/multimedia_paradise/multimedia/cut_multimedia/evaluate_from_this_file.rb +79 -0
  207. data/lib/multimedia_paradise/multimedia/cut_multimedia/interactive_menu.rb +514 -0
  208. data/lib/multimedia_paradise/multimedia/interactive_shell.rb +84 -0
  209. data/lib/multimedia_paradise/multimedia/merge_multimedia.rb +125 -0
  210. data/lib/multimedia_paradise/multimedia/note.rb +500 -0
  211. data/lib/multimedia_paradise/multimedia/play_from_this_list.rb +163 -0
  212. data/lib/multimedia_paradise/multimedia/read_meta_tags.rb +173 -0
  213. data/lib/multimedia_paradise/multimedia/simulate_youtube_playlist.rb +209 -0
  214. data/lib/multimedia_paradise/multimedia/start_length_duration.rb +205 -0
  215. data/lib/multimedia_paradise/multimedia/video_downloader/video_downloader.rb +143 -0
  216. data/lib/multimedia_paradise/project/project.rb +47 -0
  217. data/lib/multimedia_paradise/requires/require_audio_files.rb +74 -0
  218. data/lib/multimedia_paradise/requires/require_cut_multimedia.rb +7 -0
  219. data/lib/multimedia_paradise/requires/require_extract_audio.rb +7 -0
  220. data/lib/multimedia_paradise/requires/require_file_duration.rb +7 -0
  221. data/lib/multimedia_paradise/requires/require_streamripper.rb +7 -0
  222. data/lib/multimedia_paradise/requires/require_the_audio_player.rb +7 -0
  223. data/lib/multimedia_paradise/requires/require_the_multimedia_paradise_project.rb +38 -0
  224. data/lib/multimedia_paradise/requires/require_the_sinatra_components.rb +7 -0
  225. data/lib/multimedia_paradise/requires/require_toplevel_methods_files.rb +25 -0
  226. data/lib/multimedia_paradise/requires/require_video_files.rb +25 -0
  227. data/lib/multimedia_paradise/requires/require_video_player.rb +7 -0
  228. data/lib/multimedia_paradise/sinatra/app.rb +311 -0
  229. data/lib/multimedia_paradise/sinatra/embeddable_interface.rb +379 -0
  230. data/lib/multimedia_paradise/sound_effects/README.md +12 -0
  231. data/lib/multimedia_paradise/sound_effects/cat_meow.mp3 +0 -0
  232. data/lib/multimedia_paradise/sound_effects/channel_opened.mp3 +0 -0
  233. data/lib/multimedia_paradise/sound_effects/phone_ring.mp3 +0 -0
  234. data/lib/multimedia_paradise/statistics/README.md +5 -0
  235. data/lib/multimedia_paradise/statistics/video.rb +84 -0
  236. data/lib/multimedia_paradise/toplevel_cut_audio.rb +16 -0
  237. data/lib/multimedia_paradise/toplevel_methods/analyze_audio_stream.rb +31 -0
  238. data/lib/multimedia_paradise/toplevel_methods/chop_into_segments_of_n_seconds_size.rb +32 -0
  239. data/lib/multimedia_paradise/toplevel_methods/chop_off_first_five_minutes.rb +22 -0
  240. data/lib/multimedia_paradise/toplevel_methods/chop_off_first_n_seconds.rb +92 -0
  241. data/lib/multimedia_paradise/toplevel_methods/chop_off_first_ten_minutes.rb +22 -0
  242. data/lib/multimedia_paradise/toplevel_methods/chop_off_first_two_minutes.rb +24 -0
  243. data/lib/multimedia_paradise/toplevel_methods/codecs.rb +50 -0
  244. data/lib/multimedia_paradise/toplevel_methods/copy_and_merge_this_video_n_times.rb +51 -0
  245. data/lib/multimedia_paradise/toplevel_methods/copy_file.rb +18 -0
  246. data/lib/multimedia_paradise/toplevel_methods/create_video_from_this_audio.rb +65 -0
  247. data/lib/multimedia_paradise/toplevel_methods/cut_from_to.rb +156 -0
  248. data/lib/multimedia_paradise/toplevel_methods/delay_audio.rb +31 -0
  249. data/lib/multimedia_paradise/toplevel_methods/denoise.rb +90 -0
  250. data/lib/multimedia_paradise/toplevel_methods/deshake.rb +43 -0
  251. data/lib/multimedia_paradise/toplevel_methods/e.rb +16 -0
  252. data/lib/multimedia_paradise/toplevel_methods/encode_this_video.rb +49 -0
  253. data/lib/multimedia_paradise/toplevel_methods/ensure_that_the_output_directory_exists.rb +27 -0
  254. data/lib/multimedia_paradise/toplevel_methods/esystem.rb +43 -0
  255. data/lib/multimedia_paradise/toplevel_methods/files_and_directories.rb +90 -0
  256. data/lib/multimedia_paradise/toplevel_methods/flip_and_rotate.rb +58 -0
  257. data/lib/multimedia_paradise/toplevel_methods/increase_volume_of_this_audio_file.rb +61 -0
  258. data/lib/multimedia_paradise/toplevel_methods/is_a_multimedia_file.rb +27 -0
  259. data/lib/multimedia_paradise/toplevel_methods/is_audio_file.rb +27 -0
  260. data/lib/multimedia_paradise/toplevel_methods/is_image_file.rb +31 -0
  261. data/lib/multimedia_paradise/toplevel_methods/is_on_roebe.rb +17 -0
  262. data/lib/multimedia_paradise/toplevel_methods/is_video_file.rb +62 -0
  263. data/lib/multimedia_paradise/toplevel_methods/merge_multimedia_file.rb +327 -0
  264. data/lib/multimedia_paradise/toplevel_methods/merge_these_videos.rb +105 -0
  265. data/lib/multimedia_paradise/toplevel_methods/misc.rb +885 -0
  266. data/lib/multimedia_paradise/toplevel_methods/n_local_videos.rb +56 -0
  267. data/lib/multimedia_paradise/toplevel_methods/opn.rb +24 -0
  268. data/lib/multimedia_paradise/toplevel_methods/output_directory.rb +59 -0
  269. data/lib/multimedia_paradise/toplevel_methods/player_in_use.rb +80 -0
  270. data/lib/multimedia_paradise/toplevel_methods/query_the_audio_codec_of_this_file.rb +24 -0
  271. data/lib/multimedia_paradise/toplevel_methods/radio.rb +360 -0
  272. data/lib/multimedia_paradise/toplevel_methods/rds.rb +24 -0
  273. data/lib/multimedia_paradise/toplevel_methods/return_all_video_files.rb +64 -0
  274. data/lib/multimedia_paradise/toplevel_methods/return_data_from_video_collection_file_for_this_entry.rb +38 -0
  275. data/lib/multimedia_paradise/toplevel_methods/return_duration_of_this_multimedia_file.rb +27 -0
  276. data/lib/multimedia_paradise/toplevel_methods/return_full_name_for_video_at_this_position.rb +54 -0
  277. data/lib/multimedia_paradise/toplevel_methods/return_path_to_random_simpsons_video_file.rb +43 -0
  278. data/lib/multimedia_paradise/toplevel_methods/return_random_video_file_from_the_video_collection.rb +73 -0
  279. data/lib/multimedia_paradise/toplevel_methods/return_screen_resolution.rb +24 -0
  280. data/lib/multimedia_paradise/toplevel_methods/run_sys_command.rb +30 -0
  281. data/lib/multimedia_paradise/toplevel_methods/scale_video.rb +27 -0
  282. data/lib/multimedia_paradise/toplevel_methods/set_title_of.rb +65 -0
  283. data/lib/multimedia_paradise/toplevel_methods/slow_down_this_video_file.rb +33 -0
  284. data/lib/multimedia_paradise/toplevel_methods/start_screencast.rb +70 -0
  285. data/lib/multimedia_paradise/toplevel_methods/subtitles.rb +59 -0
  286. data/lib/multimedia_paradise/toplevel_methods/to_flac.rb +30 -0
  287. data/lib/multimedia_paradise/toplevel_methods/to_mp4.rb +24 -0
  288. data/lib/multimedia_paradise/toplevel_methods/total_duration.rb +35 -0
  289. data/lib/multimedia_paradise/toplevel_methods/use_lame_codec.rb +32 -0
  290. data/lib/multimedia_paradise/toplevel_methods/video_dataset.rb +76 -0
  291. data/lib/multimedia_paradise/version/version.rb +28 -0
  292. data/lib/multimedia_paradise/video/all_videos.rb +101 -0
  293. data/lib/multimedia_paradise/video/capture_screen.rb +285 -0
  294. data/lib/multimedia_paradise/video/check_numbers.rb +215 -0
  295. data/lib/multimedia_paradise/video/columbo/columbo.rb +139 -0
  296. data/lib/multimedia_paradise/video/copy_missing_video_files.rb +293 -0
  297. data/lib/multimedia_paradise/video/copy_random_video.rb +98 -0
  298. data/lib/multimedia_paradise/video/correct_video_numbers.rb +278 -0
  299. data/lib/multimedia_paradise/video/create_dvd.rb +50 -0
  300. data/lib/multimedia_paradise/video/encode_video.rb +81 -0
  301. data/lib/multimedia_paradise/video/ffmpeg_options.rb +156 -0
  302. data/lib/multimedia_paradise/video/find_video/constants.rb +23 -0
  303. data/lib/multimedia_paradise/video/find_video/find_video.rb +493 -0
  304. data/lib/multimedia_paradise/video/fix_married_with_children_videos.rb +70 -0
  305. data/lib/multimedia_paradise/video/guess_video_name.rb +189 -0
  306. data/lib/multimedia_paradise/video/imdb_rating/imdb_rating.rb +141 -0
  307. data/lib/multimedia_paradise/video/mike_hammer/mike_hammer.rb +74 -0
  308. data/lib/multimedia_paradise/video/missing_video_files/missing_video_files.rb +286 -0
  309. data/lib/multimedia_paradise/video/movie_searcher.rb +281 -0
  310. data/lib/multimedia_paradise/video/mplayer_wrapper.rb +504 -0
  311. data/lib/multimedia_paradise/video/play_random_file.rb +91 -0
  312. data/lib/multimedia_paradise/video/play_random_realvideo.rb +87 -0
  313. data/lib/multimedia_paradise/video/prepare_video_lecture.rb +272 -0
  314. data/lib/multimedia_paradise/video/random_video.rb +310 -0
  315. data/lib/multimedia_paradise/video/registered_video_file.rb +131 -0
  316. data/lib/multimedia_paradise/video/remove_metadata.rb +52 -0
  317. data/lib/multimedia_paradise/video/rename_video_file.rb +149 -0
  318. data/lib/multimedia_paradise/video/report_local_videos.rb +106 -0
  319. data/lib/multimedia_paradise/video/report_missing_videos_in_the_yaml_file.rb +107 -0
  320. data/lib/multimedia_paradise/video/resolution.rb +159 -0
  321. data/lib/multimedia_paradise/video/simpsons.rb +129 -0
  322. data/lib/multimedia_paradise/video/speed_up_video.rb +135 -0
  323. data/lib/multimedia_paradise/video/split_this_video.rb +126 -0
  324. data/lib/multimedia_paradise/video/srt_regex.rb +211 -0
  325. data/lib/multimedia_paradise/video/store_available_video_files.rb +138 -0
  326. data/lib/multimedia_paradise/video/the_simpsons/README.md +9 -0
  327. data/lib/multimedia_paradise/video/the_simpsons/good_the_simpsons_episodes.rb +107 -0
  328. data/lib/multimedia_paradise/video/the_simpsons/the_simpsons.rb +82 -0
  329. data/lib/multimedia_paradise/video/video.rb +14 -0
  330. data/lib/multimedia_paradise/video/video_encoding_settings.rb +57 -0
  331. data/lib/multimedia_paradise/video/video_genres.rb +337 -0
  332. data/lib/multimedia_paradise/video/video_information.rb +443 -0
  333. data/lib/multimedia_paradise/video/video_metadata.rb +132 -0
  334. data/lib/multimedia_paradise/video/video_player.rb +581 -0
  335. data/lib/multimedia_paradise/video/video_renamer.rb +160 -0
  336. data/lib/multimedia_paradise/video/watermark.rb +290 -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/www/GIS/GIS.cgi +147 -0
  340. data/lib/multimedia_paradise/www/HDMI/HDMI.cgi +34 -0
  341. data/lib/multimedia_paradise/www/TALES_FROM_THE_CRYPT.html +71 -0
  342. data/lib/multimedia_paradise/www/alsa/alsa.cgi +7 -0
  343. data/lib/multimedia_paradise/www/alsa/alsa.rb +309 -0
  344. data/lib/multimedia_paradise/www/alsa/alsa.sinatra +56 -0
  345. data/lib/multimedia_paradise/www/audacity.cgi +30 -0
  346. data/lib/multimedia_paradise/www/audio/audio.cgi +9 -0
  347. data/lib/multimedia_paradise/www/audio/audio.rb +2739 -0
  348. data/lib/multimedia_paradise/www/audio/audio.sinatra +56 -0
  349. data/lib/multimedia_paradise/www/avisynth/avisynth.cgi +172 -0
  350. data/lib/multimedia_paradise/www/best_voices/best_voices.cgi +60 -0
  351. data/lib/multimedia_paradise/www/cassette/cassette.cgi +723 -0
  352. data/lib/multimedia_paradise/www/codecs/codecs.cgi +95 -0
  353. data/lib/multimedia_paradise/www/componists/vivaldi.cgi +218 -0
  354. data/lib/multimedia_paradise/www/decibel.cgi +79 -0
  355. data/lib/multimedia_paradise/www/ffmpeg/ffmpeg.cgi +439 -0
  356. data/lib/multimedia_paradise/www/lame/lame.cgi +7 -0
  357. data/lib/multimedia_paradise/www/lame/lame.rb +101 -0
  358. data/lib/multimedia_paradise/www/lame/lame.sinatra +56 -0
  359. data/lib/multimedia_paradise/www/lilypond.cgi +96 -0
  360. data/lib/multimedia_paradise/www/lyrics/lyrics.cgi +49 -0
  361. data/lib/multimedia_paradise/www/midi/al_adagi.mid +0 -0
  362. data/lib/multimedia_paradise/www/play_songs.cgi +102 -0
  363. data/lib/multimedia_paradise/www/play_this_video_file.cgi +100 -0
  364. data/lib/multimedia_paradise/www/pulseaudio/pulseaudio.cgi +7 -0
  365. data/lib/multimedia_paradise/www/pulseaudio/pulseaudio.rb +168 -0
  366. data/lib/multimedia_paradise/www/pulseaudio/pulseaudio.sinatra +56 -0
  367. data/lib/multimedia_paradise/www/rhythmbox/rhythmbox.cgi +120 -0
  368. data/lib/multimedia_paradise/www/sound_theory.cgi +163 -0
  369. data/lib/multimedia_paradise/www/tv/tv.cgi +182 -0
  370. data/lib/multimedia_paradise/www/video/video.cgi +7 -0
  371. data/lib/multimedia_paradise/www/video/video.rb +7709 -0
  372. data/lib/multimedia_paradise/www/video/video.sinatra +52 -0
  373. data/lib/multimedia_paradise/www/web_streams.cgi +58 -0
  374. data/lib/multimedia_paradise/yaml/audio_formats.yml +14 -0
  375. data/lib/multimedia_paradise/yaml/best_songs_in_an_era/eurodance/top20.yml +28 -0
  376. data/lib/multimedia_paradise/yaml/game_shows/ruck_zuck/ruck_zuck.yml +25 -0
  377. data/lib/multimedia_paradise/yaml/genres/1980s.yml +198 -0
  378. data/lib/multimedia_paradise/yaml/genres/README.md +5 -0
  379. data/lib/multimedia_paradise/yaml/genres/boogie.yml +68 -0
  380. data/lib/multimedia_paradise/yaml/genres/concerts.yml +29 -0
  381. data/lib/multimedia_paradise/yaml/genres/eurodance.yml +456 -0
  382. data/lib/multimedia_paradise/yaml/genres/hip_hop.yml +49 -0
  383. data/lib/multimedia_paradise/yaml/genres/italian_songs.yml +53 -0
  384. data/lib/multimedia_paradise/yaml/genres/trance.yml +167 -0
  385. data/lib/multimedia_paradise/yaml/good_horror_movies/good_horror_movies.yml +12 -0
  386. data/lib/multimedia_paradise/yaml/good_movie_actors/good_movie_actors.yml +6 -0
  387. data/lib/multimedia_paradise/yaml/image_formats.yml +8 -0
  388. data/lib/multimedia_paradise/yaml/internal/README.md +2 -0
  389. data/lib/multimedia_paradise/yaml/internal/installed_binaries.yml +31 -0
  390. data/lib/multimedia_paradise/yaml/lyrics.yml +6275 -0
  391. data/lib/multimedia_paradise/yaml/movie_reviews/the_hateful_eight_september_2016.md +305 -0
  392. data/lib/multimedia_paradise/yaml/music_genres.yml +51 -0
  393. data/lib/multimedia_paradise/yaml/playlist.yml +127 -0
  394. data/lib/multimedia_paradise/yaml/radio/README.md +5 -0
  395. data/lib/multimedia_paradise/yaml/radio/radio_stations.yml +359 -0
  396. data/lib/multimedia_paradise/yaml/song_tags.yml +815 -0
  397. data/lib/multimedia_paradise/yaml/tales_from_the_crypt/tales_from_the_crypt.yml +418 -0
  398. data/lib/multimedia_paradise/yaml/tom_and_jerry/README.md +2 -0
  399. data/lib/multimedia_paradise/yaml/tom_and_jerry/tom_and_jerry_episodes.yml +27 -0
  400. data/lib/multimedia_paradise/yaml/tv_channels/tv_channels.yml +46 -0
  401. data/lib/multimedia_paradise/yaml/use_this_video_player.yml +1 -0
  402. data/lib/multimedia_paradise/yaml/video/video.yml +26 -0
  403. data/lib/multimedia_paradise/yaml/video_collection/video_collection.yml +1933 -0
  404. data/lib/multimedia_paradise/yaml/video_encoding_settings.yml +62 -0
  405. data/lib/multimedia_paradise/yaml/video_filter_aliases.yml +221 -0
  406. data/lib/multimedia_paradise/yaml/youtube/alltagsgeschichte/alltagsgeschichte.yml +172 -0
  407. data/lib/multimedia_paradise/yaml/youtube/songs/README.md +3 -0
  408. data/lib/multimedia_paradise/yaml/youtube/songs/songs.yml +6 -0
  409. data/lib/multimedia_paradise/yaml/youtube_playlist/youtube_playlist.yml +6 -0
  410. data/lib/multimedia_paradise.rb +5 -0
  411. data/multimedia_paradise.gemspec +76 -0
  412. data/test/testing_audio_player.rb +15 -0
  413. data/test/testing_ffmpeg_options.rb +14 -0
  414. data/test/testing_file_duration.rb +17 -0
  415. data/test/testing_modify_year_of_audio_file.rb +14 -0
  416. data/test/testing_multimedia_paradise_project.rb +151 -0
  417. metadata +581 -0
@@ -0,0 +1,696 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # === MultimediaParadise::Genre
6
+ #
7
+ # This class can do lots of things in regards to a yaml file (such as
8
+ # the file 'eurodance.yml'), which has to be supplied to this class.
9
+ #
10
+ # The class can then respond to the following commandline instructions:
11
+ #
12
+ # download # download everything into a newly created directory.
13
+ # # This will also rename things properly. [IMPLEMENTED]
14
+ # generate_homepage # generate a homepage [IMPLEMENTED]
15
+ # overview # Show what we have in that yaml file, in a colourized
16
+ # # manner. [IMPLEMENTED]
17
+ # only_names # Display only the names of the registered songs [IMPLEMENTED]
18
+ # open # open the playlist via your editor [IMPLEMENTED]
19
+ # playlist # Generate a .m3u playlist from these results. [IMPLEMENTED]
20
+ # validity # Ensure that each entry is strictly and fully
21
+ # # correct. [NOT YET IMPLEMENTED]
22
+ # years # sort via years [IMPLEMENTED]
23
+ # urls # show only the URLs, without anything else [IMPLEMENTED]
24
+ #
25
+ # Additionally, if you supply a number, such as "eurodance 35", then we
26
+ # will download only that file at that position (starting to count at
27
+ # track 1), from a remote position.
28
+ #
29
+ # Usage example:
30
+ #
31
+ # MultimediaParadise::Eurodance.new(ARGV)
32
+ #
33
+ # =========================================================================== #
34
+ # require 'multimedia_paradise/audio/genres/class.rb'
35
+ # =========================================================================== #
36
+ require 'multimedia_paradise/base/base.rb'
37
+
38
+ module MultimediaParadise
39
+
40
+ class Genre < ::MultimediaParadise::Base # === MultimediaParadise::Eurodance
41
+
42
+ require 'multimedia_paradise/audio/create_m3u_playlist.rb'
43
+ require 'multimedia_paradise/audio/genres/constants.rb'
44
+
45
+ begin
46
+ require 'html_tags'
47
+ rescue LoadError; end
48
+
49
+ include MultimediaParadise::Genres
50
+
51
+ # ========================================================================= #
52
+ # === DEFAULT_FILE
53
+ # ========================================================================= #
54
+ DEFAULT_FILE = MultimediaParadise::Genres::EURODANCE_FILE
55
+
56
+ # ========================================================================= #
57
+ # === NAMESPACE
58
+ # ========================================================================= #
59
+ NAMESPACE = inspect
60
+
61
+ # ========================================================================= #
62
+ # === initialize
63
+ # ========================================================================= #
64
+ def initialize(
65
+ i = nil,
66
+ run_already = true
67
+ )
68
+ reset
69
+ set_yaml_file(
70
+ DEFAULT_FILE
71
+ )
72
+ set_commandline_arguments(i)
73
+ run if run_already
74
+ end
75
+
76
+ # ========================================================================= #
77
+ # === reset (reset tag)
78
+ # ========================================================================= #
79
+ def reset
80
+ super()
81
+ # ======================================================================= #
82
+ # === @dataset
83
+ # ======================================================================= #
84
+ @dataset = nil
85
+ set_commandline_arguments
86
+ set_namespace
87
+ end
88
+
89
+ # ========================================================================= #
90
+ # === set_yaml_file
91
+ # ========================================================================= #
92
+ def set_yaml_file(i)
93
+ @yaml_file = i
94
+ # ======================================================================= #
95
+ # === Initialize the yaml dataset
96
+ # ======================================================================= #
97
+ load_yaml_dataset # Must re-initialize @dataset whenever set_input() is called.
98
+ end
99
+
100
+ # ========================================================================= #
101
+ # === yaml_file?
102
+ #
103
+ # This will always point at the main yaml file.
104
+ # ========================================================================= #
105
+ def yaml_file?
106
+ @yaml_file
107
+ end
108
+
109
+ # ========================================================================= #
110
+ # === show_the_location_of_the_yaml_file
111
+ #
112
+ # To invoke this method, try:
113
+ #
114
+ # eurodance --file?
115
+ #
116
+ # ========================================================================= #
117
+ def show_the_location_of_the_yaml_file
118
+ e sfile(@yaml_file)
119
+ end
120
+
121
+ # ========================================================================= #
122
+ # === set_commandline_arguments
123
+ # ========================================================================= #
124
+ def set_commandline_arguments(i = DEFAULT_FILE)
125
+ i = [i] unless i.is_a? Array
126
+ i = [DEFAULT_FILE] if i.compact.empty?
127
+ @commandline_arguments = i
128
+ end
129
+
130
+ # ========================================================================= #
131
+ # === set_namespace
132
+ # ========================================================================= #
133
+ def set_namespace(i = NAMESPACE)
134
+ @namespace = i
135
+ end
136
+
137
+ # ========================================================================= #
138
+ # === open_playlist_in_your_editor
139
+ #
140
+ # Invoke such as by doing:
141
+ #
142
+ # trance --open
143
+ #
144
+ # ========================================================================= #
145
+ def open_playlist_in_your_editor
146
+ _ = yaml_file?
147
+ _ = 'bluefish '+_
148
+ esystem(_)
149
+ end
150
+
151
+ # ========================================================================= #
152
+ # === load_yaml_dataset
153
+ #
154
+ # This method will also make @dataset available.
155
+ # ========================================================================= #
156
+ def load_yaml_dataset
157
+ _ = yaml_file?
158
+ begin # Must protect it because the yaml file may be buggy and raise Psych::SyntaxError.
159
+ @dataset = YAML.load_file(_)
160
+ rescue ArgumentError # This clause happens when syck raises an error.
161
+ @dataset = File.read(_)
162
+ rescue Exception => error
163
+ opnn; e 'An error happened on line '+__LINE__.to_s+'.'
164
+ pp error
165
+ pp error.class
166
+ end
167
+ sanitize_yaml_dataset # Must sanitize it.
168
+ end
169
+
170
+ # ========================================================================= #
171
+ # === sanitize_yaml_dataset
172
+ # ========================================================================= #
173
+ def sanitize_yaml_dataset
174
+ if @dataset.is_a? String
175
+ # ===================================================================== #
176
+ # Do the manual parsing on your own if it is a String.
177
+ # ===================================================================== #
178
+ _ = @dataset.split(N)
179
+ _.reject! {|entry| entry.start_with? '#' }
180
+ _.reject! {|entry| entry.strip.empty? }
181
+ # ===================================================================== #
182
+ # This is presently unfinished. I may continue working on this if
183
+ # I happen to use a plain textfile rather than a yaml file.
184
+ # ===================================================================== #
185
+ end
186
+ end
187
+
188
+ # ========================================================================= #
189
+ # === menu (menu tag)
190
+ # ========================================================================= #
191
+ def menu(i = commandline_arguments?)
192
+ if i.is_a? Array
193
+ # ===================================================================== #
194
+ # === Must handle input such as "play foo"
195
+ # ===================================================================== #
196
+ if i.last =~ /^\d+$/
197
+ i = [i.join(' ')]
198
+ end
199
+ i.each {|entry| menu(entry) }
200
+ else
201
+ case i.delete('-').downcase # case tag
202
+ # ===================================================================== #
203
+ # === eurodance --download
204
+ # ===================================================================== #
205
+ when /^-?-?download$/,
206
+ '--dl',
207
+ 'dl'
208
+ download_remote_files
209
+ exit
210
+ # ===================================================================== #
211
+ # === eurodance --generate-homepage
212
+ #
213
+ # This entry point can be used to generate a small "webpage"
214
+ # with content of the playlist at hand.
215
+ #
216
+ # Invocation example:
217
+ #
218
+ # trance --html
219
+ #
220
+ # ===================================================================== #
221
+ when /^-?-?generate(_|-)?homepage$/i,
222
+ 'genhomepage',
223
+ 'homepage',
224
+ 'web',
225
+ /^-?-?webpage$/i,
226
+ /^-?-?html$/i
227
+ generate_homepage
228
+ exit
229
+ # ===================================================================== #
230
+ # === trance play 17
231
+ #
232
+ # This entry point allows us to open a specific file at a position
233
+ # and "play" it, e. g. in the browser.
234
+ #
235
+ # Example for this:
236
+ #
237
+ # trance play 3
238
+ #
239
+ # ===================================================================== #
240
+ when /^play (\d+)/,
241
+ /^open (\d+)/
242
+ require 'open'
243
+ url = obtain_url_from_entry_at_this_position($1.to_s.dup)
244
+ open_in_browser(url)
245
+ exit
246
+ # ===================================================================== #
247
+ # === eurodance --playlist
248
+ # ===================================================================== #
249
+ when '--playlist',
250
+ 'playlist',
251
+ '--generate_playlist',
252
+ '--generateplaylist',
253
+ '--generate-playlist',
254
+ 'generateplaylist',
255
+ 'm3u',
256
+ '--m3u'
257
+ generate_m3u_playlist # trance --generate-playlist
258
+ exit
259
+ # ===================================================================== #
260
+ # === eurodance --only-URLs
261
+ # ===================================================================== #
262
+ when /^-?-?show(_|-)?only(_|-)?the(_|-)?URLs$/i,
263
+ /^-?-?only(_|-)?URLs$/i,
264
+ /^-?-?URLs?$/i # === eurodance --url
265
+ show_only_the_URLs
266
+ exit
267
+ # ===================================================================== #
268
+ # === eurodance --only_names
269
+ # ===================================================================== #
270
+ when /^-?-?only(_|-)?names$/i
271
+ show_only_names
272
+ exit
273
+ # ===================================================================== #
274
+ # === eurodance --file?
275
+ # ===================================================================== #
276
+ when /^-?-?file\??/
277
+ show_the_location_of_the_yaml_file
278
+ exit
279
+ # ===================================================================== #
280
+ # === eurodance --help
281
+ # ===================================================================== #
282
+ when '--help','help','?'
283
+ show_help(:then_exit)
284
+ # ===================================================================== #
285
+ # === eurodance --open
286
+ # ===================================================================== #
287
+ when 'open','OPEN','--open','op','o'
288
+ open_playlist_in_your_editor
289
+ exit
290
+ # ===================================================================== #
291
+ # === trance --reverse-years
292
+ # ===================================================================== #
293
+ when '--reverse-years','reverseyears','--sort-by-years-reverse',
294
+ 'sortbyyearsreverse'
295
+ sort_playlist_via_years(:reverse)
296
+ do_the_default_action
297
+ # ===================================================================== #
298
+ # === trance --years
299
+ # ===================================================================== #
300
+ when '--year','--years','--sort','--sort-via-year','--sort-by-years',
301
+ 'sortbyyears','years','year','sort','sortviayear'
302
+ sort_playlist_via_years
303
+ do_the_default_action
304
+ # ===================================================================== #
305
+ # === eurodance --overview
306
+ # ===================================================================== #
307
+ when '--overview','overview'
308
+ show_available_songs(:then_exit)
309
+ # ===================================================================== #
310
+ # === eurodance 62
311
+ # ===================================================================== #
312
+ when /^(\d+)$/
313
+ download_file_at_number($1.to_s.dup)
314
+ else
315
+ default_action
316
+ end
317
+ end
318
+ end
319
+
320
+ # ========================================================================= #
321
+ # === do_the_default_action
322
+ #
323
+ # Presently, the default action is to show all available songs.
324
+ # ========================================================================= #
325
+ def do_the_default_action
326
+ show_available_songs(:then_exit)
327
+ end; alias default_action do_the_default_action # === default_action
328
+
329
+ # ========================================================================= #
330
+ # === show_available_songs
331
+ # ========================================================================= #
332
+ def show_available_songs(
333
+ use_this_dataset = @dataset,
334
+ shall_we_exit = :then_exit
335
+ )
336
+ if use_this_dataset == :then_exit
337
+ use_this_dataset = @dataset
338
+ shall_we_exit = :then_exit
339
+ end
340
+ case shall_we_exit
341
+ when :then_exit
342
+ shall_we_exit = true
343
+ end
344
+ # ======================================================================= #
345
+ # Work with a pointer variable.
346
+ # ======================================================================= #
347
+ _ = use_this_dataset # We assume that this will always be a Hash.
348
+ n_entries = _.keys.size
349
+ opnn; e simp(n_entries.to_s)+' entries were registered in the yaml file.'
350
+ e
351
+ _.each_pair.with_index {|inner_hash, index|
352
+ key, _array = *inner_hash
353
+ url = _array[1]
354
+ index += 1
355
+ group_name = _array[0]
356
+ release_year = _array[2].to_s
357
+ group_and_release_year = ' ('+group_name+', '+release_year+')'
358
+ e slateblue(index.to_s.rjust(3)+') ')+simp(key)+dodgerblue(group_and_release_year)
359
+ # ===================================================================== #
360
+ # Next line displays the URL
361
+ # ===================================================================== #
362
+ left_pad = 7
363
+ e powderblue((' ' * left_pad)+url) # Left-padded URL.
364
+ }; e
365
+ exit if shall_we_exit
366
+ end
367
+
368
+ # ========================================================================= #
369
+ # === sort_playlist_via_years
370
+ #
371
+ # This method sorts the playlist via the years. We can work on the
372
+ # @dataset variable for this to work.
373
+ #
374
+ # You can try this method like this:
375
+ # trance --sort-by-years
376
+ # ========================================================================= #
377
+ def sort_playlist_via_years(
378
+ sort_mode_to_use = :normal
379
+ )
380
+ if sort_mode_to_use == :normal
381
+ _ = @dataset.sort_by {|key, array|
382
+ value = array[2]
383
+ value = 0 if value.nil? # "Rescue".
384
+ value
385
+ }
386
+ else
387
+ _ = @dataset.sort_by {|key, array|
388
+ -array[2]
389
+ }
390
+ end
391
+ @dataset = Hash[_]
392
+ end
393
+
394
+ # ========================================================================= #
395
+ # === show_only_names
396
+ #
397
+ # To invoke this, do:
398
+ #
399
+ # eurodance --onlynames
400
+ #
401
+ # ========================================================================= #
402
+ def show_only_names
403
+ @dataset.each_pair {|key, dataset|
404
+ e slateblue(key.to_s)
405
+ }
406
+ end
407
+
408
+ # ========================================================================= #
409
+ # === show_only_the_URLs
410
+ #
411
+ # To invoke this, do:
412
+ #
413
+ # eurodance --only-URLs
414
+ #
415
+ # ========================================================================= #
416
+ def show_only_the_URLs
417
+ @dataset.each_pair {|key, dataset|
418
+ url = dataset[1]
419
+ e slateblue(url.to_s)
420
+ }
421
+ end
422
+
423
+ # ========================================================================= #
424
+ # === generate_m3u_playlist
425
+ # ========================================================================= #
426
+ def generate_m3u_playlist
427
+ # ======================================================================= #
428
+ # We only need an Array of all URLs.
429
+ # ======================================================================= #
430
+ dataset = return_all_remote_urls
431
+ into = '/Depot/j/'+return_name_from_class_name
432
+ CreateM3uPlaylist.new(dataset, into)
433
+ end
434
+
435
+ # ========================================================================= #
436
+ # === dataset?
437
+ # ========================================================================= #
438
+ def dataset?
439
+ @dataset
440
+ end; alias full_dataset? dataset? # === full_dataset?
441
+
442
+ # ========================================================================= #
443
+ # === return_all_remote_urls
444
+ # ========================================================================= #
445
+ def return_all_remote_urls
446
+ dataset = @dataset
447
+ dataset = dataset.map {|key, inner_array|
448
+ inner_array[1] # This is the URL.
449
+ }
450
+ return dataset
451
+ end
452
+
453
+ # ========================================================================= #
454
+ # === return_dataset_from_one_random_song
455
+ #
456
+ # This is sort of a debug-method. What we do here is that we will
457
+ # randomly return one element from the main dataset.
458
+ # ========================================================================= #
459
+ def return_dataset_from_one_random_song
460
+ return dataset?.to_a.sample(1).to_h
461
+ end
462
+
463
+ # ========================================================================= #
464
+ # === rename_this_file
465
+ #
466
+ # This will rename the file and sanitize it, then return the new file
467
+ # name.
468
+ # ========================================================================= #
469
+ def rename_this_file(i)
470
+ old_filename = i.to_s.dup
471
+ new_filename = old_filename.delete('(').delete(')').
472
+ gsub(/ - /,'-').tr(' ','_').delete('!')
473
+ mv(old_filename, new_filename)
474
+ return new_filename
475
+ end
476
+
477
+ # ========================================================================= #
478
+ # === download_remote_files
479
+ #
480
+ # Use this method when you want to download the remote files.
481
+ #
482
+ # The input to this method should be a Hash.
483
+ #
484
+ # Invocation example:
485
+ #
486
+ # eurodance --download
487
+ #
488
+ # ========================================================================= #
489
+ def download_remote_files(this_dataset = full_dataset?)
490
+ ::MultimediaParadise.ensure_that_the_output_directory_exists
491
+ store_here = ::MultimediaParadise.output_directory?+return_name_from_class_name+'/'
492
+ mkdir(store_here)
493
+ cd(store_here)
494
+ this_dataset.each_pair {|name_of_the_song, array|
495
+ url = array[1]
496
+ dataset = { name_of_the_song => array }
497
+ _ = dataset
498
+ key = _.keys.first
499
+ name_of_the_group = _[key][0]
500
+ opnn; e
501
+ e ' Now downloading the song '+dodgerblue(name_of_the_song)+
502
+ ' (Group: '+simp(name_of_the_group)+') from the URL '+sfancy(url)
503
+ name_of_the_song = key.to_s.delete('!')
504
+ url = _[key][1]
505
+ release_year = _[key][2].to_s # Need a String.
506
+ # ======================================================================= #
507
+ # Next, we will use youtube-dl to download this.
508
+ # ======================================================================= #
509
+ result = `youtube-dl #{url}`
510
+ use_this_regex = /Merging formats into "(.+)"/
511
+ result.scan(use_this_regex)
512
+ e 'Working on the song '+simp(name_of_the_song)+' next.'
513
+ new_file_name = $1.to_s.dup
514
+ # ======================================================================= #
515
+ # The filename has to be sanitized and renamed.
516
+ # ======================================================================= #
517
+ new_file_name = rename_this_file(new_file_name)
518
+ # ======================================================================= #
519
+ # Ok, the file is already a bit sanitized, but we wish to make it even
520
+ # nicer. So, we rename it based on 1) the name of the group, 2) the
521
+ # name of the song and 3) the release year.
522
+ # ======================================================================= #
523
+ extension_name = File.extname(new_file_name)
524
+ _ = name_of_the_group.tr(' ','_')+'-'+name_of_the_song.tr(' ','_')+
525
+ '_Year_'+release_year+extension_name
526
+ mv(new_file_name, _)
527
+ opnn; e 'The file name now is `'+sfile(_)+'`, in the '\
528
+ 'directory `'+sdir(store_here)+'`.'
529
+ }
530
+ end; alias download_remote_file download_remote_files # === download_remote_file
531
+
532
+ # ========================================================================= #
533
+ # === download_file_at_number
534
+ #
535
+ # Invocation example:
536
+ # eurodance 62
537
+ # ========================================================================= #
538
+ def download_file_at_number(i)
539
+ i = i.to_i
540
+ _ = full_dataset?
541
+ hash = {}
542
+ _.each_pair.with_index {|data, index|
543
+ if index == (i-1)
544
+ data = Hash[*data]
545
+ hash.update(data)
546
+ end
547
+ }
548
+ download_remote_file(hash)
549
+ end
550
+
551
+ # ========================================================================= #
552
+ # === return_name_from_class_name
553
+ # ========================================================================= #
554
+ def return_name_from_class_name(i = @namespace)
555
+ _ = @namespace.to_s.downcase
556
+ _ = _.split(':').last if _.include? ':'
557
+ return _
558
+ end
559
+
560
+ # ========================================================================= #
561
+ # === obtain_url_from_entry_at_this_position
562
+ #
563
+ # We obtain (and return) the remote URL from this entry.
564
+ # ========================================================================= #
565
+ def obtain_url_from_entry_at_this_position(i)
566
+ # ======================================================================= #
567
+ # Input must be an Integer. We also must deduct -1 because Ruby Array
568
+ # start to count at 0.
569
+ # ======================================================================= #
570
+ i = i.to_i - 1
571
+ _ = full_dataset?
572
+ keys = _.keys
573
+ url = _[keys[i]][1]
574
+ return url
575
+ end
576
+
577
+ # ========================================================================= #
578
+ # === show_help (help tag)
579
+ #
580
+ # To invoke this, try:
581
+ #
582
+ # eurodance --help
583
+ #
584
+ # ========================================================================= #
585
+ def show_help(
586
+ shall_we_exit = true,
587
+ show_opn = false
588
+ )
589
+ if shall_we_exit == :then_exit
590
+ shall_we_exit = true
591
+ end
592
+ e
593
+ opnn if show_opn; e ' --download # to download all '+name_of_the_genre?+
594
+ ' songs locally'
595
+ opnn if show_opn; e ' --generate-homepage # to generate a homepage'
596
+ opnn if show_opn; e ' --m3u # to generate a .m3u playlist (a file)'
597
+ opnn if show_opn; e ' --open # to open the respective playlist in your editor'
598
+ opnn if show_opn; e ' --overview # to show which entries are registered'
599
+ opnn if show_opn; e ' --years # to sort via years (most recent year will come last)'
600
+ opnn if show_opn; e ' --file? # to show where the yaml file is stored'
601
+ opnn if show_opn; e ' --reverse-years # to sort via years in a reverse manner '\
602
+ '(most recent year will come first)'
603
+ opnn if show_opn; e ' play 17 # open the track at position 17 in the browser'
604
+ opnn if show_opn; e ' # so that you can play it'
605
+ e
606
+ exit if shall_we_exit
607
+ end
608
+
609
+ # ========================================================================= #
610
+ # === guess_the_title_based_on_the_yaml_file
611
+ #
612
+ # This method will try to guess the filename. It may use strings such as:
613
+ #
614
+ # "/home/Programs/Ruby/2.7.2/lib/ruby/site_ruby/2.7.0/multimedia_paradise/yaml/genres/trance.yml"
615
+ #
616
+ # ========================================================================= #
617
+ def guess_the_title_based_on_the_yaml_file
618
+ File.basename(@yaml_file).sub(/\.yml$/,'')
619
+ end
620
+
621
+ # ========================================================================= #
622
+ # === name_of_the_genre?
623
+ #
624
+ # This method will return the genre in use.
625
+ # ========================================================================= #
626
+ def name_of_the_genre?
627
+ _ = self.class.name.to_s
628
+ _ = _.split(':').last if _.include? ':'
629
+ return _.gsub(/The/,'')
630
+ end
631
+
632
+ # ========================================================================= #
633
+ # === opnn
634
+ # ========================================================================= #
635
+ def opnn(i = NAMESPACE)
636
+ super(i)
637
+ end
638
+
639
+ # ========================================================================= #
640
+ # === generate_homepage
641
+ #
642
+ # This will generate a webpage/homepage, by using the links from
643
+ # the genre.
644
+ #
645
+ # Invocation example:
646
+ #
647
+ # eurodance --homepage
648
+ #
649
+ # ========================================================================= #
650
+ def generate_homepage
651
+ _ = '<html><body>'.dup # This will be the return string.
652
+ _ << '<title>'+guess_the_title_based_on_the_yaml_file+
653
+ ' ('+@dataset.keys.size.to_s+' entries)</title>'
654
+ index = 0
655
+ dataset?.each_pair {|name_of_the_song, array|
656
+ index += 1
657
+ name_of_the_group = array.first
658
+ remote_URL = array[1]
659
+ _ << HtmlTags.a(remote_URL,
660
+ description: '('+index.to_s+') '+
661
+ name_of_the_song+' - '+
662
+ name_of_the_group
663
+ )
664
+ _ << "<br>\n"
665
+ }
666
+ _ << '</body></html>'
667
+ # ======================================================================= #
668
+ # We determine into which file we will generate. Since as of October
669
+ # 2020 we will use the general log-directory for the
670
+ # MultimediaParadise project for this.
671
+ # ======================================================================= #
672
+ into = self.class.inspect.to_s.split(':').last.downcase
673
+ into = log_dir?+into+'.html'
674
+ opnn; e "Now storing into the file `#{sfile(into)}`."
675
+ write_what_into(_, into)
676
+ end
677
+
678
+ # ========================================================================= #
679
+ # === run (run tag)
680
+ # ========================================================================= #
681
+ def run
682
+ menu
683
+ end
684
+
685
+ # ========================================================================= #
686
+ # === MultimediaParadise::Genre[]
687
+ # ========================================================================= #
688
+ def self.[](i = '')
689
+ new(i)
690
+ end
691
+
692
+ end; end
693
+
694
+ if __FILE__ == $PROGRAM_NAME
695
+ MultimediaParadise::Genre.new(ARGV)
696
+ end # genre