class SongDownloader

Song downloader class, uses YoutubeDL to download only the audio

Public Class Methods

download(url, counter, settings, number_of_tries = 1) click to toggle source
# File lib/song_downloader.rb, line 10
def self.download(url, counter, settings, number_of_tries = 1)
  song = new(url, settings, counter)
  SimpleLogger.progress(song, song.counter)
  return SimpleLogger.maximum_number_of_tries if number_of_tries > MAXIMUM_NUMBER_OF_TRIES
  song.download
rescue
  SimpleLogger.retry(song.url, song.name, number_of_tries)
  download(url, counter, settings, number_of_tries + 1)
end
new(url, settings, counter) click to toggle source
# File lib/song_downloader.rb, line 3
def initialize(url, settings, counter)
  @url = parse_url(url)
  @counter = counter.dup
  @settings = settings.dup
  @name = parse_name(@url.scrapify[:title])
end

Public Instance Methods

download() click to toggle source
# File lib/song_downloader.rb, line 20
def download
  SimpleLogger.downloading(self)
  YoutubeDL.download url, format: 'm4a', output: settings.filepath(name)
  SimpleLogger.finished_downloading
end
find_youtube_video(name) click to toggle source
# File lib/song_downloader.rb, line 32
def find_youtube_video(name)
  search_url = YOUTUBE_SEARCH_URL + URI.encode(name)
  results = open(search_url).read

  return YOUTUBE_WATCH_URL + Regexp.last_match(1) if results =~ /watch\?v=([-\w_]+)/
  puts SimpleLogger.found_no_results(@url)
end
parse_url(input = nil) click to toggle source
# File lib/song_downloader.rb, line 26
def parse_url(input = nil)
  url = input.include?('youtu') ? input.strip : find_youtube_video(input)
  url = url.slice(0, url.index('&')) if url.include? '&'
  url
end