Source code for flexget.plugins.input.rlslog
import re
import time
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.log import log_once
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='rlslog')
[docs]
class RlsLog:
"""Adds support for rlslog.net as a feed."""
schema = {'type': 'string', 'format': 'url'}
[docs]
def parse_rlslog(self, rlslog_url, task):
"""Return list of release dictionaries.
:param rlslog_url: Url to parse from
:param task: Task instance
"""
# BeautifulSoup doesn't seem to work if data is already decoded to unicode :/
soup = get_soup(task.requests.get(rlslog_url, timeout=25).content)
releases = []
for entry in soup.find_all('div', attrs={'class': 'entry'}):
release = {}
h3 = entry.find('h3', attrs={'class': 'entrytitle'})
if not h3:
logger.debug('FAIL: No h3 entrytitle')
continue
release['title'] = h3.a.contents[0].strip()
entrybody = entry.find('div', attrs={'class': 'entrybody'})
if not entrybody:
logger.debug('FAIL: No entrybody')
continue
logger.trace('Processing title {}', release['title'])
# find imdb url
link_imdb = entrybody.find('a', text=re.compile(r'imdb', re.IGNORECASE))
if link_imdb:
release['imdb_id'] = extract_id(link_imdb['href'])
release['imdb_url'] = link_imdb['href']
# find google search url
google = entrybody.find('a', href=re.compile(r'google', re.IGNORECASE))
if google:
release['url'] = google['href']
releases.append(release)
else:
log_once(
'{} skipped due to missing or unsupported download link'.format(
release['title']
),
logger,
)
return releases
@cached('rlslog')
@plugin.internet(logger)
def on_task_input(self, task, config):
url = config
if url.endswith('feed/'):
raise plugin.PluginError('Invalid URL. Remove trailing feed/ from the url.')
releases = []
entries = []
# retry rlslog (badly responding) up to 4 times (requests tries 2 times per each of our tries here)
for number in range(2):
try:
releases = self.parse_rlslog(url, task)
break
except RequestException as e:
if number == 1:
raise
logger.verbose(
'Error receiving content, retrying in 5s. Try [{} of 2]. Error: {}',
number + 1,
e,
)
time.sleep(5)
# Construct entry from release
for release in releases:
entry = Entry()
def apply_field(d_from, d_to, f):
if f in d_from:
if d_from[f] is None:
return # None values are not wanted!
d_to[f] = d_from[f]
for field in ('title', 'url', 'imdb_url'):
apply_field(release, entry, field)
entries.append(entry)
return entries
[docs]
@event('plugin.register')
def register_plugin():
plugin.register(RlsLog, 'rlslog', api_ver=2)