|
|
|
from couchpotato.core.logger import CPLog
|
|
|
|
from couchpotato.core.plugins.base import Plugin
|
|
|
|
from couchpotato.environment import Env
|
|
|
|
from urllib2 import URLError
|
|
|
|
import math
|
|
|
|
import re
|
|
|
|
import socket
|
|
|
|
import time
|
|
|
|
import urllib2
|
|
|
|
|
|
|
|
log = CPLog(__name__)
|
|
|
|
|
|
|
|
|
|
|
|
class Provider(Plugin):
|
|
|
|
|
|
|
|
type = None # movie, nzb, torrent, subtitle, trailer
|
|
|
|
time_between_searches = 10 # Default timeout for url requests
|
|
|
|
|
|
|
|
last_use = 0
|
|
|
|
last_available_check = 0
|
|
|
|
is_available = 0
|
|
|
|
|
|
|
|
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):
|
|
|
|
log.debug('Setting cache %s' % cache_key)
|
|
|
|
Env.get('cache').set(cache_key, value)
|
|
|
|
|
|
|
|
def isAvailable(self, test_url):
|
|
|
|
|
|
|
|
if Env.get('debug'): return True
|
|
|
|
|
|
|
|
now = time.time()
|
|
|
|
|
|
|
|
if self.last_available_check < now - 900:
|
|
|
|
self.last_available_check = now
|
|
|
|
try:
|
|
|
|
self.urlopen(test_url, 30)
|
|
|
|
self.is_available = True
|
|
|
|
except (IOError, URLError):
|
|
|
|
log.error('%s unavailable, trying again in an 15 minutes.' % self.name)
|
|
|
|
self.is_available = False
|
|
|
|
|
|
|
|
return self.is_available
|
|
|
|
|
|
|
|
def urlopen(self, url, timeout = 10, username = None, password = None):
|
|
|
|
|
|
|
|
socket.setdefaulttimeout(timeout)
|
|
|
|
self.wait()
|
|
|
|
|
|
|
|
try:
|
|
|
|
log.info('Opening url: %s' % url)
|
|
|
|
if username and password:
|
|
|
|
passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
|
|
|
|
passman.add_password(None, url, username, password)
|
|
|
|
authhandler = urllib2.HTTPBasicAuthHandler(passman)
|
|
|
|
opener = urllib2.build_opener(authhandler)
|
|
|
|
data = opener.open(url).read()
|
|
|
|
else:
|
|
|
|
data = urllib2.urlopen(url).read()
|
|
|
|
|
|
|
|
except IOError, e:
|
|
|
|
log.debug(e)
|
|
|
|
data = ''
|
|
|
|
|
|
|
|
self.last_use = time.time()
|
|
|
|
|
|
|
|
return data
|
|
|
|
|
|
|
|
def wait(self):
|
|
|
|
now = time.time()
|
|
|
|
wait = math.ceil(self.last_use - now + self.time_between_searches)
|
|
|
|
|
|
|
|
if wait > 0:
|
|
|
|
log.debug('Waiting for %s, %d seconds' % (self.getName(), wait))
|
|
|
|
time.sleep(self.last_use - now + self.time_between_searches)
|
|
|
|
|
|
|
|
|
|
|
|
class MovieProvider(Provider):
|
|
|
|
type = 'movie'
|
|
|
|
|
|
|
|
|
|
|
|
class YarrProvider(Provider):
|
|
|
|
|
|
|
|
cat_ids = []
|
|
|
|
|
|
|
|
sizeGb = ['gb', 'gib']
|
|
|
|
sizeMb = ['mb', 'mib']
|
|
|
|
sizeKb = ['kb', 'kib']
|
|
|
|
|
|
|
|
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 False
|
|
|
|
|
|
|
|
def found(self, new):
|
|
|
|
log.info('Found: score(%(score)s): %(name)s' % new)
|
|
|
|
|
|
|
|
|
|
|
|
class NZBProvider(YarrProvider):
|
|
|
|
type = 'nzb'
|
|
|
|
|
|
|
|
time_between_searches = 10 # Seconds
|
|
|
|
|
|
|
|
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'
|