Switched event system (again)
This commit is contained in:
1 parent
fd5a41435b
commit
f9523444f4
24 files changed
+580
-142
No files matched your search
@@ -0,0 +1,57 @@
|
||||
from couchpotato.core.helpers import latinToAscii
|
||||
from couchpotato.core.logger import CPLog
|
||||
from string import ascii_letters, digits
|
||||
import re
|
||||
import unicodedata
|
||||
import xml.etree.ElementTree as XMLTree
|
||||
|
||||
log = CPLog(__name__)
|
||||
|
||||
class Provider():
|
||||
|
||||
type = None # movie, nzb, torrent, subtitle, trailer
|
||||
timeout = 10 # Default timeout for url requests
|
||||
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
def toSaveString(self, string):
|
||||
string = latinToAscii(string)
|
||||
string = ''.join((c for c in unicodedata.normalize('NFD', unicode(string)) if unicodedata.category(c) != 'Mn'))
|
||||
safe_chars = ascii_letters + digits + '_ -.,\':!?'
|
||||
r = ''.join([char if char in safe_chars else ' ' for char in string])
|
||||
return re.sub('\s+' , ' ', r)
|
||||
|
||||
def toSearchString(self, string):
|
||||
string = latinToAscii(string)
|
||||
string = ''.join((c for c in unicodedata.normalize('NFD', unicode(string)) if unicodedata.category(c) != 'Mn'))
|
||||
safe_chars = ascii_letters + digits + ' \''
|
||||
r = ''.join([char if char in safe_chars else ' ' for char in string])
|
||||
return re.sub('\s+' , ' ', r).replace('\'s', 's').replace('\'', ' ')
|
||||
|
||||
def gettextelements(self, xml, path):
|
||||
''' Find elements and return tree'''
|
||||
|
||||
textelements = []
|
||||
try:
|
||||
elements = xml.findall(path)
|
||||
except:
|
||||
return
|
||||
for element in elements:
|
||||
textelements.append(element.text)
|
||||
return textelements
|
||||
|
||||
def gettextelement(self, xml, path):
|
||||
''' Find element and return text'''
|
||||
|
||||
try:
|
||||
return xml.find(path).text
|
||||
except:
|
||||
return
|
||||
|
||||
def getItems(self, data, path = 'channel/item'):
|
||||
try:
|
||||
return XMLTree.parse(data).findall(path)
|
||||
except Exception, e:
|
||||
log.error('Error parsing RSS. %s' % e)
|
||||
return []
|
||||
@@ -0,0 +1,4 @@
|
||||
def start():
|
||||
pass
|
||||
|
||||
config = []
|
||||
@@ -0,0 +1,83 @@
|
||||
from couchpotato.core.event import addEvent
|
||||
from couchpotato.core.logger import CPLog
|
||||
from couchpotato.core.providers.base import Provider
|
||||
from imdb import IMDb
|
||||
|
||||
log = CPLog(__name__)
|
||||
|
||||
class IMDB(Provider):
|
||||
|
||||
type = 'movie'
|
||||
|
||||
def __init__(self):
|
||||
|
||||
addEvent('provider.movie.search', self.search)
|
||||
|
||||
self.p = IMDb('http')
|
||||
|
||||
|
||||
def search(self):
|
||||
print 'search'
|
||||
|
||||
def conf(self, option):
|
||||
return self.config.get('IMDB', option)
|
||||
|
||||
def find(self, q, limit = 8, alternative = True):
|
||||
''' Find movie by name '''
|
||||
|
||||
log.info('IMDB - Searching for movie: %s' % q)
|
||||
|
||||
r = self.p.search_movie(q)
|
||||
|
||||
return self.toResults(r, limit)
|
||||
|
||||
def toResults(self, r, limit = 8, one = False):
|
||||
results = []
|
||||
|
||||
if one:
|
||||
new = self.feedItem()
|
||||
new.imdb = 'tt' + r.movieID
|
||||
new.name = self.toSaveString(r['title'])
|
||||
try:
|
||||
new.year = r['year']
|
||||
except:
|
||||
new.year = ''
|
||||
|
||||
return new
|
||||
else :
|
||||
nr = 0
|
||||
for movie in r:
|
||||
results.append(self.toResults(movie, one = True))
|
||||
nr += 1
|
||||
if nr == limit:
|
||||
break
|
||||
|
||||
return results
|
||||
|
||||
def findById(self, id):
|
||||
''' Find movie by TheMovieDB ID '''
|
||||
|
||||
return []
|
||||
|
||||
|
||||
def findByImdbId(self, id, details = False):
|
||||
''' Find movie by IMDB ID '''
|
||||
|
||||
log.info('IMDB - Searching for movie: %s' % str(id))
|
||||
|
||||
r = self.p.get_movie(id.replace('tt', ''))
|
||||
|
||||
if not details:
|
||||
return self.toResults(r, one = True)
|
||||
else:
|
||||
self.p.update(r)
|
||||
self.p.update(r, info = 'release dates')
|
||||
self.p.update(r, info = 'taglines')
|
||||
return r
|
||||
|
||||
def get_IMDb_instance(self):
|
||||
return IMDb('http')
|
||||
|
||||
|
||||
def findReleaseDate(self, movie):
|
||||
pass
|
||||
@@ -1,3 +1,8 @@
|
||||
from couchpotato.core.providers.tmdb.main import TMDB
|
||||
|
||||
def start():
|
||||
return TMDB()
|
||||
|
||||
config = [{
|
||||
'name': 'TheMovieDB',
|
||||
'tab': 'providers',
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
from __future__ import with_statement
|
||||
from couchpotato.core.event import addEvent
|
||||
from couchpotato.core.logger import CPLog
|
||||
from couchpotato.core.providers.base import Provider
|
||||
from couchpotato.environment import Env
|
||||
from urllib import quote_plus
|
||||
import urllib2
|
||||
|
||||
log = CPLog(__name__)
|
||||
|
||||
class TMDB(Provider):
|
||||
"""Api for theMovieDb"""
|
||||
|
||||
type = 'movie'
|
||||
apiUrl = 'http://api.themoviedb.org/2.1'
|
||||
imageUrl = 'http://hwcdn.themoviedb.org'
|
||||
|
||||
def __init__(self):
|
||||
addEvent('provider.movie.search', self.search)
|
||||
|
||||
def conf(self, attr):
|
||||
return Env.setting(attr, 'TheMovieDB')
|
||||
|
||||
def search(self, q, limit = 8, alternative = True):
|
||||
''' Find movie by name '''
|
||||
|
||||
if self.isDisabled():
|
||||
return False
|
||||
|
||||
log.debug('TheMovieDB - Searching for movie: %s' % q)
|
||||
|
||||
url = "%s/%s/%s/xml/%s/%s" % (self.apiUrl, 'Movie.search', 'en', self.conf('api_key'), quote_plus(self.toSearchString(q)))
|
||||
|
||||
log.info('Searching: %s' % url)
|
||||
|
||||
data = urllib2.urlopen(url)
|
||||
|
||||
return self.parseXML(data, limit, alternative = alternative)
|
||||
|
||||
def parseXML(self, data, limit, alternative = True):
|
||||
if data:
|
||||
log.debug('TheMovieDB - Parsing RSS')
|
||||
try:
|
||||
xml = self.getItems(data, 'movies/movie')
|
||||
|
||||
results = []
|
||||
nr = 0
|
||||
for movie in xml:
|
||||
id = int(self.gettextelement(movie, "id"))
|
||||
|
||||
name = self.gettextelement(movie, "name")
|
||||
imdb = self.gettextelement(movie, "imdb_id")
|
||||
year = str(self.gettextelement(movie, "released"))[:4]
|
||||
|
||||
# 1900 is the same as None
|
||||
if year == '1900':
|
||||
year = 'None'
|
||||
|
||||
results.append({
|
||||
'id': id,
|
||||
'name': self.toSaveString(name),
|
||||
'imdb': imdb,
|
||||
'year': year
|
||||
})
|
||||
|
||||
alternativeName = self.gettextelement(movie, "alternative_name")
|
||||
if alternativeName and alternative:
|
||||
if alternativeName.lower() != name.lower() and alternativeName.lower() != 'none' and alternativeName != None:
|
||||
results.append({
|
||||
'id': id,
|
||||
'name': self.toSaveString(alternativeName),
|
||||
'imdb': imdb,
|
||||
'year': year
|
||||
})
|
||||
|
||||
nr += 1
|
||||
if nr == limit:
|
||||
break
|
||||
|
||||
#log.info('TheMovieDB - Found: %s' % results)
|
||||
return results
|
||||
except SyntaxError:
|
||||
log.error('TheMovieDB - Failed to parse XML response from TheMovieDb')
|
||||
return False
|
||||
|
||||
|
||||
def isDisabled(self):
|
||||
if self.conf('api_key') == '':
|
||||
log.error('TheMovieDB - No API key provided for TheMovieDB')
|
||||
True
|
||||
else:
|
||||
False
|
||||
Reference in new issue
Block a user