1// å ¨å±å¸¸éé ç½® 2const PROXY_URL = '/proxy/'; // éç¨äº Cloudflare, Netlify (带éå), Vercel (带éå) 3// const HOPLAYER_URL = 'https://hoplayer.com/index.html'; 4const SEARCH_HISTORY_KEY = 'videoSearchHistory'; 5const MAX_HISTORY_ITEMS = 5; 6 7// å¯ç ä¿æ¤é ç½® 8const PASSWORD_CONFIG = { 9 localStorageKey: 'passwordVerified', // åå¨éªè¯ç¶æçé®å 10 verificationTTL: 90 * 24 * 60 * 60 * 1000, // éªè¯æææï¼90天ï¼çº¦3个æï¼ 11 adminLocalStorageKey: 'adminPasswordVerified' // æ°å¢ç管çåéªè¯ç¶æçé®å 12}; 13 14// ç½ç«ä¿¡æ¯é ç½® 15const SITE_CONFIG = { 16 name: 'LibreTV', 17 url: 'https://libretv.is-an.org', 18 description: 'å è´¹å¨çº¿è§é¢æç´¢ä¸è§çå¹³å°', 19 logo: 'image/logo.png', 20 version: '1.0.3' 21}; 22 23// APIç«ç¹é ç½® 24const API_SITES = { 25 dyttzy: { 26 api: 'http://caiji.dyttzyapi.com/api.php/provide/vod', 27 name: 'çµå½±å¤©å èµæº', 28 detail: 'http://caiji.dyttzyapi.com', 29 }, 30 ruyi: { 31 api: 'https://cj.rycjapi.com/api.php/provide/vod', 32 name: 'å¦æèµæº', 33 }, 34 bfzy: { 35 api: 'https://bfzyapi.com/api.php/provide/vod', 36 name: 'æ´é£èµæº', 37 }, 38 tyyszy: { 39 api: 'https://tyyszy.com/api.php/provide/vod', 40 name: 'å¤©æ¶¯èµæº', 41 }, 42 // xiaomaomi: { 43 // api: 'https://zy.xiaomaomi.cc/api.php/provide/vod', 44 // name: 'å°ç«åªèµæº', 45 // }, 46 ffzy: { 47 api: 'http://ffzy5.tv/api.php/provide/vod', 48 name: 'éå¡å½±è§', 49 detail: 'http://ffzy5.tv', 50 }, 51 heimuer: { 52 api: 'https://json.heimuer.xyz/api.php/provide/vod', 53 name: '黿¨è³', 54 detail: 'https://heimuer.tv', 55 }, 56 zy360: { 57 api: 'https://360zy.com/api.php/provide/vod', 58 name: '360èµæº', 59 }, 60 iqiyi: { 61 api: 'https://www.iqiyizyapi.com/api.php/provide/vod', 62 name: 'iqiyièµæº', 63 }, 64 wolong: { 65 api: 'https://wolongzyw.com/api.php/provide/vod', 66 name: 'å§é¾èµæº', 67 }, 68 hwba: { 69 api: 'https://cjhwba.com/api.php/provide/vod', 70 name: 'å为å§èµæº', 71 }, 72 jisu: { 73 api: 'https://jszyapi.com/api.php/provide/vod', 74 name: 'æéèµæº', 75 detail: 'https://jszyapi.com', 76 }, 77 dbzy: { 78 api: 'https://dbzy.tv/api.php/provide/vod', 79 name: 'è±ç£èµæº', 80 }, 81 mozhua: { 82 api: 'https://mozhuazy.com/api.php/provide/vod', 83 name: 'éçªèµæº', 84 }, 85 mdzy: { 86 api: 'https://www.mdzyapi.com/api.php/provide/vod', 87 name: 'éé½èµæº', 88 }, 89 zuid: { 90 api: 'https://api.zuidapi.com/api.php/provide/vod', 91 name: 'æå¤§èµæº' 92 }, 93 yinghua: { 94 api: 'https://m3u8.apiyhzy.com/api.php/provide/vod', 95 name: '樱è±èµæº' 96 }, 97 baidu: { 98 api: 'https://api.apibdzy.com/api.php/provide/vod', 99 name: 'ç¾åº¦äºèµæº' 100 }, 101 wujin: { 102 api: 'https://api.wujinapi.me/api.php/provide/vod', 103 name: 'æ å°½èµæº' 104 }, 105 wwzy: { 106 api: 'https://wwzy.tv/api.php/provide/vod', 107 name: 'æºæºçå§' 108 }, 109 ikun: { 110 api: 'https://ikunzyapi.com/api.php/provide/vod', 111 name: 'iKunèµæº' 112 }, 113 testSource: { 114 api: 'https://www.example.com/api.php/provide/vod', 115 name: '空å 容æµè¯æº', 116 adult: true 117 }, 118 // ä¸é¢æ¯ä¸äºæäººå 容çAPIæºï¼é»è®¤éèï¼ä½¿ç¨æ¬é¡¹ç®æµè§é»è²å 容è¿è项ç®åè¡· 119 // äºèç½ä¸ä¼ æçè²æ å 容å°äººå½»åºå®¢ä½åãå·¥å ·åï¼æ¯æ§å«è§£æ¾å人类平çéè·¯ä¸ç巨大éç¢ã 120 // è¿äºé»è²å½±çæ¯èµæ¬ä¸»ä¹ç¶æå¶åè¿«çææ¶æ¯ä½ç°ï¼å®å°æ´ååå±è¾±åååï¼è·µè¸äººçå°ä¸¥ï¼å¯¹å害è é ææ æ³å¼¥æç伤害ï¼å¹¶æ¯å®³ç¤¾ä¼å ³ç³»ã 121 // èµæ¬ä¸ºäºå©æ¶¦ï¼ä¸æå°æåå£çå¥åï¼å æ¬å¯¹å害è å表æ¼è çå¥åï¼åæ´ååååï¼ 122 // ææ§å«å¥åå¡é æâæ§äº«åâ麻ç¹è§ä¼çæè¯ï¼è½¬ç§»æä»¬å¯¹ç°å®çæ´»ä¸çç¾ååè¿«çæ³¨æåã 123 // è¿äºå½±çåèåç产ä¸å·²ç»ä½¿æ°ç¾ä¸ç·å¥³â䏿µ·âï¼åºåèªå·±ç身ä½ï¼çè³ä»¥æ¤ä¸ºç计ã 124 // èä½ä¸ºè§ä¼æ è¾åï¼æ¯«æ çé®ï¼ä»ä»¬ä¿æäºé»è²äº§ä¸é¾çåç产ã 125 // æä»¬æä¾æ¤è¦åï¼æ¯å¸ææ¨è½è®¤æ¸ è¿äºå å®¹çæ¬è´¨ââå®ä»¬æ¯åè¿«å奴役çå·¥å ·ï¼èé娱ä¹ã 126 // ckzy: { 127 // api: 'https://www.ckzy1.com', 128 // name: 'CKèµæº', 129 // adult: true 130 // }, 131 // jkun: { 132 // api: 'https://jkunzyapi.com', 133 // name: 'jkunèµæº', 134 // adult: true 135 // }, 136 // bwzy: { 137 // api: 'https://api.bwzym3u8.com', 138 // name: 'ç¾ä¸èµæº', 139 // adult: true 140 // }, 141 // souav: { 142 // api: 'https://api.souavzy.vip', 143 // name: 'souavèµæº', 144 // adult: true 145 // }, 146 // r155: { 147 // api: 'https://155api.com', 148 // name: '155èµæº', 149 // adult: true 150 // }, 151 // lsb: { 152 // api: 'https://apilsbzy1.com', 153 // name: 'lsbèµæº', 154 // adult: true 155 // }, 156 // huangcang: { 157 // api: 'https://hsckzy.vip', 158 // name: 'é»è²ä»åº', 159 // adult: true, 160 // detail: 'https://hsckzy.vip' 161 // }, 162 // yutu: { 163 // api: 'https://yutuzy10.com', 164 // name: 'çå èµæº', 165 // adult: true 166 // }, 167 168 // ä¸é¢æ¯èµæºå¤±æçé«çAPIæºï¼ä¸å»ºè®®ä½¿ç¨ 169 // subo: { 170 // api: 'https://subocaiji.com/api.php/provide/vod', 171 // name: 'éæèµæº' 172 // }, 173 // fczy: { 174 // api: 'https://api.fczy888.me/api.php/provide/vod', 175 // name: 'èå·¢èµæº' 176 // }, 177 // ukzy: { 178 // api: 'https://api.ukuapi88.com/api.php/provide/vod', 179 // name: 'Ué ·èµæº' 180 // }, 181}; 182 183// æ·»å èåæç´¢çé ç½®é项 184const AGGREGATED_SEARCH_CONFIG = { 185 enabled: true, // æ¯å¦å¯ç¨èåæç´¢ 186 timeout: 8000, // å个æºè¶ æ¶æ¶é´ï¼æ¯«ç§ï¼ 187 maxResults: 10000, // æå¤§ç»ææ°é 188 parallelRequests: true, // æ¯å¦å¹¶è¡è¯·æ±æææº 189 showSourceBadges: true // æ¯å¦æ¾ç¤ºæ¥æºå¾½ç« 190}; 191 192// æ½è±¡API请æ±é ç½® 193const API_CONFIG = { 194 search: { 195 // åªæ¼æ¥åæ°é¨åï¼ä¸åå å« /api.php/provide/vod/ 196 path: '?ac=videolist&wd=', 197 pagePath: '?ac=videolist&wd={query}&pg={page}', 198 maxPages: 50, // æå¤§è·åé¡µæ° 199 headers: { 200 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36', 201 'Accept': 'application/json' 202 } 203 }, 204 detail: { 205 // åªæ¼æ¥åæ°é¨å 206 path: '?ac=videolist&ids=', 207 headers: { 208 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36', 209 'Accept': 'application/json' 210 } 211 } 212}; 213 214// ä¼ååçæ£åè¡¨è¾¾å¼æ¨¡å¼ 215const M3U8_PATTERN = /\$https?:\/\/[^"'\s]+?\.m3u8/g; 216 217// æ·»å èªå®ä¹ææ¾å¨URL 218const CUSTOM_PLAYER_URL = 'player.html'; // 使ç¨ç¸å¯¹è·¯å¾å¼ç¨æ¬å°player.html 219 220// å¢å è§é¢ææ¾ç¸å ³é ç½® 221const PLAYER_CONFIG = { 222 autoplay: true, 223 allowFullscreen: true, 224 width: '100%', 225 height: '600', 226 timeout: 15000, // ææ¾å¨å è½½è¶ æ¶æ¶é´ 227 filterAds: true, // æ¯å¦å¯ç¨å¹¿åè¿æ»¤ 228 autoPlayNext: true, // é»è®¤å¯ç¨èªå¨è¿æåè½ 229 adFilteringEnabled: true, // é»è®¤å¼å¯åç广åè¿æ»¤ 230 adFilteringStorage: 'adFilteringEnabled' // åå¨å¹¿åè¿æ»¤è®¾ç½®çé®å 231}; 232 233// å¢å éè¯¯ä¿¡æ¯æ¬å°å 234const ERROR_MESSAGES = {
235 NETWORK_ERROR: 'ç½ç»è¿æ¥é误ï¼è¯·æ£æ¥ç½ç»è®¾ç½®', 236 TIMEOUT_ERROR: '请æ±è¶ æ¶ï¼æå¡å¨ååºæ¶é´è¿é¿', 237 API_ERROR: 'APIæ¥å£è¿åé误ï¼è¯·å°è¯æ´æ¢æ°æ®æº', 238 PLAYER_ERROR: 'ææ¾å¨å 载失败ï¼è¯·å°è¯å ¶ä»è§é¢æº', 239 UNKNOWN_ERROR: 'åçæªç¥é误ï¼è¯·å·æ°é¡µé¢éè¯' 240}; 241 242// æ·»å è¿ä¸æ¥å®å ¨è®¾ç½® 243const SECURITY_CONFIG = { 244 enableXSSProtection: true, // æ¯å¦å¯ç¨XSSä¿æ¤ 245 sanitizeUrls: true, // æ¯å¦æ¸ çURL 246 maxQueryLength: 100, // æå¤§æç´¢é¿åº¦ 247 // allowedApiDomains ä¸åéè¦ï¼å 为ææè¯·æ±é½éè¿å é¨ä»£ç 248}; 249 250// æ·»å å¤ä¸ªèªå®ä¹APIæºçé ç½® 251const CUSTOM_API_CONFIG = { 252 separator: ',', // åé符 253 maxSources: 5, // æå¤§å 许çèªå®ä¹æºæ°é 254 testTimeout: 5000, // æµè¯è¶ æ¶æ¶é´(毫ç§) 255 namePrefix: 'Custom-', // èªå®ä¹æºåç§°åç¼ 256 validateUrl: true, // éªè¯URLæ ¼å¼ 257 cacheResults: true, // ç¼åæµè¯ç»æ 258 cacheExpiry: 5184000000, // ç¼åè¿ææ¶é´(2个æ) 259 adultPropName: 'isAdult' // ç¨äºæ è®°æäººå 容ç屿§å 260}; 261 262// éèå ç½®é»è²ééç«APIçåé 263const HIDE_BUILTIN_ADULT_APIS = false;
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.