# 🎬 IPTV Web 核心 基于 Vue 3 + Vite 的 IPTV 播放器,支持 iptv-api 格式数据源和 XMLTV EPG 节目单。 ## 功能特性 | 功能 | 状态 | 说明 | |------|:--:|------| | 🎥 **视频播放** | ✅ | HLS (m3u8) 支持,hls.js | | 📡 **IPTV 源** | ✅ | 支持 iptv-api TXT/M3U 格式 | | 🔍 **频道搜索** | ✅ | 实时搜索过滤 | | 🗂️ **分组筛选** | ✅ | 按分组浏览频道 | | ⭐ **收藏功能** | ✅ | LocalStorage 本地存储 | | 🕐 **播放历史** | ✅ | 最近 50 条 | | 🔗 **多源管理** | ✅ | 自动合并重复频道,切换源 | | ⚡ **延迟检测** | ✅ | 在线检测,按延迟排序 | | 📺 **EPG 节目单** | ✅ | XMLTV 格式,2小时缓存 | | ⚙️ **配置面板** | ✅ | 数据源、EPG、播放器设置 | ## 数据源格式 ### IPTV 源 (TXT 格式 - iptv-api 默认) ``` 央视频道,#genre# CCTV-1 综合,http://xxx CCTV-2 财经,http://yyy 卫视频道,#genre# 湖南卫视,http://xxx ``` ### EPG 源 (XMLTV 格式) ```xml 新闻30分 午间新闻 新闻 ``` ## 快速开始 ```bash npm install npm run dev ``` 浏览器打开 http://localhost:5173 ## 配置说明 点击右上角 ⚙️ 打开配置面板: ### 直播源 - **Guovin/iptv-api**: 默认 CDN 地址 - **本地文件**: `public/api/result.txt`(开发测试) - **自定义接口**: 输入远程 API 地址 ### EPG 节目单 - **本地文件**: `public/api/epg.xml`(开发测试) - **自定义接口**: 输入 XMLTV 格式 EPG 地址 - 自动缓存 2 小时,避免频繁请求 ## 项目结构 ``` web/ ├── src/ │ ├── components/ │ │ ├── VideoPlayer.vue # 视频播放器 │ │ ├── EPGGuide.vue # EPG 节目单展示 │ │ ├── QuickAccess.vue # 收藏/历史快捷入口 │ │ ├── SourceSelector.vue # 多源选择器 │ │ └── ConfigPanel.vue # 配置面板 │ ├── stores/ │ │ └── useStore.js # 状态管理 │ ├── utils/ │ │ ├── m3uParser.js # M3U 解析 │ │ ├── txtParser.js # TXT 解析 (iptv-api) │ │ ├── channelOptimizer.js # 频道去重、延迟检测 │ │ └── epgFetcher.js # EPG 获取和解析 │ ├── App.vue │ └── main.js ├── public/ │ └── api/ │ ├── result.txt # 示例 IPTV 源 │ └── epg.xml # 示例 EPG 数据 └── package.json ``` ## 核心功能实现 ### 1. 频道去重与多源 ```javascript // 合并相同频道的多个源 channels.value = mergeChannels(rawChannels.value) // 结果: [{name: 'CCTV-1', sources: [{url: 'xxx'}, {url: 'yyy'}]}] ``` ### 2. 延迟检测 ```javascript // 并发检测 5 个源 await checkAllChannels(channels.value, 5, onProgress) // 自动排序:在线的优先,按延迟从小到大 ``` ### 3. EPG 缓存 ```javascript // 获取 EPG,带 2 小时缓存 const epgData = await fetchEPG('/api/epg.xml') // 自动解析 XMLTV,按频道分组 ``` ## 下一步 - 🖥️ **Tauri 桌面端** - Windows/Mac 可执行文件 - 📱 **Android 套壳** - WebView + ExoPlayer - 🔶 **HarmonyOS 套壳** - Web 组件