lib/download_tv/downloader.rb in download_tv-2.2.1 vs lib/download_tv/downloader.rb in download_tv-2.2.2
- old
+ new
@@ -1,193 +1,186 @@
module DownloadTV
+ ##
+ # Entry point of the application
+ class Downloader
+ attr_reader :offset, :config
- class Downloader
+ def initialize(offset = 0, config = {})
+ @offset = offset.abs
+ @config = Configuration.new(config) # Load configuration
- attr_reader :offset, :config
+ @filters = [
+ ->(n) { n.include?('2160p') },
+ ->(n) { n.include?('1080p') },
+ ->(n) { n.include?('720p') },
+ ->(n) { n.include?('WEB') },
+ ->(n) { !n.include?('PROPER') && !n.include?('REPACK') }
+ ]
- def initialize(offset=0, config={})
- @offset = offset.abs
- @config = Configuration.new(config).content # Load configuration
-
- @filters = [
- ->(n){ n.include?("2160p") },
- ->(n){ n.include?("1080p") },
- ->(n){ n.include?("720p") },
- ->(n){ n.include?("WEB") },
- ->(n){ !n.include?("PROPER") && !n.include?("REPACK") },
- ]
-
- Thread.abort_on_exception = true
- end
+ Thread.abort_on_exception = true
+ end
- def download_single_show(show)
- t = Torrent.new(@config[:grabber])
- download(get_link(t, show))
- end
+ def download_single_show(show)
+ t = Torrent.new(@config.content[:grabber])
+ download(get_link(t, show))
+ end
+ ##
+ # Given a file containing a list of episodes (one per line), it tries to find download links for each
+ def download_from_file(filename)
+ if !File.exist? filename
+ puts "Error: #{filename} not found"
+ exit 1
+ end
+ filename = File.realpath(filename)
+ t = Torrent.new(@config.content[:grabber])
+ File.readlines(filename).each { |show| download(get_link(t, show)) }
+ end
- ##
- # Given a file containing a list of episodes (one per line), it tries to find download links for each
- def download_from_file(filename)
- if !File.exist? filename
- puts "Error: #{filename} not found"
- exit 1
- end
- filename = File.realpath(filename)
- t = Torrent.new(@config[:grabber])
- File.readlines(filename).each { |show| download(get_link(t, show)) }
- end
+ ##
+ # Finds download links for all new episodes aired since the last run of the program
+ # It connects to MyEpisodes in order to find which shows to track and which new episodes aired.
+ def run(dont_update_last_run)
+ date = check_date
- ##
- # Finds download links for all new episodes aired since the last run of the program
- # It connects to MyEpisodes in order to find which shows to track and which new episodes aired.
- def run(dont_update_last_run)
- date = check_date
+ myepisodes = MyEpisodes.new(@config.content[:myepisodes_user], @config.content[:cookie])
+ # Log in using cookie by default
+ myepisodes.load_cookie
+ shows = myepisodes.get_shows(date)
- myepisodes = MyEpisodes.new(@config[:myepisodes_user], @config[:cookie])
- # Log in using cookie by default
- myepisodes.load_cookie
- shows = myepisodes.get_shows(date)
-
- if shows.empty?
- puts "Nothing to download"
+ if shows.empty?
+ puts 'Nothing to download'
- else
- t = Torrent.new(@config[:grabber])
- to_download = fix_names(shows)
+ else
+ t = Torrent.new(@config.content[:grabber])
+ to_download = fix_names(shows)
- queue = Queue.new
-
- # Adds a link (or empty string to the queue)
- link_t = Thread.new do
- to_download.each { |show| queue << get_link(t, show) }
- end
+ queue = Queue.new
- # Downloads the links as they are added
- download_t = Thread.new do
- to_download.size.times do
- magnet = queue.pop
- next if magnet == "" # Doesn't download if no torrents are found
- download(magnet)
- end
- end
+ # Adds a link (or empty string to the queue)
+ link_t = Thread.new do
+ to_download.each { |show| queue << get_link(t, show) }
+ end
- # Downloading the subtitles
- # subs_t = @config[:subs] and Thread.new do
- # to_download.each { |show| @s.get_subs(show) }
- # end
+ # Downloads the links as they are added
+ download_t = Thread.new do
+ to_download.size.times do
+ magnet = queue.pop
+ next if magnet == '' # Doesn't download if no torrents are found
+ download(magnet)
+ end
+ end
- link_t.join
- download_t.join
- # subs_t.join
+ # Downloading the subtitles
+ # subs_t = @config.content[:subs] and Thread.new do
+ # to_download.each { |show| @s.get_subs(show) }
+ # end
- puts "Completed. Exiting..."
- end
+ link_t.join
+ download_t.join
+ # subs_t.join
- @config[:date] = Date.today unless dont_update_last_run
+ puts 'Completed. Exiting...'
+ end
- rescue InvalidLoginError
- warn "Wrong username/password combination"
- end
+ @config.content[:date] = Date.today unless dont_update_last_run
+ @config.serialize
+ rescue InvalidLoginError
+ warn 'Wrong username/password combination'
+ end
- ##
- # Uses a Torrent object to obtain links to the given tv show
- # When :auto is true it will try to find the best match based on a set of filters
- # When it's false it will prompt the user to select the preferred result
- # Returns either a magnet link or an emptry string
- def get_link(t, show)
- links = t.get_links(show)
+ ##
+ # Uses a Torrent object to obtain links to the given tv show
+ # When :auto is true it will try to find the best match based on a set of filters
+ # When it's false it will prompt the user to select the preferred result
+ # Returns either a magnet link or an emptry string
+ def get_link(t, show)
+ links = t.get_links(show)
- return "" if links.empty?
+ return '' if links.empty?
- if @config[:auto]
- links = filter_shows(links)
- links.first[1]
-
- else
- puts "Collecting links for #{show}"
- links.each_with_index { |data, i| puts "#{i}\t\t#{data[0]}" }
-
- puts
- print "Select the torrent you want to download [-1 to skip]: "
+ if @config.content[:auto]
+ links = filter_shows(links)
+ links.first[1]
+ else
+ puts "Collecting links for #{show}"
+ links.each_with_index { |data, i| puts "#{i}\t\t#{data[0]}" }
- i = $stdin.gets.chomp.to_i
+ puts
+ print 'Select the torrent you want to download [-1 to skip]: '
- while i >= links.size || i < -1
- puts "Index out of bounds. Try again [-1 to skip]: "
- i = $stdin.gets.chomp.to_i
- end
+ i = $stdin.gets.chomp.to_i
- # Use -1 to skip the download
- i == -1 ? "" : links[i][1]
- end
-
- end
+ while i >= links.size || i < -1
+ puts 'Index out of bounds. Try again [-1 to skip]: '
+ i = $stdin.gets.chomp.to_i
+ end
+ # Use -1 to skip the download
+ i == -1 ? '' : links[i][1]
+ end
+ end
- def check_date
- last = @config[:date]
- if last - @offset != Date.today
- last - @offset
- else
- puts "Everything up to date"
- exit
- end
- end
+ def check_date
+ last = @config.content[:date]
+ if last - @offset != Date.today
+ last - @offset
+ else
+ puts 'Everything up to date'
+ exit
+ end
+ end
+ ##
+ # Given a list of shows and episodes:
+ #
+ # * Removes ignored shows
+ # * Removes apostrophes, colons and parens
+ def fix_names(shows)
+ # Ignored shows
+ s = shows.reject do |i|
+ # Remove season+episode
+ @config.content[:ignored].include?(i.split(' ')[0..-2].join(' ').downcase)
+ end
- ##
- # Given a list of shows and episodes:
- #
- # * Removes ignored shows
- # * Removes apostrophes, colons and parens
- def fix_names(shows)
- # Ignored shows
- s = shows.reject do |i|
- # Remove season+episode
- @config[:ignored].include?(i.split(" ")[0..-2].join(" ").downcase)
- end
+ s.map { |i| i.gsub(/ \(.+\)|[':]/, '') }
+ end
- s.map { |i| i.gsub(/ \(.+\)|[':]/, "") }
- end
+ ##
+ # Iteratively applies filters until they've all been applied or applying the next filter would result in no results
+ # These filters are defined at @filters
+ def filter_shows(links)
+ @filters.each do |f| # Apply each filter
+ new_links = links.reject { |name, _link| f.call(name) }
+ # Stop if the filter removes every release
+ break if new_links.empty?
- ##
- # Iteratively applies filters until they've all been applied or applying the next filter would result in no results
- # These filters are defined at @filters
- def filter_shows(links)
- @filters.each do |f| # Apply each filter
- new_links = links.reject { |name, _link| f.(name) }
- # Stop if the filter removes every release
- break if new_links.size == 0
+ links = new_links
+ end
- links = new_links
- end
+ links
+ end
- links
- end
+ ##
+ # Spawns a silent process to download a given magnet link
+ # Uses xdg-open (not portable)
+ def download(link)
+ @cmd ||= detect_os
+ exec = "#{@cmd} \"#{link}\""
- ##
- # Spawns a silent process to download a given magnet link
- # Uses xdg-open (not portable)
- def download(link)
- @cmd ||= detect_os
-
- exec = "#{@cmd} \"#{link}\""
-
- Process.detach(Process.spawn(exec, [:out, :err]=>"/dev/null"))
+ Process.detach(Process.spawn(exec, %i[out err] => '/dev/null'))
+ end
- end
-
- def detect_os
- case RbConfig::CONFIG['host_os']
- when /linux/
- "xdg-open"
- when /darwin/
- "open"
- else
- warn "You're using an unsupported platform."
- exit 1
- end
- end
- end
+ def detect_os
+ case RbConfig::CONFIG['host_os']
+ when /linux/
+ 'xdg-open'
+ when /darwin/
+ 'open'
+ else
+ warn "You're using an unsupported platform."
+ exit 1
+ end
+ end
+ end
end