1313
1414SEARCH_CACHE_DIR = APP_CACHE_DIR / "previews" / "dynamic-search"
1515SEARCH_RESULTS_FILE = SEARCH_CACHE_DIR / "current_search_results.json"
16+ LAST_QUERY_FILE = SEARCH_CACHE_DIR / "last_query.txt"
17+ RESTORE_MODE_FILE = SEARCH_CACHE_DIR / ".restore_mode"
1618FZF_SCRIPTS_DIR = SCRIPTS_DIR / "fzf"
1719SEARCH_TEMPLATE_SCRIPT = (FZF_SCRIPTS_DIR / "search.py" ).read_text (encoding = "utf-8" )
1820FILTER_PARSER_SCRIPT = FZF_SCRIPTS_DIR / "_filter_parser.py"
1921
2022
23+ def _load_cached_titles () -> list [str ]:
24+ """Load titles from cached search results for display in fzf."""
25+ if not SEARCH_RESULTS_FILE .exists ():
26+ return []
27+
28+ try :
29+ with open (SEARCH_RESULTS_FILE , "r" , encoding = "utf-8" ) as f :
30+ data = json .load (f )
31+
32+ media_list = data .get ("data" , {}).get ("Page" , {}).get ("media" , [])
33+ titles = []
34+ for media in media_list :
35+ title_obj = media .get ("title" , {})
36+ title = (
37+ title_obj .get ("english" )
38+ or title_obj .get ("romaji" )
39+ or title_obj .get ("native" )
40+ or "Unknown"
41+ )
42+ titles .append (title )
43+ return titles
44+ except (IOError , json .JSONDecodeError ):
45+ return []
46+
47+
2148@session .menu
2249def dynamic_search (ctx : Context , state : State ) -> State | InternalDirective :
2350 """Dynamic search menu that provides real-time search results."""
@@ -27,6 +54,12 @@ def dynamic_search(ctx: Context, state: State) -> State | InternalDirective:
2754 # Ensure cache directory exists
2855 SEARCH_CACHE_DIR .mkdir (parents = True , exist_ok = True )
2956
57+ # Check if we're in restore mode (coming back from media_actions)
58+ restore_mode = RESTORE_MODE_FILE .exists ()
59+ if restore_mode :
60+ # Clear the restore flag
61+ RESTORE_MODE_FILE .unlink (missing_ok = True )
62+
3063 # Read the GraphQL search query
3164 from .....libs .media_api .anilist import gql
3265
@@ -46,6 +79,7 @@ def dynamic_search(ctx: Context, state: State) -> State | InternalDirective:
4679 "GRAPHQL_ENDPOINT" : "https://graphql.anilist.co" ,
4780 "GRAPHQL_QUERY" : search_query_json ,
4881 "SEARCH_RESULTS_FILE" : SEARCH_RESULTS_FILE .as_posix (),
82+ "LAST_QUERY_FILE" : LAST_QUERY_FILE .as_posix (),
4983 "AUTH_HEADER" : auth_header ,
5084 }
5185
@@ -71,6 +105,19 @@ def dynamic_search(ctx: Context, state: State) -> State | InternalDirective:
71105 # Header hint for filter syntax
72106 filter_hint = "💡 Filters: @genre:action @status:airing @year:2024 @sort:score (type @help for more)"
73107
108+ # Only load previous query if we're in restore mode (coming back from media_actions)
109+ initial_query = None
110+ cached_results = None
111+ if restore_mode :
112+ # Load previous query
113+ if LAST_QUERY_FILE .exists ():
114+ try :
115+ initial_query = LAST_QUERY_FILE .read_text (encoding = "utf-8" ).strip ()
116+ except IOError :
117+ pass
118+ # Load cached results to display immediately without network request
119+ cached_results = _load_cached_titles ()
120+
74121 try :
75122 # Prepare preview functionality
76123 preview_command = None
@@ -85,12 +132,16 @@ def dynamic_search(ctx: Context, state: State) -> State | InternalDirective:
85132 search_command = search_command_final ,
86133 preview = preview_command ,
87134 header = filter_hint ,
135+ initial_query = initial_query ,
136+ initial_results = cached_results ,
88137 )
89138 else :
90139 choice = ctx .selector .search (
91140 prompt = "Search Anime" ,
92141 search_command = search_command_final ,
93142 header = filter_hint ,
143+ initial_query = initial_query ,
144+ initial_results = cached_results ,
94145 )
95146 except NotImplementedError :
96147 feedback .error ("Dynamic search is not supported by your current selector" )
@@ -129,6 +180,9 @@ def dynamic_search(ctx: Context, state: State) -> State | InternalDirective:
129180 logger .error (f"Could not find selected media for choice: { choice } " )
130181 return InternalDirective .MAIN
131182
183+ # Set restore mode flag so we can restore state when user goes back
184+ RESTORE_MODE_FILE .touch ()
185+
132186 # Navigate to media actions with the selected item
133187 return State (
134188 menu_name = MenuName .MEDIA_ACTIONS ,
0 commit comments