3
from urllib import urlencode
4
from urllib2 import urlopen, URLError, HTTPError
5
from logging import getLogger
6
from flexget.plugin import register_plugin, get_plugin_by_name, PluginError, DependencyError
7
from flexget import validator
9
log = getLogger('pyload')
12
import simplejson as json
17
raise DependencyError(issued_by='pyload', missing='simplejson',
18
message='pyload requires either simplejson module or python > 2.5')
21
class PluginPyLoad(object):
23
Parse feed content or url for hoster links and adds them to pyLoad.
28
api: http://localhost:8000/api
32
folder: desired_folder
39
Default values for the config elements::
42
api: http://localhost:8000/api
50
__author__ = 'http://pyload.org'
53
DEFAULT_API = 'http://localhost:8000/api'
57
DEFAULT_PARSE_URL = False
58
DEFAULT_MULTIPLE_HOSTER = True
64
"""Return config validator"""
65
root = validator.factory()
66
root.accept('boolean')
67
advanced = root.accept('dict')
68
advanced.accept('text', key='api')
69
advanced.accept('text', key='username')
70
advanced.accept('text', key='password')
71
advanced.accept('text', key='folder')
72
advanced.accept('boolean', key='queue')
73
advanced.accept('boolean', key='parse_url')
74
advanced.accept('boolean', key='multiple_hoster')
75
advanced.accept('list', key='hoster').accept('text')
78
def on_process_start(self, feed, config):
80
set_plugin = get_plugin_by_name('set')
81
set_plugin.instance.register_keys({'queue': 'boolean'})
83
def on_feed_output(self, feed, config):
84
if not config.get('enabled', True):
89
self.add_entries(feed, config)
91
def add_entries(self, feed, config):
92
"""Adds accepted entries"""
95
self.check_login(feed, config)
97
raise PluginError('pyLoad not reachable', log)
101
raise PluginError('Unknown error: %s' % str(e), log)
103
api = config.get('api', self.DEFAULT_API)
104
hoster = config.get('hoster', self.DEFAULT_HOSTER)
105
folder = config.get('folder', self.DEFAULT_FOLDER)
107
for entry in feed.accepted:
108
# bunch of urls now going to check
109
content = entry['description'] + " " + entry['url']
110
content = json.dumps(content.encode("utf8"))
112
url = json.dumps(entry['url']) if config.get('parse_url', self.DEFAULT_PARSE_URL) else "''"
114
log.debug("Parsing url %s" % url)
116
result = query_api(api, "parseURLs", {"html": content, "url": url, "session": self.session})
118
# parsed { plugins: [urls] }
119
parsed = json.loads(result.read())
123
# check for preferred hoster
126
urls.extend(parsed[name])
127
if not config.get('multihoster', self.DEFAULT_MULTIPLE_HOSTER):
130
# no preferred hoster, add all recognized plugins
132
for name, purls in parsed.iteritems():
133
if name != "BasePlugin":
136
if feed.manager.options.test:
137
log.info('Would add `%s` to pyload' % urls)
142
log.info("No suited urls in entry %s" % entry['title'])
145
log.debug("Add %d urls to pyLoad" % len(urls))
148
dest = 1 if config.get('queue', self.DEFAULT_QUEUE) else 0 # Destination.Queue = 1
149
post = {'name': "'%s'" % entry['title'],
152
'session': self.session}
154
pid = query_api(api, "addPackage", post).read()
155
log.debug('added package pid: %s' % pid)
158
# set folder with api
159
data = {'folder': folder}
160
query_api(api, "setPackageData", {'pid': pid, 'data': data, 'session': self.session})
163
feed.fail(entry, str(e))
165
def check_login(self, feed, config):
166
url = config.get('api', self.DEFAULT_API)
170
post = {'username': config['username'], 'password': config['password']}
171
result = query_api(url, "login", post)
172
response = json.loads(result.read())
174
raise PluginError('Login failed', log)
175
self.session = response.replace('"', '')
178
query_api(url, 'getServerVersion', {'session': self.session})
180
if e.code == 403: # Forbidden
182
return self.check_login(feed, config)
184
raise PluginError('HTTP Error %s' % e, log)
187
def query_api(url, method, post=None):
189
return urlopen(url.rstrip("/") + "/" + method.strip("/"), urlencode(post) if post else None)
192
raise PluginError('Internal API Error', log)
195
register_plugin(PluginPyLoad, 'pyload', api_ver=2)