File: test_discography_filter.py

package info (click to toggle)
streamrip 2.1.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 2,560 kB
  • sloc: python: 6,308; makefile: 5
file content (117 lines) | stat: -rw-r--r-- 4,283 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
from typing import Optional

from streamrip.media import Album, Artist
from streamrip.metadata import AlbumInfo, AlbumMetadata

# helper function to create an album with given parameters


def create_album(
    title: str,
    explicit: bool,
    sampling_rate: Optional[float],
    bit_depth: Optional[int],
    id: str,
) -> Album:
    info = AlbumInfo(
        id=id,
        quality=0,
        container="mp3",
        explicit=explicit,
        sampling_rate=sampling_rate,
        bit_depth=bit_depth,
    )
    metadata = AlbumMetadata(
        info=info,
        album=title,
        albumartist="artist",
        year="2020",
        genre=["genre"],
        covers=None,  # type: ignore
        tracktotal=10,
    )
    return Album(meta=metadata, tracks=[], config=None, folder="folder", db=None)  # type: ignore


# tests


def test_single_album():
    # one album should simply be returned
    album = create_album("Test Album", False, 44.1, 16, id="a1")
    result = Artist._filter_repeats([album])
    assert len(result) == 1
    assert result[0] == album


def test_different_titles():
    # albums with different titles should not be grouped
    album1 = create_album("Test Album", False, 44.1, 16, id="a1")
    album2 = create_album("Another Album", True, 96, 24, id="a2")
    result = Artist._filter_repeats([album1, album2])
    assert len(result) == 2
    titles = {a.meta.album.strip().lower() for a in result}
    assert "test album" in titles
    assert "another album" in titles


def test_same_title_different_bit_depth():
    # when bit_depth differs, the album with higher bit_depth wins
    album1 = create_album("Test Album", False, 44.1, 16, id="a1")
    album2 = create_album("Test Album (Deluxe)", False, 44.1, 24, id="a2")
    result = Artist._filter_repeats([album1, album2])
    assert len(result) == 1
    assert result[0] == album2


def test_same_title_tie_bit_depth_different_sampling():
    # same bit_depth; higher sampling_rate should win
    album1 = create_album("Test Album", False, 44.1, 24, id="a1")
    album2 = create_album("Test Album (Live)", False, 96, 24, id="a2")
    result = Artist._filter_repeats([album1, album2])
    assert len(result) == 1
    assert result[0] == album2


def test_same_title_tie_bit_depth_and_sampling_different_explicit():
    # if bit_depth and sampling_rate are tied, explicit true is prioritized
    album1 = create_album("Test Album", False, 96, 24, id="a1")
    album2 = create_album("Test Album (Edited)", True, 96, 24, id="a2")
    result = Artist._filter_repeats([album1, album2])
    assert len(result) == 1
    assert result[0] == album2


def test_grouping_normalization():
    # titles differing only by bracketed parts should be grouped together
    album1 = create_album("Album X", False, 44.1, 16, id="a1")
    album2 = create_album("Album X (Deluxe)", False, 96, 24, id="a2")
    album3 = create_album("Album X [Special Edition]", True, 44.1, 16, id="a3")
    result = Artist._filter_repeats([album1, album2, album3])
    assert len(result) == 1
    # album2 wins due to higher bit_depth and sampling_rate
    assert result[0] == album2


def test_multiple_groups():
    # multiple groups should yield one winner per group
    album_a1 = create_album("Album A", False, 44.1, 16, id="a1")
    album_a2 = create_album("Album A (Remastered)", True, 96, 24, id="a2")
    album_b1 = create_album("Album B", False, 96, 24, id="b1")
    album_b2 = create_album("Album B (Live)", True, 44.1, 16, id="b2")
    album_c1 = create_album("Album C", False, None, None, id="c1")
    result = Artist._filter_repeats([album_a1, album_a2, album_b1, album_b2, album_c1])
    assert len(result) == 3
    winners = {a.meta.info.id for a in result}
    # expected winners: album a2, album b1, album c1
    assert winners == {"a2", "b1", "c1"}


def test_missing_values():
    # albums with missing sampling_rate and bit_depth (treated as 0) should be sorted by explicit flag
    album1 = create_album("Test Album", False, None, None, id="a1")
    album2 = create_album("Test Album", True, None, None, id="a2")
    result = Artist._filter_repeats([album1, album2])
    assert len(result) == 1
    # explicit true wins over false when other quality metrics are equal (or missing)
    assert result[0] == album2