Skip to content

Instantly share code, notes, and snippets.

@nobert
Created January 29, 2010 21:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nobert/290159 to your computer and use it in GitHub Desktop.
Save nobert/290159 to your computer and use it in GitHub Desktop.
sabnzbd+ post-processing script that translates dated filenames (Show YYYY-MM-DD) to S##E## filenames. Pretty messy with very little validation and too many system calls. Relies on sabnzbd+ 0.5's ability to sort dated episodes
#!/usr/bin/ruby
require "rexml/document"
include REXML # so that we don't have to prefix everything
require 'net/http'
RETRY_INTERVAL = '30' # retry time in minutes
THETVDB_API_KEY = 'your-thetvdb-api-key'
TEMP_DIRECTORY = '/tmp'
CURL_PATH = '/usr/bin/curl'
UNZIP_PATH = '/usr/bin/unzip'
if !ARGV[0] || !File.exist?(ARGV[0]) || !File.directory?(ARGV[0])
puts "Must be a directory"
exit
end
def strip_trailing_slash(path)
# strip trailing slash
path.gsub(/\/$/, '')
end
def get_series_id(show)
# return thetvdb series_id for a given TV series' directory
showDoc = Document.new Net::HTTP.get('www.thetvdb.com', "/api/GetSeries.php?seriesname=#{show.tr(' ', '+')}")
series_id = showDoc.elements["Data/Series/seriesid"] ? showDoc.elements["Data/Series/seriesid"].text : false
series_id ? series_id.to_i : false
end
def create_tmp_dir(name)
temp_directory = "#{TEMP_DIRECTORY}/series-#{Process.pid}-#{name}"
Dir.mkdir(temp_directory)
temp_directory
end
def empty_tmp_dir(temp_directory)
files = Dir.glob("#{temp_directory}/*")
files.each do |file|
File.delete(file)
end
Dir.rmdir(temp_directory)
end
def process_series_directory(processing_path)
directory = strip_trailing_slash(processing_path)
show = File.basename(directory)
return false unless series_id = get_series_id(show)
tmp_dir = create_tmp_dir("series-#{series_id}")
current_dir = Dir.pwd
files = Dir.glob("#{directory}/*[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9].*")
if files.length > 0
system("#{CURL_PATH} -s http://www.thetvdb.com/api/#{THETVDB_API_KEY}/series/#{series_id}/all/en.zip -o #{tmp_dir}/en.zip")
Dir.chdir(tmp_dir)
system("unzip -qq #{tmp_dir}/en.zip")
doc = Document.new File.new("#{tmp_dir}/en.xml")
end
unprocessed = []
rename_count = 0
files.each do |file|
directory = File.dirname(file)
filename = File.basename(file)
extension = File.extname(file)
airdate = filename.match(/.*([0-9-]{10})\..*/)[1]
if episode = doc.root.detect { |node| node.kind_of? Element and node.elements["FirstAired"].text == airdate }
season = "%02d" % episode.elements["SeasonNumber"].text.to_i
episode = "%02d" % episode.elements["EpisodeNumber"].text.to_i
target_filename = "#{directory}/#{show} S#{season}E#{episode}#{extension}"
if !File.exist?(target_filename)
File.rename(file, target_filename)
rename_count += 1
end
else
if !unprocessed.include?(processing_path)
unprocessed << processing_path
Dir.chdir(processing_path)
`echo '#{$0} "#{processing_path}"' | at now + #{RETRY_INTERVAL} minutes 2>&1 > /dev/null` # try again later
end
end
end
Dir.chdir(current_dir)
empty_tmp_dir(tmp_dir)
if rename_count > 0
update_plex
end
end
def update_plex
if File.exist?(File.dirname(__FILE__) + '/update_plex.sh')
system("#{File.dirname(__FILE__)}/update_plex.sh")
end
end
# main process
process_series_directory(ARGV[0])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment