Исходный код magnetto.apis.kinozal_api

from urllib.parse import quote_plus

from grab import Grab

import magnetto
from magnetto.errors import (MagnettoIncorrectСredentials, MagnettoMisuseError,
                             MagnettoAuthError)
from magnetto.filters import (Category, OrderBy, Order, Year, Resolution,
                              Registered, TypeRelease, Size, Source)
from magnetto.apis.core import api_filters_method
from magnetto.apis.mixins import LastRequestMixin, CheckAuthMixin
from magnetto.apis import BaseApi
from magnetto.parsers import KinozalParser


[документация]class KinozalApi(BaseApi, CheckAuthMixin, LastRequestMixin): HOME = None
[документация] def __init__(self, grab=Grab()): self._grab = grab.clone() self._parser = KinozalParser() self._login = "" self._password = "" self.HOME = magnetto.KINOZAL_URL
[документация] def authorization(self, login, password, captcha=None): """ Note: * На сайте нету капчи. * Обнаружить что вы залогинены можно только путем запроса на главную или просмотром кук """ if not self._login and captcha: raise MagnettoMisuseError("Please execute " ".authorization(login, pass) first") self._login = login self._password = password doc = self._grab.go(self.HOME + "login.php") # заполняем форму входа doc.set_input('username', login) doc.set_input('password', password) doc = doc.submit() # проверка успешности входа if ("login" not in doc.url) and doc.tree.xpath('//*[@class="red"]'): raise MagnettoIncorrectСredentials() return True
@api_filters_method def search(self, query, filters=[], page=0, limit=999): # вход не был выполнен if not self._login: raise MagnettoAuthError() RESULTS_ON_PAGE = 50 # формируем урл для поиска url = "{home}browse.php?page={page}".format( home=self.HOME, page=RESULTS_ON_PAGE * page ) # таблица соответствий фильтров и модифицируемой переменной # 0 - url, 1 - query filtersTable = { Order.DESC: ["&f=0", ''], Order.ASC: ['&f=1', ''], Category.TV_SERIES: ['&c=1001', ''], Category.FILMS: ['&c=1002', ''], Category.CARTOONS: ['&c=1003', ''], Category.MUSICS: ['&c=1004', ''], Category.AUDIOBOOKS: ['&c=2', ''], Category.GAMES: ['&c=23', ''], Category.PROGRAMS: ['&c=32', ''], Category.BOOKS: ['&c=41', ''], Resolution.HD: ['&v=3', ' 720p'], Resolution.FULL_HD: ['&v=3', ' 1080p'], Resolution.ULTRA_HD: ['&v=7', ' 2160p'], Source.TV_RIP: ['&v=5', ''], Source.WEB_DL_RIP: ['&v=1', ' WEB-DLRip'], Source.HD_RIP: ['&v=1', ' HDRip'], Source.BD_RIP: ['&v=1', ' BDRip'], Source.VHS_RIP: ['', ' VHSRip'], Source.DVD_RIP: ['&v=1', ' DVDRip'], Source.CAM_RIP: ['', ''], OrderBy.CREATE: ['&t=0', ''], OrderBy.NAME: ['', ''], # не реализуем OrderBy.DOWNLOADS: ['&t=5', ''], OrderBy.SEEDERS: ['&t=1', ''], OrderBy.LEECHERS: ['&t=2', ''], OrderBy.SIZE: ['&t=3', ''], Registered.TODAY: ['&w=1', ''], Registered.YESTERDAY: ['&w=2', ''], Registered.FOR_3_DAYS: ['&w=3', ''], Registered.FOR_WEEK: ['&w=4', ''], Registered.FOR_MONTH: ['&w=5', ''], TypeRelease.SILVER: ['&w=12', ''], TypeRelease.GOLD: ['&w=11', ''], Size.TINY: ['&w=6', ''], Size.SMALL: ['&w=7', ''], Size.MEDIUM: ['&w=8', ''], Size.BIG: ['&w=9', ''], Size.LARGE: ['&w=10', ''], } # соотносим фильтры из таблицы их действиям for filter in filters: url += filtersTable.get(filter, [""])[0] query += filtersTable.get(filter, [""])[1] # проставляем год for filter in filters: if type(filter) is Year: url += "&d=" + str(filter) # добавляем возможно модифицированный поисковый запрос url += "&s=" + quote_plus(query) # подготавливаем для запроса self._grab.setup(url=url) # выполняем сам запрос self._grab.request() # проверяем, что после выполнения запроса мы залогинены self.is_logged() # разбор страницы items = self._parser.parse_search(self._grab.doc) return items