multimedia_paradise 1.1.344 → 1.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (218) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +99 -77
  3. data/bin/audio_player +1 -1
  4. data/bin/extract_images_from_this_video_file +1 -1
  5. data/bin/loop_this_video +1 -1
  6. data/bin/merge_avi_files +1 -1
  7. data/bin/merge_mp3 +1 -1
  8. data/bin/mp3_to_opus +1 -1
  9. data/bin/mpg_to_mp4 +1 -1
  10. data/bin/multimedia_paradise +1 -1
  11. data/bin/to_aiff +2 -5
  12. data/bin/to_flac +7 -0
  13. data/bin/to_mp3 +8 -0
  14. data/bin/to_mp4 +1 -1
  15. data/bin/to_ogg +7 -0
  16. data/bin/verbose_analyse_this_mp3_file_for_id3_tags +1 -1
  17. data/bin/video_codec +1 -1
  18. data/bin/video_thumbnail +1 -1
  19. data/bin/video_to_images +1 -1
  20. data/doc/README.gen +88 -51
  21. data/doc/{CHANGELOG.md → changelog/changelog.md} +8 -6
  22. data/doc/{LINKS.md → links/links.md} +2 -2
  23. data/doc/{MOTIVATION_FOR_THIS_PROJECT.md → motivation_for_the_multimedia_paradise_project/motivation_for_the_multimedia_paradise_project.md} +5 -5
  24. data/doc/todo/todo_for_the_multimedia_paradise_project.md +79 -93
  25. data/lib/multimedia_paradise/actions/actions.rb +224 -0
  26. data/lib/multimedia_paradise/audio/audio_player/audio_player.rb +61 -64
  27. data/lib/multimedia_paradise/audio/audio_tag_reader/audio_tag_reader.rb +17 -8
  28. data/lib/multimedia_paradise/audio/base.rb +0 -5
  29. data/lib/multimedia_paradise/audio/compress.rb +8 -5
  30. data/lib/multimedia_paradise/audio/create_m3u_playlist.rb +7 -11
  31. data/lib/multimedia_paradise/audio/extract_audio/constants.rb +0 -37
  32. data/lib/multimedia_paradise/audio/extract_audio/extract_audio.rb +90 -68
  33. data/lib/multimedia_paradise/audio/file_duration/file_duration.rb +134 -80
  34. data/lib/multimedia_paradise/audio/genres/boogie.rb +1 -6
  35. data/lib/multimedia_paradise/audio/genres/concerts.rb +1 -6
  36. data/lib/multimedia_paradise/audio/genres/constants.rb +1 -1
  37. data/lib/multimedia_paradise/audio/genres/eurodance.rb +1 -6
  38. data/lib/multimedia_paradise/audio/genres/genre.rb +36 -33
  39. data/lib/multimedia_paradise/audio/genres/hip_hop.rb +1 -6
  40. data/lib/multimedia_paradise/audio/genres/italian_songs.rb +1 -6
  41. data/lib/multimedia_paradise/audio/genres/the_1980s.rb +1 -6
  42. data/lib/multimedia_paradise/audio/genres/trance.rb +4 -7
  43. data/lib/multimedia_paradise/audio/lyrics_fetcher.rb +27 -22
  44. data/lib/multimedia_paradise/audio/merge_audio_files.rb +18 -11
  45. data/lib/multimedia_paradise/audio/modify_year_of_audio_file.rb +23 -11
  46. data/lib/multimedia_paradise/audio/n_audio_songs.rb +3 -2
  47. data/lib/multimedia_paradise/audio/play_all_audio_files.rb +41 -16
  48. data/lib/multimedia_paradise/audio/playlist/playlist.rb +163 -123
  49. data/lib/multimedia_paradise/audio/remove_audio.rb +11 -6
  50. data/lib/multimedia_paradise/audio/remove_last_second.rb +2 -3
  51. data/lib/multimedia_paradise/audio/report_missing_id.rb +22 -12
  52. data/lib/multimedia_paradise/audio/streamripper/streamripper_wrapper.rb +7 -5
  53. data/lib/multimedia_paradise/audio/to_mp3.rb +7 -5
  54. data/lib/multimedia_paradise/audio/to_ogg.rb +3 -1
  55. data/lib/multimedia_paradise/audio/wav_to_mp3.rb +5 -5
  56. data/lib/multimedia_paradise/base/base.rb +854 -15
  57. data/lib/multimedia_paradise/base/colours.rb +28 -31
  58. data/lib/multimedia_paradise/base/{commandline_arguments.rb → commandline_arguments_module/commandline_arguments_module.rb} +12 -9
  59. data/lib/multimedia_paradise/colours/colours.rb +4 -1
  60. data/lib/multimedia_paradise/commandline/{menu.rb → commandline.rb} +19 -16
  61. data/lib/multimedia_paradise/constants/constants.rb +504 -14
  62. data/lib/multimedia_paradise/constants/web_constants.rb +2 -4
  63. data/lib/multimedia_paradise/gui/gui_base.rb +2 -2
  64. data/lib/multimedia_paradise/gui/libui/lyrics/lyrics.rb +1 -1
  65. data/lib/multimedia_paradise/gui/libui/simple_play_widget/simple_play_widget.rb +1 -1
  66. data/lib/multimedia_paradise/gui/libui/video_player/video_player.rb +1 -1
  67. data/lib/multimedia_paradise/gui/libui/youtube_channels/youtube_channels.rb +1 -1
  68. data/lib/multimedia_paradise/gui/shared_code/multimedia_converter/multimedia_converter_module.rb +0 -478
  69. data/lib/multimedia_paradise/gui/shared_code/playlist/playlist_module.rb +94 -41
  70. data/lib/multimedia_paradise/gui/shared_code/simple_play_widget/simple_play_widget_module.rb +0 -257
  71. data/lib/multimedia_paradise/gui/universal_widgets/change_metadata_widget/change_metadata_widget.rb +2 -2
  72. data/lib/multimedia_paradise/gui/universal_widgets/information_about_a_mp3_file/information_about_a_mp3_file.rb +1 -1
  73. data/lib/multimedia_paradise/gui/universal_widgets/lyrics/lyrics.rb +1 -1
  74. data/lib/multimedia_paradise/gui/universal_widgets/multimedia_converter/multimedia_converter.rb +589 -0
  75. data/lib/multimedia_paradise/gui/universal_widgets/playlist/playlist.rb +197 -0
  76. data/lib/multimedia_paradise/gui/universal_widgets/radio/radio.rb +1 -1
  77. data/lib/multimedia_paradise/gui/{gtk2 → universal_widgets}/simple_play_widget/README.md +1 -1
  78. data/lib/multimedia_paradise/gui/universal_widgets/simple_play_widget/simple_play_widget.rb +404 -0
  79. data/lib/multimedia_paradise/gui/universal_widgets/tag_mp3_files/tag_mp3_files.rb +3 -6
  80. data/lib/multimedia_paradise/java/Playlist.class +0 -0
  81. data/lib/multimedia_paradise/java/Playlist.java +198 -0
  82. data/lib/multimedia_paradise/multimedia/analyse_multimedia_file.rb +21 -19
  83. data/lib/multimedia_paradise/multimedia/avisynth/avisynth_code.avs +441 -442
  84. data/lib/multimedia_paradise/multimedia/base.rb +0 -18
  85. data/lib/multimedia_paradise/multimedia/chord.rb +1 -1
  86. data/lib/multimedia_paradise/multimedia/cut_multimedia/cut_multimedia.rb +7 -5
  87. data/lib/multimedia_paradise/multimedia/cut_multimedia/evaluate_from_this_file.rb +2 -2
  88. data/lib/multimedia_paradise/multimedia/interactive_shell.rb +22 -3
  89. data/lib/multimedia_paradise/multimedia/merge_multimedia.rb +4 -3
  90. data/lib/multimedia_paradise/multimedia/play_from_this_list.rb +4 -27
  91. data/lib/multimedia_paradise/multimedia/{read_meta_tags.rb → read_meta_tags/read_meta_tags.rb} +14 -19
  92. data/lib/multimedia_paradise/multimedia/start_length_duration.rb +3 -3
  93. data/lib/multimedia_paradise/project/project.rb +8 -4
  94. data/lib/multimedia_paradise/requires/require_the_multimedia_paradise_project.rb +5 -5
  95. data/lib/multimedia_paradise/requires/require_toplevel_methods_files.rb +1 -1
  96. data/lib/multimedia_paradise/sinatra/app.rb +3 -3
  97. data/lib/multimedia_paradise/statistics/README.md +6 -5
  98. data/lib/multimedia_paradise/statistics/video.rb +34 -14
  99. data/lib/multimedia_paradise/{misc → time}/long_format_to_milliseconds_converter.rb +4 -2
  100. data/lib/multimedia_paradise/{misc → time}/milliseconds_to_long_format_converter.rb +2 -2
  101. data/lib/multimedia_paradise/toplevel_methods/audio_related_code.rb +138 -0
  102. data/lib/multimedia_paradise/toplevel_methods/chop_into_segments_of_n_seconds_size.rb +2 -2
  103. data/lib/multimedia_paradise/{conversions → toplevel_methods}/conversions.rb +140 -48
  104. data/lib/multimedia_paradise/toplevel_methods/copy_and_merge_this_video_n_times.rb +5 -5
  105. data/lib/multimedia_paradise/toplevel_methods/create_video_from_this_audio.rb +7 -6
  106. data/lib/multimedia_paradise/toplevel_methods/cut_from_to.rb +2 -2
  107. data/lib/multimedia_paradise/toplevel_methods/denoise.rb +2 -2
  108. data/lib/multimedia_paradise/toplevel_methods/deshake.rb +3 -6
  109. data/lib/multimedia_paradise/toplevel_methods/{output_directory.rb → directory_related_code.rb} +38 -1
  110. data/lib/multimedia_paradise/toplevel_methods/encode_this_video.rb +8 -4
  111. data/lib/multimedia_paradise/toplevel_methods/esystem.rb +43 -4
  112. data/lib/multimedia_paradise/{ffmpeg → toplevel_methods}/ffmpeg.rb +200 -193
  113. data/lib/multimedia_paradise/toplevel_methods/{files_and_directories.rb → files_related_code.rb} +19 -56
  114. data/lib/multimedia_paradise/toplevel_methods/flip_and_rotate.rb +3 -3
  115. data/lib/multimedia_paradise/toplevel_methods/is_audio_file_is_video_file_is_image_file_is_multimedia_file.rb +115 -0
  116. data/lib/multimedia_paradise/toplevel_methods/is_on_roebe.rb +1 -1
  117. data/lib/multimedia_paradise/toplevel_methods/{merge_multimedia_file.rb → merge.rb} +98 -4
  118. data/lib/multimedia_paradise/toplevel_methods/opn.rb +5 -4
  119. data/lib/multimedia_paradise/toplevel_methods/player_in_use.rb +14 -7
  120. data/lib/multimedia_paradise/toplevel_methods/query_the_audio_codec_of_this_file.rb +4 -3
  121. data/lib/multimedia_paradise/toplevel_methods/radio.rb +1 -3
  122. data/lib/multimedia_paradise/toplevel_methods/return_all_video_files.rb +4 -4
  123. data/lib/multimedia_paradise/toplevel_methods/return_path_to_random_simpsons_video_file.rb +1 -1
  124. data/lib/multimedia_paradise/toplevel_methods/return_random_video_file_from_the_video_collection.rb +9 -7
  125. data/lib/multimedia_paradise/toplevel_methods/scale_video.rb +3 -4
  126. data/lib/multimedia_paradise/toplevel_methods/set_title_of.rb +6 -6
  127. data/lib/multimedia_paradise/{help/help.rb → toplevel_methods/show_help.rb} +14 -8
  128. data/lib/multimedia_paradise/toplevel_methods/slow_down_this_video_file.rb +2 -3
  129. data/lib/multimedia_paradise/toplevel_methods/start_screencast.rb +3 -2
  130. data/lib/multimedia_paradise/toplevel_methods/{misc.rb → toplevel_methods.rb} +485 -527
  131. data/lib/multimedia_paradise/toplevel_methods/total_duration.rb +4 -3
  132. data/lib/multimedia_paradise/toplevel_methods/use_lame_codec.rb +1 -2
  133. data/lib/multimedia_paradise/toplevel_methods/video_dataset.rb +1 -1
  134. data/lib/multimedia_paradise/version/version.rb +2 -2
  135. data/lib/multimedia_paradise/video/all_videos.rb +12 -19
  136. data/lib/multimedia_paradise/video/check_numbers.rb +76 -32
  137. data/lib/multimedia_paradise/video/columbo/columbo.rb +36 -14
  138. data/lib/multimedia_paradise/video/guess_video_name.rb +2 -10
  139. data/lib/multimedia_paradise/video/mike_hammer/mike_hammer.rb +2 -2
  140. data/lib/multimedia_paradise/video/missing_video_files/missing_video_files.rb +1 -9
  141. data/lib/multimedia_paradise/video/movie_searcher.rb +2 -10
  142. data/lib/multimedia_paradise/video/mplayer_wrapper.rb +1 -9
  143. data/lib/multimedia_paradise/video/random_video.rb +1 -2
  144. data/lib/multimedia_paradise/video/registered_video_file.rb +2 -10
  145. data/lib/multimedia_paradise/video/report_local_videos.rb +1 -9
  146. data/lib/multimedia_paradise/video/simpsons.rb +2 -10
  147. data/lib/multimedia_paradise/video/smart_animals/smart_animals.rb +10 -8
  148. data/lib/multimedia_paradise/video/speed_up_video.rb +28 -10
  149. data/lib/multimedia_paradise/video/store_available_video_files.rb +49 -33
  150. data/lib/multimedia_paradise/video/the_simpsons/README.md +0 -0
  151. data/lib/multimedia_paradise/video/the_simpsons/good_the_simpsons_episodes.rb +8 -8
  152. data/lib/multimedia_paradise/video/the_simpsons/the_simpsons.rb +14 -10
  153. data/lib/multimedia_paradise/video/video_information.rb +55 -49
  154. data/lib/multimedia_paradise/{configuration → yaml/configuration}/play_zoomed.yml +0 -0
  155. data/lib/multimedia_paradise/yaml/{playlist.yml → playlist/playlist.yml} +14 -15
  156. data/lib/multimedia_paradise/yaml/video/video.yml +1 -1
  157. data/lib/multimedia_paradise/yaml/video_collection/video_collection.yml +34 -32
  158. data/lib/multimedia_paradise/yaml/youtube/alltagsgeschichte/alltagsgeschichte.yml +61 -11
  159. data/lib/multimedia_paradise/yaml/youtube/songs/songs.yml +5 -3
  160. data/multimedia_paradise.gemspec +1 -1
  161. data/test/testing_audio_player.rb +3 -3
  162. data/test/testing_file_duration.rb +5 -5
  163. metadata +45 -76
  164. data/lib/multimedia_paradise/audio/file_duration/constants.rb +0 -53
  165. data/lib/multimedia_paradise/audio/waveform/class.rb +0 -341
  166. data/lib/multimedia_paradise/audio/waveform/constants.rb +0 -38
  167. data/lib/multimedia_paradise/audio/waveform/log.rb +0 -101
  168. data/lib/multimedia_paradise/base/constants.rb +0 -19
  169. data/lib/multimedia_paradise/base/encoding.rb +0 -31
  170. data/lib/multimedia_paradise/base/misc.rb +0 -665
  171. data/lib/multimedia_paradise/base/namespace.rb +0 -36
  172. data/lib/multimedia_paradise/base/time.rb +0 -25
  173. data/lib/multimedia_paradise/constants/conversions.rb +0 -62
  174. data/lib/multimedia_paradise/constants/directory_constants.rb +0 -139
  175. data/lib/multimedia_paradise/constants/encodings.rb +0 -26
  176. data/lib/multimedia_paradise/constants/file_constants.rb +0 -176
  177. data/lib/multimedia_paradise/constants/misc.rb +0 -80
  178. data/lib/multimedia_paradise/constants/my_video_directory.rb +0 -30
  179. data/lib/multimedia_paradise/constants/namespace.rb +0 -14
  180. data/lib/multimedia_paradise/constants/newline.rb +0 -14
  181. data/lib/multimedia_paradise/constants/video_filetypes.rb +0 -27
  182. data/lib/multimedia_paradise/conversions/README.md +0 -2
  183. data/lib/multimedia_paradise/ffmpeg/README.md +0 -2
  184. data/lib/multimedia_paradise/gui/gtk2/multimedia_converter/multimedia_converter.rb +0 -33
  185. data/lib/multimedia_paradise/gui/gtk2/notebook.rb +0 -144
  186. data/lib/multimedia_paradise/gui/gtk2/play_video_from_my_collection/play_video_from_my_collection.rb +0 -43
  187. data/lib/multimedia_paradise/gui/gtk2/simple_play_widget/simple_play_widget.rb +0 -40
  188. data/lib/multimedia_paradise/gui/gtk2/widget_increase_or_decrease_audio/widget_increase_or_decrease_audio.rb +0 -42
  189. data/lib/multimedia_paradise/gui/gtk2/youtube_downloader/youtube_downloader.rb +0 -32
  190. data/lib/multimedia_paradise/gui/gtk3/lyrics/lyrics.rb +0 -0
  191. data/lib/multimedia_paradise/gui/gtk3/multimedia_converter/multimedia_converter.rb +0 -34
  192. data/lib/multimedia_paradise/gui/gtk3/playlist/playlist.rb +0 -34
  193. data/lib/multimedia_paradise/gui/gtk3/simple_play_widget/simple_play_widget.rb +0 -38
  194. data/lib/multimedia_paradise/toplevel_methods/analyze_audio_stream.rb +0 -31
  195. data/lib/multimedia_paradise/toplevel_methods/codecs.rb +0 -50
  196. data/lib/multimedia_paradise/toplevel_methods/copy_file.rb +0 -18
  197. data/lib/multimedia_paradise/toplevel_methods/delay_audio.rb +0 -31
  198. data/lib/multimedia_paradise/toplevel_methods/ensure_that_the_output_directory_exists.rb +0 -27
  199. data/lib/multimedia_paradise/toplevel_methods/has_audio.rb +0 -48
  200. data/lib/multimedia_paradise/toplevel_methods/increase_volume_of_this_audio_file.rb +0 -61
  201. data/lib/multimedia_paradise/toplevel_methods/is_a_multimedia_file.rb +0 -27
  202. data/lib/multimedia_paradise/toplevel_methods/is_audio_file.rb +0 -27
  203. data/lib/multimedia_paradise/toplevel_methods/is_image_file.rb +0 -31
  204. data/lib/multimedia_paradise/toplevel_methods/is_video_file.rb +0 -62
  205. data/lib/multimedia_paradise/toplevel_methods/merge_these_videos.rb +0 -106
  206. data/lib/multimedia_paradise/toplevel_methods/run_sys_command.rb +0 -30
  207. data/lib/multimedia_paradise/toplevel_methods/to_flac.rb +0 -30
  208. data/lib/multimedia_paradise/toplevel_methods/to_mp4.rb +0 -24
  209. /data/doc/{MergingVideoLectures.md → merging_video_lectures/merging_video_lectures.md} +0 -0
  210. /data/doc/{Readme_for_the_cut_audio_component.md → readme_for_the_cut_audio_component/Readme_for_the_cut_audio_component.md} +0 -0
  211. /data/lib/multimedia_paradise/yaml/{audio_formats.yml → audio_formats/audio_formats.yml} +0 -0
  212. /data/lib/multimedia_paradise/yaml/{image_formats.yml → image_formats/image_formats.yml} +0 -0
  213. /data/lib/multimedia_paradise/yaml/{lyrics.yml → lyrics/lyrics.yml} +0 -0
  214. /data/lib/multimedia_paradise/yaml/{music_genres.yml → music_genres/music_genres.yml} +0 -0
  215. /data/lib/multimedia_paradise/yaml/{song_tags.yml → song_tags/song_tags.yml} +0 -0
  216. /data/lib/multimedia_paradise/yaml/{use_this_video_player.yml → use_this_video_player/use_this_video_player.yml} +0 -0
  217. /data/lib/multimedia_paradise/yaml/{video_encoding_settings.yml → video_encoding_settings/video_encoding_settings.yml} +0 -0
  218. /data/lib/multimedia_paradise/yaml/{video_filter_aliases.yml → video_filter_aliases/video_filter_aliases.yml} +0 -0
