Coverage for mymeco/cmdline.py: 11%
93 statements
« prev ^ index » next coverage.py v7.10.7, created at 2026-01-15 20:56 +0000
« prev ^ index » next coverage.py v7.10.7, created at 2026-01-15 20:56 +0000
1# coding: utf-8
2"""Command line support for mymeco."""
3import sys
4import os
5import argparse
6from lxml import etree
9from mymeco.config import Configuration
10from mymeco import logger
11from mymeco.files.video import Video
12from mymeco.tmdb.utils import Tmdb
13from mymeco.kodi.movie import Movie
16def _compute(config, filename, searchterms=None, year=None):
17 video = Video(filename)
18 movie_title = '.'.join(os.path.basename(filename).split('.')[:-1])
19 tmdb = Tmdb(config.tmdb()['token'], 'fr-FR')
20 if searchterms is None:
21 searchterms = movie_title
22 output_list = list(tmdb.search_movie(searchterms, year))
23 index = 1
24 if not output_list:
25 print('Search result is empty.', file=sys.stderr)
26 return
28 for result in output_list:
29 print((
30 f'{index}. {result.title} ({result.original_title})'
31 f' - {result.release_date} - {result.poster_path}'
32 ))
33 index += 1
35 movie_id = None
36 choice = 1
37 while movie_id is None:
38 try:
39 if len(output_list) > 1:
40 choice = int(input('Choose a movie:'))
41 else:
42 choice = 1
43 movie_id = output_list[choice - 1].id
44 except IndexError:
45 print(f'{choice} is outside result range. Retry.',
46 file=sys.stderr)
47 movie_id = None
48 except ValueError:
49 print('Not a number. Retry.', file=sys.stderr)
50 movie_id = None
52 movie = Movie(movie_id, tmdb)
53 movie.set_technical(video)
54 movie.sorttitle = os.path.basename(filename)
56 nfo_file = '.'.join(filename.split('.')[:-1] + ['nfo'])
57 with open(nfo_file, 'w', encoding='utf-8') as nfo:
58 movie.nfo(nfo)
61def _update(config, filenames):
62 for filename in filenames:
63 nfo_file = '.'.join(filename.split('.')[:-1] + ['nfo'])
64 if not os.path.isfile(nfo_file):
65 print(f'NFO file not found ({nfo_file})')
66 continue
68 video = Video(filename)
69 # Retrieve tmdb movie id in nfo file
70 movie_id = None
71 for _action, element in etree.iterparse(nfo_file, tag='uniqueid'):
72 if element.attrib['type'] == 'tmdb':
73 movie_id = element.text
74 break
75 if movie_id is None:
76 print('No TMDB id found in NFO file.')
77 continue
79 tmdb = Tmdb(config.tmdb()['token'], 'fr-FR')
80 movie = Movie(movie_id, tmdb)
81 movie.sorttitle = os.path.basename(filename)
82 movie.set_technical(video)
84 with open(nfo_file, 'w', encoding='utf-8') as nfo:
85 movie.nfo(nfo)
88def __parse_args(args):
89 """Parse command line arguments."""
90 parser = argparse.ArgumentParser(
91 description='Mymecoctl generate nfo file from Video file.'
92 )
93 parser.add_argument(
94 '--search', '-s', help='Use these terms in TMDB movie search request.',
95 type=str
97 )
98 parser.add_argument(
99 '--year', '-y', help='Look for movie released in the given year',
100 type=int
101 )
102 parser.add_argument(
103 '--update', '-u', help='Update nfo already existing nfo files.',
104 action='store_true'
105 )
106 parser.add_argument('FILENAME', nargs='*')
108 parsed = parser.parse_args(args)
110 print(parsed.update)
111 print(parsed.FILENAME)
112 if not parsed.update and len(parsed.FILENAME) != 1:
113 print('Multiple video file is available only with --update flag.',
114 file=sys.stderr)
115 sys.exit(1)
117 return parsed
120def mymecoctl(argv=None):
121 """Entrypoint to create nfo file next to video file."""
122 if argv is None:
123 argv = sys.argv[1:]
125 config = Configuration()
126 log_config = config.log()
127 logger.configure(
128 verbosity_count=log_config.verbosity_count,
129 quiet_count=log_config.quiet_count,
130 colored=log_config.colored,
131 )
133 parsed = __parse_args(argv)
135 if parsed.update:
136 _update(config, parsed.FILENAME)
137 sys.exit(0)
139 try:
140 if os.path.isfile(parsed.FILENAME[0]):
141 _compute(config, parsed.FILENAME[0], parsed.search, parsed.year)
142 else:
143 print(
144 f'{parsed.FILENAME[0]} does not exists.',
145 file=sys.stderr
146 )
147 except KeyboardInterrupt:
148 print('Abort')