Module: MultimediaHelper
- Includes:
- BashHelper, SystemHelper
- Defined in:
- lib/sapis/multimedia_helper.rb
Constant Summary collapse
- RHYTHMBOX_PLAYLISTS_FILE =
File.('.local/share/rhythmbox/playlists.xml', '~')
- BANSHEE_DATA_FILE =
File.('.config/banshee-1/banshee.db', '~')
- AUDIO_FILES_EXTENSIONS =
['m4a', 'mp3']
Constants included from SystemHelper
SystemHelper::SEARCH_DIRECTORIES, SystemHelper::SEARCH_FILES
Instance Method Summary collapse
-
#add_playlists_to_banshee(directories, options = {}) ⇒ Object
:directories single entry or array.
-
#add_playlists_to_rhythmbox(directories, options = {}) ⇒ Object
:directories single entry or array.
-
#create_m3u_playlist(files_or_pattern, basedir, output) ⇒ Object
Sorts files by name.
- #encode_alac_to_m4a(file) ⇒ Object
- #get_audio_file_duration(file) ⇒ Object
- #image_format(image_data) ⇒ Object
-
#normalize_album(directory, extension) ⇒ Object
Works on a single folder - no recursion.
- #normalize_songs(*files) ⇒ Object
- #play_audio_file(filename) ⇒ Object
Methods included from SystemHelper
current_timezone, find_files, mac?, open_file, symlink, #system_cores_number, #unmount_base_mountpoint, #unrar
Methods included from BashHelper
#encode_bash_filenames, encode_bash_filenames, safe_execute, #safe_execute, #simple_bash_execute, simple_bash_execute
Instance Method Details
#add_playlists_to_banshee(directories, options = {}) ⇒ Object
:directories single entry or array
189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 |
# File 'lib/sapis/multimedia_helper.rb', line 189 def add_playlists_to_banshee(directories, ={}) require 'uri' directories = [directories] if !directories.is_a?(Array) db_layer = SQLiteLayer.new(BANSHEE_DATA_FILE) primary_source_id_music = 1 db_layer.transaction do directories.each do |directory| puts "Adding #{directory}..." playlist_name = File.basename(directory) insertion_values = { :PrimarySourceID => primary_source_id_music, :Name => playlist_name, } playlist_id = db_layer.insert_values('CorePlaylists', insertion_values) filenames = AUDIO_FILES_EXTENSIONS.map { |extension| Dir.glob(File.join(directory, "*.#{extension}")) }.flatten.sort filenames.each do |filename| puts " - #{filename}" track_id = banshee_find_track_id(filename, db_layer) || banshee_add_playlist_entry(filename, db_layer, primary_source_id_music) insertion_values = { :PlaylistID => playlist_id, :TrackID => track_id, } db_layer.insert_values('CorePlaylistEntries', insertion_values) end end end end |
#add_playlists_to_rhythmbox(directories, options = {}) ⇒ Object
:directories single entry or array
151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 |
# File 'lib/sapis/multimedia_helper.rb', line 151 def add_playlists_to_rhythmbox(directories, ={}) require 'rexml/document' require 'uri' directories = [directories] if !directories.is_a?(Array) raw_xml = IO.read(RHYTHMBOX_PLAYLISTS_FILE) xml_doc = REXML::Document.new(raw_xml) xml_root = xml_doc.elements.first directories.each do |directory| puts "Adding #{directory}..." playlist_name = File.basename(directory) filenames = AUDIO_FILES_EXTENSIONS.map { |extension| Dir.glob(File.join(directory, "*.#{extension}")) }.flatten.sort if xml_root.elements.any? { |xml_element| xml_element.attributes['name'] == playlist_name } puts ">>> playlist already existent!" else playlist_node = xml_root.add_element('playlist', 'name' => playlist_name, 'type' => 'static') filenames.sort! filenames.each do |filename| entry_node = playlist_node.add_element('location') encoded_filename = URI.encode(File.(filename)) entry_node.text = "file://" + encoded_filename end end end buffer = format_xml_playlist_for_rhythmbox(xml_doc) IO.write(RHYTHMBOX_PLAYLISTS_FILE, buffer) end |
#create_m3u_playlist(files_or_pattern, basedir, output) ⇒ Object
Sorts files by name
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
# File 'lib/sapis/multimedia_helper.rb', line 105 def create_m3u_playlist(files_or_pattern, basedir, output) case files_or_pattern when Array files = files_or_pattern # do nothing when String files = Dir.glob(files_or_pattern) else raise "ziokann!! #{files_or_pattern}" end buffer = "#EXTM3U" << "\n" files.sort.each do |file| duration = get_audio_file_duration(file) song_name = File.basename(file).sub(/\.\w+$/, '') buffer << "#EXTINF:#{duration},#{song_name}" << "\n" file_relative_path = File.join(basedir, File.basename(file)) buffer << file_relative_path << "\n" end IO.write(output, buffer) end |
#encode_alac_to_m4a(file) ⇒ Object
91 92 93 94 95 96 97 98 99 100 101 |
# File 'lib/sapis/multimedia_helper.rb', line 91 def encode_alac_to_m4a(file) temp_file = file + ".wav" simple_bash_execute "ffmpeg -i", file, temp_file File.delete(file) simple_bash_execute "neroAacEnc -q 0.5", "-if", temp_file, "-of", file File.delete(temp_file) end |
#get_audio_file_duration(file) ⇒ Object
132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 |
# File 'lib/sapis/multimedia_helper.rb', line 132 def get_audio_file_duration(file) case file when /.mp3$/ duration = safe_execute("mp3info -p '%S' " + encode_bash_filenames(file)) when /.m4a$/ # f#!$ing faad writes only to stderr # raw_result = safe_execute('faad -i ' + encode_bash_filenames(file) + " 2>&1") duration = raw_result[/(\d+)\.\d+ secs/, 1] || raise("z.k.!!") else raise "ziokann!!! #{file}" end duration.to_i end |
#image_format(image_data) ⇒ Object
31 32 33 34 35 36 37 38 39 |
# File 'lib/sapis/multimedia_helper.rb', line 31 def image_format(image_data) if image_data.start_with?('GIF8') 'gif' elsif image_data.start_with?("\xFF\xD8\xFF\xE0") 'jpg' else raise "Unrecognized picture format." end end |
#normalize_album(directory, extension) ⇒ Object
Works on a single folder - no recursion.
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
# File 'lib/sapis/multimedia_helper.rb', line 70 def normalize_album(directory, extension) case extension when 'm4a' program = 'aacgain' when 'mp3' program = 'mp3gain' else raise "Unsupported extension: #{extension}" end files = Dir.glob(File.join(directory, "*.#{extension}")) encoded_files = encode_bash_filenames(*files) # The m.f. popen3 hangs when normalizing, possibly because aacgain rewrites to screen because of the counter # F**K F**K # # Regardless, aacgain appears to be broken, as if an error happens, it still exits successfully. # safe_execute "#{program} -a -k " + encoded_files + " 2> /dev/null" end |
#normalize_songs(*files) ⇒ Object
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
# File 'lib/sapis/multimedia_helper.rb', line 51 def normalize_songs(*files) files.flatten! mp3_files = files.select { |file| file =~ /\.mp3$/i } mp4_files = files.select { |file| file =~ /\.m4a$/i } raise "xxx!" if mp3_files.size + mp4_files.size != files.size if mp3_files.size != 0 simple_bash_execute "mp3gain -r", mp3_files end if mp4_files.size != 0 simple_bash_execute "aacgain -r", mp4_files end end |
#play_audio_file(filename) ⇒ Object
41 42 43 44 45 46 47 48 49 |
# File 'lib/sapis/multimedia_helper.rb', line 41 def play_audio_file(filename) filename = File.(filename) if SystemHelper.mac? simple_bash_execute 'afplay', filename else simple_bash_execute "gst-launch-1.0 playbin -q", "uri=file://#{filename}" end end |