@@ -0,0 +1,224 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # require 'multimedia_paradise/actions/actions.rb'
6
+ # MultimediaParadise.action(:playlist_array)
7
+ # =========================================================================== #
8
+ module MultimediaParadise
9
+
10
+ # ========================================================================= #
11
+ # === MultimediaParadise.action (action tag, actions tag)
12
+ #
13
+ # Re-use the following:
14
+ #
15
+ # action(:SanitizeCookbook, _, &block)
16
+ #
17
+ # ========================================================================= #
18
+ def self.action(
19
+ action_that_is_desired = nil,
20
+ optional_argument1 = ARGV, # This is typically the main input to this method.
21
+ options_hash = {},
22
+ &block
23
+ )
24
+ _ = optional_argument1 # Easier "pointer" here.
25
+ case action_that_is_desired.to_s.delete('?').to_sym # (case tag)
26
+ # ======================================================================= #
27
+ # === :playlist_array
28
+ #
29
+ # This entry point will return all Songs that are part of the
30
+ # playlist.
31
+ # ======================================================================= #
32
+ when :playlist_array,
33
+ :PlaylistArray
34
+ require 'multimedia_paradise/audio/playlist/playlist.rb'
35
+ return MultimediaParadise::Playlist.return_array
36
+ # ======================================================================= #
37
+ # === :audio_player
38
+ # ======================================================================= #
39
+ when :audio_player,
40
+ :AudioPlayer
41
+ require 'multimedia_paradise/audio/audio_player/audio_player.rb'
42
+ MultimediaParadise.audio_player(_, &block)
43
+ # ======================================================================= #
44
+ # === :show_available_audio_formats
45
+ #
46
+ # action(:CheckNumbers)
47
+ # ======================================================================= #
48
+ when :show_available_audio_formats,
49
+ :ShowAvailableAudioFormats
50
+ require 'multimedia_paradise/toplevel_methods/toplevel_methods.rb'
51
+ MultimediaParadise.show_available_audio_formats
52
+ # ======================================================================= #
53
+ # === :check_numbers
54
+ #
55
+ # action(:CheckNumbers)
56
+ # ======================================================================= #
57
+ when :check_numbers,
58
+ :CheckNumbers
59
+ require 'multimedia_paradise/video/check_numbers.rb'
60
+ MultimediaParadise.check_numbers
61
+ # ======================================================================= #
62
+ # === :video_information
63
+ # ======================================================================= #
64
+ when :video_information,
65
+ :VideoInformation
66
+ require 'multimedia_paradise/video/video_information.rb'
67
+ MultimediaParadise.video_information(_, &block)
68
+ # ======================================================================= #
69
+ # === :speed_up_video
70
+ # ======================================================================= #
71
+ when :speed_up_video,
72
+ :SpeedUpVideo
73
+ require 'multimedia_paradise/video/speed_up_video.rb'
74
+ MultimediaParadise.speed_up_video(_, &block)
75
+ # ======================================================================= #
76
+ # === :file_duration_of
77
+ # ======================================================================= #
78
+ when :file_duration_of,
79
+ :FileDurationOf,
80
+ :file_duration,
81
+ :FileDuration,
82
+ :duration,
83
+ :Duration
84
+ require 'multimedia_paradise/audio/file_duration/file_duration.rb'
85
+ MultimediaParadise.file_duration_of(_, &block)
86
+ # ======================================================================= #
87
+ # === :modify_year_of_audio_file
88
+ # ======================================================================= #
89
+ when :modify_year_of_audio_file,
90
+ :ModifyYearOfAudioFile
91
+ require 'multimedia_paradise/audio/modify_year_of_audio_file.rb'
92
+ MultimediaParadise.modify_year_of_audio_file(_, &block)
93
+ # ======================================================================= #
94
+ # === :remove_last_second
95
+ # ======================================================================= #
96
+ when :remove_last_second,
97
+ :RemoveLastSecond
98
+ require 'multimedia_paradise/audio/remove_last_second.rb'
99
+ MultimediaParadise.remove_last_second(_, &block)
100
+ # ======================================================================= #
101
+ # === :streamripper
102
+ # ======================================================================= #
103
+ when :streamripper,
104
+ :Streamripper
105
+ require 'multimedia_paradise/audio/streamripper/streamripper_wrapper.rb'
106
+ MultimediaParadise.streamripper
107
+ # ======================================================================= #
108
+ # === :remove_audio
109
+ # ======================================================================= #
110
+ when :remove_audio,
111
+ :RemoveAudio
112
+ require 'multimedia_paradise/audio/remove_audio.rb'
113
+ MultimediaParadise.remove_audio(_, &block)
114
+ # ======================================================================= #
115
+ # === :all_videos
116
+ # ======================================================================= #
117
+ when :all_videos,
118
+ :AllVideos
119
+ require 'multimedia_paradise/video/all_videos.rb'
120
+ MultimediaParadise::Video::AllVideos.new
121
+ # ======================================================================= #
122
+ # === :n_audio_songs
123
+ # ======================================================================= #
124
+ when :n_audio_songs,
125
+ :NAudioSongs
126
+ require 'multimedia_paradise/audio/n_audio_songs.rb'
127
+ MultimediaParadise::Audio::NAudioSongs.new
128
+ # ======================================================================= #
129
+ # === :extract_audio
130
+ # ======================================================================= #
131
+ when :extract_audio,
132
+ :ExtractAudio
133
+ require 'multimedia_paradise/audio/extract_audio/extract_audio.rb'
134
+ MultimediaParadise.extract_audio(_, &block)
135
+ # ======================================================================= #
136
+ # === :smart_animals
137
+ # ======================================================================= #
138
+ when :smart_animals,
139
+ :SmartAnimals
140
+ require 'multimedia_paradise/video/smart_animals/smart_animals.rb'
141
+ MultimediaParadise::Video::SmartAnimals.new(_, &block)
142
+ # ======================================================================= #
143
+ # === :play_all_audio_files
144
+ # ======================================================================= #
145
+ when :play_all_audio_files,
146
+ :PlayAllAudioFiles
147
+ require 'multimedia_paradise/audio/play_all_audio_files.rb'
148
+ MultimediaParadise.play_all_audio_files(_, &block)
149
+ # ======================================================================= #
150
+ # === :compress_this_audio_file
151
+ # ======================================================================= #
152
+ when :compress_this_audio_file,
153
+ :CompressThisAudioFile,
154
+ :compress,
155
+ :Compress
156
+ require 'multimedia_paradise/audio/compress.rb'
157
+ MultimediaParadise.compress_this_audio_file(_, &block)
158
+ # ======================================================================= #
159
+ # === :metadata_from_this_song
160
+ # ======================================================================= #
161
+ when :metadata_from_this_song,
162
+ :MetadataFromThisSong,
163
+ :audio_tag_reader,
164
+ :AudioTagReader
165
+ require 'multimedia_paradise/audio/audio_tag_reader/audio_tag_reader.rb'
166
+ MultimediaParadise.metadata_from_this_song(_, &block)
167
+ # ======================================================================= #
168
+ # === :playlist
169
+ # ======================================================================= #
170
+ when :playlist,
171
+ :Playlist
172
+ require 'multimedia_paradise/audio/playlist/playlist.rb'
173
+ MultimediaParadise.playlist(_, &block)
174
+ # ======================================================================= #
175
+ # === :create_m3u_playlist
176
+ # ======================================================================= #
177
+ when :create_m3u_playlist,
178
+ :CreateM3uPlaylist
179
+ require 'multimedia_paradise/audio/create_m3u_playlist.rb'
180
+ MultimediaParadise.create_m3u_playlist(_, &block)
181
+ # ======================================================================= #
182
+ # === :columbo
183
+ # ======================================================================= #
184
+ when :columbo,
185
+ :Columbo
186
+ require 'multimedia_paradise/video/columbo/columbo.rb'
187
+ MultimediaParadise.columbo(_, &block)
188
+ # ======================================================================= #
189
+ # === :statistics_about_the_local_videos
190
+ # ======================================================================= #
191
+ when :statistics_about_the_local_videos,
192
+ :StatisticsAboutTheLocalVideos
193
+ require 'multimedia_paradise/statistics/video.rb'
194
+ MultimediaParadise.statistics_about_the_local_videos(&block)
195
+ # ======================================================================= #
196
+ # === :store_available_video_files
197
+ # ======================================================================= #
198
+ when :store_available_video_files,
199
+ :StoreAvailableVideoFiles,
200
+ :store,
201
+ :Store
202
+ require 'multimedia_paradise/video/store_available_video_files.rb'
203
+ MultimediaParadise.store_available_video_files(&block)
204
+ # ======================================================================= #
205
+ # === nil
206
+ # ======================================================================= #
207
+ when nil
208
+ e 'Please provide a valid action to this method; nil was supplied.'
209
+ else # else tag
210
+ e "#{rev}Not a registered action: "\
211
+ "#{action_that_is_desired} "\
212
+ "(class: #{action_that_is_desired.class})"
213
+ end
214
+ end; self.instance_eval { alias actions action } # === MultimediaParadise.actions
215
+
216
+ end
217
+
218
+ if __FILE__ == $PROGRAM_NAME
219
+ alias e puts
220
+ MultimediaParadise.action(:store)
221
+ MultimediaParadise.action(:columbo, 1)
222
+ end # mpaction
223
+ # mpaction htop-1.2
224
+ # mpaction htop.yml
@@ -2,14 +2,14 @@
2
2
  # Encoding: UTF-8
3
3
  # frozen_string_literal: true
4
4
  # =========================================================================== #
5
- # === MultimediaParadise::AudioPlayer
5
+ # === MultimediaParadise::Audio::AudioPlayer
6
6
  #
7
7
  # This is an "audio player".
8
8
  #
9
9
  # In other words - it plays audio files.
10
10
  #
11
11
  # For this to work, it distinguishes between different playmodes as will
12
- # be explained here.
12
+ # be explained next.
13
13
  #
14
14
  # - If the argument given is an existing audio file, we will play it, then
15
15
  # exit.
@@ -35,36 +35,26 @@
35
35
  #
36
36
  # Usage example:
37
37
  #
38
- # MultimediaParadise::AudioPlayer.new(ARGV)
38
+ # MultimediaParadise::Audio::AudioPlayer.new(ARGV)
39
39
  #
40
40
  # =========================================================================== #
41
41
  # require 'multimedia_paradise/audio/audio_player/audio_player.rb'
42
+ # MultimediaParadise.audio_player
42
43
  # =========================================================================== #
43
44
  require 'multimedia_paradise/audio/base.rb'
44
45
 
45
46
  module MultimediaParadise
46
47
 
47
- class AudioPlayer < AudioBase # === MultimediaParadise::AudioPlayer
48
+ module Audio
48
49
 
