title_pattern = re.compile(r"title=\"(?P<title>.*?)\"")
artist_pattern = re.compile(r"artist=\"(?P<artist>.*?)\"")
dot_com_pattern = re.compile(r"(?P<netloc>\(?\w+\.(?:\w+\.)?(\w{2,3})\)?)")
-ad_pattern = re.compile(r"((ad|advertisement)_)|^AD\s\d+$|ADBREAK", flags=re.I)
-title_artist_order_pattern = re.compile(r"(?P<title>.+)\sBy:\s(?P<artist>.+)", flags=re.I)
+ad_pattern = re.compile(r"((ad|advertisement)_)|^AD\s\d+$|ADBREAK", flags=re.IGNORECASE)
+title_artist_order_pattern = re.compile(r"(?P<title>.+)\sBy:\s(?P<artist>.+)", flags=re.IGNORECASE)
multi_space_pattern = re.compile(r"\s{2,}")
end_junk_pattern = re.compile(r"(.+?)(\s\W+)$")
value = self.label
if not isinstance(value, expected_type):
# handle common conversions/mistakes
- if expected_type == float and isinstance(value, int):
+ if expected_type is float and isinstance(value, int):
self.value = float(value)
return self.value
- if expected_type == int and isinstance(value, float):
+ if expected_type is int and isinstance(value, float):
self.value = int(value)
return self.value
for val_type in (int, float):
class Track(MediaItem):
"""Model for a track."""
+ __hash__ = _MediaItemBase.__hash__
__eq__ = _MediaItemBase.__eq__
media_type: MediaType = MediaType.TRACK
disc_number: int | None = None # required for album tracks
track_number: int | None = None # required for album tracks
- def __hash__(self) -> int:
- """Return custom hash."""
- return hash((self.provider, self.item_id))
-
@property
def has_chapters(self) -> bool:
"""
for track_album in track_albums:
if compare_album(track_album, compare_item.album, False):
return True
- # edge case: albumless track
- if (
+ # accept last resort: albumless track and (near) exact duration
+ # otherwise fail all other cases
+ return (
base_item.album is None
and compare_item.album is None
and abs(base_item.duration - compare_item.duration) <= 1
- ):
- return True
-
- # all efforts failed, this is NOT a match
- return False
+ )
def compare_playlist(
alt_comp = create_safe_string(alt)
if base_comp in alt_comp:
return True
- if alt_comp in base_comp:
- return True
- return False
+ return alt_comp in base_comp
def compare_strings(str1: str, str2: str, strict: bool = True) -> bool:
"pytest-cov==5.0.0",
"syrupy==4.6.1",
"tomli==2.0.1",
- "ruff==0.4.10",
+ "ruff==0.5.0",
]
[project.scripts]