Source code for flexget.components.bittorrent.trackers
import re
from loguru import logger
from flexget import plugin
from flexget.event import event
logger = logger.bind(name='modify_torrents')
[docs]
class AddTrackers:
"""Adds tracker URL to torrent files.
Configuration example:
add_trackers:
- uri://tracker_address:port/
This will add all tracker URL uri://tracker_address:port/.
"""
schema = {'type': 'array', 'items': {'type': 'string', 'format': 'url'}}
[docs]
@plugin.priority(127)
def on_task_modify(self, task, config):
for entry in task.entries:
if 'torrent' in entry:
for url in config:
if url not in entry['torrent'].trackers:
entry['torrent'].add_multitracker(url)
logger.info('Added {} tracker to {}', url, entry['title'])
if entry['url'].startswith('magnet:'):
entry['url'] += ''.join(['&tr=' + url for url in config])
[docs]
class RemoveTrackers:
"""Removes trackers from torrent files using regexp matching.
Configuration example:
remove_trackers:
- moviex
This will remove all trackers that contain text moviex in their url.
"""
schema = {'type': 'array', 'items': {'type': 'string', 'format': 'regex'}}
[docs]
@plugin.priority(127)
def on_task_modify(self, task, config):
for entry in task.entries:
if 'torrent' in entry:
for tracker in entry['torrent'].trackers:
for regexp in config or []:
if re.search(regexp, tracker, re.IGNORECASE):
logger.debug(
'remove_trackers removing {} because of {}', tracker, regexp
)
# remove tracker
entry['torrent'].remove_multitracker(tracker)
logger.info('Removed {}', tracker)
if entry['url'].startswith('magnet:'):
for regexp in config:
# Replace any tracker strings that match the regexp with nothing
tr_search = rf'&tr=([^&]*{regexp}[^&]*)'
entry['url'] = re.sub(tr_search, '', entry['url'], flags=re.IGNORECASE)
[docs]
class ModifyTrackers:
"""Modify tracker URL to torrent files.
Configuration example::
modify_trackers:
- SearchAndReplace:
from: string_to_search
to: string_to_replace
"""
schema = {
'type': 'array',
'items': {
'type': 'object',
'additionalProperties': {
'type': 'object',
'properties': {'from': {'type': 'string'}, 'to': {'type': 'string'}},
'additionalProperties': False,
},
'maxProperties': 1,
},
}
[docs]
@plugin.priority(127)
def on_task_modify(self, task, config):
for entry in task.entries:
if 'torrent' in entry:
torrent = entry['torrent']
trackers = torrent.trackers
for item in config:
for replace in item.values():
for tracker in trackers:
if replace.get('from') in tracker:
torrent.remove_multitracker(tracker)
trackernew = tracker.replace(
replace.get('from'), replace.get('to')
)
torrent.add_multitracker(trackernew)
logger.info('Modify {} in {}', tracker, trackernew)
[docs]
@event('plugin.register')
def register_plugin():
plugin.register(AddTrackers, 'add_trackers', api_ver=2)
plugin.register(RemoveTrackers, 'remove_trackers', api_ver=2)
plugin.register(ModifyTrackers, 'modify_trackers', api_ver=2)