1+ """
2+ Lavalink track helpers, which take care of finding a matching
3+ playable Lavalink track for a QueueItem, caching it, and
4+ invalidating it when necessary.
5+ """
6+
17from typing import TYPE_CHECKING , List , Optional , Tuple
28
39from mafic import SearchType
410
511from bot .database .redis import REDIS
612from bot .utils .constants import CONFIDENCE_THRESHOLD
713from bot .utils .exceptions import LavalinkSearchError
14+ from bot .utils .fuzzy import rank_results
815from bot .utils .logger import create_logger
916from bot .utils .musicbrainz import annotate_track
1017
11- from .jockey_helpers import rank_results
12- from .lavalink_client import get_deezer_matches , get_deezer_track , get_youtube_matches
18+ from .lavalink_search import get_deezer_matches , get_deezer_track , get_youtube_matches
1319
1420if TYPE_CHECKING :
1521 from mafic import Node , Track
1622
17- from bot .dataclass .lavalink_result import LavalinkResult
18- from bot .dataclass .queue_item import QueueItem
23+ from bot .models .lavalink_result import LavalinkResult
24+ from bot .models .queue_item import QueueItem
1925
20- from .lavalink_client import LavalinkSearchError
26+ from .lavalink_search import LavalinkSearchError
2127
2228LOGGER = create_logger ('track_finder' )
2329
@@ -112,19 +118,36 @@ async def find_lavalink_track(
112118 return lavalink_track
113119
114120
121+ def invalidate_cached_track (item : 'QueueItem' ):
122+ """
123+ Removes a cached Lavalink track from Redis.
124+
125+ :param item: The QueueItem to invalidate the track for.
126+ """
127+ if REDIS is None :
128+ return
129+
130+ redis_key , redis_key_type = _determine_cache_key (item )
131+
132+ # Invalidate cached Lavalink track
133+ if redis_key is not None and redis_key_type is not None :
134+ REDIS .invalidate_lavalink_track (redis_key , key_type = redis_key_type )
135+ else :
136+ LOGGER .warning ("Could not invalidate cached track for `%s': no key" , item .title )
137+
138+
115139def _get_cached_track (
116140 item : 'QueueItem' ,
117141) -> Tuple [Optional [str ], Optional [str ], Optional [str ]]:
118- redis_key = None
119- redis_key_type = None
120- if item .spotify_id is not None :
121- redis_key = item .spotify_id
122- redis_key_type = 'spotify_id'
123- elif item .isrc is not None :
124- redis_key = item .isrc
125- redis_key_type = 'isrc'
142+ """
143+ Gets a cached Lavalink track from Redis.
144+
145+ :param item: The QueueItem to get the cached track for.
146+ """
126147
148+ redis_key , redis_key_type = _determine_cache_key (item )
127149 cached = None
150+
128151 if REDIS is not None and redis_key is not None and redis_key_type is not None :
129152 cached = REDIS .get_lavalink_track (redis_key , key_type = redis_key_type )
130153
@@ -136,10 +159,37 @@ def _set_cached_track(
136159 key : Optional [str ] = None ,
137160 key_type : Optional [str ] = None ,
138161):
162+ """
163+ Caches a Lavalink track in Redis.
164+
165+ :param lavalink_track: The Lavalink track to cache.
166+ :param key: The key to cache the track under.
167+ :param key_type: The type of key to cache the track under.
168+ """
139169 if REDIS is not None and key_type is not None and key is not None :
140170 REDIS .set_lavalink_track (key , lavalink_track , key_type = key_type )
141171
142172
173+ def _determine_cache_key (item : 'QueueItem' ) -> Tuple [Optional [str ], Optional [str ]]:
174+ """
175+ Determines the Redis key and key type for caching a Lavalink track.
176+
177+ :param item: The QueueItem to determine the cache key for.
178+ """
179+
180+ redis_key = None
181+ redis_key_type = None
182+
183+ if item .spotify_id is not None :
184+ redis_key = item .spotify_id
185+ redis_key_type = 'spotify_id'
186+ elif item .isrc is not None :
187+ redis_key = item .isrc
188+ redis_key_type = 'isrc'
189+
190+ return redis_key , redis_key_type
191+
192+
143193async def _append_deezer_results_for_isrc (
144194 results : List ['LavalinkResult' ],
145195 node : 'Node' ,
0 commit comments