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}; 12 13// ç½ç«ä¿¡æ¯é ç½® 14const SITE_CONFIG = { 15 name: 'LibreTV', 16 url: 'https://libretv.is-an.org', 17 description: 'å è´¹å¨çº¿è§é¢æç´¢ä¸è§çå¹³å°', 18 logo: 'https://images.icon-icons.com/38/PNG/512/retrotv_5520.png', 19 version: '1.0.3' 20}; 21 22// APIç«ç¹é ç½® 23const API_SITES = { 24 heimuer: { 25 api: 'https://json.heimuer.xyz', 26 name: '黿¨è³', 27 detail: 'https://heimuer.tv', 28 }, 29 dyttzy: { 30 api: 'http://caiji.dyttzyapi.com', 31 name: 'çµå½±å¤©å èµæº', 32 detail: 'http://caiji.dyttzyapi.com', 33 }, 34 ffzy: { 35 api: 'http://ffzy5.tv', 36 name: 'éå¡å½±è§', 37 detail: 'http://ffzy5.tv', 38 }, 39 tyyszy: { 40 api: 'https://tyyszy.com', 41 name: 'å¤©æ¶¯èµæº', 42 }, 43 ckzy: { 44 api: 'https://www.ckzy1.com', 45 name: 'CKèµæº', 46 adult: true 47 }, 48 zy360: { 49 api: 'https://360zy.com', 50 name: '360èµæº', 51 }, 52 wolong: { 53 api: 'https://wolongzyw.com', 54 name: 'å§é¾èµæº', 55 }, 56 hwba: { 57 api: 'https://cjhwba.com', 58 name: 'å为å§èµæº', 59 }, 60 jisu: { 61 api: 'https://jszyapi.com', 62 name: 'æéèµæº', 63 detail: 'https://jszyapi.com' 64 }, 65 dbzy: { 66 api: 'https://dbzy.com', 67 name: 'è±ç£èµæº', 68 }, 69 bfzy: { 70 api: 'https://bfzyapi.com', 71 name: 'æ´é£èµæº', 72 }, 73 mozhua: { 74 api: 'https://mozhuazy.com', 75 name: 'éçªèµæº', 76 }, 77 mdzy: { 78 api: 'https://www.mdzyapi.com', 79 name: 'éé½èµæº', 80 }, 81 ruyi: { 82 api: 'https://cj.rycjapi.com', 83 name: 'å¦æèµæº', 84 }, 85 jkun: { 86 api: 'https://jkunzyapi.com', 87 name: 'jkunèµæº', 88 adult: true 89 }, 90 bwzy: { 91 api: 'https://api.bwzym3u8.com', 92 name: 'ç¾ä¸èµæº', 93 adult: true 94 }, 95 souav: { 96 api: 'https://api.souavzy.vip', 97 name: 'souavèµæº', 98 adult: true 99 }, 100 r155: { 101 api: 'https://155api.com', 102 name: '155èµæº', 103 adult: true 104 }, 105 lsb: { 106 api: 'https://apilsbzy1.com', 107 name: 'lsbèµæº', 108 adult: true 109 }, 110 huangcang: { 111 api: 'https://hsckzy.vip', 112 name: 'é»è²ä»åº', 113 adult: true, 114 detail: 'https://hsckzy.vip' 115 }, 116 zuid: { 117 api: 'https://api.zuidapi.com', 118 name: 'æå¤§èµæº' 119 }, 120 yutu: { 121 api: 'https://yutuzy10.com', 122 name: 'çå èµæº', 123 adult: true 124 }, 125 yinghua: { 126 api: 'https://m3u8.apiyhzy.com', 127 name: '樱è±èµæº' 128 }, 129 baidu: { 130 api: 'https://api.apibdzy.com', 131 name: 'ç¾åº¦äºèµæº' 132 }, 133 wujin: { 134 api: 'https://api.wujinapi.me', 135 name: 'æ å°½èµæº' 136 }, 137 wwzy: { 138 api: 'https://wwzy.tv', 139 name: 'æºæºçå§' 140 }, 141 ikun: { 142 api: 'https://ikunzyapi.com', 143 name: 'iKunèµæº' 144 }, 145}; 146 147// æ·»å èåæç´¢çé ç½®é项 148const AGGREGATED_SEARCH_CONFIG = { 149 enabled: true, // æ¯å¦å¯ç¨èåæç´¢ 150 timeout: 8000, // å个æºè¶ æ¶æ¶é´ï¼æ¯«ç§ï¼ 151 maxResults: 10000, // æå¤§ç»ææ°é 152 parallelRequests: true, // æ¯å¦å¹¶è¡è¯·æ±æææº 153 showSourceBadges: true // æ¯å¦æ¾ç¤ºæ¥æºå¾½ç« 154}; 155 156// æ½è±¡API请æ±é ç½® 157const API_CONFIG = { 158 search: { 159 // ä¿®æ¹æç´¢æ¥å£ä¸ºè¿åæ´å¤è¯¦ç»æ°æ®ï¼å æ¬è§é¢å°é¢ãç®ä»åææ¾åè¡¨ï¼ 160 path: '/api.php/provide/vod/?ac=videolist&wd=', 161 headers: { 162 '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', 163 'Accept': 'application/json' 164 } 165 }, 166 detail: { 167 // ä¿®æ¹è¯¦æ æ¥å£ä¹ä½¿ç¨videolistæ¥å£ï¼ä½æ¯éè¿IDæ¥è¯¢ï¼å
167å°è¯·æ±æ¬¡æ° 168 path: '/api.php/provide/vod/?ac=videolist&ids=', 169 headers: { 170 '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', 171 'Accept': 'application/json' 172 } 173 } 174}; 175 176// ä¼ååçæ£åè¡¨è¾¾å¼æ¨¡å¼ 177const M3U8_PATTERN = /\$https?:\/\/[^"'\s]+?\.m3u8/g; 178 179// æ·»å èªå®ä¹ææ¾å¨URL 180const CUSTOM_PLAYER_URL = 'player.html'; // 使ç¨ç¸å¯¹è·¯å¾å¼ç¨æ¬å°player.html 181 182// å¢å è§é¢ææ¾ç¸å ³é ç½® 183const PLAYER_CONFIG = { 184 autoplay: true, 185 allowFullscreen: true, 186 width: '100%', 187 height: '600', 188 timeout: 15000, // ææ¾å¨å è½½è¶ æ¶æ¶é´ 189 filterAds: true, // æ¯å¦å¯ç¨å¹¿åè¿æ»¤ 190 autoPlayNext: true, // é»è®¤å¯ç¨èªå¨è¿æåè½ 191 adFilteringEnabled: true, // é»è®¤å¼å¯åç广åè¿æ»¤ 192 adFilteringStorage: 'adFilteringEnabled' // åå¨å¹¿åè¿æ»¤è®¾ç½®çé®å 193}; 194 195// å¢å éè¯¯ä¿¡æ¯æ¬å°å 196const ERROR_MESSAGES = { 197 NETWORK_ERROR: 'ç½ç»è¿æ¥é误ï¼è¯·æ£æ¥ç½ç»è®¾ç½®', 198 TIMEOUT_ERROR: '请æ±è¶ æ¶ï¼æå¡å¨ååºæ¶é´è¿é¿', 199 API_ERROR: 'APIæ¥å£è¿åé误ï¼è¯·å°è¯æ´æ¢æ°æ®æº', 200 PLAYER_ERROR: 'ææ¾å¨å 载失败ï¼è¯·å°è¯å ¶ä»è§é¢æº', 201 UNKNOWN_ERROR: 'åçæªç¥é误ï¼è¯·å·æ°é¡µé¢éè¯' 202}; 203 204// æ·»å è¿ä¸æ¥å®å ¨è®¾ç½® 205const SECURITY_CONFIG = { 206 enableXSSProtection: true, // æ¯å¦å¯ç¨XSSä¿æ¤ 207 sanitizeUrls: true, // æ¯å¦æ¸ çURL 208 maxQueryLength: 100, // æå¤§æç´¢é¿åº¦ 209 // allowedApiDomains ä¸åéè¦ï¼å 为ææè¯·æ±é½éè¿å é¨ä»£ç 210}; 211 212// æ·»å å¤ä¸ªèªå®ä¹APIæºçé ç½® 213const CUSTOM_API_CONFIG = { 214 separator: ',', // åé符 215 maxSources: 5, // æå¤§å 许çèªå®ä¹æºæ°é 216 testTimeout: 5000, // æµè¯è¶ æ¶æ¶é´(毫ç§) 217 namePrefix: 'Custom-', // èªå®ä¹æºåç§°åç¼ 218 validateUrl: true, // éªè¯URLæ ¼å¼ 219 cacheResults: true, // ç¼åæµè¯ç»æ 220 cacheExpiry: 5184000000, // ç¼åè¿ææ¶é´(2个æ) 221 adultPropName: 'isAdult' // ç¨äºæ è®°æäººå 容ç屿§å 222}; 223 224// æ°å¢éèå ç½®é»è²ééç«APIçåéï¼é»è®¤ä¸ºtrue 225const HIDE_BUILTIN_ADULT_APIS = true;
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.