forked from DRMTalks/devine
feat(Track): Make ID optional, Automatically compute one if not provided
This commit is contained in:
parent
fa9db335d6
commit
bd90bd6dca
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue