Como tudo começou ...
Como sempre, participando do VKontakte, decidi baixar algumas novas gravações de áudio no computador. Mas fiquei desapontado: as gravações de áudio retornaram em algum formato estranho: m3u8. Esse formato nem reproduzia o vlc media pleyer, e comecei a pensar no que fazer ...
O que realmente faz?
Pesquisando sobre o tipo de formato .m3u8, percebi que esse áudio é no formato
.m3u . Ok, faça o download deste arquivo .m3u8, abra-o com um editor de texto e veja algo como isto:
Text#EXTM3U #EXT-X-TARGETDURATION:3 #EXT-X-ALLOW-CACHE:YES #EXT-X-PLAYLIST-TYPE:VOD #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:1 #EXTINF:1.000, 6cfGpgIDcrZjA.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:2.000, c2d2tpKzIsYzM.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:3.000, a3fWlvLDwmZD4.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:3.000, edeWZhKTUnazE.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:3.000, 9df2NqJzcmZj0.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXT-X-ENDLIST
Além disso, entendemos que
9df2NqJzcmZj0.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh
- caminho para a gravação de áudio. Ou seja, você precisa substituir um host por cada caminho e, provavelmente, esse áudio se tornará reproduzível. Depois de lançar rapidamente algumas linhas de código em python, implementamos isso:
Código import re text='''#EXTM3U #EXT-X-TARGETDURATION:3 #EXT-X-ALLOW-CACHE:YES #EXT-X-PLAYLIST-TYPE:VOD #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:1 #EXTINF:1.000, 6cfGpgIDcrZjA.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:2.000, c2d2tpKzIsYzM.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:3.000, a3fWlvLDwmZD4.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:3.000, edeWZhKTUnazE.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:3.000, 9df2NqJzcmZj0.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXT-X-ENDLIST''' host='https://cs9-5v4.vkuseraudio.net/p16/d5fce44eae6dbc/' al = re.findall('\n.+?\.ts\?extra\=.+?\n',text) for r in al: text=text.replace(r,'\n'+host+r.strip('\n')+'\n') print(text) input()
nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh import re text='''#EXTM3U #EXT-X-TARGETDURATION:3 #EXT-X-ALLOW-CACHE:YES #EXT-X-PLAYLIST-TYPE:VOD #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:1 #EXTINF:1.000, 6cfGpgIDcrZjA.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:2.000, c2d2tpKzIsYzM.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:3.000, a3fWlvLDwmZD4.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:3.000, edeWZhKTUnazE.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:3.000, 9df2NqJzcmZj0.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXT-X-ENDLIST''' host='https://cs9-5v4.vkuseraudio.net/p16/d5fce44eae6dbc/' al = re.findall('\n.+?\.ts\?extra\=.+?\n',text) for r in al: text=text.replace(r,'\n'+host+r.strip('\n')+'\n') print(text) input()
nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh import re text='''#EXTM3U #EXT-X-TARGETDURATION:3 #EXT-X-ALLOW-CACHE:YES #EXT-X-PLAYLIST-TYPE:VOD #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:1 #EXTINF:1.000, 6cfGpgIDcrZjA.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:2.000, c2d2tpKzIsYzM.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:3.000, a3fWlvLDwmZD4.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:3.000, edeWZhKTUnazE.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:3.000, 9df2NqJzcmZj0.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXT-X-ENDLIST''' host='https://cs9-5v4.vkuseraudio.net/p16/d5fce44eae6dbc/' al = re.findall('\n.+?\.ts\?extra\=.+?\n',text) for r in al: text=text.replace(r,'\n'+host+r.strip('\n')+'\n') print(text) input()
nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh import re text='''#EXTM3U #EXT-X-TARGETDURATION:3 #EXT-X-ALLOW-CACHE:YES #EXT-X-PLAYLIST-TYPE:VOD #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:1 #EXTINF:1.000, 6cfGpgIDcrZjA.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:2.000, c2d2tpKzIsYzM.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:3.000, a3fWlvLDwmZD4.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:3.000, edeWZhKTUnazE.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:3.000, 9df2NqJzcmZj0.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXT-X-ENDLIST''' host='https://cs9-5v4.vkuseraudio.net/p16/d5fce44eae6dbc/' al = re.findall('\n.+?\.ts\?extra\=.+?\n',text) for r in al: text=text.replace(r,'\n'+host+r.strip('\n')+'\n') print(text) input()
nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh import re text='''#EXTM3U #EXT-X-TARGETDURATION:3 #EXT-X-ALLOW-CACHE:YES #EXT-X-PLAYLIST-TYPE:VOD #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:1 #EXTINF:1.000, 6cfGpgIDcrZjA.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:2.000, c2d2tpKzIsYzM.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:3.000, a3fWlvLDwmZD4.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:3.000, edeWZhKTUnazE.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXTINF:3.000, 9df2NqJzcmZj0.ts?extra=0F4d1n-wWV6igsS5Ji7x6gYIbtU_aRzsiByqvrumv4W1iznLLoiC552LnsmyKeuuOtw70WTqfYdDCir-nmlL3VlLR9i2Y6IPOudQxWPbZjlslXE7prmIvdLyoLxb3A9NFnHo2KR5NStPg1sk6ZVXrYBh #EXT-X-ENDLIST''' host='https://cs9-5v4.vkuseraudio.net/p16/d5fce44eae6dbc/' al = re.findall('\n.+?\.ts\?extra\=.+?\n',text) for r in al: text=text.replace(r,'\n'+host+r.strip('\n')+'\n') print(text) input()
e obtemos um arquivo .m3u já reproduzível.
MAS! O problema é que:
- Este arquivo pode ser reproduzido apenas enquanto os links para as lacunas de áudio forem válidos.
- Você também pode converter o arquivo apenas enquanto os links forem válidos
- Você só pode converter o arquivo no computador em que foi recebido. os links estão ligados ao endereço IP do PC.
Tendo entendido tudo isso, decidi escrever um programa no cliente js para que ele pudesse ser executado na linha de comando. Aqui está o que eu tenho:
O programa class music_get{ constructor(){ this.el=document.getElementsByClassName("audio_row"); this.str_param=[]; this.json=[]; this.last_len=this.el.length; this.make_str(this.el); this.load_audio_to_json(0,this.str_param[0]); } parse(element_){
O resultado é algo como isto:

Além disso, depois de baixar todo o áudio em uma pasta, escrevi o seguinte código python para converter todo o áudio
.m3u8 em
.ts :
Código import requests,re,os def convert_mp3(f): z=open(f).read() con=list(map(lambda e: e.rstrip('\n').rstrip('#EXT-X-ENDLIST').rstrip("\n") if '#EXTM3U' not in e else '' ,re.split('#EXTINF:\d+.\d+,\n',z))) z = b'' for r in con: if(r==''):continue; z+=requests.get(r).content open(f.strip(".m3u8")+".ts",'bw').write(z) z=set() for file in os.listdir(): if file.endswith(".m3u8"): z.add(file) convert_mp3(file) z=',\n'.join(z) input(f":{z} .\n Enter, !")
Em princípio, você pode tentar combinar trechos .ts em js e depois baixar o arquivo inteiro, mas não obtive êxito (
PS que conseguem - escreva nos comentários
PPS Esqueci de dizer que o Yandex.browser ainda retorna links para .mp3)
Atualização:
Como corretamente notado
nokimaro, você pode baixar imediatamente o mp3:
código class music_get{ constructor(){ this.el=document.getElementsByClassName("audio_row"); this.s=[]; this.j=[]; this.last_len=this.el.length; this.make_str(this.el); this.load_audio_to_json(0,this.s[0]); } parse(element_){
código compactado:
eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('8 p=7(){5.y=O.1a("1b");5.s=[];5.j=[];5.C=5.yo;5.J(5.y);5.D(0,5.s[0])};pqE=7(a){a=PQ(1c.E(a.1d("R-1e")));n a.S+"T"+a.1f+"T"+a.1g};pqU=7(a){8 b={v:7(a){n at("").1h().F("")},r:7(a,b){a=at("");A(8 k=1i 0,e=d+d,c=ao;c--;)~(k=eB(a[c]))&&(a[c]=eV(kb,1));n aF("")},s:7(a,b){8 c=ao;u(c){8 e=b,d=ao,f=[];u(d){8 g=d;A(e=W.1j(e);g--;)e=(d*(g+1)^e+g)%d,f[g]=e}e=0;A(a=at("");++e<c;)a[e]=aK(f[c-1-e],1,a[e])[0];a=aF("")}na},i:7(a,d){n bs(a,d^1k.X)},x:7(a,d){8 b=[];nd=dY(0),G(at(""),7(a,c){bL(HI(cY(0)^d))}),bF("")}},d="1l+/=",c=7(a){u(!a||1==ao%4)n!1;A(8 b,c,e=0,g=0,f="";c=a.1m(g++);)~(c=dB(c))&&(b=e%4?1n*b+c:c,e++%4)&&(f+=HI(1o&b>>(-2*e&6)));nf};u((!MZ||!~(M.1p+"").B("Z"))&&~aB("1q")){8 f=at("?1r=")[1].t("#"),g=""===f[1]?"":c(f[1]);u(f=c(f[0]),"1s"!=1t g||!f)na;A(8 h,l=(g=g?gt(HI(9)):[]).o;l--;){u(h=(c=g[l].t(HI(11))).K(0,1,f)[0],!b[h])na;f=b[h].1u(1v,c)}u(f&&"1w"===fV(0,4))nf}na};pq12=7(){8 a=5;G(5.j,7(b,d){8 c=O.1x(\'[R-1y-X="\'+d.S+\'"]\')[0].N[0].N[6];3!==cNo&&(c.1z+="<a 1A=\'"+a.13(d)+"\' 1B=\'1C\' 1D=\'1E:1F;1G:14;1H:14;1I:z(/1J) 1K-1L 15 15;\'></a>")})};pq13=7(a){n-1!==azB(".16?")?az:az17("/1M.1N",".16").17(/\\/\\w{11}\\//,"/")};pqJ=7(a){8 b=5;G(a,7(a,c){W.1O(a/10)===a/10?bsL(bE(c)):bs[bso-1]+=","+bE(c)})};pqD=7(a,b){8 d=5;1P.1Q("/1R.1S",{1T:"1U",1V:"1",1W:b},{1X:7(b){G(b,7(a,b){b=PQ(b);bz=dU(bz);djL(b)});dso-1===a?d.12():dD(a+1,ds[a+1])}})};pq18=7(){u(5.yo!==5.C){8 a=5.yo,b=a-5.C;5.C=a;a=1Y.1Z(5.y).K(-b);5.19(a)}};pq19=7(a){8 b=5.so-1;5.J(a);5.D(b,5.s[b])};8 m=20 p;M.21=7(){n m.18()};',62,126,'|||||this||function|var|||||||||||||||return|length|music_get|prototype|||split|if||||el|url|for|indexOf|last_len|load_audio_to_json|parse|join|each|String|fromCharCode|make_str|splice|push|window|children|document|AudioUtils|asObject|data|fullId|_|encode_url|substr|Math|id|charCodeAt|wbopen|||end|_g|40px|5px|mp3|replace|_update_scroll|_load_button|getElementsByClassName|audio_row|JSON|getAttribute|audio|actionHash|urlHash|reverse|void|abs|vk|abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMN0PQRSTUVWXYZO123456789|charAt|64|255|open|audio_api_unavailable|extra|string|typeof|apply|null|http|querySelectorAll|full|innerHTML|href|target|_blank|style|float|right|height|width|background|doc472427950_504561254|no|repeat|index|m3u8|floor|ajax|post|al_audio|php|act|reload_audio|al|ids|onDone|Array|from|new|onscroll'.split('|'),0,{}))