Initial trailer support

This commit is contained in:
Ruud
2012-02-19 12:48:54 +01:00
parent d03f711d69
commit 3e2d4c5d7b
4 changed files with 92 additions and 22 deletions
@@ -0,0 +1,34 @@
from .main import Trailer
def start():
return Trailer()
config = [{
'name': 'trailer',
'groups': [
{
'tab': 'metadata',
'name': 'trailer',
'options': [
{
'name': 'enabled',
'label': 'Search and download trailers',
'default': False,
'type': 'enabler',
},
{
'name': 'quality',
'default': '720p',
'type': 'dropdown',
'values': [('1080P', '1080p'), ('720P', '720p'), ('480P', '480p')],
},
{
'name': 'automatic',
'default': False,
'type': 'bool',
'description': 'Automaticly search & download for movies in library',
},
],
},
],
}]
+32
View File
@@ -0,0 +1,32 @@
from couchpotato.core.event import addEvent, fireEvent
from couchpotato.core.helpers.variable import getExt
from couchpotato.core.logger import CPLog
from couchpotato.core.plugins.base import Plugin
import os
log = CPLog(__name__)
class Trailer(Plugin):
def __init__(self):
addEvent('renamer.after', self.searchSingle)
def searchSingle(self, group):
if self.isDisabled() or len(group['files']['trailer']) > 0: return
trailers = fireEvent('trailer.search', group = group, merge = True)
for trailer in trailers.get(self.conf('quality'), []):
destination = '%s-trailer.%s' % (self.getRootName(group), getExt(trailer))
if not os.path.isfile(destination):
fireEvent('file.download', url = trailer, dest = destination, urlopen_kwargs = {'headers': {'User-Agent': 'Quicktime'}}, single = True)
else:
log.debug('Trailer already exists: %s' % destination)
# Download first and break
break
def getRootName(self, data = {}):
return os.path.join(data['destination_dir'], data['filename'])
@@ -1,5 +1,13 @@
from couchpotato.core.event import addEvent
from couchpotato.core.logger import CPLog
from couchpotato.core.providers.base import Provider from couchpotato.core.providers.base import Provider
log = CPLog(__name__)
class TrailerProvider(Provider): class TrailerProvider(Provider):
type = 'trailer' type = 'trailer'
def __init__(self):
addEvent('trailer.search', self.search)
@@ -1,4 +1,5 @@
from BeautifulSoup import SoupStrainer, BeautifulSoup from BeautifulSoup import SoupStrainer, BeautifulSoup
from couchpotato.core.helpers.variable import mergeDicts
from couchpotato.core.logger import CPLog from couchpotato.core.logger import CPLog
from couchpotato.core.providers.trailer.base import TrailerProvider from couchpotato.core.providers.trailer.base import TrailerProvider
from string import letters, digits from string import letters, digits
@@ -16,47 +17,40 @@ class HDTrailers(TrailerProvider):
} }
providers = ['apple.ico', 'yahoo.ico', 'moviefone.ico', 'myspace.ico', 'favicon.ico'] providers = ['apple.ico', 'yahoo.ico', 'moviefone.ico', 'myspace.ico', 'favicon.ico']
def find(self, movie): def search(self, group):
movie_name = movie['library']['titles'][0]['title'] movie_name = group['library']['titles'][0]['title']
url = self.url['api'] % self.movieUrlName(movie_name) url = self.urls['api'] % self.movieUrlName(movie_name)
try: data = self.getCache('hdtrailers.%s' % group['library']['identifier'], url)
data = self.urlopen(url)
except: result_data = {}
return {}
p480 = []
p720 = []
p1080 = []
did_alternative = False did_alternative = False
for provider in self.providers: for provider in self.providers:
results = self.findByProvider(data, provider) results = self.findByProvider(data, provider)
# Find alternative # Find alternative
if results.get('404') and not did_alternative: if results.get('404') and not did_alternative:
results = self.findViaAlternative(movie_name) results = self.findViaAlternative(group)
did_alternative = True did_alternative = True
p480.extend(results.get('480p')) result_data = mergeDicts(result_data, results)
p720.extend(results.get('720p'))
p1080.extend(results.get('1080p'))
return {'480p':p480, '720p':p720, '1080p':p1080} return result_data
def findViaAlternative(self, movie): def findViaAlternative(self, group):
results = {'480p':[], '720p':[], '1080p':[]} results = {'480p':[], '720p':[], '1080p':[]}
url = "%s?%s" % (self.url['backup'], urlencode({'s':movie})) movie_name = group['library']['titles'][0]['title']
try:
data = self.urlopen(url) url = "%s?%s" % (self.url['backup'], urlencode({'s':movie_name}))
except: data = self.getCache('hdtrailers.alt.%s' % group['library']['identifier'], url)
return results
try: try:
tables = SoupStrainer('div') tables = SoupStrainer('div')
html = BeautifulSoup(data, parseOnlyThese = tables) html = BeautifulSoup(data, parseOnlyThese = tables)
result_table = html.findAll('h2', text = re.compile(movie)) result_table = html.findAll('h2', text = re.compile(movie_name))
for h2 in result_table: for h2 in result_table:
if 'trailer' in h2.lower(): if 'trailer' in h2.lower():
@@ -88,6 +82,8 @@ class HDTrailers(TrailerProvider):
break break
if 'trailer' in trtext and not 'clip' in trtext and provider in trtext: if 'trailer' in trtext and not 'clip' in trtext and provider in trtext:
nr = 0 nr = 0
if 'trailer' not in tr.find('span', 'standardTrailerName').text.lower():
continue
resolutions = tr.findAll('td', attrs = {'class':'bottomTableResolution'}) resolutions = tr.findAll('td', attrs = {'class':'bottomTableResolution'})
for res in resolutions: for res in resolutions:
results[str(res.a.contents[0])].insert(0, res.a['href']) results[str(res.a.contents[0])].insert(0, res.a['href'])