Skip to content

Instantly share code, notes, and snippets.

@sandrods
Created February 10, 2010 23:47
Show Gist options
  • Select an option

  • Save sandrods/301003 to your computer and use it in GitHub Desktop.

Select an option

Save sandrods/301003 to your computer and use it in GitHub Desktop.
Series scratcher & downloader
require 'rubygems'
require 'mechanize'
require 'rufus/scheduler'
require 'growl'
class Logger
def self.log(msg, title=nil, sticky=false, show_time=true)
time = show_time ? "\n#{Time.now.strftime('%a %d %b %H:%M')}" : ''
Growl.notify "#{msg}#{time}", :title=>title, :sticky=>sticky
end
end
class Downloader
PATH = "/Users/sandro/Downloads/torrents/"
def initialize(_files)
@agent = WWW::Mechanize.new
@scheduler = Rufus::Scheduler.start_new
@files = _files
@counter = 0
login
end
def login
Logger.log "Trying to login...", 'Digital Hive'
page = @agent.get('http://www.digitalhive.org/login.php')
form = page.forms[0]
form.username = "sandrods"
form.password = "328791"
@agent.submit(form)
#Logger.log "Login Sucessfull", 'Digital Hive'
end
def get_links
page = @agent.get('http://www.digitalhive.org/browse.php')
page.links_with(:text => 'Download')
end
def run
#Logger.log "Running", 'Digital Hive'
@counter +=1
page_links = get_links
@files.each do |ep|
next if ep.done
Logger.log "(#{@counter}) Verifying #{ep.regex.source}", 'Digital Hive'
if link = page_links.detect{|l| l.href.match(ep.regex) }
torrent = link.click
torrent.save("#{PATH}#{torrent.filename}")
Logger.log "Saving #{link.href}", 'Digital Hive'
ep.done = true
end
end
unless @files.detect{ |ep| ep.done == false}
Logger.log "Exiting...", 'Digital Hive', true
@scheduler.stop
end
if @counter >= 72
Logger.log "Exiting (TimeOut)...", 'Digital Hive', true
@scheduler.stop
end
end
def start
@job_id = @scheduler.every "10m", :first_in => "0m" do
run
end
@scheduler.join
end
end
class Episode
attr_accessor :series, :title, :season, :ep, :time, :ep_txt, :done
def initialize
@done = false
end
def set_ep(txt)
txt =~ /S: (\d+) - Ep: (\d+) \((.+)\) - (.*)/
@season = $1
@ep = $2
@time = $3
_ep = @ep.to_s.rjust(2, '0')
_season = @season.to_s.rjust(2, '0')
@ep_txt = "S#{_season}E#{_ep}"
end
def regex
name = self.series.split.join(".")
Regexp.new("(?!.*(720|264))(=#{name}.*#{@ep_txt}.*HDTV)", Regexp::IGNORECASE)
end
def to_s
"#{self.series}\n#{self.ep_txt} - #{self.title}"
end
end
class Series
def initialize
@agent = WWW::Mechanize.new
login
end
def login
Logger.log "Trying to login...", 'Calendar'
page = @agent.get('http://www.pogdesign.co.uk/cat/')
f = page.form_with(:action => '/cat/') do |form|
form.username = "sandrods@gmail.com"
form.password = "328791"
end
button = f.button(:value=>"Account Login")
f.submit(button)
# Logger.log "Login Sucessfull...", 'Calendar'
end
def episodes(_date = nil)
eps = []
date = _date ? Date.parse(_date) : Date.today
url_month = date.month.to_s + "-" + date.year.to_s
td_id = "d_#{date.day}_#{date.month}_#{date.year}"
#Logger.log "Running...", 'Calendar'
page = @agent.get("http://www.pogdesign.co.uk/cat/#{url_month}")
page./("td##{td_id} a.eplink").each do |node|
ep = Episode.new
td = node.parent
ep.series = td./("a").text
ep.title = td./("span.seasep")[0].text
ep.set_ep(td./("span.seasep")[1].text)
eps << ep
end
if eps.empty?
Logger.log "NOTHING", 'Airs Today', true
else
eps.each do |e|
Logger.log e.to_s, 'Airs Today', true
end
end
eps
end
end
s = Series.new
eps = s.episodes
unless eps.empty?
d = Downloader.new(eps)
d.start
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment