"""
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)