Class: JimmyJukebox::UserConfig

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/jimmy_jukebox/user_config.rb

Defined Under Namespace

Classes: FileHoldingDirectoriesNotFoundException

Constant Summary collapse

DEFAULT_PLAYLIST_DIR =
File.expand_path(File.join("~",".jimmy_jukebox"))

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeUserConfig

Returns a new instance of UserConfig.



48
49
50
51
52
53
54
# File 'lib/jimmy_jukebox/user_config.rb', line 48

def initialize
  self.song_paths = []
  self.argv0 = ARGV[0]
  set_music_players
  generate_directories_list
  generate_song_list
end

Instance Attribute Details

#argv0Object

Returns the value of attribute argv0.



36
37
38
# File 'lib/jimmy_jukebox/user_config.rb', line 36

def argv0
  @argv0
end

#music_directoriesObject



130
131
132
# File 'lib/jimmy_jukebox/user_config.rb', line 130

def music_directories
  @music_directories ||= []
end

#music_player_detectorObject

Returns the value of attribute music_player_detector.



36
37
38
# File 'lib/jimmy_jukebox/user_config.rb', line 36

def music_player_detector
  @music_player_detector
end

#song_pathsObject

Returns the value of attribute song_paths.



36
37
38
# File 'lib/jimmy_jukebox/user_config.rb', line 36

def song_paths
  @song_paths
end

Class Method Details

.top_music_dir(save_dir) ⇒ Object



41
42
43
44
45
46
# File 'lib/jimmy_jukebox/user_config.rb', line 41

def self.top_music_dir(save_dir)
  full_path_name = File.expand_path(save_dir)
  home_regexp = /^(\/home\/[^\/]*\/[^\/]*)(\/.*)*$/
  full_path_name = full_path_name.match(home_regexp)[1] if full_path_name =~ home_regexp
  full_path_name
end

Instance Method Details

#add_all_subdirectoriesObject



197
198
199
200
201
202
203
# File 'lib/jimmy_jukebox/user_config.rb', line 197

def add_all_subdirectories
  new_dirs = []
  music_directories.each do |dir|
    new_dirs = new_dirs + all_subdirectories(dir)
  end
  self.music_directories = music_directories + new_dirs
end

#all_subdirectories(dir) ⇒ Object



191
192
193
194
195
# File 'lib/jimmy_jukebox/user_config.rb', line 191

def all_subdirectories(dir)
  Dir.glob(File.join(dir,"**/","*/"))
     .delete_if {|dir_name| !File.directory?(dir_name)}
     .map { |dir_name| File.expand_path(dir_name) }
end

#banjo_dirObject



78
79
80
# File 'lib/jimmy_jukebox/user_config.rb', line 78

def banjo_dir
  root_music_dir + '/BANJO'
end

#bluegrass_dirObject



82
83
84
# File 'lib/jimmy_jukebox/user_config.rb', line 82

def bluegrass_dir
  root_music_dir + '/BLUEGRASS'
end

#classical_dirObject



86
87
88
# File 'lib/jimmy_jukebox/user_config.rb', line 86

def classical_dir
  root_music_dir + '/CLASSICAL'
end

#create_nonexistent_music_directoriesObject



166
167
168
169
170
# File 'lib/jimmy_jukebox/user_config.rb', line 166

def create_nonexistent_music_directories
  music_directories.each do |md|
    FileUtils.mkdir_p(md) unless Dir.exists?(md)
  end
end

#default_music_dirObject



74
75
76
# File 'lib/jimmy_jukebox/user_config.rb', line 74

def default_music_dir
  File.expand_path(File.join("~","Music"))
end

#display_num_songs_messageObject



220
221
222
223
224
225
226
# File 'lib/jimmy_jukebox/user_config.rb', line 220

def display_num_songs_message
  if song_paths.length != 1
    puts "You currently have #{song_paths.length} matching songs"
  else
    puts "You currently have 1 matching song"
  end
end

#folk_dirObject



90
91
92
# File 'lib/jimmy_jukebox/user_config.rb', line 90

def folk_dir
  root_music_dir + '/FOLK'
end

#generate_directories_listObject



160
161
162
163
164
# File 'lib/jimmy_jukebox/user_config.rb', line 160

def generate_directories_list
  set_top_music_directories
  create_nonexistent_music_directories
  add_all_subdirectories
end

#generate_song_listObject



205
206
207
208
209
210
211
212
213
214
215
216
217
218
# File 'lib/jimmy_jukebox/user_config.rb', line 205

def generate_song_list
  music_directories.each do |music_dir|
    files = Dir.entries(File.expand_path(music_dir))
    if "".respond_to?(:force_encoding)  # Ruby 1.8 doesn't have string encoding or String#force_encoding
      files.delete_if { |f| !f.force_encoding("UTF-8").valid_encoding? } # avoid "invalid byte sequence in UTF-8 (ArgumentError)"
    end
    files.delete_if { |f| AUDIO_FORMATS.keys.all? { |re| !f.match(re) } }
    files.map! { |f| File.expand_path(music_dir) + '/' + f }
    files.each { |f| song_paths << f }
  end
  display_num_songs_message
  #song_paths = ["/home/xxx/Music/Artie_Shaw/Georgia On My Mind 1941.mp3",
  #              "/home/xxx/Music/Jelly_Roll_Morton/High Society 1939.mp3"]
end

#is_a_directory?(whatever) ⇒ Boolean

Returns:

  • (Boolean)


177
178
179
180
# File 'lib/jimmy_jukebox/user_config.rb', line 177

def is_a_directory?(whatever)
  return false unless whatever
  File.directory?(File.expand_path(whatever))
end

#is_a_txt_file?(whatever) ⇒ Boolean

Returns:

  • (Boolean)


172
173
174
175
# File 'lib/jimmy_jukebox/user_config.rb', line 172

def is_a_txt_file?(whatever)
  return false unless whatever
  whatever.match(/.*\.txt/) ? true : false
end

#jazz_dirObject



94
95
96
# File 'lib/jimmy_jukebox/user_config.rb', line 94

def jazz_dir
  root_music_dir + '/JAZZ'
end

#load_top_level_directories_from_fileObject



182
183
184
185
186
187
188
189
# File 'lib/jimmy_jukebox/user_config.rb', line 182

def load_top_level_directories_from_file
  File.open(@music_directories_file, "r") do |inf|
    while (line = inf.gets)
      line.strip!
      music_directories << File.expand_path(line)
    end
  end
end

#no_player_configuredObject



108
109
110
111
# File 'lib/jimmy_jukebox/user_config.rb', line 108

def no_player_configured
  puts "*** YOU CANNOT PLAY MP3S OR OGG FILES -- YOU'LL PROBABLY NEED TO INSTALL AN OGG PLAYER (like ogg123) AND AN MP3 PLAYER (like mpg123) BEFORE USING JIMMYJUKEBOX ***"
  exit
end

#rock_dirObject



98
99
100
# File 'lib/jimmy_jukebox/user_config.rb', line 98

def rock_dir
  root_music_dir + '/ROCK'
end

#root_music_dirObject



70
71
72
# File 'lib/jimmy_jukebox/user_config.rb', line 70

def root_music_dir
  @root_music_dir || default_music_dir
end

#set_music_directories_from_fileObject



119
120
121
122
123
124
125
126
127
128
# File 'lib/jimmy_jukebox/user_config.rb', line 119

def set_music_directories_from_file
  if File.exists?(File.expand_path(argv0))
    @music_directories_file = File.expand_path(argv0)
  elsif File.exists?( File.expand_path( File.join(DEFAULT_PLAYLIST_DIR, argv0) ) )
    @music_directories_file = File.expand_path(File.join(DEFAULT_PLAYLIST_DIR, argv0))
  else
    raise FileHoldingDirectoriesNotFoundException, "Can't find the file #{argv0}"
  end
  load_top_level_directories_from_file
end

#set_music_playersObject



102
103
104
105
106
# File 'lib/jimmy_jukebox/user_config.rb', line 102

def set_music_players
  self.music_player_detector = MusicPlayerDetector.new
  no_player_configured unless ogg_player || mp3_player
  warn_about_partial_functionality if !ogg_player || !mp3_player
end

#set_top_music_directoriesObject



139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# File 'lib/jimmy_jukebox/user_config.rb', line 139

def set_top_music_directories
  # argv0 can be "jazz.txt" (a file holding directory names),
  # a shortcut (like 'j' or 'jazz' for jazz or 'r' or 'rock' for rock),
  # an artist shortcut (like 'bg' for Benny Goodman or 'md' for Miles Davis),
  # a directory path (like "~/Music/JAZZ")
  # or nil
  if argv0.nil?
    music_directories << root_music_dir
  elsif dir = shortcut_to_dir(argv0)
    music_directories << dir
  elsif ARTISTS.keys.include?(argv0.to_sym)
    music_directories << root_music_dir + artist_key_to_subdir_name(argv0.to_sym)
  elsif is_a_txt_file?(argv0)
    set_music_directories_from_file
  elsif is_a_directory?(argv0)
    music_directories << File.expand_path(argv0)
  else
    music_directories << root_music_dir
  end
end

#shortcut_to_dir(user_input) ⇒ Object



134
135
136
137
# File 'lib/jimmy_jukebox/user_config.rb', line 134

def shortcut_to_dir(user_input)
  reg_ex = shortcuts.keys.detect { |re| re =~ user_input }
  reg_ex ? shortcuts[reg_ex] : nil
end

#shortcutsObject



56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/jimmy_jukebox/user_config.rb', line 56

def shortcuts
  { /^banjo$/i     => banjo_dir,
    /^b$/i         => bluegrass_dir,
    /^bluegrass$/i => bluegrass_dir,
    /^c$/i         => classical_dir,
    /^classical$/i => classical_dir,
    /^f$/i         => folk_dir,
    /^folk$/i      => folk_dir,
    /^j$/i         => jazz_dir,
    /^jazz$/i      => jazz_dir,
    /^r$/i         => rock_dir,
    /^rock$/i      => rock_dir }
end

#undownloaded_songsObject



228
229
230
231
232
233
234
235
236
# File 'lib/jimmy_jukebox/user_config.rb', line 228

def undownloaded_songs
  result = {}
  JimmyJukebox::SongLoader.new(self).all_downloadable_songs.each do |url, artist|
    save_path = root_music_dir + artist_name_to_subdir_name(artist[:name]) + '/' + File.basename(url)
    next if song_paths.include?(save_path)
    result[url] = artist
  end
  result
end

#warn_about_partial_functionalityObject



113
114
115
116
117
# File 'lib/jimmy_jukebox/user_config.rb', line 113

def warn_about_partial_functionality
  puts "*** YOU CANNOT PLAY MP3S -- YOU MIGHT WANT TO INSTALL AN MP3 PLAYER (like mpg123 OR mpg321) ***" if !mp3_player
  puts "*** YOU CANNOT PLAY OGG FILES -- YOU MIGHT WANT TO INSTALL AN OGG PLAYER (like ogg123) ***" if !ogg_player
  puts "*** YOU CANNOT PLAY WAV FILES -- YOU MIGHT WANT TO INSTALL A WAV PLAYER (like vlc) ***" if !wav_player
end