diff --git a/CHANGES.md b/CHANGES.md index 2f1f2a1..3b36d47 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -51,6 +51,11 @@ * Update urllib3 release 1.25.6 (4a6c288) to 1.25.7 (37ba61a) +### 0.21.30 (2020-04-30 10:20:00 UTC) + +* Fix Milkie torrent provider breaking changes + + ### 0.21.29 (2020-04-29 02:10:00 UTC) * Change update fallback timezone info file to 2020a diff --git a/sickbeard/providers/milkie.py b/sickbeard/providers/milkie.py index 8091677..0266ba7 100644 --- a/sickbeard/providers/milkie.py +++ b/sickbeard/providers/milkie.py @@ -17,6 +17,8 @@ # You should have received a copy of the GNU General Public License # along with SickGear. If not, see . +from requests import Request + from . import generic from .. import logger from ..helpers import try_int @@ -31,12 +33,15 @@ class MilkieProvider(generic.TorrentProvider): generic.TorrentProvider.__init__(self, 'Milkie') self.url_base = 'https://milkie.cc/' - + self.api = self.url_base + 'api/v1/' - self.urls = {'config_provider_home_uri': self.url_base, - 'login': self.api + 'auth/sessions', 'auth': self.api + 'auth', - 'get': self.api + 'torrents/%s/torrent?key=%s', - 'search': self.api + 'torrents?pi=0&ps=100&query=%s&categories=2&mode=release&t.o=native'} + self.urls = dict( + config_provider_home_uri=self.url_base, + login=self.api + 'auth/sessions', auth=self.api + 'auth', + get=self.api + 'torrents/%s/torrent', + search=self.api + 'torrents?pi=0&ps=100&categories=2&%s', + params=('t.f=0', 'mode=release&t.o=native') + ) self.username, self.email, self.password, self.minseed, self.minleech, self._token, self._dkey = 7 * [None] @@ -47,13 +52,14 @@ class MilkieProvider(generic.TorrentProvider): parse_json=True, logged_in=self.logged_in) def logged_in(self, resp=None): - + self._token = resp and resp.get('token') if self._token: resp = self.get_url(self.urls['auth'], skip_auth=True, headers=dict(Authorization='Bearer %s' % self._token), parse_json=True) - self._dkey = isinstance(resp, dict) and resp.get('user', {}).get('downloadKey') - return bool(self._token) + user = isinstance(resp, dict) and resp.get('user') + self._dkey = user and user.get('apiKey') or user.get('downloadKey') + return bool(self._token) and bool(self._dkey) def _search_provider(self, search_params, **kwargs): @@ -66,10 +72,18 @@ class MilkieProvider(generic.TorrentProvider): for mode in search_params: for search_string in search_params[mode]: search_string = unidecode(search_string) - search_url = self.urls['search'] % search_string - data_json, sess = self.get_url(search_url, headers=dict(Authorization='Bearer %s' % self._token), - resp_sess=True, parse_json=True) + search_url = '' + data_json, sess = None, None + for cur_param in self.urls['params']: + search_url = getattr(Request( + 'GET', self.urls['search'] % cur_param, + params={'query': search_string}).prepare(), 'url', None) + data_json, sess = self.get_url(search_url, headers=dict(Authorization='Bearer %s' % self._token), + resp_sess=True, parse_json=True) + if isinstance(data_json, dict): + break + if self.should_skip(): return results @@ -81,7 +95,9 @@ class MilkieProvider(generic.TorrentProvider): if not self._reject_item(seeders, leechers): title = tr.get('releaseName') download_id = tr.get('id') or tr.get('shortId') - download_url = download_id and self.urls.get('get') % (download_id, self._dkey) + download_url = download_id and getattr(Request( + 'GET', self.urls['get'] % download_id, + params={'key': self._dkey}).prepare(), 'url', None) if title and download_url: items[mode].append((title, download_url, seeders, self._bytesizer(size))) elif 200 != getattr(sess, 'response', {}).get('status_code', 0):