Source code for flexget.plugins.metainfo.content_size

import re

from loguru import logger

from flexget import plugin
from flexget.event import event
from flexget.utils.tools import format_filesize, parse_filesize

logger = logger.bind(name='metanfo_csize')

SIZE_RE = re.compile(r'Size[^\d]{0,7}(\d*\.?\d+).{0,5}(MB|GB)', re.IGNORECASE)


[docs] class MetainfoContentSize: """Utility: Check if content size is mentioned in description and set content_size attribute for entries if it is. Also sets content_size for entries with local files from input_listdir. """ schema = {'type': 'boolean', 'default': False}
[docs] def on_task_metainfo(self, task, config): # check if disabled (value set to false) if config is False: return count = 0 for entry in task.entries: if entry.get('content_size'): # Don't override if already set logger.trace( 'skipping content size check because it is already set for {!r}', entry['title'], ) continue # Try to parse size from description description = entry.get('description', '') if isinstance(description, str): try: entry['content_size'] = parse_filesize(description, si=False, match_re=SIZE_RE) continue except ValueError: pass # If this entry has a local file, (it was added by filesystem plugin) grab the size. if entry.get('location'): # If it is a .torrent or .nzb, don't bother getting the size as it will not be the content's size location = entry['location'] if location.suffix in ('.nzb', '.torrent'): continue try: if location.is_file(): amount = entry['location'].stat().st_size logger.trace('setting content size to {}', format_filesize(amount)) entry['content_size'] = amount continue except OSError: # is_file can throw OSError for invalid paths (at least on windows) continue if count: logger.debug('Found content size information from {} entries', count)
[docs] @event('plugin.register') def register_plugin(): plugin.register(MetainfoContentSize, 'metainfo_content_size', builtin=True, api_ver=2)