49
- begin
50
- require 'x/tools/mrxvt_options.rb'
51
- rescue LoadError; end
50
+ class AudioPlayer < AudioBase # === MultimediaParadise::Audio::AudioPlayer
52
51
 
53
52
  begin
54
53
  require 'roebe/classes/kde/kde_konsole/kde_konsole.rb'
55
54
  rescue LoadError; end
56
55
 
57
- begin
58
- require 'x/audio/playlist_profile.rb' # PlaylistProfile is declared here.
59
- rescue LoadError; end # bl $RUBY_AUD/playlist_profile.rb
60
-
61
56
  require 'multimedia_paradise/multimedia/play_from_this_list.rb'
62
57
 
63
- # ========================================================================= #
64
- # === NAMESPACE
65
- # ========================================================================= #
66
- NAMESPACE = inspect
67
-
68
58
  # ========================================================================= #
69
59
  # === MY_SONGS
70
60
  # ========================================================================= #
@@ -94,7 +84,7 @@ class AudioPlayer < AudioBase # === MultimediaParadise::AudioPlayer
94
84
  #
95
85
  # As of May 2015 we can dynamically set this.
96
86
  # ========================================================================= #
97
- _ = "#{::MultimediaParadise.project_yaml_dir?}video/video.yml"
87
+ _ = "#{MultimediaParadise.project_yaml_dir?}video/video.yml"
98
88
  if File.exist? _
