mirror of
https://github.com/Benexl/FastAnime.git
synced 2025-12-07 05:10:39 -08:00
129 lines
3.6 KiB
Python
129 lines
3.6 KiB
Python
import re
|
|
import shutil
|
|
import subprocess
|
|
|
|
from fastanime.constants import S_PLATFORM
|
|
|
|
|
|
def stream_video(MPV, url, mpv_args, custom_args):
|
|
process = subprocess.Popen(
|
|
[MPV, url, *mpv_args, *custom_args],
|
|
stdout=subprocess.PIPE,
|
|
stderr=subprocess.PIPE,
|
|
text=True,
|
|
)
|
|
|
|
last_time = None
|
|
av_time_pattern = re.compile(r"AV: ([0-9:]*) / ([0-9:]*) \(([0-9]*)%\)")
|
|
last_time = "0"
|
|
total_time = "0"
|
|
|
|
try:
|
|
while True:
|
|
if not process.stderr:
|
|
continue
|
|
output = process.stderr.readline()
|
|
|
|
if output:
|
|
# Match the timestamp in the output
|
|
match = av_time_pattern.search(output.strip())
|
|
if match:
|
|
current_time = match.group(1)
|
|
total_time = match.group(2)
|
|
match.group(3)
|
|
last_time = current_time
|
|
# print(f"Current stream time: {current_time}, Total time: {total_time}, Progress: {percentage}%")
|
|
|
|
# Check if the process has terminated
|
|
retcode = process.poll()
|
|
if retcode is not None:
|
|
print("Finshed at: ", last_time)
|
|
break
|
|
|
|
except Exception as e:
|
|
print(f"An error occurred: {e}")
|
|
finally:
|
|
process.terminate()
|
|
|
|
return last_time, total_time
|
|
|
|
|
|
def run_mpv(
|
|
link: str,
|
|
title: str | None = "",
|
|
start_time: str = "0",
|
|
ytdl_format="",
|
|
custom_args=[],
|
|
headers={},
|
|
):
|
|
# Determine if mpv is available
|
|
MPV = shutil.which("mpv")
|
|
|
|
# If title is None, set a default value
|
|
|
|
# Regex to check if the link is a YouTube URL
|
|
youtube_regex = r"(https?://)?(www\.)?(youtube|youtu|youtube-nocookie)\.(com|be)/.+"
|
|
|
|
if not MPV and not S_PLATFORM == "win32":
|
|
# Determine if the link is a YouTube URL
|
|
if re.match(youtube_regex, link):
|
|
# Android specific commands to launch mpv with a YouTube URL
|
|
args = [
|
|
"nohup",
|
|
"am",
|
|
"start",
|
|
"--user",
|
|
"0",
|
|
"-a",
|
|
"android.intent.action.VIEW",
|
|
"-d",
|
|
link,
|
|
"-n",
|
|
"com.google.android.youtube/.UrlActivity",
|
|
]
|
|
return "0", "0"
|
|
else:
|
|
# Android specific commands to launch mpv with a regular URL
|
|
args = [
|
|
"nohup",
|
|
"am",
|
|
"start",
|
|
"--user",
|
|
"0",
|
|
"-a",
|
|
"android.intent.action.VIEW",
|
|
"-d",
|
|
link,
|
|
"-n",
|
|
"is.xyz.mpv/.MPVActivity",
|
|
]
|
|
|
|
subprocess.run(args)
|
|
return "0", "0"
|
|
else:
|
|
# General mpv command with custom arguments
|
|
mpv_args = []
|
|
if headers:
|
|
mpv_headers = "--http-header-fields="
|
|
for header_name, header_value in headers.items():
|
|
mpv_headers += f"{header_name}:{header_value},"
|
|
mpv_args.append(mpv_headers)
|
|
if start_time != "0":
|
|
mpv_args.append(f"--start={start_time}")
|
|
if title:
|
|
mpv_args.append(f"--title={title}")
|
|
if ytdl_format:
|
|
mpv_args.append(f"--ytdl-format={ytdl_format}")
|
|
stop_time, total_time = stream_video(MPV, link, mpv_args, custom_args)
|
|
return stop_time, total_time
|
|
|
|
|
|
# Example usage
|
|
if __name__ == "__main__":
|
|
run_mpv(
|
|
"https://www.youtube.com/watch?v=dQw4w9WgXcQ",
|
|
"Example Video",
|
|
"--fullscreen",
|
|
"--volume=50",
|
|
)
|