Created
January 29, 2010 21:31
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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