feat(Track): Make ID optional, Automatically compute one if not provided

This commit is contained in:
rlaphoenix 2024-03-01 03:26:59 +00:00
parent fa9db335d6
commit bd90bd6dca
1 changed files with 14 additions and 5 deletions

View File

@ -2,10 +2,12 @@ import base64
import re
import shutil
import subprocess
from copy import copy
from enum import Enum
from pathlib import Path
from typing import Any, Callable, Iterable, Optional, Union
from uuid import UUID
from zlib import crc32
import m3u8
import requests
@ -25,7 +27,6 @@ class Track:
def __init__(
self,
id_: str,
url: Union[str, list[str]],
language: Union[Language, str],
is_original_lang: bool = False,
@ -33,10 +34,9 @@ class Track:
needs_repack: bool = False,
drm: Optional[Iterable[DRM_T]] = None,
edition: Optional[str] = None,
extra: Optional[Any] = None
extra: Optional[Any] = None,
id_: Optional[str] = None,
) -> None:
if not isinstance(id_, str):
raise TypeError(f"Expected id to be a {str}, not {type(id_)}")
if not isinstance(url, (str, list)):
raise TypeError(f"Expected url to be a {str}, or list of {str}, not {type(url)}")
if not isinstance(language, (Language, str)):
@ -47,6 +47,8 @@ class Track:
raise TypeError(f"Expected descriptor to be a {Track.Descriptor}, not {type(descriptor)}")
if not isinstance(needs_repack, bool):
raise TypeError(f"Expected needs_repack to be a {bool}, not {type(needs_repack)}")
if not isinstance(id_, (str, type(None))):
raise TypeError(f"Expected id_ to be a {str}, not {type(id_)}")
if not isinstance(edition, (str, type(None))):
raise TypeError(f"Expected edition to be a {str}, not {type(edition)}")
@ -60,7 +62,6 @@ class Track:
except TypeError:
raise TypeError(f"Expected drm to be an iterable, not {type(drm)}")
self.id = id_
self.url = url
# required basic metadata
self.language = Language.get(language)
@ -74,6 +75,14 @@ class Track:
self.edition: str = edition
self.extra: Any = extra or {} # allow anything for extra, but default to a dict
if not id_:
this = copy(self)
this.url = self.url.rsplit("?", maxsplit=1)[0]
checksum = crc32(repr(self).encode("utf8"))
id_ = hex(checksum)[2:]
self.id = id_
# TODO: Currently using OnFoo event naming, change to just segment_filter
self.OnSegmentFilter: Optional[Callable] = None