Files
recordingprocessing/ProcessRecordings.py
2013-07-05 10:03:36 +10:00

155 lines
5.3 KiB
Python
Executable File

import os
import shutil
import MySQLdb as mdb
import glob
import json
from urllib import urlopen
from fuzzywuzzy import fuzz
from operator import itemgetter
PROCESSDIR="/srv/storage2/files/VideoProcessing/"
THOMAS="Thomas"
CHUGGINGTON="Chuggington"
MIKE="MikeTheKnight"
OCTONAUTS="Octonauts"
NIGHTGARDEN="InTheNightGarden"
RAARAA="RaaRaa"
INPUTDIR="Input"
SICKBEARDAPI="http://192.168.0.2:8081/api/3678177136222bf5002be209220ccb20/"
class TVShow:
def __init__(self, episode, season, title, subtitle, description):
self.episode = episode
self.season = season
self.title = title
self.subtitle = subtitle
self.description = description
def FindShowId(showName):
jsonurl = urlopen(SICKBEARDAPI+"?cmd=shows")
result = json.loads(jsonurl.read())
shows = []
for show in result['data']:
shows.append((show, fuzz.partial_ratio(showName.lower(), result['data'][show]['show_name'].lower())))
shows = sorted(shows, key=itemgetter(1), reverse=True)
if shows[0][1] > 85:
return shows[0][0]
def FindEpisode(showId, name=None, description=None):
jsonurl = urlopen("{0}?cmd=show.seasons&tvdbid={1}".format(SICKBEARDAPI, showId))
result = json.loads(jsonurl.read())
for season in result['data']:
for episode in result['data'][season]:
if name is not None and name.lower() == result['data'][season][episode]['name'].lower():
return (season, episode)
elif description is not None:
result = FindEpisodeByDescription(showId, season, episode, description)
if result is not None:
return result
return (0, 0)
def GetEpisodeName(subtitle, showName):
if subtitle[:len(showName)].lower() == showName.lower():
return subtitle[len(showName + ' and the '):]
else:
return subtitle
def FindEpisodeByDescription(showId, season, episode, description):
jsonEpisodeUrl = urlopen("{0}?cmd=episode&tvdbid={1}&season={2}&episode={3}".format(SICKBEARDAPI, showId, season, episode))
episodeResult = json.loads(jsonEpisodeUrl.read())
if fuzz.ratio(episodeResult['data']['description'].lower(), description.lower()) > 85:
return (season, episode)
return None
def DetermineTargetFilename(directory, filename, inputFilename):
dir = os.path.join(directory, inputFilename[:-4])
if not os.path.exists(dir):
os.makedirs(dir)
return os.path.join(dir, filename)
def ProcessKnownEpisode(directory, filename, inputFilename):
target = DetermineTargetFilename(directory, filename, inputFilename)
shutil.move(inputFilename, target)
def ProcessUnknownEpisode(inputFilename):
print "do this"
def RetrieveEpisodeData(inputFile):
con = mdb.connect('localhost', 'script', 'script', 'mythconverg')
with con:
cur = con.cursor(mdb.cursors.DictCursor)
cur.execute("select episode, season, title, subtitle, description from mythconverg.recorded where basename = '{0}'".format(inputFile))
result = cur.fetchone()
return TVShow(result['episode'], result['season'], result['title'], result['subtitle'], result['description'])
def FixEpisodeSeasonNumber(number):
if number < 10:
return "0{0}".format(number)
else:
return str(number)
def GetDirectory(title, season):
directory = ""
if title == "Thomas and Friends" or title == "Thomas the Tank Engine & Friends":
directory = THOMAS
elif title == "Chuggington":
directory = CHUGGINGTON
elif title == "Mike the Knight":
directory = MIKE
elif title == "Octonauts" or title == "The Octonauts":
directory = OCTONAUTS
elif title == "In the Night Garden":
directory = NIGHTGARDEN
elif title == "Raa Raa! The Noisy Lion":
directory = RAARAA
else:
print "Didn't match"
return os.path.join(PROCESSDIR, directory, INPUTDIR, season)
def ProcessEpisode(inputFile):
show = RetrieveEpisodeData(inputFile)
if show.title:
if show.subtitle:
show.subtitle = GetEpisodeName(show.subtitle, show.title)
if (show.season == '0' or show.episode == '0'):
showId = FindShowId(show.title)
result = FindEpisode(showId, show.subtitle, show.description)
show.season = result[0]
show.episode = result[1]
if show.season != "0" and show.episode != "0":
show.season = FixEpisodeSeasonNumber(show.season)
show.episode = FixEpisodeSeasonNumber(show.episode)
seasonFolder = "Season {0}".format(show.season)
season = "S{0}".format(show.season)
episode = "E{0}".format(show.episode)
renamedFile = "{0}{1} - {2} - SD TV_.mpg".format(season, episode, show.subtitle)
directory = GetDirectory(show.title, seasonFolder)
ProcessKnownEpisode(directory, renamedFile, os.path.basename(inputFile))
else:
print "no show name"
def GetFilesToProcess():
return glob.glob("*.mpg")
for file in GetFilesToProcess():
ProcessEpisode(file)