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,698 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # require 'multimedia_paradise/gui/gtk3/radio/radio.rb'
6
+ # ::MultimediaParadise::GUI::Gtk::Radio.new(ARGV)
7
+ # =========================================================================== #
8
+ require 'gtk_paradise/require_gtk3'
9
+
10
+ module MultimediaParadise
11
+
12
+ module GUI
13
+
14
+ module Gtk
15
+
16
+ class Radio < ::Gtk::Box # === MultimediaParadise::GUI::Gtk::Radio
17
+
18
+ require 'gtk_paradise/requires/require_the_base_module.rb'
19
+ include ::Gtk::BaseModule
20
+
21
+ require 'gtk_paradise/widgets/gtk3/maximize_button/maximize_button.rb'
22
+ require 'gtk_paradise/widgets/gtk3/mini_clock/mini_clock.rb'
23
+ require 'multimedia_paradise/project/project.rb'
24
+ require 'multimedia_paradise/constants/file_constants.rb'
25
+ require 'multimedia_paradise/version/version.rb'
26
+ require 'multimedia_paradise/toplevel_methods/is_on_roebe.rb'
27
+ require 'multimedia_paradise/toplevel_methods/radio.rb'
28
+ require 'multimedia_paradise/gui/gtk3/widget_increase_or_decrease_audio/widget_increase_or_decrease_audio.rb'
29
+ require 'multimedia_paradise/gui/gtk3/radio/misc.rb'
30
+
31
+ # ========================================================================= #
32
+ # === TITLE
33
+ # ========================================================================= #
34
+ TITLE = 'Play from a radio station'
35
+
36
+ # ========================================================================= #
37
+ # === MultimediaParadise::GUI::Gtk::Radio.title?
38
+ # ========================================================================= #
39
+ def self.title?
40
+ TITLE
41
+ end
42
+
43
+ # ========================================================================= #
44
+ # === HOMEPAGE_OF_THIS_PROJECT
45
+ # ========================================================================= #
46
+ HOMEPAGE_OF_THIS_PROJECT = 'https://rubygems.org/gems/multimedia_paradise'
47
+
48
+ # ========================================================================= #
49
+ # === WIDTH
50
+ # ========================================================================= #
51
+ WIDTH = '84% or minimum 1720px'
52
+
53
+ # ========================================================================= #
54
+ # === HEIGHT
55
+ # ========================================================================= #
56
+ HEIGHT = '88% or minimum 1540px'
57
+
58
+ # ========================================================================= #
59
+ # === DEFAULT_STREAM
60
+ # ========================================================================= #
61
+ DEFAULT_STREAM = 'https://orf-live.ors-shoutcast.at/oe3-q2a.m3u'
62
+
63
+ # ========================================================================= #
64
+ # === FONT_FAMILY_TO_USE
65
+ # ========================================================================= #
66
+ FONT_FAMILY_TO_USE = 'DejaVu Sans Mono'
67
+
68
+ # ========================================================================= #
69
+ # === FONT_SIZE
70
+ # ========================================================================= #
71
+ FONT_SIZE = '20'
72
+
73
+ # ========================================================================= #
74
+ # === SMALLER_FONT_SIZE
75
+ # ========================================================================= #
76
+ SMALLER_FONT_SIZE = '16'
77
+
78
+ # ========================================================================= #
79
+ # === initialize
80
+ # ========================================================================= #
81
+ def initialize(
82
+ commandline_arguments = ARGV,
83
+ run_already = true
84
+ )
85
+ super(:vertical, 2)
86
+ reset
87
+ set_commandline_arguments(
88
+ commandline_arguments
89
+ )
90
+ if commandline_arguments
91
+ set_parent(
92
+ commandline_arguments.first
93
+ )
94
+ end
95
+ run if run_already
96
+ end
97
+
98
+ # ========================================================================= #
99
+ # === reset (reset tag)
100
+ # ========================================================================= #
101
+ def reset
102
+ infer_the_namespace
103
+ reset_the_internal_variables
104
+ # ======================================================================= #
105
+ # === @configuration
106
+ # ======================================================================= #
107
+ @configuration = [true, __dir__, namespace?]
108
+ # ======================================================================= #
109
+ # === Set the title, width, height and the font in use.
110
+ # ======================================================================= #
111
+ title_width_height_font(TITLE, WIDTH, HEIGHT, "#{FONT_FAMILY_TO_USE} #{FONT_SIZE}")
112
+ handle_CSS
113
+ infer_the_size_automatically
114
+ # ======================================================================= #
115
+ # === @capture_the_stream
116
+ #
117
+ # By default we will NOT capture the audio stream. On roebe-systems
118
+ # we will, though.
119
+ # ======================================================================= #
120
+ if ::MultimediaParadise.is_on_roebe?
121
+ @capture_the_stream = true
122
+ else # else for other users, this is the default
123
+ @capture_the_stream = false
124
+ end
125
+ # ======================================================================= #
126
+ # === @pid
127
+ #
128
+ # The PID will be stored in this variable.
129
+ # ======================================================================= #
130
+ @pid = nil
131
+ # ======================================================================= #
132
+ # === @use_this_player_for_capturing_the_audio_stream
133
+ #
134
+ # This variable specifies which audio-player is used for capturing
135
+ # the remote stream.
136
+ # ======================================================================= #
137
+ @use_this_player_for_capturing_the_audio_stream = :mpv # :mplayer
138
+ # ======================================================================= #
139
+ # === @use_this_colour_for_the_tooltip_url
140
+ #
141
+ # Denote the colour for the tooltip URL.
142
+ # ======================================================================= #
143
+ @use_this_colour_for_the_tooltip_url = :steelblue
144
+ # ======================================================================= #
145
+ # === @this_button_is_now_playing
146
+ # ======================================================================= #
147
+ @this_button_is_now_playing = nil
148
+ end
149
+
150
+ # ========================================================================= #
151
+ # === padding?
152
+ # ========================================================================= #
153
+ def padding?
154
+ 4
155
+ end
156
+
157
+ # ========================================================================= #
158
+ # === border_size?
159
+ # ========================================================================= #
160
+ def border_size?
161
+ 2
162
+ end
163
+
164
+ # ========================================================================= #
165
+ # === do_debug_this_widget
166
+ # ========================================================================= #
167
+ def do_debug_this_widget
168
+ e 'Currently this functionality is not implemented '\
169
+ '(January 2021) - somehow class Gtk::DebugWidget'
170
+ e 'has to be improved be found ...'
171
+ # ::Gtk::DebugWidget.new
172
+ end
173
+
174
+ # ========================================================================= #
175
+ # === return_the_main_entry_for_the_streams
176
+ # ========================================================================= #
177
+ def return_the_main_entry_for_the_streams
178
+ @entry_stream = gtk_entry
179
+ @entry_stream.width_height(920, 44)
180
+ @entry_stream.center
181
+ @entry_stream.set_text(DEFAULT_STREAM)
182
+ @entry_stream.pad2px
183
+ @entry_stream.yellow_background
184
+ @entry_stream.bblack1
185
+ @entry_stream.set_font(smaller_font?)
186
+ @entry_stream.hint = 'Input the main URL here for the radio '\
187
+ 'stream in use. Alternatively click on one of the buttons '\
188
+ 'above; the current remote URL in use will then be shown '\
189
+ 'in the entry above.'
190
+ @entry_stream.on_enter {
191
+ do_all_actions_associated_when_an_actionable_radio_button_was_clicked
192
+ }
193
+ return @entry_stream
194
+ end
195
+
196
+ # ========================================================================= #
197
+ # === create_the_grid
198
+ # ========================================================================= #
199
+ def create_the_grid
200
+ @grid = gtk_grid
201
+ @grid.set_column_spacing(4)
202
+ @grid.set_row_spacing(4)
203
+ @grid.pad2px
204
+ end
205
+
206
+ # ========================================================================= #
207
+ # === populate_the_grid
208
+ # ========================================================================= #
209
+ def populate_the_grid
210
+ @grid.reset_the_counter
211
+ @grid.left(return_the_label_where_the_stream_is_saved_locally)
212
+ @grid.right(return_the_entry_where_the_stream_is_saved_locally)
213
+ @grid.new_row
214
+ @grid.left(return_the_label_containing_the_main_entry_for_the_streams)
215
+ @grid.right(return_the_main_entry_for_the_streams)
216
+ end
217
+
218
+ # ========================================================================= #
219
+ # === create_skeleton (create tag, skeleton tag)
220
+ # ========================================================================= #
221
+ def create_skeleton
222
+ create_the_stop_playback_button
223
+ create_the_menu
224
+ create_the_top_bar # Must come after create_the_menu().
225
+ create_labels
226
+ create_the_entries
227
+ create_the_grid
228
+ create_status_icon
229
+ create_statusbar
230
+ end
231
+
232
+ # ========================================================================= #
233
+ # === reset_all_gtk_labels
234
+ # ========================================================================= #
235
+ def reset_all_gtk_labels
236
+ @label_displaying_the_radio_station.clear
237
+ end
238
+
239
+ # ========================================================================= #
240
+ # === create_statusbar
241
+ # ========================================================================= #
242
+ def create_statusbar
243
+ @status_bar = gtk_status_bar
244
+ end
245
+
246
+ # ========================================================================= #
247
+ # === create_status_icon
248
+ # ========================================================================= #
249
+ def create_status_icon(
250
+ i = FILE_RADIO_IMAGE
251
+ )
252
+ @status_icon = gtk_status_icon(i)
253
+ @status_icon.hint = ' <b>Play</b> from radio station '
254
+ end
255
+
256
+ # ========================================================================= #
257
+ # === maximize_button?
258
+ # ========================================================================= #
259
+ def maximize_button?
260
+ @maximize_button
261
+ end
262
+
263
+ # ========================================================================= #
264
+ # === this_button_is_now_playing
265
+ # ========================================================================= #
266
+ def this_button_is_now_playing(button)
267
+ @this_button_is_now_playing = button
268
+ end
269
+
270
+ # ========================================================================= #
271
+ # === check_for_the_title_after_a_brief_delay
272
+ # ========================================================================= #
273
+ def check_for_the_title_after_a_brief_delay(
274
+ button = @this_button_is_now_playing,
275
+ delay_to_use = 2200
276
+ )
277
+ GLib::Timeout.add(delay_to_use) {
278
+ this_radio_station = button.label.to_s.strip
279
+ if this_radio_station =~ /^\d{1,2}$/
280
+ # =================================================================== #
281
+ # In this case we have to change the title. We need to access the
282
+ # elements 0,2,4,6 and so forth, and disregard the other entries.
283
+ # So, entry number 1 becomes 0, entry number 2 becomes 2, entry
284
+ # number 3 becomes 4, entry number 4 becomes 6, and so forth.
285
+ # The formula is thus: 2 * (n-1)
286
+ # =================================================================== #
287
+ this_radio_station = 2 * (this_radio_station.to_i - 1)
288
+ this_radio_station = @array_buttons[this_radio_station].label.to_s
289
+ end
290
+ _ = "Now playing from this radio station: "\
291
+ "#{this_radio_station}".dup
292
+ if MultimediaParadise.title_of_the_audio_file?
293
+ _ << "\nThe title is: #{MultimediaParadise.title_of_the_audio_file?}"
294
+ end
295
+ # ===================================================================== #
296
+ # Finally, propagate our findings to the correct gtk-label in use:
297
+ # ===================================================================== #
298
+ @label_displaying_the_radio_station.set_text(_)
299
+ @label_displaying_the_radio_station.make_bold
300
+ @label_displaying_the_radio_station.make_selectable
301
+ false
302
+ }
303
+ end
304
+
305
+ # ========================================================================= #
306
+ # === do_all_actions_associated_when_an_actionable_radio_button_was_clicked (clicked tag)
307
+ #
308
+ # This method bundles together all actions associated with the main
309
+ # button-click event. It will play the remote URL stream upon
310
+ # a button-click event.
311
+ # ========================================================================= #
312
+ def do_all_actions_associated_when_an_actionable_radio_button_was_clicked(
313
+ use_this_remote_URL = @entry_stream.text?,
314
+ capture_into_this_file = :pwd_or_user_supplied_value,
315
+ button = nil
316
+ )
317
+ do_all_the_actions_associated_when_the_button_stop_playback_was_clicked
318
+ case capture_into_this_file
319
+ # ======================================================================= #
320
+ # === :pwd_or_user_supplied_value
321
+ # ======================================================================= #
322
+ when :pwd_or_user_supplied_value,
323
+ :default,
324
+ :default_capture_stream
325
+ capture_into_this_file = return_capture_into_the_default_file
326
+ _ = save_the_stream_into_which_file?
327
+ if _ and !_.empty?
328
+ capture_into_this_file = _.dup
329
+ end
330
+ # ======================================================================= #
331
+ # === :pwd
332
+ # ======================================================================= #
333
+ when :pwd
334
+ capture_into_this_file = return_capture_into_the_default_file
335
+ end
336
+ # ======================================================================= #
337
+ # Next, make the stop-playback button clickable again.
338
+ # ======================================================================= #
339
+ make_the_stop_playback_button_clickable_again
340
+ e
341
+ e
342
+ e "#{::Colours.rev}The remote URL is:"
343
+ e
344
+ e ::Colours.steelblue(" #{use_this_remote_URL}")
345
+ e
346
+ # ======================================================================= #
347
+ # The next line of code changes the gtk-entry where the user stores
348
+ # the .mp3 file, but since as of 30.09.2020 the user is able to
349
+ # control it. Only if it is empty will a sane default value be
350
+ # used.
351
+ # ======================================================================= #
352
+ if @entry_save_into_this_file.empty?
353
+ @entry_save_into_this_file.set_text(capture_into_this_file)
354
+ end
355
+ check_for_the_title_after_a_brief_delay(button) if button
356
+ set_url_to_use(use_this_remote_URL)
357
+ set_status_bar_message(use_this_remote_URL)
358
+ if button
359
+ this_button_is_now_playing(button)
360
+ _ = "Radio station: #{button.label}".dup
361
+ if MultimediaParadise.title_of_the_audio_file? and
362
+ !MultimediaParadise.title_of_the_audio_file?.empty?
363
+ _ << "\nTitle is: #{MultimediaParadise.title_of_the_audio_file?}"
364
+ end
365
+ @label_displaying_the_radio_station.set_text(_)
366
+ @label_displaying_the_radio_station.make_bold
367
+ @label_displaying_the_radio_station.center
368
+ end
369
+ do_play_from_this_stream(use_this_remote_URL, capture_into_this_file)
370
+ # The next line was disabled as of May 2022:
371
+ # do_grey_out_all_buttons_except_for_the_stop_playback_button
372
+ end
373
+
374
+ # ========================================================================= #
375
+ # === do_play_from_this_stream
376
+ # ========================================================================= #
377
+ def do_play_from_this_stream(
378
+ i = @entry_stream.text?,
379
+ capture_into_this_file = nil
380
+ )
381
+ # ======================================================================= #
382
+ # Build up the command we wish to use next.
383
+ # ======================================================================= #
384
+ use_this_command = "mpv #{i}".dup
385
+ if capture_into_this_file
386
+ use_this_command << ' --stream-record="'+capture_into_this_file+'"'
387
+ end
388
+ e ::Colours.steelblue(use_this_command)
389
+ # @pid = spawn(use_this_command)
390
+ io_object = IO.popen(use_this_command, 'r+')
391
+ @pid = io_object.pid
392
+ if is_on_roebe?
393
+ e 'The PID is: '+::Colours.steelblue(@pid)
394
+ end
395
+ Thread.new {
396
+ # Process.wait(@pid)
397
+ io_object.each { |line|
398
+ if line.start_with? ' icy-title: '
399
+ ::MultimediaParadise.register_title_of_this_audio_file(line)
400
+ end
401
+ e line
402
+ }
403
+ io_object.close
404
+ }
405
+ end
406
+
407
+ # ========================================================================= #
408
+ # === remote_radio_stations?
409
+ # ========================================================================= #
410
+ def remote_radio_stations?
411
+ dataset = YAML.load_file(
412
+ MultimediaParadise.file_radio_stations
413
+ )
414
+ # ======================================================================= #
415
+ # The entries will look like this:
416
+ #
417
+ # "Radio Wien"=>
418
+ #
419
+ # {"url"=>"http://mp3stream2.apasf.apa.at:8000/listen.pls",
420
+ # "homepage"=>"https://wien.orf.at/player",
421
+ # "genre"=>"austrian",
422
+ # "country"=>"Austria"},
423
+ #
424
+ # ======================================================================= #
425
+ return dataset
426
+ end
427
+
428
+ # ========================================================================= #
429
+ # === create_the_entries (entries tag)
430
+ # ========================================================================= #
431
+ def create_the_entries
432
+ # ======================================================================= #
433
+ # === @entry_status_bar
434
+ # ======================================================================= #
435
+ @entry_status_bar = gtk_entry
436
+ @entry_status_bar.on_click_event { :select_everything }
437
+ @entry_status_bar.make_bold
438
+ @entry_status_bar.center
439
+ @entry_status_bar.bblack1
440
+ @entry_status_bar.pad8px
441
+ @entry_status_bar.css_class('BG_lightblue')
442
+ @entry_status_bar.hint =
443
+ 'This entry will show the URL to the remote stream, if one is '\
444
+ 'playing currently, so that the user can quickly copy/paste '\
445
+ 'this URL.'
446
+ end
447
+
448
+ # ========================================================================= #
449
+ # === return_the_widget_increase_or_decrease_audio
450
+ # ========================================================================= #
451
+ def return_the_widget_increase_or_decrease_audio
452
+ ::MultimediaParadise::GUI::Gtk::WidgetIncreaseOrDecreaseAudio.new
453
+ end; alias increase_decrease_volume return_the_widget_increase_or_decrease_audio # === increase_decrease_volume
454
+
455
+ # ========================================================================= #
456
+ # === create_the_menu (menu tag)
457
+ #
458
+ # This is the toplevel menubar, captured onto @menu_bar.
459
+ # ========================================================================= #
460
+ def create_the_menu
461
+ @menu_bar = gtk_menu_bar
462
+ filemenu = gtk_menu
463
+ # ======================================================================= #
464
+ # === 1) First menu drop-down interface
465
+ # ======================================================================= #
466
+ filem1 = gtk_menu_item('File') {{ submenu: filemenu }}
467
+ # ======================================================================= #
468
+ # === Add the 'Reset the Widget' entry next:
469
+ # ======================================================================= #
470
+ reset_the_widget = gtk_menu_item('Reset the widget')
471
+ reset_the_widget.fancy_tooltips = '<b>Clicking</b> on this item will '\
472
+ '<b>reset</b> the main widget to its initial state, as if you would '\
473
+ 'have just started this application.'
474
+ reset_the_widget.on_activate {
475
+ do_reset_the_widget
476
+ }
477
+ filemenu << reset_the_widget
478
+ filemenu.append_separator
479
+ # ======================================================================= #
480
+ # === Add the 'Exit' entry next:
481
+ # ======================================================================= #
482
+ exit = gtk_menu_item('Exit') { :on_activate_quit }
483
+ filemenu << exit
484
+ # ======================================================================= #
485
+ # === 2) Second menu drop-down interface
486
+ # ======================================================================= #
487
+ filemenu2 = gtk_menu
488
+ filem2 = gtk_menu_item('Capture the stream') {{ submenu: filemenu2 }}
489
+ # ======================================================================= #
490
+ # === Add the 'Shall the stream be captured' entry next:
491
+ # ======================================================================= #
492
+ capture_the_stream_yes = ::Gtk::RadioMenuItem.new(nil, 'Yes')
493
+ capture_the_stream_yes.on_activate { @capture_the_stream = true }
494
+ capture_the_stream_no = ::Gtk::RadioMenuItem.new(capture_the_stream_yes, 'No')
495
+ capture_the_stream_no.on_activate { @capture_the_stream = false }
496
+ if is_on_roebe?
497
+ capture_the_stream_no.activate
498
+ end
499
+ filemenu2 << capture_the_stream_yes
500
+ filemenu2 << capture_the_stream_no
501
+ # ======================================================================= #
502
+ # === 3) The info widget
503
+ # ======================================================================= #
504
+ filemenu3 = gtk_menu
505
+ filem3 = gtk_menu_item('Info') {{ submenu: filemenu3 }}
506
+ # ======================================================================= #
507
+ # === Add the 'Show all URLs' entry next:
508
+ # ======================================================================= #
509
+ show_all_URLs = gtk_menu_item('Show all URLs to the radio station')
510
+ show_all_URLs.on_activate {
511
+ do_show_all_URLs
512
+ }
513
+ filemenu3 << show_all_URLs
514
+ # ======================================================================= #
515
+ # === Add the 'Show more info about this widget' entry next:
516
+ # ======================================================================= #
517
+ show_more_info = gtk_menu_item('Show more info about this widget')
518
+ show_more_info.on_activate { do_show_more_info_about_this_widget }
519
+ filemenu3 << show_more_info
520
+ # ======================================================================= #
521
+ # === Add the 'Debug' widget next:
522
+ # ======================================================================= #
523
+ show_more_info = gtk_menu_item('Debug this widget')
524
+ show_more_info.on_activate { do_debug_this_widget }
525
+ filemenu3 << show_more_info
526
+ # ======================================================================= #
527
+ # Next, add the file-menu parts to the menu bar.
528
+ # ======================================================================= #
529
+ @menu_bar.add_these(
530
+ filem1, gtk_separator_menu_item,
531
+ filem2, gtk_separator_menu_item,
532
+ filem3, gtk_separator_menu_item
533
+ )
534
+ return @menu_bar # We will return it here as well, just in case.
535
+ end
536
+
537
+ # ========================================================================= #
538
+ # === main_window?
539
+ #
540
+ # This method must yield the parent Gtk::Window.
541
+ # ========================================================================= #
542
+ def main_window?
543
+ @parent
544
+ end
545
+
546
+ # ========================================================================= #
547
+ # === return_middle_part
548
+ #
549
+ # This method will obtain and create the various radio-stations and
550
+ # assign a customized, clickable button to each such radio station.
551
+ # ========================================================================= #
552
+ def return_middle_part
553
+ vbox = create_vbox
554
+ index = 0
555
+ # ======================================================================= #
556
+ # Next, obtain all available radio stations, then add a button for
557
+ # each of these stations.
558
+ #
559
+ # The data structure may look like this:
560
+ #
561
+ # ["ORF Radio Wien", {"url"=>"http://185.85.29.149:8000/", "genre"=>"austrian"}]
562
+ #
563
+ # ======================================================================= #
564
+ remote_radio_stations?.each_pair {|this_radio_station, inner_hash| index += 1
565
+ outer_mini_hbox = create_hbox
566
+ url, _homepage, genre, country = inner_hash.values_at('url','homepage','genre','country')
567
+ padded_index = index.to_s.rjust(3, ' ')
568
+ # ===================================================================== #
569
+ # Next, the radio-image is added to the very left hand side. This
570
+ # is actually an event-box that the user can click. It will then
571
+ # open the remote URL to the homepage of this radio-station.
572
+ # ===================================================================== #
573
+ radio_image = gtk_image(::MultimediaParadise::FILE_RADIO_IMAGE)
574
+ event_box = gtk_event_box(radio_image)
575
+ # ===================================================================== #
576
+ # Use a tooltip:
577
+ # ===================================================================== #
578
+ event_box.hint =
579
+ 'Click on this to open the remote URL <span weight="bold" foreground="gold">'+url+'</span>.'
580
+ event_box.signal_connect(:event) { |widget, event|
581
+ _ = event.event_type.name
582
+ case _
583
+ when 'GDK_BUTTON_PRESS'
584
+ open_this_url_via_the_browser(url)
585
+ end
586
+ }
587
+ outer_mini_hbox.minimal(event_box)
588
+
589
+ index_button = gtk_button(padded_index)
590
+ index_button.make_bold
591
+ index_button.on_hover(:limegreen)
592
+ # ===================================================================== #
593
+ # === Small index button
594
+ #
595
+ # We also use a small index-button. The main idea here is to keep
596
+ # a small number for the radio station, so the user knows which
597
+ # entry is used.
598
+ # ===================================================================== #
599
+ index_button.on_clicked {
600
+ do_all_actions_associated_when_an_actionable_radio_button_was_clicked(
601
+ url, :default_capture_stream, index_button
602
+ )
603
+ }
604
+ outer_mini_hbox.minimal(index_button) # Add the index_button here.
605
+
606
+ button = bold_button(this_radio_station)
607
+ button.remove_background
608
+ button.lightgreen
609
+ # ===================================================================== #
610
+ # Next, add code so that the button for the radio-station can play
611
+ # from the remote audio stream.
612
+ # ===================================================================== #
613
+ button.on_clicked {
614
+ do_all_actions_associated_when_an_actionable_radio_button_was_clicked(
615
+ url, :default, button
616
+ )
617
+ }
618
+ # ======================================================================= #
619
+ # Add a tooltip next. This will have bold markup, in colour.
620
+ # ======================================================================= #
621
+ button.tooltip_markup = ""\
622
+ "<span weight=\"bold\">#{padded_index}</span> "\
623
+ "#{this_radio_station}\n\n → "\
624
+ "<span weight=\"bold\" foreground=\"#{@use_this_colour_for_the_tooltip_url}\">#{url}</span>"\
625
+ "\n"
626
+ # button.css_class('small_button')
627
+ outer_mini_hbox.maximal(button)
628
+ # ===================================================================== #
629
+ # Next we need to handle radio stations from different countries
630
+ # a bit differently. Also, we allow for genre-entries without a
631
+ # country tag to be handled here.
632
+ # ===================================================================== #
633
+ case genre
634
+ when 'Trance'
635
+ country = 'Trance'
636
+ end
637
+ case country
638
+ when 'Austria',
639
+ 'Germany',
640
+ 'UK',
641
+ 'France',
642
+ 'USA',
643
+ 'Trance' # This is not a country - see explanation above.
644
+ # =================================================================== #
645
+ # In this event show a cute little "banner" image.
646
+ # =================================================================== #
647
+ # =================================================================== #
648
+ # Pack the small austrian flag into that hbox:
649
+ # =================================================================== #
650
+ case country
651
+ when 'Trance'
652
+ flag_image = gtk_image(::MultimediaParadise.project_base_dir?+'images/trance.png')
653
+ when 'USA'
654
+ flag_image = gtk_image(::MultimediaParadise.project_base_dir?+'images/US_flag.png')
655
+ when 'France'
656
+ flag_image = gtk_image(::MultimediaParadise.project_base_dir?+'images/french_flag.png')
657
+ when 'UK'
658
+ flag_image = gtk_image(::MultimediaParadise.project_base_dir?+'images/UK_flag.png')
659
+ when 'Austria'
660
+ flag_image = gtk_image(::MultimediaParadise.project_base_dir?+'images/austrian_flag.png')
661
+ when 'Germany'
662
+ flag_image = gtk_image(::MultimediaParadise.project_base_dir?+'images/german_flag.png')
663
+ end
664
+ frame = gtk_frame(flag_image)
665
+ frame.modify_background :default, :lightgrey
666
+ outer_mini_hbox.minimal(frame, 0)
667
+ end
668
+ vbox.maximal(outer_mini_hbox, 1)
669
+ }
670
+ _ = scrolled_window(vbox) { :up_and_down }
671
+ _.width_height(500, 500)
672
+ _.bblack1
673
+ _.set_name('scrollbar3') # The name is #scrollbar3.
674
+ return _
675
+ end; alias return_widget_containing_the_buttons_for_all_streams return_middle_part # === return_widget_containing_the_buttons_for_all_streams
676
+
677
+ # ========================================================================= #
678
+ # === connect_skeleton (connect tag)
679
+ # ========================================================================= #
680
+ def connect_skeleton
681
+ abort_on_exception
682
+ populate_the_grid
683
+ middle_part = return_middle_part
684
+ lower_part = return_widget_containing_the_grid_and_the_various_entries
685
+
686
+ dragger1 = drag_via_up_and_down_movement(middle_part, lower_part)
687
+ dragger2 = drag_via_up_and_down_movement(dragger1, return_lower_part)
688
+ dragger2.position = '75%'
689
+ dragger2.set_border_width(3)
690
+ outer_dragger = drag_via_up_and_down_movement(@hbox_on_top, dragger2)
691
+ maximal(outer_dragger, 1)
692
+ end
693
+
694
+ end; end; end; end
695
+
696
+ if __FILE__ == $PROGRAM_NAME
697
+ MultimediaParadise::GUI::Gtk::Radio.run(ARGV)
698
+ end # gtkradio