""" Copyright (C) 2017 kodistuff1 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . """ import json, urllib from urllib2 import HTTPError from urlresolver import common from urlresolver.common import i18n from urlresolver.resolver import UrlResolver, ResolverError class RapidgatorResolver(UrlResolver): name = 'Rapidgator' domains = ['rapidgator.net', 'rg.to'] pattern = '(?://|\.)(rapidgator\.net|rg\.to)/+file/+([a-z0-9]+)(?=[/?#]|$)' @classmethod def _is_enabled(cls): return cls.get_setting('enabled') == 'true' and cls.get_setting('login') == 'true' and cls.get_setting('premium') == 'true' def __init__(self): self.net = common.Net() self.scheme = 'https' self.api_base = '%s://rapidgator.net/api' % (self.scheme) self._session_id = '' def login(self): if not (self.get_setting('login') == 'true'): return False self._session_id = self.get_setting('session_id') return True def logout(self): self._session_id = '' self.set_setting('session_id', '') def api_call(self, method, data, http='GET', session=True, refresh=True): loop = 0 while loop < 2: loop += 1 if session: data.update({'sid': self._session_id}) try: if http == 'GET': content = self.net.http_GET(self.api_base + method + '?' + urllib.urlencode(data)).content elif http == 'HEAD': content = self.net.http_HEAD(self.api_base + method + '?' + urllib.urlencode(data)).content elif http == 'POST': content = self.net.http_POST(self.api_base + method, urllib.urlencode(data)).content else: raise ResolverError(self.name + ' Bad Request') content = json.loads(content) status = int(content['response_status']) response = content['response'] except HTTPError as e: status, response = e.code, [] except ResolverError: raise except: raise ResolverError(self.name + ' Bad Response') if status == 200: return response if session and refresh and status in [401,402]: # only actually seen 401, although 402 seems plausible self.refresh_session() continue raise ResolverError(self.name + ' HTTP ' + str(status) + ' Error') def refresh_session(self): if not (self.get_setting('login') == 'true'): return False username, password = self.get_setting('username'), self.get_setting('password') if not (username and password): raise ResolverError(self.name + ' username & password required') data = {'username': username, 'password': password} try: response = self.api_call('/user/login', data, http='POST', session=False) self._session_id = response['session_id'] except: self._session_id = '' self.set_setting('session_id', self._session_id) return True if self._session_id else False def get_media_url(self, host, media_id): if not (self.get_setting('premium') == 'true'): raise ResolverError(self.name + ' premium account required') data = {'url': self.get_url(host, media_id)} response = self.api_call('/file/download', data) if 'delay' in response and response['delay'] and response['delay'] != '0': raise ResolverError(self.name + ' premium account expired') if 'url' not in response: raise ResolverError(self.name + ' Bad Response') return response['url'].replace('\\', '') def get_url(self, host, media_id): return '%s://%s/file/%s' % (self.scheme, host, media_id) @classmethod def get_settings_xml(cls): xml = super(cls, cls).get_settings_xml(include_login=False) xml.append('' % (cls.__name__, i18n('login'))) xml.append('' % (cls.__name__, i18n('username'))) xml.append('' % (cls.__name__, i18n('password'))) xml.append('' % (cls.__name__)) xml.append('' % (cls.__name__)) return xml