Merge branch 'develop_dwnlodid_complete' of git://github.com/mano3m/CouchPotatoServer into mano3m-develop_dwnlodid_complete

Conflicts:
	couchpotato/core/downloaders/transmission/__init__.py
	couchpotato/core/downloaders/transmission/main.py
This commit is contained in:
Ruud
2013-04-01 20:46:36 +02:00
9 changed files with 275 additions and 37 deletions
+78 -8
View File
@@ -2,12 +2,12 @@ from couchpotato import get_session
from couchpotato.api import addApiView
from couchpotato.core.event import addEvent, fireEvent, fireEventAsync
from couchpotato.core.helpers.encoding import toUnicode, ss
from couchpotato.core.helpers.request import jsonified
from couchpotato.core.helpers.request import getParams, jsonified
from couchpotato.core.helpers.variable import getExt, mergeDicts, getTitle, \
getImdb
from couchpotato.core.logger import CPLog
from couchpotato.core.plugins.base import Plugin
from couchpotato.core.settings.model import Library, File, Profile, Release
from couchpotato.core.settings.model import Library, File, Profile, Release, ReleaseInfo
from couchpotato.environment import Env
import errno
import os
@@ -31,6 +31,17 @@ class Renamer(Plugin):
})
addEvent('renamer.scan', self.scan)
addApiView('renamer.scanfolder', self.scanfolderView, docs = {
'desc': 'For the renamer to check for new files to rename in a specified folder',
'params': {
'movie_folder': {'desc': 'The folder of the movie to scan'},
'downloader' : {'desc': 'Optional: The downloader this movie has been downloaded with'},
'download_id': {'desc': 'Optional: The downloader\'s nzb/torrent ID'},
},
})
addEvent('renamer.scanfolder', self.scanfolder)
addEvent('renamer.check_snatched', self.checkSnatched)
addEvent('app.load', self.scan)
@@ -63,6 +74,26 @@ class Renamer(Plugin):
})
def scan(self):
self.scanfolder()
def scanfolderView(self):
params = getParams()
movie_folder = params.get('movie_folder', None)
downloader = params.get('downloader', None)
download_id = params.get('download_id', None)
fireEventAsync('renamer.scanfolder',
movie_folder = movie_folder,
downloader = downloader,
download_id = download_id
)
return jsonified({
'success': True
})
def scanfolder(self, movie_folder = None, downloader = None, download_id = None):
if self.isDisabled():
return
@@ -71,17 +102,55 @@ class Renamer(Plugin):
log.info('Renamer is already running, if you see this often, check the logs above for errors.')
return
self.renaming_started = True
# Check to see if the "to" folder is inside the "from" folder.
if not os.path.isdir(self.conf('from')) or not os.path.isdir(self.conf('to')):
if movie_folder and not os.path.isdir(movie_folder) or not os.path.isdir(self.conf('from')) or not os.path.isdir(self.conf('to')):
log.debug('"To" and "From" have to exist.')
return
elif self.conf('from') in self.conf('to'):
log.error('The "to" can\'t be inside of the "from" folder. You\'ll get an infinite loop.')
return
elif (movie_folder and movie_folder in [self.conf('to'), self.conf('from')]):
log.error('The "to" and "from" folders can\'t be inside of or the same as the provided movie folder.')
return
groups = fireEvent('scanner.scan', folder = self.conf('from'), single = True)
# make sure the movie folder name is included in the search
folder = None
movie_files = []
if movie_folder:
log.info('Scanning movie folder %s...', movie_folder)
movie_folder = movie_folder.rstrip(os.path.sep)
folder = os.path.dirname(movie_folder)
self.renaming_started = True
# Get all files from the specified folder
try:
for root, folders, names in os.walk(movie_folder):
movie_files.extend([os.path.join(root, name) for name in names])
except:
log.error('Failed getting files from %s: %s', (movie_folder, traceback.format_exc()))
db = get_session()
# Get the release with the downloader ID that was downloded by the downloader
download_quality = None
download_imdb_id = None
if downloader and download_id:
# NOTE TO RUUD: Don't really know how to do this better... but there must be a way...?
rlsnfo_dwnlds = db.query(ReleaseInfo).filter_by(identifier = 'download_downloader', value = downloader)
rlsnfo_ids = db.query(ReleaseInfo).filter_by(identifier = 'download_id', value = download_id)
for rlsnfo_dwnld in rlsnfo_dwnlds:
for rlsnfo_id in rlsnfo_ids:
if rlsnfo_id.release == rlsnfo_dwnld.release:
rls = rlsnfo_id.release
if rls:
download_imdb_id = rls.movie.library.identifier
download_quality = rls.quality.identifier
else:
log.error('Download ID %s from downloader %s not found in releases', (download_id, downloader))
groups = fireEvent('scanner.scan', folder = folder if folder else self.conf('from'), files = movie_files, download_quality = download_quality, download_imdb_id = download_imdb_id, single = True)
destination = self.conf('to')
folder_name = self.conf('folder_name')
@@ -96,8 +165,6 @@ class Renamer(Plugin):
downloaded_status = fireEvent('status.get', 'downloaded', single = True)
snatched_status = fireEvent('status.get', 'snatched', single = True)
db = get_session()
for group_identifier in groups:
group = groups[group_identifier]
@@ -609,7 +676,10 @@ class Renamer(Plugin):
db.commit()
elif item['status'] == 'completed':
log.info('Download of %s completed!', item['name'])
scan_required = True
if item['id'] and item['downloader'] and item['folder']:
fireEventAsync('renamer.scanfolder', movie_folder = item['folder'], downloader = item['downloader'], download_id = item['id'])
else:
scan_required = True
found = True
break
+28 -15
View File
@@ -101,7 +101,7 @@ class Scanner(Plugin):
addEvent('scanner.name_year', self.getReleaseNameYear)
addEvent('scanner.partnumber', self.getPartNumber)
def scan(self, folder = None, files = None, simple = False, newer_than = 0, on_found = None):
def scan(self, folder = None, files = None, download_imdb_id = None, download_quality = None, simple = False, newer_than = 0, on_found = None):
folder = ss(os.path.normpath(folder))
@@ -119,8 +119,7 @@ class Scanner(Plugin):
try:
files = []
for root, dirs, walk_files in os.walk(folder):
for filename in walk_files:
files.append(os.path.join(root, filename))
files.extend(os.path.join(root, filename) for filename in walk_files)
except:
log.error('Failed getting files from %s: %s', (folder, traceback.format_exc()))
else:
@@ -313,6 +312,12 @@ class Scanner(Plugin):
valid_files[identifier] = group
del movie_files
# Make sure only one movie was found if a download ID is provided
if download_imdb_id and download_quality and not len(valid_files) == 1:
log.info('Download ID provided (%s), but more than one group found (%s). Ignoring Download ID...', (download_imdb_id, len(valid_files)))
download_imdb_id = None
download_quality = None
# Determine file types
processed_movies = {}
@@ -346,7 +351,7 @@ class Scanner(Plugin):
continue
log.debug('Getting metadata for %s', identifier)
group['meta_data'] = self.getMetaData(group, folder = folder)
group['meta_data'] = self.getMetaData(group, folder = folder, download_quality = download_quality)
# Subtitle meta
group['subtitle_language'] = self.getSubtitleLanguage(group) if not simple else {}
@@ -376,7 +381,7 @@ class Scanner(Plugin):
del group['unsorted_files']
# Determine movie
group['library'] = self.determineMovie(group)
group['library'] = self.determineMovie(group, download_imdb_id = download_imdb_id)
if not group['library']:
log.error('Unable to determine movie: %s', group['identifiers'])
else:
@@ -401,7 +406,7 @@ class Scanner(Plugin):
return processed_movies
def getMetaData(self, group, folder = ''):
def getMetaData(self, group, folder = '', download_quality = None):
data = {}
files = list(group['files']['movie'])
@@ -423,10 +428,14 @@ class Scanner(Plugin):
if data.get('audio'): break
# Use the quality guess first, if that failes use the quality we wanted to download
data['quality'] = fireEvent('quality.guess', files = files, extra = data, single = True)
if not data['quality']:
data['quality'] = fireEvent('quality.single', 'dvdr' if group['is_dvd'] else 'dvdrip', single = True)
if download_quality:
data['quality'] = fireEvent('quality.single', download_quality, single = True)
else:
data['quality'] = fireEvent('quality.single', 'dvdr' if group['is_dvd'] else 'dvdrip', single = True)
data['quality_type'] = 'HD' if data.get('resolution_width', 0) >= 1280 or data['quality'].get('hd') else 'SD'
filename = re.sub('(.cp\(tt[0-9{7}]+\))', '', files[0])
@@ -501,17 +510,21 @@ class Scanner(Plugin):
return detected_languages
def determineMovie(self, group):
imdb_id = None
def determineMovie(self, group, download_imdb_id = None):
# Get imdb id from downloader
imdb_id = download_imdb_id
if imdb_id:
log.debug('Found movie via imdb id from it\'s download id: %s', download_imdb_id)
files = group['files']
# Check for CP(imdb_id) string in the file paths
for cur_file in files['movie']:
imdb_id = self.getCPImdb(cur_file)
if imdb_id:
log.debug('Found movie via CP tag: %s', cur_file)
break
if not imdb_id:
for cur_file in files['movie']:
imdb_id = self.getCPImdb(cur_file)
if imdb_id:
log.debug('Found movie via CP tag: %s', cur_file)
break
# Check and see if nfo contains the imdb-id
if not imdb_id: