Browse Source

Merge branch 'refs/heads/develop'

pull/1185/head
Ruud 13 years ago
parent
commit
173c6194ed
  1. 2
      couchpotato/core/event.py
  2. 2
      couchpotato/core/helpers/encoding.py
  3. 11
      couchpotato/core/helpers/variable.py
  4. 11
      couchpotato/core/plugins/base.py
  5. 2
      couchpotato/core/plugins/file/main.py
  6. 37
      couchpotato/core/plugins/manage/main.py
  7. 18
      couchpotato/core/plugins/quality/main.py
  8. 3
      couchpotato/core/plugins/release/main.py
  9. 7
      couchpotato/core/plugins/renamer/__init__.py
  10. 2
      couchpotato/core/plugins/renamer/main.py
  11. 4
      couchpotato/core/plugins/scanner/main.py
  12. 36
      couchpotato/core/plugins/searcher/main.py
  13. 7
      couchpotato/core/plugins/trailer/__init__.py
  14. 9
      couchpotato/core/plugins/trailer/main.py
  15. 15
      couchpotato/core/providers/base.py
  16. 8
      couchpotato/core/providers/movie/themoviedb/main.py
  17. 23
      couchpotato/core/providers/nzb/ftdworld/main.py
  18. 20
      couchpotato/core/providers/nzb/nzbclub/main.py
  19. 23
      couchpotato/core/providers/nzb/nzbindex/main.py
  20. 3
      couchpotato/core/providers/nzb/nzbsrus/main.py
  21. 18
      couchpotato/core/providers/nzb/omgwtfnzbs/main.py
  22. 2
      couchpotato/core/providers/torrent/publichd/__init__.py
  23. 6
      couchpotato/core/providers/torrent/publichd/main.py
  24. 3
      couchpotato/core/providers/torrent/torrentleech/main.py
  25. 2
      couchpotato/core/settings/model.py

2
couchpotato/core/event.py

@ -12,7 +12,7 @@ def runHandler(name, handler, *args, **kwargs):
return handler(*args, **kwargs) return handler(*args, **kwargs)
except: except:
from couchpotato.environment import Env from couchpotato.environment import Env
log.error('Error in event "%s", that wasn\'t caught: %s%s', (name, traceback.format_exc(), Env.all())) log.error('Error in event "%s", that wasn\'t caught: %s%s', (name, traceback.format_exc(), Env.all() if not Env.get('dev') else ''))
def addEvent(name, handler, priority = 100): def addEvent(name, handler, priority = 100):

2
couchpotato/core/helpers/encoding.py

@ -68,7 +68,7 @@ def tryUrlencode(s):
return new[1:] return new[1:]
else: else:
for letter in toUnicode(s): for letter in ss(s):
try: try:
new += quote_plus(letter) new += quote_plus(letter)
except: except:

11
couchpotato/core/helpers/variable.py

@ -1,3 +1,4 @@
from couchpotato.core.helpers.encoding import simplifyString, toSafeString
from couchpotato.core.logger import CPLog from couchpotato.core.logger import CPLog
import hashlib import hashlib
import os.path import os.path
@ -153,6 +154,16 @@ def getTitle(library_dict):
log.error('Could not get title for library item: %s', library_dict) log.error('Could not get title for library item: %s', library_dict)
return None return None
def possibleTitles(raw_title):
titles = []
titles.append(toSafeString(raw_title).lower())
titles.append(raw_title.lower())
titles.append(simplifyString(raw_title))
return list(set(titles))
def randomString(size = 8, chars = string.ascii_uppercase + string.digits): def randomString(size = 8, chars = string.ascii_uppercase + string.digits):
return ''.join(random.choice(chars) for x in range(size)) return ''.join(random.choice(chars) for x in range(size))

11
couchpotato/core/plugins/base.py

@ -1,9 +1,8 @@
from StringIO import StringIO from StringIO import StringIO
from couchpotato import addView from couchpotato import addView
from couchpotato.core.event import fireEvent, addEvent from couchpotato.core.event import fireEvent, addEvent
from couchpotato.core.helpers.encoding import tryUrlencode, simplifyString, ss, \ from couchpotato.core.helpers.encoding import tryUrlencode, ss, toSafeString
toSafeString from couchpotato.core.helpers.variable import getExt, md5
from couchpotato.core.helpers.variable import getExt
from couchpotato.core.logger import CPLog from couchpotato.core.logger import CPLog
from couchpotato.environment import Env from couchpotato.environment import Env
from flask.templating import render_template_string from flask.templating import render_template_string
@ -222,7 +221,7 @@ class Plugin(object):
def getCache(self, cache_key, url = None, **kwargs): def getCache(self, cache_key, url = None, **kwargs):
cache_key = simplifyString(cache_key) cache_key = md5(ss(cache_key))
cache = Env.get('cache').get(cache_key) cache = Env.get('cache').get(cache_key)
if cache: if cache:
if not Env.get('dev'): log.debug('Getting cache %s', cache_key) if not Env.get('dev'): log.debug('Getting cache %s', cache_key)
@ -242,9 +241,11 @@ class Plugin(object):
self.setCache(cache_key, data, timeout = cache_timeout) self.setCache(cache_key, data, timeout = cache_timeout)
return data return data
except: except:
if not kwargs.get('show_error'): if not kwargs.get('show_error', True):
raise raise
return ''
def setCache(self, cache_key, value, timeout = 300): def setCache(self, cache_key, value, timeout = 300):
log.debug('Setting cache %s', cache_key) log.debug('Setting cache %s', cache_key)
Env.get('cache').set(cache_key, value, timeout) Env.get('cache').set(cache_key, value, timeout)

2
couchpotato/core/plugins/file/main.py

@ -66,10 +66,12 @@ class FileManager(Plugin):
time.sleep(3) time.sleep(3)
log.debug('Cleaning up unused files') log.debug('Cleaning up unused files')
python_cache = Env.get('cache')._path
try: try:
db = get_session() db = get_session()
for root, dirs, walk_files in os.walk(Env.get('cache_dir')): for root, dirs, walk_files in os.walk(Env.get('cache_dir')):
for filename in walk_files: for filename in walk_files:
if root == python_cache: continue
file_path = os.path.join(root, filename) file_path = os.path.join(root, filename)
f = db.query(File).filter(File.path == toUnicode(file_path)).first() f = db.query(File).filter(File.path == toUnicode(file_path)).first()
if not f: if not f:

37
couchpotato/core/plugins/manage/main.py

@ -115,12 +115,35 @@ class Manage(Plugin):
if done_movie['library']['identifier'] not in added_identifiers: if done_movie['library']['identifier'] not in added_identifiers:
fireEvent('movie.delete', movie_id = done_movie['id'], delete_from = 'all') fireEvent('movie.delete', movie_id = done_movie['id'], delete_from = 'all')
else: else:
for release in done_movie.get('releases', []): for release in done_movie.get('releases', []):
for release_file in release.get('files', []): if len(release.get('files', [])) == 0:
# Remove release not available anymore fireEvent('release.delete', release['id'])
if not os.path.isfile(ss(release_file['path'])): else:
fireEvent('release.clean', release['id']) for release_file in release.get('files', []):
break # Remove release not available anymore
if not os.path.isfile(ss(release_file['path'])):
fireEvent('release.clean', release['id'])
break
# Check if there are duplicate releases (different quality) use the last one, delete the rest
if len(done_movie.get('releases', [])) > 1:
used_files = {}
for release in done_movie.get('releases', []):
for release_file in release.get('files', []):
already_used = used_files.get(release_file['path'])
if already_used:
print already_used, release['id']
if already_used < release['id']:
fireEvent('release.delete', release['id'], single = True) # delete this one
else:
fireEvent('release.delete', already_used, single = True) # delete previous one
break
else:
used_files[release_file['path']] = release.get('id')
del used_files
Env.prop('manage.last_update', time.time()) Env.prop('manage.last_update', time.time())
except: except:
@ -153,7 +176,7 @@ class Manage(Plugin):
'to_go': total_found, 'to_go': total_found,
} }
if group['library']: if group['library'] and group['library'].get('identifier'):
identifier = group['library'].get('identifier') identifier = group['library'].get('identifier')
added_identifiers.append(identifier) added_identifiers.append(identifier)
@ -187,5 +210,5 @@ class Manage(Plugin):
groups = fireEvent('scanner.scan', folder = folder, files = files, single = True) groups = fireEvent('scanner.scan', folder = folder, files = files, single = True)
for group in groups.itervalues(): for group in groups.itervalues():
if group['library']: if group['library'] and group['library'].get('identifier'):
fireEvent('release.add', group = group) fireEvent('release.add', group = group)

18
couchpotato/core/plugins/quality/main.py

@ -7,6 +7,7 @@ from couchpotato.core.helpers.variable import mergeDicts, md5, getExt
from couchpotato.core.logger import CPLog from couchpotato.core.logger import CPLog
from couchpotato.core.plugins.base import Plugin from couchpotato.core.plugins.base import Plugin
from couchpotato.core.settings.model import Quality, Profile, ProfileType from couchpotato.core.settings.model import Quality, Profile, ProfileType
from sqlalchemy.sql.expression import or_
import os.path import os.path
import re import re
import time import time
@ -18,8 +19,8 @@ class QualityPlugin(Plugin):
qualities = [ qualities = [
{'identifier': 'bd50', 'hd': True, 'size': (15000, 60000), 'label': 'BR-Disk', 'alternative': ['bd25'], 'allow': ['1080p'], 'ext':[], 'tags': ['bdmv', 'certificate', ('complete', 'bluray')]}, {'identifier': 'bd50', 'hd': True, 'size': (15000, 60000), 'label': 'BR-Disk', 'alternative': ['bd25'], 'allow': ['1080p'], 'ext':[], 'tags': ['bdmv', 'certificate', ('complete', 'bluray')]},
{'identifier': '1080p', 'hd': True, 'size': (5000, 20000), 'label': '1080P', 'width': 1920, 'alternative': [], 'allow': [], 'ext':['mkv', 'm2ts'], 'tags': ['m2ts']}, {'identifier': '1080p', 'hd': True, 'size': (5000, 20000), 'label': '1080P', 'width': 1920, 'height': 1080, 'alternative': [], 'allow': [], 'ext':['mkv', 'm2ts'], 'tags': ['m2ts']},
{'identifier': '720p', 'hd': True, 'size': (3500, 10000), 'label': '720P', 'width': 1280, 'alternative': [], 'allow': [], 'ext':['mkv', 'ts']}, {'identifier': '720p', 'hd': True, 'size': (3500, 10000), 'label': '720P', 'width': 1280, 'height': 720, 'alternative': [], 'allow': [], 'ext':['mkv', 'ts']},
{'identifier': 'brrip', 'hd': True, 'size': (700, 7000), 'label': 'BR-Rip', 'alternative': ['bdrip'], 'allow': ['720p'], 'ext':['avi']}, {'identifier': 'brrip', 'hd': True, 'size': (700, 7000), 'label': 'BR-Rip', 'alternative': ['bdrip'], 'allow': ['720p'], 'ext':['avi']},
{'identifier': 'dvdr', 'size': (3000, 10000), 'label': 'DVD-R', 'alternative': [], 'allow': [], 'ext':['iso', 'img'], 'tags': ['pal', 'ntsc', 'video_ts', 'audio_ts']}, {'identifier': 'dvdr', 'size': (3000, 10000), 'label': 'DVD-R', 'alternative': [], 'allow': [], 'ext':['iso', 'img'], 'tags': ['pal', 'ntsc', 'video_ts', 'audio_ts']},
{'identifier': 'dvdrip', 'size': (600, 2400), 'label': 'DVD-Rip', 'width': 720, 'alternative': ['dvdrip'], 'allow': [], 'ext':['avi', 'mpg', 'mpeg'], 'tags': [('dvd', 'rip'), ('dvd', 'xvid'), ('dvd', 'divx')]}, {'identifier': 'dvdrip', 'size': (600, 2400), 'label': 'DVD-Rip', 'width': 720, 'alternative': ['dvdrip'], 'allow': [], 'ext':['avi', 'mpg', 'mpeg'], 'tags': [('dvd', 'rip'), ('dvd', 'xvid'), ('dvd', 'divx')]},
@ -76,7 +77,7 @@ class QualityPlugin(Plugin):
db = get_session() db = get_session()
quality_dict = {} quality_dict = {}
quality = db.query(Quality).filter_by(identifier = identifier).first() quality = db.query(Quality).filter(or_(Quality.identifier == identifier, Quality.id == identifier)).first()
if quality: if quality:
quality_dict = dict(self.getQuality(quality.identifier), **quality.to_dict()) quality_dict = dict(self.getQuality(quality.identifier), **quality.to_dict())
@ -198,9 +199,14 @@ class QualityPlugin(Plugin):
for quality in self.all(): for quality in self.all():
# Last check on resolution only # Check width resolution, range 20
if quality.get('width', 480) == extra.get('resolution_width', 0): if (quality.get('width', 720) - 20) <= extra.get('resolution_width', 0) <= (quality.get('width', 720) + 20):
log.debug('Found %s via resolution_width: %s == %s', (quality['identifier'], quality.get('width', 480), extra.get('resolution_width', 0))) log.debug('Found %s via resolution_width: %s == %s', (quality['identifier'], quality.get('width', 720), extra.get('resolution_width', 0)))
return self.setCache(hash, quality)
# Check height resolution, range 20
if (quality.get('height', 480) - 20) <= extra.get('resolution_height', 0) <= (quality.get('height', 480) + 20):
log.debug('Found %s via resolution_height: %s == %s', (quality['identifier'], quality.get('height', 480), extra.get('resolution_height', 0)))
return self.setCache(hash, quality) return self.setCache(hash, quality)
if 480 <= extra.get('resolution_width', 0) <= 720: if 480 <= extra.get('resolution_width', 0) <= 720:

3
couchpotato/core/plugins/release/main.py

@ -133,6 +133,9 @@ class Release(Plugin):
db.delete(release_file) db.delete(release_file)
db.commit() db.commit()
if len(rel.files) == 0:
self.delete(id)
return True return True
return False return False

7
couchpotato/core/plugins/renamer/__init__.py

@ -133,13 +133,6 @@ config = [{
'type': 'choice', 'type': 'choice',
'options': rename_options 'options': rename_options
}, },
{
'name': 'trailer_name',
'label': 'Trailer naming',
'default': '<filename>-trailer.<ext>',
'type': 'choice',
'options': rename_options
},
], ],
}, },
], ],

2
couchpotato/core/plugins/renamer/main.py

@ -340,6 +340,7 @@ class Renamer(Plugin):
log.info('Removing "%s"', src) log.info('Removing "%s"', src)
try: try:
src = ss(src)
if os.path.isfile(src): if os.path.isfile(src):
os.remove(src) os.remove(src)
@ -497,6 +498,7 @@ class Renamer(Plugin):
return string.replace(' ', ' ').replace(' .', '.') return string.replace(' ', ' ').replace(' .', '.')
def deleteEmptyFolder(self, folder, show_error = True): def deleteEmptyFolder(self, folder, show_error = True):
folder = ss(folder)
loge = log.error if show_error else log.debug loge = log.error if show_error else log.debug
for root, dirs, files in os.walk(folder): for root, dirs, files in os.walk(folder):

4
couchpotato/core/plugins/scanner/main.py

@ -421,7 +421,7 @@ class Scanner(Plugin):
if not data['quality']: if not data['quality']:
data['quality'] = fireEvent('quality.single', 'dvdr' if group['is_dvd'] else 'dvdrip', single = True) 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 else 'SD' 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]) filename = re.sub('(.cp\(tt[0-9{7}]+\))', '', files[0])
data['group'] = self.getGroup(filename[len(folder):]) data['group'] = self.getGroup(filename[len(folder):])
@ -775,7 +775,7 @@ class Scanner(Plugin):
return None return None
def findYear(self, text): def findYear(self, text):
matches = re.search('(?P<year>[12]{1}[0-9]{3})', text) matches = re.search('(?P<year>19[0-9]{2}|20[0-9]{2})', text)
if matches: if matches:
return matches.group('year') return matches.group('year')

36
couchpotato/core/plugins/searcher/main.py

@ -3,7 +3,8 @@ from couchpotato.api import addApiView
from couchpotato.core.event import addEvent, fireEvent, fireEventAsync from couchpotato.core.event import addEvent, fireEvent, fireEventAsync
from couchpotato.core.helpers.encoding import simplifyString, toUnicode from couchpotato.core.helpers.encoding import simplifyString, toUnicode
from couchpotato.core.helpers.request import jsonified, getParam from couchpotato.core.helpers.request import jsonified, getParam
from couchpotato.core.helpers.variable import md5, getTitle, splitString from couchpotato.core.helpers.variable import md5, getTitle, splitString, \
possibleTitles
from couchpotato.core.logger import CPLog from couchpotato.core.logger import CPLog
from couchpotato.core.plugins.base import Plugin from couchpotato.core.plugins.base import Plugin
from couchpotato.core.settings.model import Movie, Release, ReleaseInfo from couchpotato.core.settings.model import Movie, Release, ReleaseInfo
@ -365,17 +366,18 @@ class Searcher(Plugin):
if self.checkIMDB([nzb['description']], movie['library']['identifier']): if self.checkIMDB([nzb['description']], movie['library']['identifier']):
return True return True
for movie_title in movie['library']['titles']: for raw_title in movie['library']['titles']:
movie_words = re.split('\W+', simplifyString(movie_title['title'])) for movie_title in possibleTitles(raw_title['title']):
movie_words = re.split('\W+', simplifyString(movie_title))
if self.correctName(nzb['name'], movie_title['title']): if self.correctName(nzb['name'], movie_title):
# if no IMDB link, at least check year range 1 # if no IMDB link, at least check year range 1
if len(movie_words) > 2 and self.correctYear([nzb['name']], movie['library']['year'], 1): if len(movie_words) > 2 and self.correctYear([nzb['name']], movie['library']['year'], 1):
return True return True
# if no IMDB link, at least check year # if no IMDB link, at least check year
if len(movie_words) <= 2 and self.correctYear([nzb['name']], movie['library']['year'], 0): if len(movie_words) <= 2 and self.correctYear([nzb['name']], movie['library']['year'], 0):
return True return True
log.info("Wrong: %s, undetermined naming. Looking for '%s (%s)'" % (nzb['name'], movie_name, movie['library']['year'])) log.info("Wrong: %s, undetermined naming. Looking for '%s (%s)'" % (nzb['name'], movie_name, movie['library']['year']))
return False return False
@ -444,12 +446,16 @@ class Searcher(Plugin):
def correctName(self, check_name, movie_name): def correctName(self, check_name, movie_name):
check_names = [check_name] check_names = [check_name]
try:
check_names.append(re.search(r'([\'"])[^\1]*\1', check_name).group(0))
except:
pass
for check_name in check_names: # Match names between "
try: check_names.append(re.search(r'([\'"])[^\1]*\1', check_name).group(0))
except: pass
# Match longest name between []
try: check_names.append(max(check_name.split('['), key = len))
except: pass
for check_name in list(set(check_names)):
check_movie = fireEvent('scanner.name_year', check_name, single = True) check_movie = fireEvent('scanner.name_year', check_name, single = True)
try: try:

7
couchpotato/core/plugins/trailer/__init__.py

@ -24,6 +24,13 @@ config = [{
'type': 'dropdown', 'type': 'dropdown',
'values': [('1080P', '1080p'), ('720P', '720p'), ('480P', '480p')], 'values': [('1080P', '1080p'), ('720P', '720p'), ('480P', '480p')],
}, },
{
'name': 'name',
'label': 'Naming',
'default': '<filename>-trailer',
'advanced': True,
'description': 'Use <filename> to use above settings.'
},
], ],
}, },
], ],

9
couchpotato/core/plugins/trailer/main.py

@ -19,10 +19,11 @@ class Trailer(Plugin):
trailers = fireEvent('trailer.search', group = group, merge = True) trailers = fireEvent('trailer.search', group = group, merge = True)
if not trailers or trailers == []: if not trailers or trailers == []:
log.info('No trailers found for: %s', getTitle(group['library'])) log.info('No trailers found for: %s', getTitle(group['library']))
return return False
for trailer in trailers.get(self.conf('quality'), []): for trailer in trailers.get(self.conf('quality'), []):
destination = '%s-trailer.%s' % (self.getRootName(group), getExt(trailer)) filename = self.conf('name').replace('<filename>', group['filename']) + ('.%s' % getExt(trailer))
destination = os.path.join(group['destination_dir'], filename)
if not os.path.isfile(destination): if not os.path.isfile(destination):
fireEvent('file.download', url = trailer, dest = destination, urlopen_kwargs = {'headers': {'User-Agent': 'Quicktime'}}, single = True) fireEvent('file.download', url = trailer, dest = destination, urlopen_kwargs = {'headers': {'User-Agent': 'Quicktime'}}, single = True)
else: else:
@ -33,5 +34,5 @@ class Trailer(Plugin):
# Download first and break # Download first and break
break break
def getRootName(self, data = {}): return True
return os.path.join(data['destination_dir'], data['filename'])

15
couchpotato/core/providers/base.py

@ -1,5 +1,6 @@
from couchpotato.core.event import addEvent from couchpotato.core.event import addEvent
from couchpotato.core.helpers.variable import tryFloat from couchpotato.core.helpers.encoding import simplifyString
from couchpotato.core.helpers.variable import tryFloat, getTitle
from couchpotato.core.logger import CPLog from couchpotato.core.logger import CPLog
from couchpotato.core.plugins.base import Plugin from couchpotato.core.plugins.base import Plugin
from couchpotato.environment import Env from couchpotato.environment import Env
@ -155,3 +156,15 @@ class YarrProvider(Provider):
new['provider_extra'] = ', %s' % new['provider_extra'] new['provider_extra'] = ', %s' % new['provider_extra']
log.info('Found: score(%(score)s) on %(provider)s%(provider_extra)s: %(name)s', new) log.info('Found: score(%(score)s) on %(provider)s%(provider_extra)s: %(name)s', new)
def removeDuplicateResults(self, results):
result_ids = []
new_results = []
for result in results:
if result['id'] not in result_ids:
new_results.append(result)
result_ids.append(result['id'])
return new_results

8
couchpotato/core/providers/movie/themoviedb/main.py

@ -3,6 +3,7 @@ from couchpotato.core.helpers.encoding import simplifyString, toUnicode
from couchpotato.core.logger import CPLog from couchpotato.core.logger import CPLog
from couchpotato.core.providers.movie.base import MovieProvider from couchpotato.core.providers.movie.base import MovieProvider
from libs.themoviedb import tmdb from libs.themoviedb import tmdb
import traceback
log = CPLog(__name__) log = CPLog(__name__)
@ -61,7 +62,12 @@ class TheMovieDb(MovieProvider):
if not results: if not results:
log.debug('Searching for movie: %s', q) log.debug('Searching for movie: %s', q)
raw = tmdb.search(search_string)
raw = None
try:
raw = tmdb.search(search_string)
except:
log.error('Failed searching TMDB for "%s": %s', (search_string, traceback.format_exc()))
results = [] results = []
if raw: if raw:

23
couchpotato/core/providers/nzb/ftdworld/main.py

@ -1,8 +1,7 @@
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from couchpotato.core.event import fireEvent from couchpotato.core.event import fireEvent
from couchpotato.core.helpers.encoding import toUnicode, tryUrlencode, \ from couchpotato.core.helpers.encoding import toUnicode, tryUrlencode
simplifyString from couchpotato.core.helpers.variable import tryInt, possibleTitles, getTitle
from couchpotato.core.helpers.variable import tryInt, getTitle
from couchpotato.core.logger import CPLog from couchpotato.core.logger import CPLog
from couchpotato.core.providers.nzb.base import NZBProvider from couchpotato.core.providers.nzb.base import NZBProvider
from couchpotato.environment import Env from couchpotato.environment import Env
@ -22,7 +21,7 @@ class FTDWorld(NZBProvider):
'login': 'http://ftdworld.net/index.php', 'login': 'http://ftdworld.net/index.php',
} }
http_time_between_calls = 1 #seconds http_time_between_calls = 3 #seconds
cat_ids = [ cat_ids = [
([4, 11], ['dvdr']), ([4, 11], ['dvdr']),
@ -33,11 +32,19 @@ class FTDWorld(NZBProvider):
def search(self, movie, quality): def search(self, movie, quality):
results = []
if self.isDisabled(): if self.isDisabled():
return results return []
results = []
for title in possibleTitles(getTitle(movie['library'])):
results.extend(self._search(title, movie, quality))
return self.removeDuplicateResults(results)
def _search(self, title, movie, quality):
results = []
q = '%s %s' % (simplifyString(getTitle(movie['library'])), movie['library']['year']) q = '"%s" %s' % (title, movie['library']['year'])
params = { params = {
'ctitle': q, 'ctitle': q,
@ -81,7 +88,7 @@ class FTDWorld(NZBProvider):
'download': self.loginDownload, 'download': self.loginDownload,
'detail_url': self.urls['detail'] % nzb_id, 'detail_url': self.urls['detail'] % nzb_id,
'description': '', 'description': '',
'score': (tryInt(up.attrs['title'].split(' ')[0]) * 3) - (tryInt(down.attrs['title'].split(' ')[0]) * 3), 'score': (tryInt(up.attrs['title'].split(' ')[0]) * 3) - (tryInt(down.attrs['title'].split(' ')[0]) * 3) if up else 0,
} }
is_correct_movie = fireEvent('searcher.correct_movie', is_correct_movie = fireEvent('searcher.correct_movie',

20
couchpotato/core/providers/nzb/nzbclub/main.py

@ -1,12 +1,10 @@
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from couchpotato.core.event import fireEvent from couchpotato.core.event import fireEvent
from couchpotato.core.helpers.encoding import toUnicode, tryUrlencode, \ from couchpotato.core.helpers.encoding import toUnicode, tryUrlencode
simplifyString
from couchpotato.core.helpers.rss import RSS from couchpotato.core.helpers.rss import RSS
from couchpotato.core.helpers.variable import tryInt, getTitle from couchpotato.core.helpers.variable import tryInt, getTitle, possibleTitles
from couchpotato.core.logger import CPLog from couchpotato.core.logger import CPLog
from couchpotato.core.providers.nzb.base import NZBProvider from couchpotato.core.providers.nzb.base import NZBProvider
from couchpotato.environment import Env
from dateutil.parser import parse from dateutil.parser import parse
import time import time
import xml.etree.ElementTree as XMLTree import xml.etree.ElementTree as XMLTree
@ -24,11 +22,19 @@ class NZBClub(NZBProvider, RSS):
def search(self, movie, quality): def search(self, movie, quality):
results = []
if self.isDisabled(): if self.isDisabled():
return results return []
results = []
for title in possibleTitles(getTitle(movie['library'])):
results.extend(self._search(title, movie, quality))
return self.removeDuplicateResults(results)
def _search(self, title, movie, quality):
results = []
q = '"%s %s" %s' % (simplifyString(getTitle(movie['library'])), movie['library']['year'], quality.get('identifier')) q = '"%s %s" %s' % (title, movie['library']['year'], quality.get('identifier'))
params = { params = {
'q': q, 'q': q,

23
couchpotato/core/providers/nzb/nzbindex/main.py

@ -1,9 +1,8 @@
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from couchpotato.core.event import fireEvent from couchpotato.core.event import fireEvent
from couchpotato.core.helpers.encoding import toUnicode, tryUrlencode, \ from couchpotato.core.helpers.encoding import toUnicode, tryUrlencode
simplifyString
from couchpotato.core.helpers.rss import RSS from couchpotato.core.helpers.rss import RSS
from couchpotato.core.helpers.variable import tryInt, getTitle from couchpotato.core.helpers.variable import tryInt, getTitle, possibleTitles
from couchpotato.core.logger import CPLog from couchpotato.core.logger import CPLog
from couchpotato.core.providers.nzb.base import NZBProvider from couchpotato.core.providers.nzb.base import NZBProvider
from couchpotato.environment import Env from couchpotato.environment import Env
@ -27,11 +26,19 @@ class NzbIndex(NZBProvider, RSS):
def search(self, movie, quality): def search(self, movie, quality):
results = []
if self.isDisabled(): if self.isDisabled():
return results return []
results = []
for title in possibleTitles(getTitle(movie['library'])):
results.extend(self._search(title, movie, quality))
return self.removeDuplicateResults(results)
q = '"%s %s" %s' % (simplifyString(getTitle(movie['library'])), movie['library']['year'], quality.get('identifier')) def _search(self, title, movie, quality):
results = []
q = '"%s" %s %s' % (title, movie['library']['year'], quality.get('identifier'))
arguments = tryUrlencode({ arguments = tryUrlencode({
'q': q, 'q': q,
'age': Env.setting('retention', 'nzb'), 'age': Env.setting('retention', 'nzb'),
@ -45,9 +52,9 @@ class NzbIndex(NZBProvider, RSS):
}) })
url = "%s?%s" % (self.urls['api'], arguments) url = "%s?%s" % (self.urls['api'], arguments)
cache_key = 'nzbindex.%s.%s' % (movie['library']['identifier'], quality.get('identifier')) cache_key = 'nzbindex.%s.%s' % (movie['library']['identifier'], q)
data = self.getCache(cache_key, url) data = self.getCache(cache_key, url)
if data: if data:
try: try:
try: try:

3
couchpotato/core/providers/nzb/nzbsrus/main.py

@ -46,8 +46,7 @@ class Nzbsrus(NZBProvider, RSS):
url = "%s&%s&%s" % (self.urls['search'], arguments , cat_id_string) url = "%s&%s&%s" % (self.urls['search'], arguments , cat_id_string)
cache_key = 'nzbsrus_1.%s.%s' % (movie['library'].get('identifier'), cat_id_string) cache_key = 'nzbsrus.%s.%s' % (movie['library'].get('identifier'), cat_id_string)
single_cat = True
data = self.getCache(cache_key, url, cache_timeout = 1800, headers = {'User-Agent': Env.getIdentifier()}) data = self.getCache(cache_key, url, cache_timeout = 1800, headers = {'User-Agent': Env.getIdentifier()})
if data: if data:

18
couchpotato/core/providers/nzb/omgwtfnzbs/main.py

@ -1,9 +1,8 @@
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from couchpotato.core.event import fireEvent from couchpotato.core.event import fireEvent
from couchpotato.core.helpers.encoding import toUnicode, tryUrlencode, \ from couchpotato.core.helpers.encoding import toUnicode, tryUrlencode
simplifyString
from couchpotato.core.helpers.rss import RSS from couchpotato.core.helpers.rss import RSS
from couchpotato.core.helpers.variable import tryInt, getTitle from couchpotato.core.helpers.variable import tryInt, getTitle, possibleTitles
from couchpotato.core.logger import CPLog from couchpotato.core.logger import CPLog
from couchpotato.core.providers.nzb.base import NZBProvider from couchpotato.core.providers.nzb.base import NZBProvider
from dateutil.parser import parse from dateutil.parser import parse
@ -33,12 +32,19 @@ class OMGWTFNZBs(NZBProvider, RSS):
def search(self, movie, quality): def search(self, movie, quality):
pre_releases = fireEvent('quality.pre_releases', single = True) pre_releases = fireEvent('quality.pre_releases', single = True)
if self.isDisabled() or quality['identifier'] in pre_releases:
return []
results = [] results = []
if self.isDisabled() or quality['identifier'] in pre_releases: for title in possibleTitles(getTitle(movie['library'])):
return results results.extend(self._search(title, movie, quality))
return self.removeDuplicateResults(results)
def _search(self, title, movie, quality):
results = []
q = '%s %s' % (simplifyString(getTitle(movie['library'])), movie['library']['year']) q = '%s %s' % (title, movie['library']['year'])
params = { params = {
'search': q, 'search': q,

2
couchpotato/core/providers/torrent/publichd/__init__.py

@ -10,7 +10,7 @@ config = [{
'tab': 'searcher', 'tab': 'searcher',
'subtab': 'torrent_providers', 'subtab': 'torrent_providers',
'name': 'PublicHD', 'name': 'PublicHD',
'description': 'Public Torrent site with only HD content. See <a href="https://publichd.eu/">PublicHD</a>', 'description': 'Public Torrent site with only HD content. See <a href="https://publichd.se/">PublicHD</a>',
'options': [ 'options': [
{ {
'name': 'enabled', 'name': 'enabled',

6
couchpotato/core/providers/torrent/publichd/main.py

@ -14,9 +14,9 @@ log = CPLog(__name__)
class PublicHD(TorrentProvider): class PublicHD(TorrentProvider):
urls = { urls = {
'test': 'https://publichd.eu', 'test': 'https://publichd.se',
'detail': 'https://publichd.eu/index.php?page=torrent-details&id=%s', 'detail': 'https://publichd.se/index.php?page=torrent-details&id=%s',
'search': 'https://publichd.eu/index.php', 'search': 'https://publichd.se/index.php',
} }
http_time_between_calls = 0 http_time_between_calls = 0

3
couchpotato/core/providers/torrent/torrentleech/main.py

@ -32,6 +32,7 @@ class TorrentLeech(TorrentProvider):
] ]
http_time_between_calls = 1 #seconds http_time_between_calls = 1 #seconds
cat_backup_id = None
def search(self, movie, quality): def search(self, movie, quality):
@ -61,6 +62,7 @@ class TorrentLeech(TorrentProvider):
link = result.find('td', attrs = {'class' : 'name'}).find('a') link = result.find('td', attrs = {'class' : 'name'}).find('a')
url = result.find('td', attrs = {'class' : 'quickdownload'}).find('a') url = result.find('td', attrs = {'class' : 'quickdownload'}).find('a')
details = result.find('td', attrs = {'class' : 'name'}).find('a')
new = { new = {
'id': link['href'].replace('/torrent/', ''), 'id': link['href'].replace('/torrent/', ''),
@ -70,6 +72,7 @@ class TorrentLeech(TorrentProvider):
'description': '', 'description': '',
'provider': self.getName(), 'provider': self.getName(),
'url': self.urls['download'] % url['href'], 'url': self.urls['download'] % url['href'],
'detail_url': self.urls['download'] % details['href'],
'download': self.loginDownload, 'download': self.loginDownload,
'size': self.parseSize(result.find_all('td')[4].string), 'size': self.parseSize(result.find_all('td')[4].string),
'seeders': tryInt(result.find('td', attrs = {'class' : 'seeders'}).string), 'seeders': tryInt(result.find('td', attrs = {'class' : 'seeders'}).string),

2
couchpotato/core/settings/model.py

@ -100,7 +100,7 @@ class Release(Entity):
movie = ManyToOne('Movie') movie = ManyToOne('Movie')
status = ManyToOne('Status') status = ManyToOne('Status')
quality = ManyToOne('Quality') quality = ManyToOne('Quality')
files = ManyToMany('File', cascade = 'all, delete-orphan', single_parent = True) files = ManyToMany('File')
info = OneToMany('ReleaseInfo', cascade = 'all, delete-orphan') info = OneToMany('ReleaseInfo', cascade = 'all, delete-orphan')
def to_dict(self, deep = {}, exclude = []): def to_dict(self, deep = {}, exclude = []):

Loading…
Cancel
Save