From dff800ffb171c224bbe8ed88c353a3170a76370c Mon Sep 17 00:00:00 2001 From: ms Date: Tue, 10 Mar 2026 10:51:17 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=91=E5=B8=83=20Emby=20Pulse?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/emby-pulse/1.2.0.553/data.yml | 17 ++++ apps/emby-pulse/1.2.0.553/docker-compose.yml | 24 +++++ apps/emby-pulse/1.2.0.553/envs/default.env | 2 + apps/emby-pulse/1.2.0.553/envs/global.env | 2 + apps/emby-pulse/1.2.0.553/scripts/init.sh | 17 ++++ .../emby-pulse/1.2.0.553/scripts/uninstall.sh | 10 +++ apps/emby-pulse/1.2.0.553/scripts/upgrade.sh | 17 ++++ apps/emby-pulse/README.md | 82 ++++++++++++++++++ apps/emby-pulse/data.yml | 17 ++++ apps/emby-pulse/logo.png | Bin 0 -> 19080 bytes 10 files changed, 188 insertions(+) create mode 100644 apps/emby-pulse/1.2.0.553/data.yml create mode 100644 apps/emby-pulse/1.2.0.553/docker-compose.yml create mode 100644 apps/emby-pulse/1.2.0.553/envs/default.env create mode 100644 apps/emby-pulse/1.2.0.553/envs/global.env create mode 100644 apps/emby-pulse/1.2.0.553/scripts/init.sh create mode 100644 apps/emby-pulse/1.2.0.553/scripts/uninstall.sh create mode 100644 apps/emby-pulse/1.2.0.553/scripts/upgrade.sh create mode 100644 apps/emby-pulse/README.md create mode 100644 apps/emby-pulse/data.yml create mode 100644 apps/emby-pulse/logo.png diff --git a/apps/emby-pulse/1.2.0.553/data.yml b/apps/emby-pulse/1.2.0.553/data.yml new file mode 100644 index 000000000..1ace2f12b --- /dev/null +++ b/apps/emby-pulse/1.2.0.553/data.yml @@ -0,0 +1,17 @@ +additionalProperties: + formFields: + - default: "/home/emby-pulse" + edit: true + envKey: EMBY_PULSE_ROOT_PATH + labelZh: 数据持久化路径 + labelEn: Data persistence path + required: true + type: text + - default: 10307 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelZh: WebUI 端口 + labelEn: WebUI port + required: true + rule: paramPort + type: number diff --git a/apps/emby-pulse/1.2.0.553/docker-compose.yml b/apps/emby-pulse/1.2.0.553/docker-compose.yml new file mode 100644 index 000000000..4fe052018 --- /dev/null +++ b/apps/emby-pulse/1.2.0.553/docker-compose.yml @@ -0,0 +1,24 @@ +networks: + 1panel-network: + external: true + +services: + emby-pulse: + image: zeyu8023/emby-stats:1.2.0.553 + container_name: ${CONTAINER_NAME} + labels: + createdBy: "Apps" + restart: always + networks: + - 1panel-network + ports: + - ${PANEL_APP_PORT_HTTP}:10307 + env_file: + - ${GLOBAL_ENV_FILE:-/etc/1panel/envs/global.env} + - ${ENV_FILE:-/etc/1panel/envs/default.env} + volumes: + - ${EMBY_PULSE_ROOT_PATH}/config:/app/config + - ${EMBY_PULSE_ROOT_PATH}/data:/emby-data + environment: + - TZ=Asia/Shanghai + - DB_PATH=/emby-data/playback_reporting.db diff --git a/apps/emby-pulse/1.2.0.553/envs/default.env b/apps/emby-pulse/1.2.0.553/envs/default.env new file mode 100644 index 000000000..cd05f46e6 --- /dev/null +++ b/apps/emby-pulse/1.2.0.553/envs/default.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +ENV_FILE=.env diff --git a/apps/emby-pulse/1.2.0.553/envs/global.env b/apps/emby-pulse/1.2.0.553/envs/global.env new file mode 100644 index 000000000..e10989fe4 --- /dev/null +++ b/apps/emby-pulse/1.2.0.553/envs/global.env @@ -0,0 +1,2 @@ +# copyright© 2024 XinJiang Ms Studio +TZ=Asia/Shanghai diff --git a/apps/emby-pulse/1.2.0.553/scripts/init.sh b/apps/emby-pulse/1.2.0.553/scripts/init.sh new file mode 100644 index 000000000..07fb8c3fe --- /dev/null +++ b/apps/emby-pulse/1.2.0.553/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/emby-pulse/1.2.0.553/scripts/uninstall.sh b/apps/emby-pulse/1.2.0.553/scripts/uninstall.sh new file mode 100644 index 000000000..c86c4fbca --- /dev/null +++ b/apps/emby-pulse/1.2.0.553/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/emby-pulse/1.2.0.553/scripts/upgrade.sh b/apps/emby-pulse/1.2.0.553/scripts/upgrade.sh new file mode 100644 index 000000000..07fb8c3fe --- /dev/null +++ b/apps/emby-pulse/1.2.0.553/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/emby-pulse/README.md b/apps/emby-pulse/README.md new file mode 100644 index 000000000..18c86fa31 --- /dev/null +++ b/apps/emby-pulse/README.md @@ -0,0 +1,82 @@ +# Emby Pulse + +Emby 服务器的高级伴侣:数据洞察、全能管理与下载自动化助手 + +![Emby Pulse](https://file.lifebus.top/imgs/app_name_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) + +## 简介 + +EmbyPulse(映迹)是专为 Emby 服主打造的现代化“第二控制台”。它不仅提供了极致的数据可视化大盘,还深度集成了用户管理、追剧日历、缺集自动补货、求片流转及媒体报告生成等核心运维功能。 + +核心革新:本系统独家支持“API 穿透”与“数据库直读”双擎路由。这意味着您无需强制挂载 Emby 的数据库文件,仅凭 API Key +即可点亮全站统计,完美适配极空间、群晖、云服务器等各种复杂部署环境。 + +## 特性 + +### 📊 全景仪表盘(Dashboard) + +实时监控:秒级同步当前并发播放人数、客户端类型、IP 地址及转码实时负荷。 +资源概览:直观展示电影、剧集、单集总数,以及总播放次数、累计时长和活跃用户数。 +趋势分析:集成 ECharts 动态图表,支持按天、周、月统计服务器播放热度变化走势。 + +### 🔍 缺集管理(Gap Management)—— 强迫症福音 + +全库扫描:智能比对 Emby 现有剧集与 TMDB 全量数据,精准定位已上线但库内缺失的集数。 +MoviePilot 联动:一键调用 MP 搜索接口,支持根据库内已有版本自动匹配 4K / 1080P / HDR 等基因配型。 +底层下载截胡:推送到 MP 下载整季包时,系统自动切入 qBittorrent / Transmission,物理切除非必要文件,实现“只下载缺的那几集”。 +状态心跳同步:采用焦点唤醒机制,入库后前端数据零延迟自动核销变色。 + +### 📅 追剧日历(TV Calendar) + +全球排期:自动同步本周全球热播剧集更新时间。 +红绿灯状态:🟢 已入库点击直达 Emby 播放;🔴 缺失集数点击自动复制搜索指令。 + +### 🎬 求片系统(Request Center) + +用户求片:支持用户提交电影、剧集、季度等求片请求,统一流转到后台处理。 +状态追踪:支持待处理、已下载、已入库、已拒绝等完整状态链路。 +自动联动:媒体一旦成功入库,可自动完成对应求片工单闭环。 +机器人协同:支持通过 Telegram 等渠道触发求片反馈与处理提醒。 + +### 👤 用户中心(User Center) + +账号信息:集中展示用户基础资料、到期时间、备注等关键信息。 +权限与期限管理:支持账号续期、到期控制、状态管理与生命周期维护。 +行为回看:结合统计系统查看用户活跃度、观影偏好与使用趋势。 +统一入口:将用户、邀请、求片、统计等能力收拢到一个面板中管理。 + +### 🕵 数据洞察(Insights) + +用户画像:分析用户习惯,解锁“深夜修仙”“带薪观影”“全平台制霸”等趣味成就勋章。 +入驻溯源:直接读取 Emby 官方 API 注册时间,精准还原用户入驻服务器的真实天数。 +画质审计:盘点媒体库 4K、HDR、杜比视界占比;自动筛选低画质资源(SD / 480P),方便服主进行洗版优化。 + +### 🎨 映迹工坊(Report Generator) + +多维报表:自动生成日报、周报、月报及年度总结。 +网易云风格:内置黑金、赛博、极光、落日等精美视觉主题,支持一键生成长图。 +社群互动:支持将报表长图自动推送到关联的 Telegram 频道。 + +### 🎟 用户与邀请系统 + +邀请注册:支持生成带有效期的邀请链接,如 7 天、30 天、永久。 +自助注册页:用户可通过邀请链接自助建号,无需管理员干预。 +过期管理:支持账号自动到期锁定、批量续期及强制重置密码。 + +### 🤖 Telegram 机器人助理 + +实时推送:入库自动发送精美海报磁贴,播放 / 停止状态实时反馈。 +防御引擎:毫秒级识别并拦截黑名单客户端,保护服务器资源。 +便捷交互:支持 /search 搜片、/stats 数据盘点、/check 系统诊断。 + +### 🛠 . 系统运维 + +任务管理:可视化管理 Emby 所有计划任务,支持手动触发与执行状态监控。 +智能缓存:前端自定义缓存策略,兼顾响应速度与数据新鲜度。 + +--- + +![Ms Studio](https://file.lifebus.top/imgs/ms_blank_001.png) +![Ms Studio](https://analytics.lifebus.top/p/wJix5nI1W) diff --git a/apps/emby-pulse/data.yml b/apps/emby-pulse/data.yml new file mode 100644 index 000000000..965082114 --- /dev/null +++ b/apps/emby-pulse/data.yml @@ -0,0 +1,17 @@ +additionalProperties: + key: emby-pulse + name: Emby Pulse + tags: + - WebSite + - Local + shortDescZh: Emby 服务器的高级伴侣 + shortDescEn: Advanced companion for Emby server + type: website + crossVersionUpdate: true + limit: 0 + website: https://github.com/zeyu8023/emby-pulse/ + github: https://github.com/zeyu8023/emby-pulse/ + document: https://github.com/zeyu8023/emby-pulse/ + architectures: + - amd64 + - arm64 diff --git a/apps/emby-pulse/logo.png b/apps/emby-pulse/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d7555efaa3606062d94a517a87272cf5c91c1934 GIT binary patch literal 19080 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