99
89
  _ = YAML.load_file(_)
100
90
  if _.has_key? 'MAIN_VIDEO_PLAYER'
@@ -173,12 +163,11 @@ class AudioPlayer < AudioBase # === MultimediaParadise::AudioPlayer
173
163
  "#{MultimediaParadise.log_dir?}"\
174
164
  "log_file_for_played_songs_via_the_audio_player.md"
175
165
 
176
- require 'multimedia_paradise/requires/require_file_duration.rb'
177
166
  # ========================================================================= #
178
167
  # === obtain_file_duration_from_this_file(i)
179
168
  # ========================================================================= #
180
169
  def obtain_file_duration_from_this_file(i)
181
- MultimediaParadise::FileDuration[i]
170
+ action(:FileDuration, i)
182
171
  end
183
172
 
184
173
  # ========================================================================= #
@@ -196,6 +185,11 @@ class AudioPlayer < AudioBase # === MultimediaParadise::AudioPlayer
196
185
  end
197
186
  case run_already
198
187
  # ======================================================================= #
188
+ # === :default
189
+ # ======================================================================= #
190
+ when :default
191
+ run_already = true
192
+ # ======================================================================= #
199
193
  # === :dont_run_yet
200
194
  # ======================================================================= #
201
195
  when :dont_run_yet,
