From e8beac0d8abfaf620b6d752d8a503bd66b1c00e6 Mon Sep 17 00:00:00 2001 From: xiaoQQya Date: Mon, 18 Nov 2024 11:29:06 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20=E6=96=B0=E5=A2=9E=20alist-strm-lit?= =?UTF-8?q?e=20=E6=A8=A1=E5=9D=97=EF=BC=8C=E5=9F=BA=E4=BA=8E=20WebDAV=20?= =?UTF-8?q?=E7=94=9F=E6=88=90=20strm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit 9c859b212eb8cc4cf3d50c6543117ff6a8cedae4) --- media_servers/alist_strm_lite.py | 90 ++++++++++++++++++++++++++++++++ requirements.txt | 1 + 2 files changed, 91 insertions(+) create mode 100644 media_servers/alist_strm_lite.py diff --git a/media_servers/alist_strm_lite.py b/media_servers/alist_strm_lite.py new file mode 100644 index 0000000..7f5c418 --- /dev/null +++ b/media_servers/alist_strm_lite.py @@ -0,0 +1,90 @@ +#!/usr/bin/python3 +# -*- encoding: utf-8 -*- +""" +@File : alist_strm_lite.py +@Desc : Alist 生成 strm 文件简化版(基于 WebDAV) +@Version : v1.0 +@Time : 2024/11/16 +@Author : xiaoQQya +@Contact : xiaoQQya@126.com +""" +import os +import re +from webdav3.client import Client + + +class Alist_strm_lite: + + video_exts = ["mp4", "mkv", "flv", "mov", "m4v", "avi", "webm", "wmv"] + default_config = {"url": "", "webdav_username": "", "webdav_password": "", "path_prefix": "/quark", "quark_root_dir": "/", "strm_save_dir": "/media", "strm_url_host": ""} + is_active = False + + def __init__(self, **kwargs): + if kwargs: + for key, _ in self.default_config.items(): + if key in kwargs: + setattr(self, key, kwargs[key]) + else: + print(f"{self.__class__.__name__} 模块缺少必要参数: {key}") + + options = { + "webdav_hostname": f"{self.url.rstrip('/')}/dav/", + "webdav_login": self.webdav_username, + "webdav_password": self.webdav_password, + "disable_check": True + } + self.client = Client(options) + + if self.url and self.webdav_username and self.webdav_password and self.get_info(): + self.is_active = True + + def run(self, task): + if task.get("savepath") and task.get("savepath").startswith(self.quark_root_dir): + path = self._normalize_path(task["savepath"]) + self.refresh(path) + + def get_info(self): + try: + response = self.client.info("/") + if response.get("name"): + print(f"Alist2strm Lite: {response.get('name')}") + return True + else: + print(f"Alist2strm Lite: 连接失败❌ {response}") + except Exception as e: + print(f"Alist2strm Lite: 获取信息出错 {e}") + return False + + def refresh(self, path): + try: + files = self.client.list(path) + + for item in files[1:]: + full_path = re.sub(r"/{2,}", "/", f"{path}/{item}") + if full_path.endswith("/"): + self.refresh(full_path) + else: + self.generate_strm(full_path) + return True + except Exception as e: + print(f"📺 生成STRM文件失败❌ {e}") + return False + + def generate_strm(self, file_path): + ext = file_path.split(".")[-1] + if ext.lower() in self.video_exts: + strm_path = re.sub(r"/{2,}", "/", f"{self.strm_save_dir}{file_path.rstrip(ext)}strm") + if os.path.exists(strm_path): + return + if not os.path.exists(os.path.dirname(strm_path)): + os.makedirs(os.path.dirname(strm_path)) + with open(strm_path, "w", encoding="utf-8") as strm_file: + host = self.strm_url_host.rstrip("/") if self.strm_url_host.strip() else self.url.rstrip("/") + strm_file.write(f"{host}/d{file_path}") + print(f"📺 生成STRM文件 {strm_path} 成功✅") + + def _normalize_path(self, path): + """标准化路径格式""" + if not path.startswith(self.path_prefix): + path = f"/{self.path_prefix}/{path.lstrip(self.quark_root_dir)}" + return re.sub(r"/{2,}", "/", path) diff --git a/requirements.txt b/requirements.txt index 0636d0c..5c1eddb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,3 +2,4 @@ flask apscheduler requests treelib +webdavclient3