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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