Source code for flexget.plugins.input.sceper
from bs4 import NavigableString
from loguru import logger
from requests import RequestException
from flexget import plugin
from flexget.entry import Entry
from flexget.event import event
from flexget.utils.cached_input import cached
from flexget.utils.soup import get_soup
try:
# NOTE: Importing other plugins is discouraged!
from flexget.components.imdb.utils import extract_id
except ImportError:
raise plugin.DependencyError(issued_by=__name__, missing='imdb')
logger = logger.bind(name='sceper')
[docs]
class InputSceper:
"""Uses sceper.ws category url as input.
Example::
sceper: http://sceper.ws/category/movies/movies-dvd-rip
"""
schema = {'type': 'string', 'format': 'url'}
[docs]
def parse_site(self, url, task):
"""Parse configured url and return releases array."""
try:
page = task.requests.get(url).content
except RequestException as e:
raise plugin.PluginError(f'Error getting input page: {e}')
soup = get_soup(page)
releases = []
for entry in soup.find_all('div', attrs={'class': 'entry'}):
release = {}
title = entry.find('h2')
if not title:
logger.debug('No h2 entrytitle')
continue
release['title'] = title.a.contents[0].strip()
logger.debug('Processing title {}', release['title'])
for link in entry.find_all('a'):
# no content in the link
if not link.contents:
continue
link_name = link.contents[0]
if link_name is None:
continue
if not isinstance(link_name, NavigableString):
continue
link_name = link_name.strip().lower()
if link.has_attr('href'):
link_href = link['href']
else:
continue
logger.debug('found link {} -> {}', link_name, link_href)
# handle imdb link
if link_name.lower() == 'imdb':
logger.debug('found imdb link {}', link_href)
release['imdb_id'] = extract_id(link_href)
# test if entry with this url would be rewritable by known plugins (ie. downloadable)
temp = {}
temp['title'] = release['title']
temp['url'] = link_href
urlrewriting = plugin.get('urlrewriting', self)
if urlrewriting.url_rewritable(task, temp):
release['url'] = link_href
logger.trace('--> accepting {} (resolvable)', link_href)
else:
logger.trace('<-- ignoring {} (non-resolvable)', link_href)
# reject if no torrent link
if 'url' not in release:
from flexget.utils.log import log_once
log_once(
'{} skipped due to missing or unsupported (unresolvable) download link'.format(
release['title']
),
logger,
)
else:
releases.append(release)
return releases
@cached('sceper')
@plugin.internet(logger)
def on_task_input(self, task, config):
releases = self.parse_site(config, task)
return [Entry(release) for release in releases]
[docs]
@event('plugin.register')
def register_plugin():
plugin.register(InputSceper, 'sceper', api_ver=2)