aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/yt_dlp_plugins/extractor/radiko_hacks.py
blob: 7b206542671fd6043b70859d080cda217718c6d4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import datetime

from yt_dlp.extractor.common import InfoExtractor
from yt_dlp.utils import (
	join_nonempty,
	update_url_query,
	traverse_obj,
)

# "hacks" as in great jank/schizo shit that works anyway

def _generate_as_live_chunks(playlist_url, start_at, end_at):
	chunks = []
	chunk_length = 300  # max the api allows

	duration = int(end_at.timestamp() - start_at.timestamp())
	cursor = 0
	while cursor < duration:
		chunk_length = min(chunk_length, duration - cursor)
		chunk_start = start_at + datetime.timedelta(seconds=cursor)
		chunk_url = update_url_query(playlist_url, {
			"seek": chunk_start.timestring(),
			"l": chunk_length,
		})
		chunks.append(chunk_url)
		cursor += chunk_length

	return chunks

def _playlist_from_chunks(self, chunks, src_id, headers={}):
	playlist = ""
	for i, chunk in enumerate(chunks):
		i +=1 # for more friendly cli output, it gets reset each loop so it shouldnt effect anything
		chunk_id = join_nonempty(src_id, i)
		base_format = self._extract_m3u8_formats(
			chunk, chunk_id, fatal=False, headers=headers,
			note=f"Preparing {src_id} chunk {i}"
		)
		m3u8_url = traverse_obj(base_format, (..., "url",), get_all=False)
		playlist += self._download_webpage(m3u8_url, chunk_id, note=f"Getting {src_id} chunk {i} fragments")
	return playlist