Coverage for mymeco/cmdline.py: 11%

93 statements  

« 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 

7 

8 

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 

14 

15 

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 

27 

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 

34 

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 

51 

52 movie = Movie(movie_id, tmdb) 

53 movie.set_technical(video) 

54 movie.sorttitle = os.path.basename(filename) 

55 

56 nfo_file = '.'.join(filename.split('.')[:-1] + ['nfo']) 

57 with open(nfo_file, 'w', encoding='utf-8') as nfo: 

58 movie.nfo(nfo) 

59 

60 

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 

67 

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 

78 

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) 

83 

84 with open(nfo_file, 'w', encoding='utf-8') as nfo: 

85 movie.nfo(nfo) 

86 

87 

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 

96 

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='*') 

107 

108 parsed = parser.parse_args(args) 

109 

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) 

116 

117 return parsed 

118 

119 

120def mymecoctl(argv=None): 

121 """Entrypoint to create nfo file next to video file.""" 

122 if argv is None: 

123 argv = sys.argv[1:] 

124 

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 ) 

132 

133 parsed = __parse_args(argv) 

134 

135 if parsed.update: 

136 _update(config, parsed.FILENAME) 

137 sys.exit(0) 

138 

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