You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
141 lines
3.4 KiB
141 lines
3.4 KiB
from couchpotato.core.event import addEvent
|
|
from couchpotato.core.logger import CPLog
|
|
from couchpotato.core.plugins.base import Plugin
|
|
from couchpotato.environment import Env
|
|
from urlparse import urlparse
|
|
import re
|
|
import time
|
|
|
|
log = CPLog(__name__)
|
|
|
|
|
|
class Provider(Plugin):
|
|
|
|
type = None # movie, nzb, torrent, subtitle, trailer
|
|
http_time_between_calls = 10 # Default timeout for url requests
|
|
|
|
last_available_check = {}
|
|
is_available = {}
|
|
|
|
def getCache(self, cache_key):
|
|
cache = Env.get('cache').get(cache_key)
|
|
if cache:
|
|
log.debug('Getting cache %s' % cache_key)
|
|
return cache
|
|
|
|
def setCache(self, cache_key, value, timeout = 300):
|
|
log.debug('Setting cache %s' % cache_key)
|
|
Env.get('cache').set(cache_key, value, timeout)
|
|
|
|
def isAvailable(self, test_url):
|
|
|
|
if Env.get('debug'): return True
|
|
|
|
now = time.time()
|
|
host = urlparse(test_url).hostname
|
|
|
|
if self.last_available_check.get(host) < now - 900:
|
|
self.last_available_check[host] = now
|
|
|
|
data = self.urlopen(test_url, 30)
|
|
if not data:
|
|
log.error('%s unavailable, trying again in an 15 minutes.' % self.name)
|
|
self.is_available[host] = False
|
|
else:
|
|
self.is_available[host] = True
|
|
|
|
return self.is_available[host]
|
|
|
|
|
|
class MovieProvider(Provider):
|
|
type = 'movie'
|
|
|
|
|
|
class YarrProvider(Provider):
|
|
|
|
cat_ids = []
|
|
|
|
sizeGb = ['gb', 'gib']
|
|
sizeMb = ['mb', 'mib']
|
|
sizeKb = ['kb', 'kib']
|
|
|
|
def __init__(self):
|
|
addEvent('provider.belongs_to', self.belongsTo)
|
|
|
|
def belongsTo(self, url, host = None):
|
|
try:
|
|
hostname = urlparse(url).hostname
|
|
download_url = host if host else self.urls['download']
|
|
if hostname in download_url:
|
|
return self
|
|
except:
|
|
log.debug('Url % s doesn\'t belong to %s' % (url, self.getName()))
|
|
|
|
return
|
|
|
|
def parseSize(self, size):
|
|
|
|
sizeRaw = size.lower()
|
|
size = re.sub(r'[^0-9.]', '', size).strip()
|
|
|
|
for s in self.sizeGb:
|
|
if s in sizeRaw:
|
|
return float(size) * 1024
|
|
|
|
for s in self.sizeMb:
|
|
if s in sizeRaw:
|
|
return float(size)
|
|
|
|
for s in self.sizeKb:
|
|
if s in sizeRaw:
|
|
return float(size) / 1024
|
|
|
|
return 0
|
|
|
|
def getCatId(self, identifier):
|
|
|
|
for cats in self.cat_ids:
|
|
ids, qualities = cats
|
|
if identifier in qualities:
|
|
return ids
|
|
|
|
return [self.cat_backup_id]
|
|
|
|
def found(self, new):
|
|
log.info('Found: score(%(score)s): %(name)s' % new)
|
|
|
|
|
|
class NZBProvider(YarrProvider):
|
|
type = 'nzb'
|
|
|
|
def __init__(self):
|
|
super(NZBProvider, self).__init__()
|
|
|
|
addEvent('provider.nzb.search', self.search)
|
|
addEvent('provider.yarr.search', self.search)
|
|
|
|
addEvent('provider.nzb.feed', self.feed)
|
|
|
|
def download(self, url = '', nzb_id = ''):
|
|
return self.urlopen(url)
|
|
|
|
def feed(self):
|
|
return []
|
|
|
|
def search(self, movie, quality):
|
|
return []
|
|
|
|
def calculateAge(self, unix):
|
|
return int(time.time() - unix) / 24 / 60 / 60
|
|
|
|
|
|
class TorrentProvider(YarrProvider):
|
|
type = 'torrent'
|
|
|
|
|
|
class SubtitleProvider(Provider):
|
|
type = 'subtitle'
|
|
|
|
|
|
class TrailerProvider(Provider):
|
|
type = 'trailer'
|
|
|