Skip to content

search_strategy

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)