import logging
import os
import re
import subprocess
from unidecode import unidecode
from feed2exec.plugins.html2text import filter as html2text_filter
[docs]def sanitize(text, repl='-'):
"""like utils.slug, but without lowercase and allow custom replacement
>>> sanitize('test')
'test'
>>> sanitize('../../../etc/password')
'etc-password'
>>> sanitize('Foo./.bar', repl='.')
'Foo.bar'
"""
return re.sub(r'\W+', repl, unidecode(text).strip()).strip(repl)
[docs]def output(hostname='localhost', *args,
feed=None, item=None, **kwargs):
"""the transmission plugin will send feed items to a `transmission
<http://www.transmissionbt.com/>`_ instance
it assumes the ``transmission-remote`` command is already
installed and configured to talk with transmission.
the hostname is passed in the ``args`` configuration and defaults
to localhost. the ``folder`` parameter is also used to determine
where to save the actual torrents files.
note that this will also append a sanitized version of the item
title, if a folder is provided. this is to allow saving series in
the same folder.
if the title is unique for each torrent, you may use a filter to
set the title to the right location.
"""
command = ['transmission-remote', hostname, '-a', item['link']]
if feed.get('folder', None):
# sanitize title to avoid directory transversal
subfolder = sanitize(item.get('title', ''), repl='.')
path = os.path.join(feed['folder'], subfolder)
command += ['-w', path]
else:
path = 'default path'
logging.info('adding torrent "%s" to %s: %s%s',
item.get('title'), path,
html2text_filter.parse(item.get('summary')),
feed.get('catchup', '') and ' (simulated)')
logging.debug("calling command %s%s", command,
feed.get('catchup', '') and ' (simulated)')
if not feed.get('catchup'):
subprocess.check_call(command)
return True