Fix for M3U8 Hotstar

This commit is contained in:
chu23465 2025-04-16 17:20:32 +05:30
parent 5b88624051
commit a8edede94b
5 changed files with 125 additions and 112 deletions

View File

@ -71,7 +71,7 @@ class Track:
ISM = 4 # https://bitmovin.com/blog/microsoft-smooth-streaming-mss/ ISM = 4 # https://bitmovin.com/blog/microsoft-smooth-streaming-mss/
def __init__(self, id_, source, url, codec, language=None, descriptor=Descriptor.URL, def __init__(self, id_, source, url, codec, language=None, descriptor=Descriptor.URL,
needs_proxy=False, needs_repack=False, encrypted=False, psshWV=None, psshPR=None, note=None, kid=None, key=None, extra=None): needs_proxy=False, needs_repack=False, encrypted=False, psshWV=None, psshPR=None, note=None, kid=None, key=None, extra=None, original_url=None):
self.id = id_ self.id = id_
self.source = source self.source = source
self.url = url self.url = url
@ -94,6 +94,8 @@ class Track:
# extra data # extra data
self.extra = extra or {} # allow anything for extra, but default to a dict self.extra = extra or {} # allow anything for extra, but default to a dict
self.original_url = original_url
# should only be set internally # should only be set internally
self._location = None self._location = None

View File

@ -196,6 +196,7 @@ def parse(*, url=None, data=None, source, session=None, downloader=None):
tracks.append(VideoTrack( tracks.append(VideoTrack(
id_=track_id, id_=track_id,
source=source, source=source,
original_url=url,
url=url, url=url,
# metadata # metadata
codec=(codec or "").split(".")[0], codec=(codec or "").split(".")[0],

View File

@ -62,6 +62,7 @@ def parse(master, source=None):
[VideoTrack( [VideoTrack(
id_=md5(str(x).encode()).hexdigest()[0:7], # 7 chars only for filename length id_=md5(str(x).encode()).hexdigest()[0:7], # 7 chars only for filename length
source=source, source=source,
original_url=x.base_uri + x.uri,
url=("" if re.match("^https?://", x.uri) else x.base_uri) + x.uri, url=("" if re.match("^https?://", x.uri) else x.base_uri) + x.uri,
# metadata # metadata
codec=x.stream_info.codecs.split(",")[0].split(".")[0], # first codec may not be for the video codec=x.stream_info.codecs.split(",")[0].split(".")[0], # first codec may not be for the video
@ -87,6 +88,7 @@ def parse(master, source=None):
[AudioTrack( [AudioTrack(
id_=md5(str(x).encode()).hexdigest()[0:6], id_=md5(str(x).encode()).hexdigest()[0:6],
source=source, source=source,
original_url=x.base_uri + x.uri,
url=("" if re.match("^https?://", x.uri) else x.base_uri) + x.uri, url=("" if re.match("^https?://", x.uri) else x.base_uri) + x.uri,
# metadata # metadata
codec=x.group_id.replace("audio-", "").split("-")[0].split(".")[0], codec=x.group_id.replace("audio-", "").split("-")[0].split(".")[0],
@ -108,6 +110,7 @@ def parse(master, source=None):
[TextTrack( [TextTrack(
id_=md5(str(x).encode()).hexdigest()[0:6], id_=md5(str(x).encode()).hexdigest()[0:6],
source=source, source=source,
original_url=x.base_uri + x.uri,
url=("" if re.match("^https?://", x.uri) else x.base_uri) + x.uri, url=("" if re.match("^https?://", x.uri) else x.base_uri) + x.uri,
# metadata # metadata
codec="vtt", # assuming VTT, codec info isn't shown codec="vtt", # assuming VTT, codec info isn't shown

View File

@ -287,7 +287,8 @@ def parse(*, url=None, data=None, source, session=None, downloader=None):
tracks.append(VideoTrack( tracks.append(VideoTrack(
id_=track_id, id_=track_id,
source=source, source=source,
url=url if source == "HS" else track_url, original_url=url,
url=track_url,
# metadata # metadata
codec=(codecs or "").split(".")[0], codec=(codecs or "").split(".")[0],
language=track_lang, language=track_lang,
@ -324,7 +325,8 @@ def parse(*, url=None, data=None, source, session=None, downloader=None):
tracks.append(AudioTrack( tracks.append(AudioTrack(
id_=track_id, id_=track_id,
source=source, source=source,
url=url if source == "HS" else track_url, original_url=url,
url=track_url,
# metadata # metadata
codec=(codecs or "").split(".")[0], codec=(codecs or "").split(".")[0],
language=track_lang, language=track_lang,
@ -375,6 +377,7 @@ def parse(*, url=None, data=None, source, session=None, downloader=None):
tracks.append(TextTrack( tracks.append(TextTrack(
id_=track_id, id_=track_id,
source=source, source=source,
original_url=url,
url=track_url, url=track_url,
# metadata # metadata
codec=(codecs or "").split(".")[0], codec=(codecs or "").split(".")[0],
@ -390,6 +393,7 @@ def parse(*, url=None, data=None, source, session=None, downloader=None):
tracks.append(TextTrack( tracks.append(TextTrack(
id_=track_id, id_=track_id,
source=source, source=source,
original_url=url,
url=track_url, url=track_url,
# metadata # metadata
codec=(codecs or "").split(".")[0], codec=(codecs or "").split(".")[0],

View File

@ -248,8 +248,7 @@ async def m3u8dl(uri, out, track, headers=None, proxy=None):
ffmpeg_binary = shutil.which("ffmpeg") or "/usr/bin/ffmpeg" ffmpeg_binary = shutil.which("ffmpeg") or "/usr/bin/ffmpeg"
arguments = [ arguments = [
executable, executable,
uri, track.original_url or uri,
**["--max-speed", "12M"] if "akamai" in uri else "",
"--save-dir", f'"{os.path.dirname(out)}"', "--save-dir", f'"{os.path.dirname(out)}"',
"--tmp-dir", f'"{os.path.dirname(out)}"', "--tmp-dir", f'"{os.path.dirname(out)}"',
"--save-name", f'"{os.path.basename(out).replace(".mp4", "")}"', "--save-name", f'"{os.path.basename(out).replace(".mp4", "")}"',
@ -264,13 +263,17 @@ async def m3u8dl(uri, out, track, headers=None, proxy=None):
arguments.extend(["--header", f'"Cookie:{headers["cookie"].replace(" ", "")}"']) arguments.extend(["--header", f'"Cookie:{headers["cookie"].replace(" ", "")}"'])
#for k,v in headers.items(): #for k,v in headers.items():
if "akamai" in uri:
arguments.append("--max-speed")
arguments.append("12M")
if proxy: if proxy:
arguments.extend(["--custom-proxy", proxy]) arguments.extend(["--custom-proxy", proxy])
if not ("linux" in platform): if not ("linux" in platform):
arguments.extend(["--http-request-timeout", "8"]) arguments.extend(["--http-request-timeout", "8"])
if track.__class__.__name__ == "VideoTrack": if track.__class__.__name__ == "VideoTrack":
if track.height: from vinetrimmer.objects.tracks import Track
if track.height and not (track.descriptor == Track.Descriptor.M3U):
arguments.extend([ arguments.extend([
"-sv", f"res='{track.height}*':codec='{track.codec}':for=best" "-sv", f"res='{track.height}*':codec='{track.codec}':for=best"
]) ])