66
77from natsort import humansorted , ns
88from prompt_toolkit .styles import Style
9- from questionary import Choice , select
9+ from questionary import Choice , confirm , select , text
1010from requests .exceptions import JSONDecodeError
11- from rich .prompt import Confirm , Prompt
1211from simyan .comicvine import Comicvine as Simyan
1312from simyan .exceptions import ServiceError
1413from simyan .schemas .issue import Issue
1514from simyan .schemas .volume import Volume
1615from simyan .sqlite_cache import SQLiteCache
1716
1817from perdoo import get_cache_root
19- from perdoo .console import CONSOLE
2018from perdoo .metadata import ComicInfo , MetronInfo
2119from perdoo .metadata .metron_info import InformationSource
2220from perdoo .services ._base import BaseService
@@ -32,8 +30,10 @@ def __init__(self, settings: ComicvineSettings):
3230 cache = SQLiteCache (path = get_cache_root () / "simyan.sqlite" , expiry = 14 )
3331 self .session = Simyan (api_key = settings .api_key , cache = cache )
3432
35- def _search_series (self , name : str | None , volume : int | None , year : int | None ) -> int | None :
36- name = name or Prompt .ask ("Volume Name" , console = CONSOLE )
33+ def _search_series (
34+ self , name : str | None , volume : int | None , year : int | None , filename : str
35+ ) -> int | None :
36+ name = name or text (message = "Volume Name" ).ask ()
3737 try :
3838 options = sorted (
3939 self .session .list_volumes ({"filter" : f"name:{ name } " }),
@@ -67,31 +67,31 @@ def _search_series(self, name: str | None, volume: int | None, year: int | None)
6767 ]
6868 choices .append (DEFAULT_CHOICE )
6969 selected = select (
70- f"Searching for Comicvine Volume '{ search } '" ,
70+ f"Searching Comicvine for Volumes matching '{ filename } '"
71+ if not year
72+ else f"Searching Comicvine for Volume '{ search } '" ,
7173 default = DEFAULT_CHOICE ,
7274 choices = choices ,
7375 style = Style ([("dim" , "dim" )]),
7476 ).ask ()
7577 if selected and selected != DEFAULT_CHOICE .title :
7678 return selected .id
7779 else :
78- LOGGER .warning (
79- "Unable to find any Volumes with the Name and StartYear: '%s %s'" , name , year
80- )
80+ LOGGER .warning ("Unable to find any Volumes for the file: '%s'" , filename )
8181 if year :
8282 LOGGER .info ("Searching again without the StartYear" )
83- return self ._search_series (name = name , volume = volume , year = None )
84- if Confirm . ask ( "Search Again" , console = CONSOLE ):
85- return self ._search_series (name = None , volume = None , year = None )
83+ return self ._search_series (name = name , volume = volume , year = None , filename = filename )
84+ if confirm ( message = "Search Again" , default = False ). ask ( ):
85+ return self ._search_series (name = None , volume = None , year = None , filename = filename )
8686 except ServiceError as err :
8787 LOGGER .error (err )
8888 except JSONDecodeError :
8989 LOGGER .error ("Unable to get response from Comicvine" )
9090 return None
9191
92- def fetch_series (self , search : SeriesSearch ) -> Volume | None :
92+ def fetch_series (self , search : SeriesSearch , filename : str ) -> Volume | None :
9393 series_id = search .comicvine or self ._search_series (
94- name = search .name , volume = search .volume , year = search .year
94+ name = search .name , volume = search .volume , year = search .year , filename = filename
9595 )
9696 if not series_id :
9797 return None
@@ -106,10 +106,10 @@ def fetch_series(self, search: SeriesSearch) -> Volume | None:
106106 return None
107107 if search .comicvine :
108108 search .comicvine = None
109- return self .fetch_series (search = search )
109+ return self .fetch_series (search = search , filename = filename )
110110 return None
111111
112- def _search_issue (self , series_id : int , number : str | None ) -> int | None :
112+ def _search_issue (self , series_id : int , number : str | None , filename : str ) -> int | None :
113113 try :
114114 options = humansorted (
115115 self .session .list_issues (
@@ -120,12 +120,6 @@ def _search_issue(self, series_id: int, number: str | None) -> int | None:
120120 key = lambda x : (x .number , x .name ),
121121 alg = ns .NA | ns .G ,
122122 )
123- if not options :
124- LOGGER .warning (
125- "Unable to find any Issues with the Volume and IssueNumber: '%s %s'" ,
126- series_id ,
127- number ,
128- )
129123 if options :
130124 choices = [
131125 Choice (
@@ -140,30 +134,30 @@ def _search_issue(self, series_id: int, number: str | None) -> int | None:
140134 ]
141135 choices .append (DEFAULT_CHOICE )
142136 selected = select (
143- f"Searching for Comicvine Issue #{ number } " ,
137+ f"Searching Comicvine for Issues matching '{ filename } '"
138+ if not number
139+ else f"Searching Comicvine for Issues with number '{ number } '" ,
144140 default = DEFAULT_CHOICE ,
145141 choices = choices ,
146142 style = Style ([("dim" , "dim" )]),
147143 ).ask ()
148144 if selected and selected != DEFAULT_CHOICE .title :
149145 return selected .id
150146 else :
151- LOGGER .warning (
152- "Unable to find any Issues with the Volume and IssueNumber: '%s %s'" ,
153- series_id ,
154- number ,
155- )
147+ LOGGER .warning ("Unable to find any Issues for the file: '%s'" , filename )
156148 if number :
157149 LOGGER .info ("Searching again without the IssueNumber" )
158- return self ._search_issue (series_id = series_id , number = None )
150+ return self ._search_issue (series_id = series_id , number = None , filename = filename )
159151 except ServiceError as err :
160152 LOGGER .error (err )
161153 except JSONDecodeError :
162154 LOGGER .error ("Unable to get response from Comicvine" )
163155 return None
164156
165- def fetch_issue (self , series_id : int , search : IssueSearch ) -> Issue | None :
166- issue_id = search .comicvine or self ._search_issue (series_id = series_id , number = search .number )
157+ def fetch_issue (self , series_id : int , search : IssueSearch , filename : str ) -> Issue | None :
158+ issue_id = search .comicvine or self ._search_issue (
159+ series_id = series_id , number = search .number , filename = filename
160+ )
167161 if not issue_id :
168162 return None
169163 try :
@@ -177,7 +171,7 @@ def fetch_issue(self, series_id: int, search: IssueSearch) -> Issue | None:
177171 return None
178172 if search .comicvine :
179173 search .comicvine = None
180- return self .fetch_issue (series_id = series_id , search = search )
174+ return self .fetch_issue (series_id = series_id , search = search , filename = filename )
181175 return None
182176
183177 def _process_metron_info (self , series : Volume , issue : Issue ) -> MetronInfo | None :
@@ -256,11 +250,11 @@ def fetch(self, search: Search) -> tuple[MetronInfo | None, ComicInfo | None]:
256250 except (ServiceError , JSONDecodeError ):
257251 pass
258252
259- series = self .fetch_series (search = search .series )
253+ series = self .fetch_series (search = search .series , filename = search . filename )
260254 if not series :
261255 return None , None
262256
263- issue = self .fetch_issue (series_id = series .id , search = search .issue )
257+ issue = self .fetch_issue (series_id = series .id , search = search .issue , filename = search . filename )
264258 if not issue :
265259 return None , None
266260
0 commit comments