# Author: Nic Wolfe # URL: http://code.google.com/p/sickbeard/ # # This file is part of SickGear. # # SickGear is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # SickGear is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with SickGear. If not, see . import db import datetime from sickbeard.common import SNATCHED, SUBTITLED, FAILED, Quality dateFormat = "%Y%m%d%H%M%S" def _logHistoryItem(action, showid, season, episode, quality, resource, provider, version=-1): logDate = datetime.datetime.today().strftime(dateFormat) if not isinstance(resource, unicode): resource = unicode(resource, 'utf-8', 'replace') myDB = db.DBConnection() myDB.action( "INSERT INTO history (action, date, showid, season, episode, quality, resource, provider, version) VALUES (?,?,?,?,?,?,?,?,?)", [action, logDate, showid, season, episode, quality, resource, provider, version]) def logSnatch(searchResult): for curEpObj in searchResult.episodes: showid = int(curEpObj.show.indexerid) season = int(curEpObj.season) episode = int(curEpObj.episode) quality = searchResult.quality version = searchResult.version providerClass = searchResult.provider if providerClass != None: provider = providerClass.name else: provider = "unknown" action = Quality.compositeStatus(SNATCHED, searchResult.quality) resource = searchResult.name _logHistoryItem(action, showid, season, episode, quality, resource, provider, version) def logDownload(episode, filename, new_ep_quality, release_group=None, version=-1): showid = int(episode.show.indexerid) season = int(episode.season) epNum = int(episode.episode) quality = new_ep_quality # store the release group as the provider if possible if release_group: provider = release_group else: provider = -1 action = episode.status _logHistoryItem(action, showid, season, epNum, quality, filename, provider, version) def logSubtitle(showid, season, episode, status, subtitleResult): resource = subtitleResult.path provider = subtitleResult.service status, quality = Quality.splitCompositeStatus(status) action = Quality.compositeStatus(SUBTITLED, quality) _logHistoryItem(action, showid, season, episode, quality, resource, provider) def logFailed(epObj, release, provider=None): showid = int(epObj.show.indexerid) season = int(epObj.season) epNum = int(epObj.episode) status, quality = Quality.splitCompositeStatus(epObj.status) action = Quality.compositeStatus(FAILED, quality) _logHistoryItem(action, showid, season, epNum, quality, release, provider) def reset_status(indexerid, season, episode): ''' Revert episode history to status from download history, if history exists ''' my_db = db.DBConnection() history_sql = 'SELECT h.action, h.showid, h.season, h.episode,'\ ' t.status FROM history AS h INNER JOIN tv_episodes AS t'\ ' ON h.showid = t.showid AND h.season = t.season'\ ' AND h.episode = t.episode WHERE t.showid = ? AND t.season = ?'\ ' AND t.episode = ? GROUP BY h.action ORDER BY h.date DESC limit 1' sql_history = my_db.select(history_sql, [str(indexerid), str(season), str(episode)]) if len(sql_history) == 1: history = sql_history[0] # update status only if status differs # FIXME: this causes issues if the user changed status manually # replicating refactored behavior anyway. if history['status'] != history['action']: undo_status = 'UPDATE tv_episodes SET status = ?'\ ' WHERE showid = ? AND season = ? AND episode = ?' my_db.action(undo_status, [history['action'], history['showid'], history['season'], history['episode']])