@@ -211,13 +205,13 @@ class AudioPlayer < AudioBase # === MultimediaParadise::AudioPlayer
211
205
  def reset
212
206
  super()
213
207
  clear_playlist
214
- set_delay # Set @delay here.
208
+ set_delay # Set the delay here.
215
209
  set_shall_we_exit
216
210
  infer_the_namespace
217
211
  # ======================================================================= #
218
- # === @use_colours
212
+ # === :use_colours
219
213
  # ======================================================================= #
220
- @use_colours = true # If true then we will use colours.
214
+ set_use_colours # If true then we will use colours.
221
215
  # ======================================================================= #
222
216
  # === @main_colour
223
217
  # ======================================================================= #
@@ -228,9 +222,9 @@ class AudioPlayer < AudioBase # === MultimediaParadise::AudioPlayer
228
222
  @play_in_a_loop = false
229
223
  determine_which_audio_player_to_use
230
224
  # ======================================================================= #
231
- # === @debug
225
+ # === :debug
232
226
  # ======================================================================= #
233
- @debug = SHALL_WE_DEBUG
227
+ @internal_hash[:debug] = SHALL_WE_DEBUG
234
228
  # ======================================================================= #
235
229
  # === @hash_songs_played
236
230
  # ======================================================================= #
@@ -245,6 +239,10 @@ class AudioPlayer < AudioBase # === MultimediaParadise::AudioPlayer
245
239
  @mrxvt = nil
246
240
  end
247
241
  # ======================================================================= #
242
+ # === @main_audio_player_to_use
243
+ # ======================================================================= #
244
+ @main_audio_player_to_use = MAIN_AUDIO_PLAYER_TO_USE
245
+ # ======================================================================= #
248
246
  # === @use_oss_for_audio_player
249
247
  # ======================================================================= #
250
248
  @use_oss_for_audio_player = USE_OSS_FOR_AUDIO_PLAYER
@@ -277,7 +275,7 @@ class AudioPlayer < AudioBase # === MultimediaParadise::AudioPlayer
277
275
  # overrule this completely, if set.
278
276
  # ========================================================================= #
279
277
  def determine_which_audio_player_to_use(
280
- i = MAIN_AUDIO_PLAYER_TO_USE,
278
+ i = @main_audio_player_to_use,
281
279
  overrule_if_environment_variable_was_set = true
282
280
  )
283
281
  case overrule_if_environment_variable_was_set
@@ -307,8 +305,8 @@ class AudioPlayer < AudioBase # === MultimediaParadise::AudioPlayer
307
305
  # === report_which_audio_player_to_use
308
306
  # ========================================================================= #
309
307
  def report_which_audio_player_to_use
310
- opne 'The audio player '+sfancy(@audio_player_to_use)+
311
- ' will be used.'
308
+ opne rev+'The audio player '+sfancy(@audio_player_to_use)+
309
+ rev+' will be used.'
312
310
  end
313
311
 
314
312
  # ========================================================================= #
@@ -365,7 +363,7 @@ class AudioPlayer < AudioBase # === MultimediaParadise::AudioPlayer
365
363
  # a loop.
366
364
  # ========================================================================= #
367
365
  def set_delay(i = DEFAULT_DELAY_PLAYING_SONGS)
368
- @delay = i
366
+ @internal_hash[:delay] = i
369
367
  end
370
368
 
371
369
  # ========================================================================= #
@@ -390,7 +388,7 @@ class AudioPlayer < AudioBase # === MultimediaParadise::AudioPlayer
390
388
  # === show_available_genres
391
389
  # ========================================================================= #
392
390
  def show_available_genres
393
- opne 'The available genres are:'
391
+ opne "#{rev}The available genres are:"
394
392
  pp @available_genres
395
393
  end
396
394
 
