armed ship

This commit is contained in:
lem85930 2023-07-11 21:12:23 +08:00
parent bb02f3dd41
commit f8dd3430d0
2039 changed files with 487295 additions and 7 deletions

1
EXT/A
View File

@ -1 +0,0 @@

View File

@ -1 +0,0 @@

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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
View 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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

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
View 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>

View 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>

View File

@ -0,0 +1 @@
<li href="/雷蒙影视4K直播/雷蒙影视4K直播.html"></li>

View 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>

View File

@ -0,0 +1 @@
<li href="/高清体育及4K资源/4K.html"></li>

819
EXT/LIB/alist.js Normal file
View 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

File diff suppressed because one or more lines are too long

140
EXT/LIB/atob.js Normal file
View 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
View 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

File diff suppressed because one or more lines are too long

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

File diff suppressed because one or more lines are too long

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

File diff suppressed because it is too large Load Diff

189
EXT/LIB/drT.js Normal file
View 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 = { "&": "&#38;", "<": "&#60;", ">": "&#62;", '"': "&#34;", "'": "&#39;", "/": "&#47;" },
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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because one or more lines are too long

4
EXT/LIB/drpy.ym.js Normal file
View 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

File diff suppressed because it is too large Load Diff

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

File diff suppressed because one or more lines are too long

256
EXT/LIB/es6py.js Normal file
View 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
View 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

File diff suppressed because one or more lines are too long

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

File diff suppressed because one or more lines are too long

534
EXT/LIB/live2cms.js Normal file
View 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

File diff suppressed because one or more lines are too long

25
EXT/LIB/maomi_aes.js Normal file
View 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
View 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
View 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
View 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
View 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);
},
},
};

File diff suppressed because one or more lines are too long

264
EXT/LIB/pre.js Normal file
View 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
View 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

File diff suppressed because one or more lines are too long

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

File diff suppressed because one or more lines are too long

158
EXT/LIB/util.ym.js Normal file
View 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
View 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};

File diff suppressed because one or more lines are too long

69
EXT/XB/1080Kkk.json Normal file
View 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
View 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
View 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
View 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
View 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
View 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
View 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", //01
"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", //01
"bfyjiequqian": "空", //
"bfyjiequhou": "空", //
"bfyjiequshuzuqian": "<a", //
"bfyjiequshuzuhou": "/a>", //
"bfbiaotiqian": "span>", //
"bfbiaotihou": "</span", //
"bflianjieqian": "href=\"", //
"bflianjiehou": "\""
} //

59
EXT/XB/4kan电影网.json Normal file
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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