Search strategy detection for alternative API queries.
This module provides detection of album types that require alternative
search strategies when standard API queries return no results.
Different from album_type.py:
- album_type: How to HANDLE year once found (skip, update, mark)
- search_strategy: How to FIND year in first place (modify query)
SearchStrategy
Bases: Enum
Search strategy for API queries.
SearchStrategyInfo
dataclass
SearchStrategyInfo(
strategy,
detected_pattern=None,
modified_artist=None,
modified_album=None,
)
Information about detected search strategy.
detect_search_strategy
detect_search_strategy(artist, album, config)
Detect which search strategy to use for API queries.
Detection order (first match wins):
1. Soundtrack patterns in album
2. Various Artists as artist
3. Unusual bracket content
4. Default: NORMAL
Source code in src/core/models/search_strategy.py
| def detect_search_strategy(
artist: str,
album: str,
config: AppConfig,
) -> SearchStrategyInfo:
"""Detect which search strategy to use for API queries.
Detection order (first match wins):
1. Soundtrack patterns in album
2. Various Artists as artist
3. Unusual bracket content
4. Default: NORMAL
"""
if not album:
return SearchStrategyInfo(strategy=SearchStrategy.NORMAL)
soundtrack_patterns, various_patterns = _get_patterns(config)
# 1. Check for soundtrack
if pattern := _is_soundtrack(album, soundtrack_patterns):
album_lower = album.lower()
idx = album_lower.find(pattern.lower())
if idx > 0 and (movie_name := album[:idx].strip().rstrip("([-\u2013\u2014")):
return SearchStrategyInfo(
strategy=SearchStrategy.SOUNDTRACK,
detected_pattern=pattern,
modified_artist=movie_name,
modified_album=movie_name,
)
return SearchStrategyInfo(
strategy=SearchStrategy.SOUNDTRACK,
detected_pattern=pattern,
)
# 2. Check for Various Artists
if _is_various_artists(artist, various_patterns):
return SearchStrategyInfo(strategy=SearchStrategy.VARIOUS_ARTISTS, detected_pattern=artist, modified_album=album)
# 3. Check for unusual brackets
has_unusual, stripped = _has_unusual_brackets(album)
if has_unusual and stripped:
return SearchStrategyInfo(
strategy=SearchStrategy.STRIP_BRACKETS,
detected_pattern="brackets",
modified_artist=artist,
modified_album=stripped,
)
return SearchStrategyInfo(strategy=SearchStrategy.NORMAL)
|