@@ -533,7 +531,7 @@ class AudioPlayer < AudioBase # === MultimediaParadise::AudioPlayer
533
531
  # ========================================================================= #
534
532
  def add_all_songs
535
533
  add(all_songs?)
536
- end
534
+ end; alias play_all_songs add_all_songs # === play_all_songs
537
535
 
538
536
  # ========================================================================= #
539
537
  # === refresh_playlist
@@ -607,7 +605,7 @@ class AudioPlayer < AudioBase # === MultimediaParadise::AudioPlayer
607
605
  if be_verbose
608
606
  efancy 'Leaving ...'
609
607
  efancy 'Hopefully you had fun and found class'\
610
- 'MultimediaParadise::AudioPlayer useful. Bye!'
608
+ 'MultimediaParadise::Audio::AudioPlayer useful. Bye!'
611
609
  end
612
610
  consider_resetting_kde_konsole_tab
613
611
  exit
@@ -715,7 +713,8 @@ class AudioPlayer < AudioBase # === MultimediaParadise::AudioPlayer
715
713
  cliner
716
714
  e "#{true_rev}We will pause for #{sfancy(n_seconds)} #{rev}seconds."
717
715
  cliner_with_time_stamp
718
- e "#{rev}The next song will be: #{sfancy(playlist?[@n_songs_played])}"
716
+ e "#{rev}The next song will be: "\
717
+ "#{sfancy(playlist?[@n_songs_played])}"
719
718
  cliner
720
719
  sleep(n_seconds)
721
720
  end
@@ -732,7 +731,7 @@ class AudioPlayer < AudioBase # === MultimediaParadise::AudioPlayer
732
731
  )
733
732
  if be_verbose
734
733
  e; opne 'The next song we will play via '+
735
- simp(audio_player_to_use?)+' is:'
734
+ simp(audio_player_to_use?)+"#{rev} is:"
736
735
  e "#{N} #{sfancy(i)}#{N}#{N}"
737
736
  end
738
737
  # ======================================================================= #
@@ -808,7 +807,7 @@ class AudioPlayer < AudioBase # === MultimediaParadise::AudioPlayer
808
807
  dataset.map {|entry| " #{entry}" }.join("\n")
809
808
  )
810
809
  else
811
- opne 'No file exists at '+sfile(log_file)+'.'
810
+ opnn; no_file_exists_at(log_file)
812
811
  end
813
812
  end
814
813
 
@@ -824,7 +823,7 @@ class AudioPlayer < AudioBase # === MultimediaParadise::AudioPlayer
824
823
  # === delay?
825
824
  # ========================================================================= #
826
825
  def delay?
827
- @delay.to_s
826
+ @internal_hash[:delay].to_s
828
827
  end
829
828
 
830
829
  # ========================================================================= #
@@ -855,22 +854,24 @@ class AudioPlayer < AudioBase # === MultimediaParadise::AudioPlayer
855
854
  # ========================================================================= #
856
855
  # === play_the_playlist
857
856
  # ========================================================================= #
858
- def play_the_playlist
857
+ def play_the_playlist(
858
+ playlist = playlist?
859
+ )
859
860
  if @play_in_a_loop # We wish to play in a never-ending loop.
860
861
  counter = 0
