From 0b1371cc69cd2f07711a09e0427817ed69b9d800 Mon Sep 17 00:00:00 2001 From: Meng Sen Date: Fri, 18 Jul 2025 12:37:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=91=E5=B8=83=E5=BA=94=E7=94=A8=20LibreTV?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Meng Sen --- .github/README.md | 1 + README.md | 1 + apps/libretv/202507110114/data.yml | 17 ++++++++ apps/libretv/202507110114/docker-compose.yml | 20 +++++++++ apps/libretv/202507110114/envs/default.env | 2 + apps/libretv/202507110114/envs/global.env | 2 + apps/libretv/202507110114/scripts/init.sh | 17 ++++++++ .../libretv/202507110114/scripts/uninstall.sh | 10 +++++ apps/libretv/202507110114/scripts/upgrade.sh | 17 ++++++++ apps/libretv/README.md | 41 ++++++++++++++++++ apps/libretv/data.yml | 14 ++++++ apps/libretv/latest/data.yml | 17 ++++++++ apps/libretv/latest/docker-compose.yml | 20 +++++++++ apps/libretv/latest/envs/default.env | 2 + apps/libretv/latest/envs/global.env | 2 + apps/libretv/latest/scripts/init.sh | 17 ++++++++ apps/libretv/latest/scripts/uninstall.sh | 10 +++++ apps/libretv/latest/scripts/upgrade.sh | 17 ++++++++ apps/libretv/logo.png | Bin 0 -> 10825 bytes 19 files changed, 227 insertions(+) create mode 100644 apps/libretv/202507110114/data.yml create mode 100644 apps/libretv/202507110114/docker-compose.yml create mode 100644 apps/libretv/202507110114/envs/default.env create mode 100644 apps/libretv/202507110114/envs/global.env create mode 100644 apps/libretv/202507110114/scripts/init.sh create mode 100644 apps/libretv/202507110114/scripts/uninstall.sh create mode 100644 apps/libretv/202507110114/scripts/upgrade.sh create mode 100644 apps/libretv/README.md create mode 100644 apps/libretv/data.yml create mode 100644 apps/libretv/latest/data.yml create mode 100644 apps/libretv/latest/docker-compose.yml create mode 100644 apps/libretv/latest/envs/default.env create mode 100644 apps/libretv/latest/envs/global.env create mode 100644 apps/libretv/latest/scripts/init.sh create mode 100644 apps/libretv/latest/scripts/uninstall.sh create mode 100644 apps/libretv/latest/scripts/upgrade.sh create mode 100644 apps/libretv/logo.png diff --git a/.github/README.md b/.github/README.md index 2e960ad44..dddd6b945 100644 --- a/.github/README.md +++ b/.github/README.md @@ -98,6 +98,7 @@ | 🟢 | | Kavita | https://www.kavitareader.com/ | 自托管数字图书馆 | | | 🟢 | | Kimai | https://www.kimai.org/ | 基于网络的多用户时间追踪应用 | | | 🟢 | | Komga | https://komga.org/ | 漫画、漫画、蓝光光盘、杂志和电子书的媒体服务器 | | +| 🟢 | | LibreTV | https://libretv.is-an.org/ | 免费在线视频搜索与观看平台 | | | 🟢 | | 问卷星 | https://www.limesurvey.org/ | 在线问卷调查程序 | | | 🟢 | | LinkDing | https://github.com/sissbruecker/linkding/ | 自托管书签管理器 | | | 🟢 | | Logto | https://logto.io/ | 开发者更好的身份基础设施,以及 Auth0 的开源替代方案。 | | diff --git a/README.md b/README.md index 3d03a0843..e96cf7b6b 100644 --- a/README.md +++ b/README.md @@ -93,6 +93,7 @@ | 🟢 | | Kavita | https://www.kavitareader.com/ | 自托管数字图书馆 | | | 🟢 | | Kimai | https://www.kimai.org/ | 基于网络的多用户时间追踪应用 | | | 🟢 | | Komga | https://komga.org/ | 漫画、漫画、蓝光光盘、杂志和电子书的媒体服务器 | | +| 🟢 | | LibreTV | https://libretv.is-an.org/ | 免费在线视频搜索与观看平台 | | | 🟢 | | 问卷星 | https://www.limesurvey.org/ | 在线问卷调查程序 | | | 🟢 | | LinkDing | https://github.com/sissbruecker/linkding/ | 自托管书签管理器 | | | 🟢 | | Logto | https://logto.io/ | 开发者更好的身份基础设施,以及 Auth0 的开源替代方案。 | | diff --git a/apps/libretv/202507110114/data.yml b/apps/libretv/202507110114/data.yml new file mode 100644 index 000000000..b24844ed2 --- /dev/null +++ b/apps/libretv/202507110114/data.yml @@ -0,0 +1,17 @@ +additionalProperties: + formFields: + - default: 8080 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelZh: WebUI 端口 + labelEn: WebUI port + required: true + rule: paramPort + type: number + - default: "libretv" + edit: true + envKey: PASSWORD + labelZh: 密码 + labelEn: Password + required: true + type: password diff --git a/apps/libretv/202507110114/docker-compose.yml b/apps/libretv/202507110114/docker-compose.yml new file mode 100644 index 000000000..c738d9658 --- /dev/null +++ b/apps/libretv/202507110114/docker-compose.yml @@ -0,0 +1,20 @@ +networks: + 1panel-network: + external: true + +services: + libretv: + image: bestzwei/libretv:202507110114 + container_name: ${CONTAINER_NAME} + labels: + createdBy: "Apps" + restart: always + networks: + - 1panel-network + ports: + - ${PANEL_APP_PORT_HTTP}:8080 + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + environment: + - TZ=Asia/Shanghai diff --git a/apps/libretv/202507110114/envs/default.env b/apps/libretv/202507110114/envs/default.env new file mode 100644 index 000000000..cd05f46e6 --- /dev/null +++ b/apps/libretv/202507110114/envs/default.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +ENV_FILE=.env diff --git a/apps/libretv/202507110114/envs/global.env b/apps/libretv/202507110114/envs/global.env new file mode 100644 index 000000000..e10989fe4 --- /dev/null +++ b/apps/libretv/202507110114/envs/global.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +TZ=Asia/Shanghai diff --git a/apps/libretv/202507110114/scripts/init.sh b/apps/libretv/202507110114/scripts/init.sh new file mode 100644 index 000000000..07fb8c3fe --- /dev/null +++ b/apps/libretv/202507110114/scripts/init.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + # setup-1 add default values + CURRENT_DIR=$(pwd) + sed -i '/^ENV_FILE=/d' .env + sed -i '/^GLOBAL_ENV_FILE=/d' .env + echo "ENV_FILE=${CURRENT_DIR}/.env" >> .env + echo "GLOBAL_ENV_FILE=${CURRENT_DIR}/envs/global.env" >> .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/apps/libretv/202507110114/scripts/uninstall.sh b/apps/libretv/202507110114/scripts/uninstall.sh new file mode 100644 index 000000000..c86c4fbca --- /dev/null +++ b/apps/libretv/202507110114/scripts/uninstall.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/apps/libretv/202507110114/scripts/upgrade.sh b/apps/libretv/202507110114/scripts/upgrade.sh new file mode 100644 index 000000000..07fb8c3fe --- /dev/null +++ b/apps/libretv/202507110114/scripts/upgrade.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + # setup-1 add default values + CURRENT_DIR=$(pwd) + sed -i '/^ENV_FILE=/d' .env + sed -i '/^GLOBAL_ENV_FILE=/d' .env + echo "ENV_FILE=${CURRENT_DIR}/.env" >> .env + echo "GLOBAL_ENV_FILE=${CURRENT_DIR}/envs/global.env" >> .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/apps/libretv/README.md b/apps/libretv/README.md new file mode 100644 index 000000000..44dec344c --- /dev/null +++ b/apps/libretv/README.md @@ -0,0 +1,41 @@ +# LibreTV + +自由观影,畅享精彩 + +![LibreTV](https://file.lifebus.top/imgs/libretv_cover.png) + +![](https://img.shields.io/badge/%E6%96%B0%E7%96%86%E8%90%8C%E6%A3%AE%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91%E5%B7%A5%E4%BD%9C%E5%AE%A4-%E6%8F%90%E4%BE%9B%E6%8A%80%E6%9C%AF%E6%94%AF%E6%8C%81-blue) + +## 简介 + +LibreTV 是一个轻量级、免费的在线视频搜索与观看平台,提供来自多个视频源的内容搜索与播放服务。无需注册,即开即用,支持多种设备访问。项目结合了前端技术和后端代理功能,可部署在支持服务端功能的各类网站托管服务上。 + +## 特性 + +### 完全免费 + +100%免费使用,无任何付费功能,无会员制度,让每个人都能享受自由观影。 + +### 智能广告过滤 + +内置HLS广告切片过滤逻辑,尽可能减少视频播放中的广告干扰,提供更纯净的观影体验。 + +### 开源透明 + +完全开源,代码透明,社区驱动开发,安全可信赖。 + +### 多源聚合 + +聚合多个优质视频源,智能搜索,丰富的内容库满足不同用户的观影需求。支持标准苹果CMS V10 API格式,可自定义接口源。 + +### 响应式设计 + +完美适配手机、平板、电脑等各种设备,支持键盘快捷键操作,随时随地享受观影。 + +### 易于部署 + +支持Docker、Vercel、Netlify、Cloudflare等多种部署方式,快速搭建个人实例。 + +--- + +![Ms Studio](https://file.lifebus.top/imgs/ms_blank_001.png) diff --git a/apps/libretv/data.yml b/apps/libretv/data.yml new file mode 100644 index 000000000..1bf1ad129 --- /dev/null +++ b/apps/libretv/data.yml @@ -0,0 +1,14 @@ +additionalProperties: + key: libretv + name: LibreTV + tags: + - WebSite + - Local + shortDescZh: 免费在线视频搜索与观看平台 + shortDescEn: Free online video search and viewing platform + type: website + crossVersionUpdate: true + limit: 0 + website: https://libretv.is-an.org/ + github: https://github.com/LibreSpark/LibreTV/ + document: https://libretv.is-an.org/ diff --git a/apps/libretv/latest/data.yml b/apps/libretv/latest/data.yml new file mode 100644 index 000000000..b24844ed2 --- /dev/null +++ b/apps/libretv/latest/data.yml @@ -0,0 +1,17 @@ +additionalProperties: + formFields: + - default: 8080 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelZh: WebUI 端口 + labelEn: WebUI port + required: true + rule: paramPort + type: number + - default: "libretv" + edit: true + envKey: PASSWORD + labelZh: 密码 + labelEn: Password + required: true + type: password diff --git a/apps/libretv/latest/docker-compose.yml b/apps/libretv/latest/docker-compose.yml new file mode 100644 index 000000000..0f5952646 --- /dev/null +++ b/apps/libretv/latest/docker-compose.yml @@ -0,0 +1,20 @@ +networks: + 1panel-network: + external: true + +services: + libretv: + image: bestzwei/libretv:latest + container_name: ${CONTAINER_NAME} + labels: + createdBy: "Apps" + restart: always + networks: + - 1panel-network + ports: + - ${PANEL_APP_PORT_HTTP}:8080 + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + environment: + - TZ=Asia/Shanghai diff --git a/apps/libretv/latest/envs/default.env b/apps/libretv/latest/envs/default.env new file mode 100644 index 000000000..cd05f46e6 --- /dev/null +++ b/apps/libretv/latest/envs/default.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +ENV_FILE=.env diff --git a/apps/libretv/latest/envs/global.env b/apps/libretv/latest/envs/global.env new file mode 100644 index 000000000..e10989fe4 --- /dev/null +++ b/apps/libretv/latest/envs/global.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +TZ=Asia/Shanghai diff --git a/apps/libretv/latest/scripts/init.sh b/apps/libretv/latest/scripts/init.sh new file mode 100644 index 000000000..07fb8c3fe --- /dev/null +++ b/apps/libretv/latest/scripts/init.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + # setup-1 add default values + CURRENT_DIR=$(pwd) + sed -i '/^ENV_FILE=/d' .env + sed -i '/^GLOBAL_ENV_FILE=/d' .env + echo "ENV_FILE=${CURRENT_DIR}/.env" >> .env + echo "GLOBAL_ENV_FILE=${CURRENT_DIR}/envs/global.env" >> .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/apps/libretv/latest/scripts/uninstall.sh b/apps/libretv/latest/scripts/uninstall.sh new file mode 100644 index 000000000..c86c4fbca --- /dev/null +++ b/apps/libretv/latest/scripts/uninstall.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/apps/libretv/latest/scripts/upgrade.sh b/apps/libretv/latest/scripts/upgrade.sh new file mode 100644 index 000000000..07fb8c3fe --- /dev/null +++ b/apps/libretv/latest/scripts/upgrade.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +if [ -f .env ]; then + source .env + + # setup-1 add default values + CURRENT_DIR=$(pwd) + sed -i '/^ENV_FILE=/d' .env + sed -i '/^GLOBAL_ENV_FILE=/d' .env + echo "ENV_FILE=${CURRENT_DIR}/.env" >> .env + echo "GLOBAL_ENV_FILE=${CURRENT_DIR}/envs/global.env" >> .env + + echo "Check Finish." + +else + echo "Error: .env file not found." +fi diff --git a/apps/libretv/logo.png b/apps/libretv/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..1d96ad75671f46837f96abc96f7b9c50cf190d84 GIT binary patch literal 10825 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 r>c3BH{ri~OzmMiU5Lrz7ze6Ic