>>0?1:0),w=c.low=w+P,c.high=B+F+(w>>>0>>0?1:0),m=a.low=m+O,a.high=k+W+(m>>>0>>0?1:0),x=h.low=x+U,h.high=S+I+(x>>>0>>0?1:0),r=l.low=r+X,l.high=b+K+(r>>>0>>0?1:0)},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;return e[i>>>5]|=128<<24-i%32,e[30+(128+i>>>10<<5)]=Math.floor(r/4294967296),e[31+(128+i>>>10<<5)]=r,t.sigBytes=4*e.length,this._process(),this._hash.toX32()},clone:function(){var t=e.clone.call(this);return t._hash=this._hash.clone(),t},blockSize:32});t.SHA512=e._createHelper(r),t.HmacSHA512=e._createHmacHelper(r)}(),P=(M=U).x64,c=P.Word,f=P.WordArray,P=M.algo,d=P.SHA512,P=P.SHA384=d.extend({_doReset:function(){this._hash=new f.init([new c.init(3418070365,3238371032),new c.init(1654270250,914150663),new c.init(2438529370,812702999),new c.init(355462360,4144912697),new c.init(1731405415,4290775857),new c.init(2394180231,1750603025),new c.init(3675008525,1694076839),new c.init(1203062813,3204075428)])},_doFinalize:function(){var t=d._doFinalize.call(this);return t.sigBytes-=16,t}}),M.SHA384=d._createHelper(P),M.HmacSHA384=d._createHmacHelper(P),function(l){var t=U,e=t.lib,f=e.WordArray,i=e.Hasher,d=t.x64.Word,e=t.algo,A=[],H=[],z=[];!function(){for(var t=1,e=0,r=0;r<24;r++){A[t+5*e]=(r+1)*(r+2)/2%64;var i=(2*t+3*e)%5;t=e%5,e=i}for(t=0;t<5;t++)for(e=0;e<5;e++)H[t+5*e]=e+(2*t+3*e)%5*5;for(var n=1,o=0;o<24;o++){for(var s,c=0,a=0,h=0;h<7;h++)1&n&&((s=(1<>>24)|4278255360&(o<<24|o>>>8);(m=r[n]).high^=s=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),m.low^=o}for(var c=0;c<24;c++){for(var a=0;a<5;a++){for(var h=0,l=0,f=0;f<5;f++)h^=(m=r[a+5*f]).high,l^=m.low;var d=C[a];d.high=h,d.low=l}for(a=0;a<5;a++)for(var u=C[(a+4)%5],p=C[(a+1)%5],_=p.high,p=p.low,h=u.high^(_<<1|p>>>31),l=u.low^(p<<1|_>>>31),f=0;f<5;f++)(m=r[a+5*f]).high^=h,m.low^=l;for(var y=1;y<25;y++){var v=(m=r[y]).high,g=m.low,B=A[y];l=B<32?(h=v<>>32-B,g<>>32-B):(h=g<>>64-B,v<>>64-B);B=C[H[y]];B.high=h,B.low=l}var w=C[0],k=r[0];w.high=k.high,w.low=k.low;for(a=0;a<5;a++)for(f=0;f<5;f++){var m=r[y=a+5*f],S=C[y],x=C[(a+1)%5+5*f],b=C[(a+2)%5+5*f];m.high=S.high^~x.high&b.high,m.low=S.low^~x.low&b.low}m=r[0],k=z[c];m.high^=k.high,m.low^=k.low}},_doFinalize:function(){var t=this._data,e=t.words,r=(this._nDataBytes,8*t.sigBytes),i=32*this.blockSize;e[r>>>5]|=1<<24-r%32,e[(l.ceil((1+r)/i)*i>>>5)-1]|=128,t.sigBytes=4*e.length,this._process();for(var n=this._state,e=this.cfg.outputLength/8,o=e/8,s=[],c=0;c>>24)|4278255360&(h<<24|h>>>8);s.push(a=16711935&(a<<8|a>>>24)|4278255360&(a<<24|a>>>8)),s.push(h)}return new f.init(s,e)},clone:function(){for(var t=i.clone.call(this),e=t._state=this._state.slice(0),r=0;r<25;r++)e[r]=e[r].clone();return t}});t.SHA3=i._createHelper(e),t.HmacSHA3=i._createHmacHelper(e)}(Math),Math,F=(w=U).lib,u=F.WordArray,p=F.Hasher,F=w.algo,S=u.create([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8,3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12,1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2,4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13]),x=u.create([5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12,6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2,15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13,8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14,12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11]),b=u.create([11,14,15,12,5,8,7,9,11,13,14,15,6,7,9,8,7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12,11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5,11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12,9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6]),A=u.create([8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6,9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11,9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5,15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8,8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11]),H=u.create([0,1518500249,1859775393,2400959708,2840853838]),z=u.create([1352829926,1548603684,1836072691,2053994217,0]),F=F.RIPEMD160=p.extend({_doReset:function(){this._hash=u.create([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(t,e){for(var r=0;r<16;r++){var i=e+r,n=t[i];t[i]=16711935&(n<<8|n>>>24)|4278255360&(n<<24|n>>>8)}for(var o,s,c,a,h,l,f=this._hash.words,d=H.words,u=z.words,p=S.words,_=x.words,y=b.words,v=A.words,g=o=f[0],B=s=f[1],w=c=f[2],k=a=f[3],m=h=f[4],r=0;r<80;r+=1)l=o+t[e+p[r]]|0,l+=r<16?(s^c^a)+d[0]:r<32?K(s,c,a)+d[1]:r<48?((s|~c)^a)+d[2]:r<64?X(s,c,a)+d[3]:(s^(c|~a))+d[4],l=(l=L(l|=0,y[r]))+h|0,o=h,h=a,a=L(c,10),c=s,s=l,l=g+t[e+_[r]]|0,l+=r<16?(B^(w|~k))+u[0]:r<32?X(B,w,k)+u[1]:r<48?((B|~w)^k)+u[2]:r<64?K(B,w,k)+u[3]:(B^w^k)+u[4],l=(l=L(l|=0,v[r]))+m|0,g=m,m=k,k=L(w,10),w=B,B=l;l=f[1]+c+k|0,f[1]=f[2]+a+m|0,f[2]=f[3]+h+g|0,f[3]=f[4]+o+B|0,f[4]=f[0]+s+w|0,f[0]=l},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;e[i>>>5]|=128<<24-i%32,e[14+(64+i>>>9<<4)]=16711935&(r<<8|r>>>24)|4278255360&(r<<24|r>>>8),t.sigBytes=4*(e.length+1),this._process();for(var e=this._hash,n=e.words,o=0;o<5;o++){var s=n[o];n[o]=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8)}return e},clone:function(){var t=p.clone.call(this);return t._hash=this._hash.clone(),t}}),w.RIPEMD160=p._createHelper(F),w.HmacRIPEMD160=p._createHmacHelper(F),P=(M=U).lib.Base,_=M.enc.Utf8,M.algo.HMAC=P.extend({init:function(t,e){t=this._hasher=new t.init,"string"==typeof e&&(e=_.parse(e));var r=t.blockSize,i=4*r;(e=e.sigBytes>i?t.finalize(e):e).clamp();for(var t=this._oKey=e.clone(),e=this._iKey=e.clone(),n=t.words,o=e.words,s=0;s>>2];t.sigBytes-=e}},d=(e.BlockCipher=a.extend({cfg:a.cfg.extend({mode:n,padding:l}),reset:function(){var t;a.reset.call(this);var e=this.cfg,r=e.iv,e=e.mode;this._xformMode==this._ENC_XFORM_MODE?t=e.createEncryptor:(t=e.createDecryptor,this._minBufferSize=1),this._mode&&this._mode.__creator==t?this._mode.init(this,r&&r.words):(this._mode=t.call(e,this,r&&r.words),this._mode.__creator=t)},_doProcessBlock:function(t,e){this._mode.processBlock(t,e)},_doFinalize:function(){var t,e=this.cfg.padding;return this._xformMode==this._ENC_XFORM_MODE?(e.pad(this._data,this.blockSize),t=this._process(!0)):(t=this._process(!0),e.unpad(t)),t},blockSize:4}),e.CipherParams=r.extend({init:function(t){this.mixIn(t)},toString:function(t){return(t||this.formatter).stringify(this)}})),l=(t.format={}).OpenSSL={stringify:function(t){var e=t.ciphertext,t=t.salt,e=t?s.create([1398893684,1701076831]).concat(t).concat(e):e;return e.toString(o)},parse:function(t){var e,r=o.parse(t),t=r.words;return 1398893684==t[0]&&1701076831==t[1]&&(e=s.create(t.slice(2,4)),t.splice(0,4),r.sigBytes-=16),d.create({ciphertext:r,salt:e})}},u=e.SerializableCipher=r.extend({cfg:r.extend({format:l}),encrypt:function(t,e,r,i){i=this.cfg.extend(i);var n=t.createEncryptor(r,i),e=n.finalize(e),n=n.cfg;return d.create({ciphertext:e,key:r,iv:n.iv,algorithm:t,mode:n.mode,padding:n.padding,blockSize:t.blockSize,formatter:i.format})},decrypt:function(t,e,r,i){return i=this.cfg.extend(i),e=this._parse(e,i.format),t.createDecryptor(r,i).finalize(e.ciphertext)},_parse:function(t,e){return"string"==typeof t?e.parse(t,this):t}}),t=(t.kdf={}).OpenSSL={execute:function(t,e,r,i){i=i||s.random(8);t=c.create({keySize:e+r}).compute(t,i),r=s.create(t.words.slice(e),4*r);return t.sigBytes=4*e,d.create({key:t,iv:r,salt:i})}},p=e.PasswordBasedCipher=u.extend({cfg:u.cfg.extend({kdf:t}),encrypt:function(t,e,r,i){r=(i=this.cfg.extend(i)).kdf.execute(r,t.keySize,t.ivSize);i.iv=r.iv;i=u.encrypt.call(this,t,e,r.key,i);return i.mixIn(r),i},decrypt:function(t,e,r,i){i=this.cfg.extend(i),e=this._parse(e,i.format);r=i.kdf.execute(r,t.keySize,t.ivSize,e.salt);return i.iv=r.iv,u.decrypt.call(this,t,e,r.key,i)}})}(),U.mode.CFB=((F=U.lib.BlockCipherMode.extend()).Encryptor=F.extend({processBlock:function(t,e){var r=this._cipher,i=r.blockSize;j.call(this,t,e,i,r),this._prevBlock=t.slice(e,e+i)}}),F.Decryptor=F.extend({processBlock:function(t,e){var r=this._cipher,i=r.blockSize,n=t.slice(e,e+i);j.call(this,t,e,i,r),this._prevBlock=n}}),F),U.mode.CTR=(M=U.lib.BlockCipherMode.extend(),P=M.Encryptor=M.extend({processBlock:function(t,e){var r=this._cipher,i=r.blockSize,n=this._iv,o=this._counter;n&&(o=this._counter=n.slice(0),this._iv=void 0);var s=o.slice(0);r.encryptBlock(s,0),o[i-1]=o[i-1]+1|0;for(var c=0;c>>2]|=e<<24-r%4*8,t.sigBytes+=e},unpad:function(t){var e=255&t.words[t.sigBytes-1>>>2];t.sigBytes-=e}},U.pad.Iso10126={pad:function(t,e){e*=4,e-=t.sigBytes%e;t.concat(U.lib.WordArray.random(e-1)).concat(U.lib.WordArray.create([e<<24],1))},unpad:function(t){var e=255&t.words[t.sigBytes-1>>>2];t.sigBytes-=e}},U.pad.Iso97971={pad:function(t,e){t.concat(U.lib.WordArray.create([2147483648],1)),U.pad.ZeroPadding.pad(t,e)},unpad:function(t){U.pad.ZeroPadding.unpad(t),t.sigBytes--}},U.pad.ZeroPadding={pad:function(t,e){e*=4;t.clamp(),t.sigBytes+=e-(t.sigBytes%e||e)},unpad:function(t){for(var e=t.words,r=t.sigBytes-1,r=t.sigBytes-1;0<=r;r--)if(e[r>>>2]>>>24-r%4*8&255){t.sigBytes=r+1;break}}},U.pad.NoPadding={pad:function(){},unpad:function(){}},m=(P=U).lib.CipherParams,C=P.enc.Hex,P.format.Hex={stringify:function(t){return t.ciphertext.toString(C)},parse:function(t){t=C.parse(t);return m.create({ciphertext:t})}},function(){var t=U,e=t.lib.BlockCipher,r=t.algo,h=[],l=[],f=[],d=[],u=[],p=[],_=[],y=[],v=[],g=[];!function(){for(var t=[],e=0;e<256;e++)t[e]=e<128?e<<1:e<<1^283;for(var r=0,i=0,e=0;e<256;e++){var n=i^i<<1^i<<2^i<<3^i<<4;h[r]=n=n>>>8^255&n^99;var o=t[l[n]=r],s=t[o],c=t[s],a=257*t[n]^16843008*n;f[r]=a<<24|a>>>8,d[r]=a<<16|a>>>16,u[r]=a<<8|a>>>24,p[r]=a,_[n]=(a=16843009*c^65537*s^257*o^16843008*r)<<24|a>>>8,y[n]=a<<16|a>>>16,v[n]=a<<8|a>>>24,g[n]=a,r?(r=o^t[t[t[c^o]]],i^=t[t[i]]):r=i=1}}();var B=[0,1,2,4,8,16,32,64,128,27,54],r=r.AES=e.extend({_doReset:function(){if(!this._nRounds||this._keyPriorReset!==this._key){for(var t=this._keyPriorReset=this._key,e=t.words,r=t.sigBytes/4,i=4*(1+(this._nRounds=6+r)),n=this._keySchedule=[],o=0;o>>24]<<24|h[a>>>16&255]<<16|h[a>>>8&255]<<8|h[255&a]):(a=h[(a=a<<8|a>>>24)>>>24]<<24|h[a>>>16&255]<<16|h[a>>>8&255]<<8|h[255&a],a^=B[o/r|0]<<24),n[o]=n[o-r]^a);for(var s=this._invKeySchedule=[],c=0;c>>24]]^y[h[a>>>16&255]]^v[h[a>>>8&255]]^g[h[255&a]]}}},encryptBlock:function(t,e){this._doCryptBlock(t,e,this._keySchedule,f,d,u,p,h)},decryptBlock:function(t,e){var r=t[e+1];t[e+1]=t[e+3],t[e+3]=r,this._doCryptBlock(t,e,this._invKeySchedule,_,y,v,g,l);r=t[e+1];t[e+1]=t[e+3],t[e+3]=r},_doCryptBlock:function(t,e,r,i,n,o,s,c){for(var a=this._nRounds,h=t[e]^r[0],l=t[e+1]^r[1],f=t[e+2]^r[2],d=t[e+3]^r[3],u=4,p=1;p>>24]^n[l>>>16&255]^o[f>>>8&255]^s[255&d]^r[u++],y=i[l>>>24]^n[f>>>16&255]^o[d>>>8&255]^s[255&h]^r[u++],v=i[f>>>24]^n[d>>>16&255]^o[h>>>8&255]^s[255&l]^r[u++],g=i[d>>>24]^n[h>>>16&255]^o[l>>>8&255]^s[255&f]^r[u++],h=_,l=y,f=v,d=g;_=(c[h>>>24]<<24|c[l>>>16&255]<<16|c[f>>>8&255]<<8|c[255&d])^r[u++],y=(c[l>>>24]<<24|c[f>>>16&255]<<16|c[d>>>8&255]<<8|c[255&h])^r[u++],v=(c[f>>>24]<<24|c[d>>>16&255]<<16|c[h>>>8&255]<<8|c[255&l])^r[u++],g=(c[d>>>24]<<24|c[h>>>16&255]<<16|c[l>>>8&255]<<8|c[255&f])^r[u++];t[e]=_,t[e+1]=y,t[e+2]=v,t[e+3]=g},keySize:8});t.AES=e._createHelper(r)}(),function(){var t=U,e=t.lib,i=e.WordArray,r=e.BlockCipher,e=t.algo,h=[57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,27,19,11,3,60,52,44,36,63,55,47,39,31,23,15,7,62,54,46,38,30,22,14,6,61,53,45,37,29,21,13,5,28,20,12,4],l=[14,17,11,24,1,5,3,28,15,6,21,10,23,19,12,4,26,8,16,7,27,20,13,2,41,52,31,37,47,55,30,40,51,45,33,48,44,49,39,56,34,53,46,42,50,36,29,32],f=[1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28],d=[{0:8421888,268435456:32768,536870912:8421378,805306368:2,1073741824:512,1342177280:8421890,1610612736:8389122,1879048192:8388608,2147483648:514,2415919104:8389120,2684354560:33280,2952790016:8421376,3221225472:32770,3489660928:8388610,3758096384:0,4026531840:33282,134217728:0,402653184:8421890,671088640:33282,939524096:32768,1207959552:8421888,1476395008:512,1744830464:8421378,2013265920:2,2281701376:8389120,2550136832:33280,2818572288:8421376,3087007744:8389122,3355443200:8388610,3623878656:32770,3892314112:514,4160749568:8388608,1:32768,268435457:2,536870913:8421888,805306369:8388608,1073741825:8421378,1342177281:33280,1610612737:512,1879048193:8389122,2147483649:8421890,2415919105:8421376,2684354561:8388610,2952790017:33282,3221225473:514,3489660929:8389120,3758096385:32770,4026531841:0,134217729:8421890,402653185:8421376,671088641:8388608,939524097:512,1207959553:32768,1476395009:8388610,1744830465:2,2013265921:33282,2281701377:32770,2550136833:8389122,2818572289:514,3087007745:8421888,3355443201:8389120,3623878657:0,3892314113:33280,4160749569:8421378},{0:1074282512,16777216:16384,33554432:524288,50331648:1074266128,67108864:1073741840,83886080:1074282496,100663296:1073758208,117440512:16,134217728:540672,150994944:1073758224,167772160:1073741824,184549376:540688,201326592:524304,218103808:0,234881024:16400,251658240:1074266112,8388608:1073758208,25165824:540688,41943040:16,58720256:1073758224,75497472:1074282512,92274688:1073741824,109051904:524288,125829120:1074266128,142606336:524304,159383552:0,176160768:16384,192937984:1074266112,209715200:1073741840,226492416:540672,243269632:1074282496,260046848:16400,268435456:0,285212672:1074266128,301989888:1073758224,318767104:1074282496,335544320:1074266112,352321536:16,369098752:540688,385875968:16384,402653184:16400,419430400:524288,436207616:524304,452984832:1073741840,469762048:540672,486539264:1073758208,503316480:1073741824,520093696:1074282512,276824064:540688,293601280:524288,310378496:1074266112,327155712:16384,343932928:1073758208,360710144:1074282512,377487360:16,394264576:1073741824,411041792:1074282496,427819008:1073741840,444596224:1073758224,461373440:524304,478150656:0,494927872:16400,511705088:1074266128,528482304:540672},{0:260,1048576:0,2097152:67109120,3145728:65796,4194304:65540,5242880:67108868,6291456:67174660,7340032:67174400,8388608:67108864,9437184:67174656,10485760:65792,11534336:67174404,12582912:67109124,13631488:65536,14680064:4,15728640:256,524288:67174656,1572864:67174404,2621440:0,3670016:67109120,4718592:67108868,5767168:65536,6815744:65540,7864320:260,8912896:4,9961472:256,11010048:67174400,12058624:65796,13107200:65792,14155776:67109124,15204352:67174660,16252928:67108864,16777216:67174656,17825792:65540,18874368:65536,19922944:67109120,20971520:256,22020096:67174660,23068672:67108868,24117248:0,25165824:67109124,26214400:67108864,27262976:4,28311552:65792,29360128:67174400,30408704:260,31457280:65796,32505856:67174404,17301504:67108864,18350080:260,19398656:67174656,20447232:0,21495808:65540,22544384:67109120,23592960:256,24641536:67174404,25690112:65536,26738688:67174660,27787264:65796,28835840:67108868,29884416:67109124,30932992:67174400,31981568:4,33030144:65792},{0:2151682048,65536:2147487808,131072:4198464,196608:2151677952,262144:0,327680:4198400,393216:2147483712,458752:4194368,524288:2147483648,589824:4194304,655360:64,720896:2147487744,786432:2151678016,851968:4160,917504:4096,983040:2151682112,32768:2147487808,98304:64,163840:2151678016,229376:2147487744,294912:4198400,360448:2151682112,425984:0,491520:2151677952,557056:4096,622592:2151682048,688128:4194304,753664:4160,819200:2147483648,884736:4194368,950272:4198464,1015808:2147483712,1048576:4194368,1114112:4198400,1179648:2147483712,1245184:0,1310720:4160,1376256:2151678016,1441792:2151682048,1507328:2147487808,1572864:2151682112,1638400:2147483648,1703936:2151677952,1769472:4198464,1835008:2147487744,1900544:4194304,1966080:64,2031616:4096,1081344:2151677952,1146880:2151682112,1212416:0,1277952:4198400,1343488:4194368,1409024:2147483648,1474560:2147487808,1540096:64,1605632:2147483712,1671168:4096,1736704:2147487744,1802240:2151678016,1867776:4160,1933312:2151682048,1998848:4194304,2064384:4198464},{0:128,4096:17039360,8192:262144,12288:536870912,16384:537133184,20480:16777344,24576:553648256,28672:262272,32768:16777216,36864:537133056,40960:536871040,45056:553910400,49152:553910272,53248:0,57344:17039488,61440:553648128,2048:17039488,6144:553648256,10240:128,14336:17039360,18432:262144,22528:537133184,26624:553910272,30720:536870912,34816:537133056,38912:0,43008:553910400,47104:16777344,51200:536871040,55296:553648128,59392:16777216,63488:262272,65536:262144,69632:128,73728:536870912,77824:553648256,81920:16777344,86016:553910272,90112:537133184,94208:16777216,98304:553910400,102400:553648128,106496:17039360,110592:537133056,114688:262272,118784:536871040,122880:0,126976:17039488,67584:553648256,71680:16777216,75776:17039360,79872:537133184,83968:536870912,88064:17039488,92160:128,96256:553910272,100352:262272,104448:553910400,108544:0,112640:553648128,116736:16777344,120832:262144,124928:537133056,129024:536871040},{0:268435464,256:8192,512:270532608,768:270540808,1024:268443648,1280:2097152,1536:2097160,1792:268435456,2048:0,2304:268443656,2560:2105344,2816:8,3072:270532616,3328:2105352,3584:8200,3840:270540800,128:270532608,384:270540808,640:8,896:2097152,1152:2105352,1408:268435464,1664:268443648,1920:8200,2176:2097160,2432:8192,2688:268443656,2944:270532616,3200:0,3456:270540800,3712:2105344,3968:268435456,4096:268443648,4352:270532616,4608:270540808,4864:8200,5120:2097152,5376:268435456,5632:268435464,5888:2105344,6144:2105352,6400:0,6656:8,6912:270532608,7168:8192,7424:268443656,7680:270540800,7936:2097160,4224:8,4480:2105344,4736:2097152,4992:268435464,5248:268443648,5504:8200,5760:270540808,6016:270532608,6272:270540800,6528:270532616,6784:8192,7040:2105352,7296:2097160,7552:0,7808:268435456,8064:268443656},{0:1048576,16:33555457,32:1024,48:1049601,64:34604033,80:0,96:1,112:34603009,128:33555456,144:1048577,160:33554433,176:34604032,192:34603008,208:1025,224:1049600,240:33554432,8:34603009,24:0,40:33555457,56:34604032,72:1048576,88:33554433,104:33554432,120:1025,136:1049601,152:33555456,168:34603008,184:1048577,200:1024,216:34604033,232:1,248:1049600,256:33554432,272:1048576,288:33555457,304:34603009,320:1048577,336:33555456,352:34604032,368:1049601,384:1025,400:34604033,416:1049600,432:1,448:0,464:34603008,480:33554433,496:1024,264:1049600,280:33555457,296:34603009,312:1,328:33554432,344:1048576,360:1025,376:34604032,392:33554433,408:34603008,424:0,440:34604033,456:1049601,472:1024,488:33555456,504:1048577},{0:134219808,1:131072,2:134217728,3:32,4:131104,5:134350880,6:134350848,7:2048,8:134348800,9:134219776,10:133120,11:134348832,12:2080,13:0,14:134217760,15:133152,2147483648:2048,2147483649:134350880,2147483650:134219808,2147483651:134217728,2147483652:134348800,2147483653:133120,2147483654:133152,2147483655:32,2147483656:134217760,2147483657:2080,2147483658:131104,2147483659:134350848,2147483660:0,2147483661:134348832,2147483662:134219776,2147483663:131072,16:133152,17:134350848,18:32,19:2048,20:134219776,21:134217760,22:134348832,23:131072,24:0,25:131104,26:134348800,27:134219808,28:134350880,29:133120,30:2080,31:134217728,2147483664:131072,2147483665:2048,2147483666:134348832,2147483667:133152,2147483668:32,2147483669:134348800,2147483670:134217728,2147483671:134219808,2147483672:134350880,2147483673:134217760,2147483674:134219776,2147483675:0,2147483676:133120,2147483677:2080,2147483678:131104,2147483679:134350848}],u=[4160749569,528482304,33030144,2064384,129024,8064,504,2147483679],n=e.DES=r.extend({_doReset:function(){for(var t=this._key.words,e=[],r=0;r<56;r++){var i=h[r]-1;e[r]=t[i>>>5]>>>31-i%32&1}for(var n=this._subKeys=[],o=0;o<16;o++){for(var s=n[o]=[],c=f[o],r=0;r<24;r++)s[r/6|0]|=e[(l[r]-1+c)%28]<<31-r%6,s[4+(r/6|0)]|=e[28+(l[r+24]-1+c)%28]<<31-r%6;s[0]=s[0]<<1|s[0]>>>31;for(r=1;r<7;r++)s[r]=s[r]>>>4*(r-1)+3;s[7]=s[7]<<5|s[7]>>>27}for(var a=this._invSubKeys=[],r=0;r<16;r++)a[r]=n[15-r]},encryptBlock:function(t,e){this._doCryptBlock(t,e,this._subKeys)},decryptBlock:function(t,e){this._doCryptBlock(t,e,this._invSubKeys)},_doCryptBlock:function(t,e,r){this._lBlock=t[e],this._rBlock=t[e+1],p.call(this,4,252645135),p.call(this,16,65535),_.call(this,2,858993459),_.call(this,8,16711935),p.call(this,1,1431655765);for(var i=0;i<16;i++){for(var n=r[i],o=this._lBlock,s=this._rBlock,c=0,a=0;a<8;a++)c|=d[a][((s^n[a])&u[a])>>>0];this._lBlock=s,this._rBlock=o^c}var h=this._lBlock;this._lBlock=this._rBlock,this._rBlock=h,p.call(this,1,1431655765),_.call(this,8,16711935),_.call(this,2,858993459),p.call(this,16,65535),p.call(this,4,252645135),t[e]=this._lBlock,t[e+1]=this._rBlock},keySize:2,ivSize:2,blockSize:2});function p(t,e){e=(this._lBlock>>>t^this._rBlock)&e;this._rBlock^=e,this._lBlock^=e<>>t^this._lBlock)&e;this._lBlock^=e,this._rBlock^=e<192.");var e=t.slice(0,2),r=t.length<4?t.slice(0,2):t.slice(2,4),t=t.length<6?t.slice(0,2):t.slice(4,6);this._des1=n.createEncryptor(i.create(e)),this._des2=n.createEncryptor(i.create(r)),this._des3=n.createEncryptor(i.create(t))},encryptBlock:function(t,e){this._des1.encryptBlock(t,e),this._des2.decryptBlock(t,e),this._des3.encryptBlock(t,e)},decryptBlock:function(t,e){this._des3.decryptBlock(t,e),this._des2.encryptBlock(t,e),this._des1.decryptBlock(t,e)},keySize:6,ivSize:2,blockSize:2});t.TripleDES=r._createHelper(e)}(),function(){var t=U,e=t.lib.StreamCipher,r=t.algo,i=r.RC4=e.extend({_doReset:function(){for(var t=this._key,e=t.words,r=t.sigBytes,i=this._S=[],n=0;n<256;n++)i[n]=n;for(var n=0,o=0;n<256;n++){var s=n%r,s=e[s>>>2]>>>24-s%4*8&255,o=(o+i[n]+s)%256,s=i[n];i[n]=i[o],i[o]=s}this._i=this._j=0},_doProcessBlock:function(t,e){t[e]^=n.call(this)},keySize:8,ivSize:0});function n(){for(var t=this._S,e=this._i,r=this._j,i=0,n=0;n<4;n++){var r=(r+t[e=(e+1)%256])%256,o=t[e];t[e]=t[r],t[r]=o,i|=t[(t[e]+t[r])%256]<<24-8*n}return this._i=e,this._j=r,i}t.RC4=e._createHelper(i);r=r.RC4Drop=i.extend({cfg:i.cfg.extend({drop:192}),_doReset:function(){i._doReset.call(this);for(var t=this.cfg.drop;0>>24)|4278255360&(t[r]<<24|t[r]>>>8);for(var i=this._X=[t[0],t[3]<<16|t[2]>>>16,t[1],t[0]<<16|t[3]>>>16,t[2],t[1]<<16|t[0]>>>16,t[3],t[2]<<16|t[1]>>>16],n=this._C=[t[2]<<16|t[2]>>>16,4294901760&t[0]|65535&t[1],t[3]<<16|t[3]>>>16,4294901760&t[1]|65535&t[2],t[0]<<16|t[0]>>>16,4294901760&t[2]|65535&t[3],t[1]<<16|t[1]>>>16,4294901760&t[3]|65535&t[0]],r=this._b=0;r<4;r++)N.call(this);for(r=0;r<8;r++)n[r]^=i[r+4&7];if(e){var o=e.words,s=o[0],c=o[1],e=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),o=16711935&(c<<8|c>>>24)|4278255360&(c<<24|c>>>8),s=e>>>16|4294901760&o,c=o<<16|65535&e;n[0]^=e,n[1]^=s,n[2]^=o,n[3]^=c,n[4]^=e,n[5]^=s,n[6]^=o,n[7]^=c;for(r=0;r<4;r++)N.call(this)}},_doProcessBlock:function(t,e){var r=this._X;N.call(this),D[0]=r[0]^r[5]>>>16^r[3]<<16,D[1]=r[2]^r[7]>>>16^r[5]<<16,D[2]=r[4]^r[1]>>>16^r[7]<<16,D[3]=r[6]^r[3]>>>16^r[1]<<16;for(var i=0;i<4;i++)D[i]=16711935&(D[i]<<8|D[i]>>>24)|4278255360&(D[i]<<24|D[i]>>>8),t[e+i]^=D[i]},blockSize:4,ivSize:2}),M.Rabbit=F._createHelper(P),F=(M=U).lib.StreamCipher,P=M.algo,W=[],O=[],I=[],P=P.RabbitLegacy=F.extend({_doReset:function(){for(var t=this._key.words,e=this.cfg.iv,r=this._X=[t[0],t[3]<<16|t[2]>>>16,t[1],t[0]<<16|t[3]>>>16,t[2],t[1]<<16|t[0]>>>16,t[3],t[2]<<16|t[1]>>>16],i=this._C=[t[2]<<16|t[2]>>>16,4294901760&t[0]|65535&t[1],t[3]<<16|t[3]>>>16,4294901760&t[1]|65535&t[2],t[0]<<16|t[0]>>>16,4294901760&t[2]|65535&t[3],t[1]<<16|t[1]>>>16,4294901760&t[3]|65535&t[0]],n=this._b=0;n<4;n++)q.call(this);for(n=0;n<8;n++)i[n]^=r[n+4&7];if(e){var o=e.words,s=o[0],t=o[1],e=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),o=16711935&(t<<8|t>>>24)|4278255360&(t<<24|t>>>8),s=e>>>16|4294901760&o,t=o<<16|65535&e;i[0]^=e,i[1]^=s,i[2]^=o,i[3]^=t,i[4]^=e,i[5]^=s,i[6]^=o,i[7]^=t;for(n=0;n<4;n++)q.call(this)}},_doProcessBlock:function(t,e){var r=this._X;q.call(this),W[0]=r[0]^r[5]>>>16^r[3]<<16,W[1]=r[2]^r[7]>>>16^r[5]<<16,W[2]=r[4]^r[1]>>>16^r[7]<<16,W[3]=r[6]^r[3]>>>16^r[1]<<16;for(var i=0;i<4;i++)W[i]=16711935&(W[i]<<8|W[i]>>>24)|4278255360&(W[i]<<24|W[i]>>>8),t[e+i]^=W[i]},blockSize:4,ivSize:2}),M.RabbitLegacy=F._createHelper(P),U});
\ No newline at end of file
diff --git a/docs/updateRecord.md b/docs/updateRecord.md
index 3788f10..1acf857 100644
--- a/docs/updateRecord.md
+++ b/docs/updateRecord.md
@@ -1,4 +1,32 @@
# drpyS更新记录
+
+### 20250310
+
+更新至V1.1.23
+
+1. 修复番茄小说
+2. 新增2个源
+
+### 20250227
+
+更新至V1.1.22
+
+1. 优化123网盘的逻辑和推送示例
+2. 优化sqlite3库兼容装逼壳
+
+### 20250226
+
+更新至V1.1.21
+
+1. 增加123网盘的逻辑和推送示例
+
+### 20250225
+
+更新至V1.1.20
+
+1. UC整体逻辑修改,并在扫码插件增加了UC_TOKEN扫码逻辑
+2. 数据库sqlite3优化,寻找另一个wasm实现的库平替了兼容性极差的sqlite3原生库
+
### 20250224
更新至V1.1.19
@@ -6,9 +34,10 @@
1. 修复 推送和所有网盘源涉及的UC播放问题,支持原代本和原代服务加速
2. 更新猫爪的 alist.js
3. 新增 `sqlite` `sqlite3` 依赖,在ds源里的异步方法里直接使用,示例:
+
```javascript
await database.startDb();
-console.log('database:',database);
+console.log('database:', database);
const db = database.db;
// 创建表
await db.run(`
diff --git a/js/gaze.js b/js/gaze.js
new file mode 100644
index 0000000..c210c0e
--- /dev/null
+++ b/js/gaze.js
@@ -0,0 +1,591 @@
+globalThis.window = globalThis.global = globalThis;
+
+class Go {
+ constructor() {
+ let s = new TextEncoder("utf-8"),
+ i = new TextDecoder("utf-8"),
+ r = new DataView(new ArrayBuffer(8));
+ var o = [];
+
+ this._callbackTimeouts = new Map();
+ this._nextCallbackTimeoutID = 1;
+ let e = () => new DataView(this._inst.exports.m.buffer);
+ let t = (e) => {
+ r.setBigInt64(0, e, !0);
+ let t = r.getFloat64(0, !0);
+ if (0 === t) return;
+ if (!isNaN(t)) return t;
+ let n = 4294967295n & e;
+ return this._values[n];
+ };
+ let n = (n) => {
+ let s = e().getBigUint64(n, !0);
+ return t(s);
+ };
+ let l = (e) => {
+ if ("number" == typeof e)
+ return isNaN(e)
+ ? 2146959360n << 32n
+ : 0 === e
+ ? (2146959360n << 32n) | 1n
+ : (r.setFloat64(0, e, !0), r.getBigInt64(0, !0));
+ switch (e) {
+ case void 0:
+ return 0n;
+ case null:
+ return (2146959360n << 32n) | 2n;
+ case !0:
+ return (2146959360n << 32n) | 3n;
+ case !1:
+ return (2146959360n << 32n) | 4n;
+ }
+ let t = this._ids.get(e);
+ void 0 === t &&
+ (void 0 === (t = this._idPool.pop()) &&
+ (t = BigInt(this._values.length)),
+ (this._values[t] = e),
+ (this._goRefCounts[t] = 0),
+ this._ids.set(e, t)),
+ this._goRefCounts[t]++;
+ let n = 1n;
+ switch (typeof e) {
+ case "string":
+ n = 2n;
+ break;
+ case "symbol":
+ n = 3n;
+ break;
+ case "function":
+ n = 4n;
+ }
+ return t | ((2146959360n | n) << 32n);
+ };
+ let a = (t, n) => {
+ let s = l(n);
+ e().setBigUint64(t, s, !0);
+ };
+ let c = (e, t, n) => new Uint8Array(this._inst.exports.m.buffer, e, t);
+ let $ = (e, t, s) => {
+ let i = Array(t);
+ for (let r = 0; r < t; r++) i[r] = n(e + 8 * r);
+ return i;
+ };
+ let d = (e, t) => i.decode(new DataView(this._inst.exports.m.buffer, e, t));
+ let u = Date.now() - performance.now();
+ this.importObject = {
+ wasi_snapshot_preview1: {
+ fd_write: function (t, n, s, r) {
+ let l = 0;
+ if (1 == t)
+ for (let a = 0; a < s; a++) {
+ let c = n + 8 * a,
+ $ = e().getUint32(c + 0, !0),
+ d = e().getUint32(c + 4, !0);
+ l += d;
+ for (let u = 0; u < d; u++) {
+ let f = e().getUint8($ + u);
+ if (13 == f);
+ else if (10 == f) {
+ let h = i.decode(new Uint8Array(o));
+ (o = []), console.log(h);
+ } else o.push(f);
+ }
+ }
+ else console.error("invalid file descriptor:", t);
+ return e().setUint32(r, l, !0), 0;
+ },
+ fd_close: () => 0,
+ fd_fdstat_get: () => 0,
+ fd_seek: () => 0,
+ proc_exit(e) {
+ if (globalThis.process) process.exit(e);
+ else throw "trying to exit with code " + e;
+ },
+ random_get: (e, t) => (crypto.getRandomValues(c(e, t)), 0),
+ },
+ a: {
+ "runtime.ticks": () => u + performance.now(),
+ "runtime.sleepTicks": (e) => {
+ setTimeout(this._inst.exports.t, e);
+ },
+ d(e) {
+ console.error("d not implemented");
+ },
+ e(e, t) {
+ let n = d(e, t);
+ return l(n);
+ },
+ a(e, n, s) {
+ let i = d(n, s),
+ r = t(e),
+ o = Reflect.get(r, i);
+ return l(o);
+ },
+ f(e, n, s, i) {
+ let r = t(e),
+ o = d(n, s),
+ l = t(i);
+ Reflect.set(r, o, l);
+ },
+ "syscall/js.valueDelete"(e, n, s) {
+ let i = t(e),
+ r = d(n, s);
+ Reflect.deleteProperty(i, r);
+ },
+ i: (e, n) => l(Reflect.get(t(e), n)),
+ fIndex(e, n, s) {
+ Reflect.set(t(e), n, t(s));
+ },
+ j(n, s, i, r, o, l, c) {
+ let u = t(s),
+ f = d(i, r),
+ h = $(o, l, c);
+ try {
+ let g = Reflect.get(u, f);
+ a(n, Reflect.apply(g, u, h)), e().setUint8(n + 8, 1);
+ } catch (p) {
+ a(n, p), e().setUint8(n + 8, 0);
+ }
+ },
+ "syscall/js.valueInvoke"(n, s, i, r, o) {
+ try {
+ let l = t(s),
+ c = $(i, r, o);
+ a(n, Reflect.apply(l, void 0, c)), e().setUint8(n + 8, 1);
+ } catch (d) {
+ a(n, d), e().setUint8(n + 8, 0);
+ }
+ },
+ g(n, s, i, r, o) {
+ let l = t(s),
+ c = $(i, r, o);
+ try {
+ a(n, Reflect.construct(l, c)), e().setUint8(n + 8, 1);
+ } catch (d) {
+ a(n, d), e().setUint8(n + 8, 0);
+ }
+ },
+ h: (e) => t(e).length,
+ b(n, i) {
+ let r = String(t(i)),
+ o = s.encode(r);
+ a(n, o), e().setInt32(n + 8, o.length, !0);
+ },
+ c(e, n, s, i) {
+ let r = t(e);
+ c(n, s, i).set(r);
+ },
+ "syscall/js.valueInstanceOf": (e, n) => t(e) instanceof t(n),
+ k(n, s, i, r, o) {
+ let l = n + 4,
+ a = c(s, i),
+ $ = t(o);
+ if (!($ instanceof Uint8Array || $ instanceof Uint8ClampedArray)) {
+ e().setUint8(l, 0);
+ return;
+ }
+ let d = $.subarray(0, a.length);
+ a.set(d), e().setUint32(n, d.length, !0), e().setUint8(l, 1);
+ },
+ l(n, s, i, r, o) {
+ let l = n + 4,
+ a = t(s),
+ $ = c(i, r);
+ if (!(a instanceof Uint8Array || a instanceof Uint8ClampedArray)) {
+ e().setUint8(l, 0);
+ return;
+ }
+ let d = $.subarray(0, a.length);
+ a.set(d), e().setUint32(n, d.length, !0), e().setUint8(l, 1);
+ },
+ },
+ };
+ this.importObject.env = this.importObject.a;
+ }
+ async run(instance) {
+ this._inst = instance;
+ this._values = [NaN, 0, null, true, false, globalThis, this];
+ this._goRefCounts = [];
+ this._ids = new Map();
+ this._idPool = [];
+ this.exited = false;
+ while (true) {
+ const resumePromise = new Promise((resolve) => {
+ this._resolveCallbackPromise = () => {
+ if (this.exited) {
+ throw new Error("bad callback: Go program has already exited");
+ }
+ setTimeout(resolve, 0);
+ };
+ });
+
+ this._inst.exports.r();
+ if (this.exited) break;
+
+ await resumePromise;
+ }
+ }
+ _resume() {
+ if (this.exited) {
+ throw new Error("Go program has already exited");
+ }
+ this._inst.exports.s();
+ if (this.exited) {
+ this._resolveExitPromise();
+ }
+ }
+ _makeFuncWrapper(funcId) {
+ const self = this;
+ return function () {
+ const event = {
+ id: funcId,
+ this: this,
+ args: arguments,
+ };
+ self._pendingEvent = event;
+ self._resume();
+ const result = event.result;
+ return result;
+ };
+ }
+}
+
+const decryptor = (() => {
+ let wasmInstance = null;
+ let go = new Go();
+
+ const pedanticAe = function (buffer) {
+ const decompressedSync = zlib.brotliDecompressSync(buffer);
+ return decompressedSync;
+ };
+ const initWASM = async (func) => {
+ const wasmBuffer = await fetchWASM();
+ const { instance } = await WebAssembly.instantiate(
+ wasmBuffer,
+ go.importObject
+ );
+ wasmInstance = instance;
+ go.run(instance);
+ };
+ const fetchWASM = async () => {
+ const response = await axios.get(
+ "https://temp-rs-1257790209.cos.ap-chengdu.myqcloud.com/IceDespair-V2.6.svg",
+ {
+ responseType: "arraybuffer",
+ headers: {
+ "Content-Type": "application/wasm",
+ },
+ }
+ );
+ return pedanticAe(new Uint8Array(response.data));
+ };
+ const parseUrlParams = (url) => {
+ const params = {};
+ const queryString = url.split("?")[1];
+ if (!queryString) return params;
+
+ queryString.split("-").forEach((pair) => {
+ const [key, value] = pair.split("=");
+ if (key && value) params[key] = decodeURIComponent(value);
+ });
+ return params;
+ };
+ const getWasmFunc = (name, mid, key) => {
+ return window[
+ bytesToString(window["DimGive"](name, mid, decodeURIComponent(key)))
+ ];
+ };
+ const decryptDataM3u = async (bytes, sign, mid, key) => {
+ if (!wasmInstance) await initWASM();
+ const result = getWasmFunc("nihilism", mid, key)(
+ bytes,
+ sign,
+ mid,
+ decodeURIComponent(key)
+ );
+ return bytesToString(pedanticAe(result));
+ };
+ const decryptData = async (data, mid, key) => {
+ if (!wasmInstance) await initWASM();
+ const result = getWasmFunc("8069", mid, key)(
+ data,
+ mid,
+ decodeURIComponent(key)
+ );
+ return bytesToString(result);
+ };
+ const decryptStream = async (data, mid, key, url) => {
+ if (!url.includes("gazes_v-@_info")) return url;
+ const istr = url.split("/").at(-1);
+ const ungzipped = pako.ungzip(data, {
+ to: "string",
+ });
+ const bytes = processBytes(CryptoJS.enc.Base64.parse(ungzipped));
+ const sign = CryptoJS.MD5(
+ `${istr}- are we anti-socialists? against the government? spies? traitor? fresh blood? no, we are just weak, sick bystanders; we just need to rot little by little with formalism until we finally become food for new shoots. `
+ )
+ .toString()
+ .substring(8, 24);
+ return decryptDataM3u(bytes, sign, mid, key);
+ };
+ const processBytes = (base64Data) => {
+ return Uint8Array.from(
+ {
+ length: base64Data.sigBytes,
+ },
+ (_, i) => (base64Data.words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff
+ );
+ };
+ const bytesToString = (byteArray) => {
+ return String.fromCharCode.apply(null, byteArray);
+ };
+ const decryptPlay = async (playUrl, src) => {
+ const params = parseUrlParams(playUrl);
+ const encryptedSrc = src;
+ const decryptedLink = await decryptData(
+ Uint8Array.from(atob(encryptedSrc), (c) => c.charCodeAt(0)),
+ params.mid,
+ params[Object.keys(params).at(-1)]
+ );
+ return decryptedLink;
+ };
+ const decryptM3u8 = async (playUrl, src, decryptedLink) => {
+ const params = parseUrlParams(playUrl);
+ const encryptedSrc = src;
+ const { data } = await axios.get(decryptedLink, {
+ responseType: "arraybuffer",
+ });
+ const m3u8 = await decryptStream(
+ data,
+ params.mid,
+ params[Object.keys(params).at(-1)],
+ decryptedLink
+ );
+ return m3u8;
+ };
+ return {
+ decryptM3u8,
+ decryptPlay,
+ parseUrlParams,
+ };
+})();
+
+var rule = {
+ 类型: "影视",
+ title: "GAZE",
+ desc: "源动力+L佬+秋秋+嗷呜 联合出品",
+ host: "https://gaze.run",
+ url: "/filter_movielist",
+ searchUrl: "/filter_movielist",
+ searchable: 2,
+ quickSearch: 0,
+ timeout: 5000,
+ play_parse: true,
+ filterable: 0,
+ class_name: "电影&剧集&番剧&国漫",
+ class_url: "1&2&bangumi&chinese_cartoon",
+ headers: {
+ "User-Agent": PC_UA,
+ Origin: "https://gaze.run",
+ },
+ 预处理: async () => {
+ await rule.dealHeaders();
+ },
+ 推荐: async function (tid, pg, filter, extend) {
+ const { input, pdfa, pdfh, pd } = this;
+ const html = await request(input);
+ const d = [];
+ const data = pdfa(html, ".row .card");
+ data.forEach((it) => {
+ d.push({
+ title: pdfh(it, ".card-body .card-title&&Text"),
+ pic_url: pdfh(it, ".view img.load-imgs&&data-src"),
+ desc: pdfh(it, ".view .dbadge-box .badge-default&&Text"),
+ url: pdfh(it, ".view a&&href").replace("play/", ""),
+ });
+ });
+ return setResult(d);
+ },
+ 一级: async function (tid, pg, filter, extend) {
+ const { input } = this;
+ const html = await request(input, {
+ method: "POST",
+ headers: {
+ ...this.headers,
+ "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
+ },
+ data: {
+ mform: tid,
+ mcountry: "all",
+ "tag_arr[]": "all",
+ album: "all",
+ years: "all",
+ sort: "updatetime",
+ title: "",
+ page: pg,
+ },
+ });
+ const resp = JSON.parse(html);
+ const d = [];
+ resp.mlist.forEach((it) => {
+ d.push({
+ title: it.title,
+ pic_url: it.cover_img,
+ desc: `${it.grade}|${it.definition}`,
+ url: it.mid,
+ });
+ });
+ return setResult(d);
+ },
+ 二级: async function (ids) {
+ const { input, pdfa, pdfh, pd } = this;
+ const html = await request(`${this.host}/play/${ids[0]}`, {
+ headers: this.headers,
+ });
+ const vod = {
+ vod_id: ids[0],
+ vod_name: pdfh(html, ".row.p-2 img&&alt"),
+ vod_pic: pdfh(html, ".row.p-2 img&&src"),
+ type_name: pdfa(html, ".row.p-2 a")
+ .map((it) => pdfh(it, "a&&Text"))
+ .join("/"),
+ vod_remarks: pdfh(html, ".row.p-2 h5:eq(-1)&&Text"),
+ vod_year: pdfh(html, ".row.p-2 a:eq(-1)&&Text"),
+ vod_area: pdfh(html, ".row.p-2 a:eq(-2)&&Text"),
+ vod_content: pdfh(html, ".row.p-2 p&&Text"),
+ vod_play_from: "源动力偷的线路",
+ vod_play_url: pdfa(html, ".col-md-12&&.sbtn-block")
+ .map(
+ (it) =>
+ `${pdfh(it, "button--i&&Text").trim()}$${ids[0]}|${pdfh(
+ it,
+ "button&&data-src"
+ )}`
+ )
+ .join("#"),
+ };
+ return vod;
+ },
+ 搜索: async function (wd, quick, pg) {
+ const { input } = this;
+ const html = await request(input, {
+ method: "POST",
+ headers: {
+ ...this.headers,
+ "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
+ },
+ data: {
+ mform: "all",
+ mcountry: "all",
+ "tag_arr[]": "all",
+ album: "all",
+ years: "all",
+ sort: "updatetime",
+ title: wd,
+ page: pg,
+ },
+ });
+ const resp = JSON.parse(html);
+ const d = [];
+ resp.mlist.forEach((it) => {
+ d.push({
+ title: it.title,
+ pic_url: it.cover_img,
+ desc: `${it.grade}|${it.definition}`,
+ url: it.mid,
+ });
+ });
+ return setResult(d);
+ },
+ lazy: async function (flag, id, flags) {
+ const { pdfa, pdfh } = this;
+ const [data_id, data_src] = id.split("|");
+ const sourceReqUrl = `${this.host}/play/${data_id}`;
+ console.warn(data_id, data_src);
+ const source = await axios.get(sourceReqUrl, { headers: this.headers });
+ const script = pdfa(source.data, "script");
+ const scriptContent = script.filter((e) =>
+ e.includes("configs-n26.1.js")
+ )[0];
+ const sourceUrl = pdfh(scriptContent, "script&&src");
+ console.warn("sourceUrl", sourceUrl);
+
+ let play = await decryptor.decryptPlay(sourceUrl, data_src);
+
+ if (play.includes("gazes_v-@_info")) {
+ return {
+ parse: 0,
+ url:
+ getProxyUrl() +
+ "&playdata=" +
+ encodeURIComponent(JSON.stringify([sourceUrl, data_src, play])) +
+ "&t=0",
+ };
+ } else {
+ if (play.includes("cloud.189.cn")) {
+ let js_data = decryptor.parseUrlParams(sourceUrl);
+ const thirdKey = Object.keys(js_data)[2];
+
+ try {
+ const re_link = await axios.post(
+ `${this.host}/fetch_189c_murl`,
+ {
+ urls: play,
+ mid: js_data.mid,
+ },
+ {
+ headers: {
+ "Content-Type":
+ "application/x-www-form-urlencoded; charset=UTF-8",
+ Accept: "*/*",
+ Origin: this,
+ [thirdKey]: encodeURIComponent(js_data[thirdKey]),
+ Cookie: source.headers["set-cookie"]
+ .map((it) => it.split(";")[0])
+ .join(";"),
+ },
+ }
+ );
+ console.log("API Response:", re_link.data);
+ play = re_link.data?.url;
+ } catch (error) {
+ console.error("Request Failed:", error);
+ }
+ }
+ return {
+ parse: 0,
+ url: play,
+ };
+ }
+ },
+ proxy_rule: async function (params) {
+ try {
+ const segments = JSON.parse(decodeURIComponent(params.playdata));
+ let [sourceUrl, data_src, play] = segments;
+ console.log(segments);
+
+ let m3u8 = await decryptor.decryptM3u8(sourceUrl, data_src, play);
+ return [200, "text/text", m3u8];
+ } catch (e) {
+ console.log(e);
+ }
+ },
+ dealHeaders: async function () {
+ const resp = await axios.get(`${this.host}/filter`, {
+ headers: this.headers,
+ });
+ // cookie 处理
+ const headers = resp.headers;
+ const cookies = headers["set-cookie"];
+ const cookie = cookies.map((item) => item.split(";")[0]).join("; ");
+ this.headers.Cookie = cookie;
+ // 请求头处理
+ const html = resp.data;
+ const kv_macth = html.match(/'headers':({[^{}]*})/)[1];
+ const kv_headers = new Function(`return ${kv_macth}`)();
+ for (const key in kv_headers) {
+ this.headers[key] = kv_headers[key];
+ }
+ console.warn("headers", this.headers);
+ },
+};
diff --git a/js/push_agent.js b/js/push_agent.js
index be8b47f..d4b8167 100644
--- a/js/push_agent.js
+++ b/js/push_agent.js
@@ -25,8 +25,7 @@ var rule = {
let vod = {
vod_pic: icon,
vod_id: orId,
- vod_content: orId || '温馨提醒:宝子们,推送的时候记得确保ids存在哟~',
- vod_name: 'DS推送:道长&秋秋倾情打造',
+ vod_content: 'DS推送:道长&秋秋倾情打造',
}
let playPans = [];
if (/^[\[{]/.test(input.trim())) {
@@ -56,7 +55,7 @@ var rule = {
let list = input.split('@');
// log(list);
for (let i = 0; i < list.length; i++) {
- if (/pan.quark.cn|drive.uc.cn|www.alipan.com|www.aliyundrive.com|cloud.189.cn|yun.139.com/.test(list[i])) {
+ if (/pan.quark.cn|drive.uc.cn|www.alipan.com|www.aliyundrive.com|cloud.189.cn|yun.139.com|www.123684.com|www.123865.com|www.123912.com|www.123pan.com|www.123pan.cn|www.123592.com/.test(list[i])) {
if (/pan.quark.cn/.test(list[i])) {
playPans.push(list[i]);
const shareData = Quark.getShareData(list[i]);
@@ -127,12 +126,24 @@ var rule = {
playurls.push(urls);
})
}
+ if(/www.123684.com|www.123865.com|www.123912.com/.test(list[i])) {
+ playPans.push(list[i]);
+ let shareData = await Pan.getShareData(list[i])
+ let videos = await Pan.getFilesByShareUrl(shareData)
+ if (videos.length > 0) {
+ playform.push('Pan123-' + shareData);
+ playurls.push(videos.map((v) => {
+ const list = [v.ShareKey, v.FileId, v.S3KeyFlag, v.Size, v.Etag];
+ return v.FileName + '$' + list.join('*');
+ }).join('#'))
+ }
+ }
} else {
playform.push('推送');
playurls.push("推送" + '$' + list[i])
}
}
- } else if (/pan.quark.cn|drive.uc.cn|www.alipan.com|www.aliyundrive.com|cloud.189.cn|yun.139.com/.test(input)) {
+ } else if (/pan.quark.cn|drive.uc.cn|www.alipan.com|www.aliyundrive.com|cloud.189.cn|yun.139.com|www.123684.com|www.123865.com|www.123912.com|www.123pan.com|www.123pan.cn|www.123592.com/.test(input)) {
if (/pan.quark.cn/.test(input)) {
playPans.push(input);
const shareData = Quark.getShareData(input);
@@ -203,6 +214,19 @@ var rule = {
playurls.push(urls);
})
}
+ if(/www.123684.com|www.123865.com|www.123912.com|www.123pan.com|www.123pan.cn|www.123592.com/.test(input)) {
+ playPans.push(input);
+ let shareData = await Pan.getShareData(input)
+ let videos = await Pan.getFilesByShareUrl(shareData)
+ Object.keys(videos).forEach(it => {
+ playform.push('Pan123-' + it)
+ const urls = videos[it].map(v => {
+ const list = [v.ShareKey, v.FileId, v.S3KeyFlag, v.Size, v.Etag];
+ return v.FileName + '$' + list.join('*');
+ }).join('#');
+ playurls.push(urls);
+ })
+ }
} else {
playform.push('推送');
playurls.push("推送" + '$' + input)
@@ -222,7 +246,7 @@ var rule = {
} else {
return {parse: 1, url: input}
}
- } else if (/Quark-|UC-|Ali-|Cloud-|Yun-/.test(flag)) {
+ } else if (/Quark-|UC-|Ali-|Cloud-|Yun-|Pan123-/.test(flag)) {
const ids = input.split('*');
const urls = [];
let UCDownloadingCache = {};
@@ -254,30 +278,13 @@ var rule = {
}
}
if (flag.startsWith('UC-')) {
- log("UC网盘解析开始")
+ console.log("UC网盘解析开始");
if (!UCDownloadingCache[ids[1]]) {
const down = await UC.getDownload(ids[0], ids[1], ids[2], ids[3], true);
if (down) UCDownloadingCache[ids[1]] = down;
}
- downUrl = UCDownloadingCache[ids[1]].download_url;
- const headers = {
- "Referer": "https://drive.uc.cn/",
- "cookie": UC.cookie,
- "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) quark-cloud-drive/2.5.20 Chrome/100.0.4896.160 Electron/18.3.5.4-b478491100 Safari/537.36 Channel/pckk_other_ch'
- };
- urls.push("UC原画", downUrl);
-
- urls.push("原代服", mediaProxyUrl + `?thread=${ENV.get('thread') || 6}&form=urlcode&randUa=1&url=` + encodeURIComponent(downUrl) + '&header=' + encodeURIComponent(JSON.stringify(headers)));
- if (ENV.get('play_local_proxy_type', '1') === '2') {
- urls.push("原代本", `http://127.0.0.1:7777/?thread=${ENV.get('thread') || 6}&form=urlcode&randUa=1&url=` + encodeURIComponent(downUrl) + '&header=' + encodeURIComponent(JSON.stringify(headers)));
- } else {
- urls.push("原代本", `http://127.0.0.1:5575/proxy?thread=${ENV.get('thread') || 6}&chunkSize=256&url=` + encodeURIComponent(downUrl));
- }
- return {
- parse: 0,
- url: urls,
- header: headers,
- }
+ const downCache = UCDownloadingCache[ids[1]];
+ return await UC.getLazyResult(downCache, mediaProxyUrl)
}
if (flag.startsWith('Ali-')) {
const transcoding_flag = {
@@ -321,8 +328,21 @@ var rule = {
url: url
}
}
+ if(flag.startsWith('Pan123-')) {
+ log('盘123解析开始')
+ const url = await Pan.getDownload(ids[0],ids[1],ids[2],ids[3],ids[4])
+ urls.push("原画",url)
+ let data = await Pan.getLiveTranscoding(ids[0],ids[1],ids[2],ids[3],ids[4])
+ data.forEach((item) => {
+ urls.push(item.name,item.url)
+ })
+ return {
+ parse: 0,
+ url: urls
+ }
+ }
} else {
return input
}
},
-}
+}
\ No newline at end of file
diff --git "a/js/\345\205\250\346\260\221\350\277\275\345\211\247.js" "b/js/\345\205\250\346\260\221\350\277\275\345\211\247.js"
new file mode 100644
index 0000000..b563217
--- /dev/null
+++ "b/js/\345\205\250\346\260\221\350\277\275\345\211\247.js"
@@ -0,0 +1,107 @@
+var rule = {
+ 类型:'影视',
+ title:'全民追剧',
+ desc:'不告诉你',
+ host:'https://jenzg.cn',
+ url: '/index.php/vod/showfyfilter.html[/index.php/vod/showfyclass.html]',
+ searchUrl: '/index.php/vod/search/page/fypage/wd/**.html',
+ searchable:1,quickSearch:1,double:false,timeout:5000,play_parse:true,filterable:1,invalid:true,
+ class_name:'电影&电视剧&综艺&动漫&短剧',
+ class_url:'/id/61&/id/79&/id/88&/id/93&/id/99',
+ filter_url:'{{fl.area}}{{fl.class}}{{fl.cateId}}/page/fypage{{fl.year}}',
+ filter_def:{'/id/61':{cateId:'/id/61'},'/id/79':{cateId:'/id/79'},'/id/88':{cateId:'/id/88'},'/id/93':{cateId:'/id/93'},'/id/99':{cateId:'/id/99'}},
+ 预处理: async () => {return []},
+ 推荐: async function (tid, pg, filter, extend) {
+ let homeFn = rule.一级.bind(this);
+ return await homeFn();
+ },
+ 一级: async function (tid, pg, filter, extend) {
+ let {input, pdfa, pdfh, pd} = this;
+ let html = await request(input);
+ let d = [];
+ let data = pdfa(html, '.module-items .module-item');
+ data.forEach((it) => {
+ d.push({
+ title: pdfh(it, 'a&&title'),
+ pic_url: pd(it, 'img&&data-src'),
+ desc: pdfh(it, '.module-item-text&&Text'),
+ url: pd(it, 'a&&href'),
+ })
+ });
+ return setResult(d)
+ },
+ 二级: async function (ids) {
+ let {input, pdfa, pdfh, pd} = this;
+ let html = await request(input);
+ let VOD = {};
+ VOD.vod_name = pdfh(html, 'h1&&Text');//名称
+ VOD.vod_actor = pdfh(html, '.video-info-items:eq(1)&&Text');//演员
+ VOD.vod_director = pdfh(html, '.video-info-items:eq(0)&&Text');//导演
+ VOD.vod_remarks = pdfh(html, '');//备注
+ VOD.vod_status = pdfh(html, '');//状态
+ VOD.vod_content = pdfh(html, '.video-info-content&&Text');//简介
+ let playlist = pdfa(html, '.module-list');
+ let tabs = pdfa(html, '.module-tab&&.module-tab-item.tab-item');
+ let playmap = {};
+ tabs.map((item, i) => {
+ const form = pdfh(item, 'span&&Text');
+ const list = playlist[i];
+ const a = pdfa(list, 'body&&a:not(:contains(排序))');
+ a.map((it) => {
+ let title = pdfh(it, 'a&&Text');
+ let urls = pd(it, 'a&&href', input);
+ if (!playmap.hasOwnProperty(form)) {
+ playmap[form] = [];
+ }
+ playmap[form].push(title + "$" + urls);
+ });
+ });
+ VOD.vod_play_from = Object.keys(playmap).join('$$$');
+ const urls = Object.values(playmap);
+ const playUrls = urls.map((urllist) => {
+ return urllist.join("#");
+ });
+ VOD.vod_play_url = playUrls.join('$$$');
+ return VOD;
+ },
+ 搜索: async function (wd, quick, pg) {
+ let {input, pdfa, pdfh, pd} = this;
+ let html = await request(input);
+ let d = [];
+ let data = pdfa(html, '.module-items .module-search-item');
+ data.forEach((it) => {
+ d.push({
+ title: pdfh(it, 'a&&title'),
+ pic_url: pd(it, 'img&&data-src'),
+ desc: pdfh(it, '.video-serial&&Text'),
+ url: pd(it, 'a&&href'),
+ content: pdfh(it, '.video-info-aux&&Text'),
+ })
+ });
+ return setResult(d);
+ },
+ lazy: async function (flag, id, flags) {
+ let {input, pdfa, pdfh, pd} = this;
+ let html = await request(input);
+ html = JSON.parse(html.match(/r player_.*?=(.*?))[1]);
+ let url = html.url;
+ if (html.encrypt == "1") {
+ url = unescape(url)
+ return {parse: 0, url: url}
+ } else if (html.encrypt == "2") {
+ url = unescape(base64Decode(url))
+ return {parse: 0, url: url}
+ }
+ if (/m3u8|mp4/.test(url)) {
+ input = url
+ return {parse: 0, url: input}
+ } else {
+ return {parse: 0, url: input}
+ }
+ },
+ filter: {"/id/61":[{"key":"class","name":"剧情","value":[{"n":"全部类型","v":""},{"n":"喜剧","v":"/class/喜剧"},{"n":"动作","v":"/class/动作"},{"n":"怪兽","v":"/class/怪兽"},{"n":"战争","v":"/class/战争"},{"n":"爱情","v":"/class/爱情"},{"n":"悬疑","v":"/class/悬疑"},{"n":"武侠","v":"/class/武侠"},{"n":"奇幻","v":"/class/奇幻"},{"n":"科幻","v":"/class/科幻"},{"n":"冒险","v":"/class/冒险"},{"n":"警匪","v":"/class/警匪"},{"n":"动画","v":"/class/动画"},{"n":"惊悚","v":"/class/惊悚"},{"n":"犯罪","v":"/class/犯罪"},{"n":"恐怖","v":"/class/恐怖"},{"n":"剧情","v":"/class/剧情"},{"n":"历史","v":"/class/历史"},{"n":"纪录片","v":"/class/纪录片"},{"n":"传记","v":"/class/传记"},{"n":"歌舞","v":"/class/歌舞"},{"n":"短片","v":"/class/短片"},{"n":"其他","v":"/class/其他"}]},{"key":"area","name":"地区","value":[{"n":"全部地区","v":""},{"n":"内地","v":"/area/内地"},{"n":"中国香港","v":"/area/中国香港"},{"n":"中国台湾","v":"/area/中国台湾"},{"n":"美国","v":"/area/美国"},{"n":"日本","v":"/area/日本"},{"n":"韩国","v":"/area/韩国"},{"n":"泰国","v":"/area/泰国"},{"n":"印度","v":"/area/印度"},{"n":"英国","v":"/area/英国"},{"n":"法国","v":"/area/法国"},{"n":"德国","v":"/area/德国"},{"n":"加拿大","v":"/area/加拿大"},{"n":"西班牙","v":"/area/西班牙"},{"n":"意大利","v":"/area/意大利"},{"n":"澳大利亚","v":"/area/澳大利亚"},{"n":"其它","v":"/area/其它"}]},{"key":"year","name":"年代","value":[{"n":"全部年代","v":""},{"n":"2025","v":"/year/2025"},{"n":"2024","v":"/year/2024"},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"},{"n":"2007","v":"/year/2007"},{"n":"2006","v":"/year/2006"},{"n":"2005","v":"/year/2005"},{"n":"2004","v":"/year/2004"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}],
+ "/id/79":[{"key":"class","name":"类型","value":[{"n":"全部类型","v":""},{"n":"青春","v":"/class/青春"},{"n":"古装","v":"/class/古装"},{"n":"爱情","v":"/class/爱情"},{"n":"都市","v":"/class/都市"},{"n":"喜剧","v":"/class/喜剧"},{"n":"战争","v":"/class/战争"},{"n":"军旅","v":"/class/军旅"},{"n":"谍战","v":"/class/谍战"},{"n":"偶像","v":"/class/偶像"},{"n":"警匪","v":"/class/警匪"},{"n":"冒险","v":"/class/冒险"},{"n":"穿越","v":"/class/穿越"},{"n":"仙侠","v":"/class/仙侠"},{"n":"武侠","v":"/class/武侠"},{"n":"悬疑","v":"/class/悬疑"},{"n":"罪案","v":"/class/罪案"},{"n":"家庭","v":"/class/家庭"},{"n":"历史","v":"/class/历史"},{"n":"年代","v":"/class/年代"},{"n":"农村","v":"/class/农村"},{"n":"其他","v":"/class/其他"}]},{"key":"area","name":"地区","value":[{"n":"全部地区","v":""},{"n":"内地","v":"/area/内地"},{"n":"中国香港","v":"/area/中国香港"},{"n":"中国台湾","v":"/area/中国台湾"},{"n":"美国","v":"/area/美国"},{"n":"日本","v":"/area/日本"},{"n":"韩国","v":"/area/韩国"},{"n":"泰国","v":"/area/泰国"},{"n":"印度","v":"/area/印度"},{"n":"英国","v":"/area/英国"},{"n":"法国","v":"/area/法国"},{"n":"德国","v":"/area/德国"},{"n":"加拿大","v":"/area/加拿大"},{"n":"西班牙","v":"/area/西班牙"},{"n":"意大利","v":"/area/意大利"},{"n":"澳大利亚","v":"/area/澳大利亚"},{"n":"其它","v":"/area/其它"}]},{"key":"year","name":"年代","value":[{"n":"全部年代","v":""},{"n":"2025","v":"/year/2025"},{"n":"2024","v":"/year/2024"},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"},{"n":"2007","v":"/year/2007"},{"n":"2006","v":"/year/2006"},{"n":"2005","v":"/year/2005"},{"n":"2004","v":"/year/2004"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}],
+ "/id/88":[{"key":"class","name":"类型","value":[{"n":"全部类型","v":""},{"n":"偶像","v":"/class/偶像"},{"n":"舞蹈","v":"/class/舞蹈"},{"n":"音乐","v":"/class/音乐"},{"n":"情感","v":"/class/情感"},{"n":"喜剧","v":"/class/喜剧"},{"n":"体育","v":"/class/体育"},{"n":"游戏","v":"/class/游戏"},{"n":"相声","v":"/class/相声"},{"n":"婚恋","v":"/class/婚恋"},{"n":"时尚","v":"/class/时尚"},{"n":"晚会","v":"/class/晚会"},{"n":"明星","v":"/class/明星"},{"n":"访谈","v":"/class/访谈"},{"n":"亲子","v":"/class/亲子"},{"n":"生活","v":"/class/生活"},{"n":"文化","v":"/class/文化"},{"n":"美食","v":"/class/美食"},{"n":"旅游","v":"/class/旅游"},{"n":"益智","v":"/class/益智"},{"n":"其他","v":"/class/其他"}]},{"key":"area","name":"地区","value":[{"n":"全部地区","v":""},{"n":"内地","v":"/area/内地"},{"n":"港台","v":"/area/港台"},{"n":"日韩","v":"/area/日韩"},{"n":"欧美","v":"/area/欧美"}]},{"key":"year","name":"年代","value":[{"n":"全部年代","v":""},{"n":"2025","v":"/year/2025"},{"n":"2024","v":"/year/2024"},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"},{"n":"2007","v":"/year/2007"},{"n":"2006","v":"/year/2006"},{"n":"2005","v":"/year/2005"},{"n":"2004","v":"/year/2004"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}], "/id/93":[{"key":"class","name":"类型","value":[{"n":"全部类型","v":""},{"n":"玄幻","v":"/class/玄幻"},{"n":"科幻","v":"/class/科幻"},{"n":"武侠","v":"/class/武侠"},{"n":"冒险","v":"/class/冒险"},{"n":"战斗","v":"/class/战斗"},{"n":"搞笑","v":"/class/搞笑"},{"n":"恋爱","v":"/class/恋爱"},{"n":"魔幻","v":"/class/魔幻"},{"n":"竞技","v":"/class/竞技"},{"n":"悬疑","v":"/class/悬疑"},{"n":"日常","v":"/class/日常"},{"n":"校园","v":"/class/校园"},{"n":"真人","v":"/class/真人"},{"n":"推理","v":"/class/推理"},{"n":"历史","v":"/class/历史"},{"n":"经典","v":"/class/经典"},{"n":"其他","v":"/class/其他"}]},{"key":"area","name":"地区","value":[{"n":"全部地区","v":""},{"n":"国产","v":"/area/国产"},{"n":"日本","v":"/area/日本"},{"n":"欧美","v":"/area/欧美"},{"n":"其他","v":"/area/其他"}]},{"key":"year","name":"年代","value":[{"n":"全部年代","v":""},{"n":"2025","v":"/year/2025"},{"n":"2024","v":"/year/2024"},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"},{"n":"2007","v":"/year/2007"},{"n":"2006","v":"/year/2006"},{"n":"2005","v":"/year/2005"},{"n":"2004","v":"/year/2004"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}],
+ "/id/99":[{"key":"class","name":"类型","value":[{"n":"全部类型","v":""},{"n":"青春","v":"/class/青春"},{"n":"古装","v":"/class/古装"},{"n":"爱情","v":"/class/爱情"},{"n":"都市","v":"/class/都市"},{"n":"喜剧","v":"/class/喜剧"},{"n":"战争","v":"/class/战争"},{"n":"军旅","v":"/class/军旅"},{"n":"谍战","v":"/class/谍战"},{"n":"偶像","v":"/class/偶像"},{"n":"警匪","v":"/class/警匪"},{"n":"冒险","v":"/class/冒险"},{"n":"穿越","v":"/class/穿越"},{"n":"仙侠","v":"/class/仙侠"},{"n":"武侠","v":"/class/武侠"},{"n":"悬疑","v":"/class/悬疑"},{"n":"罪案","v":"/class/罪案"},{"n":"家庭","v":"/class/家庭"},{"n":"历史","v":"/class/历史"},{"n":"年代","v":"/class/年代"},{"n":"农村","v":"/class/农村"},{"n":"其他","v":"/class/其他"}]},{"key":"year","name":"年代","value":[{"n":"全部年代","v":""},{"n":"2025","v":"/year/2025"},{"n":"2024","v":"/year/2024"},{"n":"2023","v":"/year/2023"},{"n":"2022","v":"/year/2022"},{"n":"2021","v":"/year/2021"},{"n":"2020","v":"/year/2020"},{"n":"2019","v":"/year/2019"},{"n":"2018","v":"/year/2018"},{"n":"2017","v":"/year/2017"},{"n":"2016","v":"/year/2016"},{"n":"2015","v":"/year/2015"},{"n":"2014","v":"/year/2014"},{"n":"2013","v":"/year/2013"},{"n":"2012","v":"/year/2012"},{"n":"2011","v":"/year/2011"},{"n":"2010","v":"/year/2010"},{"n":"2009","v":"/year/2009"},{"n":"2008","v":"/year/2008"},{"n":"2007","v":"/year/2007"},{"n":"2006","v":"/year/2006"},{"n":"2005","v":"/year/2005"},{"n":"2004","v":"/year/2004"}]},{"key":"by","name":"排序","value":[{"n":"时间","v":"/by/time"},{"n":"人气","v":"/by/hits"},{"n":"评分","v":"/by/score"}]}],
+ }
+}
diff --git "a/js/\345\244\232\345\244\232[\347\233\230].js" "b/js/\345\244\232\345\244\232[\347\233\230].js"
index 92dd78b..797ba5c 100644
--- "a/js/\345\244\232\345\244\232[\347\233\230].js"
+++ "b/js/\345\244\232\345\244\232[\347\233\230].js"
@@ -160,29 +160,13 @@ var rule = {
header: headers
}
} else if (flag.startsWith('UC-')) {
- console.log("UC网盘解析开始")
+ console.log("UC网盘解析开始");
if (!UCDownloadingCache[ids[1]]) {
const down = await UC.getDownload(ids[0], ids[1], ids[2], ids[3], true);
if (down) UCDownloadingCache[ids[1]] = down;
}
- downUrl = UCDownloadingCache[ids[1]].download_url;
- const headers = {
- "Referer": "https://drive.uc.cn/",
- "cookie": UC.cookie,
- "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) quark-cloud-drive/2.5.20 Chrome/100.0.4896.160 Electron/18.3.5.4-b478491100 Safari/537.36 Channel/pckk_other_ch'
- };
- urls.push("UC原画", downUrl);
- urls.push("原代服", mediaProxyUrl + `?thread=${ENV.get('thread') || 6}&form=urlcode&randUa=1&url=` + encodeURIComponent(downUrl) + '&header=' + encodeURIComponent(JSON.stringify(headers)));
- if (ENV.get('play_local_proxy_type', '1') === '2') {
- urls.push("原代本", `http://127.0.0.1:7777/?thread=${ENV.get('thread') || 6}&form=urlcode&randUa=1&url=` + encodeURIComponent(downUrl) + '&header=' + encodeURIComponent(JSON.stringify(headers)));
- } else {
- urls.push("原代本", `http://127.0.0.1:5575/proxy?thread=${ENV.get('thread') || 6}&chunkSize=256&url=` + encodeURIComponent(downUrl));
- }
- return {
- parse: 0,
- url: urls,
- header: headers,
- }
+ const downCache = UCDownloadingCache[ids[1]];
+ return await UC.getLazyResult(downCache, mediaProxyUrl)
}
},
}
diff --git "a/js/\346\234\250\345\201\266[\347\233\230].js" "b/js/\346\234\250\345\201\266[\347\233\230].js"
index cfde9be..7f62162 100644
--- "a/js/\346\234\250\345\201\266[\347\233\230].js"
+++ "b/js/\346\234\250\345\201\266[\347\233\230].js"
@@ -156,29 +156,13 @@ var rule = {
header: headers
}
} else if (flag.startsWith('UC-')) {
- console.log("UC网盘解析开始")
+ console.log("UC网盘解析开始");
if (!UCDownloadingCache[ids[1]]) {
const down = await UC.getDownload(ids[0], ids[1], ids[2], ids[3], true);
if (down) UCDownloadingCache[ids[1]] = down;
}
- downUrl = UCDownloadingCache[ids[1]].download_url;
- const headers = {
- "Referer": "https://drive.uc.cn/",
- "cookie": UC.cookie,
- "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) quark-cloud-drive/2.5.20 Chrome/100.0.4896.160 Electron/18.3.5.4-b478491100 Safari/537.36 Channel/pckk_other_ch'
- };
- urls.push("UC原画", downUrl);
- urls.push("原代服", mediaProxyUrl + `?thread=${ENV.get('thread') || 6}&form=urlcode&randUa=1&url=` + encodeURIComponent(downUrl) + '&header=' + encodeURIComponent(JSON.stringify(headers)));
- if (ENV.get('play_local_proxy_type', '1') === '2') {
- urls.push("原代本", `http://127.0.0.1:7777/?thread=${ENV.get('thread') || 6}&form=urlcode&randUa=1&url=` + encodeURIComponent(downUrl) + '&header=' + encodeURIComponent(JSON.stringify(headers)));
- } else {
- urls.push("原代本", `http://127.0.0.1:5575/proxy?thread=${ENV.get('thread') || 6}&chunkSize=256&url=` + encodeURIComponent(downUrl));
- }
- return {
- parse: 0,
- url: urls,
- header: headers,
- }
+ const downCache = UCDownloadingCache[ids[1]];
+ return await UC.getLazyResult(downCache, mediaProxyUrl)
}
},
}
diff --git "a/js/\346\254\247\345\223\245[\347\233\230].js" "b/js/\346\254\247\345\223\245[\347\233\230].js"
index 6db8e17..2fe7567 100644
--- "a/js/\346\254\247\345\223\245[\347\233\230].js"
+++ "b/js/\346\254\247\345\223\245[\347\233\230].js"
@@ -155,29 +155,13 @@ var rule = {
header: headers
}
} else if (flag.startsWith('UC-')) {
- console.log("UC网盘解析开始")
+ console.log("UC网盘解析开始");
if (!UCDownloadingCache[ids[1]]) {
const down = await UC.getDownload(ids[0], ids[1], ids[2], ids[3], true);
if (down) UCDownloadingCache[ids[1]] = down;
}
- downUrl = UCDownloadingCache[ids[1]].download_url;
- const headers = {
- "Referer": "https://drive.uc.cn/",
- "cookie": UC.cookie,
- "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) quark-cloud-drive/2.5.20 Chrome/100.0.4896.160 Electron/18.3.5.4-b478491100 Safari/537.36 Channel/pckk_other_ch'
- };
- urls.push("UC原画", downUrl);
- urls.push("原代服", mediaProxyUrl + `?thread=${ENV.get('thread') || 6}&form=urlcode&randUa=1&url=` + encodeURIComponent(downUrl) + '&header=' + encodeURIComponent(JSON.stringify(headers)));
- if (ENV.get('play_local_proxy_type', '1') === '2') {
- urls.push("原代本", `http://127.0.0.1:7777/?thread=${ENV.get('thread') || 6}&form=urlcode&randUa=1&url=` + encodeURIComponent(downUrl) + '&header=' + encodeURIComponent(JSON.stringify(headers)));
- } else {
- urls.push("原代本", `http://127.0.0.1:5575/proxy?thread=${ENV.get('thread') || 6}&chunkSize=256&url=` + encodeURIComponent(downUrl));
- }
- return {
- parse: 0,
- url: urls,
- header: headers,
- }
+ const downCache = UCDownloadingCache[ids[1]];
+ return await UC.getLazyResult(downCache, mediaProxyUrl)
}
},
}
diff --git "a/js/\347\211\271\344\270\213\351\245\255[\347\233\230].js" "b/js/\347\211\271\344\270\213\351\245\255[\347\233\230].js"
index b2a04e0..b85112e 100644
--- "a/js/\347\211\271\344\270\213\351\245\255[\347\233\230].js"
+++ "b/js/\347\211\271\344\270\213\351\245\255[\347\233\230].js"
@@ -124,7 +124,7 @@ var rule = {
return setResult(d);
},
lazy: async function (flag, id, flags) {
- let {input,mediaProxyUrl} = this;
+ let {input, mediaProxyUrl} = this;
const ids = input.split('*');
const urls = [];
let UCDownloadingCache = {};
@@ -160,29 +160,13 @@ var rule = {
}
}
} else if (flag.startsWith('UC-')) {
- console.log("UC网盘解析开始")
+ console.log("UC网盘解析开始");
if (!UCDownloadingCache[ids[1]]) {
const down = await UC.getDownload(ids[0], ids[1], ids[2], ids[3], true);
if (down) UCDownloadingCache[ids[1]] = down;
}
- downUrl = UCDownloadingCache[ids[1]].download_url;
- const headers = {
- "Referer": "https://drive.uc.cn/",
- "cookie": UC.cookie,
- "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) quark-cloud-drive/2.5.20 Chrome/100.0.4896.160 Electron/18.3.5.4-b478491100 Safari/537.36 Channel/pckk_other_ch'
- };
- urls.push("UC原画", downUrl);
- urls.push("原代服", mediaProxyUrl + `?thread=${ENV.get('thread') || 6}&form=urlcode&randUa=1&url=` + encodeURIComponent(downUrl) + '&header=' + encodeURIComponent(JSON.stringify(headers)));
- if (ENV.get('play_local_proxy_type', '1') === '2') {
- urls.push("原代本", `http://127.0.0.1:7777/?thread=${ENV.get('thread') || 6}&form=urlcode&randUa=1&url=` + encodeURIComponent(downUrl) + '&header=' + encodeURIComponent(JSON.stringify(headers)));
- } else {
- urls.push("原代本", `http://127.0.0.1:5575/proxy?thread=${ENV.get('thread') || 6}&chunkSize=256&url=` + encodeURIComponent(downUrl));
- }
- return {
- parse: 0,
- url: urls,
- header: headers,
- }
+ const downCache = UCDownloadingCache[ids[1]];
+ return await UC.getLazyResult(downCache, mediaProxyUrl)
}
},
}
diff --git "a/js/\347\216\251\345\201\266\345\223\245\345\223\245[\347\233\230].js" "b/js/\347\216\251\345\201\266\345\223\245\345\223\245[\347\233\230].js"
index 5ae5aa3..1580f3b 100644
--- "a/js/\347\216\251\345\201\266\345\223\245\345\223\245[\347\233\230].js"
+++ "b/js/\347\216\251\345\201\266\345\223\245\345\223\245[\347\233\230].js"
@@ -172,29 +172,13 @@ var rule = {
header: headers
}
} else if (flag.startsWith('UC-')) {
- console.log("UC网盘解析开始")
+ console.log("UC网盘解析开始");
if (!UCDownloadingCache[ids[1]]) {
const down = await UC.getDownload(ids[0], ids[1], ids[2], ids[3], true);
if (down) UCDownloadingCache[ids[1]] = down;
}
- downUrl = UCDownloadingCache[ids[1]].download_url;
- const headers = {
- "Referer": "https://drive.uc.cn/",
- "cookie": UC.cookie,
- "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) quark-cloud-drive/2.5.20 Chrome/100.0.4896.160 Electron/18.3.5.4-b478491100 Safari/537.36 Channel/pckk_other_ch'
- };
- urls.push("UC原画", downUrl);
- urls.push("原代服", mediaProxyUrl + `?thread=${ENV.get('thread') || 6}&form=urlcode&randUa=1&url=` + encodeURIComponent(downUrl) + '&header=' + encodeURIComponent(JSON.stringify(headers)));
- if (ENV.get('play_local_proxy_type', '1') === '2') {
- urls.push("原代本", `http://127.0.0.1:7777/?thread=${ENV.get('thread') || 6}&form=urlcode&randUa=1&url=` + encodeURIComponent(downUrl) + '&header=' + encodeURIComponent(JSON.stringify(headers)));
- } else {
- urls.push("原代本", `http://127.0.0.1:5575/proxy?thread=${ENV.get('thread') || 6}&chunkSize=256&url=` + encodeURIComponent(downUrl));
- }
- return {
- parse: 0,
- url: urls,
- header: headers,
- }
+ const downCache = UCDownloadingCache[ids[1]];
+ return await UC.getLazyResult(downCache, mediaProxyUrl)
}
},
}
diff --git "a/js/\347\225\252\350\214\204\345\260\217\350\257\264[\344\271\246].js" "b/js/\347\225\252\350\214\204\345\260\217\350\257\264[\344\271\246].js"
index 27b20df..53cb4fe 100644
--- "a/js/\347\225\252\350\214\204\345\260\217\350\257\264[\344\271\246].js"
+++ "b/js/\347\225\252\350\214\204\345\260\217\350\257\264[\344\271\246].js"
@@ -157,7 +157,7 @@ var rule = {
content_url = `https://fanqienovel.com/reader/${input}?enter_from=reader`;
log(content_url);
let html = (await req(content_url, {headers: {Cookie: getFqCookie()}})).content;
- html = html.match(/window.__INITIAL_STATE__=(.+?});/)[1];
+ html = html.match(/window.__INITIAL_STATE__=(.+?});/)[1].replaceAll(':undefined,', ':"undefined",');
let json = JSON.parse(html).reader.chapterData;
title = json.title;
content = decodeText(json.content, 2);
diff --git "a/js/\350\207\263\350\207\273[\347\233\230].js" "b/js/\350\207\263\350\207\273[\347\233\230].js"
index ea6800a..2185f4f 100644
--- "a/js/\350\207\263\350\207\273[\347\233\230].js"
+++ "b/js/\350\207\263\350\207\273[\347\233\230].js"
@@ -156,29 +156,13 @@ var rule = {
header: headers
}
} else if (flag.startsWith('UC-')) {
- console.log("UC网盘解析开始")
+ console.log("UC网盘解析开始");
if (!UCDownloadingCache[ids[1]]) {
const down = await UC.getDownload(ids[0], ids[1], ids[2], ids[3], true);
if (down) UCDownloadingCache[ids[1]] = down;
}
- downUrl = UCDownloadingCache[ids[1]].download_url;
- const headers = {
- "Referer": "https://drive.uc.cn/",
- "cookie": UC.cookie,
- "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) quark-cloud-drive/2.5.20 Chrome/100.0.4896.160 Electron/18.3.5.4-b478491100 Safari/537.36 Channel/pckk_other_ch'
- };
- urls.push("UC原画", downUrl);
- urls.push("原代服", mediaProxyUrl + `?thread=${ENV.get('thread') || 6}&form=urlcode&randUa=1&url=` + encodeURIComponent(downUrl) + '&header=' + encodeURIComponent(JSON.stringify(headers)));
- if (ENV.get('play_local_proxy_type', '1') === '2') {
- urls.push("原代本", `http://127.0.0.1:7777/?thread=${ENV.get('thread') || 6}&form=urlcode&randUa=1&url=` + encodeURIComponent(downUrl) + '&header=' + encodeURIComponent(JSON.stringify(headers)));
- } else {
- urls.push("原代本", `http://127.0.0.1:5575/proxy?thread=${ENV.get('thread') || 6}&chunkSize=256&url=` + encodeURIComponent(downUrl));
- }
- return {
- parse: 0,
- url: urls,
- header: headers,
- }
+ const downCache = UCDownloadingCache[ids[1]];
+ return await UC.getLazyResult(downCache, mediaProxyUrl)
}
},
}
diff --git "a/js/\350\231\216\346\226\221[\347\233\230].js" "b/js/\350\231\216\346\226\221[\347\233\230].js"
index 273ced1..7adf4a7 100644
--- "a/js/\350\231\216\346\226\221[\347\233\230].js"
+++ "b/js/\350\231\216\346\226\221[\347\233\230].js"
@@ -160,29 +160,13 @@ var rule = {
header: headers
}
} else if (flag.startsWith('UC-')) {
- console.log("UC网盘解析开始")
+ console.log("UC网盘解析开始");
if (!UCDownloadingCache[ids[1]]) {
const down = await UC.getDownload(ids[0], ids[1], ids[2], ids[3], true);
if (down) UCDownloadingCache[ids[1]] = down;
}
- downUrl = UCDownloadingCache[ids[1]].download_url;
- const headers = {
- "Referer": "https://drive.uc.cn/",
- "cookie": UC.cookie,
- "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) quark-cloud-drive/2.5.20 Chrome/100.0.4896.160 Electron/18.3.5.4-b478491100 Safari/537.36 Channel/pckk_other_ch'
- };
- urls.push("UC原画", downUrl);
- urls.push("原代服", mediaProxyUrl + `?thread=${ENV.get('thread') || 6}&form=urlcode&randUa=1&url=` + encodeURIComponent(downUrl) + '&header=' + encodeURIComponent(JSON.stringify(headers)));
- if (ENV.get('play_local_proxy_type', '1') === '2') {
- urls.push("原代本", `http://127.0.0.1:7777/?thread=${ENV.get('thread') || 6}&form=urlcode&randUa=1&url=` + encodeURIComponent(downUrl) + '&header=' + encodeURIComponent(JSON.stringify(headers)));
- } else {
- urls.push("原代本", `http://127.0.0.1:5575/proxy?thread=${ENV.get('thread') || 6}&chunkSize=256&url=` + encodeURIComponent(downUrl));
- }
- return {
- parse: 0,
- url: urls,
- header: headers,
- }
+ const downCache = UCDownloadingCache[ids[1]];
+ return await UC.getLazyResult(downCache, mediaProxyUrl)
}
},
}
diff --git "a/js/\350\234\241\347\254\224[\347\233\230].js" "b/js/\350\234\241\347\254\224[\347\233\230].js"
index 75eacc1..304f289 100644
--- "a/js/\350\234\241\347\254\224[\347\233\230].js"
+++ "b/js/\350\234\241\347\254\224[\347\233\230].js"
@@ -197,29 +197,13 @@ var rule = {
header: headers
}
} else if (flag.startsWith('UC-')) {
- console.log("UC网盘解析开始")
+ console.log("UC网盘解析开始");
if (!UCDownloadingCache[ids[1]]) {
const down = await UC.getDownload(ids[0], ids[1], ids[2], ids[3], true);
if (down) UCDownloadingCache[ids[1]] = down;
}
- downUrl = UCDownloadingCache[ids[1]].download_url;
- const headers = {
- "Referer": "https://drive.uc.cn/",
- "cookie": UC.cookie,
- "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) quark-cloud-drive/2.5.20 Chrome/100.0.4896.160 Electron/18.3.5.4-b478491100 Safari/537.36 Channel/pckk_other_ch'
- };
- urls.push("UC原画", downUrl);
- urls.push("原代服", mediaProxyUrl + `?thread=${ENV.get('thread') || 6}&form=urlcode&randUa=1&url=` + encodeURIComponent(downUrl) + '&header=' + encodeURIComponent(JSON.stringify(headers)));
- if (ENV.get('play_local_proxy_type', '1') === '2') {
- urls.push("原代本", `http://127.0.0.1:7777/?thread=${ENV.get('thread') || 6}&form=urlcode&randUa=1&url=` + encodeURIComponent(downUrl) + '&header=' + encodeURIComponent(JSON.stringify(headers)));
- } else {
- urls.push("原代本", `http://127.0.0.1:5575/proxy?thread=${ENV.get('thread') || 6}&chunkSize=256&url=` + encodeURIComponent(downUrl));
- }
- return {
- parse: 0,
- url: urls,
- header: headers,
- }
+ const downCache = UCDownloadingCache[ids[1]];
+ return await UC.getLazyResult(downCache, mediaProxyUrl)
}
},
}
diff --git "a/js/\350\256\276\347\275\256\344\270\255\345\277\203.js" "b/js/\350\256\276\347\275\256\344\270\255\345\277\203.js"
index 904d946..0aafe5c 100644
--- "a/js/\350\256\276\347\275\256\344\270\255\345\277\203.js"
+++ "b/js/\350\256\276\347\275\256\344\270\255\345\277\203.js"
@@ -23,6 +23,7 @@ let quick_data = {
移动1: 'https://yun.139.com/shareweb/#/w/i/0i5CLQ7BpV7Ai',
移动2: 'https://caiyun.139.com/m/i?2jexC1gcjeN7q',
移动3: 'https://yun.139.com/shareweb/#/w/i/2i2MoE9ZHn9p1',
+ 123: 'https://www.123684.com/s/oec7Vv-DggWh?ZY4K',
直链1: 'https://vdse.bdstatic.com//628ca08719cef5987ea2ae3c6f0d2386.mp4',
嗅探1: 'https://www.6080kk.cc/haokanplay/178120-1-1.html',
嗅探2: 'https://www.hahads.com/play/537106-3-1.html',
diff --git "a/js/\351\227\252\347\224\265\344\274\230\346\261\220[\347\233\230].js" "b/js/\351\227\252\347\224\265\344\274\230\346\261\220[\347\233\230].js"
index 3815586..3e19eea 100644
--- "a/js/\351\227\252\347\224\265\344\274\230\346\261\220[\347\233\230].js"
+++ "b/js/\351\227\252\347\224\265\344\274\230\346\261\220[\347\233\230].js"
@@ -155,29 +155,13 @@ var rule = {
header: headers
}
} else if (flag.startsWith('UC-')) {
- console.log("UC网盘解析开始")
+ console.log("UC网盘解析开始");
if (!UCDownloadingCache[ids[1]]) {
const down = await UC.getDownload(ids[0], ids[1], ids[2], ids[3], true);
if (down) UCDownloadingCache[ids[1]] = down;
}
- downUrl = UCDownloadingCache[ids[1]].download_url;
- const headers = {
- "Referer": "https://drive.uc.cn/",
- "cookie": UC.cookie,
- "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) quark-cloud-drive/2.5.20 Chrome/100.0.4896.160 Electron/18.3.5.4-b478491100 Safari/537.36 Channel/pckk_other_ch'
- };
- urls.push("UC原画", downUrl);
- urls.push("原代服", mediaProxyUrl + `?thread=${ENV.get('thread') || 6}&form=urlcode&randUa=1&url=` + encodeURIComponent(downUrl) + '&header=' + encodeURIComponent(JSON.stringify(headers)));
- if (ENV.get('play_local_proxy_type', '1') === '2') {
- urls.push("原代本", `http://127.0.0.1:7777/?thread=${ENV.get('thread') || 6}&form=urlcode&randUa=1&url=` + encodeURIComponent(downUrl) + '&header=' + encodeURIComponent(JSON.stringify(headers)));
- } else {
- urls.push("原代本", `http://127.0.0.1:5575/proxy?thread=${ENV.get('thread') || 6}&chunkSize=256&url=` + encodeURIComponent(downUrl));
- }
- return {
- parse: 0,
- url: urls,
- header: headers,
- }
+ const downCache = UCDownloadingCache[ids[1]];
+ return await UC.getLazyResult(downCache, mediaProxyUrl)
}
},
}
diff --git "a/js_dr2/\347\272\242\346\236\234\347\237\255\345\211\247.js" "b/js_dr2/\347\272\242\346\236\234\347\237\255\345\211\247.js"
new file mode 100644
index 0000000..73c9b0c
--- /dev/null
+++ "b/js_dr2/\347\272\242\346\236\234\347\237\255\345\211\247.js"
@@ -0,0 +1,28 @@
+var rule = {
+ title: '红果短剧',
+ host: 'https://www.hongguodj.cc/',
+ url: '/show/fyclass--------fypage---.html',
+ searchUrl: '/search/**----------fypage---.html',
+ class_parse: '.nav li;a&&Text;a&&href;.*/(.*?).html',
+ searchable: 2,
+ quickSearch: 0,
+ filterable: 0,
+ headers: {
+ 'User-Agent': 'MOBILE_UA',
+ },
+ play_parse: true,
+ lazy: "js:\n let html = request(input);\n let hconf = html.match(/r player_.*?=(.*?))[1];\n let json = JSON5.parse(hconf);\n let url = json.url;\n if (json.encrypt == '1') {\n url = unescape(url);\n } else if (json.encrypt == '2') {\n url = unescape(base64Decode(url));\n }\n if (/\\.(m3u8|mp4|m4a|mp3)/.test(url)) {\n input = {\n parse: 0,\n jx: 0,\n url: url,\n };\n } else {\n input = url && url.startsWith('http') && tellIsJx(url) ? {parse:0,jx:1,url:url}:input;\n }",
+ limit: 6,
+ double: true,
+ 推荐: '.show&&ul;li;img&&alt;img&&data-src;.bg&&Text;a&&href',
+ 一级: '.list li;img&&alt;img&&data-src;.bg&&Text;a&&href',
+ 二级: {
+ title: 'h2&&Text;.info p:eq(2)&&a&&Text',
+ img: 'img&&src',
+ desc: '.info p:eq(2)&&a&&Text;.info p:eq(3)&&a&&Text;.info p:eq(4)&&a&&Text;.info p:eq(0)&&a&&Text;.info p:eq(1)&&a&&Text',
+ content: '#desc&&Text',
+ tabs: '.play.my-2 .title&&a',
+ lists: '.play-list:eq(#id)&&.rows li',
+ },
+ 搜索: '.show.rows li;img&&alt;img&&data-src;.bg&&Text;a&&href',
+}
\ No newline at end of file
diff --git a/libs/drpyS.js b/libs/drpyS.js
index e3cd7bc..fd5b1f8 100644
--- a/libs/drpyS.js
+++ b/libs/drpyS.js
@@ -20,6 +20,7 @@ import {UC} from "../utils/uc.js";
import {Ali} from "../utils/ali.js";
import {Cloud} from "../utils/cloud.js";
import {Yun} from "../utils/yun.js";
+import {Pan} from "../utils/pan123.js";
import AIS from '../utils/ais.js';
// const { req } = await import('../utils/req.js');
import {gbkTool} from '../libs_drpy/gbk.js'
@@ -58,6 +59,7 @@ globalThis.UC = UC;
globalThis.Ali = Ali;
globalThis.Cloud = Cloud;
globalThis.Yun = Yun;
+globalThis.Pan = Pan;
globalThis.require = createRequire(import.meta.url);
globalThis._fetch = fetch;
globalThis.XMLHttpRequest = XMLHttpRequest;
@@ -165,13 +167,20 @@ globalThis.simplecc = simplecc;
let DataBase = null;
let database = null;
try {
- const sqliteUtil = await import('../utils/database.js'); // 使用动态 import
- DataBase = sqliteUtil.DataBase;
- database = sqliteUtil.database;
+ if (typeof fetchByHiker !== 'undefined' && typeof globalThis.import === 'function') {
+ const sqliteUtil = await globalThis.import('../utils/database.js'); // 海阔放在globalThis里去动态引入
+ DataBase = sqliteUtil.DataBase;
+ database = sqliteUtil.database;
+ } else {
+ const sqliteUtil = await import('../utils/database.js'); // 使用动态 import
+ DataBase = sqliteUtil.DataBase;
+ database = sqliteUtil.database;
+ }
console.log('sqlite3 database imported successfully');
} catch (error) {
console.log(`Failed to import sqlite3:${error.message}`);
}
+
globalThis.DataBase = DataBase;
globalThis.database = database;
@@ -312,6 +321,7 @@ export async function getSandbox(env = {}) {
Ali,
Cloud,
Yun,
+ Pan,
DataBase,
database,
require,
@@ -332,6 +342,9 @@ export async function getSandbox(env = {}) {
setInterval,
clearTimeout,
clearInterval,
+ TextEncoder,
+ TextDecoder,
+ performance,
module: {}, // 模块支持
exports: {}, // 模块支持
rule: {}, // 用于存放导出的 rule 对象
diff --git a/package.json b/package.json
index af50896..b38b7fe 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "drpy-node",
- "version": "1.1.19",
+ "version": "1.1.23",
"main": "index.js",
"type": "module",
"scripts": {
@@ -41,14 +41,13 @@
"lru-cache": "^9.1.2",
"mime-types": "^2.1.35",
"minizlib": "^3.0.1",
+ "node-sqlite3-wasm": "^0.8.35",
"p-queue": "^8.0.1",
"pinyin": "2.10.2",
"qs": "^6.13.1",
"queue": "^7.0.0",
"rotating-file-stream": "^3.2.5",
"simplecc-wasm": "^1.1.0",
- "sqlite": "4.2.1",
- "sqlite3": "^5.1.7",
"sync-fetch": "^0.6.0-2",
"tunnel": "^0.0.6",
"ws": "^8.18.0",
diff --git a/public/index.html b/public/index.html
index 5c8f137..b86b6e7 100644
--- a/public/index.html
+++ b/public/index.html
@@ -8,7 +8,7 @@
drpyS(drpy-node)
-nodejs作为服务端的drpy实现。全面升级异步写法
积极开发中,每日一更,当前进度 48%
找工作中,随缘更新
+nodejs作为服务端的drpy实现。全面升级异步写法
积极开发中,每日一更,当前进度 49%
找工作中,随缘更新
更新记录
+20250310
+更新至V1.1.23
+20250227
+更新至V1.1.22
+20250226
+更新至V1.1.21
+20250225
+更新至V1.1.20
20250224
更新至V1.1.19
20250211
diff --git a/utils/database.js b/utils/database.js
index fa41812..a9f991f 100644
--- a/utils/database.js
+++ b/utils/database.js
@@ -1,66 +1,25 @@
-import sqlite3 from 'sqlite3'
-import {open} from 'sqlite'
+// 1️⃣ 导入时用别名重命名原模块的 Database
+import pkg from 'node-sqlite3-wasm';
+
+const {Database: SQLite3Database} = pkg; // 👈 关键别名
import {fileURLToPath} from "url";
import path from 'path';
-async function main() {
- // 打开数据库(若不存在则创建)
- const db = await open({
- filename: '../database.db',
- driver: sqlite3.Database
- });
-
- // 创建表
- await db.run(`
- CREATE TABLE IF NOT EXISTS users (
- id INTEGER PRIMARY KEY AUTOINCREMENT,
- name TEXT NOT NULL
- )
- `);
-
- // 插入数据
- await db.run('INSERT INTO users (name) VALUES (?)', ['Alice']);
- await db.run('INSERT INTO users (name) VALUES (?)', ['Bob']);
-
- // 查询数据
- const users = await db.all('SELECT * FROM users');
- console.log(users);
-
- // 更新数据
- await db.run('UPDATE users SET name = ? WHERE id = ?', ['Charlie', 1]);
-
- // 查询更新后的数据
- const updatedUsers = await db.all('SELECT * FROM users');
- console.log(updatedUsers);
-
- // 删除数据
- await db.run('DELETE FROM users WHERE id = ?', [2]);
-
- // 查询删除后的数据
- const finalUsers = await db.all('SELECT * FROM users');
- console.log(finalUsers);
-
- // 关闭数据库
- await db.close();
-}
-
-// main().catch(err => console.error(err));
+// 2️⃣ 定义你的自定义类(可继承/扩展/完全重写)
export class DataBase {
constructor(db_file) {
this.db_file = db_file || './database.db';
this.db = null;
}
+ // 自定义方法
async initDb() {
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const __rootPath = path.join(__dirname, '../');
const __dbpath = path.join(__rootPath, this.db_file);
// console.log('__dbpath:', __dbpath);
- const db = await open({
- filename: __dbpath,
- driver: sqlite3.Database
- });
+ const db = new SQLite3Database(__dbpath);
this.db = db;
return db
}
@@ -79,4 +38,44 @@ export class DataBase {
}
}
+async function main() {
+ // 打开数据库(若不存在则创建)
+ const db = new SQLite3Database("../database.db");
+
+ // 创建表
+ db.run(`
+ CREATE TABLE IF NOT EXISTS users (
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
+ name TEXT NOT NULL
+ )
+ `);
+
+ // 插入数据
+ db.run('INSERT INTO users (name) VALUES (?)', ['Alice']);
+ db.run('INSERT INTO users (name) VALUES (?)', ['Bob']);
+
+ // 查询数据
+ const users = db.all('SELECT * FROM users');
+ console.log(users);
+
+ // 更新数据
+ db.run('UPDATE users SET name = ? WHERE id = ?', ['Charlie', 1]);
+
+ // 查询更新后的数据
+ const updatedUsers = db.all('SELECT * FROM users');
+ console.log(updatedUsers);
+
+ // 删除数据
+ db.run('DELETE FROM users WHERE id = ?', [2]);
+
+ // 查询删除后的数据
+ const finalUsers = db.all('SELECT * FROM users');
+ console.log(finalUsers);
+
+ // 关闭数据库
+ db.close();
+}
+
export const database = new DataBase('./database.db');
+
+// main().catch(err => console.error(err));
diff --git a/utils/pan123.js b/utils/pan123.js
new file mode 100644
index 0000000..ee04693
--- /dev/null
+++ b/utils/pan123.js
@@ -0,0 +1,236 @@
+import axios from "axios";
+import {ENV} from "./env.js";
+import {base64Decode} from "../libs_drpy/crypto-util.js";
+
+
+class Pan123 {
+ constructor() {
+ this.regex = /https:\/\/(www.123684.com|www.123865.com|www.123912.com|www.123pan.com|www.123pan.cn|www.123592.com)\/s\/([^\\/]+)/
+ this.api = 'https://www.123684.com/b/api/share/';
+ this.loginUrl = 'https://login.123pan.com/api/user/sign_in';
+ this.cate = ''
+ }
+
+ async init() {
+ if(this.passport){
+ console.log("获取盘123账号成功")
+ }
+ if(this.password){
+ console.log("获取盘123密码成功")
+ }
+ if(this.auth){
+ let info = JSON.parse(CryptoJS.enc.Base64.parse(this.auth.split('.')[1]).toString(CryptoJS.enc.Utf8))
+ if(info.exp > Math.floor(Date.now() / 1000)){
+ console.log("登录成功")
+ }else {
+ console.log("登录过期,重新登录")
+ await this.loin()
+ }
+ }else {
+ console.log("尚未登录,开始登录")
+ await this.loin()
+ }
+ }
+
+ get passport(){
+ return ENV.get('pan_passport')
+ }
+
+ get password(){
+ return ENV.get('pan_password')
+ }
+
+ get auth(){
+ return ENV.get('pan_auth')
+ }
+
+ async loin(){
+ let data = JSON.stringify({
+ "passport": this.passport,
+ "password": this.password,
+ "remember": true
+ });
+ let config = {
+ method: 'POST',
+ url: this.loginUrl,
+ headers: {
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36',
+ 'Content-Type': 'application/json',
+ 'App-Version': '43',
+ 'Referer': 'https://login.123pan.com/centerlogin?redirect_url=https%3A%2F%2Fwww.123684.com&source_page=website',
+ },
+ data: data
+ };
+
+ let auth = (await axios.request(config)).data
+ ENV.set('pan_auth',auth.data.token)
+ }
+
+ getShareData(url){
+ url = decodeURIComponent(url);
+ const matches = this.regex.exec(url);
+ if(url.indexOf('?') > 0){
+ this.SharePwd = url.split('?')[1].match(/[A-Za-z0-9]+/)[0];
+ console.log(this.SharePwd)
+ }
+ if (matches) {
+ if(matches[2].indexOf('?') > 0){
+ return matches[2].split('?')[0]
+ }else {
+ return matches[2].match(/www/g)?matches[1]:matches[2];
+ }
+
+ }
+ return null;
+ }
+
+ async getFilesByShareUrl(shareKey){
+ let file = {}
+ let cate = await this.getShareInfo(shareKey, this.SharePwd, 0, 0)
+ if(cate && Array.isArray(cate)){
+ await Promise.all(cate.map(async (item) => {
+ if (!(item.filename in file)) {
+ file[item.filename] = [];
+ }
+ const fileData = await this.getShareList(item.shareKey,item.SharePwd,item.next, item.fileId);
+ if (fileData && fileData.length > 0) {
+ file[item.filename].push(...fileData);
+ }
+ }));
+ }
+ // 过滤掉空数组
+ for (let key in file) {
+ if (file[key].length === 0) {
+ delete file[key];
+ }
+ }
+ return file;
+ }
+
+ async getShareInfo(shareKey,SharePwd,next,ParentFileId) {
+ let cate = []
+ let list = await axios.get(this.api+"get",{
+ headers: {},
+ params: {
+ "limit": "100",
+ "next": next,
+ "orderBy": "file_name",
+ "orderDirection": "asc",
+ "shareKey": shareKey,
+ "SharePwd": SharePwd,
+ "ParentFileId": ParentFileId,
+ "Page": "1"
+ }
+ });
+ if(list.status === 200){
+ if(list.data.code === 5103){
+ console.log(list.data.message);
+ }else {
+ let info = list.data.data;
+ let next = info.Next;
+ let infoList = info.InfoList
+ infoList.forEach(item => {
+ if(item.Category === 0){
+ cate.push({
+ filename:item.FileName,
+ shareKey:shareKey,
+ SharePwd:SharePwd,
+ next:next,
+ fileId:item.FileId
+ });
+ }
+ })
+ let result = await Promise.all(cate.map(async (it)=> this.getShareInfo(shareKey,SharePwd,next, it.fileId)));
+ result = result.filter(item => item !== undefined && item !== null);
+ return [...cate,...result.flat()];
+ }
+ }
+ }
+
+ async getShareList(shareKey,SharePwd,next,ParentFileId) {
+ let video = []
+ let infoList = (await axios.get(this.api+"get",{
+ headers: {},
+ params: {
+ "limit": "100",
+ "next": next,
+ "orderBy": "file_name",
+ "orderDirection": "asc",
+ "shareKey": shareKey,
+ "SharePwd": SharePwd,
+ "ParentFileId": ParentFileId,
+ "Page": "1"
+ }
+ })).data.data.InfoList;
+ infoList.forEach(it=>{
+ if(it.Category === 2){
+ video.push({
+ ShareKey: shareKey,
+ FileId: it.FileId,
+ S3KeyFlag: it.S3KeyFlag,
+ Size: it.Size,
+ Etag: it.Etag,
+ FileName: it.FileName,
+ })
+ }
+ })
+ return video;
+ }
+
+ async getDownload(shareKey,FileId,S3KeyFlag,Size,Etag) {
+ await this.init();
+ let data = JSON.stringify({
+ "ShareKey": shareKey,
+ "FileID": FileId,
+ "S3KeyFlag": S3KeyFlag,
+ "Size": Size,
+ "Etag": Etag
+ });
+ let config = {
+ method: 'POST',
+ url: `${this.api}download/info`,
+ headers: {
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36',
+ 'Authorization': `Bearer ${this.auth}`,
+ 'Content-Type': 'application/json;charset=UTF-8',
+ 'platform': 'android',
+ },
+ data: data
+ };
+ let down = (await axios.request(config)).data.data
+ return base64Decode((new URL(down.DownloadURL)).searchParams.get('params'));
+ }
+
+ async getLiveTranscoding(shareKey,FileId,S3KeyFlag,Size,Etag){
+ await this.init();
+ let config = {
+ method: 'GET',
+ url: `https://www.123684.com/b/api/video/play/info`,
+ headers: {
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36',
+ 'Authorization': `Bearer ${this.auth}`,
+ 'Content-Type': 'application/json;charset=UTF-8',
+ 'platform': 'android',
+ },
+ params:{
+ "etag": Etag,
+ "size": Size,
+ "from": "1",
+ "shareKey": shareKey
+ }
+ };
+ let down = (await axios.request(config)).data.data.video_play_info
+ let videoinfo = []
+ down.forEach(item => {
+ if(item.url!==''){
+ videoinfo.push({
+ name:item.resolution,
+ url:item.url
+ })
+ }
+ })
+ return videoinfo;
+ }
+}
+
+export const Pan = new Pan123();
\ No newline at end of file
diff --git a/utils/uc.js b/utils/uc.js
index 483ef33..5eec95e 100644
--- a/utils/uc.js
+++ b/utils/uc.js
@@ -24,6 +24,19 @@ class UCHandler {
this.maxCache = 1024 * 1024 * 100;
this.urlHeadCache = {};
this.subtitleExts = ['.srt', '.ass', '.scc', '.stl', '.ttml'];
+ this.Addition = {
+ DeviceID: '07b48aaba8a739356ab8107b5e230ad4',
+ RefreshToken: '',
+ AccessToken: ''
+ }
+ this.conf = {
+ api: "https://open-api-drive.uc.cn",
+ clientID: "5acf882d27b74502b7040b0c65519aa7",
+ signKey: "l3srvtd7p42l0d0x1u8d7yc8ye9kki4d",
+ appVer: "1.6.8",
+ channel: "UCTVOFFICIALWEB",
+ codeApi: "http://api.extscreen.com/ucdrive",
+ };
}
@@ -33,6 +46,10 @@ class UCHandler {
return ENV.get('uc_cookie');
}
+ get token() {
+ return ENV.get('uc_token_cookie');
+ }
+
getShareData(url) {
let matches = this.regex.exec(url);
if (matches[1].indexOf("?") > 0) {
@@ -386,6 +403,19 @@ class UCHandler {
}
}
+ generateDeviceID(timestamp) {
+ return CryptoJS.MD5(timestamp).toString().slice(0, 16); // 取前16位
+ }
+
+ generateReqId(deviceID, timestamp) {
+ return CryptoJS.MD5(deviceID + timestamp).toString().slice(0, 16);
+ }
+
+ generateXPanToken(method, pathname, timestamp, key) {
+ const data = method + '&' + pathname + '&' + timestamp + '&' + key;
+ return CryptoJS.SHA256(data).toString();
+ }
+
async getDownload(shareId, stoken, fileId, fileToken, clean) {
@@ -398,32 +428,85 @@ class UCHandler {
this.saveFileIdCaches[fileId] = saveFileId;
}
+ if (this.token) {
+ let video = []
+ const pathname = '/file';
+ const timestamp = Math.floor(Date.now() / 1000).toString() + '000'; // 13位时间戳需调整
+ const deviceID = this.Addition.DeviceID || this.generateDeviceID(timestamp);
+ const reqId = this.generateReqId(deviceID, timestamp);
+ const x_pan_token = this.generateXPanToken("GET", pathname, timestamp, this.conf.signKey);
+ let config = {
+ method: 'GET',
+ url: `https://open-api-drive.uc.cn/file`,
+ params: {
+ req_id: reqId,
+ access_token: this.token,
+ app_ver: this.conf.appVer,
+ device_id: deviceID,
+ device_brand: 'Xiaomi',
+ platform: 'tv',
+ device_name: 'M2004J7AC',
+ device_model: 'M2004J7AC',
+ build_device: 'M2004J7AC',
+ build_product: 'M2004J7AC',
+ device_gpu: 'Adreno (TM) 550',
+ activity_rect: '{}',
+ channel: this.conf.channel,
+ method: "streaming",
+ group_by: "source",
+ fid: this.saveFileIdCaches[fileId],
+ resolution: "low,normal,high,super,2k,4k",
+ support: "dolby_vision"
+ },
+ headers: {
+ 'User-Agent': 'Mozilla/5.0 (Linux; U; Android 9; zh-cn; RMX1931 Build/PQ3A.190605.05081124) AppleWebKit/533.1 (KHTML, like Gecko) Mobile Safari/533.1',
+ 'Connection': 'Keep-Alive',
+ 'Accept-Encoding': 'gzip',
+ 'x-pan-tm': timestamp,
+ 'x-pan-token': x_pan_token,
+ 'content-type': 'text/plain;charset=UTF-8',
+ 'x-pan-client-id': this.conf.clientID
+ }
+ }
+ let req = await axios.request(config);
+ if (req.status === 200) {
+ let videoInfo = req.data.data.video_info
+ videoInfo.forEach((item) => {
+ video.push({
+ name: item.resolution,
+ url: item.url
+ })
+ })
+ return video;
+ }
+ } else {
+ const down = await this.api(`file/download?${this.pr}`, {
- const down = await this.api(`file/download?${this.pr}&sys=win32&ve=1.8.5&ut=Nk3UvPSOMurIrtiKrHXzCmx/iPIGIRI1HG5yX5zQL7ln7A%3D%3D`, {
-
- fids: [this.saveFileIdCaches[fileId]],
+ fids: [this.saveFileIdCaches[fileId]],
- });
+ });
- if (down.data) {
- const low_url = down.data[0].download_url;
- const low_cookie = this.cookie;
- const low_headers = {
- "Referer": "https://drive.uc.cn/",
- "cookie": low_cookie,
- "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) quark-cloud-drive/2.5.20 Chrome/100.0.4896.160 Electron/18.3.5.4-b478491100 Safari/537.36 Channel/pckk_other_ch'
- };
- // console.log('low_url:', low_url);
- const test_result = await this.testSupport(low_url, low_headers);
- // console.log('test_result:', test_result);
- if (!test_result[0]) {
- try {
- await this.refreshUcCookie('getDownload');
- } catch (e) {
- console.log(`getDownload:自动刷新UC cookie失败:${e.message}`)
+ if (down.data) {
+ const low_url = down.data[0].download_url;
+ const low_cookie = this.cookie;
+ const low_headers = {
+ "Referer": "https://drive.uc.cn/",
+ "cookie": low_cookie,
+ "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) quark-cloud-drive/2.5.20 Chrome/100.0.4896.160 Electron/18.3.5.4-b478491100 Safari/537.36 Channel/pckk_other_ch'
+ };
+ // console.log('low_url:', low_url);
+ const test_result = await this.testSupport(low_url, low_headers);
+ // console.log('test_result:', test_result);
+ if (!test_result[0]) {
+ try {
+ await this.refreshUcCookie('getDownload');
+ } catch (e) {
+ console.log(`getDownload:自动刷新UC cookie失败:${e.message}`)
+ }
}
+ return down.data[0];
}
- return down.data[0];
+
}
@@ -431,6 +514,40 @@ class UCHandler {
}
+ async getLazyResult(downCache, mediaProxyUrl) {
+ const urls = [];
+
+ downCache.forEach((it) => {
+ urls.push(it.name, it.url);
+ });
+
+ return {parse: 0, url: urls}
+
+ /*
+ // 旧的加速写法
+ const downUrl = downCache.download_url;
+ const headers = {
+ "Referer": "https://drive.uc.cn/",
+ "cookie": this.cookie,
+ "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) quark-cloud-drive/2.5.20 Chrome/100.0.4896.160 Electron/18.3.5.4-b478491100 Safari/537.36 Channel/pckk_other_ch'
+ };
+ urls.push("UC原画", downUrl);
+ urls.push("原代服", mediaProxyUrl + `?thread=${ENV.get('thread') || 6}&form=urlcode&randUa=1&url=` + encodeURIComponent(downUrl) + '&header=' + encodeURIComponent(JSON.stringify(headers)));
+ if (ENV.get('play_local_proxy_type', '1') === '2') {
+ urls.push("原代本", `http://127.0.0.1:7777/?thread=${ENV.get('thread') || 6}&form=urlcode&randUa=1&url=` + encodeURIComponent(downUrl) + '&header=' + encodeURIComponent(JSON.stringify(headers)));
+ } else {
+ urls.push("原代本", `http://127.0.0.1:5575/proxy?thread=${ENV.get('thread') || 6}&chunkSize=256&url=` + encodeURIComponent(downUrl));
+ }
+
+ return {
+ parse: 0,
+ url: urls,
+ header: headers,
+ }
+ */
+
+ }
+
async testSupport(url, headers) {