Source code for upsies.uis.tui.commands.release_name

"""
Generate properly formatted release name
"""

import functools
import re

from .... import errors, jobs, utils
from .base import CommandBase

import logging  # isort:skip
_log = logging.getLogger(__name__)


[docs] class release_name(CommandBase): """ Generate properly formatted release name IMDb is searched to get the correct title, year and alternative title if applicable. Audio and video information is detected with mediainfo. Missing required information is highlighted with placeholders, e.g. "UNKNOWN_RESOLUTION". """ names = ('release-name', 'rn') cli_arguments = { 'RELEASE': { 'type': utils.argtypes.release, 'help': 'Release name or path to release content', }, ('--separator', '-s'): { 'default': ' ', 'help': 'Separator between parts (default: " ")', }, # Specify ID on CLI (no user dialog): --tmdb movie/123456 # Specify webdb on CLI and prompt for ID: --tvmaze ('--imdb', '--im'): { 'group': 'webdb', # Arguments of this group are mutually exclusive. 'nargs': '?', 'const': True, # Sentinel value to trigger user dialog. 'type': utils.argtypes.webdb_id('imdb'), 'metavar': 'ID_OR_URL', 'help': 'Use IMDb to fill in info like title, year, etc', }, ('--tmdb', '--tm'): { 'group': 'webdb', # Arguments of this group are mutually exclusive. 'nargs': '?', 'const': True, # Sentinel value to trigger user dialog. 'type': utils.argtypes.webdb_id('tmdb'), 'metavar': 'ID_OR_URL', 'help': 'Use TMDb to fill in info like title, year, etc', }, ('--tvmaze', '--tv'): { 'group': 'webdb', # Arguments of this group are mutually exclusive. 'nargs': '?', 'const': True, # Sentinel value to trigger user dialog. 'type': utils.argtypes.webdb_id('tvmaze'), 'metavar': 'ID_OR_URL', 'help': 'Use TVmaze to fill in info like title, year, etc', }, ('--title', '--ti'): {'help': 'Override title'}, ('--year', '--ye'): {'help': 'Override year', 'type': utils.argtypes.release_year}, ('--episodes', '--ep'): { 'help': 'Override season/episode info (e.g. "S03", "S06E09" or "S01E02 The Episode Title")', 'type': utils.argtypes.episodes, }, ('--edition', '--ed'): {'help': 'Override edition (e.g. "Remastered,Uncut")'}, ('--service', '--se'): {'help': 'Override source service (e.g. "AMZN")'}, ('--source', '--so'): {'help': 'Override source (e.g. "BluRay" or "WEB-DL")'}, ('--group', '--gr'): {'help': 'Override group'}, } @functools.cached_property def jobs(self): return ( self.webdb_job, self.release_name_job, ) @functools.cached_property def webdb(self): if self.args.imdb: return utils.webdbs.webdb('imdb') elif self.args.tmdb: return utils.webdbs.webdb('tmdb') elif self.args.tvmaze: return utils.webdbs.webdb('tvmaze') else: return utils.webdbs.webdb('imdb') @functools.cached_property def webdb_id(self): if ( (webdb_id_arg := self.args.imdb or self.args.tmdb or self.args.tvmaze) and isinstance(webdb_id_arg, str) ): return self.webdb.get_id_from_text(webdb_id_arg) @functools.cached_property def webdb_job(self): if self.webdb_id: query = utils.webdbs.Query.from_string(f'!id:{self.webdb_id}') else: query = utils.webdbs.Query.from_path(self.args.RELEASE) return jobs.webdb.WebDbSearchJob( home_directory=self.home_directory, cache_directory=self.cache_directory, ignore_cache=self.args.ignore_cache, cache_id=self.cache_id, db=self.webdb, query=query, no_id_ok=True, show_poster=self.config['config']['id']['show_poster'], ) @functools.cached_property def release_name_job(self): return jobs.dialog.TextFieldJob( name='release-name', label='Release Name', home_directory=self.home_directory, cache_directory=self.cache_directory, cache_id=self.cache_id, ignore_cache=self.args.ignore_cache, prejobs=( self.webdb_job, ), text=self.get_release_name, default=str(self.release_name), ) async def get_release_name(self): _log.debug('Initial release name: %s', self.release_name) if self.webdb_job.output: confirmed_webdb_id = self.webdb_job.output[0] await self.release_name_job.fetch_text( coro=self.release_name.fetch_info(webdb=self.webdb, webdb_id=confirmed_webdb_id), warn_exceptions=( errors.RequestError, ), default=self.release_name, ) _log.debug('Updated release name with info from %s: %s', self.webdb.label, self.release_name) self.update_release_name() _log.debug('Updated release name with CLI arguments: %s', self.release_name) return str(self.release_name) def update_release_name(self): if self.args.title is not None: if ' AKA ' in self.args.title: self.release_name.title, self.release_name.title_aka = re.split(r' AKA ', self.args.title) else: self.release_name.title = self.args.title if self.args.year is not None: self.release_name.year = self.args.year self.release_name.year_required = True if self.args.episodes is not None: self.release_name.episodes = self.args.episodes[0] if self.args.episodes[1]: self.release_name.episode_title = self.args.episodes[1] self.release_name.type = ( utils.types.ReleaseType.season if self.release_name.episodes_dict.is_season else utils.types.ReleaseType.episode ) if self.args.edition is not None: self.release_name.edition = ( edition for e in self.args.edition.split(',') if (edition := e.strip()) ) if self.args.service is not None: self.release_name.service = self.args.service if self.args.source is not None: self.release_name.source = self.args.source if self.args.group is not None: self.release_name.group = self.args.group @functools.cached_property def release_name(self): return utils.release.ReleaseName( self.args.RELEASE, separator=self.args.separator, ) @functools.cached_property def cache_id(self): cache_id = [f'separator={self.args.separator}'] if self.webdb_id: cache_id.append(f'{self.webdb.name}={self.webdb_id}') else: cache_id.append(f'{self.webdb.name}') return tuple(cache_id)