Skip to content

Instantly share code, notes, and snippets.

@radar
Forked from maxim/next_episodes
Created September 27, 2010 05:49
Show Gist options
  • Select an option

  • Save radar/598666 to your computer and use it in GitHub Desktop.

Select an option

Save radar/598666 to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
require 'rubygems'
require 'open-uri'
require 'nokogiri'
require 'time'
# ids of shows to check
movie_ids = %w(tt0773262 tt0121955 tt0182576 tt0460649 tt0903747 tt0412142)
puts "Fetching...\n"
next_episodes = []
movie_ids.each do |movie_id|
doc = Nokogiri::HTML(open("http://www.imdb.com/title/#{movie_id}/episodes"))
title = doc.xpath("//a[@href='/title/#{movie_id}/']").map(&:text).last.gsub('"', '')
date_episode_pairs = []
doc.xpath('//td').children.each do |child|
child.xpath('strong').reject{|t| t.text.strip == ''}.each do |strong|
date_episode_pairs << [strong.text, strong.ancestors('td').xpath('h3').text]
end
end
episodes = date_episode_pairs.map do |date, episode|
episode[/Season\s+(\d+)\W+Episode\s+(\d+)/i]
season = $1
episode_number = $2
title_chunks = episode.split(':')
title_chunks.shift
episode_title = title_chunks.join(':').strip
{ :time => (Time.parse(date) rescue next),
:code => (season && episode_number) ? "s#{season.rjust(2, '0')}e#{episode_number.rjust(2, '0')}" : 'missing',
:title => episode_title,
:season => season && season.to_i,
:episode => episode && episode_number.to_i }
end.compact
next_episode = episodes.select{|e| e[:time] > Time.now }.min{|a, b| a[:time] <=> b[:time]}
if next_episode
when_next_episode = next_episode[:time].strftime('%A, %m/%d/%y')
next_episodes << [next_episode, when_next_episode, title]
end
end
next_episodes.sort!{|a, b| a.first[:time] <=> b.first[:time]}
next_episodes.each do |next_episode, when_next_episode, title|
puts "#{title}: #{when_next_episode} - #{next_episode[:title]} (#{next_episode[:code]})"
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment