1
0
mirror of https://github.com/moparisthebest/SickRage synced 2024-12-12 11:02:21 -05:00

Added Transaction for add/update/delete episodes and change episode status

This commit is contained in:
echel0n 2014-03-20 03:24:58 -07:00
parent 50911a1f0f
commit 972833a7f6
4 changed files with 46 additions and 20 deletions

View File

@ -104,7 +104,7 @@ def processDir(dirName, nzbName=None, process_method=None, force=False, is_prior
#Don't Link media when the media is extracted from a rar in the same path #Don't Link media when the media is extracted from a rar in the same path
if process_method in ('hardlink', 'symlink') and videoInRar: if process_method in ('hardlink', 'symlink') and videoInRar:
process_media(path, videoInRar, nzbName, 'move', force, is_priority, indexer) process_media(path, videoInRar, nzbName, 'move', force, is_priority, indexer)
delete_files(path, rarContent) delete_files(path, rarContent)
for video in set(videoFiles) - set(videoInRar): for video in set(videoFiles) - set(videoInRar):
process_media(path, [video], nzbName, process_method, force, is_priority, indexer) process_media(path, [video], nzbName, process_method, force, is_priority, indexer)
else: else:
@ -129,21 +129,21 @@ def processDir(dirName, nzbName=None, process_method=None, force=False, is_prior
if process_method in ('hardlink', 'symlink') and videoInRar: if process_method in ('hardlink', 'symlink') and videoInRar:
process_media(processPath, videoInRar, nzbName, 'move', force, is_priority, indexer) process_media(processPath, videoInRar, nzbName, 'move', force, is_priority, indexer)
process_media(processPath, set(videoFiles) - set(videoInRar), nzbName, process_method, force, is_priority, indexer) process_media(processPath, set(videoFiles) - set(videoInRar), nzbName, process_method, force, is_priority, indexer)
delete_files(processPath, rarContent) delete_files(processPath, rarContent)
else: else:
process_media(processPath, videoFiles, nzbName, process_method, force, is_priority, indexer) process_media(processPath, videoFiles, nzbName, process_method, force, is_priority, indexer)
#Delete all file not needed #Delete all file not needed
if process_method != "move" or not process_result \ if process_method != "move" or not process_result \
or type=="manual": #Avoid to delete files if is Manual PostProcessing or type=="manual": #Avoid to delete files if is Manual PostProcessing
continue continue
delete_files(processPath, notwantedFiles) delete_files(processPath, notwantedFiles)
if process_method == "move" and \ if process_method == "move" and \
ek.ek(os.path.normpath, processPath) != ek.ek(os.path.normpath, sickbeard.TV_DOWNLOAD_DIR): ek.ek(os.path.normpath, processPath) != ek.ek(os.path.normpath, sickbeard.TV_DOWNLOAD_DIR):
delete_dir(processPath) delete_dir(processPath)
return returnStr return returnStr
def validateDir(path, dirName, nzbNameOriginal, failed): def validateDir(path, dirName, nzbNameOriginal, failed):
@ -182,7 +182,7 @@ def validateDir(path, dirName, nzbNameOriginal, failed):
videoFiles = filter(helpers.isMediaFile, allFiles) videoFiles = filter(helpers.isMediaFile, allFiles)
allDirs.append(dirName) allDirs.append(dirName)
#check if the dir have at least one tv video file #check if the dir have at least one tv video file
for video in videoFiles: for video in videoFiles:
try: try:
@ -237,8 +237,8 @@ def unRAR(path, rarFiles, force):
break break
if skip_file: if skip_file:
continue continue
rar_handle.extract(path = path, withSubpath = False, overwrite = False) rar_handle.extract(path = path, withSubpath = False, overwrite = False)
unpacked_files += [os.path.basename(x.filename) for x in rar_handle.infolist() if not x.isdir] unpacked_files += [os.path.basename(x.filename) for x in rar_handle.infolist() if not x.isdir]
del rar_handle del rar_handle

View File

@ -21,7 +21,7 @@ from __future__ import with_statement
import sys import sys
import os import os
import traceback import traceback
import urllib, urllib2 import urllib
import re import re
import datetime import datetime
import urlparse import urlparse
@ -202,6 +202,7 @@ class KATProvider(generic.TorrentProvider):
else: else:
for show_name in set(allPossibleShowNames(ep_obj.show)): for show_name in set(allPossibleShowNames(ep_obj.show)):
ep_string = sanitizeSceneName(show_name) +' '+'season:'+str(ep_obj.season)+' episode:'+str(ep_obj.episode) ep_string = sanitizeSceneName(show_name) +' '+'season:'+str(ep_obj.season)+' episode:'+str(ep_obj.episode)
search_string['Episode'].append(re.sub('\s+', ' ', ep_string)) search_string['Episode'].append(re.sub('\s+', ' ', ep_string))
return [search_string] return [search_string]

View File

@ -419,6 +419,7 @@ class TVShow(object):
scannedEps = {} scannedEps = {}
sql_l = []
for season in showObj: for season in showObj:
scannedEps[season] = {} scannedEps[season] = {}
for episode in showObj[season]: for episode in showObj[season]:
@ -442,10 +443,14 @@ class TVShow(object):
logger.log(str(self.indexerid) + u": Loading info from " + self.indexer + " for episode " + str(season) + "x" + str(episode), logger.DEBUG) logger.log(str(self.indexerid) + u": Loading info from " + self.indexer + " for episode " + str(season) + "x" + str(episode), logger.DEBUG)
ep.loadFromIndexer(season, episode, tvapi=t) ep.loadFromIndexer(season, episode, tvapi=t)
if ep.dirty: if ep.dirty:
ep.saveToDB() sql_l.append(ep.get_sql())
scannedEps[season][episode] = True scannedEps[season][episode] = True
if len(sql_l) > 0:
myDB = db.DBConnection()
myDB.mass_action(sql_l)
# Done updating save last update date # Done updating save last update date
self.last_update_indexer = datetime.date.today().toordinal() self.last_update_indexer = datetime.date.today().toordinal()
self.saveToDB() self.saveToDB()
@ -826,9 +831,12 @@ class TVShow(object):
def deleteShow(self): def deleteShow(self):
myDB = db.DBConnection() myDB = db.DBConnection()
myDB.action("DELETE FROM tv_episodes WHERE showid = ?", [self.indexerid])
myDB.action("DELETE FROM tv_shows WHERE indexer_id = ?", [self.indexerid]) sql_l = [["DELETE FROM tv_episodes WHERE showid = ?", [self.indexerid]],
myDB.action("DELETE FROM imdb_info WHERE indexer_id = ?", [self.indexerid]) ["DELETE FROM tv_shows WHERE indexer_id = ?", [self.indexerid]],
["DELETE FROM imdb_info WHERE indexer_id = ?", [self.indexerid]]]
myDB.mass_action(sql_l)
# remove self from show list # remove self from show list
sickbeard.showList = [x for x in sickbeard.showList if x.indexerid != self.indexerid] sickbeard.showList = [x for x in sickbeard.showList if x.indexerid != self.indexerid]
@ -1238,10 +1246,6 @@ class TVEpisode(object):
if result == False: if result == False:
raise exceptions.EpisodeNotFoundException("Couldn't find episode " + str(season) + "x" + str(episode)) raise exceptions.EpisodeNotFoundException("Couldn't find episode " + str(season) + "x" + str(episode))
# don't update if not needed
if self.dirty:
self.saveToDB()
def loadFromDB(self, season, episode): def loadFromDB(self, season, episode):
logger.log(str(self.show.indexerid) + u": Loading episode details from DB for episode " + str(season) + "x" + str(episode), logger.DEBUG) logger.log(str(self.show.indexerid) + u": Loading episode details from DB for episode " + str(season) + "x" + str(episode), logger.DEBUG)
@ -1546,6 +1550,22 @@ class TVEpisode(object):
raise exceptions.EpisodeDeletedException() raise exceptions.EpisodeDeletedException()
def get_sql(self, forceSave=False):
"""
Creates SQL queue for this episode if any of its data has been changed since the last save.
forceSave: If True it will create SQL queue even if no data has been changed since the
last save (aka if the record is not dirty).
"""
if not self.dirty and not forceSave:
logger.log(str(self.show.indexeridid) + u": Not creating SQL queue - record is not dirty", logger.DEBUG)
return
# use a custom update/insert method to get the data into the DB
return ["INSERT OR REPLACE INTO tv_episodes (episode_id, indexerid, indexer, name, description, subtitles, subtitles_searchcount, subtitles_lastsearch, airdate, hasnfo, hastbn, status, location, file_size, release_name, is_proper, showid, season, episode) VALUES ((SELECT episode_id FROM tv_episodes WHERE showid = ? AND season = ? AND episode = ?),?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);",
[self.show.tvdbid, self.season, self.episode, self.indexerid, self.indexer, self.name, self.description, ",".join([sub for sub in self.subtitles]), self.subtitles_searchcount, self.subtitles_lastsearch, self.airdate.toordinal(), self.hasnfo, self.hastbn, self.status, self.location, self.file_size, self.release_name, self.is_proper, self.show.indexerid, self.season, self.episode]]
def saveToDB(self, forceSave=False): def saveToDB(self, forceSave=False):
""" """
Saves this episode to the database if any of its data has been changed since the last save. Saves this episode to the database if any of its data has been changed since the last save.

View File

@ -3080,6 +3080,7 @@ class Home:
if eps != None: if eps != None:
sql_l = []
for curEp in eps.split('|'): for curEp in eps.split('|'):
logger.log(u"Attempting to set status on episode " + curEp + " to " + status, logger.DEBUG) logger.log(u"Attempting to set status on episode " + curEp + " to " + status, logger.DEBUG)
@ -3116,8 +3117,12 @@ class Home:
continue continue
epObj.status = int(status) epObj.status = int(status)
epObj.saveToDB() sql_l.append(epObj.get_sql())
if len(sql_l) > 0:
myDB = db.DBConnection()
myDB.mass_action(sql_l)
if int(status) == WANTED: if int(status) == WANTED:
msg = "Backlog was automatically started for the following seasons of <b>" + showObj.name + "</b>:<br /><ul>" msg = "Backlog was automatically started for the following seasons of <b>" + showObj.name + "</b>:<br /><ul>"
for cur_segment in wanted_segments: for cur_segment in wanted_segments: