from base64 import b32decode, b16encode from couchpotato.core.event import addEvent from couchpotato.core.logger import CPLog from couchpotato.core.plugins.base import Plugin import random import re log = CPLog(__name__) class Downloader(Plugin): type = [] torrent_sources = [ 'http://torrage.com/torrent/%s.torrent', 'http://torrage.ws/torrent/%s.torrent', 'http://torcache.net/torrent/%s.torrent', ] def __init__(self): addEvent('download', self.download) addEvent('download.status', self.getAllDownloadStatus) addEvent('download.remove_failed', self.removeFailed) def download(self, data = {}, movie = {}, manual = False, filedata = None): pass def getAllDownloadStatus(self): return False def removeFailed(self, name = {}, nzo_id = {}): return False def isCorrectType(self, item_type): is_correct = item_type in self.type if not is_correct: log.debug("Downloader doesn't support this type") return is_correct def magnetToTorrent(self, magnet_link): torrent_hash = re.findall('urn:btih:([\w]{32,40})', magnet_link)[0].upper() # Convert base 32 to hex if len(torrent_hash) == 32: torrent_hash = b16encode(b32decode(torrent_hash)) sources = self.torrent_sources random.shuffle(sources) for source in sources: try: filedata = self.urlopen(source % torrent_hash, headers = {'Referer': ''}, show_error = False) if 'torcache' in filedata and 'file not found' in filedata.lower(): continue return filedata except: log.debug('Torrent hash "%s" wasn\'t found on: %s', (torrent_hash, source)) log.error('Failed converting magnet url to torrent: %s', (torrent_hash)) return False def isDisabled(self, manual): return not self.isEnabled(manual) def isEnabled(self, manual): d_manual = self.conf('manual', default = False) return super(Downloader, self).isEnabled() and ((d_manual and manual) or (d_manual is False))