861
862
  loop {
862
- playlist?.each {|song|
863
+ playlist.each {|song|
863
864
  play_this_song(song)
864
- pause unless @n_songs_played == playlist?.size
865
+ pause unless @n_songs_played == playlist.size
865
866
  counter += 1
866
867
  break if counter > @play_max_n_songs
867
868
  }
868
869
  refresh_playlist
869
870
  }
870
871
  else
871
- playlist?.each {|song|
872
+ playlist.each {|song|
872
873
  play_this_song(song)
873
- pause unless @n_songs_played == playlist?.size
874
+ pause unless @n_songs_played == playlist.size
874
875
  } # Afterwards, we will have exited.
875
876
  end
876
877
  end
@@ -959,7 +960,7 @@ class AudioPlayer < AudioBase # === MultimediaParadise::AudioPlayer
959
960
  end
960
961
  i = i.to_s.strip
961
962
  if i =~ /^\d+$/ # If input consists of only numbers.
962
- opnn; e 'We will next play '+simp(i.to_s)+' songs.'
963
+ opne "#{rev}We will next play #{simp(i.to_s)} #{rev}songs."
963
964
  i.to_i.times { add_random_song }
964
965
  # ======================================================================= #
965
966
  # === 11:22:33
@@ -981,6 +982,15 @@ class AudioPlayer < AudioBase # === MultimediaParadise::AudioPlayer
981
982
  else
982
983
  case i # case tag
983
984
  # ===================================================================== #
985
+ # === once
986
+ # ===================================================================== #
987
+ when 'once','noloop','default','all', # This means we play every song exactly once, then quit.
988
+ '','true','false',
989
+ 'all_songs',
990
+ 'play_all_songs'
991
+ opne 'We will play all available Audio files once.'
992
+ add_all_songs
993
+ # ===================================================================== #
984
994
  # === help
985
995
  #
986
996
  # This entry point can be used to show the help section.
@@ -1054,15 +1064,6 @@ class AudioPlayer < AudioBase # === MultimediaParadise::AudioPlayer
1054
1064
  when 'last?'
1055
1065
  show_last_file_played
1056
1066
  # ===================================================================== #
1057
- # === once
1058
- # ===================================================================== #
1059
- when 'once','noloop','default','all', # This means we play every song exactly once, then quit.
1060
- '','true','false',
1061
- 'all_songs',
1062
- 'play_all_songs'
1063
- opnn; e 'We will play all available Audio files once.'
1064
- add_all_songs
1065
- # ===================================================================== #
1066
1067
  # === dance
1067
1068
  # ===================================================================== #
1068
1069
  when 'dance','bdance','breakdance' # Im Moment hardcoded auf bdance
@@ -1075,8 +1076,8 @@ class AudioPlayer < AudioBase # === MultimediaParadise::AudioPlayer
1075
1076
  # ===================================================================== #
1076
1077
  when 'loop','l','nil'
1077
1078
  # Notify the user what we are doing next.
1078
- opnn; e "#{main_colour?}Playing in a neverending #{sfancy('loop')}"\
1079
- "#{main_colour?} next:"
1079
+ opne "#{main_colour?}Playing in a neverending #{sfancy('loop')}"\
1080
+ "#{main_colour?} next:"
1080
1081
  do_play_in_a_loop
1081
1082
  # ===================================================================== #
1082
1083
  # === genre
@@ -1112,15 +1113,18 @@ class AudioPlayer < AudioBase # === MultimediaParadise::AudioPlayer
1112
1113
  perform_cleanup
1113
1114
  end
1114
1115
 
1115
- end
1116
+ end; end
1116
1117
 
1117
1118
  # =========================================================================== #
1118
1119
  # === MultimediaParadise.audio_player
1119
1120
  #
1120
1121
  # We also want to use a simpler module-method for the audio player.
1121
1122
  # =========================================================================== #
1122
- def self.audio_player(options = nil)
1123
- MultimediaParadise::AudioPlayer.new(options)
1123
+ def self.audio_player(
1124
+ options = nil,
1125
+ run_already = :default
1126
+ )
1127
+ MultimediaParadise::Audio::AudioPlayer.new(options, run_already)
1124
1128
  end; self.instance_eval { alias audio_play audio_player } # === MultimediaParadise.audio_play
1125
1129
  self.instance_eval { alias play audio_player } # === MultimediaParadise.play
1126
1130
  self.instance_eval { alias [] audio_player } # === MultimediaParadise[]
@@ -1128,16 +1132,9 @@ end; self.instance_eval { alias audio_play audio_player } # === MultimediaParadi
1128
1132
  end
1129
1133
 
1130
1134
  if __FILE__ == $PROGRAM_NAME
1131
- # pp MultimediaParadise::AudioPlayer
1132
- _ = MultimediaParadise::AudioPlayer.new(ARGV, :dont_run_yet)
1135
+ _ = MultimediaParadise.audio_player(ARGV, :dont_run_yet)
1133
1136
  if ARGV[1]
1134
1137
  _.try_to_find_genre_song(ARGV[1]) # To test this, try: rsong genre GOOD_BDANCE_SONGS
1135
1138
  end
1136
1139
  _.run
1137
- end # rsong power
1138
- #
1139
- # If you do this:
1140
- # rsong ELE
1141
- # We load all ELE songs in our playlist
1142
- # rsong playlist
1143
- # Will play our playlist.
1140
+ end # rsong 5
@@ -2,23 +2,26 @@
2
2
  # Encoding: UTF-8
3
3
  # frozen_string_literal: true
4
4
  # =========================================================================== #
5
- # === MultimediaParadise::AudioTagReader
5
+ # === MultimediaParadise::Audio::AudioTagReader
6
6
  #
7
7
  # The main idea for this class is to handle meta-tags in audio files,
8
8
  # in particular reading them.
9
9
  #
10
10
  # Usage example:
11
11
  #
12
- # MultimediaParadise::AudioTagReader.new
12
+ # MultimediaParadise::Audio::AudioTagReader.new
13
13
  #
14
14
  # =========================================================================== #
15
15
  # require 'multimedia_paradise/audio/audio_tag_reader/audio_tag_reader.rb'
16
16
  # MultimediaParadise::AudioTagReader.new(ARGV)
17
+ # MultimediaParadise.metadata_from_this_song(ARGV)
17
18
  # =========================================================================== #
18
19
  require 'multimedia_paradise/base/base.rb'
19
20
 
20
21
  module MultimediaParadise
21
22
 
23
+ module Audio
24
+
22
25
  class AudioTagReader < ::MultimediaParadise::Base # === MultimediaParadise::AudioTagReader
23
26
 
24
27
  require 'multimedia_paradise/requires/require_file_duration.rb'
@@ -344,7 +347,7 @@ class AudioTagReader < ::MultimediaParadise::Base # === MultimediaParadise::Audi
344
347
  # === work_on_this_file
345
348
  # ========================================================================= #
346
349
  def work_on_this_file(
347
- this_file = @this_file
350
+ this_file = this_file?
348
351
  )
349
352
  unless Object.const_defined? :TagLib
350
353
  text = <<-EOF
@@ -476,28 +479,34 @@ EOF
476
479
  # ======================================================================= #
477
480
  this_file = first_argument?.to_s.dup
478
481
  set_this_file(this_file)
479
- work_on_this_file(@this_file)
482
+ work_on_this_file(this_file?)
480
483
  end
481
484
 
482
485
  # ========================================================================= #
483
- # === MultimediaParadise::AudioTagReader[]
486
+ # === MultimediaParadise::Audio::AudioTagReader[]
484
487
  # ========================================================================= #
485
488
  def self.[](i = '')
486
489
  new(i) { :be_quiet}
487
490
  end
488
491
 
489
- end
492
+ end; end
490
493
 
491
494
  # =========================================================================== #
492
495
  # === MultimediaParadise.metadata_from_this_song
496
+ #
497
+ # Usage example:
498
+ #
499
+ # result = MultimediaParadise.metadata_from_this_song('/home/x/songs/HansZimmer_PearlHarbour_TrailerTheme.mp3')
500
+ #
493
501
  # =========================================================================== #
494
502
  def self.metadata_from_this_song(this_song)
495
- MultimediaParadise::AudioTagReader[this_song]
503
+ MultimediaParadise::Audio::AudioTagReader[this_song]
496
504
  end; self.instance_eval { alias analyse_tags_of_this_mp3_file metadata_from_this_song } # === MultimediaParadise.analyse_tags_of_this_mp3_file
497
505
 
498
506
  end
499
507
 
500
508
  if __FILE__ == $PROGRAM_NAME
501
- MultimediaParadise::AudioTagReader.new(ARGV)
509
+ MultimediaParadise::Audio::AudioTagReader.new(ARGV)
502
510
  end # audiotagreader /home/x/songs/Youtube_KyokushinMix2012.mp3
511
+ # audiotagreader /home/x/songs/HansZimmer_PearlHarbour_TrailerTheme.mp3
503
512
  # audiotagreader *mp3
@@ -21,11 +21,6 @@ module MultimediaParadise
21
21
 
22
22
  class AudioBase < ::MultimediaParadise::MultimediaBase # === MultimediaParadise::AudioBase
23
23
 
24
- # ========================================================================= #
25
- # === ERROR_LINE
26
- # ========================================================================= #
27
- ERROR_LINE = '2>&1'
28
-
29
24
  # ========================================================================= #
30
25
  # === initialize
31
26
  # ========================================================================= #