Source code for flexget.plugins.output.rtorrent_magnet
import os
import re
from loguru import logger
from flexget import plugin
from flexget.event import event
logger = logger.bind(name='rtorrent_magnet')
pat = re.compile('xt=urn:btih:([^&/]+)')
[docs]
class PluginRtorrentMagnet:
"""Process Magnet URI's into rtorrent compatible torrent files.
Magnet URI's will look something like this:
magnet:?xt=urn:btih:190F1ABAED7AE7252735A811149753AA83E34309&dn=URL+Escaped+Torrent+Name
rTorrent would expect to see something like meta-URL_Escaped_Torrent_Name.torrent
The torrent file must also contain the text:
d10:magnet-uri88:xt=urn:btih:190F1ABAED7AE7252735A811149753AA83E34309&dn=URL+Escaped+Torrent+Namee
This plugin will check if a download URL is a magnet link, and then create the appropriate torrent file.
Example:
rtorrent_magnet: ~/torrents/
"""
schema = {'type': 'string', 'format': 'path'}
[docs]
def write_torrent_file(self, task, entry, path):
path = os.path.join(path, 'meta-{}.torrent'.format(entry['title']))
path = os.path.expanduser(path)
if task.options.test:
logger.info('Would write: {}', path)
else:
logger.info('Writing rTorrent Magnet File: {}', path)
with open(path, 'w') as f:
f.write('d10:magnet-uri{}:{}e'.format(len(entry['url']), entry['url']))
entry['output'] = path
# Run after download plugin to only pick up entries it did not already handle
[docs]
@plugin.priority(0)
def on_task_output(self, task, config):
for entry in task.accepted:
if 'output' in entry:
logger.debug(
'Ignoring, {} already has an output file: {}', entry['title'], entry['output']
)
continue
for url in entry.get('urls', [entry['url']]):
if url.startswith('magnet:'):
logger.debug('Magnet URI detected for url {} ({})', url, entry['title'])
if pat.search(url):
self.write_torrent_file(task, entry, entry.get('path', config))
break
logger.warning('Unrecognized Magnet URI Format: {}', url)
[docs]
@event('plugin.register')
def register_plugin():
plugin.register(PluginRtorrentMagnet, 'rtorrent_magnet', api_ver=2)