mirror of
https://github.com/letian1650/N3RD.git
synced 2025-01-23 18:35:29 +08:00
armed ship
This commit is contained in:
parent
bb02f3dd41
commit
f8dd3430d0
1004
EXT/L2X/MV/1-1000.html
Normal file
1004
EXT/L2X/MV/1-1000.html
Normal file
File diff suppressed because it is too large
Load Diff
1004
EXT/L2X/MV/10001-11000.html
Normal file
1004
EXT/L2X/MV/10001-11000.html
Normal file
File diff suppressed because it is too large
Load Diff
1004
EXT/L2X/MV/1001-2000.html
Normal file
1004
EXT/L2X/MV/1001-2000.html
Normal file
File diff suppressed because it is too large
Load Diff
1004
EXT/L2X/MV/11001-12000.html
Normal file
1004
EXT/L2X/MV/11001-12000.html
Normal file
File diff suppressed because it is too large
Load Diff
1004
EXT/L2X/MV/12001-13000.html
Normal file
1004
EXT/L2X/MV/12001-13000.html
Normal file
File diff suppressed because it is too large
Load Diff
1004
EXT/L2X/MV/13001-14000.html
Normal file
1004
EXT/L2X/MV/13001-14000.html
Normal file
File diff suppressed because it is too large
Load Diff
1004
EXT/L2X/MV/14001-15000.html
Normal file
1004
EXT/L2X/MV/14001-15000.html
Normal file
File diff suppressed because it is too large
Load Diff
1004
EXT/L2X/MV/15001-16000.html
Normal file
1004
EXT/L2X/MV/15001-16000.html
Normal file
File diff suppressed because it is too large
Load Diff
1004
EXT/L2X/MV/16001-17000.html
Normal file
1004
EXT/L2X/MV/16001-17000.html
Normal file
File diff suppressed because it is too large
Load Diff
1004
EXT/L2X/MV/17001-18000.html
Normal file
1004
EXT/L2X/MV/17001-18000.html
Normal file
File diff suppressed because it is too large
Load Diff
1004
EXT/L2X/MV/18001-19000.html
Normal file
1004
EXT/L2X/MV/18001-19000.html
Normal file
File diff suppressed because it is too large
Load Diff
1004
EXT/L2X/MV/19001-20000.html
Normal file
1004
EXT/L2X/MV/19001-20000.html
Normal file
File diff suppressed because it is too large
Load Diff
1004
EXT/L2X/MV/20001-21000.html
Normal file
1004
EXT/L2X/MV/20001-21000.html
Normal file
File diff suppressed because it is too large
Load Diff
1004
EXT/L2X/MV/2001-3000.html
Normal file
1004
EXT/L2X/MV/2001-3000.html
Normal file
File diff suppressed because it is too large
Load Diff
1004
EXT/L2X/MV/21001-22000.html
Normal file
1004
EXT/L2X/MV/21001-22000.html
Normal file
File diff suppressed because it is too large
Load Diff
1004
EXT/L2X/MV/22001-23000.html
Normal file
1004
EXT/L2X/MV/22001-23000.html
Normal file
File diff suppressed because it is too large
Load Diff
1004
EXT/L2X/MV/23001-24000.html
Normal file
1004
EXT/L2X/MV/23001-24000.html
Normal file
File diff suppressed because it is too large
Load Diff
1004
EXT/L2X/MV/24001-25000.html
Normal file
1004
EXT/L2X/MV/24001-25000.html
Normal file
File diff suppressed because it is too large
Load Diff
1004
EXT/L2X/MV/25001-26000.html
Normal file
1004
EXT/L2X/MV/25001-26000.html
Normal file
File diff suppressed because it is too large
Load Diff
1004
EXT/L2X/MV/26001-27000.html
Normal file
1004
EXT/L2X/MV/26001-27000.html
Normal file
File diff suppressed because it is too large
Load Diff
1004
EXT/L2X/MV/27001-28000.html
Normal file
1004
EXT/L2X/MV/27001-28000.html
Normal file
File diff suppressed because it is too large
Load Diff
1004
EXT/L2X/MV/28001-29000.html
Normal file
1004
EXT/L2X/MV/28001-29000.html
Normal file
File diff suppressed because it is too large
Load Diff
1004
EXT/L2X/MV/29001-30000.html
Normal file
1004
EXT/L2X/MV/29001-30000.html
Normal file
File diff suppressed because it is too large
Load Diff
1004
EXT/L2X/MV/30001-31000.html
Normal file
1004
EXT/L2X/MV/30001-31000.html
Normal file
File diff suppressed because it is too large
Load Diff
1004
EXT/L2X/MV/3001-4000.html
Normal file
1004
EXT/L2X/MV/3001-4000.html
Normal file
File diff suppressed because it is too large
Load Diff
1004
EXT/L2X/MV/31001-32000.html
Normal file
1004
EXT/L2X/MV/31001-32000.html
Normal file
File diff suppressed because it is too large
Load Diff
1004
EXT/L2X/MV/32001-33000.html
Normal file
1004
EXT/L2X/MV/32001-33000.html
Normal file
File diff suppressed because it is too large
Load Diff
1004
EXT/L2X/MV/33001-34000.html
Normal file
1004
EXT/L2X/MV/33001-34000.html
Normal file
File diff suppressed because it is too large
Load Diff
1004
EXT/L2X/MV/34001-35000.html
Normal file
1004
EXT/L2X/MV/34001-35000.html
Normal file
File diff suppressed because it is too large
Load Diff
1004
EXT/L2X/MV/35001-36000.html
Normal file
1004
EXT/L2X/MV/35001-36000.html
Normal file
File diff suppressed because it is too large
Load Diff
1003
EXT/L2X/MV/36001-37000.html
Normal file
1003
EXT/L2X/MV/36001-37000.html
Normal file
File diff suppressed because it is too large
Load Diff
1005
EXT/L2X/MV/37001-38000.html
Normal file
1005
EXT/L2X/MV/37001-38000.html
Normal file
File diff suppressed because it is too large
Load Diff
1004
EXT/L2X/MV/38001-39000.html
Normal file
1004
EXT/L2X/MV/38001-39000.html
Normal file
File diff suppressed because it is too large
Load Diff
305
EXT/L2X/MV/39001-39301.html
Normal file
305
EXT/L2X/MV/39001-39301.html
Normal file
@ -0,0 +1,305 @@
|
||||
<div class="module-play-list-content">
|
||||
<!-- <p>tg频道:https://t.me/TVBox_local</p> -->
|
||||
<li><a title="MTV39001" href="http://em.21dtv.com/songs/60139000.mkv"></a></li>
|
||||
<li><a title="MTV39002" href="http://em.21dtv.com/songs/60139001.mkv"></a></li>
|
||||
<li><a title="MTV39003" href="http://em.21dtv.com/songs/60139002.mkv"></a></li>
|
||||
<li><a title="MTV39004" href="http://em.21dtv.com/songs/60139003.mkv"></a></li>
|
||||
<li><a title="MTV39005" href="http://em.21dtv.com/songs/60139004.mkv"></a></li>
|
||||
<li><a title="MTV39006" href="http://em.21dtv.com/songs/60139005.mkv"></a></li>
|
||||
<li><a title="MTV39007" href="http://em.21dtv.com/songs/60139006.mkv"></a></li>
|
||||
<li><a title="MTV39008" href="http://em.21dtv.com/songs/60139007.mkv"></a></li>
|
||||
<li><a title="MTV39009" href="http://em.21dtv.com/songs/60139008.mkv"></a></li>
|
||||
<li><a title="MTV39010" href="http://em.21dtv.com/songs/60139009.mkv"></a></li>
|
||||
<li><a title="MTV39011" href="http://em.21dtv.com/songs/60139010.mkv"></a></li>
|
||||
<li><a title="MTV39012" href="http://em.21dtv.com/songs/60139011.mkv"></a></li>
|
||||
<li><a title="MTV39013" href="http://em.21dtv.com/songs/60139012.mkv"></a></li>
|
||||
<li><a title="MTV39014" href="http://em.21dtv.com/songs/60139013.mkv"></a></li>
|
||||
<li><a title="MTV39015" href="http://em.21dtv.com/songs/60139014.mkv"></a></li>
|
||||
<li><a title="MTV39016" href="http://em.21dtv.com/songs/60139015.mkv"></a></li>
|
||||
<li><a title="MTV39017" href="http://em.21dtv.com/songs/60139016.mkv"></a></li>
|
||||
<li><a title="MTV39018" href="http://em.21dtv.com/songs/60139017.mkv"></a></li>
|
||||
<li><a title="MTV39019" href="http://em.21dtv.com/songs/60139018.mkv"></a></li>
|
||||
<li><a title="MTV39020" href="http://em.21dtv.com/songs/60139019.mkv"></a></li>
|
||||
<li><a title="MTV39021" href="http://em.21dtv.com/songs/60139020.mkv"></a></li>
|
||||
<li><a title="MTV39022" href="http://em.21dtv.com/songs/60139021.mkv"></a></li>
|
||||
<li><a title="MTV39023" href="http://em.21dtv.com/songs/60139022.mkv"></a></li>
|
||||
<li><a title="MTV39024" href="http://em.21dtv.com/songs/60139023.mkv"></a></li>
|
||||
<li><a title="MTV39025" href="http://em.21dtv.com/songs/60139024.mkv"></a></li>
|
||||
<li><a title="MTV39026" href="http://em.21dtv.com/songs/60139025.mkv"></a></li>
|
||||
<li><a title="MTV39027" href="http://em.21dtv.com/songs/60139026.mkv"></a></li>
|
||||
<li><a title="MTV39028" href="http://em.21dtv.com/songs/60139027.mkv"></a></li>
|
||||
<li><a title="MTV39029" href="http://em.21dtv.com/songs/60139028.mkv"></a></li>
|
||||
<li><a title="MTV39030" href="http://em.21dtv.com/songs/60139029.mkv"></a></li>
|
||||
<li><a title="MTV39031" href="http://em.21dtv.com/songs/60139030.mkv"></a></li>
|
||||
<li><a title="MTV39032" href="http://em.21dtv.com/songs/60139031.mkv"></a></li>
|
||||
<li><a title="MTV39033" href="http://em.21dtv.com/songs/60139032.mkv"></a></li>
|
||||
<li><a title="MTV39034" href="http://em.21dtv.com/songs/60139033.mkv"></a></li>
|
||||
<li><a title="MTV39035" href="http://em.21dtv.com/songs/60139034.mkv"></a></li>
|
||||
<li><a title="MTV39036" href="http://em.21dtv.com/songs/60139035.mkv"></a></li>
|
||||
<li><a title="MTV39037" href="http://em.21dtv.com/songs/60139036.mkv"></a></li>
|
||||
<li><a title="MTV39038" href="http://em.21dtv.com/songs/60139037.mkv"></a></li>
|
||||
<li><a title="MTV39039" href="http://em.21dtv.com/songs/60139038.mkv"></a></li>
|
||||
<li><a title="MTV39040" href="http://em.21dtv.com/songs/60139039.mkv"></a></li>
|
||||
<li><a title="MTV39041" href="http://em.21dtv.com/songs/60139040.mkv"></a></li>
|
||||
<li><a title="MTV39042" href="http://em.21dtv.com/songs/60139041.mkv"></a></li>
|
||||
<li><a title="MTV39043" href="http://em.21dtv.com/songs/60139042.mkv"></a></li>
|
||||
<li><a title="MTV39044" href="http://em.21dtv.com/songs/60139043.mkv"></a></li>
|
||||
<li><a title="MTV39045" href="http://em.21dtv.com/songs/60139044.mkv"></a></li>
|
||||
<li><a title="MTV39046" href="http://em.21dtv.com/songs/60139045.mkv"></a></li>
|
||||
<li><a title="MTV39047" href="http://em.21dtv.com/songs/60139046.mkv"></a></li>
|
||||
<li><a title="MTV39048" href="http://em.21dtv.com/songs/60139047.mkv"></a></li>
|
||||
<li><a title="MTV39049" href="http://em.21dtv.com/songs/60139048.mkv"></a></li>
|
||||
<li><a title="MTV39050" href="http://em.21dtv.com/songs/60139049.mkv"></a></li>
|
||||
<li><a title="MTV39051" href="http://em.21dtv.com/songs/60139050.mkv"></a></li>
|
||||
<li><a title="MTV39052" href="http://em.21dtv.com/songs/60139051.mkv"></a></li>
|
||||
<li><a title="MTV39053" href="http://em.21dtv.com/songs/60139052.mkv"></a></li>
|
||||
<li><a title="MTV39054" href="http://em.21dtv.com/songs/60139053.mkv"></a></li>
|
||||
<li><a title="MTV39055" href="http://em.21dtv.com/songs/60139054.mkv"></a></li>
|
||||
<li><a title="MTV39056" href="http://em.21dtv.com/songs/60139055.mkv"></a></li>
|
||||
<li><a title="MTV39057" href="http://em.21dtv.com/songs/60139056.mkv"></a></li>
|
||||
<li><a title="MTV39058" href="http://em.21dtv.com/songs/60139057.mkv"></a></li>
|
||||
<li><a title="MTV39059" href="http://em.21dtv.com/songs/60139058.mkv"></a></li>
|
||||
<li><a title="MTV39060" href="http://em.21dtv.com/songs/60139059.mkv"></a></li>
|
||||
<li><a title="MTV39061" href="http://em.21dtv.com/songs/60139060.mkv"></a></li>
|
||||
<li><a title="MTV39062" href="http://em.21dtv.com/songs/60139061.mkv"></a></li>
|
||||
<li><a title="MTV39063" href="http://em.21dtv.com/songs/60139062.mkv"></a></li>
|
||||
<li><a title="MTV39064" href="http://em.21dtv.com/songs/60139063.mkv"></a></li>
|
||||
<li><a title="MTV39065" href="http://em.21dtv.com/songs/60139064.mkv"></a></li>
|
||||
<li><a title="MTV39066" href="http://em.21dtv.com/songs/60139065.mkv"></a></li>
|
||||
<li><a title="MTV39067" href="http://em.21dtv.com/songs/60139066.mkv"></a></li>
|
||||
<li><a title="MTV39068" href="http://em.21dtv.com/songs/60139067.mkv"></a></li>
|
||||
<li><a title="MTV39069" href="http://em.21dtv.com/songs/60139068.mkv"></a></li>
|
||||
<li><a title="MTV39070" href="http://em.21dtv.com/songs/60139069.mkv"></a></li>
|
||||
<li><a title="MTV39071" href="http://em.21dtv.com/songs/60139070.mkv"></a></li>
|
||||
<li><a title="MTV39072" href="http://em.21dtv.com/songs/60139071.mkv"></a></li>
|
||||
<li><a title="MTV39073" href="http://em.21dtv.com/songs/60139072.mkv"></a></li>
|
||||
<li><a title="MTV39074" href="http://em.21dtv.com/songs/60139073.mkv"></a></li>
|
||||
<li><a title="MTV39075" href="http://em.21dtv.com/songs/60139074.mkv"></a></li>
|
||||
<li><a title="MTV39076" href="http://em.21dtv.com/songs/60139075.mkv"></a></li>
|
||||
<li><a title="MTV39077" href="http://em.21dtv.com/songs/60139076.mkv"></a></li>
|
||||
<li><a title="MTV39078" href="http://em.21dtv.com/songs/60139077.mkv"></a></li>
|
||||
<li><a title="MTV39079" href="http://em.21dtv.com/songs/60139078.mkv"></a></li>
|
||||
<li><a title="MTV39080" href="http://em.21dtv.com/songs/60139079.mkv"></a></li>
|
||||
<li><a title="MTV39081" href="http://em.21dtv.com/songs/60139080.mkv"></a></li>
|
||||
<li><a title="MTV39082" href="http://em.21dtv.com/songs/60139081.mkv"></a></li>
|
||||
<li><a title="MTV39083" href="http://em.21dtv.com/songs/60139082.mkv"></a></li>
|
||||
<li><a title="MTV39084" href="http://em.21dtv.com/songs/60139083.mkv"></a></li>
|
||||
<li><a title="MTV39085" href="http://em.21dtv.com/songs/60139084.mkv"></a></li>
|
||||
<li><a title="MTV39086" href="http://em.21dtv.com/songs/60139085.mkv"></a></li>
|
||||
<li><a title="MTV39087" href="http://em.21dtv.com/songs/60139086.mkv"></a></li>
|
||||
<li><a title="MTV39088" href="http://em.21dtv.com/songs/60139087.mkv"></a></li>
|
||||
<li><a title="MTV39089" href="http://em.21dtv.com/songs/60139088.mkv"></a></li>
|
||||
<li><a title="MTV39090" href="http://em.21dtv.com/songs/60139089.mkv"></a></li>
|
||||
<li><a title="MTV39091" href="http://em.21dtv.com/songs/60139090.mkv"></a></li>
|
||||
<li><a title="MTV39092" href="http://em.21dtv.com/songs/60139091.mkv"></a></li>
|
||||
<li><a title="MTV39093" href="http://em.21dtv.com/songs/60139092.mkv"></a></li>
|
||||
<li><a title="MTV39094" href="http://em.21dtv.com/songs/60139093.mkv"></a></li>
|
||||
<li><a title="MTV39095" href="http://em.21dtv.com/songs/60139094.mkv"></a></li>
|
||||
<li><a title="MTV39096" href="http://em.21dtv.com/songs/60139095.mkv"></a></li>
|
||||
<li><a title="MTV39097" href="http://em.21dtv.com/songs/60139096.mkv"></a></li>
|
||||
<li><a title="MTV39098" href="http://em.21dtv.com/songs/60139097.mkv"></a></li>
|
||||
<li><a title="MTV39099" href="http://em.21dtv.com/songs/60139098.mkv"></a></li>
|
||||
<li><a title="MTV39100" href="http://em.21dtv.com/songs/60139099.mkv"></a></li>
|
||||
<li><a title="MTV39101" href="http://em.21dtv.com/songs/60139100.mkv"></a></li>
|
||||
<li><a title="MTV39102" href="http://em.21dtv.com/songs/60139101.mkv"></a></li>
|
||||
<li><a title="MTV39103" href="http://em.21dtv.com/songs/60139102.mkv"></a></li>
|
||||
<li><a title="MTV39104" href="http://em.21dtv.com/songs/60139103.mkv"></a></li>
|
||||
<li><a title="MTV39105" href="http://em.21dtv.com/songs/60139104.mkv"></a></li>
|
||||
<li><a title="MTV39106" href="http://em.21dtv.com/songs/60139105.mkv"></a></li>
|
||||
<li><a title="MTV39107" href="http://em.21dtv.com/songs/60139106.mkv"></a></li>
|
||||
<li><a title="MTV39108" href="http://em.21dtv.com/songs/60139107.mkv"></a></li>
|
||||
<li><a title="MTV39109" href="http://em.21dtv.com/songs/60139108.mkv"></a></li>
|
||||
<li><a title="MTV39110" href="http://em.21dtv.com/songs/60139109.mkv"></a></li>
|
||||
<li><a title="MTV39111" href="http://em.21dtv.com/songs/60139110.mkv"></a></li>
|
||||
<li><a title="MTV39112" href="http://em.21dtv.com/songs/60139111.mkv"></a></li>
|
||||
<li><a title="MTV39113" href="http://em.21dtv.com/songs/60139112.mkv"></a></li>
|
||||
<li><a title="MTV39114" href="http://em.21dtv.com/songs/60139113.mkv"></a></li>
|
||||
<li><a title="MTV39115" href="http://em.21dtv.com/songs/60139114.mkv"></a></li>
|
||||
<li><a title="MTV39116" href="http://em.21dtv.com/songs/60139115.mkv"></a></li>
|
||||
<li><a title="MTV39117" href="http://em.21dtv.com/songs/60139116.mkv"></a></li>
|
||||
<li><a title="MTV39118" href="http://em.21dtv.com/songs/60139117.mkv"></a></li>
|
||||
<li><a title="MTV39119" href="http://em.21dtv.com/songs/60139118.mkv"></a></li>
|
||||
<li><a title="MTV39120" href="http://em.21dtv.com/songs/60139119.mkv"></a></li>
|
||||
<li><a title="MTV39121" href="http://em.21dtv.com/songs/60139120.mkv"></a></li>
|
||||
<li><a title="MTV39122" href="http://em.21dtv.com/songs/60139121.mkv"></a></li>
|
||||
<li><a title="MTV39123" href="http://em.21dtv.com/songs/60139122.mkv"></a></li>
|
||||
<li><a title="MTV39124" href="http://em.21dtv.com/songs/60139123.mkv"></a></li>
|
||||
<li><a title="MTV39125" href="http://em.21dtv.com/songs/60139124.mkv"></a></li>
|
||||
<li><a title="MTV39126" href="http://em.21dtv.com/songs/60139125.mkv"></a></li>
|
||||
<li><a title="MTV39127" href="http://em.21dtv.com/songs/60139126.mkv"></a></li>
|
||||
<li><a title="MTV39128" href="http://em.21dtv.com/songs/60139127.mkv"></a></li>
|
||||
<li><a title="MTV39129" href="http://em.21dtv.com/songs/60139128.mkv"></a></li>
|
||||
<li><a title="MTV39130" href="http://em.21dtv.com/songs/60139129.mkv"></a></li>
|
||||
<li><a title="MTV39131" href="http://em.21dtv.com/songs/60139130.mkv"></a></li>
|
||||
<li><a title="MTV39132" href="http://em.21dtv.com/songs/60139131.mkv"></a></li>
|
||||
<li><a title="MTV39133" href="http://em.21dtv.com/songs/60139132.mkv"></a></li>
|
||||
<li><a title="MTV39134" href="http://em.21dtv.com/songs/60139133.mkv"></a></li>
|
||||
<li><a title="MTV39135" href="http://em.21dtv.com/songs/60139134.mkv"></a></li>
|
||||
<li><a title="MTV39136" href="http://em.21dtv.com/songs/60139135.mkv"></a></li>
|
||||
<li><a title="MTV39137" href="http://em.21dtv.com/songs/60139136.mkv"></a></li>
|
||||
<li><a title="MTV39138" href="http://em.21dtv.com/songs/60139137.mkv"></a></li>
|
||||
<li><a title="MTV39139" href="http://em.21dtv.com/songs/60139138.mkv"></a></li>
|
||||
<li><a title="MTV39140" href="http://em.21dtv.com/songs/60139139.mkv"></a></li>
|
||||
<li><a title="MTV39141" href="http://em.21dtv.com/songs/60139140.mkv"></a></li>
|
||||
<li><a title="MTV39142" href="http://em.21dtv.com/songs/60139141.mkv"></a></li>
|
||||
<li><a title="MTV39143" href="http://em.21dtv.com/songs/60139142.mkv"></a></li>
|
||||
<li><a title="MTV39144" href="http://em.21dtv.com/songs/60139143.mkv"></a></li>
|
||||
<li><a title="MTV39145" href="http://em.21dtv.com/songs/60139144.mkv"></a></li>
|
||||
<li><a title="MTV39146" href="http://em.21dtv.com/songs/60139145.mkv"></a></li>
|
||||
<li><a title="MTV39147" href="http://em.21dtv.com/songs/60139146.mkv"></a></li>
|
||||
<li><a title="MTV39148" href="http://em.21dtv.com/songs/60139147.mkv"></a></li>
|
||||
<li><a title="MTV39149" href="http://em.21dtv.com/songs/60139148.mkv"></a></li>
|
||||
<li><a title="MTV39150" href="http://em.21dtv.com/songs/60139149.mkv"></a></li>
|
||||
<li><a title="MTV39151" href="http://em.21dtv.com/songs/60139150.mkv"></a></li>
|
||||
<li><a title="MTV39152" href="http://em.21dtv.com/songs/60139151.mkv"></a></li>
|
||||
<li><a title="MTV39153" href="http://em.21dtv.com/songs/60139152.mkv"></a></li>
|
||||
<li><a title="MTV39154" href="http://em.21dtv.com/songs/60139153.mkv"></a></li>
|
||||
<li><a title="MTV39155" href="http://em.21dtv.com/songs/60139154.mkv"></a></li>
|
||||
<li><a title="MTV39156" href="http://em.21dtv.com/songs/60139155.mkv"></a></li>
|
||||
<li><a title="MTV39157" href="http://em.21dtv.com/songs/60139156.mkv"></a></li>
|
||||
<li><a title="MTV39158" href="http://em.21dtv.com/songs/60139157.mkv"></a></li>
|
||||
<li><a title="MTV39159" href="http://em.21dtv.com/songs/60139158.mkv"></a></li>
|
||||
<li><a title="MTV39160" href="http://em.21dtv.com/songs/60139159.mkv"></a></li>
|
||||
<li><a title="MTV39161" href="http://em.21dtv.com/songs/60139160.mkv"></a></li>
|
||||
<li><a title="MTV39162" href="http://em.21dtv.com/songs/60139161.mkv"></a></li>
|
||||
<li><a title="MTV39163" href="http://em.21dtv.com/songs/60139162.mkv"></a></li>
|
||||
<li><a title="MTV39164" href="http://em.21dtv.com/songs/60139163.mkv"></a></li>
|
||||
<li><a title="MTV39165" href="http://em.21dtv.com/songs/60139164.mkv"></a></li>
|
||||
<li><a title="MTV39166" href="http://em.21dtv.com/songs/60139165.mkv"></a></li>
|
||||
<li><a title="MTV39167" href="http://em.21dtv.com/songs/60139166.mkv"></a></li>
|
||||
<li><a title="MTV39168" href="http://em.21dtv.com/songs/60139167.mkv"></a></li>
|
||||
<li><a title="MTV39169" href="http://em.21dtv.com/songs/60139168.mkv"></a></li>
|
||||
<li><a title="MTV39170" href="http://em.21dtv.com/songs/60139169.mkv"></a></li>
|
||||
<li><a title="MTV39171" href="http://em.21dtv.com/songs/60139170.mkv"></a></li>
|
||||
<li><a title="MTV39172" href="http://em.21dtv.com/songs/60139171.mkv"></a></li>
|
||||
<li><a title="MTV39173" href="http://em.21dtv.com/songs/60139172.mkv"></a></li>
|
||||
<li><a title="MTV39174" href="http://em.21dtv.com/songs/60139173.mkv"></a></li>
|
||||
<li><a title="MTV39175" href="http://em.21dtv.com/songs/60139174.mkv"></a></li>
|
||||
<li><a title="MTV39176" href="http://em.21dtv.com/songs/60139175.mkv"></a></li>
|
||||
<li><a title="MTV39177" href="http://em.21dtv.com/songs/60139176.mkv"></a></li>
|
||||
<li><a title="MTV39178" href="http://em.21dtv.com/songs/60139177.mkv"></a></li>
|
||||
<li><a title="MTV39179" href="http://em.21dtv.com/songs/60139178.mkv"></a></li>
|
||||
<li><a title="MTV39180" href="http://em.21dtv.com/songs/60139179.mkv"></a></li>
|
||||
<li><a title="MTV39181" href="http://em.21dtv.com/songs/60139180.mkv"></a></li>
|
||||
<li><a title="MTV39182" href="http://em.21dtv.com/songs/60139181.mkv"></a></li>
|
||||
<li><a title="MTV39183" href="http://em.21dtv.com/songs/60139182.mkv"></a></li>
|
||||
<li><a title="MTV39184" href="http://em.21dtv.com/songs/60139183.mkv"></a></li>
|
||||
<li><a title="MTV39185" href="http://em.21dtv.com/songs/60139184.mkv"></a></li>
|
||||
<li><a title="MTV39186" href="http://em.21dtv.com/songs/60139185.mkv"></a></li>
|
||||
<li><a title="MTV39187" href="http://em.21dtv.com/songs/60139186.mkv"></a></li>
|
||||
<li><a title="MTV39188" href="http://em.21dtv.com/songs/60139187.mkv"></a></li>
|
||||
<li><a title="MTV39189" href="http://em.21dtv.com/songs/60139188.mkv"></a></li>
|
||||
<li><a title="MTV39190" href="http://em.21dtv.com/songs/60139189.mkv"></a></li>
|
||||
<li><a title="MTV39191" href="http://em.21dtv.com/songs/60139190.mkv"></a></li>
|
||||
<li><a title="MTV39192" href="http://em.21dtv.com/songs/60139191.mkv"></a></li>
|
||||
<li><a title="MTV39193" href="http://em.21dtv.com/songs/60139192.mkv"></a></li>
|
||||
<li><a title="MTV39194" href="http://em.21dtv.com/songs/60139193.mkv"></a></li>
|
||||
<li><a title="MTV39195" href="http://em.21dtv.com/songs/60139194.mkv"></a></li>
|
||||
<li><a title="MTV39196" href="http://em.21dtv.com/songs/60139195.mkv"></a></li>
|
||||
<li><a title="MTV39197" href="http://em.21dtv.com/songs/60139196.mkv"></a></li>
|
||||
<li><a title="MTV39198" href="http://em.21dtv.com/songs/60139197.mkv"></a></li>
|
||||
<li><a title="MTV39199" href="http://em.21dtv.com/songs/60139198.mkv"></a></li>
|
||||
<li><a title="MTV39200" href="http://em.21dtv.com/songs/60139199.mkv"></a></li>
|
||||
<li><a title="MTV39201" href="http://em.21dtv.com/songs/60139200.mkv"></a></li>
|
||||
<li><a title="MTV39202" href="http://em.21dtv.com/songs/60139201.mkv"></a></li>
|
||||
<li><a title="MTV39203" href="http://em.21dtv.com/songs/60139202.mkv"></a></li>
|
||||
<li><a title="MTV39204" href="http://em.21dtv.com/songs/60139203.mkv"></a></li>
|
||||
<li><a title="MTV39205" href="http://em.21dtv.com/songs/60139204.mkv"></a></li>
|
||||
<li><a title="MTV39206" href="http://em.21dtv.com/songs/60139205.mkv"></a></li>
|
||||
<li><a title="MTV39207" href="http://em.21dtv.com/songs/60139206.mkv"></a></li>
|
||||
<li><a title="MTV39208" href="http://em.21dtv.com/songs/60139207.mkv"></a></li>
|
||||
<li><a title="MTV39209" href="http://em.21dtv.com/songs/60139208.mkv"></a></li>
|
||||
<li><a title="MTV39210" href="http://em.21dtv.com/songs/60139209.mkv"></a></li>
|
||||
<li><a title="MTV39211" href="http://em.21dtv.com/songs/60139210.mkv"></a></li>
|
||||
<li><a title="MTV39212" href="http://em.21dtv.com/songs/60139211.mkv"></a></li>
|
||||
<li><a title="MTV39213" href="http://em.21dtv.com/songs/60139212.mkv"></a></li>
|
||||
<li><a title="MTV39214" href="http://em.21dtv.com/songs/60139213.mkv"></a></li>
|
||||
<li><a title="MTV39215" href="http://em.21dtv.com/songs/60139214.mkv"></a></li>
|
||||
<li><a title="MTV39216" href="http://em.21dtv.com/songs/60139215.mkv"></a></li>
|
||||
<li><a title="MTV39217" href="http://em.21dtv.com/songs/60139216.mkv"></a></li>
|
||||
<li><a title="MTV39218" href="http://em.21dtv.com/songs/60139217.mkv"></a></li>
|
||||
<li><a title="MTV39219" href="http://em.21dtv.com/songs/60139218.mkv"></a></li>
|
||||
<li><a title="MTV39220" href="http://em.21dtv.com/songs/60139219.mkv"></a></li>
|
||||
<li><a title="MTV39221" href="http://em.21dtv.com/songs/60139220.mkv"></a></li>
|
||||
<li><a title="MTV39222" href="http://em.21dtv.com/songs/60139221.mkv"></a></li>
|
||||
<li><a title="MTV39223" href="http://em.21dtv.com/songs/60139222.mkv"></a></li>
|
||||
<li><a title="MTV39224" href="http://em.21dtv.com/songs/60139223.mkv"></a></li>
|
||||
<li><a title="MTV39225" href="http://em.21dtv.com/songs/60139224.mkv"></a></li>
|
||||
<li><a title="MTV39226" href="http://em.21dtv.com/songs/60139225.mkv"></a></li>
|
||||
<li><a title="MTV39227" href="http://em.21dtv.com/songs/60139226.mkv"></a></li>
|
||||
<li><a title="MTV39228" href="http://em.21dtv.com/songs/60139227.mkv"></a></li>
|
||||
<li><a title="MTV39229" href="http://em.21dtv.com/songs/60139228.mkv"></a></li>
|
||||
<li><a title="MTV39230" href="http://em.21dtv.com/songs/60139229.mkv"></a></li>
|
||||
<li><a title="MTV39231" href="http://em.21dtv.com/songs/60139230.mkv"></a></li>
|
||||
<li><a title="MTV39232" href="http://em.21dtv.com/songs/60139231.mkv"></a></li>
|
||||
<li><a title="MTV39233" href="http://em.21dtv.com/songs/60139232.mkv"></a></li>
|
||||
<li><a title="MTV39234" href="http://em.21dtv.com/songs/60139233.mkv"></a></li>
|
||||
<li><a title="MTV39235" href="http://em.21dtv.com/songs/60139234.mkv"></a></li>
|
||||
<li><a title="MTV39236" href="http://em.21dtv.com/songs/60139235.mkv"></a></li>
|
||||
<li><a title="MTV39237" href="http://em.21dtv.com/songs/60139236.mkv"></a></li>
|
||||
<li><a title="MTV39238" href="http://em.21dtv.com/songs/60139237.mkv"></a></li>
|
||||
<li><a title="MTV39239" href="http://em.21dtv.com/songs/60139238.mkv"></a></li>
|
||||
<li><a title="MTV39240" href="http://em.21dtv.com/songs/60139239.mkv"></a></li>
|
||||
<li><a title="MTV39241" href="http://em.21dtv.com/songs/60139240.mkv"></a></li>
|
||||
<li><a title="MTV39242" href="http://em.21dtv.com/songs/60139241.mkv"></a></li>
|
||||
<li><a title="MTV39243" href="http://em.21dtv.com/songs/60139242.mkv"></a></li>
|
||||
<li><a title="MTV39244" href="http://em.21dtv.com/songs/60139243.mkv"></a></li>
|
||||
<li><a title="MTV39245" href="http://em.21dtv.com/songs/60139244.mkv"></a></li>
|
||||
<li><a title="MTV39246" href="http://em.21dtv.com/songs/60139245.mkv"></a></li>
|
||||
<li><a title="MTV39247" href="http://em.21dtv.com/songs/60139246.mkv"></a></li>
|
||||
<li><a title="MTV39248" href="http://em.21dtv.com/songs/60139247.mkv"></a></li>
|
||||
<li><a title="MTV39249" href="http://em.21dtv.com/songs/60139248.mkv"></a></li>
|
||||
<li><a title="MTV39250" href="http://em.21dtv.com/songs/60139249.mkv"></a></li>
|
||||
<li><a title="MTV39251" href="http://em.21dtv.com/songs/60139250.mkv"></a></li>
|
||||
<li><a title="MTV39252" href="http://em.21dtv.com/songs/60139251.mkv"></a></li>
|
||||
<li><a title="MTV39253" href="http://em.21dtv.com/songs/60139252.mkv"></a></li>
|
||||
<li><a title="MTV39254" href="http://em.21dtv.com/songs/60139253.mkv"></a></li>
|
||||
<li><a title="MTV39255" href="http://em.21dtv.com/songs/60139254.mkv"></a></li>
|
||||
<li><a title="MTV39256" href="http://em.21dtv.com/songs/60139255.mkv"></a></li>
|
||||
<li><a title="MTV39257" href="http://em.21dtv.com/songs/60139256.mkv"></a></li>
|
||||
<li><a title="MTV39258" href="http://em.21dtv.com/songs/60139257.mkv"></a></li>
|
||||
<li><a title="MTV39259" href="http://em.21dtv.com/songs/60139258.mkv"></a></li>
|
||||
<li><a title="MTV39260" href="http://em.21dtv.com/songs/60139259.mkv"></a></li>
|
||||
<li><a title="MTV39261" href="http://em.21dtv.com/songs/60139260.mkv"></a></li>
|
||||
<li><a title="MTV39262" href="http://em.21dtv.com/songs/60139261.mkv"></a></li>
|
||||
<li><a title="MTV39263" href="http://em.21dtv.com/songs/60139262.mkv"></a></li>
|
||||
<li><a title="MTV39264" href="http://em.21dtv.com/songs/60139263.mkv"></a></li>
|
||||
<li><a title="MTV39265" href="http://em.21dtv.com/songs/60139264.mkv"></a></li>
|
||||
<li><a title="MTV39266" href="http://em.21dtv.com/songs/60139265.mkv"></a></li>
|
||||
<li><a title="MTV39267" href="http://em.21dtv.com/songs/60139266.mkv"></a></li>
|
||||
<li><a title="MTV39268" href="http://em.21dtv.com/songs/60139267.mkv"></a></li>
|
||||
<li><a title="MTV39269" href="http://em.21dtv.com/songs/60139268.mkv"></a></li>
|
||||
<li><a title="MTV39270" href="http://em.21dtv.com/songs/60139269.mkv"></a></li>
|
||||
<li><a title="MTV39271" href="http://em.21dtv.com/songs/60139270.mkv"></a></li>
|
||||
<li><a title="MTV39272" href="http://em.21dtv.com/songs/60139271.mkv"></a></li>
|
||||
<li><a title="MTV39273" href="http://em.21dtv.com/songs/60139272.mkv"></a></li>
|
||||
<li><a title="MTV39274" href="http://em.21dtv.com/songs/60139273.mkv"></a></li>
|
||||
<li><a title="MTV39275" href="http://em.21dtv.com/songs/60139274.mkv"></a></li>
|
||||
<li><a title="MTV39276" href="http://em.21dtv.com/songs/60139275.mkv"></a></li>
|
||||
<li><a title="MTV39277" href="http://em.21dtv.com/songs/60139276.mkv"></a></li>
|
||||
<li><a title="MTV39278" href="http://em.21dtv.com/songs/60139277.mkv"></a></li>
|
||||
<li><a title="MTV39279" href="http://em.21dtv.com/songs/60139278.mkv"></a></li>
|
||||
<li><a title="MTV39280" href="http://em.21dtv.com/songs/60139279.mkv"></a></li>
|
||||
<li><a title="MTV39281" href="http://em.21dtv.com/songs/60139280.mkv"></a></li>
|
||||
<li><a title="MTV39282" href="http://em.21dtv.com/songs/60139281.mkv"></a></li>
|
||||
<li><a title="MTV39283" href="http://em.21dtv.com/songs/60139282.mkv"></a></li>
|
||||
<li><a title="MTV39284" href="http://em.21dtv.com/songs/60139283.mkv"></a></li>
|
||||
<li><a title="MTV39285" href="http://em.21dtv.com/songs/60139284.mkv"></a></li>
|
||||
<li><a title="MTV39286" href="http://em.21dtv.com/songs/60139285.mkv"></a></li>
|
||||
<li><a title="MTV39287" href="http://em.21dtv.com/songs/60139286.mkv"></a></li>
|
||||
<li><a title="MTV39288" href="http://em.21dtv.com/songs/60139287.mkv"></a></li>
|
||||
<li><a title="MTV39289" href="http://em.21dtv.com/songs/60139288.mkv"></a></li>
|
||||
<li><a title="MTV39290" href="http://em.21dtv.com/songs/60139289.mkv"></a></li>
|
||||
<li><a title="MTV39291" href="http://em.21dtv.com/songs/60139290.mkv"></a></li>
|
||||
<li><a title="MTV39292" href="http://em.21dtv.com/songs/60139291.mkv"></a></li>
|
||||
<li><a title="MTV39293" href="http://em.21dtv.com/songs/60139292.mkv"></a></li>
|
||||
<li><a title="MTV39294" href="http://em.21dtv.com/songs/60139293.mkv"></a></li>
|
||||
<li><a title="MTV39295" href="http://em.21dtv.com/songs/60139294.mkv"></a></li>
|
||||
<li><a title="MTV39296" href="http://em.21dtv.com/songs/60139295.mkv"></a></li>
|
||||
<li><a title="MTV39297" href="http://em.21dtv.com/songs/60139296.mkv"></a></li>
|
||||
<li><a title="MTV39298" href="http://em.21dtv.com/songs/60139297.mkv"></a></li>
|
||||
<li><a title="MTV39299" href="http://em.21dtv.com/songs/60139298.mkv"></a></li>
|
||||
<li><a title="MTV39300" href="http://em.21dtv.com/songs/60139299.mkv"></a></li>
|
||||
<li><a title="MTV39301" href="http://em.21dtv.com/songs/60139300.mkv"></a></li>
|
||||
|
||||
</div>
|
1004
EXT/L2X/MV/4001-5000.html
Normal file
1004
EXT/L2X/MV/4001-5000.html
Normal file
File diff suppressed because it is too large
Load Diff
1004
EXT/L2X/MV/5001-6000.html
Normal file
1004
EXT/L2X/MV/5001-6000.html
Normal file
File diff suppressed because it is too large
Load Diff
1004
EXT/L2X/MV/6001-7000.html
Normal file
1004
EXT/L2X/MV/6001-7000.html
Normal file
File diff suppressed because it is too large
Load Diff
1004
EXT/L2X/MV/7001-8000.html
Normal file
1004
EXT/L2X/MV/7001-8000.html
Normal file
File diff suppressed because it is too large
Load Diff
1004
EXT/L2X/MV/8001-9000.html
Normal file
1004
EXT/L2X/MV/8001-9000.html
Normal file
File diff suppressed because it is too large
Load Diff
1004
EXT/L2X/MV/9001-10000.html
Normal file
1004
EXT/L2X/MV/9001-10000.html
Normal file
File diff suppressed because it is too large
Load Diff
40
EXT/L2X/MV1.html
Normal file
40
EXT/L2X/MV1.html
Normal file
@ -0,0 +1,40 @@
|
||||
<li href="/MV/1-1000.html"></li>
|
||||
<li href="/MV/1001-2000.html"></li>
|
||||
<li href="/MV/2001-3000.html"></li>
|
||||
<li href="/MV/3001-4000.html"></li>
|
||||
<li href="/MV/4001-5000.html"></li>
|
||||
<li href="/MV/5001-6000.html"></li>
|
||||
<li href="/MV/6001-7000.html"></li>
|
||||
<li href="/MV/7001-8000.html"></li>
|
||||
<li href="/MV/8001-9000.html"></li>
|
||||
<li href="/MV/9001-10000.html"></li>
|
||||
<li href="/MV/10001-11000.html"></li>
|
||||
<li href="/MV/11001-12000.html"></li>
|
||||
<li href="/MV/12001-13000.html"></li>
|
||||
<li href="/MV/13001-14000.html"></li>
|
||||
<li href="/MV/14001-15000.html"></li>
|
||||
<li href="/MV/15001-16000.html"></li>
|
||||
<li href="/MV/16001-17000.html"></li>
|
||||
<li href="/MV/17001-18000.html"></li>
|
||||
<li href="/MV/18001-19000.html"></li>
|
||||
<li href="/MV/19001-20000.html"></li>
|
||||
<li href="/MV/20001-21000.html"></li>
|
||||
<li href="/MV/21001-22000.html"></li>
|
||||
<li href="/MV/22001-23000.html"></li>
|
||||
<li href="/MV/23001-24000.html"></li>
|
||||
<li href="/MV/24001-25000.html"></li>
|
||||
<li href="/MV/25001-26000.html"></li>
|
||||
<li href="/MV/26001-27000.html"></li>
|
||||
<li href="/MV/27001-28000.html"></li>
|
||||
<li href="/MV/28001-29000.html"></li>
|
||||
<li href="/MV/29001-30000.html"></li>
|
||||
<li href="/MV/30001-31000.html"></li>
|
||||
<li href="/MV/31001-32000.html"></li>
|
||||
<li href="/MV/32001-33000.html"></li>
|
||||
<li href="/MV/33001-34000.html"></li>
|
||||
<li href="/MV/34001-35000.html"></li>
|
||||
<li href="/MV/35001-36000.html"></li>
|
||||
<li href="/MV/36001-37000.html"></li>
|
||||
<li href="/MV/37001-38000.html"></li>
|
||||
<li href="/MV/38001-39000.html"></li>
|
||||
<li href="/MV/39001-39301.html"></li>
|
52
EXT/L2X/雷蒙影视4K直播/雷蒙影视4K直播.html
Normal file
52
EXT/L2X/雷蒙影视4K直播/雷蒙影视4K直播.html
Normal file
@ -0,0 +1,52 @@
|
||||
<div class="module-play-list-content">
|
||||
<!-- <p>雷蒙影视CrimeTV</p> -->
|
||||
|
||||
<li><a title="【雷蒙独家】" href="http://live.cooltv.top/tv/aishang.php?id=cctv164k"></a></li>
|
||||
<li><a title="抖音4K50P世界杯场次一" href="http://159.75.85.63:5678/zb.php?id=douyin&sc=scone"></a></li>
|
||||
<li><a title="抖音4K50P世界杯场次二" href="http://159.75.85.63:5678/zb.php?id=douyin&sc=sctwo"></a></li>
|
||||
<li><a title="CCTV16-4K-SDR源" href="http://111.29.9.37:6610/000000001000/5000000008000023254/index.m3u8?stbId=3&livemode=1&IASHttpSessionId=OTT2197120221119175523009763&channel-id=bestzb&Contentid=5000000008000023254"></a></li>
|
||||
<li><a title="CCTV16-4K" href="http://live.cooltv.top/tv/aishang.php?id=cctv164k"></a></li>
|
||||
<li><a title="CCTV16-4K-HLG源" href="http://159.75.85.63:8280/cctv4k.php"></a></li>
|
||||
<li><a title="CCTV16-1080P-HLG源" href="http://liveop.cctv.cn/hls/CCTV16HD/playlist.m3u8"></a></li>
|
||||
|
||||
<li><a title="CCTV5-高清(1)" href="http://39.134.24.161/dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226395/index.m3u8?"></a></li>
|
||||
<li><a title="CCTV5-高清(2)" href="http://39.134.24.162/dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226395/index.m3u8?"></a></li>
|
||||
<li><a title="CCTV5-高清(3)" href="http://159.75.85.63:828/shijiebei/sjb.php?id=3007a"></a></li>
|
||||
<li><a title="CCTV5-高清(4)" href="http://111.29.9.37:6610/000000001000/1000000005000025222/index.m3u8?stbId=3&livemode=1&IASHttpSessionId=OTT2197120221119175523009763&channel-id=ystenlive&Contentid=1000000005000025222"></a></li>
|
||||
<li><a title="CCTV5-高清(5)" href="http://111.29.9.42:6610/000000001000/1000000005000025222/index.m3u8?stbId=3&livemode=1&IASHttpSessionId=OTT2197120221119175523009763&channel-id=ystenlive&Contentid=1000000005000025222"></a></li>
|
||||
|
||||
<li><a title="咪咕体育(1)" href="http://39.135.134.67/000000001000/3000000001000028638/index.m3u8"></a></li>
|
||||
<li><a title="咪咕体育(2)" href="http://117.136.156.3:80/000000001000/3000000010000005180/index.m3u8"></a></li>
|
||||
<li><a title="咪咕体育-4K-HLG源" href="http://39.135.41.243/PLTV/88888888/224/3221226716/index.m3u8?hls"></a></li>
|
||||
|
||||
<li><a title="五星体育(1)" href="http://60.213.135.147/keonline.shanghai.liveplay..com/live/program/live/ssty/4000000/mnf.m3u8"></a></li>
|
||||
<li><a title="五星体育(2)" href="http://14.205.73.133/keonline.shanghai.liveplay..com/live/program/live/ssty/4000000/mnf.m3u8"></a></li>
|
||||
<li><a title="五星体育(3)" href="http://111.29.9.48:6610/000000001000/5000000010000017540/index.m3u8?channel-id=bestzb&Contentid=5000000010000017540&livemode=1&stbId=3"></a></li>
|
||||
|
||||
<li><a title="新视觉(1)" href="http://183.207.255.188/live/program/live/xsjhd/4000000/mnf.m3u8"></a></li>
|
||||
<li><a title="新视觉(2)" href="http://183.207.255.188/live/program/live/xsjhd/4000000/mnf.m3u8?zshangd"></a></li>
|
||||
<li><a title="广东体育" href="http://e59abdd420c65d43cc1550d493a88c71.v.smtcdns.net/4403-tx.otvstream.otvcloud.com/otv/skcc/live/channel34/2300.m3u8"></a></li>
|
||||
<li><a title="魅力足球" href="http://183.207.255.188/live/program/live/mlyyhd/4000000/mnf.m3u8"></a></li>
|
||||
|
||||
<li><a title="BTV冬奥记实际-8KSDR源" href="http://111.62.156.15/down.brtvcloud.com/brtv8kapptv/brtv8kapp8ktv.m3u8"></a></li>
|
||||
|
||||
<li><a title="苏州4K" href="http://liveshowbak2.kan0512.com/ksz-norecord/csztv4k_4k.m3u8"></a></li>
|
||||
<li><a title="纯享4K" href="http://111.20.105.192:6610/000000001000/1000000004000011651/index.m3u8?channel-id=ystenlive&Contentid=1000000004000011651&livemode=1&stbId=3"></a></li>
|
||||
<li><a title="欢笑剧场4K" href="http://111.20.105.192:6610/000000001000/5000000007000010001/index.m3u8?channel-id=bestzb&Contentid=5000000007000010001&livemode=1&stbId=3"></a></li>
|
||||
<li><a title="广东综艺4K-HLG源" href="http://27.36.62.163:9090/live/GDZYHD4K_38000.m3u8"></a></li>
|
||||
<li><a title="CCTV4K-HLG源" href="http://27.36.62.163:9090/live/4005.m3u8"></a></li>
|
||||
<li><a title="4K影视1" href="http://111.20.105.192:6610/000000001000/6000000003000004748/index.m3u8?channel-id=wasusyt&Contentid=6000000003000004748&livemode=1&stbId=3"></a></li>
|
||||
<li><a title="4K影视2" href="http://111.20.40.170/PLTV/88888893/224/3221226352/index.m3u8"></a></li>
|
||||
<li><a title="Fashion4K" href="https://fash2043.cloudycdn.services/slive/ftv_ftv_4k_hevc_73d_42080_default_466_hls.smil/playlist.m3u8"></a></li>
|
||||
<li><a title="Clarity4K" href="https://d3thiix3tzne5u.cloudfront.net/playlist2160p.m3u8"></a></li>
|
||||
<li><a title="爱自然" href="https://d18dyiwu97wm6q.cloudfront.net/playlist2160p.m3u8"></a></li>
|
||||
<li><a title="MUZZIKZZ40004K" href="http://muzzik-live.morescreens.com/mts-a6/playlist.m3u8"></a></li>
|
||||
<li><a title="loupe4K" href="https://d2dw21aq0j0l5c.cloudfront.net/playlist_3840x2160.m3u8"></a></li>
|
||||
<li><a title="BloombergTV+4K" href="https://bloomberg-bloombergtv-1-gb.samsung.wurl.com/manifest/playlist.m3u8"></a></li>
|
||||
<li><a title="斗鱼4K" href="http://epg.112114.xyz/douyu/9249162"></a></li>
|
||||
|
||||
<li><a title="" href=""></a></li>
|
||||
<li><a title="" href=""></a></li>
|
||||
|
||||
|
||||
</div>
|
1
EXT/L2X/雷蒙影视4K直播1.html
Normal file
1
EXT/L2X/雷蒙影视4K直播1.html
Normal file
@ -0,0 +1 @@
|
||||
<li href="/雷蒙影视4K直播/雷蒙影视4K直播.html"></li>
|
49
EXT/L2X/高清体育及4K资源/4K.html
Normal file
49
EXT/L2X/高清体育及4K资源/4K.html
Normal file
@ -0,0 +1,49 @@
|
||||
<div class="module-play-list-content">
|
||||
<!-- <p>雷蒙影视CrimeTV</p> -->
|
||||
|
||||
<li><a title="【雷蒙独享】" href="http://live.cooltv.top/tv/aishang.php?id=cctv164k"></a></li>
|
||||
<li><a title="CCTV16-4K-SDR源" href="http://111.20.105.192:6610/000000001000/5000000008000023254/index.m3u8?channel-id=bestzb&Contentid=5000000008000023254&livemode=1&stbId=3"></a></li>
|
||||
<li><a title="CCTV16-4K" href="http://live.cooltv.top/tv/aishang.php?id=cctv164k"></a></li>
|
||||
<li><a title="CCTV16-4K-HLG源" href="http://27.36.62.163:9090/live/4010.m3u8"></a></li>
|
||||
<li><a title="CCTV16-1080P-HLG源" href="http://liveop.cctv.cn/hls/CCTV16HD/playlist.m3u8"></a></li>
|
||||
|
||||
<li><a title="CCTV5-高清(1)" href="http://39.134.24.161/dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226395/index.m3u8?"></a></li>
|
||||
<li><a title="CCTV5-高清(2)" href="http://39.134.24.162/dbiptv.sn.chinamobile.com/PLTV/88888890/224/3221226395/index.m3u8?"></a></li>
|
||||
<li><a title="CCTV5-高清(3)" href="http://159.75.85.63:828/shijiebei/sjb.php?id=3007a"></a></li>
|
||||
<li><a title="CCTV5-高清(4)" href="http://111.29.9.37:6610/000000001000/1000000005000025222/index.m3u8?stbId=3&livemode=1&IASHttpSessionId=OTT2197120221119175523009763&channel-id=ystenlive&Contentid=1000000005000025222"></a></li>
|
||||
<li><a title="CCTV5-高清(5)" href="http://111.29.9.42:6610/000000001000/1000000005000025222/index.m3u8?stbId=3&livemode=1&IASHttpSessionId=OTT2197120221119175523009763&channel-id=ystenlive&Contentid=1000000005000025222"></a></li>
|
||||
|
||||
<li><a title="咪咕体育(1)" href="http://39.135.134.67/000000001000/3000000001000028638/index.m3u8"></a></li>
|
||||
<li><a title="咪咕体育(2)" href="http://117.136.156.3:80/000000001000/3000000010000005180/index.m3u8"></a></li>
|
||||
<li><a title="咪咕体育-4K-HLG源" href="http://39.135.41.243/PLTV/88888888/224/3221226716/index.m3u8?hls"></a></li>
|
||||
|
||||
<li><a title="五星体育(1)" href="http://60.213.135.147/keonline.shanghai.liveplay..com/live/program/live/ssty/4000000/mnf.m3u8"></a></li>
|
||||
<li><a title="五星体育(2)" href="http://14.205.73.133/keonline.shanghai.liveplay..com/live/program/live/ssty/4000000/mnf.m3u8"></a></li>
|
||||
<li><a title="五星体育(3)" href="http://111.29.9.48:6610/000000001000/5000000010000017540/index.m3u8?channel-id=bestzb&Contentid=5000000010000017540&livemode=1&stbId=3"></a></li>
|
||||
|
||||
<li><a title="新视觉(1)" href="http://183.207.255.188/live/program/live/xsjhd/4000000/mnf.m3u8"></a></li>
|
||||
<li><a title="新视觉(2)" href="http://183.207.255.188/live/program/live/xsjhd/4000000/mnf.m3u8?zshangd"></a></li>
|
||||
<li><a title="广东体育" href="http://e59abdd420c65d43cc1550d493a88c71.v.smtcdns.net/4403-tx.otvstream.otvcloud.com/otv/skcc/live/channel34/2300.m3u8"></a></li>
|
||||
<li><a title="魅力足球" href="http://183.207.255.188/live/program/live/mlyyhd/4000000/mnf.m3u8"></a></li>
|
||||
|
||||
<li><a title="BTV冬奥记实际-8KSDR源" href="http://111.62.156.15/down.brtvcloud.com/brtv8kapptv/brtv8kapp8ktv.m3u8"></a></li>
|
||||
|
||||
<li><a title="苏州4K" href="http://liveshowbak2.kan0512.com/ksz-norecord/csztv4k_4k.m3u8"></a></li>
|
||||
<li><a title="纯享4K" href="http://111.20.105.192:6610/000000001000/1000000004000011651/index.m3u8?channel-id=ystenlive&Contentid=1000000004000011651&livemode=1&stbId=3"></a></li>
|
||||
<li><a title="欢笑剧场4K" href="http://111.20.105.192:6610/000000001000/5000000007000010001/index.m3u8?channel-id=bestzb&Contentid=5000000007000010001&livemode=1&stbId=3"></a></li>
|
||||
<li><a title="广东综艺4K-HLG源" href="http://27.36.62.163:9090/live/GDZYHD4K_38000.m3u8"></a></li>
|
||||
<li><a title="CCTV4K-HLG源" href="http://27.36.62.163:9090/live/4005.m3u8"></a></li>
|
||||
<li><a title="4K影视1" href="http://111.20.105.192:6610/000000001000/6000000003000004748/index.m3u8?channel-id=wasusyt&Contentid=6000000003000004748&livemode=1&stbId=3"></a></li>
|
||||
<li><a title="4K影视2" href="http://111.20.40.170/PLTV/88888893/224/3221226352/index.m3u8"></a></li>
|
||||
<li><a title="Fashion4K" href="https://fash2043.cloudycdn.services/slive/ftv_ftv_4k_hevc_73d_42080_default_466_hls.smil/playlist.m3u8"></a></li>
|
||||
<li><a title="Clarity4K" href="https://d3thiix3tzne5u.cloudfront.net/playlist2160p.m3u8"></a></li>
|
||||
<li><a title="爱自然" href="https://d18dyiwu97wm6q.cloudfront.net/playlist2160p.m3u8"></a></li>
|
||||
<li><a title="MUZZIKZZ40004K" href="http://muzzik-live.morescreens.com/mts-a6/playlist.m3u8"></a></li>
|
||||
<li><a title="loupe4K" href="https://d2dw21aq0j0l5c.cloudfront.net/playlist_3840x2160.m3u8"></a></li>
|
||||
<li><a title="BloombergTV+4K" href="https://bloomberg-bloombergtv-1-gb.samsung.wurl.com/manifest/playlist.m3u8"></a></li>
|
||||
<li><a title="斗鱼4K" href="http://epg.112114.xyz/douyu/9249162"></a></li>
|
||||
|
||||
<li><a title="" href=""></a></li>
|
||||
|
||||
|
||||
</div>
|
1
EXT/L2X/高清体育及4K资源1.html
Normal file
1
EXT/L2X/高清体育及4K资源1.html
Normal file
@ -0,0 +1 @@
|
||||
<li href="/高清体育及4K资源/4K.html"></li>
|
819
EXT/LIB/alist.js
Normal file
819
EXT/LIB/alist.js
Normal file
@ -0,0 +1,819 @@
|
||||
// import _ from 'https://underscorejs.org/underscore-esm-min.js'
|
||||
// import {distance} from 'https://unpkg.com/fastest-levenshtein@1.0.16/esm/mod.js'
|
||||
import {distance} from './mod.js'
|
||||
import {sortListByCN} from './sortName.js'
|
||||
|
||||
/**
|
||||
* alist js
|
||||
* 配置设置 {"key":"Alist","name":"Alist","type":3,"api":"http://xxx.com/alist.js","searchable":0,"quickSearch":0,"filterable":0,"ext":"http://xxx.com/alist.json"}
|
||||
* alist.json [{
|
||||
name:'名称',
|
||||
server:'地址',
|
||||
startPage:'/', //启动文件夹
|
||||
showAll: false , //是否显示全部文件,默认false只显示 音视频和文件夹
|
||||
search: true, // 启用小雅的搜索,搜索只会搜第一个开启此开关的磁盘
|
||||
params:{ //对应文件夹参数 如设置对应文件夹的密码
|
||||
'/abc':{ password : '123' },
|
||||
'/abc/abc':{ password : '123' },
|
||||
}
|
||||
}]
|
||||
* 提示 想要加载文件夹里面全部视频到详情(看剧可以自动播放下一集支持历史记录)
|
||||
* 需要改软件才能支持,,建议长按文件夹时添加判断 tag == folder 时跳转 DetailActivity
|
||||
*/
|
||||
String.prototype.rstrip = function (chars) {
|
||||
let regex = new RegExp(chars + "$");
|
||||
return this.replace(regex, "");
|
||||
};
|
||||
var showMode = 'single';
|
||||
var searchDriver = '';
|
||||
var limit_search_show = 200;
|
||||
var search_type = '';
|
||||
var detail_order = 'name';
|
||||
var playRaw = 1; // 播放直链获取,默认0直接拼接/d 填1可以获取阿里oss链接。注意,有时效性
|
||||
const request_timeout = 5000;
|
||||
const VERSION = 'alist v2/v3 20221223';
|
||||
const UA = 'Mozilla/5.0'; //默认请求ua
|
||||
/**
|
||||
* 打印日志
|
||||
* @param any 任意变量
|
||||
*/
|
||||
function print(any){
|
||||
any = any||'';
|
||||
if(typeof(any)=='object'&&Object.keys(any).length>0){
|
||||
try {
|
||||
any = JSON.stringify(any);
|
||||
console.log(any);
|
||||
}catch (e) {
|
||||
// console.log('print:'+e.message);
|
||||
console.log(typeof(any)+':'+any.length);
|
||||
}
|
||||
}else if(typeof(any)=='object'&&Object.keys(any).length<1){
|
||||
console.log('null object');
|
||||
}else{
|
||||
console.log(any);
|
||||
}
|
||||
}
|
||||
|
||||
/*** js自封装的方法 ***/
|
||||
|
||||
/**
|
||||
* 获取链接的host(带http协议的完整链接)
|
||||
* @param url 任意一个正常完整的Url,自动提取根
|
||||
* @returns {string}
|
||||
*/
|
||||
function getHome(url){
|
||||
if(!url){
|
||||
return ''
|
||||
}
|
||||
let tmp = url.split('//');
|
||||
url = tmp[0] + '//' + tmp[1].split('/')[0];
|
||||
try {
|
||||
url = decodeURIComponent(url);
|
||||
}catch (e) {}
|
||||
return url
|
||||
}
|
||||
|
||||
const http = function (url, options = {}) {
|
||||
if(options.method ==='POST' && options.data){
|
||||
options.body = JSON.stringify(options.data);
|
||||
options.headers = Object.assign({'content-type':'application/json'}, options.headers);
|
||||
}
|
||||
options.timeout = request_timeout;
|
||||
if(!options.headers){
|
||||
options.headers = {};
|
||||
}
|
||||
let keys = Object.keys(options.headers).map(it=>it.toLowerCase());
|
||||
if(!keys.includes('referer')){
|
||||
options.headers['Referer'] = getHome(url);
|
||||
}
|
||||
if(!keys.includes('user-agent')){
|
||||
options.headers['User-Agent'] = UA;
|
||||
}
|
||||
console.log(JSON.stringify(options.headers));
|
||||
try {
|
||||
const res = req(url, options);
|
||||
// if(options.headers['Authorization']){
|
||||
// console.log(res.content);
|
||||
// }
|
||||
res.json = () => res&&res.content ? JSON.parse(res.content) : null;
|
||||
res.text = () => res&&res.content ? res.content:'';
|
||||
return res
|
||||
}catch (e) {
|
||||
return {
|
||||
json() {
|
||||
return null
|
||||
}, text() {
|
||||
return ''
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
["get", "post"].forEach(method => {
|
||||
http[method] = function (url, options = {}) {
|
||||
return http(url, Object.assign(options, {method: method.toUpperCase()}));
|
||||
}
|
||||
});
|
||||
|
||||
const __drives = {};
|
||||
|
||||
function isMedia(file){
|
||||
return /\.(dff|dsf|mp3|aac|wav|wma|cda|flac|m4a|mid|mka|mp2|mpa|mpc|ape|ofr|ogg|ra|wv|tta|ac3|dts|tak|webm|wmv|mpeg|mov|ram|swf|mp4|avi|rm|rmvb|flv|mpg|mkv|m3u8|ts|3gp|asf)$/.test(file.toLowerCase());
|
||||
}
|
||||
|
||||
function get_drives_path(tid) {
|
||||
const index = tid.indexOf('$');
|
||||
const name = tid.substring(0, index);
|
||||
const path = tid.substring(index + 1);
|
||||
return { drives: get_drives(name), path };
|
||||
}
|
||||
|
||||
function get_drives(name) {
|
||||
const { settings, api, server,headers } = __drives[name];
|
||||
if (settings.v3 == null) { //获取 设置
|
||||
settings.v3 = false;
|
||||
const data = http.get(server + '/api/public/settings',{headers:headers}).json().data;
|
||||
if (Array.isArray(data)) {
|
||||
settings.title = data.find(x => x.key === 'title')?.value;
|
||||
settings.v3 = false;
|
||||
settings.version = data.find(x => x.key === 'version')?.value;
|
||||
settings.enableSearch = data.find(x => x.key === 'enable search')?.value === 'true';
|
||||
} else {
|
||||
settings.title = data.title;
|
||||
settings.v3 = true;
|
||||
settings.version = data.version;
|
||||
settings.enableSearch = false; //v3 没有找到 搜索配置
|
||||
}
|
||||
//不同版本 接口不一样
|
||||
api.path = settings.v3 ? '/api/fs/list' : '/api/public/path';
|
||||
api.file = settings.v3 ? '/api/fs/get' : '/api/public/path';
|
||||
api.search = settings.v3 ? '/api/public/search' : '/api/public/search';
|
||||
}
|
||||
return __drives[name]
|
||||
}
|
||||
|
||||
function init(ext) {
|
||||
console.log("当前版本号:"+VERSION);
|
||||
let data;
|
||||
if (typeof ext == 'object'){
|
||||
data = ext;
|
||||
print('alist ext:object');
|
||||
} else if (typeof ext == 'string') {
|
||||
if (ext.startsWith('http')) {
|
||||
let alist_data = ext.split(';');
|
||||
let alist_data_url = alist_data[0];
|
||||
limit_search_show = alist_data.length>1?Number(alist_data[1])||limit_search_show:limit_search_show;
|
||||
search_type = alist_data.length>2?alist_data[2]:search_type;
|
||||
print(alist_data_url);
|
||||
data = http.get(alist_data_url).json(); // .map(it=>{it.name='🙋丫仙女';return it})
|
||||
} else {
|
||||
print('alist ext:json string');
|
||||
data = JSON.parse(ext);
|
||||
}
|
||||
}
|
||||
|
||||
// print(data); // 测试证明壳子标题支持emoji,是http请求源码不支持emoji
|
||||
let drives = [];
|
||||
if(Array.isArray(data) && data.length > 0 && data[0].hasOwnProperty('server') && data[0].hasOwnProperty('name')){
|
||||
drives = data;
|
||||
}else if(!Array.isArray(data)&&data.hasOwnProperty('drives')&&Array.isArray(data.drives)){
|
||||
drives = data.drives.filter(it=>(it.type&&it.type==='alist')||!it.type);
|
||||
}
|
||||
print(drives);
|
||||
searchDriver = (drives.find(x=>x.search)||{}).name||'';
|
||||
if(!searchDriver && drives.length > 0){
|
||||
searchDriver = drives[0].name;
|
||||
}
|
||||
print(searchDriver);
|
||||
drives.forEach(item => {
|
||||
let _path_param = [];
|
||||
if(item.params){
|
||||
_path_param = Object.keys(item.params);
|
||||
// 升序排列
|
||||
_path_param.sort((a,b)=>(a.length-b.length));
|
||||
}
|
||||
if(item.password){
|
||||
let pwdObj = {
|
||||
password: item.password
|
||||
};
|
||||
if(!item.params){
|
||||
item.params = {'/':pwdObj};
|
||||
}else{
|
||||
item.params['/'] = pwdObj;
|
||||
}
|
||||
_path_param.unshift('/');
|
||||
}
|
||||
__drives[item.name] = {
|
||||
name: item.name,
|
||||
server: item.server.endsWith("/") ? item.server.rstrip("/") : item.server,
|
||||
startPage: item.startPage || '/', //首页
|
||||
showAll: item.showAll === true, //默认只显示 视频和文件夹,如果想显示全部 showAll 设置true
|
||||
search: !!item.search, //是否支持搜索,只有小丫的可以,多个可搜索只取最前面的一个
|
||||
params: item.params || {},
|
||||
_path_param: _path_param,
|
||||
settings: {},
|
||||
api: {},
|
||||
headers:item.headers||{},
|
||||
getParams(path) {
|
||||
const key = this._path_param.find(x => path.startsWith(x));
|
||||
return Object.assign({}, this.params[key], { path });
|
||||
},
|
||||
getPath(path) {
|
||||
const res = http.post(this.server + this.api.path, { data: this.getParams(path),headers:this.headers }).json();
|
||||
// console.log(res);
|
||||
try {
|
||||
return this.settings.v3 ? res.data.content : res.data.files
|
||||
}catch (e) {
|
||||
console.log(`getPath发生错误:${e.message}`);
|
||||
console.log(JSON.stringify(res));
|
||||
return [{name:'error',value:JSON.stringify(res)}]
|
||||
}
|
||||
},
|
||||
getFile(path) {
|
||||
let raw_url = this.server+'/d'+path;
|
||||
raw_url = encodeURI(raw_url);
|
||||
let data = {raw_url:raw_url,raw_url1:raw_url};
|
||||
if(playRaw===1){
|
||||
try {
|
||||
const res = http.post(this.server + this.api.file, { data: this.getParams(path),headers:this.headers }).json();
|
||||
data = this.settings.v3 ? res.data : res.data.files[0];
|
||||
if (!this.settings.v3) {
|
||||
data.raw_url = data.url; //v2 的url和v3不一样
|
||||
}
|
||||
data.raw_url1 = raw_url;
|
||||
return data
|
||||
}catch (e) {
|
||||
return data
|
||||
}
|
||||
}else{
|
||||
return data
|
||||
}
|
||||
},
|
||||
isFolder(data) { return data.type === 1 },
|
||||
isVideo(data) { //判断是否是 视频文件
|
||||
// return this.settings.v3 ? data.type === 2 : data.type === 3
|
||||
// 增加音乐识别 视频,其他,音频
|
||||
return this.settings.v3 ? (data.type === 2||data.type===0||data.type===3) : (data.type === 3||data.type===0||data.type === 4)
|
||||
},
|
||||
is_subt(data) {
|
||||
if (data.type === 1) {
|
||||
return false;
|
||||
}
|
||||
const ext = /\.(srt|ass|scc|stl|ttml)$/; // [".srt", ".ass", ".scc", ".stl", ".ttml"];
|
||||
// return ext.some(x => data.name.endsWith(x));
|
||||
return ext.test(data.name);
|
||||
},
|
||||
getPic(data) {
|
||||
let pic = this.settings.v3 ? data.thumb : data.thumbnail;
|
||||
return pic || (this.isFolder(data) ? "http://img1.3png.com/281e284a670865a71d91515866552b5f172b.png" : '');
|
||||
},
|
||||
getTime(data,isStandard) {
|
||||
isStandard = isStandard||false;
|
||||
try {
|
||||
let tTime = data.updated_at || data.time_str || data.modified || "";
|
||||
let date = '';
|
||||
if(tTime){
|
||||
tTime = tTime.split("T");
|
||||
date = tTime[0];
|
||||
if(isStandard){
|
||||
date = date.replace(/-/g,"/");
|
||||
}
|
||||
tTime = tTime[1].split(/Z|\./);
|
||||
date += " " + tTime[0];
|
||||
}
|
||||
return date;
|
||||
}catch (e) {
|
||||
// print(e.message);
|
||||
// print(data);
|
||||
return ''
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
);
|
||||
print('init执行完毕');
|
||||
}
|
||||
|
||||
function home(filter) {
|
||||
let classes = Object.keys(__drives).map(key => ({
|
||||
type_id: `${key}$${__drives[key].startPage}`,
|
||||
type_name: key,
|
||||
type_flag: '1',
|
||||
}));
|
||||
let filter_dict = {};
|
||||
let filters = [{'key': 'order', 'name': '排序', 'value': [{'n': '名称⬆️', 'v': 'vod_name_asc'}, {'n': '名称⬇️', 'v': 'vod_name_desc'},
|
||||
{'n': '中英⬆️', 'v': 'vod_cn_asc'}, {'n': '中英⬇️', 'v': 'vod_cn_desc'},
|
||||
{'n': '时间⬆️', 'v': 'vod_time_asc'}, {'n': '时间⬇️', 'v': 'vod_time_desc'},
|
||||
{'n': '大小⬆️', 'v': 'vod_size_asc'}, {'n': '大小⬇️', 'v': 'vod_size_desc'},{'n': '无', 'v': 'none'}]},
|
||||
{'key': 'show', 'name': '播放展示', 'value': [{'n': '单集', 'v': 'single'},{'n': '全集', 'v': 'all'}]}
|
||||
];
|
||||
classes.forEach(it=>{
|
||||
filter_dict[it.type_id] = filters;
|
||||
});
|
||||
print("----home----");
|
||||
print(classes);
|
||||
return JSON.stringify({ 'class': classes,'filters': filter_dict});
|
||||
}
|
||||
|
||||
function homeVod(params) {
|
||||
let _post_data = {"pageNum":0,"pageSize":100};
|
||||
let _post_url = 'https://pbaccess.video.qq.com/trpc.videosearch.hot_rank.HotRankServantHttp/HotRankHttp';
|
||||
let data = http.post(_post_url,{ data: _post_data }).json();
|
||||
let _list = [];
|
||||
try {
|
||||
data = data['data']['navItemList'][0]['hotRankResult']['rankItemList'];
|
||||
// print(data);
|
||||
data.forEach(it=>{
|
||||
_list.push({
|
||||
vod_name:it.title,
|
||||
vod_id:'msearch:'+it.title,
|
||||
vod_pic:'https://avatars.githubusercontent.com/u/97389433?s=120&v=4',
|
||||
vod_remarks:it.changeOrder,
|
||||
});
|
||||
});
|
||||
}catch (e) {
|
||||
print('Alist获取首页推荐发送错误:'+e.message);
|
||||
}
|
||||
return JSON.stringify({ 'list': _list });
|
||||
}
|
||||
|
||||
function category(tid, pg, filter, extend) {
|
||||
let orid = tid.replace(/#all#|#search#/g,'');
|
||||
let { drives, path } = get_drives_path(orid);
|
||||
const id = orid.endsWith('/') ? orid : orid + '/';
|
||||
const list = drives.getPath(path);
|
||||
let subList = [];
|
||||
let vodFiles = [];
|
||||
let allList = [];
|
||||
let fl = filter?extend:{};
|
||||
if(fl.show){
|
||||
showMode = fl.show;
|
||||
}
|
||||
list.forEach(item => {
|
||||
if(item.name!=='error') {
|
||||
if (drives.is_subt(item)) {
|
||||
subList.push(item.name);
|
||||
}
|
||||
if (!drives.showAll && !drives.isFolder(item) && !drives.isVideo(item)) {
|
||||
return //只显示视频文件和文件夹
|
||||
}
|
||||
let vod_time = drives.getTime(item);
|
||||
let vod_size = get_size(item.size);
|
||||
let remark = vod_time.split(' ')[0].substr(3) + '\t' + vod_size;
|
||||
let vod_id = id + item.name + (drives.isFolder(item) ? '/' : '');
|
||||
if (showMode === 'all') {
|
||||
vod_id += '#all#';
|
||||
}
|
||||
print(vod_id);
|
||||
const vod = {
|
||||
'vod_id': vod_id,
|
||||
'vod_name': item.name.replaceAll("$", "").replaceAll("#", ""),
|
||||
'vod_pic': drives.getPic(item),
|
||||
'vod_time': vod_time,
|
||||
'vod_size': item.size,
|
||||
'vod_tag': drives.isFolder(item) ? 'folder' : 'file',
|
||||
'vod_remarks': drives.isFolder(item) ? remark + ' 文件夹' : remark
|
||||
};
|
||||
if (drives.isVideo(item)) {
|
||||
vodFiles.push(vod);
|
||||
}
|
||||
allList.push(vod);
|
||||
}else{
|
||||
console.log(item);
|
||||
const vod = {
|
||||
vod_name: item.value,
|
||||
vod_id: 'no_data',
|
||||
vod_remarks: '不要点,会崩的',
|
||||
vod_pic: 'https://ghproxy.com/https://raw.githubusercontent.com/hjdhnx/dr_py/main/404.jpg'
|
||||
}
|
||||
allList.push(vod);
|
||||
}
|
||||
});
|
||||
|
||||
if (vodFiles.length === 1 && subList.length > 0) { //只有一个视频 一个或者多个字幕 取相似度最高的
|
||||
// let sub = subList.length === 1 ? subList[0] : _.chain(allList).sortBy(x => (x.includes('chs') ? 100 : 0) + levenshteinDistance(x, vodFiles[0].vod_name)).last().value();
|
||||
let sub; // 字幕文件名称
|
||||
if(subList.length === 1){
|
||||
sub = subList[0];
|
||||
}else {
|
||||
let subs = JSON.parse(JSON.stringify(subList));
|
||||
subs.sort((a,b)=>{
|
||||
// chs是简体中文字幕
|
||||
let a_similar = (a.includes('chs') ? 100 : 0) + levenshteinDistance(a, vodFiles[0].vod_name);
|
||||
let b_similar = (b.includes('chs') ? 100 : 0) + levenshteinDistance(b, vodFiles[0].vod_name);
|
||||
if(a_similar>b_similar) { // 按相似度正序排列
|
||||
return 1;
|
||||
}else{ //否则,位置不变
|
||||
return -1;
|
||||
}
|
||||
});
|
||||
sub = subs.slice(-1)[0];
|
||||
}
|
||||
vodFiles[0].vod_id += "@@@" + sub;
|
||||
// vodFiles[0].vod_remarks += " 有字幕";
|
||||
vodFiles[0].vod_remarks += "🏷️";
|
||||
} else {
|
||||
vodFiles.forEach(item => {
|
||||
const lh = 0;
|
||||
let sub;
|
||||
subList.forEach(s => {
|
||||
//编辑距离相似度
|
||||
const l = levenshteinDistance(s, item.vod_name);
|
||||
if (l > 60 && l > lh) {
|
||||
sub = s;
|
||||
}
|
||||
});
|
||||
if (sub) {
|
||||
item.vod_id += "@@@" + sub;
|
||||
// item.vod_remarks += " 有字幕";
|
||||
item.vod_remarks += "🏷️";
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if(fl.order){
|
||||
// print(fl.order);
|
||||
let key = fl.order.split('_').slice(0,-1).join('_');
|
||||
let order = fl.order.split('_').slice(-1)[0];
|
||||
print(`排序key:${key},排序order:${order}`);
|
||||
if(key.includes('name')){
|
||||
detail_order = 'name';
|
||||
allList = sortListByName(allList,key,order);
|
||||
}else if(key.includes('cn')){
|
||||
detail_order = 'cn';
|
||||
allList = sortListByCN(allList,'vod_name',order);
|
||||
}else if(key.includes('time')){
|
||||
detail_order = 'time';
|
||||
allList = sortListByTime(allList,key,order);
|
||||
}else if(key.includes('size')){
|
||||
detail_order = 'size';
|
||||
allList = sortListBySize(allList,key,order);
|
||||
}else if(fl.order.includes('none')){
|
||||
detail_order = 'none';
|
||||
print('不排序');
|
||||
}
|
||||
}else{
|
||||
// 没传order是其他地方调用的,自动按名称正序排序方便追剧,如果传了none进去就不排序,假装云盘里本身文件顺序是正常的
|
||||
if(detail_order!=='none'){
|
||||
allList = sortListByName(allList,'vod_name','asc');
|
||||
}
|
||||
}
|
||||
|
||||
print("----category----"+`tid:${tid},detail_order:${detail_order},showMode:${showMode}`);
|
||||
// print(allList);
|
||||
return JSON.stringify({
|
||||
'page': 1,
|
||||
'pagecount': 1,
|
||||
'limit': allList.length,
|
||||
'total': allList.length,
|
||||
'list': allList,
|
||||
});
|
||||
}
|
||||
|
||||
function getAll(otid,tid,drives,path){
|
||||
try {
|
||||
const content = category(tid, null, false, null);
|
||||
const isFile = isMedia(otid.replace(/#all#|#search#/g,'').split('@@@')[0]);
|
||||
const { list } = JSON.parse(content);
|
||||
let vod_play_url = [];
|
||||
list.forEach(x => {
|
||||
if (x.vod_tag === 'file'){
|
||||
let vid = x.vod_id.replace(/#all#|#search#/g,'');
|
||||
vod_play_url.push(`${x.vod_name}$${vid.substring(vid.indexOf('$') + 1)}`);
|
||||
}
|
||||
});
|
||||
const pl = path.split("/").filter(it=>it);
|
||||
let vod_name = pl[pl.length - 1] || drives.name;
|
||||
if(vod_name === drives.name){
|
||||
print(pl);
|
||||
}
|
||||
if(otid.includes('#search#')){
|
||||
vod_name+='[搜]';
|
||||
}
|
||||
let vod = {
|
||||
// vod_id: tid,
|
||||
vod_id: otid,
|
||||
vod_name: vod_name,
|
||||
type_name: "文件夹",
|
||||
vod_pic: "https://avatars.githubusercontent.com/u/97389433?s=120&v=4",
|
||||
vod_content: tid,
|
||||
vod_tag: 'folder',
|
||||
vod_play_from: drives.name,
|
||||
vod_play_url: vod_play_url.join('#'),
|
||||
vod_remarks: drives.settings.title,
|
||||
}
|
||||
print("----detail1----");
|
||||
print(vod);
|
||||
return JSON.stringify({ 'list': [vod] });
|
||||
}catch (e) {
|
||||
print(e.message);
|
||||
let list = [{vod_name:'无数据,防无限请求',type_name: "文件夹",vod_id:'no_data',vod_remarks:'不要点,会崩的',vod_pic:'https://ghproxy.com/https://raw.githubusercontent.com/hjdhnx/dr_py/main/static/img/404.jpg',vod_actor:e.message,vod_director: tid,vod_content: otid}];
|
||||
return JSON.stringify({ 'list': list });
|
||||
}
|
||||
}
|
||||
|
||||
function detail(tid) {
|
||||
let isSearch = tid.includes('#search#');
|
||||
let isAll = tid.includes('#all#');
|
||||
let otid = tid;
|
||||
tid = tid.replace(/#all#|#search#/g,'');
|
||||
let isFile = isMedia(tid.split('@@@')[0]);
|
||||
print(`isFile:${tid}?${isFile}`);
|
||||
let { drives, path } = get_drives_path(tid);
|
||||
print(`drives:${drives},path:${path},`);
|
||||
if (path.endsWith("/")) { //长按文件夹可以 加载里面全部视频到详情
|
||||
return getAll(otid,tid,drives,path);
|
||||
} else {
|
||||
if(isSearch&&!isFile){ // 搜索结果 当前目录获取所有文件
|
||||
return getAll(otid,tid,drives,path);
|
||||
}else if(isAll){ // 上级目录获取所有文件 不管是搜索还是分类,只要不是 搜索到的文件夹,且展示模式为全部,都获取上级目录的所有文件
|
||||
// 是文件就取上级目录
|
||||
let new_tid;
|
||||
if(isFile){
|
||||
new_tid = tid.split('/').slice(0,-1).join('/')+'/';
|
||||
}else{
|
||||
new_tid = tid;
|
||||
}
|
||||
print(`全集模式 tid:${tid}=>tid:${new_tid}`);
|
||||
let { drives, path } = get_drives_path(new_tid);
|
||||
return getAll(otid,new_tid,drives,path);
|
||||
} else if(isFile){ // 单文件进入
|
||||
let paths = path.split("@@@");
|
||||
let vod_name = paths[0].substring(paths[0].lastIndexOf("/") + 1);
|
||||
let vod_title = vod_name;
|
||||
if(otid.includes('#search#')){
|
||||
vod_title+='[搜]';
|
||||
}
|
||||
let vod = {
|
||||
vod_id: otid,
|
||||
vod_name: vod_title,
|
||||
type_name: "文件",
|
||||
vod_pic: "https://avatars.githubusercontent.com/u/97389433?s=120&v=4",
|
||||
vod_content: tid,
|
||||
vod_play_from: drives.name,
|
||||
vod_play_url: vod_name + "$" + path,
|
||||
vod_remarks: drives.settings.title,
|
||||
};
|
||||
print("----detail2----");
|
||||
print(vod);
|
||||
return JSON.stringify({
|
||||
'list': [vod]
|
||||
});
|
||||
}else{
|
||||
return JSON.stringify({
|
||||
'list': []
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function play(flag, id, flags) {
|
||||
const drives = get_drives(flag);
|
||||
const urls = id.split("@@@"); // @@@ 分割前是 相对文件path,分割后是字幕文件
|
||||
let vod = {
|
||||
'parse': 0,
|
||||
'playUrl': '',
|
||||
// 'url': drives.getFile(urls[0]).raw_url+'#.m3u8' // 加 # 没法播放
|
||||
'url': drives.getFile(urls[0]).raw_url
|
||||
};
|
||||
if (urls.length >= 2) {
|
||||
const path = urls[0].substring(0, urls[0].lastIndexOf('/') + 1);
|
||||
vod.subt = drives.getFile(path + urls[1]).raw_url1;
|
||||
}
|
||||
print("----play----");
|
||||
print(vod);
|
||||
return JSON.stringify(vod);
|
||||
}
|
||||
|
||||
function search(wd, quick) {
|
||||
print(__drives);
|
||||
print('可搜索的alist驱动:'+searchDriver);
|
||||
if(!searchDriver||!wd){
|
||||
return JSON.stringify({
|
||||
'list': []
|
||||
});
|
||||
}else{
|
||||
let driver = __drives[searchDriver];
|
||||
wd = wd.split(' ').filter(it=>it.trim()).join('+');
|
||||
print(driver);
|
||||
let surl = driver.server + '/search?box='+wd+'&url=';
|
||||
if(search_type){
|
||||
surl+='&type='+search_type;
|
||||
}
|
||||
print('搜索链接:'+surl);
|
||||
let html = http.get(surl).text();
|
||||
let lists = [];
|
||||
try {
|
||||
lists = pdfa(html,'div&&ul&&a');
|
||||
}catch (e) {}
|
||||
print(`搜索结果数:${lists.length},搜索结果显示数量限制:${limit_search_show}`);
|
||||
let vods = [];
|
||||
let excludeReg = /\.(pdf|epub|mobi|txt|doc|lrc)$/; // 过滤后缀文件
|
||||
let cnt = 0;
|
||||
lists.forEach(it=>{
|
||||
let vhref = pdfh(it,'a&&href');
|
||||
if(vhref){
|
||||
vhref = unescape(vhref);
|
||||
}
|
||||
if(excludeReg.test(vhref)){
|
||||
return; //跳过本次循环
|
||||
}
|
||||
if(cnt < limit_search_show){
|
||||
print(vhref);
|
||||
}
|
||||
cnt ++;
|
||||
let vid = searchDriver+'$'+vhref+'#search#';
|
||||
if(showMode==='all'){
|
||||
vid+='#all#';
|
||||
}
|
||||
vods.push({
|
||||
vod_name:pdfh(it,'a&&Text'),
|
||||
vod_id:vid,
|
||||
vod_tag: isMedia(vhref) ? 'file' : 'folder',
|
||||
vod_pic:'http://img1.3png.com/281e284a670865a71d91515866552b5f172b.png',
|
||||
vod_remarks:searchDriver
|
||||
});
|
||||
});
|
||||
// 截取搜索结果
|
||||
vods = vods.slice(0,limit_search_show);
|
||||
print(vods);
|
||||
return JSON.stringify({
|
||||
'list': vods
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function get_size(sz) {
|
||||
if (sz <= 0) {
|
||||
return "";
|
||||
}
|
||||
let filesize = "";
|
||||
if (sz > 1024 * 1024 * 1024 * 1024.0) {
|
||||
sz /= (1024 * 1024 * 1024 * 1024.0);
|
||||
filesize = "TB";
|
||||
} else if (sz > 1024 * 1024 * 1024.0) {
|
||||
sz /= (1024 * 1024 * 1024.0);
|
||||
filesize = "GB";
|
||||
} else if (sz > 1024 * 1024.0) {
|
||||
sz /= (1024 * 1024.0);
|
||||
filesize = "MB";
|
||||
} else if( sz > 1024.0){
|
||||
sz /= 1024.0;
|
||||
filesize = "KB";
|
||||
}else{
|
||||
filesize = "B";
|
||||
}
|
||||
// 转成字符串
|
||||
let sizeStr = sz.toFixed(2) + filesize,
|
||||
// 获取小数点处的索引
|
||||
index = sizeStr.indexOf("."),
|
||||
// 获取小数点后两位的值
|
||||
dou = sizeStr.substr(index + 1, 2);
|
||||
if (dou === "00") {
|
||||
return sizeStr.substring(0, index) + sizeStr.substr(index + 3, 2);
|
||||
}else{
|
||||
return sizeStr;
|
||||
}
|
||||
}
|
||||
|
||||
// 相似度获取
|
||||
function levenshteinDistance(str1, str2) {
|
||||
return 100 - 100 * distance(str1, str2) / Math.max(str1.length, str2.length);
|
||||
}
|
||||
|
||||
/**
|
||||
* 自然排序
|
||||
* ["第1集","第10集","第20集","第2集","1","2","10","12","23","01","02"].sort(naturalSort())
|
||||
* @param options {{key,caseSensitive, order: string}}
|
||||
*/
|
||||
function naturalSort(options) {
|
||||
if (!options) {
|
||||
options = {};
|
||||
}
|
||||
|
||||
return function (a, b) {
|
||||
if(options.key){
|
||||
a = a[options.key];
|
||||
b = b[options.key];
|
||||
}
|
||||
var EQUAL = 0;
|
||||
var GREATER = (options.order === 'desc' ?
|
||||
-1 :
|
||||
1
|
||||
);
|
||||
var SMALLER = -GREATER;
|
||||
|
||||
var re = /(^-?[0-9]+(\.?[0-9]*)[df]?e?[0-9]?$|^0x[0-9a-f]+$|[0-9]+)/gi;
|
||||
var sre = /(^[ ]*|[ ]*$)/g;
|
||||
var dre = /(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/;
|
||||
var hre = /^0x[0-9a-f]+$/i;
|
||||
var ore = /^0/;
|
||||
|
||||
var normalize = function normalize(value) {
|
||||
var string = '' + value;
|
||||
return (options.caseSensitive ?
|
||||
string :
|
||||
string.toLowerCase()
|
||||
);
|
||||
};
|
||||
|
||||
// Normalize values to strings
|
||||
var x = normalize(a).replace(sre, '') || '';
|
||||
var y = normalize(b).replace(sre, '') || '';
|
||||
|
||||
// chunk/tokenize
|
||||
var xN = x.replace(re, '\0$1\0').replace(/\0$/, '').replace(/^\0/, '').split('\0');
|
||||
var yN = y.replace(re, '\0$1\0').replace(/\0$/, '').replace(/^\0/, '').split('\0');
|
||||
|
||||
// Return immediately if at least one of the values is empty.
|
||||
if (!x && !y) return EQUAL;
|
||||
if (!x && y) return GREATER;
|
||||
if (x && !y) return SMALLER;
|
||||
|
||||
// numeric, hex or date detection
|
||||
var xD = parseInt(x.match(hre)) || (xN.length != 1 && x.match(dre) && Date.parse(x));
|
||||
var yD = parseInt(y.match(hre)) || xD && y.match(dre) && Date.parse(y) || null;
|
||||
var oFxNcL, oFyNcL;
|
||||
|
||||
// first try and sort Hex codes or Dates
|
||||
if (yD) {
|
||||
if (xD < yD) return SMALLER;
|
||||
else if (xD > yD) return GREATER;
|
||||
}
|
||||
|
||||
// natural sorting through split numeric strings and default strings
|
||||
for (var cLoc = 0, numS = Math.max(xN.length, yN.length); cLoc < numS; cLoc++) {
|
||||
|
||||
// find floats not starting with '0', string or 0 if not defined (Clint Priest)
|
||||
oFxNcL = !(xN[cLoc] || '').match(ore) && parseFloat(xN[cLoc]) || xN[cLoc] || 0;
|
||||
oFyNcL = !(yN[cLoc] || '').match(ore) && parseFloat(yN[cLoc]) || yN[cLoc] || 0;
|
||||
|
||||
// handle numeric vs string comparison - number < string - (Kyle Adams)
|
||||
if (isNaN(oFxNcL) !== isNaN(oFyNcL)) return (isNaN(oFxNcL)) ? GREATER : SMALLER;
|
||||
|
||||
// rely on string comparison if different types - i.e. '02' < 2 != '02' < '2'
|
||||
else if (typeof oFxNcL !== typeof oFyNcL) {
|
||||
oFxNcL += '';
|
||||
oFyNcL += '';
|
||||
}
|
||||
if (oFxNcL < oFyNcL) return SMALLER;
|
||||
if (oFxNcL > oFyNcL) return GREATER;
|
||||
}
|
||||
return EQUAL;
|
||||
};
|
||||
}
|
||||
// 完整名称排序
|
||||
const sortListByName = (vodList,key,order) => {
|
||||
if(!key){
|
||||
return vodList
|
||||
}
|
||||
order = order||'asc'; // 默认正序
|
||||
// 排序键,顺序,区分大小写
|
||||
return vodList.sort(naturalSort({key: key, order: order,caseSensitive:true}))
|
||||
};
|
||||
|
||||
const getTimeInt = (timeStr) => {
|
||||
return (new Date(timeStr)).getTime();
|
||||
};
|
||||
|
||||
// 时间
|
||||
const sortListByTime = (vodList,key,order) => {
|
||||
if (!key) {
|
||||
return vodList
|
||||
}
|
||||
let ASCarr = vodList.sort((a, b) => {
|
||||
a = a[key];
|
||||
b = b[key];
|
||||
return getTimeInt(a) - getTimeInt(b);
|
||||
});
|
||||
if(order==='desc'){
|
||||
ASCarr.reverse();
|
||||
}
|
||||
return ASCarr
|
||||
};
|
||||
|
||||
// 大小
|
||||
const sortListBySize = (vodList,key,order) => {
|
||||
if (!key) {
|
||||
return vodList
|
||||
}
|
||||
let ASCarr = vodList.sort((a, b) => {
|
||||
a = a[key];
|
||||
b = b[key];
|
||||
return (Number(a) || 0) - (Number(b) || 0);
|
||||
});
|
||||
if(order==='desc'){
|
||||
ASCarr.reverse();
|
||||
}
|
||||
return ASCarr
|
||||
};
|
||||
|
||||
// 导出函数对象
|
||||
export default {
|
||||
init: init,
|
||||
home: home,
|
||||
homeVod: homeVod,
|
||||
category: category,
|
||||
detail: detail,
|
||||
play: play,
|
||||
search: search
|
||||
}
|
1
EXT/LIB/alist.min.js
vendored
Normal file
1
EXT/LIB/alist.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
140
EXT/LIB/atob.js
Normal file
140
EXT/LIB/atob.js
Normal file
@ -0,0 +1,140 @@
|
||||
!function(e) {
|
||||
var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||
var base64DecodeChars = new Array(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);
|
||||
|
||||
function base64encode(str) {
|
||||
var out, i, len;
|
||||
var c1, c2, c3;
|
||||
len = str.length;
|
||||
i = 0;
|
||||
out = "";
|
||||
while (i < len) {
|
||||
c1 = str.charCodeAt(i++) & 0xff;
|
||||
if (i == len) {
|
||||
out += base64EncodeChars.charAt(c1 >> 2);
|
||||
out += base64EncodeChars.charAt((c1 & 0x3) << 4);
|
||||
out += "==";
|
||||
break;
|
||||
}
|
||||
c2 = str.charCodeAt(i++);
|
||||
if (i == len) {
|
||||
out += base64EncodeChars.charAt(c1 >> 2);
|
||||
out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
|
||||
out += base64EncodeChars.charAt((c2 & 0xF) << 2);
|
||||
out += "=";
|
||||
break;
|
||||
}
|
||||
c3 = str.charCodeAt(i++);
|
||||
out += base64EncodeChars.charAt(c1 >> 2);
|
||||
out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
|
||||
out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));
|
||||
out += base64EncodeChars.charAt(c3 & 0x3F);
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
function base64decode(str) {
|
||||
var c1, c2, c3, c4;
|
||||
var i, len, out;
|
||||
len = str.length;
|
||||
i = 0;
|
||||
out = "";
|
||||
while (i < len) {
|
||||
do {
|
||||
c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
|
||||
} while (i < len && c1 == -1);
|
||||
if (c1 == -1) break;
|
||||
do {
|
||||
c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
|
||||
} while (i < len && c2 == -1);
|
||||
if (c2 == -1) break;
|
||||
out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));
|
||||
do {
|
||||
c3 = str.charCodeAt(i++) & 0xff;
|
||||
if (c3 == 61) return out;
|
||||
c3 = base64DecodeChars[c3];
|
||||
} while (i < len && c3 == -1);
|
||||
if (c3 == -1) break;
|
||||
out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2));
|
||||
do {
|
||||
c4 = str.charCodeAt(i++) & 0xff;
|
||||
if (c4 == 61) return out;
|
||||
c4 = base64DecodeChars[c4];
|
||||
} while (i < len && c4 == -1);
|
||||
if (c4 == -1) break;
|
||||
out += String.fromCharCode(((c3 & 0x03) << 6) | c4);
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
function utf16to8(str) {
|
||||
var out, i, len, c;
|
||||
out = "";
|
||||
len = str.length;
|
||||
for (i = 0; i < len; i++) {
|
||||
c = str.charCodeAt(i);
|
||||
if ((c >= 0x0001) && (c <= 0x007F)) {
|
||||
out += str.charAt(i);
|
||||
} else if (c > 0x07FF) {
|
||||
out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
|
||||
out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F));
|
||||
out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
|
||||
} else {
|
||||
out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F));
|
||||
out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
|
||||
}
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
function utf8to16(str) {
|
||||
var out, i, len, c;
|
||||
var char2, char3;
|
||||
out = "";
|
||||
len = str.length;
|
||||
i = 0;
|
||||
while (i < len) {
|
||||
c = str.charCodeAt(i++);
|
||||
switch (c >> 4) {
|
||||
case 0:
|
||||
case 1:
|
||||
case 2:
|
||||
case 3:
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
case 7:
|
||||
out += str.charAt(i - 1);
|
||||
break;
|
||||
case 12:
|
||||
case 13:
|
||||
char2 = str.charCodeAt(i++);
|
||||
out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
|
||||
break;
|
||||
case 14:
|
||||
char2 = str.charCodeAt(i++);
|
||||
char3 = str.charCodeAt(i++);
|
||||
out += String.fromCharCode(((c & 0x0F) << 12) | ((char2 & 0x3F) << 6) | ((char3 & 0x3F) << 0));
|
||||
break;
|
||||
}
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
function CharToHex(str) {
|
||||
var out, i, len, c, h;
|
||||
out = "";
|
||||
len = str.length;
|
||||
i = 0;
|
||||
while (i < len) {
|
||||
c = str.charCodeAt(i++);
|
||||
h = c.toString(16);
|
||||
if (h.length < 2) h = "0" + h;
|
||||
out += "\\x" + h + " ";
|
||||
if (i > 0 && i % 8 == 0) out += "\r\n";
|
||||
}
|
||||
return out;
|
||||
}
|
||||
this.atob = base64decode, this.btoa = base64encode;
|
||||
}(this);
|
||||
|
319
EXT/LIB/base64.js
Normal file
319
EXT/LIB/base64.js
Normal file
@ -0,0 +1,319 @@
|
||||
//
|
||||
// THIS FILE IS AUTOMATICALLY GENERATED! DO NOT EDIT BY HAND!
|
||||
//
|
||||
;
|
||||
(function (global, factory) {
|
||||
typeof exports === 'object' && typeof module !== 'undefined'
|
||||
? module.exports = factory()
|
||||
: typeof define === 'function' && define.amd
|
||||
? define(factory) :
|
||||
// cf. https://github.com/dankogai/js-base64/issues/119
|
||||
(function () {
|
||||
// existing version for noConflict()
|
||||
var _Base64 = global.Base64;
|
||||
var gBase64 = factory();
|
||||
gBase64.noConflict = function () {
|
||||
global.Base64 = _Base64;
|
||||
return gBase64;
|
||||
};
|
||||
if (global.Meteor) { // Meteor.js
|
||||
Base64 = gBase64;
|
||||
}
|
||||
global.Base64 = gBase64;
|
||||
})();
|
||||
}((typeof self !== 'undefined' ? self
|
||||
: typeof window !== 'undefined' ? window
|
||||
: typeof global !== 'undefined' ? global
|
||||
: this), function () {
|
||||
'use strict';
|
||||
/**
|
||||
* base64.ts
|
||||
*
|
||||
* Licensed under the BSD 3-Clause License.
|
||||
* http://opensource.org/licenses/BSD-3-Clause
|
||||
*
|
||||
* References:
|
||||
* http://en.wikipedia.org/wiki/Base64
|
||||
*
|
||||
* @author Dan Kogai (https://github.com/dankogai)
|
||||
*/
|
||||
var version = '3.7.2';
|
||||
/**
|
||||
* @deprecated use lowercase `version`.
|
||||
*/
|
||||
var VERSION = version;
|
||||
var _hasatob = typeof atob === 'function';
|
||||
var _hasbtoa = typeof btoa === 'function';
|
||||
var _hasBuffer = typeof Buffer === 'function';
|
||||
var _TD = typeof TextDecoder === 'function' ? new TextDecoder() : undefined;
|
||||
var _TE = typeof TextEncoder === 'function' ? new TextEncoder() : undefined;
|
||||
var b64ch = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
|
||||
var b64chs = Array.prototype.slice.call(b64ch);
|
||||
var b64tab = (function (a) {
|
||||
var tab = {};
|
||||
a.forEach(function (c, i) { return tab[c] = i; });
|
||||
return tab;
|
||||
})(b64chs);
|
||||
var b64re = /^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/;
|
||||
var _fromCC = String.fromCharCode.bind(String);
|
||||
var _U8Afrom = typeof Uint8Array.from === 'function'
|
||||
? Uint8Array.from.bind(Uint8Array)
|
||||
: function (it, fn) {
|
||||
if (fn === void 0) { fn = function (x) { return x; }; }
|
||||
return new Uint8Array(Array.prototype.slice.call(it, 0).map(fn));
|
||||
};
|
||||
var _mkUriSafe = function (src) { return src
|
||||
.replace(/=/g, '').replace(/[+\/]/g, function (m0) { return m0 == '+' ? '-' : '_'; }); };
|
||||
var _tidyB64 = function (s) { return s.replace(/[^A-Za-z0-9\+\/]/g, ''); };
|
||||
/**
|
||||
* polyfill version of `btoa`
|
||||
*/
|
||||
var btoaPolyfill = function (bin) {
|
||||
// console.log('polyfilled');
|
||||
var u32, c0, c1, c2, asc = '';
|
||||
var pad = bin.length % 3;
|
||||
for (var i = 0; i < bin.length;) {
|
||||
if ((c0 = bin.charCodeAt(i++)) > 255 ||
|
||||
(c1 = bin.charCodeAt(i++)) > 255 ||
|
||||
(c2 = bin.charCodeAt(i++)) > 255)
|
||||
throw new TypeError('invalid character found');
|
||||
u32 = (c0 << 16) | (c1 << 8) | c2;
|
||||
asc += b64chs[u32 >> 18 & 63]
|
||||
+ b64chs[u32 >> 12 & 63]
|
||||
+ b64chs[u32 >> 6 & 63]
|
||||
+ b64chs[u32 & 63];
|
||||
}
|
||||
return pad ? asc.slice(0, pad - 3) + "===".substring(pad) : asc;
|
||||
};
|
||||
/**
|
||||
* does what `window.btoa` of web browsers do.
|
||||
* @param {String} bin binary string
|
||||
* @returns {string} Base64-encoded string
|
||||
*/
|
||||
var _btoa = _hasbtoa ? function (bin) { return btoa(bin); }
|
||||
: _hasBuffer ? function (bin) { return Buffer.from(bin, 'binary').toString('base64'); }
|
||||
: btoaPolyfill;
|
||||
var _fromUint8Array = _hasBuffer
|
||||
? function (u8a) { return Buffer.from(u8a).toString('base64'); }
|
||||
: function (u8a) {
|
||||
// cf. https://stackoverflow.com/questions/12710001/how-to-convert-uint8-array-to-base64-encoded-string/12713326#12713326
|
||||
var maxargs = 0x1000;
|
||||
var strs = [];
|
||||
for (var i = 0, l = u8a.length; i < l; i += maxargs) {
|
||||
strs.push(_fromCC.apply(null, u8a.subarray(i, i + maxargs)));
|
||||
}
|
||||
return _btoa(strs.join(''));
|
||||
};
|
||||
/**
|
||||
* converts a Uint8Array to a Base64 string.
|
||||
* @param {boolean} [urlsafe] URL-and-filename-safe a la RFC4648 §5
|
||||
* @returns {string} Base64 string
|
||||
*/
|
||||
var fromUint8Array = function (u8a, urlsafe) {
|
||||
if (urlsafe === void 0) { urlsafe = false; }
|
||||
return urlsafe ? _mkUriSafe(_fromUint8Array(u8a)) : _fromUint8Array(u8a);
|
||||
};
|
||||
// This trick is found broken https://github.com/dankogai/js-base64/issues/130
|
||||
// const utob = (src: string) => unescape(encodeURIComponent(src));
|
||||
// reverting good old fationed regexp
|
||||
var cb_utob = function (c) {
|
||||
if (c.length < 2) {
|
||||
var cc = c.charCodeAt(0);
|
||||
return cc < 0x80 ? c
|
||||
: cc < 0x800 ? (_fromCC(0xc0 | (cc >>> 6))
|
||||
+ _fromCC(0x80 | (cc & 0x3f)))
|
||||
: (_fromCC(0xe0 | ((cc >>> 12) & 0x0f))
|
||||
+ _fromCC(0x80 | ((cc >>> 6) & 0x3f))
|
||||
+ _fromCC(0x80 | (cc & 0x3f)));
|
||||
}
|
||||
else {
|
||||
var cc = 0x10000
|
||||
+ (c.charCodeAt(0) - 0xD800) * 0x400
|
||||
+ (c.charCodeAt(1) - 0xDC00);
|
||||
return (_fromCC(0xf0 | ((cc >>> 18) & 0x07))
|
||||
+ _fromCC(0x80 | ((cc >>> 12) & 0x3f))
|
||||
+ _fromCC(0x80 | ((cc >>> 6) & 0x3f))
|
||||
+ _fromCC(0x80 | (cc & 0x3f)));
|
||||
}
|
||||
};
|
||||
var re_utob = /[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g;
|
||||
/**
|
||||
* @deprecated should have been internal use only.
|
||||
* @param {string} src UTF-8 string
|
||||
* @returns {string} UTF-16 string
|
||||
*/
|
||||
var utob = function (u) { return u.replace(re_utob, cb_utob); };
|
||||
//
|
||||
var _encode = _hasBuffer
|
||||
? function (s) { return Buffer.from(s, 'utf8').toString('base64'); }
|
||||
: _TE
|
||||
? function (s) { return _fromUint8Array(_TE.encode(s)); }
|
||||
: function (s) { return _btoa(utob(s)); };
|
||||
/**
|
||||
* converts a UTF-8-encoded string to a Base64 string.
|
||||
* @param {boolean} [urlsafe] if `true` make the result URL-safe
|
||||
* @returns {string} Base64 string
|
||||
*/
|
||||
var encode = function (src, urlsafe) {
|
||||
if (urlsafe === void 0) { urlsafe = false; }
|
||||
return urlsafe
|
||||
? _mkUriSafe(_encode(src))
|
||||
: _encode(src);
|
||||
};
|
||||
/**
|
||||
* converts a UTF-8-encoded string to URL-safe Base64 RFC4648 §5.
|
||||
* @returns {string} Base64 string
|
||||
*/
|
||||
var encodeURI = function (src) { return encode(src, true); };
|
||||
// This trick is found broken https://github.com/dankogai/js-base64/issues/130
|
||||
// const btou = (src: string) => decodeURIComponent(escape(src));
|
||||
// reverting good old fationed regexp
|
||||
var re_btou = /[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g;
|
||||
var cb_btou = function (cccc) {
|
||||
switch (cccc.length) {
|
||||
case 4:
|
||||
var cp = ((0x07 & cccc.charCodeAt(0)) << 18)
|
||||
| ((0x3f & cccc.charCodeAt(1)) << 12)
|
||||
| ((0x3f & cccc.charCodeAt(2)) << 6)
|
||||
| (0x3f & cccc.charCodeAt(3)), offset = cp - 0x10000;
|
||||
return (_fromCC((offset >>> 10) + 0xD800)
|
||||
+ _fromCC((offset & 0x3FF) + 0xDC00));
|
||||
case 3:
|
||||
return _fromCC(((0x0f & cccc.charCodeAt(0)) << 12)
|
||||
| ((0x3f & cccc.charCodeAt(1)) << 6)
|
||||
| (0x3f & cccc.charCodeAt(2)));
|
||||
default:
|
||||
return _fromCC(((0x1f & cccc.charCodeAt(0)) << 6)
|
||||
| (0x3f & cccc.charCodeAt(1)));
|
||||
}
|
||||
};
|
||||
/**
|
||||
* @deprecated should have been internal use only.
|
||||
* @param {string} src UTF-16 string
|
||||
* @returns {string} UTF-8 string
|
||||
*/
|
||||
var btou = function (b) { return b.replace(re_btou, cb_btou); };
|
||||
/**
|
||||
* polyfill version of `atob`
|
||||
*/
|
||||
var atobPolyfill = function (asc) {
|
||||
// console.log('polyfilled');
|
||||
asc = asc.replace(/\s+/g, '');
|
||||
if (!b64re.test(asc))
|
||||
throw new TypeError('malformed base64.');
|
||||
asc += '=='.slice(2 - (asc.length & 3));
|
||||
var u24, bin = '', r1, r2;
|
||||
for (var i = 0; i < asc.length;) {
|
||||
u24 = b64tab[asc.charAt(i++)] << 18
|
||||
| b64tab[asc.charAt(i++)] << 12
|
||||
| (r1 = b64tab[asc.charAt(i++)]) << 6
|
||||
| (r2 = b64tab[asc.charAt(i++)]);
|
||||
bin += r1 === 64 ? _fromCC(u24 >> 16 & 255)
|
||||
: r2 === 64 ? _fromCC(u24 >> 16 & 255, u24 >> 8 & 255)
|
||||
: _fromCC(u24 >> 16 & 255, u24 >> 8 & 255, u24 & 255);
|
||||
}
|
||||
return bin;
|
||||
};
|
||||
/**
|
||||
* does what `window.atob` of web browsers do.
|
||||
* @param {String} asc Base64-encoded string
|
||||
* @returns {string} binary string
|
||||
*/
|
||||
var _atob = _hasatob ? function (asc) { return atob(_tidyB64(asc)); }
|
||||
: _hasBuffer ? function (asc) { return Buffer.from(asc, 'base64').toString('binary'); }
|
||||
: atobPolyfill;
|
||||
//
|
||||
var _toUint8Array = _hasBuffer
|
||||
? function (a) { return _U8Afrom(Buffer.from(a, 'base64')); }
|
||||
: function (a) { return _U8Afrom(_atob(a), function (c) { return c.charCodeAt(0); }); };
|
||||
/**
|
||||
* converts a Base64 string to a Uint8Array.
|
||||
*/
|
||||
var toUint8Array = function (a) { return _toUint8Array(_unURI(a)); };
|
||||
//
|
||||
var _decode = _hasBuffer
|
||||
? function (a) { return Buffer.from(a, 'base64').toString('utf8'); }
|
||||
: _TD
|
||||
? function (a) { return _TD.decode(_toUint8Array(a)); }
|
||||
: function (a) { return btou(_atob(a)); };
|
||||
var _unURI = function (a) { return _tidyB64(a.replace(/[-_]/g, function (m0) { return m0 == '-' ? '+' : '/'; })); };
|
||||
/**
|
||||
* converts a Base64 string to a UTF-8 string.
|
||||
* @param {String} src Base64 string. Both normal and URL-safe are supported
|
||||
* @returns {string} UTF-8 string
|
||||
*/
|
||||
var decode = function (src) { return _decode(_unURI(src)); };
|
||||
/**
|
||||
* check if a value is a valid Base64 string
|
||||
* @param {String} src a value to check
|
||||
*/
|
||||
var isValid = function (src) {
|
||||
if (typeof src !== 'string')
|
||||
return false;
|
||||
var s = src.replace(/\s+/g, '').replace(/={0,2}$/, '');
|
||||
return !/[^\s0-9a-zA-Z\+/]/.test(s) || !/[^\s0-9a-zA-Z\-_]/.test(s);
|
||||
};
|
||||
//
|
||||
var _noEnum = function (v) {
|
||||
return {
|
||||
value: v, enumerable: false, writable: true, configurable: true
|
||||
};
|
||||
};
|
||||
/**
|
||||
* extend String.prototype with relevant methods
|
||||
*/
|
||||
var extendString = function () {
|
||||
var _add = function (name, body) { return Object.defineProperty(String.prototype, name, _noEnum(body)); };
|
||||
_add('fromBase64', function () { return decode(this); });
|
||||
_add('toBase64', function (urlsafe) { return encode(this, urlsafe); });
|
||||
_add('toBase64URI', function () { return encode(this, true); });
|
||||
_add('toBase64URL', function () { return encode(this, true); });
|
||||
_add('toUint8Array', function () { return toUint8Array(this); });
|
||||
};
|
||||
/**
|
||||
* extend Uint8Array.prototype with relevant methods
|
||||
*/
|
||||
var extendUint8Array = function () {
|
||||
var _add = function (name, body) { return Object.defineProperty(Uint8Array.prototype, name, _noEnum(body)); };
|
||||
_add('toBase64', function (urlsafe) { return fromUint8Array(this, urlsafe); });
|
||||
_add('toBase64URI', function () { return fromUint8Array(this, true); });
|
||||
_add('toBase64URL', function () { return fromUint8Array(this, true); });
|
||||
};
|
||||
/**
|
||||
* extend Builtin prototypes with relevant methods
|
||||
*/
|
||||
var extendBuiltins = function () {
|
||||
extendString();
|
||||
extendUint8Array();
|
||||
};
|
||||
var gBase64 = {
|
||||
version: version,
|
||||
VERSION: VERSION,
|
||||
atob: _atob,
|
||||
atobPolyfill: atobPolyfill,
|
||||
btoa: _btoa,
|
||||
btoaPolyfill: btoaPolyfill,
|
||||
fromBase64: decode,
|
||||
toBase64: encode,
|
||||
encode: encode,
|
||||
encodeURI: encodeURI,
|
||||
encodeURL: encodeURI,
|
||||
utob: utob,
|
||||
btou: btou,
|
||||
decode: decode,
|
||||
isValid: isValid,
|
||||
fromUint8Array: fromUint8Array,
|
||||
toUint8Array: toUint8Array,
|
||||
extendString: extendString,
|
||||
extendUint8Array: extendUint8Array,
|
||||
extendBuiltins: extendBuiltins
|
||||
};
|
||||
//
|
||||
// export Base64 to the namespace
|
||||
//
|
||||
// ES5 is yet to have Object.assign() that may make transpilers unhappy.
|
||||
// gBase64.Base64 = Object.assign({}, gBase64);
|
||||
gBase64.Base64 = {};
|
||||
Object.keys(gBase64).forEach(function (k) { return gBase64.Base64[k] = gBase64[k]; });
|
||||
return gBase64;
|
||||
}));
|
1
EXT/LIB/base64.min.js
vendored
Normal file
1
EXT/LIB/base64.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
EXT/LIB/cheerio.min.js
vendored
Normal file
1
EXT/LIB/cheerio.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
EXT/LIB/cheerio.min.jsd
Normal file
1
EXT/LIB/cheerio.min.jsd
Normal file
File diff suppressed because one or more lines are too long
6140
EXT/LIB/crypto-hiker.js
Normal file
6140
EXT/LIB/crypto-hiker.js
Normal file
File diff suppressed because it is too large
Load Diff
6191
EXT/LIB/crypto-js.js
Normal file
6191
EXT/LIB/crypto-js.js
Normal file
File diff suppressed because it is too large
Load Diff
189
EXT/LIB/drT.js
Normal file
189
EXT/LIB/drT.js
Normal file
@ -0,0 +1,189 @@
|
||||
// drT.js
|
||||
// 2022/09/30 write by hjdhnx
|
||||
// Licensed under the MIT license.
|
||||
|
||||
(function () {
|
||||
"use strict";
|
||||
|
||||
var drT = {
|
||||
name: "drT",
|
||||
version: "1.0.0",
|
||||
templateSettings: {
|
||||
evaluate: /\{\{([\s\S]+?(\}?)+)\}\}/g,
|
||||
interpolate: /\{\{([\s\S]+?)\}\}/g, // 变量渲染
|
||||
encode: /\{\{@([\s\S]+?)\}\}/g, // 变量自动url编码
|
||||
use: /\{\{#([\s\S]+?)\}\}/g,
|
||||
useParams: /(^|[^\w$])def(?:\.|\[[\'\"])([\w$\.]+)(?:[\'\"]\])?\s*\:\s*([\w$\.]+|\"[^\"]+\"|\'[^\']+\'|\{[^\}]+\})/g,
|
||||
define: /\{\{##\s*([\w\.$]+)\s*(\:|=)([\s\S]+?)#\}\}/g,
|
||||
defineParams:/^\s*([\w$]+):([\s\S]+)/,
|
||||
conditional: /\{\{\?(\?)?\s*([\s\S]*?)\s*\}\}/g, // ? if ?? else if ?? else
|
||||
iterate: /\{\{~\s*(?:\}\}|([\s\S]+?)\s*\:\s*([\w$]+)\s*(?:\:\s*([\w$]+))?\s*\}\})/g,
|
||||
varname: "fl",
|
||||
strip: true,
|
||||
append: true,
|
||||
selfcontained: false,
|
||||
doNotSkipEncoded: false
|
||||
},
|
||||
template: undefined, //fn, compile template
|
||||
compile: undefined, //fn, for express
|
||||
log: true
|
||||
}, _globals;
|
||||
|
||||
drT.encodeHTMLSource = function(doNotSkipEncoded) {
|
||||
var encodeHTMLRules = { "&": "&", "<": "<", ">": ">", '"': """, "'": "'", "/": "/" },
|
||||
matchHTML = doNotSkipEncoded ? /[&<>"'\/]/g : /&(?!#?\w+;)|<|>|"|'|\//g;
|
||||
return function(code) {
|
||||
return code ? code.toString().replace(matchHTML, function(m) {return encodeHTMLRules[m] || m;}) : "";
|
||||
};
|
||||
};
|
||||
|
||||
_globals = (function(){ return this || (0,eval)("this"); }());
|
||||
|
||||
/* istanbul ignore else */
|
||||
if (typeof module !== "undefined" && module.exports) {
|
||||
module.exports = drT;
|
||||
} else if (typeof define === "function" && define.amd) {
|
||||
define(function(){return drT;});
|
||||
} else {
|
||||
_globals.drT = drT;
|
||||
}
|
||||
|
||||
var startend = {
|
||||
append: { start: "'+(", end: ")+'", startencode: "'+encodeHTML(" },
|
||||
split: { start: "';out+=(", end: ");out+='", startencode: "';out+=encodeHTML(" }
|
||||
}, skip = /$^/;
|
||||
|
||||
function resolveDefs(c, block, def) {
|
||||
return ((typeof block === "string") ? block : block.toString())
|
||||
.replace(c.define || skip, function(m, code, assign, value) {
|
||||
if (code.indexOf("def.") === 0) {
|
||||
code = code.substring(4);
|
||||
}
|
||||
if (!(code in def)) {
|
||||
if (assign === ":") {
|
||||
if (c.defineParams) value.replace(c.defineParams, function(m, param, v) {
|
||||
def[code] = {arg: param, text: v};
|
||||
});
|
||||
if (!(code in def)) def[code]= value;
|
||||
} else {
|
||||
new Function("def", "def['"+code+"']=" + value)(def);
|
||||
}
|
||||
}
|
||||
return "";
|
||||
})
|
||||
.replace(c.use || skip, function(m, code) {
|
||||
if (c.useParams) code = code.replace(c.useParams, function(m, s, d, param) {
|
||||
if (def[d] && def[d].arg && param) {
|
||||
var rw = (d+":"+param).replace(/'|\\/g, "_");
|
||||
def.__exp = def.__exp || {};
|
||||
def.__exp[rw] = def[d].text.replace(new RegExp("(^|[^\\w$])" + def[d].arg + "([^\\w$])", "g"), "$1" + param + "$2");
|
||||
return s + "def.__exp['"+rw+"']";
|
||||
}
|
||||
});
|
||||
var v = new Function("def", "return " + code)(def);
|
||||
return v ? resolveDefs(c, v, def) : v;
|
||||
});
|
||||
}
|
||||
|
||||
function unescape(code) {
|
||||
return code.replace(/\\('|\\)/g, "$1").replace(/[\r\t\n]/g, " ");
|
||||
}
|
||||
|
||||
drT.template = function(tmpl, c, def) {
|
||||
c = c || drT.templateSettings;
|
||||
var cse = c.append ? startend.append : startend.split, needhtmlencode, sid = 0, indv,
|
||||
str = (c.use || c.define) ? resolveDefs(c, tmpl, def || {}) : tmpl;
|
||||
|
||||
// console.log(str);
|
||||
let beforeCode = '';
|
||||
if(str.match(c.interpolate || skip)){
|
||||
let inter_codes = str.match(c.interpolate || skip);
|
||||
let inter_dict = {};
|
||||
inter_codes.forEach(item=>{
|
||||
item.replace(c.interpolate || skip,function (m,code) {
|
||||
let varname = code.split('.')[0];
|
||||
if(!inter_dict.hasOwnProperty(varname)){
|
||||
let beginCode = `if(typeof(${varname})==='undefined'){${varname}={}}`;
|
||||
inter_dict[varname] = beginCode;
|
||||
}if(!inter_dict.hasOwnProperty(code)){
|
||||
let beginCode = `if(typeof(${code})==='undefined'){${code}=''};`;
|
||||
inter_dict[code] = beginCode;
|
||||
}
|
||||
});
|
||||
});
|
||||
let beginCode = Object.values(inter_dict).join('\n');
|
||||
// console.log(beginCode);
|
||||
beforeCode += beginCode;
|
||||
}
|
||||
str = beforeCode+("var out='" + (c.strip ? str.replace(/(^|\r|\n)\t* +| +\t*(\r|\n|$)/g," ")
|
||||
.replace(/\r|\n|\t|\/\*[\s\S]*?\*\//g,""): str)
|
||||
.replace(/'|\\/g, "\\$&")
|
||||
.replace(c.encode || skip, function(m, code) {
|
||||
needhtmlencode = true;
|
||||
return cse.startencode + unescape(code) + cse.end;
|
||||
})
|
||||
.replace(c.interpolate || skip, function(m, code) {
|
||||
let varname = code.split('.')[0];
|
||||
// console.log(varname === code);
|
||||
// console.log(`varname:${varname},code:${code}`);
|
||||
if(varname === code){
|
||||
let res = cse.start + `JSON.stringify(${unescape(code)})` + cse.end;
|
||||
// console.log(res);
|
||||
return res
|
||||
}
|
||||
return cse.start + unescape(code) + cse.end;
|
||||
})
|
||||
.replace(c.conditional || skip, function(m, elsecase, code) {
|
||||
return elsecase ?
|
||||
(code ? "';}else if(" + unescape(code) + "){out+='" : "';}else{out+='") :
|
||||
(code ? "';if(" + unescape(code) + "){out+='" : "';}out+='");
|
||||
})
|
||||
.replace(c.iterate || skip, function(m, iterate, vname, iname) {
|
||||
if (!iterate) return "';} } out+='";
|
||||
sid+=1; indv=iname || "i"+sid; iterate=unescape(iterate);
|
||||
return "';var arr"+sid+"="+iterate+";if(arr"+sid+"){var "+vname+","+indv+"=-1,l"+sid+"=arr"+sid+".length-1;while("+indv+"<l"+sid+"){"
|
||||
+vname+"=arr"+sid+"["+indv+"+=1];out+='";
|
||||
})
|
||||
.replace(c.evaluate || skip, function(m, code) {
|
||||
return "';" + unescape(code) + "out+='";
|
||||
})
|
||||
+ "';return out;")
|
||||
.replace(/\n/g, "\\n").replace(/\t/g, '\\t').replace(/\r/g, "\\r")
|
||||
.replace(/(\s|;|\}|^|\{)out\+='';/g, '$1').replace(/\+''/g, "");
|
||||
//.replace(/(\s|;|\}|^|\{)out\+=''\+/g,'$1out+=');
|
||||
|
||||
if (needhtmlencode) {
|
||||
// console.log('需要编码');
|
||||
// console.log(c.doNotSkipEncoded);
|
||||
if (!c.selfcontained && _globals && !_globals._encodeHTML) _globals._encodeHTML = drT.encodeHTMLSource(c.doNotSkipEncoded);
|
||||
str = "var encodeHTML = typeof _encodeHTML !== 'undefined' ? _encodeHTML : ("
|
||||
+ drT.encodeHTMLSource.toString() + "(" + (c.doNotSkipEncoded || '') + "));"
|
||||
+ str;
|
||||
// console.log(str);
|
||||
}else{
|
||||
// console.log('不需要编码');
|
||||
}
|
||||
// console.log(c.varname);
|
||||
// console.log(str);
|
||||
try {
|
||||
return new Function(c.varname, str);
|
||||
} catch (e) {
|
||||
/* istanbul ignore else */
|
||||
// console.log(e.message);
|
||||
if (typeof console !== "undefined") console.log("Could not create a template function: " + str);
|
||||
throw e;
|
||||
}
|
||||
};
|
||||
|
||||
drT.compile = function(tmpl, def) {
|
||||
return drT.template(tmpl, null, def);
|
||||
};
|
||||
drT.renderText = function (tmpl,dict,varname){
|
||||
varname = varname||'';
|
||||
if(varname){
|
||||
drT.templateSettings.varname = varname;
|
||||
}
|
||||
dict = dict||{};
|
||||
return drT.compile(tmpl)(dict);
|
||||
};
|
||||
}());
|
1447
EXT/LIB/drpy-ym.js
Normal file
1447
EXT/LIB/drpy-ym.js
Normal file
File diff suppressed because it is too large
Load Diff
2356
EXT/LIB/drpy.js
Normal file
2356
EXT/LIB/drpy.js
Normal file
File diff suppressed because it is too large
Load Diff
1
EXT/LIB/drpy.min.js
vendored
Normal file
1
EXT/LIB/drpy.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
4
EXT/LIB/drpy.ym.js
Normal file
4
EXT/LIB/drpy.ym.js
Normal file
@ -0,0 +1,4 @@
|
||||
import './util.ym.js'
|
||||
import dr from './drpy.min.js'
|
||||
|
||||
__JS_SPIDER__ = dr.DRPY()
|
2096
EXT/LIB/drpy2-2838.js
Normal file
2096
EXT/LIB/drpy2-2838.js
Normal file
File diff suppressed because it is too large
Load Diff
2224
EXT/LIB/drpy2.js
Normal file
2224
EXT/LIB/drpy2.js
Normal file
File diff suppressed because it is too large
Load Diff
1
EXT/LIB/drpy2.min.js
vendored
Normal file
1
EXT/LIB/drpy2.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
256
EXT/LIB/es6py.js
Normal file
256
EXT/LIB/es6py.js
Normal file
@ -0,0 +1,256 @@
|
||||
if (typeof Object.assign != 'function') {
|
||||
Object.assign = function () {
|
||||
var target = arguments[0];
|
||||
for (var i = 1; i < arguments.length; i++) {
|
||||
var source = arguments[i];
|
||||
for (var key in source) {
|
||||
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
||||
target[key] = source[key];
|
||||
}
|
||||
}
|
||||
}
|
||||
return target;
|
||||
};
|
||||
}
|
||||
if (!String.prototype.includes) {
|
||||
String.prototype.includes = function (search, start) {
|
||||
if (typeof start !== 'number') {
|
||||
start = 0;
|
||||
}
|
||||
|
||||
if (start + search.length > this.length) {
|
||||
return false;
|
||||
} else {
|
||||
return this.indexOf(search, start) !== -1;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
if (!Array.prototype.includes) {
|
||||
Object.defineProperty(Array.prototype, 'includes', {
|
||||
value: function (searchElement, fromIndex) {
|
||||
|
||||
if (this == null) {//this是空或者未定义,抛出错误
|
||||
throw new TypeError('"this" is null or not defined');
|
||||
}
|
||||
|
||||
var o = Object(this);//将this转变成对象
|
||||
var len = o.length >>> 0;//无符号右移0位,获取对象length属性,如果未定义就会变成0
|
||||
|
||||
if (len === 0) {//length为0直接返回false未找到目标值
|
||||
return false;
|
||||
}
|
||||
|
||||
var n = fromIndex | 0;//查找起始索引
|
||||
var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);//计算正确起始索引,因为有可能是负值
|
||||
|
||||
while (k < len) {//从起始索引处开始循环
|
||||
if (o[k] === searchElement) {//如果某一位置与寻找目标相等,返回true,找到了
|
||||
return true;
|
||||
}
|
||||
k++;
|
||||
}
|
||||
return false;//未找到,返回false
|
||||
}
|
||||
});
|
||||
}
|
||||
if (typeof String.prototype.startsWith != 'function') {
|
||||
String.prototype.startsWith = function (prefix){
|
||||
return this.slice(0, prefix.length) === prefix;
|
||||
};
|
||||
}
|
||||
if (typeof String.prototype.endsWith != 'function') {
|
||||
String.prototype.endsWith = function(suffix) {
|
||||
return this.indexOf(suffix, this.length - suffix.length) !== -1;
|
||||
};
|
||||
}
|
||||
Object.prototype.myValues=function(obj){
|
||||
if(obj ==null) {
|
||||
throw new TypeError("Cannot convert undefined or null to object");
|
||||
}
|
||||
var res=[]
|
||||
for(var k in obj){
|
||||
if(obj.hasOwnProperty(k)){//需判断是否是本身的属性
|
||||
res.push(obj[k]);
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
if (typeof Object.prototype.values != 'function') {
|
||||
Object.prototype.values=function(obj){
|
||||
if(obj ==null) {
|
||||
throw new TypeError("Cannot convert undefined or null to object");
|
||||
}
|
||||
var res=[]
|
||||
for(var k in obj){
|
||||
if(obj.hasOwnProperty(k)){//需判断是否是本身的属性
|
||||
res.push(obj[k]);
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
}
|
||||
if (typeof Array.prototype.join != 'function') {
|
||||
Array.prototype.join = function (emoji) {
|
||||
// emoji = emoji||',';
|
||||
emoji = emoji||'';
|
||||
let self = this;
|
||||
let str = "";
|
||||
let i = 0;
|
||||
if (!Array.isArray(self)) {throw String(self)+'is not Array'}
|
||||
if(self.length===0){return ''}
|
||||
if (self.length === 1){return String(self[0])}
|
||||
i = 1;
|
||||
str = this[0];
|
||||
for (; i < self.length; i++) {
|
||||
str += String(emoji)+String(self[i]);
|
||||
}
|
||||
return str;
|
||||
};
|
||||
}
|
||||
|
||||
String.prototype.rstrip = function (chars) {
|
||||
let regex = new RegExp(chars + "$");
|
||||
return this.replace(regex, "");
|
||||
};
|
||||
|
||||
Array.prototype.append = Array.prototype.push;
|
||||
String.prototype.strip = String.prototype.trim;
|
||||
function 是否正版(vipUrl){
|
||||
let flag = new RegExp('qq\.com|iqiyi\.com|youku\.com|mgtv\.com|bilibili\.com|sohu\.com|ixigua\.com|pptv\.com|miguvideo\.com|le\.com|1905\.com|fun\.tv');
|
||||
return flag.test(vipUrl);
|
||||
}
|
||||
function urlDeal(vipUrl){
|
||||
if(!vipUrl){
|
||||
return ''
|
||||
}
|
||||
if(!是否正版(vipUrl)){
|
||||
return vipUrl
|
||||
}
|
||||
if(!/miguvideo/.test(vipUrl)){
|
||||
vipUrl=vipUrl.split('#')[0].split('?')[0];
|
||||
}
|
||||
return vipUrl
|
||||
}
|
||||
function setResult(d){
|
||||
if(!Array.isArray(d)){
|
||||
return []
|
||||
}
|
||||
VODS = [];
|
||||
// console.log(JSON.stringify(d));
|
||||
d.forEach(function (it){
|
||||
let obj = {
|
||||
vod_id:it.url||'',
|
||||
vod_name: it.title||'',
|
||||
vod_remarks: it.desc||'',
|
||||
vod_content: it.content||'',
|
||||
vod_pic: it.pic_url||it.img||'',
|
||||
};
|
||||
let keys = Object.keys(it);
|
||||
if(keys.includes('tname')){
|
||||
obj.type_name = it.tname||'';
|
||||
}
|
||||
if(keys.includes('tid')){
|
||||
obj.type_id = it.tid||'';
|
||||
}
|
||||
if(keys.includes('year')){
|
||||
obj.vod_year = it.year||'';
|
||||
}
|
||||
if(keys.includes('actor')){
|
||||
obj.vod_actor = it.actor||'';
|
||||
}
|
||||
if(keys.includes('director')){
|
||||
obj.vod_director = it.director||'';
|
||||
}
|
||||
if(keys.includes('area')){
|
||||
obj.vod_area = it.area||'';
|
||||
}
|
||||
VODS.push(obj);
|
||||
});
|
||||
return VODS
|
||||
}
|
||||
function setResult2(res){
|
||||
VODS = res.list||[];
|
||||
return VODS
|
||||
}
|
||||
function setHomeResult(res){
|
||||
if(!res||typeof(res)!=='object'){
|
||||
return []
|
||||
}
|
||||
return setResult(res.list);
|
||||
}
|
||||
// 千万不要用for in 推荐 forEach (for in 会打乱顺序)
|
||||
//猫函数
|
||||
function maoss(jxurl, ref, key) {
|
||||
eval(getCryptoJS());
|
||||
try {
|
||||
var getVideoInfo = function (text) {
|
||||
return CryptoJS.AES.decrypt(text, key, {iv: iv, padding: CryptoJS.pad.Pkcs7}).toString(CryptoJS.enc.Utf8);
|
||||
};
|
||||
var token_key = key == undefined ? 'dvyYRQlnPRCMdQSe' : key;
|
||||
if (ref) {
|
||||
var html = request(jxurl, {
|
||||
headers: {
|
||||
'Referer': ref
|
||||
}
|
||||
});
|
||||
} else {
|
||||
var html = request(jxurl);
|
||||
}
|
||||
// print(html);
|
||||
if (html.indexOf('&btwaf=') != -1) {
|
||||
html = request(jxurl + '&btwaf' + html.match(/&btwaf(.*?)"/)[1], {
|
||||
headers: {
|
||||
'Referer': ref
|
||||
}
|
||||
})
|
||||
}
|
||||
var token_iv = html.split('_token = "')[1].split('"')[0];
|
||||
var key = CryptoJS.enc.Utf8.parse(token_key);
|
||||
var iv = CryptoJS.enc.Utf8.parse(token_iv);
|
||||
// log("iv:"+iv);
|
||||
// log(html);
|
||||
// print(key);
|
||||
// print(iv);
|
||||
eval(html.match(/var config = {[\s\S]*?}/)[0] + '');
|
||||
// config.url = config.url.replace(/,/g,'');
|
||||
// print(config.url);
|
||||
if (!config.url.startsWith('http')) {
|
||||
//config.url = decodeURIComponent(AES(config.url, key, iv));
|
||||
config.url = CryptoJS.AES.decrypt(config.url, key, {
|
||||
iv: iv,
|
||||
padding: CryptoJS.pad.Pkcs7
|
||||
}).toString(CryptoJS.enc.Utf8)
|
||||
}
|
||||
return config.url;
|
||||
} catch (e) {
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
function urlencode (str) {
|
||||
str = (str + '').toString();
|
||||
return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').
|
||||
replace(/\)/g, '%29').replace(/\*/g, '%2A').replace(/%20/g, '+');
|
||||
}
|
||||
globalThis.VODS = [];// 一级或者搜索需要的数据列表
|
||||
globalThis.VOD = {};// 二级的单个数据
|
||||
globalThis.encodeUrl = urlencode;
|
||||
globalThis.urlencode = urlencode;
|
||||
globalThis.是否正版 = 是否正版;
|
||||
globalThis.urlDeal = urlDeal;
|
||||
globalThis.setResult = setResult;
|
||||
globalThis.setResult2 = setResult2;
|
||||
globalThis.setHomeResult = setHomeResult;
|
||||
globalThis.maoss = maoss;
|
||||
// globalThis.urljoin2 = joinUrl;
|
||||
|
||||
// export default {
|
||||
// 是否正版:是否正版,
|
||||
// urlDeal:urlDeal,
|
||||
// setResult:setResult,
|
||||
// setResult2:setResult2,
|
||||
// setHomeResult:setHomeResult,
|
||||
// maoss:maoss,
|
||||
// urlencode:urlencode
|
||||
// }
|
440
EXT/LIB/exRegExp.js
Normal file
440
EXT/LIB/exRegExp.js
Normal file
@ -0,0 +1,440 @@
|
||||
/**
|
||||
* 字符串分段处理
|
||||
* @param {String} code 处理字符串
|
||||
* @param {Array} options 分段数组
|
||||
* @param {Array<Function|Boolean>} maps 分段映射函数
|
||||
* @param {Boolean} all 是否完全映射
|
||||
* @returns {Array} 映射结果
|
||||
*/
|
||||
function tsCode(code, options, maps, all) {
|
||||
let start = 0, res = [];
|
||||
if (maps) {
|
||||
if (typeof maps === 'function') {
|
||||
options.forEach((part, index) => {
|
||||
res.push(maps(code.slice(start, part + start)));
|
||||
start += part;
|
||||
});
|
||||
} else {
|
||||
options.forEach((part, index) => {
|
||||
if (typeof maps[index] === 'function') {
|
||||
res.push(maps[index](code.slice(start, part + start)));
|
||||
} else if (maps[index] !== undefined) {
|
||||
if (maps[index] === true) res.push(code.slice(start, part + start));
|
||||
else res.push(maps[index]);
|
||||
} else if (all) res.push(code.slice(start, part + start));
|
||||
start += part;
|
||||
});
|
||||
};
|
||||
return res
|
||||
} else {
|
||||
options.forEach(part => {
|
||||
res.push(code.slice(start, part + start));
|
||||
start += part;
|
||||
});
|
||||
return res
|
||||
}
|
||||
}
|
||||
|
||||
function range(end, start = 0, reverse) {
|
||||
if (reverse) {
|
||||
const arr = [];
|
||||
for (let i = end; i >= start; i--) {
|
||||
arr.push(i);
|
||||
};
|
||||
return arr;
|
||||
} else {
|
||||
const arr = [];
|
||||
for (let i = start; i <= end; i++) {
|
||||
arr.push(i);
|
||||
};
|
||||
return arr;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 正则函数调用及函数结果插入递归替换
|
||||
* [[mark=func:regExp]] //正则函数调用(标记与函数不同名)
|
||||
* [[func:regExp]] //正则函数调用(标记与函数同名)
|
||||
* [[mark|func]] //按标记插入结果
|
||||
* @param {RegExp} reg
|
||||
*/
|
||||
function splitRegExp({ oldRes, source, flags, split, res, fns, str, old, lastIndex, oldReg, oldLeft, oldRight, inner, oldSource }) {
|
||||
function next() {//回溯处理
|
||||
const oldData = old[old.length - 1];
|
||||
if (oldData) {
|
||||
const lefts = res[oldData.oldLeft];
|
||||
if (Array.isArray(lefts)) {
|
||||
return splitRegExp({ oldRes, flags, split, fns, str, old, ...oldData });
|
||||
} else {
|
||||
return splitRegExp({ oldRes, flags, split, fns, str, old, ...old.pop() });
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
if (oldReg) {//回溯处理
|
||||
let oldNum, leftRes;
|
||||
if (Array.isArray(res[oldLeft])) {
|
||||
res[oldLeft].shift();
|
||||
leftRes = oldRes[oldLeft] = res[oldLeft][0];
|
||||
if (res[oldLeft].reg[0]) {
|
||||
res[oldLeft].reg.shift();
|
||||
inner = res[oldLeft].reg[0];
|
||||
};
|
||||
if (leftRes.length === 1) {
|
||||
oldNum = 0;
|
||||
}
|
||||
} else {
|
||||
oldNum = 1;
|
||||
}
|
||||
|
||||
let reg = inner ? (
|
||||
source = tsCode(oldSource, [lastIndex, res[oldLeft].len, Infinity], {
|
||||
1: `(?:${inner})` //从结果池中以标记为键读取插入到原始正则之中
|
||||
}, true).join(''),
|
||||
new RegExp(inner, flags)
|
||||
) : oldReg,
|
||||
mats = reg.exec(str);
|
||||
|
||||
switch (oldNum) {
|
||||
case 0:
|
||||
old[old.length - 1] = { lastIndex, oldSource, source, oldReg: reg, oldLeft, oldRight, res: { ...res, [oldLeft]: leftRes }, inner };
|
||||
break;
|
||||
case 1:
|
||||
res[oldLeft] = fns[oldRight](mats, reg);
|
||||
old.push({ lastIndex, oldSource, source, oldReg: reg, oldLeft, oldRight, res: { ...res } });
|
||||
break;
|
||||
};
|
||||
|
||||
return splitRegExp({ oldRes, source, flags, split, res, fns, str, old });
|
||||
|
||||
} else {
|
||||
const mat = split.exec(source);//匹配函数调用点或函数结果插入点
|
||||
if (mat) {
|
||||
let lastIndex = mat.index, so = mat[1], index = so.indexOf(':');
|
||||
if (index !== -1) {//函数调用点
|
||||
let [first, last] = tsCode(so, [index, 1, Infinity], {
|
||||
0: true,
|
||||
2: true
|
||||
}),
|
||||
reg = new RegExp(last, flags),
|
||||
mats = reg.exec(str);
|
||||
if (mats) {//匹配成功递归处理
|
||||
const index2 = first.indexOf('='),
|
||||
[left, right] = index2 === -1 ? [first, first] : tsCode(first, [index2, 1, Infinity], {
|
||||
0: true,
|
||||
2: true
|
||||
}), fnRes = fns[right](mats, reg);
|
||||
res[left] = fnRes;
|
||||
if (Array.isArray(fnRes)) {
|
||||
fnRes.len = mat[0].length;
|
||||
if (fnRes.reg[0]) last = fnRes.reg[0];
|
||||
oldRes[left] = fnRes[0];
|
||||
};
|
||||
const oldSource = source;
|
||||
source = tsCode(source, [lastIndex, mat[0].length, Infinity], {
|
||||
1: `(?:${last})` //从结果池中以标记为键读取插入到原始正则之中
|
||||
}, true).join('');
|
||||
old.push({ lastIndex, oldSource, source, oldReg: reg, oldLeft: left, oldRight: right, res: { ...res } });
|
||||
return splitRegExp({ oldRes, source, flags, split, res, fns, str, old });
|
||||
} else return next();
|
||||
} else {//函数结果插入点
|
||||
const [lenStr, name] = mat;
|
||||
let inner;
|
||||
if (res[name] === undefined) {
|
||||
try {
|
||||
inner = fns[name]();
|
||||
if (inner === undefined) return next();
|
||||
} catch (e) {
|
||||
return //函数中主动抛出错误,触发匹配失败返回
|
||||
}
|
||||
} else if (Array.isArray(res[name])) {
|
||||
inner = oldRes[name];
|
||||
} else {
|
||||
inner = res[name]
|
||||
};
|
||||
source = tsCode(source, [lastIndex, lenStr.length, Infinity], {
|
||||
1: inner //从结果池中以标记为键读取插入到原始正则之中
|
||||
}, true).join('');
|
||||
return splitRegExp({ oldRes, source, flags, split, res, fns, str, old });
|
||||
}
|
||||
} else {
|
||||
return { source, next }
|
||||
};
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* 增强正则工具对象生成
|
||||
* @param {RegExp} reg 增强型原始正则
|
||||
* @param {Function} fns 插入正则的函数集
|
||||
* @param {String|Function} str 待匹配字符串,或生成下一个正则时回调执行函数
|
||||
* @param {Function} next 生成下一个正则时回调执行函数
|
||||
* @returns {{regExp:RegExp,next:Function,exec:Function,test:Function,match:Function,matchAll:Function,replace:Function,search:Function,split:Function}} 正则工具对象
|
||||
*/
|
||||
function exRegExp({ reg, fns, str, next }) {
|
||||
const oldSplit = /\[\[(.*?[^\\])\]\]/g;
|
||||
let regExp, notFirst, source, flags, newFlags, nextCall, res = {}, oldRes = {}, old = [];
|
||||
if (reg) {
|
||||
source = reg.source.replace(/\\\[(?=\[)/g, '(?:\\[)');
|
||||
if (!(newFlags = reg.flags.replace('y', 'g')).includes('g')) {
|
||||
newFlags += 'g';
|
||||
};
|
||||
if (str) regExp = returnRegExp(oldRes, source, oldSplit, newFlags, fns, str, res, old);
|
||||
};
|
||||
|
||||
function matRegExp(mat) {
|
||||
if (mat) {
|
||||
const { source, next: callback } = mat,
|
||||
regExp = new RegExp(source, flags);
|
||||
if (next) {
|
||||
nextCall = () => {
|
||||
const genReg = matRegExp(callback());
|
||||
next(genReg);
|
||||
return genReg;
|
||||
};
|
||||
} else {
|
||||
nextCall = () => matRegExp(callback());
|
||||
}
|
||||
return regExp;
|
||||
} else {
|
||||
//正则表达式出错
|
||||
throw { reg, flags, fns, str }
|
||||
};
|
||||
};
|
||||
function returnRegExp(oldRes, source, split, newFlags, fns, str, res, old, inner) {
|
||||
return matRegExp(splitRegExp({
|
||||
source,
|
||||
split,
|
||||
flags: newFlags,
|
||||
fns,
|
||||
str,
|
||||
res,
|
||||
old,
|
||||
inner,
|
||||
oldRes
|
||||
}));
|
||||
};
|
||||
|
||||
function preExec() {
|
||||
if (notFirst) {
|
||||
try {
|
||||
regExp = nextCall();
|
||||
} catch (e) {
|
||||
return true
|
||||
};
|
||||
} else {
|
||||
notFirst = true;
|
||||
}
|
||||
};
|
||||
function exec() {
|
||||
if (preExec()) return null;
|
||||
const exec = regExp.exec(str);
|
||||
if (exec) {
|
||||
return exec
|
||||
} else {
|
||||
try {
|
||||
regExp = nextCall();
|
||||
return exec();
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
return null
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function test() {
|
||||
const testRes = regExp.test(str);
|
||||
if (testRes) {
|
||||
return true
|
||||
} else {
|
||||
try {
|
||||
regExp = nextCall();
|
||||
return test();
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
return false
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function match() {
|
||||
const matchRes = str.match(regExp);
|
||||
if (matchRes) {
|
||||
return matchRes
|
||||
} else {
|
||||
try {
|
||||
regExp = nextCall();
|
||||
return match();
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
return null
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function matchAll() {
|
||||
const matchAllRes = str.matchAll(regExp);
|
||||
if (matchAllRes) {
|
||||
return matchAllRes
|
||||
} else {
|
||||
try {
|
||||
regExp = nextCall();
|
||||
return matchAll();
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
return null
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function replace(callback, change) {
|
||||
const replaceRes = str.replace(regExp, callback);
|
||||
if (change) {
|
||||
if (replaceRes !== str) {
|
||||
return replaceRes
|
||||
} else {
|
||||
try {
|
||||
regExp = nextCall();
|
||||
return replace(str);
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
return str
|
||||
}
|
||||
};
|
||||
} else {
|
||||
return replaceRes
|
||||
};
|
||||
};
|
||||
|
||||
function search() {
|
||||
const searchRes = str.search(regExp);
|
||||
if (searchRes !== -1) {
|
||||
return searchRes
|
||||
} else {
|
||||
try {
|
||||
regExp = nextCall();
|
||||
return search(str);
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
return -1
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
function split(limit, change) {
|
||||
const splitRes = str.split(regExp, limit);
|
||||
if (change) {
|
||||
if (splitRes.length !== 1) {
|
||||
return splitRes
|
||||
} else {
|
||||
try {
|
||||
regExp = nextCall();
|
||||
return split(str);
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
return [str]
|
||||
}
|
||||
};
|
||||
} else {
|
||||
return splitRes
|
||||
};
|
||||
};
|
||||
|
||||
return {
|
||||
//当前生成的正则
|
||||
get regExp() { return regExp },
|
||||
set regExp(nv) {
|
||||
reg = nv;
|
||||
notFirst = false;
|
||||
res = {};
|
||||
oldRes = {};
|
||||
old = [];
|
||||
flags = reg.flags;
|
||||
nextCall = undefined;
|
||||
source = reg.source.replace(/\\\[(?=\[)/g, '(?:\\[)');
|
||||
if (!(newFlags = flags.replace('y', 'g')).includes('g')) {
|
||||
newFlags += 'g';
|
||||
};
|
||||
if (str) regExp = returnRegExp(oldRes, source, oldSplit, newFlags, fns, str, res, old);
|
||||
},
|
||||
//当前匹配的字符串
|
||||
get str() {
|
||||
return str
|
||||
},
|
||||
set str(newStr) {
|
||||
str = newStr;
|
||||
notFirst = false;
|
||||
res = {};
|
||||
oldRes = {};
|
||||
old = [];
|
||||
nextCall = undefined;
|
||||
if (reg) regExp = returnRegExp(oldRes, source, oldSplit, newFlags, fns, str, res, old);
|
||||
},
|
||||
next() {//生成下一个有效正则,全部无效时报错
|
||||
return nextCall()
|
||||
},
|
||||
|
||||
exec, /**
|
||||
exec() => regExp.exec(str)
|
||||
无需主动执行next,当上个正则耗尽后,再调用exec则主动生成下一个有效正则
|
||||
*/
|
||||
|
||||
test,/**
|
||||
test() => regExp.test(str)
|
||||
匹配失败时主动执行next生成下一个有效正则
|
||||
可主动执行next,主动生成下一个有效正则作为匹配正则
|
||||
*/
|
||||
|
||||
match,/**
|
||||
* match() => str.match(regExp)
|
||||
匹配失败时主动执行next生成下一个有效正则
|
||||
可主动执行next,主动生成下一个有效正则作为匹配正则
|
||||
*/
|
||||
|
||||
matchAll, /**
|
||||
matchAll() => str.matchAll(regExp)
|
||||
匹配失败时主动执行next生成下一个有效正则
|
||||
可主动执行next,主动生成下一个有效正则作为匹配正则
|
||||
*/
|
||||
|
||||
replace, /**
|
||||
//replace(callback, change) => str.replace(regExp,callback);
|
||||
change为true时,如果替换后的值与替换前一样,则自动调用next生成下一个有效正则继续执行replace(callback, change)
|
||||
change为false时,只要生成的正则有效则只执行一次replace
|
||||
可主动执行next,主动生成下一个有效正则作为匹配正则
|
||||
*/
|
||||
|
||||
search, /**
|
||||
search() => str.search(regExp)
|
||||
匹配失败时主动执行next生成下一个有效正则
|
||||
可主动执行next,主动生成下一个有效正则作为匹配正则
|
||||
*/
|
||||
|
||||
split /**
|
||||
split(limit, change) => str.split(regExp,limit)
|
||||
change为true时,如果切割后数组长度为1,则自动调用next生成下一个有效正则继续执行split(limit, change)
|
||||
change为false时,只要生成的正则有效则只执行一次split
|
||||
可主动执行next,主动生成下一个有效正则作为匹配正则
|
||||
*/
|
||||
}
|
||||
};
|
||||
|
||||
//示例
|
||||
const obj = exRegExp({
|
||||
reg: /ersd[[reg:(ka)+]].*ef(fa){[[reg]]}.*sas/g,
|
||||
fns: {
|
||||
reg([$0, $1]) {
|
||||
const range0 = range($0.length / $1.length, 1, true);
|
||||
range0.reg = range0.map(it => new Array(it).fill($1).join(''));
|
||||
return range0
|
||||
}
|
||||
},
|
||||
str: 'bvgvgersdkakakaeffafaeffafafasaskuyfu'
|
||||
});
|
||||
|
||||
console.log('match:', obj.match()); //match1: ['ersdkakakaeffafaeffafafasas', 'fa', index: 5, input: 'bvgvgersdkakakaeffafaeffafafasaskuyfu', groups: undefined]
|
||||
|
||||
obj.regExp = /[[reg:(ka)+]]ef(fa){[[reg]]}/g;
|
||||
|
||||
console.log('match2:', obj.match()); //match2: ['kakaeffafa']
|
68
EXT/LIB/gbk.js
Normal file
68
EXT/LIB/gbk.js
Normal file
File diff suppressed because one or more lines are too long
205
EXT/LIB/gbk2.js
Normal file
205
EXT/LIB/gbk2.js
Normal file
File diff suppressed because one or more lines are too long
263
EXT/LIB/jsencrypt.js
Normal file
263
EXT/LIB/jsencrypt.js
Normal file
File diff suppressed because one or more lines are too long
534
EXT/LIB/live2cms.js
Normal file
534
EXT/LIB/live2cms.js
Normal file
@ -0,0 +1,534 @@
|
||||
/**
|
||||
* live2cms.js
|
||||
* 配置设置 {"key":"Live2CMS","name":"直播转点播V2","type":3,"api":"{{host}}/libs/live2cms.js","searchable":2,"quickSearch":0,"filterable":0,"ext":"{{host}}/txt/json/live2mv_data.json"}
|
||||
* live2mv_data.json
|
||||
* 支持m3u类直播,支持线路归并。支持筛选切换显示模式
|
||||
[
|
||||
{"name": "甜蜜", "url": "http://zdir.kebedd69.repl.co/public/live.txt"},
|
||||
{"name": "俊于", "url": "http://home.jundie.top:81/Cat/tv/live.txt"},
|
||||
{"name": "菜妮丝", "url": "http://xn--ihqu10cn4c.xn--z7x900a.love:63/TV/tvzb.txt"},
|
||||
{"name": "布里m3u", "url": "http://jiexi.bulisite.top/m3u.php"},
|
||||
{"name": "吾爱", "url": "http://52bsj.vip:81/api/v3/file/get/763/live.txt?sign=87BTGT1_6AOry7FPwy_uuxFTv2Wcb9aDMj46rDdRTD8%3D%3A0"},
|
||||
{"name": "饭太硬", "url": "http://ftyyy.tk/live.txt"}
|
||||
]
|
||||
|
||||
* 提示 ext文件格式为json列表,name,url参数
|
||||
* 取消加密,减少性能问题
|
||||
*/
|
||||
String.prototype.rstrip = function (chars) {
|
||||
let regex = new RegExp(chars + "$");
|
||||
return this.replace(regex, "");
|
||||
};
|
||||
const request_timeout = 5000;
|
||||
const RKEY = 'live2cms'; // 源的唯一标识
|
||||
const VERSION = 'live2cms 20230619';
|
||||
const UA = 'Mozilla/5.0'; //默认请求ua
|
||||
const __ext = {data_dict:{}};
|
||||
const tips = `\n道长直播转点播js-当前版本${VERSION}`;
|
||||
const def_pic = 'https://avatars.githubusercontent.com/u/97389433?s=120&v=4';
|
||||
|
||||
/**
|
||||
* 存在数据库配置表里, key字段对应值value,没有就新增,有就更新,调用此方法会清除key对应的内存缓存
|
||||
* @param k 键
|
||||
* @param v 值
|
||||
*/
|
||||
function setItem(k,v){
|
||||
local.set(RKEY,k,v);
|
||||
console.log(`规则${RKEY}设置${k} => ${v}`)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取数据库配置表对应的key字段的value,没有这个key就返回value默认传参.需要有缓存,第一次获取后会存在内存里
|
||||
* @param k 键
|
||||
* @param v 值
|
||||
* @returns {*}
|
||||
*/
|
||||
function getItem(k,v){
|
||||
return local.get(RKEY,k) || v;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除数据库key对应的一条数据,并清除此key对应的内存缓存
|
||||
* @param k
|
||||
*/
|
||||
function clearItem(k){
|
||||
local.delete(RKEY,k);
|
||||
}
|
||||
|
||||
var showMode = getItem('showMode','groups'); // groups按组分类显示 all全部一条线路展示
|
||||
var groupDict = JSON.parse(getItem('groupDict','{}')); // 搜索分组字典
|
||||
|
||||
/**
|
||||
* 打印日志
|
||||
* @param any 任意变量
|
||||
*/
|
||||
function print(any){
|
||||
any = any||'';
|
||||
if(typeof(any)=='object'&&Object.keys(any).length>0){
|
||||
try {
|
||||
any = JSON.stringify(any);
|
||||
console.log(any);
|
||||
}catch (e) {
|
||||
// console.log('print:'+e.message);
|
||||
console.log(typeof(any)+':'+any.length);
|
||||
}
|
||||
}else if(typeof(any)=='object'&&Object.keys(any).length<1){
|
||||
console.log('null object');
|
||||
}else{
|
||||
console.log(any);
|
||||
}
|
||||
}
|
||||
|
||||
/*** js自封装的方法 ***/
|
||||
|
||||
/**
|
||||
* 获取链接的host(带http协议的完整链接)
|
||||
* @param url 任意一个正常完整的Url,自动提取根
|
||||
* @returns {string}
|
||||
*/
|
||||
function getHome(url){
|
||||
if(!url){
|
||||
return ''
|
||||
}
|
||||
let tmp = url.split('//');
|
||||
url = tmp[0] + '//' + tmp[1].split('/')[0];
|
||||
try {
|
||||
url = decodeURIComponent(url);
|
||||
}catch (e) {}
|
||||
return url
|
||||
}
|
||||
|
||||
/**
|
||||
* m3u直播格式转一般直播格式
|
||||
* @param m3u
|
||||
* @returns {string}
|
||||
*/
|
||||
function convertM3uToNormal(m3u) {
|
||||
try {
|
||||
const lines = m3u.split('\n');
|
||||
let result = '';
|
||||
let TV='';
|
||||
// let flag='#genre#';
|
||||
let flag='#m3u#';
|
||||
let currentGroupTitle = '';
|
||||
lines.forEach((line) => {
|
||||
if (line.startsWith('#EXTINF:')) {
|
||||
const groupTitle = line.split('"')[1].trim();
|
||||
TV= line.split('"')[2].substring(1);
|
||||
if (currentGroupTitle !== groupTitle) {
|
||||
currentGroupTitle = groupTitle;
|
||||
result += `\n${currentGroupTitle},${flag}\n`;
|
||||
}
|
||||
} else if (line.startsWith('http')) {
|
||||
const splitLine = line.split(',');
|
||||
result += `${TV}\,${splitLine[0]}\n`;
|
||||
}
|
||||
});
|
||||
return result.trim();
|
||||
}catch (e) {
|
||||
print(`m3u直播转普通直播发生错误:${e.message}`);
|
||||
return m3u
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 线路归类
|
||||
* @param arr
|
||||
* @returns {*[][]}
|
||||
*/
|
||||
function merge(arr) {
|
||||
var parse = arguments[1] ? arguments[1] : '';
|
||||
var p = [];
|
||||
if (parse !== '' && typeof(parse)=="function") {
|
||||
p = arr.map(parse);
|
||||
}
|
||||
const createEmptyArrays = (length) => Array.from({
|
||||
length
|
||||
}, () => []);
|
||||
let lists = createEmptyArrays(arr.length);
|
||||
let sl = createEmptyArrays(arr.length);
|
||||
(p.length ? p : arr).forEach((k, index) => {
|
||||
var i = 0;
|
||||
while (sl[i].includes(k)) {
|
||||
i = i + 1
|
||||
}
|
||||
sl[i].push(k);
|
||||
lists[i].push(arr[index]);
|
||||
})
|
||||
lists=lists.filter(x=>x.some(k=>k.length));
|
||||
return lists
|
||||
}
|
||||
|
||||
/**
|
||||
* 线路归类/小棉袄算法
|
||||
* @param arr 数组
|
||||
* @param parse 解析式
|
||||
* @returns {[[*]]}
|
||||
*/
|
||||
function splitArray(arr,parse) {
|
||||
parse = parse&&typeof(parse)=='function'?parse:'';
|
||||
let result = [[arr[0]]];
|
||||
for (let i = 1; i < arr.length; i++) {
|
||||
let index = -1;
|
||||
for (let j = 0; j < result.length; j++) {
|
||||
if (parse&&result[j].map(parse).includes(parse(arr[i]))) {
|
||||
index = j;
|
||||
}else if((!parse) && result[j].includes(arr[i])){
|
||||
index = j;
|
||||
}
|
||||
}
|
||||
if (index >= result.length - 1) {
|
||||
result.push([]);
|
||||
result[result.length - 1].push(arr[i]);
|
||||
} else {
|
||||
result[index + 1].push(arr[i]);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 搜索结果生成分组字典
|
||||
* @param arr
|
||||
* @param parse x=>x.split(',')[0]
|
||||
* @returns {{}}
|
||||
*/
|
||||
function gen_group_dict(arr,parse){
|
||||
let dict = {};
|
||||
arr.forEach((it)=>{
|
||||
let k = it.split(',')[0];
|
||||
if(parse && typeof(parse)==='function'){
|
||||
k = parse(k);
|
||||
}
|
||||
if(!dict[k]){
|
||||
dict[k] = [it]
|
||||
}else{
|
||||
dict[k].push(it);
|
||||
}
|
||||
});
|
||||
return dict
|
||||
}
|
||||
|
||||
const http = function (url, options = {}) {
|
||||
if(options.method ==='POST' && options.data){
|
||||
options.body = JSON.stringify(options.data);
|
||||
options.headers = Object.assign({'content-type':'application/json'}, options.headers);
|
||||
}
|
||||
options.timeout = request_timeout;
|
||||
if(!options.headers){
|
||||
options.headers = {};
|
||||
}
|
||||
let keys = Object.keys(options.headers).map(it=>it.toLowerCase());
|
||||
if(!keys.includes('referer')){
|
||||
options.headers['Referer'] = getHome(url);
|
||||
}
|
||||
if(!keys.includes('user-agent')){
|
||||
options.headers['User-Agent'] = UA;
|
||||
}
|
||||
console.log(JSON.stringify(options.headers));
|
||||
try {
|
||||
const res = req(url, options);
|
||||
// if(options.headers['Authorization']){
|
||||
// console.log(res.content);
|
||||
// }
|
||||
res.json = () => res&&res.content ? JSON.parse(res.content) : null;
|
||||
res.text = () => res&&res.content ? res.content:'';
|
||||
return res
|
||||
}catch (e) {
|
||||
return {
|
||||
json() {
|
||||
return null
|
||||
}, text() {
|
||||
return ''
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
["get", "post"].forEach(method => {
|
||||
http[method] = function (url, options = {}) {
|
||||
return http(url, Object.assign(options, {method: method.toUpperCase()}));
|
||||
}
|
||||
});
|
||||
|
||||
function init(ext) {
|
||||
console.log("当前版本号:"+VERSION);
|
||||
let data;
|
||||
if (typeof ext == 'object'){
|
||||
data = ext;
|
||||
print('live ext:object');
|
||||
} else if (typeof ext == 'string') {
|
||||
if (ext.startsWith('http')) {
|
||||
let ext_paramas = ext.split(';');
|
||||
let data_url = ext_paramas[0];
|
||||
print(data_url);
|
||||
data = http.get(data_url).json();
|
||||
}
|
||||
}
|
||||
print(data);
|
||||
__ext.data = data;
|
||||
print('init执行完毕');
|
||||
}
|
||||
|
||||
function home(filter) {
|
||||
let classes = __ext.data.map(it => ({
|
||||
type_id: it.url,
|
||||
type_name: it.name,
|
||||
}));
|
||||
print("----home----");
|
||||
let filter_dict = {};
|
||||
let filters = [
|
||||
{'key': 'show', 'name': '播放展示', 'value': [{'n': '多线路分组', 'v': 'groups'},{'n': '单线路', 'v': 'all'}]}
|
||||
];
|
||||
classes.forEach(it=>{
|
||||
filter_dict[it.type_id] = filters;
|
||||
});
|
||||
print(classes);
|
||||
return JSON.stringify({ 'class': classes,'filters': filter_dict});
|
||||
}
|
||||
|
||||
function homeVod(params) {
|
||||
let _get_url = __ext.data[0].url;
|
||||
let html;
|
||||
if(__ext.data_dict[_get_url]){
|
||||
html = __ext.data_dict[_get_url];
|
||||
}else{
|
||||
html = http.get(_get_url).text();
|
||||
if(/#EXTM3U/.test(html)){
|
||||
html = convertM3uToNormal(html);
|
||||
}
|
||||
__ext.data_dict[_get_url] = html;
|
||||
}
|
||||
// let arr = html.match(/.*?,#[\s\S].*?#/g);
|
||||
let arr = html.match(/.*?[,,]#[\s\S].*?#/g); // 可能存在中文逗号
|
||||
let _list = [];
|
||||
try {
|
||||
arr.forEach(it=>{
|
||||
let vname = it.split(/[,,]/)[0];
|
||||
let vtab = it.match(/#(.*?)#/)[0];
|
||||
_list.push({
|
||||
vod_name:vname,
|
||||
vod_id:_get_url+'$'+vname,
|
||||
vod_pic:def_pic,
|
||||
vod_remarks:vtab,
|
||||
});
|
||||
});
|
||||
}catch (e) {
|
||||
print('Live2cms获取首页推荐发送错误:'+e.message);
|
||||
}
|
||||
return JSON.stringify({ 'list': _list });
|
||||
}
|
||||
|
||||
function category(tid, pg, filter, extend) {
|
||||
let fl = filter?extend:{};
|
||||
if(fl.show){
|
||||
showMode = fl.show;
|
||||
setItem('showMode',showMode);
|
||||
}
|
||||
if(parseInt(pg)>1){
|
||||
return JSON.stringify({
|
||||
'list': [],
|
||||
});
|
||||
}
|
||||
let _get_url = tid;
|
||||
let html;
|
||||
if(__ext.data_dict[_get_url]){
|
||||
html = __ext.data_dict[_get_url];
|
||||
}else{
|
||||
html = http.get(_get_url).text();
|
||||
if(/#EXTM3U/.test(html)){
|
||||
html = convertM3uToNormal(html);
|
||||
}
|
||||
__ext.data_dict[_get_url] = html;
|
||||
}
|
||||
// let arr = html.match(/.*?[,,]#[\s\S].*?#/g);
|
||||
let arr = html.match(/.*?[,,]#[\s\S].*?#/g); // 可能存在中文逗号
|
||||
let _list = [];
|
||||
try {
|
||||
arr.forEach(it=>{
|
||||
let vname = it.split(/[,,]/)[0];
|
||||
let vtab = it.match(/#(.*?)#/)[0];
|
||||
_list.push({
|
||||
// vod_name:it.split(',')[0],
|
||||
vod_name:vname,
|
||||
vod_id:_get_url+'$'+vname,
|
||||
vod_pic:def_pic,
|
||||
vod_remarks:vtab,
|
||||
});
|
||||
});
|
||||
}catch (e) {
|
||||
print('Live2cms获取一级分类页发生错误:'+e.message);
|
||||
}
|
||||
|
||||
return JSON.stringify({
|
||||
'page': 1,
|
||||
'pagecount': 1,
|
||||
'limit': _list.length,
|
||||
'total': _list.length,
|
||||
'list': _list,
|
||||
});
|
||||
}
|
||||
|
||||
function detail(tid) { // ⛵ 港•澳•台
|
||||
let _get_url = tid.split('$')[0];
|
||||
let _tab = tid.split('$')[1];
|
||||
if(tid.includes('#search#')){
|
||||
let vod_name = _tab.replace('#search#','');
|
||||
let vod_play_from = '来自搜索';
|
||||
vod_play_from+=`:${_get_url}`;
|
||||
|
||||
// let vod_play_url = vod_name+'$'+_get_url;
|
||||
// print(vod_play_url);
|
||||
|
||||
let vod_play_url = groupDict[_get_url].map(x=>x.replace(',','$')).join('#');
|
||||
|
||||
return JSON.stringify({
|
||||
list: [{
|
||||
vod_id: tid,
|
||||
vod_name: '搜索:'+vod_name,
|
||||
type_name: "直播列表",
|
||||
vod_pic: def_pic,
|
||||
vod_content: tid,
|
||||
vod_play_from: vod_play_from,
|
||||
vod_play_url: vod_play_url,
|
||||
vod_director: tips,
|
||||
vod_remarks: `道长直播转点播js-当前版本${VERSION}`,
|
||||
}]
|
||||
});
|
||||
}
|
||||
let html;
|
||||
if(__ext.data_dict[_get_url]){
|
||||
html = __ext.data_dict[_get_url];
|
||||
}else{
|
||||
html = http.get(_get_url).text();
|
||||
if(/#EXTM3U/.test(html)){
|
||||
html = convertM3uToNormal(html);
|
||||
}
|
||||
__ext.data_dict[_get_url] = html;
|
||||
}
|
||||
// let a = new RegExp(`.*?${_tab},#[\\s\\S].*?#`);
|
||||
let a = new RegExp(`.*?${_tab.replace('(','\\(').replace(')','\\)')}[,,]#[\\s\\S].*?#`);
|
||||
let b = html.match(a)[0];
|
||||
let c = html.split(b)[1];
|
||||
if(c.match(/.*?[,,]#[\s\S].*?#/)){
|
||||
let d = c.match(/.*?[,,]#[\s\S].*?#/)[0];
|
||||
c = c.split(d)[0];
|
||||
}
|
||||
let arr = c.trim().split('\n');
|
||||
let _list = [];
|
||||
arr.forEach((it)=>{
|
||||
if(it.trim()){
|
||||
let t = it.trim().split(',')[0];
|
||||
let u = it.trim().split(',')[1];
|
||||
_list.push(t+'$'+u);
|
||||
}
|
||||
});
|
||||
|
||||
let vod_name = __ext.data.find(x=>x.url===_get_url).name;
|
||||
let vod_play_url;
|
||||
let vod_play_from;
|
||||
|
||||
if(showMode==='groups'){
|
||||
let groups = splitArray(_list,x=>x.split('$')[0]);
|
||||
let tabs = [];
|
||||
for(let i=0;i<groups.length;i++){
|
||||
if(i===0){
|
||||
tabs.push(vod_name+'1')
|
||||
}else{
|
||||
tabs.push(` ${i+1} `)
|
||||
}
|
||||
}
|
||||
vod_play_url = groups.map(it=>it.join('#')).join('$$$');
|
||||
vod_play_from = tabs.join('$$$');
|
||||
}else{
|
||||
vod_play_url = _list.join('#');
|
||||
vod_play_from = vod_name;
|
||||
}
|
||||
let vod = {
|
||||
vod_id: tid,
|
||||
vod_name: vod_name+'|'+_tab,
|
||||
type_name: "直播列表",
|
||||
vod_pic: def_pic,
|
||||
vod_content: tid,
|
||||
vod_play_from: vod_play_from,
|
||||
vod_play_url: vod_play_url,
|
||||
vod_director: tips,
|
||||
vod_remarks: `道长直播转点播js-当前版本${VERSION}`,
|
||||
};
|
||||
|
||||
return JSON.stringify({
|
||||
list: [vod]
|
||||
});
|
||||
}
|
||||
|
||||
function play(flag, id, flags) {
|
||||
let vod = {
|
||||
'parse': /m3u8/.test(id)?0:1,
|
||||
'playUrl': '',
|
||||
'url': id
|
||||
};
|
||||
print(vod);
|
||||
return JSON.stringify(vod);
|
||||
}
|
||||
|
||||
function search(wd, quick) {
|
||||
let _get_url = __ext.data[0].url;
|
||||
let html;
|
||||
if(__ext.data_dict[_get_url]){
|
||||
html = __ext.data_dict[_get_url];
|
||||
}else{
|
||||
html = http.get(_get_url).text();
|
||||
if(/#EXTM3U/.test(html)){
|
||||
html = convertM3uToNormal(html);
|
||||
}
|
||||
__ext.data_dict[_get_url] = html;
|
||||
}
|
||||
let str='';
|
||||
Object.keys(__ext.data_dict).forEach(()=>{
|
||||
str+=__ext.data_dict[_get_url];
|
||||
});
|
||||
let links = str.split('\n').filter(it=>it.trim() && it.includes(',') && it.split(',')[1].trim().startsWith('http'));
|
||||
links = links.map(it=>it.trim());
|
||||
let plays = Array.from(new Set(links));
|
||||
print('搜索关键词:'+wd);
|
||||
print('过滤前:'+plays.length);
|
||||
plays = plays.filter(it=>it.includes(wd));
|
||||
print('过滤后:'+plays.length);
|
||||
print(plays);
|
||||
let new_group = gen_group_dict(plays);
|
||||
groupDict = Object.assign(groupDict,new_group);
|
||||
// 搜索分组结果存至本地方便二级调用
|
||||
setItem('groupDict',JSON.stringify(groupDict));
|
||||
let _list = [];
|
||||
|
||||
|
||||
// plays.forEach((it)=>{
|
||||
// _list.push({
|
||||
// 'vod_name':it.split(',')[0],
|
||||
// 'vod_id':it.split(',')[1].trim()+'$'+it.split(',')[0].trim()+'#search#',
|
||||
// 'vod_pic':def_pic,
|
||||
// })
|
||||
// });
|
||||
|
||||
Object.keys(groupDict).forEach((it)=>{
|
||||
_list.push({
|
||||
'vod_name':it,
|
||||
'vod_id':it+'$'+wd+'#search#',
|
||||
'vod_pic':def_pic,
|
||||
});
|
||||
});
|
||||
return JSON.stringify({
|
||||
'list': _list
|
||||
});
|
||||
}
|
||||
|
||||
// 导出函数对象
|
||||
export default {
|
||||
init: init,
|
||||
home: home,
|
||||
homeVod: homeVod,
|
||||
category: category,
|
||||
detail: detail,
|
||||
play: play,
|
||||
search: search
|
||||
}
|
1
EXT/LIB/live2mv.js
Normal file
1
EXT/LIB/live2mv.js
Normal file
File diff suppressed because one or more lines are too long
25
EXT/LIB/maomi_aes.js
Normal file
25
EXT/LIB/maomi_aes.js
Normal file
@ -0,0 +1,25 @@
|
||||
eval(getCryptoJS());
|
||||
var a = CryptoJS.enc.Utf8.parse("625222f9149e961d");
|
||||
var t = CryptoJS.enc.Utf8.parse("5efdtf6060e2o330");
|
||||
function De(word) {
|
||||
word = CryptoJS.enc.Hex.parse(word)
|
||||
return CryptoJS.AES.decrypt(CryptoJS.enc.Base64.stringify(word), a, {
|
||||
iv: t,
|
||||
mode: CryptoJS.mode.CBC,
|
||||
padding: CryptoJS.pad.Pkcs7
|
||||
}).toString(CryptoJS.enc.Utf8)
|
||||
}
|
||||
var En = function(word) {
|
||||
// print(a);
|
||||
// print(word);
|
||||
var Encrypted = CryptoJS.AES.encrypt(word, a, {
|
||||
iv: t,
|
||||
mode: CryptoJS.mode.CBC,
|
||||
padding: CryptoJS.pad.Pkcs7
|
||||
});
|
||||
return Encrypted.ciphertext.toString();
|
||||
}
|
||||
$.exports = {
|
||||
De:De,
|
||||
En:En
|
||||
}
|
138
EXT/LIB/mod.js
Normal file
138
EXT/LIB/mod.js
Normal file
@ -0,0 +1,138 @@
|
||||
const peq = new Uint32Array(0x10000);
|
||||
const myers_32 = (a, b) => {
|
||||
const n = a.length;
|
||||
const m = b.length;
|
||||
const lst = 1 << (n - 1);
|
||||
let pv = -1;
|
||||
let mv = 0;
|
||||
let sc = n;
|
||||
let i = n;
|
||||
while (i--) {
|
||||
peq[a.charCodeAt(i)] |= 1 << i;
|
||||
}
|
||||
for (i = 0; i < m; i++) {
|
||||
let eq = peq[b.charCodeAt(i)];
|
||||
const xv = eq | mv;
|
||||
eq |= ((eq & pv) + pv) ^ pv;
|
||||
mv |= ~(eq | pv);
|
||||
pv &= eq;
|
||||
if (mv & lst) {
|
||||
sc++;
|
||||
}
|
||||
if (pv & lst) {
|
||||
sc--;
|
||||
}
|
||||
mv = (mv << 1) | 1;
|
||||
pv = (pv << 1) | ~(xv | mv);
|
||||
mv &= xv;
|
||||
}
|
||||
i = n;
|
||||
while (i--) {
|
||||
peq[a.charCodeAt(i)] = 0;
|
||||
}
|
||||
return sc;
|
||||
};
|
||||
const myers_x = (b, a) => {
|
||||
const n = a.length;
|
||||
const m = b.length;
|
||||
const mhc = [];
|
||||
const phc = [];
|
||||
const hsize = Math.ceil(n / 32);
|
||||
const vsize = Math.ceil(m / 32);
|
||||
for (let i = 0; i < hsize; i++) {
|
||||
phc[i] = -1;
|
||||
mhc[i] = 0;
|
||||
}
|
||||
let j = 0;
|
||||
for (; j < vsize - 1; j++) {
|
||||
let mv = 0;
|
||||
let pv = -1;
|
||||
const start = j * 32;
|
||||
const vlen = Math.min(32, m) + start;
|
||||
for (let k = start; k < vlen; k++) {
|
||||
peq[b.charCodeAt(k)] |= 1 << k;
|
||||
}
|
||||
for (let i = 0; i < n; i++) {
|
||||
const eq = peq[a.charCodeAt(i)];
|
||||
const pb = (phc[(i / 32) | 0] >>> i) & 1;
|
||||
const mb = (mhc[(i / 32) | 0] >>> i) & 1;
|
||||
const xv = eq | mv;
|
||||
const xh = ((((eq | mb) & pv) + pv) ^ pv) | eq | mb;
|
||||
let ph = mv | ~(xh | pv);
|
||||
let mh = pv & xh;
|
||||
if ((ph >>> 31) ^ pb) {
|
||||
phc[(i / 32) | 0] ^= 1 << i;
|
||||
}
|
||||
if ((mh >>> 31) ^ mb) {
|
||||
mhc[(i / 32) | 0] ^= 1 << i;
|
||||
}
|
||||
ph = (ph << 1) | pb;
|
||||
mh = (mh << 1) | mb;
|
||||
pv = mh | ~(xv | ph);
|
||||
mv = ph & xv;
|
||||
}
|
||||
for (let k = start; k < vlen; k++) {
|
||||
peq[b.charCodeAt(k)] = 0;
|
||||
}
|
||||
}
|
||||
let mv = 0;
|
||||
let pv = -1;
|
||||
const start = j * 32;
|
||||
const vlen = Math.min(32, m - start) + start;
|
||||
for (let k = start; k < vlen; k++) {
|
||||
peq[b.charCodeAt(k)] |= 1 << k;
|
||||
}
|
||||
let score = m;
|
||||
for (let i = 0; i < n; i++) {
|
||||
const eq = peq[a.charCodeAt(i)];
|
||||
const pb = (phc[(i / 32) | 0] >>> i) & 1;
|
||||
const mb = (mhc[(i / 32) | 0] >>> i) & 1;
|
||||
const xv = eq | mv;
|
||||
const xh = ((((eq | mb) & pv) + pv) ^ pv) | eq | mb;
|
||||
let ph = mv | ~(xh | pv);
|
||||
let mh = pv & xh;
|
||||
score += (ph >>> (m - 1)) & 1;
|
||||
score -= (mh >>> (m - 1)) & 1;
|
||||
if ((ph >>> 31) ^ pb) {
|
||||
phc[(i / 32) | 0] ^= 1 << i;
|
||||
}
|
||||
if ((mh >>> 31) ^ mb) {
|
||||
mhc[(i / 32) | 0] ^= 1 << i;
|
||||
}
|
||||
ph = (ph << 1) | pb;
|
||||
mh = (mh << 1) | mb;
|
||||
pv = mh | ~(xv | ph);
|
||||
mv = ph & xv;
|
||||
}
|
||||
for (let k = start; k < vlen; k++) {
|
||||
peq[b.charCodeAt(k)] = 0;
|
||||
}
|
||||
return score;
|
||||
};
|
||||
const distance = (a, b) => {
|
||||
if (a.length < b.length) {
|
||||
const tmp = b;
|
||||
b = a;
|
||||
a = tmp;
|
||||
}
|
||||
if (b.length === 0) {
|
||||
return a.length;
|
||||
}
|
||||
if (a.length <= 32) {
|
||||
return myers_32(a, b);
|
||||
}
|
||||
return myers_x(a, b);
|
||||
};
|
||||
const closest = (str, arr) => {
|
||||
let min_distance = Infinity;
|
||||
let min_index = 0;
|
||||
for (let i = 0; i < arr.length; i++) {
|
||||
const dist = distance(str, arr[i]);
|
||||
if (dist < min_distance) {
|
||||
min_distance = dist;
|
||||
min_index = i;
|
||||
}
|
||||
}
|
||||
return arr[min_index];
|
||||
};
|
||||
export { closest, distance };
|
187
EXT/LIB/nameOrder.js
Normal file
187
EXT/LIB/nameOrder.js
Normal file
@ -0,0 +1,187 @@
|
||||
/**
|
||||
* 比较字符串
|
||||
* @param str1
|
||||
* @param str2
|
||||
*/
|
||||
function strCompare(str1, str2) {
|
||||
// 处理数据为null的情况
|
||||
if (str1 == undefined && str2 == undefined) {
|
||||
return 0;
|
||||
}
|
||||
if (str1 == undefined) {
|
||||
return -1;
|
||||
}
|
||||
if (str2 == undefined) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
// 比较字符串中的每个字符
|
||||
let c1;
|
||||
let c2;
|
||||
|
||||
let regexArr = ['-', '_', '—', '~', '·'], canRegex = /[^0-9\.]/g;
|
||||
// 如果都不是数字格式(含有其它内容)
|
||||
if (canRegex.test(str1) && canRegex.test(str2)) {
|
||||
for (let i = 0; i < regexArr.length; i++) {
|
||||
let regex = eval('(/[^0-9\\' + regexArr[i] + '\\.]/g)');
|
||||
// 去除后缀
|
||||
let tps1 = str1.replace(/\.[0-9a-zA-Z]+$/, '');
|
||||
let tps2 = str2.replace(/\.[0-9a-zA-Z]+$/, '');
|
||||
// 如果在名字正则要求范围内(没有正则以外的值)
|
||||
if (!regex.test(tps1) && !regex.test(tps2)) {
|
||||
// 转换为字符串数组
|
||||
let numberArray1 = tps1.split(regexArr[i]);
|
||||
let numberArray2 = tps2.split(regexArr[i]);
|
||||
return compareNumberArray(numberArray1, numberArray2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 逐字比较返回结果
|
||||
for (let i = 0; i < str1.length; i++) {
|
||||
c1 = str1[i];
|
||||
if (i > str2.length - 1) { // 如果在该字符前,两个串都一样,str2更短,则str1较大
|
||||
return 1;
|
||||
}
|
||||
c2 = str2[i];
|
||||
// 如果都是数字的话,则需要考虑多位数的情况,取出完整的数字字符串,转化为数字再进行比较
|
||||
if (isNumber(c1) && isNumber(c2)) {
|
||||
let numStr1 = "";
|
||||
let numStr2 = "";
|
||||
// 获取数字部分字符串
|
||||
for (let j = i; j < str1.length; j++) {
|
||||
c1 = str1[j];
|
||||
if (!isNumber(c1) && c1 !== '.') { // 不是数字则直接退出循环
|
||||
break;
|
||||
}
|
||||
numStr1 += c1;
|
||||
}
|
||||
for (let j = i; j < str2.length; j++) {
|
||||
c2 = str2[j];
|
||||
if (!isNumber(c2) && c2 !== '.') {
|
||||
break;
|
||||
}
|
||||
numStr2 += c2;
|
||||
}
|
||||
// 将带小数点的数字转换为数字字符串数组
|
||||
let numberArray1 = numStr1.split('.');
|
||||
let numberArray2 = numStr2.split('.');
|
||||
return compareNumberArray(numberArray1, numberArray2);
|
||||
}
|
||||
|
||||
// 不是数字的比较方式
|
||||
if (c1 != c2) {
|
||||
return c1 - c2;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断是否为数字
|
||||
* @param obj
|
||||
* @returns
|
||||
*/
|
||||
function isNumber(obj) {
|
||||
if (parseFloat(obj).toString() == "NaN") {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 比较两个数字数组
|
||||
*
|
||||
* @param numberArray1
|
||||
* @param numberArray2
|
||||
*/
|
||||
export function compareNumberArray(numberArray1, numberArray2) {
|
||||
for (let i = 0; i < numberArray1.length; i++) {
|
||||
if (numberArray2.length < i + 1) { // 此时数字数组2比1短,直接返回
|
||||
return 1;
|
||||
}
|
||||
let compareResult = parseInt(numberArray1[i]) - parseInt(numberArray2[i]);
|
||||
if (compareResult !== 0) {
|
||||
return compareResult;
|
||||
}
|
||||
}
|
||||
// 说明数组1比数组2短,返回小于
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 自然排序
|
||||
* ["第1集","第10集","第20集","第2集","1","2","10","12","23","01","02"].sort(naturalSort())
|
||||
* @param options { direction: 'desc', caseSensitive: true }
|
||||
*/
|
||||
export function naturalSort(options) {
|
||||
if (!options) options = {};
|
||||
|
||||
return function (a, b) {
|
||||
var EQUAL = 0;
|
||||
var GREATER = (options.direction == 'desc' ?
|
||||
-1 :
|
||||
1
|
||||
);
|
||||
var SMALLER = -GREATER;
|
||||
|
||||
var re = /(^-?[0-9]+(\.?[0-9]*)[df]?e?[0-9]?$|^0x[0-9a-f]+$|[0-9]+)/gi;
|
||||
var sre = /(^[ ]*|[ ]*$)/g;
|
||||
var dre = /(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/;
|
||||
var hre = /^0x[0-9a-f]+$/i;
|
||||
var ore = /^0/;
|
||||
|
||||
var normalize = function normalize(value) {
|
||||
var string = '' + value;
|
||||
return (options.caseSensitive ?
|
||||
string :
|
||||
string.toLowerCase()
|
||||
);
|
||||
};
|
||||
|
||||
// Normalize values to strings
|
||||
var x = normalize(a).replace(sre, '') || '';
|
||||
var y = normalize(b).replace(sre, '') || '';
|
||||
|
||||
// chunk/tokenize
|
||||
var xN = x.replace(re, '\0$1\0').replace(/\0$/, '').replace(/^\0/, '').split('\0');
|
||||
var yN = y.replace(re, '\0$1\0').replace(/\0$/, '').replace(/^\0/, '').split('\0');
|
||||
|
||||
// Return immediately if at least one of the values is empty.
|
||||
if (!x && !y) return EQUAL;
|
||||
if (!x && y) return GREATER;
|
||||
if (x && !y) return SMALLER;
|
||||
|
||||
// numeric, hex or date detection
|
||||
var xD = parseInt(x.match(hre)) || (xN.length != 1 && x.match(dre) && Date.parse(x));
|
||||
var yD = parseInt(y.match(hre)) || xD && y.match(dre) && Date.parse(y) || null;
|
||||
var oFxNcL, oFyNcL;
|
||||
|
||||
// first try and sort Hex codes or Dates
|
||||
if (yD) {
|
||||
if (xD < yD) return SMALLER;
|
||||
else if (xD > yD) return GREATER;
|
||||
}
|
||||
|
||||
// natural sorting through split numeric strings and default strings
|
||||
for (var cLoc = 0, numS = Math.max(xN.length, yN.length); cLoc < numS; cLoc++) {
|
||||
|
||||
// find floats not starting with '0', string or 0 if not defined (Clint Priest)
|
||||
oFxNcL = !(xN[cLoc] || '').match(ore) && parseFloat(xN[cLoc]) || xN[cLoc] || 0;
|
||||
oFyNcL = !(yN[cLoc] || '').match(ore) && parseFloat(yN[cLoc]) || yN[cLoc] || 0;
|
||||
|
||||
// handle numeric vs string comparison - number < string - (Kyle Adams)
|
||||
if (isNaN(oFxNcL) !== isNaN(oFyNcL)) return (isNaN(oFxNcL)) ? GREATER : SMALLER;
|
||||
|
||||
// rely on string comparison if different types - i.e. '02' < 2 != '02' < '2'
|
||||
else if (typeof oFxNcL !== typeof oFyNcL) {
|
||||
oFxNcL += '';
|
||||
oFyNcL += '';
|
||||
}
|
||||
if (oFxNcL < oFyNcL) return SMALLER;
|
||||
if (oFxNcL > oFyNcL) return GREATER;
|
||||
}
|
||||
return EQUAL;
|
||||
};
|
||||
}
|
384
EXT/LIB/parse/getck_vqq.js
Normal file
384
EXT/LIB/parse/getck_vqq.js
Normal file
@ -0,0 +1,384 @@
|
||||
var document = {
|
||||
URL: "https://v.qq.com/x/cover/bzfkv5se8qaqel2/j002024w2wg.html",
|
||||
referrer: ""
|
||||
|
||||
}
|
||||
|
||||
var window = {
|
||||
document: document,
|
||||
navigator: {
|
||||
userAgent: "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36",
|
||||
appCodeName: "Mozilla",
|
||||
appName: "Netscape",
|
||||
platform: "Win32"
|
||||
},
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
function w() {
|
||||
Fa = new Int8Array(Ea),
|
||||
Ha = new Int16Array(Ea),
|
||||
Ja = new Int32Array(Ea),
|
||||
Ga = new Uint8Array(Ea),
|
||||
Ia = new Uint16Array(Ea),
|
||||
Ka = new Uint32Array(Ea),
|
||||
La = new Float32Array(Ea),
|
||||
Ma = new Float64Array(Ea);
|
||||
}
|
||||
function d(a) {
|
||||
var b = Oa;
|
||||
return Oa = Oa + a + 15 & -16,
|
||||
b
|
||||
}
|
||||
function e(a, b) {
|
||||
b || (b = Da);
|
||||
var c = a = Math.ceil(a / b) * b;
|
||||
return c
|
||||
}
|
||||
function i(a, b, c, d, e){
|
||||
function f(a) {
|
||||
return "string" === b ? k(a) : "boolean" === b ? Boolean(a) : a
|
||||
}
|
||||
var i = wasmobject.exports._getckey //h(a)
|
||||
, j = []
|
||||
, l = 0;
|
||||
// if (g("array" !== b, 'Return type should not be "array".'),
|
||||
// d)
|
||||
if (d)
|
||||
for (var m = 0; m < d.length; m++) {
|
||||
var n = $a[c[m]];
|
||||
// n ? (0 === l && (l = Ub()),
|
||||
n ? (0 === l && (l = Ub()),
|
||||
j[m] = n(d[m])) : j[m] = d[m]
|
||||
}
|
||||
var o = i.apply(null, j);
|
||||
return o = f(o),
|
||||
0 !== l && Tb(l),
|
||||
o
|
||||
|
||||
}
|
||||
|
||||
function k(a, b) {
|
||||
if (0 === b || !a)
|
||||
return "";
|
||||
for (var c, d = 0, e = 0; ; ) {
|
||||
// if (g(a + e < db),
|
||||
if (
|
||||
c = Ga[a + e >> 0],
|
||||
d |= c,
|
||||
0 == c && !b)
|
||||
break;
|
||||
if (e++,
|
||||
b && e == b)
|
||||
break
|
||||
}
|
||||
b || (b = e);
|
||||
var f = "";
|
||||
if (d < 128) {
|
||||
for (var h, i = 1024; b > 0; )
|
||||
h = String.fromCharCode.apply(String, Ga.subarray(a, a + Math.min(b, i))),
|
||||
f = f ? f + h : h,
|
||||
a += i,
|
||||
b -= i;
|
||||
return f
|
||||
}
|
||||
return m(a)
|
||||
}
|
||||
function o(a, b, c) {
|
||||
return n(a, Ga, b, c)
|
||||
}
|
||||
function n(a, b, c, d) {
|
||||
if (!(d > 0))
|
||||
return 0;
|
||||
for (var e = c, f = c + d - 1, g = 0; g < a.length; ++g) {
|
||||
var h = a.charCodeAt(g);
|
||||
if (h >= 55296 && h <= 57343) {
|
||||
var i = a.charCodeAt(++g);
|
||||
h = 65536 + ((1023 & h) << 10) | 1023 & i
|
||||
}
|
||||
if (h <= 127) {
|
||||
if (c >= f)
|
||||
break;
|
||||
b[c++] = h
|
||||
} else if (h <= 2047) {
|
||||
if (c + 1 >= f)
|
||||
break;
|
||||
b[c++] = 192 | h >> 6,
|
||||
b[c++] = 128 | 63 & h
|
||||
} else if (h <= 65535) {
|
||||
if (c + 2 >= f)
|
||||
break;
|
||||
b[c++] = 224 | h >> 12,
|
||||
b[c++] = 128 | h >> 6 & 63,
|
||||
b[c++] = 128 | 63 & h
|
||||
} else if (h <= 2097151) {
|
||||
if (c + 3 >= f)
|
||||
break;
|
||||
b[c++] = 240 | h >> 18,
|
||||
b[c++] = 128 | h >> 12 & 63,
|
||||
b[c++] = 128 | h >> 6 & 63,
|
||||
b[c++] = 128 | 63 & h
|
||||
} else if (h <= 67108863) {
|
||||
if (c + 4 >= f)
|
||||
break;
|
||||
b[c++] = 248 | h >> 24,
|
||||
b[c++] = 128 | h >> 18 & 63,
|
||||
b[c++] = 128 | h >> 12 & 63,
|
||||
b[c++] = 128 | h >> 6 & 63,
|
||||
b[c++] = 128 | 63 & h
|
||||
} else {
|
||||
if (c + 5 >= f)
|
||||
break;
|
||||
b[c++] = 252 | h >> 30,
|
||||
b[c++] = 128 | h >> 24 & 63,
|
||||
b[c++] = 128 | h >> 18 & 63,
|
||||
b[c++] = 128 | h >> 12 & 63,
|
||||
b[c++] = 128 | h >> 6 & 63,
|
||||
b[c++] = 128 | 63 & h
|
||||
}
|
||||
}
|
||||
return b[c] = 0,
|
||||
c - e
|
||||
}
|
||||
function Tb(){
|
||||
return wasmobject.exports.stackRestore.apply(null, arguments)
|
||||
|
||||
}
|
||||
function Ub(){
|
||||
return wasmobject.exports.stackSave.apply(null, arguments)
|
||||
|
||||
}
|
||||
function Sb(){
|
||||
return wasmobject.exports.stackAlloc.apply(null, arguments)
|
||||
|
||||
}
|
||||
function Pb(){
|
||||
return wasmobject.exports._malloc.apply(null, arguments)
|
||||
}
|
||||
function P() { // function 20( )
|
||||
function p(a) {
|
||||
for (var b = 0, c = 0; c < a.length; ++c) {
|
||||
var d = a.charCodeAt(c);
|
||||
d >= 55296 && d <= 57343 && (d = 65536 + ((1023 & d) << 10) | 1023 & a.charCodeAt(++c)),
|
||||
d <= 127 ? ++b : b += d <= 2047 ? 2 : d <= 65535 ? 3 : d <= 2097151 ? 4 : d <= 67108863 ? 5 : 6
|
||||
}
|
||||
return b
|
||||
}
|
||||
function a(a) {
|
||||
return a ? a.length > 48 ? a.substr(0, 48) : a : ""
|
||||
}
|
||||
function b() {
|
||||
var b = document.URL
|
||||
, c = window.navigator.userAgent.toLowerCase()
|
||||
, d = "";
|
||||
document.referrer.length > 0 && (d = document.referrer);
|
||||
try {
|
||||
0 == d.length && opener.location.href.length > 0 && (d = opener.location.href)
|
||||
} catch (e) {}
|
||||
var f = window.navigator.appCodeName
|
||||
, g = window.navigator.appName
|
||||
, h = window.navigator.platform;
|
||||
return b = a(b),
|
||||
d = a(d),
|
||||
c = a(c),
|
||||
b + "|" + c + "|" + d + "|" + f + "|" + g + "|" + h
|
||||
}
|
||||
var c = b()
|
||||
, d = p(c) + 1
|
||||
, e = Pb(d);
|
||||
return o(c, e, d + 1),
|
||||
e
|
||||
}
|
||||
function C() {
|
||||
return db
|
||||
}
|
||||
|
||||
var $a = {
|
||||
string: function(a) {
|
||||
var b = 0;
|
||||
if (null !== a && void 0 !== a && 0 !== a) {
|
||||
var c = (a.length << 2) + 1;
|
||||
b = Sb(c),
|
||||
o(a, b, c)
|
||||
}
|
||||
return b
|
||||
},
|
||||
array: function(a) {
|
||||
var b = Sb(a.length);
|
||||
return K(a, b),
|
||||
b
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
//////////////////////////////// init global var
|
||||
|
||||
var Da = 16;
|
||||
|
||||
var Ea, Fa, Ga, Ha, Ia, Ja, Ka, La, Ma, Na, Oa, Pa, Qa, Ra, Sa, Ta, Ua, Va = {
|
||||
"f64-rem": function(a, b) {
|
||||
return a % b
|
||||
},
|
||||
"debugger": function() {}
|
||||
}, Wa = (new Array(0), 1024) ;
|
||||
|
||||
Na = Oa = Qa = Ra = Sa = Ta = Ua = 0,
|
||||
Pa = !1;
|
||||
var cb = 5242880 , db = 16777216, ab = 65536;
|
||||
|
||||
|
||||
var wasmMemory = new WebAssembly.Memory({
|
||||
initial: db / ab,
|
||||
maximum: db / ab
|
||||
});
|
||||
Ea = wasmMemory.buffer;
|
||||
|
||||
w();
|
||||
Ja[0] = 1668509029;
|
||||
Ha[1] = 25459;
|
||||
|
||||
var eb = []
|
||||
, fb = []
|
||||
, gb = []
|
||||
, hb = []
|
||||
, ib = !1
|
||||
, jb = !1;
|
||||
|
||||
Na = Wa,
|
||||
Oa = Na + 6928,
|
||||
fb.push();
|
||||
|
||||
Oa += 16;
|
||||
|
||||
Ua = d(4),
|
||||
Qa = Ra = e(Oa),
|
||||
Sa = Qa + cb,
|
||||
Ta = e(Sa),
|
||||
Ja[Ua >> 2] = Ta,
|
||||
Pa = !0;
|
||||
|
||||
////////////////////////////////// wasm env ///////////////////////////////////////
|
||||
|
||||
var fun_ = function(){};
|
||||
|
||||
wasm_env = {
|
||||
abort: fun_,
|
||||
assert: fun_,
|
||||
enlargeMemory: fun_,
|
||||
getTotalMemory: C,
|
||||
abortOnCannotGrowMemory: fun_,
|
||||
abortStackOverflow: fun_,
|
||||
nullFunc_ii: fun_,
|
||||
nullFunc_iiii: fun_,
|
||||
nullFunc_v: fun_,
|
||||
nullFunc_vi: fun_,
|
||||
nullFunc_viiii: fun_,
|
||||
nullFunc_viiiii: fun_,
|
||||
nullFunc_viiiiii: fun_,
|
||||
invoke_ii: fun_,
|
||||
invoke_iiii: fun_,
|
||||
invoke_v: fun_,
|
||||
invoke_vi: fun_,
|
||||
invoke_viiii: fun_,
|
||||
invoke_viiiii: fun_,
|
||||
invoke_viiiiii: fun_,
|
||||
__ZSt18uncaught_exceptionv: fun_,
|
||||
___cxa_find_matching_catch: fun_,
|
||||
___gxx_personality_v0: fun_,
|
||||
___lock: fun_,
|
||||
___resumeException: fun_,
|
||||
___setErrNo: fun_,
|
||||
___syscall140: fun_,
|
||||
___syscall146: fun_,
|
||||
___syscall54: fun_,
|
||||
___syscall6: fun_,
|
||||
___unlock: fun_,
|
||||
_abort: fun_,
|
||||
_emscripten_memcpy_big: fun_,
|
||||
_get_unicode_str: P, // function 20( ) => P( )
|
||||
flush_NO_FILESYSTEM: fun_,
|
||||
DYNAMICTOP_PTR: 7968, //Ua
|
||||
tempDoublePtr: 7952, //rb
|
||||
STACKTOP: 7984, //Ra
|
||||
STACK_MAX: 5250864, //Sa
|
||||
|
||||
memoryBase: 1024,
|
||||
tableBase: 0,
|
||||
memory: wasmMemory,
|
||||
table: new WebAssembly.Table({
|
||||
initial: 99,
|
||||
maximum: 99,
|
||||
element: "anyfunc"
|
||||
})
|
||||
};
|
||||
|
||||
var importObject = {
|
||||
'env': wasm_env,
|
||||
'asm2wasm': {
|
||||
"f64-rem": function(a, b) {
|
||||
return a % b
|
||||
},
|
||||
"debugger": function() {}
|
||||
},
|
||||
'global': {
|
||||
NaN: NaN,
|
||||
Infinity: 1 / 0
|
||||
},
|
||||
"global.Math": Math,
|
||||
// "parent": {};
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
///////////////////////////////// load wasm ///////////////////////////////////////
|
||||
const fs = require('fs');
|
||||
var wasm_data = fs.readFileSync('./js/tx-ckey.wasm')
|
||||
var buffer = new Uint8Array(wasm_data);
|
||||
|
||||
var wasmobject = new WebAssembly.Instance(new WebAssembly.Module(buffer), importObject);
|
||||
|
||||
|
||||
|
||||
// function setnavigator(URL, referrer, userAgent, appCodeName, appName, platform){
|
||||
// navigator = {
|
||||
// userAgent: "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36",
|
||||
// appCodeName: "Mozilla",
|
||||
// appName: "Netscape",
|
||||
// platform: "Win32"
|
||||
// };
|
||||
// window.navigator = navigator;
|
||||
//
|
||||
// }
|
||||
|
||||
|
||||
function setdocument(URL, referrer){
|
||||
document.URL = URL;
|
||||
document.referrer = referrer;
|
||||
}
|
||||
|
||||
// encryptVer = "9.1"
|
||||
function getckey(platform, appVer, vid, empty_str="", guid, tm){
|
||||
var _args = [platform, appVer, vid, empty_str="", guid, tm];
|
||||
var c = ['number', 'string', 'string', 'string', 'string', 'number'];
|
||||
return i('getckey', 'string', c, _args, undefined)
|
||||
|
||||
}
|
||||
|
||||
|
||||
// playerID, guid
|
||||
function createGUID(a) {
|
||||
a = a || 32;
|
||||
for (var b = "", c = 1; c <= a; c++) {
|
||||
var d = Math.floor(16 * Math.random()).toString(16);
|
||||
b += d
|
||||
}
|
||||
return b
|
||||
}
|
89
EXT/LIB/pdf.js
Normal file
89
EXT/LIB/pdf.js
Normal file
@ -0,0 +1,89 @@
|
||||
const DOM_CHECK_ATTR = /(url|src|href|-original|-src|-play|-url)$/;
|
||||
const SELECT_REGEX = /:eq|:lt|:gt|#/g;
|
||||
const SELECT_REGEX_A = /:eq|:lt|:gt/g;
|
||||
const parseTags = {
|
||||
jq:{
|
||||
pdfh(html, parse, base_url) {
|
||||
if (!parse || !parse.trim()) {
|
||||
return ''
|
||||
}
|
||||
parse = parse.trim();
|
||||
let option = null;
|
||||
if (parse.startsWith('body&&')) {
|
||||
parse = parse.substr(6);
|
||||
}
|
||||
print('pdfh parse前:'+parse);
|
||||
if (parse.indexOf('&&') > -1) {
|
||||
let sp = parse.split('&&');
|
||||
option = sp[sp.length - 1];
|
||||
sp.splice(sp.length - 1);
|
||||
sp.forEach((it,idex)=>{
|
||||
if(/:eq\((.*?)\)/.test(it)){
|
||||
let pos = parseInt(it.match(/:eq\((.*?)\)/)[1]);
|
||||
if(pos >= 0 ){ // jsoup的eq 正整数从1开始
|
||||
it = it.replace(/:eq\((.*?)\)/,`:eq(${pos+1})`);
|
||||
sp[idex] = it;
|
||||
}
|
||||
}else if (!SELECT_REGEX.test(it) && it!=='body') {
|
||||
sp[idex] = it+':eq(1)'; // jsoup的eq从1开始
|
||||
}
|
||||
});
|
||||
parse = sp.join(' ');
|
||||
}
|
||||
if(parse === 'Text'){
|
||||
parse = 'body';
|
||||
option = 'Text';
|
||||
}else if(parse === 'Html'){
|
||||
parse = 'body';
|
||||
option = 'Html';
|
||||
}
|
||||
print('pdfh parse后:'+parse+',option:'+option);
|
||||
let result = defaultParser.pdfh(html,parse + " " + option);
|
||||
print(result);
|
||||
if(option&&/style/.test(option.toLowerCase())&&/url\(/.test(result)){
|
||||
try {
|
||||
result = result.match(/url\((.*?)\)/)[1];
|
||||
}catch (e) {}
|
||||
}
|
||||
if (result && base_url && option && DOM_CHECK_ATTR.test(option)) {
|
||||
if (/http/.test(result)) {
|
||||
result = result.substr(result.indexOf('http'));
|
||||
} else {
|
||||
result = urljoin(base_url, result)
|
||||
}
|
||||
}
|
||||
return result;
|
||||
},
|
||||
pdfa(html, parse) {
|
||||
if (!parse || !parse.trim()) {
|
||||
print('!parse');
|
||||
return [];
|
||||
}
|
||||
parse = parse.trim();
|
||||
print('pdfa parse前:'+parse);
|
||||
if (parse.indexOf('&&') > -1) {
|
||||
let sp = parse.split('&&');
|
||||
sp.forEach((it,idex)=>{
|
||||
if(/:eq\((.*?)\)/.test(it) && idex < sp.length - 1){
|
||||
let pos = parseInt(it.match(/:eq\((.*?)\)/)[1]);
|
||||
if(pos >= 0 ){ // jsoup的eq 正整数从1开始
|
||||
it = it.replace(/:eq\((.*?)\)/,`:eq(${pos+1})`);
|
||||
sp[idex] = it;
|
||||
}
|
||||
}else if (!SELECT_REGEX_A.test(it) && idex < sp.length - 1 && it!=='body') {
|
||||
sp[idex] = it+':eq(1)'; // jsoup的eq从1开始
|
||||
}
|
||||
});
|
||||
parse = sp.join(' ');
|
||||
}
|
||||
print('pdfa parse后:'+parse);
|
||||
let result = defaultParser.pdfa(html,parse);
|
||||
// print(result);
|
||||
print(result.length);
|
||||
return result;
|
||||
},
|
||||
pd(html,parse,uri){
|
||||
return parseTags.jq.pdfh(html, parse, MY_URL);
|
||||
},
|
||||
},
|
||||
};
|
58
EXT/LIB/pinyin_getFirstLetterList.js
Normal file
58
EXT/LIB/pinyin_getFirstLetterList.js
Normal file
File diff suppressed because one or more lines are too long
264
EXT/LIB/pre.js
Normal file
264
EXT/LIB/pre.js
Normal file
@ -0,0 +1,264 @@
|
||||
var VODS = [];
|
||||
var $ = {};
|
||||
if (!String.prototype.includes) {
|
||||
String.prototype.includes = function (search, start) {
|
||||
|
||||
if (typeof start !== 'number') {
|
||||
start = 0;
|
||||
}
|
||||
|
||||
if (start + search.length > this.length) {
|
||||
return false;
|
||||
} else {
|
||||
return this.indexOf(search, start) !== -1;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
if (!Array.prototype.includes) {
|
||||
Object.defineProperty(Array.prototype, 'includes', {
|
||||
value: function (searchElement, fromIndex) {
|
||||
|
||||
if (this == null) {//this是空或者未定义,抛出错误
|
||||
throw new TypeError('"this" is null or not defined');
|
||||
}
|
||||
|
||||
var o = Object(this);//将this转变成对象
|
||||
var len = o.length >>> 0;//无符号右移0位,获取对象length属性,如果未定义就会变成0
|
||||
|
||||
if (len === 0) {//length为0直接返回false未找到目标值
|
||||
return false;
|
||||
}
|
||||
|
||||
var n = fromIndex | 0;//查找起始索引
|
||||
var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);//计算正确起始索引,因为有可能是负值
|
||||
|
||||
while (k < len) {//从起始索引处开始循环
|
||||
if (o[k] === searchElement) {//如果某一位置与寻找目标相等,返回true,找到了
|
||||
return true;
|
||||
}
|
||||
k++;
|
||||
}
|
||||
return false;//未找到,返回false
|
||||
}
|
||||
});
|
||||
}
|
||||
if (typeof String.prototype.startsWith != 'function') {
|
||||
String.prototype.startsWith = function (prefix){
|
||||
return this.slice(0, prefix.length) === prefix;
|
||||
};
|
||||
}
|
||||
if (typeof String.prototype.endsWith != 'function') {
|
||||
String.prototype.endsWith = function(suffix) {
|
||||
return this.indexOf(suffix, this.length - suffix.length) !== -1;
|
||||
};
|
||||
}
|
||||
|
||||
Object.assign = function () {
|
||||
var target = arguments[0];
|
||||
for (var i = 1; i < arguments.length; i++) {
|
||||
var source = arguments[i];
|
||||
for (var key in source) {
|
||||
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
||||
target[key] = source[key];
|
||||
}
|
||||
}
|
||||
}
|
||||
return target;
|
||||
};
|
||||
Object.prototype.myValues=function(obj){
|
||||
if(obj ==null) {
|
||||
throw new TypeError("Cannot convert undefined or null to object");
|
||||
}
|
||||
var res=[]
|
||||
for(var k in obj){
|
||||
if(obj.hasOwnProperty(k)){//需判断是否是本身的属性
|
||||
res.push(obj[k]);
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
if (typeof Object.prototype.values != 'function') {
|
||||
Object.prototype.values=function(obj){
|
||||
if(obj ==null) {
|
||||
throw new TypeError("Cannot convert undefined or null to object");
|
||||
}
|
||||
var res=[]
|
||||
for(var k in obj){
|
||||
if(obj.hasOwnProperty(k)){//需判断是否是本身的属性
|
||||
res.push(obj[k]);
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
Array.prototype.join = function (emoji) {
|
||||
// emoji = emoji||',';
|
||||
emoji = emoji||'';
|
||||
let self = this;
|
||||
let str = "";
|
||||
let i = 0;
|
||||
if (!Array.isArray(self)) {throw String(self)+'is not Array'}
|
||||
if(self.length===0){return ''}
|
||||
if (self.length === 1){return String(self[0])}
|
||||
i = 1;
|
||||
str = this[0];
|
||||
for (; i < self.length; i++) {
|
||||
str += String(emoji)+String(self[i]);
|
||||
}
|
||||
return str;
|
||||
};
|
||||
Array.prototype.append = Array.prototype.push;
|
||||
String.prototype.strip = String.prototype.trim;
|
||||
function 是否正版(vipUrl){
|
||||
let flag = new RegExp('qq\.com|iqiyi\.com|youku\.com|mgtv\.com|bilibili\.com|sohu\.com|ixigua\.com|pptv\.com|miguvideo\.com|le\.com|1905\.com|fun\.tv');
|
||||
return flag.test(vipUrl);
|
||||
}
|
||||
function urlDeal(vipUrl){
|
||||
if(!vipUrl){
|
||||
return ''
|
||||
}
|
||||
if(!是否正版(vipUrl)){
|
||||
return vipUrl
|
||||
}
|
||||
if(!/miguvideo/.test(vipUrl)){
|
||||
vipUrl=vipUrl.split('#')[0].split('?')[0];
|
||||
}
|
||||
return vipUrl
|
||||
}
|
||||
function setResult(d){
|
||||
if(!Array.isArray(d)){
|
||||
return []
|
||||
}
|
||||
d.forEach(function (it){
|
||||
let obj = {
|
||||
vod_id:it.url||'',
|
||||
vod_name: it.title||'',
|
||||
vod_remarks: it.desc||'',
|
||||
vod_content: it.content||'',
|
||||
vod_pic: it.pic_url||it.img||'',
|
||||
};
|
||||
let keys = Object.keys(it);
|
||||
if(keys.includes('tname')){
|
||||
obj.type_name = it.tname||'';
|
||||
}
|
||||
if(keys.includes('tid')){
|
||||
obj.type_id = it.tid||'';
|
||||
}
|
||||
if(keys.includes('year')){
|
||||
obj.vod_year = it.year||'';
|
||||
}
|
||||
if(keys.includes('actor')){
|
||||
obj.vod_actor = it.actor||'';
|
||||
}
|
||||
if(keys.includes('director')){
|
||||
obj.vod_director = it.director||'';
|
||||
}
|
||||
if(keys.includes('area')){
|
||||
obj.vod_area = it.area||'';
|
||||
}
|
||||
VODS.push(obj);
|
||||
});
|
||||
return VODS
|
||||
}
|
||||
function setResult2(res){
|
||||
VODS = res.list||[];
|
||||
return VODS
|
||||
}
|
||||
function setHomeResult(res){
|
||||
if(!res||typeof(res)!=='object'){
|
||||
return []
|
||||
}
|
||||
return setResult(res.list);
|
||||
}
|
||||
// 千万不要用for in 推荐 forEach (for in 会打乱顺序)
|
||||
//猫函数
|
||||
function maoss(jxurl, ref, key) {
|
||||
eval(getCryptoJS());
|
||||
try {
|
||||
var getVideoInfo = function (text) {
|
||||
return CryptoJS.AES.decrypt(text, key, {iv: iv, padding: CryptoJS.pad.Pkcs7}).toString(CryptoJS.enc.Utf8);
|
||||
};
|
||||
var token_key = key == undefined ? 'dvyYRQlnPRCMdQSe' : key;
|
||||
if (ref) {
|
||||
var html = request(jxurl, {
|
||||
headers: {
|
||||
'Referer': ref
|
||||
}
|
||||
});
|
||||
} else {
|
||||
var html = request(jxurl);
|
||||
}
|
||||
// print(html);
|
||||
if (html.indexOf('&btwaf=') != -1) {
|
||||
html = request(jxurl + '&btwaf' + html.match(/&btwaf(.*?)"/)[1], {
|
||||
headers: {
|
||||
'Referer': ref
|
||||
}
|
||||
})
|
||||
}
|
||||
var token_iv = html.split('_token = "')[1].split('"')[0];
|
||||
var key = CryptoJS.enc.Utf8.parse(token_key);
|
||||
var iv = CryptoJS.enc.Utf8.parse(token_iv);
|
||||
// log("iv:"+iv);
|
||||
// log(html);
|
||||
// print(key);
|
||||
// print(iv);
|
||||
eval(html.match(/var config = {[\s\S]*?}/)[0] + '');
|
||||
// config.url = config.url.replace(/,/g,'');
|
||||
// print(config.url);
|
||||
if (!config.url.startsWith('http')) {
|
||||
//config.url = decodeURIComponent(AES(config.url, key, iv));
|
||||
config.url = CryptoJS.AES.decrypt(config.url, key, {
|
||||
iv: iv,
|
||||
padding: CryptoJS.pad.Pkcs7
|
||||
}).toString(CryptoJS.enc.Utf8)
|
||||
}
|
||||
return config.url;
|
||||
} catch (e) {
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
function request(url,obj){
|
||||
// obj = obj||{'user-agent': MOBILE_UA};
|
||||
let new_obj;
|
||||
if(typeof(fetch_params)!=='undefined'){
|
||||
new_obj = obj?Object.assign(fetch_params,obj):fetch_params;
|
||||
}else{
|
||||
new_obj = obj||{}
|
||||
}
|
||||
if(!new_obj||!new_obj.headers||(!new_obj.headers['User-Agent']&&!new_obj.headers['user-agent'])){
|
||||
new_obj.headers['User-Agent'] = MOBILE_UA;
|
||||
}
|
||||
// delete new_obj.headers['Referer'];
|
||||
// print(obj);
|
||||
// print(new_obj);
|
||||
if(typeof(fetch)!==undefined){
|
||||
let html = fetch(url,new_obj);
|
||||
if (/\?btwaf=/.test(html)) {//宝塔验证
|
||||
url=url.split('#')[0]+'?btwaf'+html.match(/btwaf(.*?)\"/)[1];
|
||||
log("宝塔验证跳转到:"+url);
|
||||
html = fetch(url, new_obj);
|
||||
}
|
||||
return html
|
||||
}
|
||||
return ''
|
||||
}
|
||||
|
||||
function rc(url){// 系统已经有require方法了,再覆盖的话无法操作了
|
||||
res = eval(requireObj(url));
|
||||
// print(res);
|
||||
return res;
|
||||
// return eval.call(null, requireObj(url));
|
||||
}
|
||||
|
||||
$.require = rc;
|
||||
|
||||
function urlencode (str) {
|
||||
str = (str + '').toString();
|
||||
|
||||
return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').
|
||||
replace(/\)/g, '%29').replace(/\*/g, '%2A').replace(/%20/g, '+');
|
||||
}
|
17
EXT/LIB/searchFilter.js
Normal file
17
EXT/LIB/searchFilter.js
Normal file
@ -0,0 +1,17 @@
|
||||
function searchContains(key,result){
|
||||
let keys = key.split(' ').filter(it=>it.trim());
|
||||
let search_ok = true;
|
||||
for(let i=0;i<keys.length;i++){
|
||||
if(!result.toLowerCase().includes(keys[i].toLowerCase())){
|
||||
search_ok = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return search_ok
|
||||
}
|
||||
|
||||
searchContains('奥斯卡 2021','2021奥斯卡最佳男主'); // true
|
||||
searchContains('奥斯卡 2021','2021奥斯卡最佳男主'); // true
|
||||
searchContains('奥斯卡2021','2021奥斯卡最佳男主'); // false
|
||||
searchContains('奥斯卡','2021奥斯卡最佳男主'); // true
|
||||
searchContains('nhk 沸腾','NHK纪录片沸腾都市'); // true
|
178
EXT/LIB/sortName.js
Normal file
178
EXT/LIB/sortName.js
Normal file
File diff suppressed because one or more lines are too long
5
EXT/LIB/underscore-esm-min.js
vendored
Normal file
5
EXT/LIB/underscore-esm-min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
EXT/LIB/uri.min.js
vendored
Normal file
1
EXT/LIB/uri.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
158
EXT/LIB/util.ym.js
Normal file
158
EXT/LIB/util.ym.js
Normal file
@ -0,0 +1,158 @@
|
||||
import 'assets://js/lib/uri.min.js'
|
||||
import cheerio from 'assets://js/lib/cheerio.min.js';
|
||||
import 'assets://js/lib/crypto-js.js'
|
||||
|
||||
var charStr = 'abacdefghjklmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ0123456789';
|
||||
export function randIndex(min, max, i) {
|
||||
let index = Math.floor(Math.random() * (max - min + 1) + min),
|
||||
numStart = charStr.length - 10;
|
||||
if (i == 0 && index >= numStart) {
|
||||
index = randIndex(min, max, i);
|
||||
}
|
||||
return index;
|
||||
}
|
||||
|
||||
export function randomStr(len) {
|
||||
let min = 0, max = charStr.length - 1, _str = '';
|
||||
len = len || 15;
|
||||
for (var i = 0, index; i < len; i++) {
|
||||
index = randIndex(min, max, i);
|
||||
_str += charStr[index];
|
||||
}
|
||||
return _str;
|
||||
}
|
||||
|
||||
export function urljoin(base, url) {
|
||||
base = base || '';
|
||||
url = url || '';
|
||||
let baseU = new Uri(base.trim().rstrip('/'));
|
||||
url = url.trim().rstrip('/');
|
||||
let u = undefined;
|
||||
if (url.startsWith('http://') || url.startsWith('https://')) {
|
||||
u = new Uri(url);
|
||||
} else if (url.startsWith('://')) {
|
||||
u = new Uri(baseU.protocol() + url);
|
||||
} else if (url.startsWith('//')) {
|
||||
u = new Uri(baseU.protocol() + ':' + url);
|
||||
} else {
|
||||
u = new Uri(baseU.protocol() + '://' + baseU.host() + (baseU.port() ? ':' + baseU.port() : '') + '/' + url);
|
||||
}
|
||||
if ((!u.path() || u.path().trim().length === 0) && baseU.path())
|
||||
u.path(baseU.path());
|
||||
if (!u.query() && baseU.query())
|
||||
u.query(baseU.query());
|
||||
return u.toString();
|
||||
}
|
||||
|
||||
const DOM_CHECK_ATTR = /(url|src|href|data-original|data-src)$/;
|
||||
const SELECT_REGEX = /:eq|:lt|:gt|#/g;
|
||||
const SELECT_REGEX_A = /:eq|:lt|:gt/g;
|
||||
|
||||
export function pdfh(html, parse, base_url) {
|
||||
if (!parse || !parse.trim()) {
|
||||
return ''
|
||||
}
|
||||
let eleFind = typeof html === 'object';
|
||||
let option = undefined;
|
||||
if (eleFind && parse.startsWith('body&&')) {
|
||||
parse = parse.substr(6);
|
||||
if (parse.indexOf('&&') < 0) {
|
||||
option = parse.trim();
|
||||
parse = '*=*';
|
||||
}
|
||||
}
|
||||
if (parse.indexOf('&&') > -1) {
|
||||
let sp = parse.split('&&');
|
||||
option = sp[sp.length - 1];
|
||||
sp.splice(sp.length - 1);
|
||||
if (sp.length > 1) {
|
||||
for (let i in sp) {
|
||||
if (!SELECT_REGEX.test(sp[i])) {
|
||||
sp[i] = sp[i] + ':eq(0)';
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (!SELECT_REGEX.test(sp[0])) {
|
||||
sp[0] = sp[0] + ':eq(0)';
|
||||
}
|
||||
}
|
||||
parse = sp.join(' ');
|
||||
}
|
||||
let result = '';
|
||||
const $ = eleFind ? html.rr : cheerio.load(html);
|
||||
let ret = eleFind ? ((parse === '*=*' || $(html.ele).is(parse)) ? html.ele : $(html.ele).find(parse)) : $(parse);
|
||||
if (option) {
|
||||
if (option === 'Text') {
|
||||
result = $(ret).text();
|
||||
}
|
||||
else if (option === 'Html') {
|
||||
result = $(ret).html();
|
||||
}
|
||||
else {
|
||||
result = $(ret).attr(option);
|
||||
}
|
||||
if (result && base_url && DOM_CHECK_ATTR.test(option)) {
|
||||
if (/http/.test(result)) {
|
||||
result = result.substr(result.indexOf('http'));
|
||||
} else {
|
||||
result = urljoin(base_url, result)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
result = $(ret).toString();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
export function pdfa(html, parse) {
|
||||
if (!parse || !parse.trim()) {
|
||||
return [];
|
||||
}
|
||||
let eleFind = typeof html === 'object';
|
||||
if (parse.indexOf('&&') > -1) {
|
||||
let sp = parse.split('&&');
|
||||
for (let i in sp) {
|
||||
if (!SELECT_REGEX_A.test(sp[i]) && i < sp.length - 1) {
|
||||
sp[i] = sp[i] + ':eq(0)';
|
||||
}
|
||||
}
|
||||
parse = sp.join(' ');
|
||||
}
|
||||
const $ = eleFind ? html.rr : cheerio.load(html);
|
||||
let ret = eleFind ? ($(html.ele).is(parse) ? html.ele : $(html.ele).find(parse)) : $(parse);
|
||||
let result = [];
|
||||
if (ret) {
|
||||
ret.each(function (idx, ele) {
|
||||
result.push({ rr: $, ele: ele });
|
||||
});
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
const defaultParser = {
|
||||
pdfh:pdfh,
|
||||
pdfa:pdfa,
|
||||
pd(html,parse,uri){
|
||||
let ret = this.pdfh(html,parse);
|
||||
if(typeof(uri)==='undefined'||!uri){
|
||||
uri = '';
|
||||
}
|
||||
if(DOM_CHECK_ATTR.test(parse)){
|
||||
if(/http/.test(ret)){
|
||||
ret = ret.substr(ret.indexOf('http'));
|
||||
}else{
|
||||
ret = urljoin(MY_URL,ret)
|
||||
}
|
||||
}
|
||||
return ret
|
||||
},
|
||||
};
|
||||
|
||||
globalThis.randIndex = randIndex;
|
||||
globalThis.randomStr = randomStr;
|
||||
globalThis.urljoin = urljoin;
|
||||
globalThis.joinUrl = urljoin;
|
||||
globalThis.defaultParser = defaultParser;
|
||||
globalThis.pdfa = defaultParser.pdfa;
|
||||
globalThis.pdfh = defaultParser.pdfh;
|
||||
globalThis.pd = defaultParser.pd;
|
274
EXT/LIB/模板.js
Normal file
274
EXT/LIB/模板.js
Normal file
@ -0,0 +1,274 @@
|
||||
if (typeof Object.assign != 'function') {
|
||||
Object.assign = function () {
|
||||
var target = arguments[0];
|
||||
for (var i = 1; i < arguments.length; i++) {
|
||||
var source = arguments[i];
|
||||
for (var key in source) {
|
||||
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
||||
target[key] = source[key];
|
||||
}
|
||||
}
|
||||
}
|
||||
return target;
|
||||
};
|
||||
}
|
||||
function getMubans() {
|
||||
var mubanDict = { // 模板字典
|
||||
mxpro: {
|
||||
title: '',
|
||||
host: '',
|
||||
// homeUrl:'/',
|
||||
url: '/vodshow/fyclass--------fypage---.html',
|
||||
searchUrl: '/vodsearch/**----------fypage---.html',
|
||||
searchable: 2,//是否启用全局搜索,
|
||||
quickSearch: 0,//是否启用快速搜索,
|
||||
filterable: 0,//是否启用分类筛选,
|
||||
headers: {//网站的请求头,完整支持所有的,常带ua和cookies
|
||||
'User-Agent': 'MOBILE_UA',
|
||||
// "Cookie": "searchneed=ok"
|
||||
},
|
||||
class_parse: '.navbar-items li:gt(2):lt(8);a&&Text;a&&href;/(\\d+).html',
|
||||
play_parse: true,
|
||||
lazy: '',
|
||||
limit: 6,
|
||||
推荐: '.tab-list.active;a.module-poster-item.module-item;.module-poster-item-title&&Text;.lazyload&&data-original;.module-item-note&&Text;a&&href',
|
||||
double: true, // 推荐内容是否双层定位
|
||||
一级: 'body a.module-poster-item.module-item;a&&title;.lazyload&&data-original;.module-item-note&&Text;a&&href',
|
||||
二级: {
|
||||
"title": "h1&&Text;.module-info-tag&&Text",
|
||||
"img": ".lazyload&&data-original",
|
||||
"desc": ".module-info-item:eq(1)&&Text;.module-info-item:eq(2)&&Text;.module-info-item:eq(3)&&Text",
|
||||
"content": ".module-info-introduction&&Text",
|
||||
"tabs": ".module-tab-item",
|
||||
"lists": ".module-play-list:eq(#id) a"
|
||||
},
|
||||
搜索: 'body .module-item;.module-card-item-title&&Text;.lazyload&&data-original;.module-item-note&&Text;a&&href;.module-info-item-content&&Text',
|
||||
},
|
||||
mxone5: {
|
||||
title: '',
|
||||
host: '',
|
||||
url: '/show/fyclass--------fypage---.html',
|
||||
searchUrl: '/search/**----------fypage---.html',
|
||||
searchable: 2,//是否启用全局搜索,
|
||||
quickSearch: 0,//是否启用快速搜索,
|
||||
filterable: 0,//是否启用分类筛选,
|
||||
class_parse: '.nav-menu-items&&li;a&&Text;a&&href;.*/(.*?).html',
|
||||
play_parse: true,
|
||||
lazy: '',
|
||||
limit: 6,
|
||||
推荐: '.module-list;.module-items&&.module-item;a&&title;img&&data-src;.module-item-text&&Text;a&&href',
|
||||
double: true, // 推荐内容是否双层定位
|
||||
一级: '.module-items .module-item;a&&title;img&&data-src;.module-item-text&&Text;a&&href',
|
||||
二级: {
|
||||
"title": "h1&&Text;.tag-link&&Text",
|
||||
"img": ".module-item-pic&&img&&data-src",
|
||||
"desc": ".video-info-items:eq(0)&&Text;.video-info-items:eq(1)&&Text;.video-info-items:eq(2)&&Text;.video-info-items:eq(3)&&Text",
|
||||
"content": ".vod_content&&Text",
|
||||
"tabs": ".module-tab-item",
|
||||
"lists": ".module-player-list:eq(#id)&&.scroll-content&&a"
|
||||
},
|
||||
搜索: '.module-items .module-search-item;a&&title;img&&data-src;.video-serial&&Text;a&&href',
|
||||
},
|
||||
首图: {
|
||||
title: '',
|
||||
host: '',
|
||||
url: '/vodshow/fyclass--------fypage---/',
|
||||
searchUrl: '/vodsearch/**----------fypage---.html',
|
||||
searchable: 2,//是否启用全局搜索,
|
||||
quickSearch: 0,//是否启用快速搜索,
|
||||
filterable: 0,//是否启用分类筛选,
|
||||
headers: {//网站的请求头,完整支持所有的,常带ua和cookies
|
||||
'User-Agent': 'MOBILE_UA',
|
||||
// "Cookie": "searchneed=ok"
|
||||
},
|
||||
class_parse: '.myui-header__menu li.hidden-sm:gt(0):lt(5);a&&Text;a&&href;/(\\d+).html',
|
||||
play_parse: true,
|
||||
lazy: '',
|
||||
limit: 6,
|
||||
推荐: 'ul.myui-vodlist.clearfix;li;a&&title;a&&data-original;.pic-text&&Text;a&&href',
|
||||
double: true, // 推荐内容是否双层定位
|
||||
一级: '.myui-vodlist li;a&&title;a&&data-original;.pic-text&&Text;a&&href',
|
||||
二级: {
|
||||
"title": ".myui-content__detail .title&&Text;.myui-content__detail p:eq(-2)&&Text",
|
||||
"img": ".myui-content__thumb .lazyload&&data-original",
|
||||
"desc": ".myui-content__detail p:eq(0)&&Text;.myui-content__detail p:eq(1)&&Text;.myui-content__detail p:eq(2)&&Text",
|
||||
"content": ".content&&Text",
|
||||
"tabs": ".nav-tabs:eq(0) li",
|
||||
"lists": ".myui-content__list:eq(#id) li"
|
||||
},
|
||||
搜索: '#searchList li;a&&title;.lazyload&&data-original;.text-muted&&Text;a&&href;.text-muted:eq(-1)&&Text',
|
||||
},
|
||||
首图2: {
|
||||
title: '',
|
||||
host: '',
|
||||
url: '/list/fyclass-fypage.html',
|
||||
searchUrl: '/vodsearch/**----------fypage---.html',
|
||||
searchable: 2,//是否启用全局搜索,
|
||||
quickSearch: 0,//是否启用快速搜索,
|
||||
filterable: 0,//是否启用分类筛选,
|
||||
headers: {
|
||||
'User-Agent': 'UC_UA',
|
||||
// "Cookie": ""
|
||||
},
|
||||
// class_parse:'.stui-header__menu li:gt(0):lt(7);a&&Text;a&&href;/(\\d+).html',
|
||||
class_parse: '.stui-header__menu li:gt(0):lt(7);a&&Text;a&&href;.*/(.*?).html',
|
||||
play_parse: true,
|
||||
lazy: '',
|
||||
limit: 6,
|
||||
推荐: 'ul.stui-vodlist.clearfix;li;a&&title;.lazyload&&data-original;.pic-text&&Text;a&&href',
|
||||
double: true, // 推荐内容是否双层定位
|
||||
一级: '.stui-vodlist li;a&&title;a&&data-original;.pic-text&&Text;a&&href',
|
||||
二级: {
|
||||
"title": ".stui-content__detail .title&&Text;.stui-content__detail p:eq(-2)&&Text",
|
||||
"img": ".stui-content__thumb .lazyload&&data-original",
|
||||
"desc": ".stui-content__detail p:eq(0)&&Text;.stui-content__detail p:eq(1)&&Text;.stui-content__detail p:eq(2)&&Text",
|
||||
"content": ".detail&&Text",
|
||||
"tabs": ".stui-vodlist__head h3",
|
||||
"lists": ".stui-content__playlist:eq(#id) li"
|
||||
},
|
||||
搜索: 'ul.stui-vodlist__media:eq(0) li,ul.stui-vodlist:eq(0) li,#searchList li;a&&title;.lazyload&&data-original;.text-muted&&Text;a&&href;.text-muted:eq(-1)&&Text',
|
||||
搜索1: 'ul.stui-vodlist&&li;a&&title;.lazyload&&data-original;.text-muted&&Text;a&&href;.text-muted:eq(-1)&&Text',
|
||||
搜索2: 'ul.stui-vodlist__media&&li;a&&title;.lazyload&&data-original;.text-muted&&Text;a&&href;.text-muted:eq(-1)&&Text',
|
||||
},
|
||||
默认: {
|
||||
title: '',
|
||||
host: '',
|
||||
url: '/vodshow/fyclass--------fypage---.html',
|
||||
searchUrl: '/vodsearch/-------------.html?wd=**',
|
||||
searchable: 2,//是否启用全局搜索,
|
||||
quickSearch: 0,//是否启用快速搜索,
|
||||
filterable: 0,//是否启用分类筛选,
|
||||
headers: {
|
||||
'User-Agent': 'MOBILE_UA',
|
||||
},
|
||||
play_parse: true,
|
||||
lazy: '',
|
||||
limit: 6,
|
||||
double: true, // 推荐内容是否双层定位
|
||||
},
|
||||
vfed: {
|
||||
title: '',
|
||||
host: '',
|
||||
url: '/index.php/vod/show/id/fyclass/page/fypage.html',
|
||||
searchUrl: '/index.php/vod/search/page/fypage/wd/**.html',
|
||||
searchable: 2,//是否启用全局搜索,
|
||||
quickSearch: 0,//是否启用快速搜索,
|
||||
filterable: 0,//是否启用分类筛选,
|
||||
headers: {
|
||||
'User-Agent': 'UC_UA',
|
||||
},
|
||||
// class_parse:'.fed-pops-navbar&&ul.fed-part-rows&&a.fed-part-eone:gt(0):lt(5);a&&Text;a&&href;.*/(.*?).html',
|
||||
class_parse: '.fed-pops-navbar&&ul.fed-part-rows&&a;a&&Text;a&&href;.*/(.*?).html',
|
||||
play_parse: true,
|
||||
lazy: '',
|
||||
limit: 6,
|
||||
推荐: 'ul.fed-list-info.fed-part-rows;li;a.fed-list-title&&Text;a&&data-original;.fed-list-remarks&&Text;a&&href',
|
||||
double: true, // 推荐内容是否双层定位
|
||||
一级: '.fed-list-info&&li;a.fed-list-title&&Text;a&&data-original;.fed-list-remarks&&Text;a&&href',
|
||||
二级: {
|
||||
"title": "h1.fed-part-eone&&Text;.fed-deta-content&&.fed-part-rows&&li&&Text",
|
||||
"img": ".fed-list-info&&a&&data-original",
|
||||
"desc": ".fed-deta-content&&.fed-part-rows&&li:eq(1)&&Text;.fed-deta-content&&.fed-part-rows&&li:eq(2)&&Text;.fed-deta-content&&.fed-part-rows&&li:eq(3)&&Text",
|
||||
"content": ".fed-part-esan&&Text",
|
||||
"tabs": ".fed-drop-boxs&&.fed-part-rows&&li",
|
||||
"lists": ".fed-play-item:eq(#id)&&ul:eq(1)&&li"
|
||||
},
|
||||
搜索: '.fed-deta-info;h1&&Text;.lazyload&&data-original;.fed-list-remarks&&Text;a&&href;.fed-deta-content&&Text',
|
||||
},
|
||||
海螺3: {
|
||||
title: '',
|
||||
host: '',
|
||||
searchUrl: '/v_search/**----------fypage---.html',
|
||||
url: '/vod_____show/fyclass--------fypage---.html',
|
||||
headers: {
|
||||
'User-Agent': 'MOBILE_UA'
|
||||
},
|
||||
timeout: 5000,
|
||||
class_parse: 'body&&.hl-nav li:gt(0);a&&Text;a&&href;.*/(.*?).html',
|
||||
cate_exclude: '明星|专题|最新|排行',
|
||||
limit: 40,
|
||||
play_parse: true,
|
||||
lazy: '',
|
||||
推荐: '.hl-vod-list;li;a&&title;a&&data-original;.remarks&&Text;a&&href',
|
||||
double: true,
|
||||
一级: '.hl-vod-list&&.hl-list-item;a&&title;a&&data-original;.remarks&&Text;a&&href',
|
||||
二级: {
|
||||
"title": ".hl-infos-title&&Text;.hl-text-conch&&Text",
|
||||
"img": ".hl-lazy&&data-original",
|
||||
"desc": ".hl-infos-content&&.hl-text-conch&&Text",
|
||||
"content": ".hl-content-text&&Text",
|
||||
"tabs": ".hl-tabs&&a",
|
||||
"lists": ".hl-plays-list:eq(#id)&&li"
|
||||
},
|
||||
搜索: '.hl-list-item;a&&title;a&&data-original;.remarks&&Text;a&&href',
|
||||
searchable: 2,//是否启用全局搜索,
|
||||
quickSearch: 0,//是否启用快速搜索,
|
||||
filterable: 0,//是否启用分类筛选,
|
||||
},
|
||||
海螺2: {
|
||||
title: '',
|
||||
host: '',
|
||||
searchUrl: '/index.php/vod/search/page/fypage/wd/**/',
|
||||
url: '/index.php/vod/show/id/fyclass/page/fypage/',
|
||||
headers: {
|
||||
'User-Agent': 'MOBILE_UA'
|
||||
},
|
||||
timeout: 5000,
|
||||
class_parse: '#nav-bar li;a&&Text;a&&href;id/(.*?)/',
|
||||
limit: 40,
|
||||
play_parse: true,
|
||||
lazy: '',
|
||||
推荐: '.list-a.size;li;a&&title;.lazy&&data-original;.bt&&Text;a&&href',
|
||||
double: true,
|
||||
一级: '.list-a&&li;a&&title;.lazy&&data-original;.list-remarks&&Text;a&&href',
|
||||
二级: {
|
||||
"title": "h2&&Text;.deployment&&Text",
|
||||
"img": ".lazy&&data-original",
|
||||
"desc": ".deployment&&Text",
|
||||
"content": ".ec-show&&Text",
|
||||
"tabs": "#tag&&a",
|
||||
"lists": ".play_list_box:eq(#id)&&li"
|
||||
},
|
||||
搜索: '.search-list;a&&title;.lazy&&data-original;.deployment&&Text;a&&href',
|
||||
searchable: 2,//是否启用全局搜索,
|
||||
quickSearch: 0,//是否启用快速搜索,
|
||||
filterable: 0,//是否启用分类筛选,
|
||||
},
|
||||
短视: {
|
||||
title: '',
|
||||
host: '',
|
||||
// homeUrl:'/',
|
||||
url: '/channel/fyclass-fypage.html',
|
||||
searchUrl: '/search.html?wd=**',
|
||||
searchable: 2,//是否启用全局搜索,
|
||||
quickSearch: 0,//是否启用快速搜索,
|
||||
filterable: 0,//是否启用分类筛选,
|
||||
headers: {//网站的请求头,完整支持所有的,常带ua和cookies
|
||||
'User-Agent': 'MOBILE_UA',
|
||||
// "Cookie": "searchneed=ok"
|
||||
},
|
||||
class_parse: '.menu_bottom ul li;a&&Text;a&&href;.*/(.*?).html',
|
||||
cate_exclude: '解析|动态',
|
||||
play_parse: true,
|
||||
lazy: '',
|
||||
limit: 6,
|
||||
推荐: '.indexShowBox;ul&&li;a&&title;img&&data-src;.s1&&Text;a&&href',
|
||||
double: true, // 推荐内容是否双层定位
|
||||
一级: '.pic-list&&li;a&&title;img&&data-src;.s1&&Text;a&&href',
|
||||
二级: {
|
||||
"title": "h1&&Text;.content-rt&&p:eq(0)&&Text",
|
||||
"img": ".img&&img&&data-src",
|
||||
"desc": ".content-rt&&p:eq(1)&&Text;.content-rt&&p:eq(2)&&Text;.content-rt&&p:eq(3)&&Text;.content-rt&&p:eq(4)&&Text;.content-rt&&p:eq(5)&&Text",
|
||||
"content": ".zkjj_a&&Text",
|
||||
"tabs": ".py-tabs&&option",
|
||||
"lists": ".player:eq(#id) li"
|
||||
},
|
||||
搜索: '.sr_lists&&ul&&li;h3&&Text;img&&data-src;.int&&p:eq(0)&&Text;a&&href',
|
||||
}
|
||||
|
||||
};
|
||||
return JSON.parse(JSON.stringify(mubanDict));
|
||||
}
|
||||
var mubanDict = getMubans();
|
||||
var muban = getMubans();
|
||||
export default {muban,getMubans};
|
1
EXT/LIB/直播转点播.js
Normal file
1
EXT/LIB/直播转点播.js
Normal file
File diff suppressed because one or more lines are too long
69
EXT/XB/1080Kkk.json
Normal file
69
EXT/XB/1080Kkk.json
Normal file
@ -0,0 +1,69 @@
|
||||
{
|
||||
"name": "1080Kkk",
|
||||
"url": "https://www.1080kkk.com",
|
||||
"User": "空",
|
||||
"shouye": "1",
|
||||
//"fenlei": "电影$/dy/1/page/#电视剧$/dy/2/page/#综艺$/dy/3/page/#动漫$/dy/4/page/#国产剧$/ys/13-----------/page/#韩剧$/ys/24-----------/page/#日剧$/ys/22-----------/page/#美剧$/ys/16-----------/page/#港剧$/ys/14-----------/page/#台剧$/ys/15-----------/page/#海外剧$/ys/23-----------/page/#动作片$/ys/6-----------/page/#喜剧片$/ys/7-----------/page/#爱情片$/ys/8-----------/page/#科幻片$/ys/9-----------/page/#恐怖片$/ys/10-----------/page/犯罪片$/ys/11-----------/page/#战争片$/ys/12-----------/page/#剧情片$/ys/21-----------/page/#记录片$/ys/29-----------/page/动画电影$/ys/20-----------/page/#国产动漫$/ys/25-----------/page/#日本动漫$/ys/26-----------/page/#欧美动漫$/ys/27-----------/page/",
|
||||
"fenlei": "电影$/ys/1--------#电视剧$/ys/2--------#综艺$/ys/3--------#动漫$/ys/4--------#动画片$/ys/1---动画-----#记录片$/ys/1---记录-----#国产剧$/ys/2----国语----#韩剧$/ys/2----韩语----#日剧$/ys/2----日语----#美剧$/ys/2----英语----#港剧$/ys/2----粤语----#喜剧片$/ys/1---喜剧-----#爱情片$/ys/1---爱情-----#恐怖片$/ys/1---恐怖-----#动作片$/ys/1---动作-----#科幻片$/ys/1---科幻-----#剧情片$/ys/1---剧情-----#战争片$/ys/1---战争-----#警匪片$/ys/1---警匪-----#犯罪片$/ys/1---犯罪-----#奇幻$/ys/1---奇幻-----#武侠$/ys/1---武侠-----#冒险$/ys/1---冒险-----",
|
||||
"houzhui": "---.html",
|
||||
|
||||
"shifouercijiequ": "0",
|
||||
"jiequqian": "空",
|
||||
"jiequhou": "空",
|
||||
"jiequshuzuqian": "lazyload\"",
|
||||
"jiequshuzuhou": "</a>",
|
||||
"tupianqian": "data-original=\"",
|
||||
"tupianhou": "\"",
|
||||
"biaotiqian": "title=\"",
|
||||
"biaotihou": "\"",
|
||||
"lianjieqian": "href=\"",
|
||||
"lianjiehou": "\"",
|
||||
|
||||
//新版Biubiu参数:副标题 (不需要的话,就不填写或者删除副标题2个字段也可以。)
|
||||
"fubiaotiqian": "text-right\">",
|
||||
"fubiaotihou": "</span",
|
||||
|
||||
"sousuoqian": "/index.php/ajax/suggest?mid=1&wd=",
|
||||
"sousuohou": "&limit=500",
|
||||
"sousuohouzhui": "/1080p/",
|
||||
"ssmoshi": "0",
|
||||
"sousuoshifouercijiequ": "0",
|
||||
"jspic": "pic",
|
||||
"jsname": "name",
|
||||
"jsid": "id",
|
||||
"ssjiequqian": "空",
|
||||
"ssjiequhou": "空",
|
||||
"ssjiequshuzuqian": "空",
|
||||
"ssjiequshuzuhou": "空",
|
||||
"sstupianqian": "空",
|
||||
"sstupianhou": "空",
|
||||
"ssbiaotiqian": "空",
|
||||
"ssbiaotihou": "空",
|
||||
"sslianjieqian": "空",
|
||||
"sslianjiehou": "空",
|
||||
|
||||
"bfshifouercijiequ": "0",
|
||||
"bfjiequqian": "空",
|
||||
"bfjiequhou": "空",
|
||||
"bfjiequshuzuqian": "class=\"stui-content__playlist",
|
||||
"bfjiequshuzuhou": "</ul>",
|
||||
|
||||
"zhuangtaiqian": "更新:</span>",
|
||||
"zhuangtaihou": "</p>",
|
||||
"daoyanqian": "导演:</span>",
|
||||
"daoyanhou": "</p>",
|
||||
"zhuyanqian": "主演:</span>",
|
||||
"zhuyanhou": "</p>",
|
||||
"juqingqian": "简介:</span>",
|
||||
"juqinghou": "<a",
|
||||
|
||||
"bfyshifouercijiequ": "0",
|
||||
"bfyjiequqian": "空",
|
||||
"bfyjiequhou": "空",
|
||||
"bfyjiequshuzuqian": "<a",
|
||||
"bfyjiequshuzuhou": "/a>",
|
||||
"bfbiaotiqian": ">",
|
||||
"bfbiaotihou": "<",
|
||||
"bflianjieqian": "href=\"",
|
||||
"bflianjiehou": "\""
|
||||
}
|
60
EXT/XB/139影视.json
Normal file
60
EXT/XB/139影视.json
Normal file
@ -0,0 +1,60 @@
|
||||
{
|
||||
"name": "139影视",
|
||||
"url": "https://www.139ys.com",
|
||||
"tihuan": "cnzz.com",
|
||||
"User": "空",
|
||||
"shouye": "1",
|
||||
"fenlei": "电影$/vodshow/dianying--------#连续剧$/vodshow/lianxuju--------#综艺$/vodshow/zongyi--------#动漫$/vodshow/dongman--------#国产剧$/vodshow/guochanju--------#港台剧$/vodshow/gangtaiju--------#日韩剧$/vodshow/rihanju--------#欧美剧$/vodshow/oumeiju--------",
|
||||
"houzhui": "---.html",
|
||||
"shifouercijiequ": "0",
|
||||
"jiequqian": "空",
|
||||
"jiequhou": "空",
|
||||
"jiequshuzuqian": "class=\"myui-vodlist__box",
|
||||
"jiequshuzuhou": "</div>",
|
||||
"tupianqian": "data-original=\"",
|
||||
"tupianhou": "\"",
|
||||
"biaotiqian": "title=\"",
|
||||
"biaotihou": "\"",
|
||||
"lianjieqian": "href=\"",
|
||||
"lianjiehou": "\"",
|
||||
"sousuoqian": "/index.php/ajax/suggest?mid=1&wd=",
|
||||
"sousuohou": "&limit=500",
|
||||
"sousuohouzhui": "/voddetail/",
|
||||
"ssmoshi": "0",
|
||||
"sousuoshifouercijiequ": "0",
|
||||
"jspic": "pic",
|
||||
"jsname": "name",
|
||||
"jsid": "id",
|
||||
"ssjiequqian": "空",
|
||||
"ssjiequhou": "空",
|
||||
"ssjiequshuzuqian": "空",
|
||||
"ssjiequshuzuhou": "空",
|
||||
"sstupianqian": "空",
|
||||
"sstupianhou": "空",
|
||||
"ssbiaotiqian": "空",
|
||||
"ssbiaotihou": "空",
|
||||
"sslianjieqian": "空",
|
||||
"sslianjiehou": "空",
|
||||
"bfshifouercijiequ": "0",
|
||||
"bfjiequqian": "空",
|
||||
"bfjiequhou": "空",
|
||||
"bfjiequshuzuqian": "class=\"myui-content__list sort-list clearfix",
|
||||
"bfjiequshuzuhou": "</ul>",
|
||||
"zhuangtaiqian": "更新:",
|
||||
"zhuangtaihou": "</p>",
|
||||
"daoyanqian": "导演:",
|
||||
"daoyanhou": "</p>",
|
||||
"zhuyanqian": "主演:",
|
||||
"zhuyanhou": "</p>",
|
||||
"juqingqian": "简介:</span>",
|
||||
"juqinghou": "</p>",
|
||||
"bfyshifouercijiequ": "0",
|
||||
"bfyjiequqian": "空",
|
||||
"bfyjiequhou": "空",
|
||||
"bfyjiequshuzuqian": "<a",
|
||||
"bfyjiequshuzuhou": "/a>",
|
||||
"bfbiaotiqian": ">",
|
||||
"bfbiaotihou": "<",
|
||||
"bflianjieqian": "href=\"",
|
||||
"bflianjiehou": "\""
|
||||
}
|
68
EXT/XB/2345影视.json
Normal file
68
EXT/XB/2345影视.json
Normal file
@ -0,0 +1,68 @@
|
||||
{"name":"2345影视大全",
|
||||
"url": "https://www.245bt.com",
|
||||
"ua": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1",
|
||||
"User": "空",
|
||||
"直接播放": "0",
|
||||
"列表显示": "0",
|
||||
"横图显示": "0",
|
||||
"fenlei": "电视剧$/frim/2-#国产剧$/frim/16-#网络剧$/frim/17-#港剧$/frim/18-#台剧$/frim/19-#日剧$/frim/20-#韩剧$/frim/21-#美剧$/frim/22-#英剧$/frim/23-#泰剧$/frim/24-#海外剧$/frim/25-#电影$/frim/27-#动作片$/frim/5-#喜剧片$/frim/6-#爱情片$/frim/7-#科幻片$/frim/8-#恐怖片$/frim/9-#战争片$/frim/10-#剧情片$/frim/11-#纪录片$/frim/12-#动画片$/frim/13-#网络电影$/frim/14-#动漫$/frim/3-#综艺$/frim/4-",
|
||||
"houzhui": ".html",
|
||||
"qishiye": "1",
|
||||
"shifouercijiequ": "0",
|
||||
"jiequqian": "空",
|
||||
"jiequhou": "空",
|
||||
"jiequshuzuqian": "<li>",
|
||||
"jiequshuzuhou": "</li>",
|
||||
"tupianqian": "src=\"",
|
||||
"tupianhou": "\"",
|
||||
"biaotiqian": "title=\"",
|
||||
"biaotihou": "\"",
|
||||
"lianjieqian": "href=\"",
|
||||
"lianjiehou": "\"",
|
||||
"ljqianzhui": "空",
|
||||
"ljhouzhui": "空",
|
||||
"fubiaotiqian":"空",
|
||||
"fubiaotihou": "空",
|
||||
"sousuoqian": "/search.php?searchword=",
|
||||
"sousuohou": "",
|
||||
"sousuohouzhui": "/detail/",
|
||||
"ssmoshi": "1",
|
||||
"sousuoshifouercijiequ": "0",
|
||||
"jspic": "pic",
|
||||
"jsname": "name",
|
||||
"jsid": "id",
|
||||
"ssjiequqian": "空",
|
||||
"ssjiequhou": "空",
|
||||
"ssjiequshuzuqian": "class=\"box",
|
||||
"ssjiequshuzuhou": "</h5>",
|
||||
"sstupianqian": "src=\"",
|
||||
"sstupianhou": "\"",
|
||||
"ssbiaotiqian": "alt=\"",
|
||||
"ssbiaotihou": "\"",
|
||||
"sslianjieqian": "href=\"",
|
||||
"sslianjiehou": "\"",
|
||||
"ssljqianzhui":"https://www.245bt.com/detail/",
|
||||
"ssljhouzhui": ".html",
|
||||
"bfshifouercijiequ": "0",
|
||||
"bfjiequqian": "空",
|
||||
"bfjiequhou": "空",
|
||||
"bfjiequshuzuqian": "class=\"playlist",
|
||||
"bfjiequshuzuhou": "</ul>",
|
||||
"zhuangtaiqian": "</h1>",
|
||||
"zhuangtaihou": "<h5>",
|
||||
"daoyanqian": "导演:</span>",
|
||||
"daoyanhou": "</div>",
|
||||
"zhuyanqian": "主演:</span>",
|
||||
"zhuyanhou": "</div>",
|
||||
"juqingqian": "class=\"description\">",
|
||||
"juqinghou": "</div>",
|
||||
"bfyshifouercijiequ": "0",
|
||||
"bfyjiequqian": "空",
|
||||
"bfyjiequhou": "空",
|
||||
"bfyjiequshuzuqian": "<a",
|
||||
"bfyjiequshuzuhou": "/a>",
|
||||
"bfbiaotiqian": ">",
|
||||
"bfbiaotihou": "<",
|
||||
"bflianjieqian": "href=\"",
|
||||
"bflianjiehou": "\"",
|
||||
"bfqianzhui": ""}
|
71
EXT/XB/23影院.json
Normal file
71
EXT/XB/23影院.json
Normal file
@ -0,0 +1,71 @@
|
||||
// 修复分类、分类++
|
||||
{
|
||||
"name": "23影院",
|
||||
"url": "https://23wm.net",
|
||||
"User": "空",
|
||||
"shouye": "1",
|
||||
|
||||
"fenlei": "电影$/vodshow/id/1/page/#剧集$/vodshow/id/2/page/#综艺$/vodshow/id/3/page/#纪录片$/vodshow/id/20/page/#动漫$/vodshow/id/4/page/#亲子动漫$/vodshow/class/亲子/id/4/page/#益智动漫$/vodshow/class/益智/id/4/page/#国产剧$/vodshow/id/13/page/#港台剧$/vodshow/id/14/page/#日韩剧$/vodshow/id/15/page/#欧美剧$/vodshow/id/16/page/#泰国剧$/vodshow/id/25/page/#哔哩(剧)$/vodshow/id/39/page/#海外剧$/vodshow/id/51/page/#国产动漫$/vodshow/area/国产/id/4/page/#日本动漫$/vodshow/area/日本/id/4/page/#欧美动漫$/vodshow/area/欧美/id/4/page/#其他动漫$/vodshow/area/其他/id/4/page/#喜剧片$/vodshow/id/7/page/#爱情片$/vodshow/id/8/page/#科幻片$/vodshow/id/9/page/#恐怖片$/vodshow/id/10/page/#剧情片$/vodshow/id/11/page/#战争片$/vodshow/id/12/page/#动作片$/vodshow/id/6/page/#奇幻片$/vodshow/id/52/page/#犯罪片$/vodshow/id/53/page/#悬疑片$/vodshow/id/58/page/#冒险片$/vodshow/id/59/page/",
|
||||
"houzhui": "---.html",
|
||||
|
||||
"shifouercijiequ": "0",
|
||||
"jiequqian": "空",
|
||||
"jiequhou": "空",
|
||||
"jiequshuzuqian": "class=\"aplus-exp\"",
|
||||
"jiequshuzuhou": "</a>",
|
||||
"tupianqian": "data-original=\"",
|
||||
"tupianhou": "\"",
|
||||
"biaotiqian": "title=\"",
|
||||
//"biaotihou": "\"",
|
||||
"biaotihou": "23影视网",
|
||||
"lianjieqian": "href=\"",
|
||||
"lianjiehou": "\"",
|
||||
|
||||
//新版Biubiu参数:副标题 (不需要的话,就不填写或者删除副标题2个字段也可以。)
|
||||
"fubiaotiqian": "pack-prb\">",
|
||||
"fubiaotihou": "</span",
|
||||
|
||||
"sousuoqian": "/index.php/ajax/suggest?mid=1&wd=",
|
||||
"sousuohou": "&limit=500",
|
||||
"sousuohouzhui": "/voddetail/",
|
||||
"ssmoshi": "0",
|
||||
"sousuoshifouercijiequ": "0",
|
||||
"jspic": "pic",
|
||||
"jsname": "name",
|
||||
"jsid": "id",
|
||||
"ssjiequqian": "空",
|
||||
"ssjiequhou": "空",
|
||||
"ssjiequshuzuqian": "空",
|
||||
"ssjiequshuzuhou": "空",
|
||||
"sstupianqian": "空",
|
||||
"sstupianhou": "空",
|
||||
"ssbiaotiqian": "空",
|
||||
"ssbiaotihou": "空",
|
||||
"sslianjieqian": "空",
|
||||
"sslianjiehou": "空",
|
||||
|
||||
"bfshifouercijiequ": "0",
|
||||
"bfjiequqian": "空",
|
||||
"bfjiequhou": "空",
|
||||
"bfjiequshuzuqian": "class=\"content_playlist",
|
||||
"bfjiequshuzuhou": "</ul>",
|
||||
|
||||
"zhuangtaiqian": "remarks\">",
|
||||
"zhuangtaihou": "</span",
|
||||
"daoyanqian": "导演:</span>",
|
||||
"daoyanhou": "</p>",
|
||||
"zhuyanqian": "演员:</span>",
|
||||
"zhuyanhou": "</p>",
|
||||
"juqingqian": "简介:</span>",
|
||||
"juqinghou": "<a",
|
||||
|
||||
"bfyshifouercijiequ": "0",
|
||||
"bfyjiequqian": "空",
|
||||
"bfyjiequhou": "空",
|
||||
"bfyjiequshuzuqian": "<a",
|
||||
"bfyjiequshuzuhou": "/a>",
|
||||
"bfbiaotiqian": ">",
|
||||
"bfbiaotihou": "<",
|
||||
"bflianjieqian": "href=\"",
|
||||
"bflianjiehou": "\""
|
||||
}
|
60
EXT/XB/31看影视.json
Normal file
60
EXT/XB/31看影视.json
Normal file
@ -0,0 +1,60 @@
|
||||
{
|
||||
"name": "31看影视",
|
||||
"url": "https://www.31kan.vip",
|
||||
"author": "dj",
|
||||
"User": "空",
|
||||
"shouye": "1",
|
||||
"fenlei": "热播剧集$/vodshow/2--hits------#热播电影$/vodshow/1--hits------#热播综艺$/vodshow/3--hits------#热播少儿$/vodshow/33--hits------#国产剧$/vodshow/2-大陆-------#港剧$/vodshow/2-香港-------#韩剧$/vodshow/2-韩国-------#美剧$/vodshow/2-美国-------#泰剧$/vodshow/2-泰国-------#日剧$/vodshow/2-日本-------#英剧$/vodshow/2-英国-------",
|
||||
"houzhui": "---.html",
|
||||
"shifouercijiequ": "1",
|
||||
"jiequqian": "<ul class=\"myui-vodlist",
|
||||
"jiequhou": "</ul>",
|
||||
"jiequshuzuqian": "class=\"myui-vodlist__box\"",
|
||||
"jiequshuzuhou": "</span>",
|
||||
"tupianqian": "original=\"",
|
||||
"tupianhou": "\"",
|
||||
"biaotiqian": "title=\"",
|
||||
"biaotihou": "\"",
|
||||
"lianjieqian": "href=\"",
|
||||
"lianjiehou": "\"",
|
||||
"sousuoqian": "/index.php/ajax/suggest?mid=1&wd=",
|
||||
"sousuohou": "&limit=500",
|
||||
"sousuohouzhui": "/voddetail/",
|
||||
"ssmoshi": "0",
|
||||
"sousuoshifouercijiequ": "0",
|
||||
"jspic": "pic",
|
||||
"jsname": "name",
|
||||
"jsid": "id",
|
||||
"ssjiequqian": "空",
|
||||
"ssjiequhou": "空",
|
||||
"ssjiequshuzuqian": "空",
|
||||
"ssjiequshuzuhou": "空",
|
||||
"sstupianqian": "空",
|
||||
"sstupianhou": "空",
|
||||
"ssbiaotiqian": "空",
|
||||
"ssbiaotihou": "空",
|
||||
"sslianjieqian": "空",
|
||||
"sslianjiehou": "空",
|
||||
"bfshifouercijiequ": "0",
|
||||
"bfjiequqian": "空",
|
||||
"bfjiequhou": "空",
|
||||
"bfjiequshuzuqian": "id=\"playlist",
|
||||
"bfjiequshuzuhou": "</ul>",
|
||||
"zhuangtaiqian": "更新:</span>",
|
||||
"zhuangtaihou": "</p>",
|
||||
"daoyanqian": "导演:</span>",
|
||||
"daoyanhou": "</p>",
|
||||
"zhuyanqian": "主演:</span>",
|
||||
"zhuyanhou": "</p>",
|
||||
"juqingqian": "简介:</span>",
|
||||
"juqinghou": "</p>",
|
||||
"bfyshifouercijiequ": "0",
|
||||
"bfyjiequqian": "空",
|
||||
"bfyjiequhou": "空",
|
||||
"bfyjiequshuzuqian": "<a",
|
||||
"bfyjiequshuzuhou": "/a>",
|
||||
"bfbiaotiqian": ">",
|
||||
"bfbiaotihou": "<",
|
||||
"bflianjieqian": "href=\"",
|
||||
"bflianjiehou": "\""
|
||||
}
|
59
EXT/XB/348电影网.json
Normal file
59
EXT/XB/348电影网.json
Normal file
@ -0,0 +1,59 @@
|
||||
{
|
||||
"name": "348电影网",
|
||||
"url": "https://www.348z.com",
|
||||
"User": "空",
|
||||
"shouye": "1",
|
||||
"fenlei": "电影$/vodshow/id/1/page/#连续剧$/vodshow/id/2/page/#综艺$/vodshow/id/3/page/#动漫$/vodshow/id/4/page/#4K$/vodshow/id/37/page/",
|
||||
"houzhui": ".html",
|
||||
"shifouercijiequ": "0",
|
||||
"jiequqian": "空",
|
||||
"jiequhou": "空",
|
||||
"jiequshuzuqian": "class=\"pack-ykpack",
|
||||
"jiequshuzuhou": "</div>",
|
||||
"tupianqian": "data-original=\"",
|
||||
"tupianhou": "\"",
|
||||
"biaotiqian": "title=\"",
|
||||
"biaotihou": "\"",
|
||||
"lianjieqian": "href=\"",
|
||||
"lianjiehou": "\"",
|
||||
"sousuoqian": "/index.php/ajax/suggest?mid=1&wd=",
|
||||
"sousuohou": "&limit=500",
|
||||
"sousuohouzhui": "/voddetail/",
|
||||
"ssmoshi": "1",
|
||||
"sousuoshifouercijiequ": "0",
|
||||
"jspic": "空",
|
||||
"jsname": "空",
|
||||
"jsid": "空",
|
||||
"ssjiequqian": "空",
|
||||
"ssjiequhou": "空",
|
||||
"ssjiequshuzuqian": "class=\"thumb",
|
||||
"ssjiequshuzuhou": "</li>",
|
||||
"sstupianqian": "data-original=\"",
|
||||
"sstupianhou": "\"",
|
||||
"ssbiaotiqian": "title=\"",
|
||||
"ssbiaotihou": "\"",
|
||||
"sslianjieqian": "href=\"",
|
||||
"sslianjiehou": "\"",
|
||||
"bfshifouercijiequ": "0",
|
||||
"bfjiequqian": "空",
|
||||
"bfjiequhou": "空",
|
||||
"bfjiequshuzuqian": "<ul class=\"content_playlist",
|
||||
"bfjiequshuzuhou": "</ul>",
|
||||
"zhuangtaiqian": "状态:</span>",
|
||||
"zhuangtaihou": "</li>",
|
||||
"daoyanqian": "导演:</span>",
|
||||
"daoyanhou": "</li>",
|
||||
"zhuyanqian": "主演:</span>",
|
||||
"zhuyanhou": "</li>",
|
||||
"juqingqian": "详情:</span>",
|
||||
"juqinghou": "</div>",
|
||||
"bfyshifouercijiequ": "0",
|
||||
"bfyjiequqian": "空",
|
||||
"bfyjiequhou": "空",
|
||||
"bfyjiequshuzuqian": "<li",
|
||||
"bfyjiequshuzuhou": "</li>",
|
||||
"bfbiaotiqian": "\">",
|
||||
"bfbiaotihou": "</a>",
|
||||
"bflianjieqian": "href=\"",
|
||||
"bflianjiehou": "\""
|
||||
}
|
74
EXT/XB/4K电影网.json
Normal file
74
EXT/XB/4K电影网.json
Normal file
@ -0,0 +1,74 @@
|
||||
{
|
||||
"author": "20220612",
|
||||
"name": "4K电影网",
|
||||
"url": "https://www.4kdyw.cn", //填网站链接
|
||||
"tihuan": "cnzz.com", //这个不用动,是个别网站嗅探时过滤地址用的
|
||||
"User": "空", //这个不用动,是个别网站播放需要请求头时才用到
|
||||
//"User": "User-Agent:Dart/2.14 (dart:io)",
|
||||
"shouye": "1",
|
||||
|
||||
"fenlei": "国产剧$/vodshow/13--------#港台剧$/vodshow/14--------#日韩剧$/vodshow/15--------#欧美剧$/vodshow/16--------#电视剧(B站)$/vodshow/45--------#纪录片$/vodshow/24--------#纪录片(B站)$/vodshow/46--------#日本动漫$/vodshow/21--------#国产动漫$/vodshow/20--------#欧美动漫$/vodshow/22--------#动漫电影$/vodshow/25--------#番剧(B站)$/vodshow/42--------#国创(B站)$/vodshow/43--------#综艺$/vodshow/3--------#动作片$/vodshow/6--------#喜剧片$/vodshow/7--------#爱情片$/vodshow/8--------#科幻片$/vodshow/9--------#恐怖片$/vodshow/10--------#剧情片$/vodshow/11--------#战争片$/vodshow/12--------#犯罪片$/vodshow/27--------#灾难片$/vodshow/28--------#历史片$/vodshow/29--------#传记片$/vodshow/30--------#歌舞片$/vodshow/47--------#电影(B站)$/vodshow/44--------", //网站列表的分类
|
||||
"houzhui": "---.html", //网站翻页链接的后缀
|
||||
|
||||
"shifouercijiequ": "0", //截取的列表数组是否需要二次截取,0不需要,1需要
|
||||
"jiequqian": "空", //不需要二次截取就填空
|
||||
"jiequhou": "空", //不需要二次截取就填空
|
||||
"jiequshuzuqian": "class=\"module-item-pic", //截取的列表数组的前关键词,截取的关键词有 " 的用 \ 进行转义
|
||||
"jiequshuzuhou": "/div></div><div class=\"module-item\"", //截取的列表数组的后关键词,截取的关键词有 " 的用 \ 进行转义
|
||||
"tupianqian": "data-src=\"", //列表中资源的图片前关键词,截取的关键词有 " 的用 \ 进行转义
|
||||
"tupianhou": "\"", //列表中资源的图片后关键词,截取的关键词有 " 的用 \ 进行转义
|
||||
"biaotiqian": "title=\"", //列表中资源的标题前关键词,截取的关键词有 " 的用 \ 进行转义
|
||||
"biaotihou": "\"", //列表中资源的标题后关键词,截取的关键词有 " 的用 \ 进行转义
|
||||
"lianjieqian": "href=\"", //列表中资源的详情页跳转链接前关键词,截取的关键词有 " 的用 \ 进行转义
|
||||
"lianjiehou": "\"", //列表中资源的详情页跳转链接后关键词,截取的关键词有 " 的用 \ 进行转义
|
||||
|
||||
//新版Biubiu参数:副标题 (不需要的话,就不填写或者删除副标题2个字段也可以。)
|
||||
"fubiaotiqian": "module-item-text\">",
|
||||
"fubiaotihou": "<",
|
||||
|
||||
|
||||
//搜索部分基本不用动,现在网站基本都是苹果CMS,所有搜索是固定的。
|
||||
"sousuoqian": "/index.php/ajax/suggest?mid=1&wd=",
|
||||
"sousuohou": "&limit=500",
|
||||
"sousuohouzhui": "/voddetail/", //搜索页影片跳转详情页的中间标识链接部分
|
||||
"ssmoshi": "0",
|
||||
"sousuoshifouercijiequ": "0",
|
||||
"jspic": "pic",
|
||||
"jsname": "name",
|
||||
"jsid": "id",
|
||||
"ssjiequqian": "空",
|
||||
"ssjiequhou": "空",
|
||||
"ssjiequshuzuqian": "空",
|
||||
"ssjiequshuzuhou": "空",
|
||||
"sstupianqian": "空",
|
||||
"sstupianhou": "空",
|
||||
"ssbiaotiqian": "空",
|
||||
"ssbiaotihou": "空",
|
||||
"sslianjieqian": "空",
|
||||
"sslianjiehou": "空",
|
||||
|
||||
"bfshifouercijiequ": "0",
|
||||
"bfjiequqian": "空",
|
||||
"bfjiequhou": "空",
|
||||
"bfjiequshuzuqian": "id=\"sort-item", //播放截取的列表数组的前关键词
|
||||
"bfjiequshuzuhou": "</div>", //播放截取的列表数组的后关键词
|
||||
|
||||
"zhuangtaiqian": "集数:</span><div class=\"video-info-item\">", //状态前关键词
|
||||
"zhuangtaihou": "</div>", //状态后关键词
|
||||
"daoyanqian": "导演:</span>", //导演前关键词
|
||||
"daoyanhou": "</div>", //导演态后关键词
|
||||
"zhuyanqian": "主演:</span>", //主演前关键词
|
||||
"zhuyanhou": "</div>", //主演后关键词
|
||||
"juqingqian": "vod_content\"><span>", //剧情前关键词
|
||||
"juqinghou": "</span>", //剧情后关键词
|
||||
|
||||
"bfyshifouercijiequ": "0", //截取的播放列表数组是否需要二次截取,0不需要,1需要
|
||||
"bfyjiequqian": "空", //不需要二次截取就填空
|
||||
"bfyjiequhou": "空", //不需要二次截取就填空
|
||||
"bfyjiequshuzuqian": "<a", //播放剧集数组前关键词
|
||||
"bfyjiequshuzuhou": "/a>", //播放剧集数组后关键词
|
||||
"bfbiaotiqian": "span>", //播放剧集标题前关键词
|
||||
"bfbiaotihou": "</span", //状播放剧集标题后关键词
|
||||
"bflianjieqian": "href=\"", //播放剧集链接前关键词
|
||||
"bflianjiehou": "\""
|
||||
} //播放剧集链接后关键词
|
59
EXT/XB/4kan电影网.json
Normal file
59
EXT/XB/4kan电影网.json
Normal file
@ -0,0 +1,59 @@
|
||||
{
|
||||
"name": "4kan电影网",
|
||||
"url": "https://www.4kan.cc/",
|
||||
//"User": "User-Agent:Dart/2.14 (dart:io)",
|
||||
"shouye": "1",
|
||||
"fenlei": "电影$/vodshow/1--------#国产剧$/vodshow/13-内地-------#日韩剧$/vodshow/15--------#欧美剧$/vodshow/16--------#港台剧$/vodshow/13-香港-------#台剧$/vodshow/13-台湾-------#综艺$/vodshow/3--------#动漫$/vodshow/4--------",
|
||||
"houzhui": "---/",
|
||||
"shifouercijiequ": "0",
|
||||
"jiequqian": "空",
|
||||
"jiequhou": "空",
|
||||
"jiequshuzuqian": "lazyload",
|
||||
"jiequshuzuhou": "</div>",
|
||||
"tupianqian": "data-original=\"",
|
||||
"tupianhou": "\"",
|
||||
"biaotiqian": "title=\"",
|
||||
"biaotihou": "\"",
|
||||
"lianjieqian": "href=\"",
|
||||
"lianjiehou": "\"",
|
||||
"sousuoqian": "/index.php/ajax/suggest?mid=1&wd=",
|
||||
"sousuohou": "&limit=500",
|
||||
"sousuohouzhui": "/voddetail/",
|
||||
"ssmoshi": "0",
|
||||
"sousuoshifouercijiequ": "0",
|
||||
"jspic": "pic",
|
||||
"jsname": "name",
|
||||
"jsid": "id",
|
||||
"ssjiequqian": "空",
|
||||
"ssjiequhou": "空",
|
||||
"ssjiequshuzuqian": "空",
|
||||
"ssjiequshuzuhou": "空",
|
||||
"sstupianqian": "空",
|
||||
"sstupianhou": "空",
|
||||
"ssbiaotiqian": "空",
|
||||
"ssbiaotihou": "空",
|
||||
"sslianjieqian": "空",
|
||||
"sslianjiehou": "空",
|
||||
"bfshifouercijiequ": "0",
|
||||
"bfjiequqian": "空",
|
||||
"bfjiequhou": "空",
|
||||
"bfjiequshuzuqian": "id=\"playlist",
|
||||
"bfjiequshuzuhou": "</div>",
|
||||
"zhuangtaiqian": "style=\"bottom:0;backgroud-color:white;border-radius:0 10px 0 10px;\">",
|
||||
"zhuangtaihou": "</span>",
|
||||
"daoyanqian": "导演:</span>",
|
||||
"daoyanhou": "</p>",
|
||||
"zhuyanqian": "主演:</span>",
|
||||
"zhuyanhou": "</p>",
|
||||
"juqingqian": "<p class=\"col-pd\">",
|
||||
"juqinghou": "</p>",
|
||||
"bfyshifouercijiequ": "0",
|
||||
"bfyjiequqian": "空",
|
||||
"bfyjiequhou": "空",
|
||||
"bfyjiequshuzuqian": "<a",
|
||||
"bfyjiequshuzuhou": "/a>",
|
||||
"bfbiaotiqian": ">",
|
||||
"bfbiaotihou": "<",
|
||||
"bflianjieqian": "href=\"",
|
||||
"bflianjiehou": "\""
|
||||
}
|
68
EXT/XB/555dy.json
Normal file
68
EXT/XB/555dy.json
Normal file
@ -0,0 +1,68 @@
|
||||
// 网站改版修正
|
||||
{
|
||||
"author": "20220613",
|
||||
"name": "555电影",
|
||||
"url": "https://www.xawqxh.net",
|
||||
"tihuan": "cnzz.com",
|
||||
"User": "User-Agent:Dart/2.14 (dart:io)",
|
||||
"shouye": "1",
|
||||
|
||||
"fenlei": "Netflix(片)$/vodshow/1---Netflix-----#Netflix(剧)$/vodshow/2---Netflix-----#Netflix(漫)$/vodshow/4---Netflix-----#热播电影$/vodshow/1--hits------#热播连续剧$/vodshow/13--------#日韩剧$/vodshow/44--------#欧美剧$/vodshow/45--------#港台剧$/vodshow/15--------#纪录片$/vodshow/1---纪录-----#儿童片$/vodshow/1---儿童-----#动画片$/vodshow/1---动画-----#亲子动漫$/vodshow/4---亲子-----#儿歌动漫$/vodshow/4---儿歌-----#国产动漫$/vodshow/4-大陆-------#日本动漫$/vodshow/4-日本-------#欧美动漫$/vodshow/4-欧美-------#其他动漫$/vodshow/4-其他-------#综艺记录$/vodshow/3--------#仙侠片$/vodshow/1---仙侠-----#剧情片$/vodshow/1---剧情-----#科幻片$/vodshow/1---科幻-----#动作片$/vodshow/1---动作-----#喜剧片$/vodshow/1---喜剧-----#爱情片$/vodshow/1---爱情-----#冒险片$/vodshow/1---冒险-----#歌舞片$/vodshow/1---歌舞-----#音乐片$/vodshow/1---音乐-----#奇幻片$/vodshow/1---奇幻-----#恐怖片$/vodshow/1---恐怖-----#惊悚片$/vodshow/1---惊悚-----#丧尸片$/vodshow/1---丧尸-----#战争片$/vodshow/1---战争-----#传记片$/vodshow/1---传记-----#犯罪片$/vodshow/1---犯罪-----#悬疑片$/vodshow/1---悬疑-----#西部片$/vodshow/1---西部-----#灾难片$/vodshow/1---灾难-----#古装片$/vodshow/1---古装-----#武侠片$/vodshow/1---武侠-----#家庭片$/vodshow/1---家庭-----#短片$/vodshow/1---短片-----#校园片$/vodshow/1---校园-----#文艺片$/vodshow/1---文艺-----#运动片$/vodshow/1---运动-----#青春片$/vodshow/1---青春-----#同性片$/vodshow/1---同性-----#励志片$/vodshow/1---励志-----#人性片$/vodshow/1---人性-----#美食片$/vodshow/1---美食-----#女性片$/vodshow/1---女性-----#治愈片$/vodshow/1---治愈-----#历史片$/vodshow/1---历史-----#真人秀$/vodshow/1---真人秀-----#脱口秀$/vodshow/1---脱口秀-----#",
|
||||
"houzhui": "---.html",
|
||||
|
||||
"shifouercijiequ": "1",
|
||||
"jiequqian": "class=\"module-items",
|
||||
"jiequhou": "class=\"fixedGroup",
|
||||
"jiequshuzuqian": "<a",
|
||||
"jiequshuzuhou": "alt=\"",
|
||||
"tupianqian": "data-original=\"",
|
||||
"tupianhou": "\"",
|
||||
"biaotiqian": "title=\"",
|
||||
"biaotihou": "\"",
|
||||
"lianjieqian": "href=\"",
|
||||
"lianjiehou": "\"",
|
||||
|
||||
"sousuoqian": "/index.php/ajax/suggest?mid=1&wd=",
|
||||
"sousuohou": "&limit=500",
|
||||
"sousuohouzhui": "/voddetail/",
|
||||
"ssmoshi": "0",
|
||||
"sousuoshifouercijiequ": "0",
|
||||
"jspic": "pic",
|
||||
"jsname": "name",
|
||||
"jsid": "id",
|
||||
"ssjiequqian": "空",
|
||||
"ssjiequhou": "空",
|
||||
"ssjiequshuzuqian": "空",
|
||||
"ssjiequshuzuhou": "空",
|
||||
"sstupianqian": "空",
|
||||
"sstupianhou": "空",
|
||||
"ssbiaotiqian": "空",
|
||||
"ssbiaotihou": "空",
|
||||
"sslianjieqian": "空",
|
||||
"sslianjiehou": "空",
|
||||
|
||||
"bfshifouercijiequ": "0",
|
||||
"bfjiequqian": "空",
|
||||
"bfjiequhou": "空",
|
||||
"bfjiequshuzuqian": "class=\"module-play-list\"",
|
||||
"bfjiequshuzuhou": "</div>",
|
||||
|
||||
"zhuangtaiqian": "更新:</span>",
|
||||
"zhuangtaihou": "</div>",
|
||||
"daoyanqian": "导演:</span>",
|
||||
"daoyanhou": "</div>",
|
||||
"zhuyanqian": "主演:</span>",
|
||||
"zhuyanhou": "</div>",
|
||||
"juqingqian": "introduction-content\"><p>",
|
||||
"juqinghou": "</p>",
|
||||
|
||||
"bfyshifouercijiequ": "0",
|
||||
"bfyjiequqian": "空",
|
||||
"bfyjiequhou": "空",
|
||||
"bfyjiequshuzuqian": "<a",
|
||||
"bfyjiequshuzuhou": "/a>",
|
||||
"bfbiaotiqian": "span>",
|
||||
"bfbiaotihou": "</span",
|
||||
"bflianjieqian": "href=\"",
|
||||
"bflianjiehou": "\""
|
||||
}
|
67
EXT/XB/555xl.json
Normal file
67
EXT/XB/555xl.json
Normal file
@ -0,0 +1,67 @@
|
||||
{"name": "555电影",
|
||||
"url": "https://www.555dy.fun",
|
||||
"tihuan": "cnzz.com",
|
||||
"User": "User-Agent:Dart/2.14 (dart:io)",
|
||||
"shouye": "1",
|
||||
"fenlei": "Netflix(片)$/vodshow/1---Netflix-----#Netflix(剧)$/vodshow/2---Netflix-----#热播电影$/vodshow/1--hits------#热播剧集$/vodshow/13--------#电影$/vodshow/1--------#电视剧$/vodshow/2--------#综艺$/vodshow/3--------#动漫$/vodshow/4--------#国产剧$/vodshow/2-大陆-------#欧美剧$/vodshow/45--------#国漫$/vodshow/4-大陆-------#日漫$/vodshow/4-日本-------#福利$/vodshow/124--------",
|
||||
|
||||
//"fenlei": "Netflix(片)$/vodshow/1---Netflix-----#Netflix(剧)$/vodshow/2---Netflix-----#Netflix(漫)$/vodshow/4---Netflix-----#热播电影$/vodshow/1--hits------#热播连续剧$/vodshow/13--------#日韩剧$/vodshow/44--------#欧美剧$/vodshow/45--------#港台剧$/vodshow/15--------#纪录片$/vodshow/1---纪录-----#儿童片$/vodshow/1---儿童-----#动画片$/vodshow/1---动画-----#亲子动漫$/vodshow/4---亲子-----#儿歌动漫$/vodshow/4---儿歌-----#国产动漫$/vodshow/4-大陆-------#日本动漫$/vodshow/4-日本-------#欧美动漫$/vodshow/4-欧美-------#其他动漫$/vodshow/4-其他-------#综艺记录$/vodshow/3--------#仙侠片$/vodshow/1---仙侠-----#剧情片$/vodshow/1---剧情-----#科幻片$/vodshow/1---科幻-----#动作片$/vodshow/1---动作-----#喜剧片$/vodshow/1---喜剧-----#爱情片$/vodshow/1---爱情-----#冒险片$/vodshow/1---冒险-----#歌舞片$/vodshow/1---歌舞-----#音乐片$/vodshow/1---音乐-----#奇幻片$/vodshow/1---奇幻-----#恐怖片$/vodshow/1---恐怖-----#惊悚片$/vodshow/1---惊悚-----#丧尸片$/vodshow/1---丧尸-----#战争片$/vodshow/1---战争-----#传记片$/vodshow/1---传记-----#犯罪片$/vodshow/1---犯罪-----#悬疑片$/vodshow/1---悬疑-----#西部片$/vodshow/1---西部-----#灾难片$/vodshow/1---灾难-----#古装片$/vodshow/1---古装-----#武侠片$/vodshow/1---武侠-----#家庭片$/vodshow/1---家庭-----#短片$/vodshow/1---短片-----#校园片$/vodshow/1---校园-----#文艺片$/vodshow/1---文艺-----#运动片$/vodshow/1---运动-----#青春片$/vodshow/1---青春-----#同性片$/vodshow/1---同性-----#励志片$/vodshow/1---励志-----#人性片$/vodshow/1---人性-----#美食片$/vodshow/1---美食-----#女性片$/vodshow/1---女性-----#治愈片$/vodshow/1---治愈-----#历史片$/vodshow/1---历史-----#真人秀$/vodshow/1---真人秀-----#脱口秀$/vodshow/1---脱口秀-----#",
|
||||
"houzhui": "---.html",
|
||||
"shifouercijiequ": "1",
|
||||
"jiequqian": "module-page",
|
||||
"jiequhou": "<div id=\"page\">",
|
||||
"jiequshuzuqian": "<a",
|
||||
"jiequshuzuhou": "no-referrer",
|
||||
"tupianqian": "original=\"",
|
||||
"tupianhou": "\"",
|
||||
"biaotiqian": "title=\"",
|
||||
"biaotihou": "\"",
|
||||
"lianjieqian": "href=\"",
|
||||
"lianjiehou": "\"",
|
||||
"sousuoqian": "/index.php/ajax/suggest?mid=1&wd=",
|
||||
"sousuohou": "&limit=10",
|
||||
"sousuohouzhui": "/voddetail/",
|
||||
"ssmoshi": "0",
|
||||
"sousuoshifouercijiequ": "0",
|
||||
"jspic": "pic",
|
||||
"jsname": "name",
|
||||
"jsid": "id",
|
||||
"ssjiequqian": "空",
|
||||
"ssjiequhou": "空",
|
||||
"ssjiequshuzuqian": "空",
|
||||
"ssjiequshuzuhou": "空",
|
||||
"sstupianqian": "空",
|
||||
"sstupianhou": "空",
|
||||
"ssbiaotiqian": "空",
|
||||
"ssbiaotihou": "空",
|
||||
"sslianjieqian": "空",
|
||||
"sslianjiehou": "空",
|
||||
"xlshifouercijiequ": "0",
|
||||
"xljiequqian": "",
|
||||
"xljiequhou": "",
|
||||
"xljiequshuzuqian": "<div class=\"module-tab-item tab-item",
|
||||
"xljiequshuzuhou": "</div>",
|
||||
"xlbiaotiqian": "<span>",
|
||||
"xlbiaotihou": "</span>",
|
||||
"bfshifouercijiequ": "0",
|
||||
"bfjiequqian": "空",
|
||||
"bfjiequhou": "空",
|
||||
"zhuangtaiqian": "更新:", //
|
||||
"zhuangtaihou": "</div>",
|
||||
"daoyanqian": "导演:",
|
||||
"daoyanhou": "</div>",
|
||||
"zhuyanqian": "主演:",
|
||||
"zhuyanhou": "</div>",
|
||||
"juqingqian": "style=\"line-height: 20px;\">", //简介:
|
||||
"juqinghou": "</p>",
|
||||
"bfjiequshuzuqian": "class=\"module-list",
|
||||
"bfjiequshuzuhou": "</div>",
|
||||
"bfyshifouercijiequ": "0",
|
||||
"bfyjiequqian": "空",
|
||||
"bfyjiequhou": "空",
|
||||
"bfyjiequshuzuqian": "<a",
|
||||
"bfyjiequshuzuhou": "/a>",
|
||||
"bfbiaotiqian": "<span>",
|
||||
"bfbiaotihou": "</span>",
|
||||
"bflianjieqian": "href=\"",
|
||||
"bflianjiehou": "\""}
|
73
EXT/XB/555电影.json
Normal file
73
EXT/XB/555电影.json
Normal file
@ -0,0 +1,73 @@
|
||||
// 网站改版修正
|
||||
{
|
||||
"author": "20220613",
|
||||
"name": "555电影",
|
||||
"url": "https://www.xawqxh.net",
|
||||
"tihuan": "cnzz.com",
|
||||
"User": "User-Agent:Dart/2.14 (dart:io)",
|
||||
"shouye": "1",
|
||||
|
||||
"fenlei": "Netflix(片)$/vodshow/1---Netflix-----#Netflix(剧)$/vodshow/2---Netflix-----#Netflix(漫)$/vodshow/4---Netflix-----#热播电影$/vodshow/1--hits------#热播连续剧$/vodshow/13--------#日韩剧$/vodshow/44--------#欧美剧$/vodshow/45--------#港台剧$/vodshow/15--------#纪录片$/vodshow/1---纪录-----#儿童片$/vodshow/1---儿童-----#动画片$/vodshow/1---动画-----#亲子动漫$/vodshow/4---亲子-----#儿歌动漫$/vodshow/4---儿歌-----#国产动漫$/vodshow/4-大陆-------#日本动漫$/vodshow/4-日本-------#欧美动漫$/vodshow/4-欧美-------#其他动漫$/vodshow/4-其他-------#综艺记录$/vodshow/3--------#仙侠片$/vodshow/1---仙侠-----#剧情片$/vodshow/1---剧情-----#科幻片$/vodshow/1---科幻-----#动作片$/vodshow/1---动作-----#喜剧片$/vodshow/1---喜剧-----#爱情片$/vodshow/1---爱情-----#冒险片$/vodshow/1---冒险-----#歌舞片$/vodshow/1---歌舞-----#音乐片$/vodshow/1---音乐-----#奇幻片$/vodshow/1---奇幻-----#恐怖片$/vodshow/1---恐怖-----#惊悚片$/vodshow/1---惊悚-----#丧尸片$/vodshow/1---丧尸-----#战争片$/vodshow/1---战争-----#传记片$/vodshow/1---传记-----#犯罪片$/vodshow/1---犯罪-----#悬疑片$/vodshow/1---悬疑-----#西部片$/vodshow/1---西部-----#灾难片$/vodshow/1---灾难-----#古装片$/vodshow/1---古装-----#武侠片$/vodshow/1---武侠-----#家庭片$/vodshow/1---家庭-----#短片$/vodshow/1---短片-----#校园片$/vodshow/1---校园-----#文艺片$/vodshow/1---文艺-----#运动片$/vodshow/1---运动-----#青春片$/vodshow/1---青春-----#同性片$/vodshow/1---同性-----#励志片$/vodshow/1---励志-----#人性片$/vodshow/1---人性-----#美食片$/vodshow/1---美食-----#女性片$/vodshow/1---女性-----#治愈片$/vodshow/1---治愈-----#历史片$/vodshow/1---历史-----#真人秀$/vodshow/1---真人秀-----#脱口秀$/vodshow/1---脱口秀-----#",
|
||||
"houzhui": "---.html",
|
||||
|
||||
"shifouercijiequ": "1",
|
||||
"jiequqian": "class=\"module-items",
|
||||
"jiequhou": "class=\"fixedGroup",
|
||||
"jiequshuzuqian": "<a",
|
||||
"jiequshuzuhou": "alt=\"",
|
||||
"tupianqian": "data-original=\"",
|
||||
"tupianhou": "\"",
|
||||
"biaotiqian": "title=\"",
|
||||
"biaotihou": "\"",
|
||||
"lianjieqian": "href=\"",
|
||||
"lianjiehou": "\"",
|
||||
|
||||
//新版Biubiu参数:副标题 (不需要的话,就不填写或者删除副标题2个字段也可以。)
|
||||
"fubiaotiqian": "note\">",
|
||||
"fubiaotihou": "</div>",
|
||||
|
||||
|
||||
"sousuoqian": "/index.php/ajax/suggest?mid=1&wd=",
|
||||
"sousuohou": "&limit=500",
|
||||
"sousuohouzhui": "/voddetail/",
|
||||
"ssmoshi": "0",
|
||||
"sousuoshifouercijiequ": "0",
|
||||
"jspic": "pic",
|
||||
"jsname": "name",
|
||||
"jsid": "id",
|
||||
"ssjiequqian": "空",
|
||||
"ssjiequhou": "空",
|
||||
"ssjiequshuzuqian": "空",
|
||||
"ssjiequshuzuhou": "空",
|
||||
"sstupianqian": "空",
|
||||
"sstupianhou": "空",
|
||||
"ssbiaotiqian": "空",
|
||||
"ssbiaotihou": "空",
|
||||
"sslianjieqian": "空",
|
||||
"sslianjiehou": "空",
|
||||
|
||||
"bfshifouercijiequ": "0",
|
||||
"bfjiequqian": "空",
|
||||
"bfjiequhou": "空",
|
||||
"bfjiequshuzuqian": "class=\"module-play-list\"",
|
||||
"bfjiequshuzuhou": "</div>",
|
||||
|
||||
"zhuangtaiqian": "更新:</span>",
|
||||
"zhuangtaihou": "</div>",
|
||||
"daoyanqian": "导演:</span>",
|
||||
"daoyanhou": "</div>",
|
||||
"zhuyanqian": "主演:</span>",
|
||||
"zhuyanhou": "</div>",
|
||||
"juqingqian": "<p>",
|
||||
"juqinghou": "</p>",
|
||||
|
||||
"bfyshifouercijiequ": "0",
|
||||
"bfyjiequqian": "空",
|
||||
"bfyjiequhou": "空",
|
||||
"bfyjiequshuzuqian": "<a",
|
||||
"bfyjiequshuzuhou": "/a>",
|
||||
"bfbiaotiqian": "span>",
|
||||
"bfbiaotihou": "</span",
|
||||
"bflianjieqian": "href=\"",
|
||||
"bflianjiehou": "\""
|
||||
}
|
60
EXT/XB/555电影2.json
Normal file
60
EXT/XB/555电影2.json
Normal file
@ -0,0 +1,60 @@
|
||||
{
|
||||
"name": "555电影",
|
||||
"url": "https://www.555dy.fun",
|
||||
"tihuan": "cnzz.com",
|
||||
"User": "User-Agent:Dart/2.14 (dart:io)",
|
||||
"shouye": "1",
|
||||
"fenlei": "电视剧$/vodtype/2-#电影$/vodtype/1-#综艺纪录片$/vodtype/3-#动漫$/vodtype/4-#港台剧$/vodtype/15-#日韩剧$/vodtype/44-#欧美剧$/vodtype/45-",
|
||||
"houzhui": ".html",
|
||||
"shifouercijiequ": "1",
|
||||
"jiequqian": "class=\"myui-vodlist clearfix",
|
||||
"jiequhou": "</ul>",
|
||||
"jiequshuzuqian": "class=\"myui-vodlist__thumb",
|
||||
"jiequshuzuhou": "</span>",
|
||||
"tupianqian": "original=\"",
|
||||
"tupianhou": "\"",
|
||||
"biaotiqian": "title=\"",
|
||||
"biaotihou": "\"",
|
||||
"lianjieqian": "href=\"",
|
||||
"lianjiehou": "\"",
|
||||
"sousuoqian": "/index.php/ajax/suggest?mid=1&wd=",
|
||||
"sousuohou": "&limit=500",
|
||||
"sousuohouzhui": "/voddetail/",
|
||||
"ssmoshi": "0",
|
||||
"sousuoshifouercijiequ": "0",
|
||||
"jspic": "pic",
|
||||
"jsname": "name",
|
||||
"jsid": "id",
|
||||
"ssjiequqian": "空",
|
||||
"ssjiequhou": "空",
|
||||
"ssjiequshuzuqian": "空",
|
||||
"ssjiequshuzuhou": "空",
|
||||
"sstupianqian": "空",
|
||||
"sstupianhou": "空",
|
||||
"ssbiaotiqian": "空",
|
||||
"ssbiaotihou": "空",
|
||||
"sslianjieqian": "空",
|
||||
"sslianjiehou": "空",
|
||||
"bfshifouercijiequ": "0",
|
||||
"bfjiequqian": "空",
|
||||
"bfjiequhou": "空",
|
||||
"bfjiequshuzuqian": "class=\"myui-content__list",
|
||||
"bfjiequshuzuhou": "</ul>",
|
||||
"zhuangtaiqian": "更新:</span>",
|
||||
"zhuangtaihou": "</p>",
|
||||
"daoyanqian": "导演:</span>",
|
||||
"daoyanhou": "</p>",
|
||||
"zhuyanqian": "主演:</span>",
|
||||
"zhuyanhou": "</p>",
|
||||
"juqingqian": "class=\"data\" style=\"display: none;\">",
|
||||
"juqinghou": "</span>",
|
||||
"bfyshifouercijiequ": "0",
|
||||
"bfyjiequqian": "空",
|
||||
"bfyjiequhou": "空",
|
||||
"bfyjiequshuzuqian": "<a",
|
||||
"bfyjiequshuzuhou": "/a>",
|
||||
"bfbiaotiqian": ">",
|
||||
"bfbiaotihou": "<",
|
||||
"bflianjieqian": "href=\"",
|
||||
"bflianjiehou": "\""
|
||||
}
|
60
EXT/XB/555资源.json
Normal file
60
EXT/XB/555资源.json
Normal file
@ -0,0 +1,60 @@
|
||||
{
|
||||
"name": "555资源",
|
||||
"url": "https://www.555dy.me",
|
||||
"tihuan": "cnzz.com",
|
||||
"User": "空",
|
||||
"shouye": "1",
|
||||
"fenlei": "热播剧集$/vodshow/2--hits------#热播电影$/vodshow/1--hits------#综艺$/vodshow/3--------#动漫$/vodshow/4--------#亲子$/vodshow/4---亲子-----#国产剧$/vodshow/2-大陆-------#港剧$/vodshow/2-香港-------#韩剧$/vodshow/2-韩国-------#美剧$/vodshow/2-美国-------#泰剧$/vodshow/2-泰国-------#日剧$/vodshow/2-日本-------#英剧$/vodshow/2-英国-------",
|
||||
"houzhui": "---.html",
|
||||
"shifouercijiequ": "1",
|
||||
"jiequqian": "<ul class=\"myui-vodlist",
|
||||
"jiequhou": "</ul>",
|
||||
"jiequshuzuqian": "lazyload",
|
||||
"jiequshuzuhou": "</span>",
|
||||
"tupianqian": "original=\"",
|
||||
"tupianhou": "\"",
|
||||
"biaotiqian": "title=\"",
|
||||
"biaotihou": "\"",
|
||||
"lianjieqian": "href=\"",
|
||||
"lianjiehou": "\"",
|
||||
"sousuoqian": "/index.php/ajax/suggest?mid=1&wd=",
|
||||
"sousuohou": "&limit=500",
|
||||
"sousuohouzhui": "/voddetail/",
|
||||
"ssmoshi": "0",
|
||||
"sousuoshifouercijiequ": "0",
|
||||
"jspic": "pic",
|
||||
"jsname": "name",
|
||||
"jsid": "id",
|
||||
"ssjiequqian": "空",
|
||||
"ssjiequhou": "空",
|
||||
"ssjiequshuzuqian": "空",
|
||||
"ssjiequshuzuhou": "空",
|
||||
"sstupianqian": "空",
|
||||
"sstupianhou": "空",
|
||||
"ssbiaotiqian": "空",
|
||||
"ssbiaotihou": "空",
|
||||
"sslianjieqian": "空",
|
||||
"sslianjiehou": "空",
|
||||
"bfshifouercijiequ": "0",
|
||||
"bfjiequqian": "空",
|
||||
"bfjiequhou": "空",
|
||||
"bfjiequshuzuqian": "id=\"playlist",
|
||||
"bfjiequshuzuhou": "</ul>",
|
||||
"zhuangtaiqian": "更新:</span>",
|
||||
"zhuangtaihou": "</p>",
|
||||
"daoyanqian": "导演:</span>",
|
||||
"daoyanhou": "</p>",
|
||||
"zhuyanqian": "主演:</span>",
|
||||
"zhuyanhou": "</p>",
|
||||
"juqingqian": "class=\"data\" style=\"display: none;\">",
|
||||
"juqinghou": "</span>",
|
||||
"bfyshifouercijiequ": "0",
|
||||
"bfyjiequqian": "空",
|
||||
"bfyjiequhou": "空",
|
||||
"bfyjiequshuzuqian": "<a",
|
||||
"bfyjiequshuzuhou": "/a>",
|
||||
"bfbiaotiqian": ">",
|
||||
"bfbiaotihou": "<",
|
||||
"bflianjieqian": "href=\"",
|
||||
"bflianjiehou": "\""
|
||||
}
|
64
EXT/XB/600dvd.json
Normal file
64
EXT/XB/600dvd.json
Normal file
@ -0,0 +1,64 @@
|
||||
{"name": "600影视",
|
||||
"url": "http://www.600dvd.com",
|
||||
"tihuan": "cnzz.com",
|
||||
"User": "空",
|
||||
"fenlei": "电视剧$/type/2-#电影$/type/1-#综艺$/type/3-#动漫$/type/4-#韩剧$/type/14-#美剧$/type/15-",
|
||||
"houzhui": ".html",
|
||||
"shifouercijiequ": "0",
|
||||
"jiequqian": "空",
|
||||
"jiequhou": "空",
|
||||
"jiequshuzuqian": "class=\"stui-vodlist__thumb lazyload\"",
|
||||
"jiequshuzuhou": "</a>",
|
||||
"tupianqian": "data-original=\"",
|
||||
"tupianhou": "\"",
|
||||
"biaotiqian": "title=\"",
|
||||
"biaotihou": "\"",
|
||||
"lianjieqian": "href=\"",
|
||||
"lianjiehou": "\"",
|
||||
"sousuoqian": "/search-pg-1-wd-",
|
||||
"sousuohou": ".html",
|
||||
"sousuohouzhui": "/detail/",
|
||||
"ssmoshi": "1",
|
||||
"sousuoshifouercijiequ": "0",
|
||||
"jspic": "空",
|
||||
"jsname": "空",
|
||||
"jsid": "空",
|
||||
"ssjiequqian": "空",
|
||||
"ssjiequhou": "空",
|
||||
"ssjiequshuzuqian": "class=\"vbox\"",
|
||||
"ssjiequshuzuhou": "</a>",
|
||||
"sstupianqian": "data-original=\"",
|
||||
"sstupianhou": "\"",
|
||||
"ssbiaotiqian": "title=\"",
|
||||
"ssbiaotihou": "\"",
|
||||
"sslianjieqian": "href=\"",
|
||||
"sslianjiehou": "\"",
|
||||
"xlshifouercijiequ": "1",
|
||||
"xljiequqian": "播放地址 -->",
|
||||
"xljiequhou": "end 播放地址 -->",
|
||||
"xljiequshuzuqian": "class=\"title\"",
|
||||
"xljiequshuzuhou": "/h3>",
|
||||
"xlbiaotiqian": ">",
|
||||
"xlbiaotihou": "<",
|
||||
"bfshifouercijiequ": "0",
|
||||
"bfjiequqian": "空",
|
||||
"bfjiequhou": "空",
|
||||
"bfjiequshuzuqian": "class=\"stui-content__playlist clearfix\"",
|
||||
"bfjiequshuzuhou": "</ul>",
|
||||
"zhuangtaiqian": "class=\"yac\">",
|
||||
"zhuangtaihou": "</p>",
|
||||
"daoyanqian": "导演:</span>",
|
||||
"daoyanhou": "</p>",
|
||||
"zhuyanqian": "主演:</span>",
|
||||
"zhuyanhou": "</p>",
|
||||
"juqingqian": "class=\"tbox_js\">",
|
||||
"juqinghou": "</div>",
|
||||
"bfyshifouercijiequ": "0",
|
||||
"bfyjiequqian": "空",
|
||||
"bfyjiequhou": "空",
|
||||
"bfyjiequshuzuqian": "<li>",
|
||||
"bfyjiequshuzuhou": "</li>",
|
||||
"bfbiaotiqian": "\">",
|
||||
"bfbiaotihou": "</a>",
|
||||
"bflianjieqian": "href=\"",
|
||||
"bflianjiehou": "\""}
|
59
EXT/XB/789影视.json
Normal file
59
EXT/XB/789影视.json
Normal file
@ -0,0 +1,59 @@
|
||||
{
|
||||
"name": "789影视",
|
||||
"url": "https://789ys.com",
|
||||
"User": "空",
|
||||
"shouye": "1",
|
||||
"fenlei": "电视剧$/list/2-#电影$/list/1-#综艺$/list/3-#动漫$/list/4-",
|
||||
"houzhui": ".html",
|
||||
"shifouercijiequ": "0",
|
||||
"jiequqian": "空",
|
||||
"jiequhou": "空",
|
||||
"jiequshuzuqian": "class=\"stui-vodlist__box",
|
||||
"jiequshuzuhou": "</span>",
|
||||
"tupianqian": "original=\"",
|
||||
"tupianhou": "\"",
|
||||
"biaotiqian": "title=\"",
|
||||
"biaotihou": "\"",
|
||||
"lianjieqian": "href=\"",
|
||||
"lianjiehou": "\"",
|
||||
"sousuoqian": "/index.php/ajax/suggest?mid=1&wd=",
|
||||
"sousuohou": "&limit=500",
|
||||
"sousuohouzhui": "/vod/",
|
||||
"ssmoshi": "0",
|
||||
"sousuoshifouercijiequ": "0",
|
||||
"jspic": "pic",
|
||||
"jsname": "name",
|
||||
"jsid": "id",
|
||||
"ssjiequqian": "空",
|
||||
"ssjiequhou": "空",
|
||||
"ssjiequshuzuqian": "空",
|
||||
"ssjiequshuzuhou": "空",
|
||||
"sstupianqian": "空",
|
||||
"sstupianhou": "空",
|
||||
"ssbiaotiqian": "空",
|
||||
"ssbiaotihou": "空",
|
||||
"sslianjieqian": "空",
|
||||
"sslianjiehou": "空",
|
||||
"bfshifouercijiequ": "0",
|
||||
"bfjiequqian": "空",
|
||||
"bfjiequhou": "空",
|
||||
"bfjiequshuzuqian": "class=\"stui-content__playlist",
|
||||
"bfjiequshuzuhou": "</ul>",
|
||||
"zhuangtaiqian": "类型:</span>",
|
||||
"zhuangtaihou": "</p>",
|
||||
"daoyanqian": "导演:</span>",
|
||||
"daoyanhou": "</p>",
|
||||
"zhuyanqian": "主演:</span>",
|
||||
"zhuyanhou": "</p>",
|
||||
"juqingqian": "<p class=\"col-pd\">",
|
||||
"juqinghou": "</p>",
|
||||
"bfyshifouercijiequ": "0",
|
||||
"bfyjiequqian": "空",
|
||||
"bfyjiequhou": "空",
|
||||
"bfyjiequshuzuqian": "<a",
|
||||
"bfyjiequshuzuhou": "/a>",
|
||||
"bfbiaotiqian": ">",
|
||||
"bfbiaotihou": "<",
|
||||
"bflianjieqian": "href=\"",
|
||||
"bflianjiehou": "\""
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user