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