77 lines
2.3 KiB
Python
77 lines
2.3 KiB
Python
import glob
|
|
import pathlib
|
|
import re
|
|
from urllib.parse import quote
|
|
from Utils import calcDownloadPath
|
|
import pathlib
|
|
from .ffprobe import FFProbe
|
|
from .Subtitle import Subtitle
|
|
|
|
|
|
class Playlist:
|
|
_url: str = None
|
|
|
|
def __init__(self, url: str):
|
|
self.url = url
|
|
|
|
async def make(self, download_path: str, file: str):
|
|
rFile = pathlib.Path(calcDownloadPath(basePath=download_path, folder=file, createPath=False))
|
|
|
|
if not rFile.exists():
|
|
raise Exception(f"File '{rFile}' does not exist.")
|
|
|
|
try:
|
|
ffprobe = FFProbe(rFile)
|
|
await ffprobe.run()
|
|
except UnicodeDecodeError as e:
|
|
pass
|
|
|
|
if not 'duration' in ffprobe.metadata:
|
|
raise Exception(f"Unable to get '{rFile}' duration.")
|
|
|
|
duration: float = float(ffprobe.metadata.get('duration'))
|
|
|
|
playlist = []
|
|
playlist.append("#EXTM3U")
|
|
|
|
subs = ""
|
|
|
|
index = 0
|
|
for item in self.getSideCarFiles(rFile):
|
|
if not item.suffix in Subtitle.allowedExtensions:
|
|
continue
|
|
|
|
index += 1
|
|
lang: str = "und"
|
|
lg = re.search(r'\.(?P<lang>\w{2,3})\.\w{3}$', item.name)
|
|
if lg:
|
|
lang = lg.groupdict().get('lang')
|
|
|
|
subs = ',SUBTITLES="subs"'
|
|
|
|
url = f"{self.url}player/m3u8/subtitle/{quote(str(pathlib.Path(file).with_name(item.name)))}.m3u8?duration={duration}"
|
|
name = f"{item.suffix[1:].upper()} ({index}) - {lang}"
|
|
playlist.append(
|
|
f'#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="{name}",DEFAULT=NO,AUTOSELECT=NO,FORCED=NO,LANGUAGE="{lang}",URI="{url}"')
|
|
|
|
playlist.append(f'#EXT-X-STREAM-INF:PROGRAM-ID=1{subs}')
|
|
playlist.append(f"{self.url}player/m3u8/video/{quote(file)}.m3u8")
|
|
|
|
return '\n'.join(playlist)
|
|
|
|
def getSideCarFiles(self, file: pathlib.Path) -> list[pathlib.Path]:
|
|
"""
|
|
Get sidecar files for the given file.
|
|
|
|
:param file: File to get sidecar files for.
|
|
:return: List of sidecar files.
|
|
"""
|
|
files = []
|
|
|
|
for sub_file in file.parent.glob(f"{glob.escape(file.stem)}.*"):
|
|
if sub_file == file or sub_file.is_file() is False or sub_file.stem.startswith('.'):
|
|
continue
|
|
|
|
files.append(sub_file)
|
|
|
|
return files
|