Reino17 / xivid

Xivid, een Windows en Linux video-url extractie commandoregel-script.
GNU General Public License v3.0
7 stars 2 forks source link

Mixcloud support #7

Closed Invictaz closed 4 years ago

Invictaz commented 4 years ago

Mediahuman https://www.mediahuman.com/download.html is een van de weinige XP software die nog Mixcloud en Soundcloud download support en vaak geupdate wordt. Helaas closed source en hij installeert deze een hoop troep erbij zoals QT bijvoorbeeld. Aangezien Youtube steeds strikter wordt qua muziek (en Youtube-dl na maanden pas updates krijgt (of niet) voor Mixcloud en Soundcloud) werd het tijd om te kijken naar een alternatief. Ik gebruikte normaal altijd Lacey (the-sz.com) of 4k video downloader (https://www.4kdownload.com/nl/products/product-videodownloader) maar die ondersteunen beiden geen Mixcloud meer. Nu weet ik dat Xivid voornamelijk gefocussed is op video, maargoed wie niet waagt wie niet wint qua verzoekjes :)

De code om Mixcloud en Souncloud te scrapen is er wel, vaak in Python scripts https://github.com/Miserlou/SoundScrape

Of in Chrome en Firefox extensies https://github.com/mixcloud-downloader

Het voordeel van die Mediahuman is dat het bestand niet opgeslagen wordt als

"ae745f33egb32HHff.m4a" maar gelijk de Artiest en Titel ophaalt en de mogelijkheid geeft die vooraf aan het downloaden te bewerken. Plus, direct converteert naar mp3 ipv m4a als het bestand gedownload is. Het temp bestand wordt dan gedelete.

Misschien allemaal teveel werk, met alleen de m4a link + eventuele download optie zou ik ook al blij zijn. Elke keer Chrome opstarten is irritant. Foobar2000 heeft wel input support voor Mixcloud via een plugin. AIMP via foo_youtube met externe youtube-dl en Winamp alleen met de onofficiële WACUP. Alledrie hebben geen download optie. VLC ondersteunt het niet native en ik heb geen plugin kunnen vinden.

Voorbeeldje van een Soundcloud endpoint: https://stream10.mixcloud.com/secure/c/m4a/64/0/0/1/c/6fcc-4335-4aaf-8305-84e709ccc1d9.m4a?sig=FJ29cabjN0VlZe_zdXQQcw

Er zit dus een signature bij en wellicht nog wat andere rommel zoals een token.

Reino17 commented 4 years ago

Hallo Invictaz,

Het is altijd een vertaalslag van programma-url naar audio/video-url, dus welke programma-url hoort er bij die audio-url (of "endpoint" zoals jij het noemt)?

Invictaz commented 4 years ago

@Reino17

https://www.mixcloud.com/EricVanKleef/clubbin-12-wildfm-30-mei-2020/

Reino17 commented 4 years ago

Ik schuif dit even op de lange termijn.
Ik heb even naar youtube-dl's mixcloud.py gekeken. Er zijn flink wat ingewikkelde handelingen nodig om de audio-urls (http, dash en hls) te genereren en aangezien ik weinig ervaring heb met Python, heb ik hier tijd voor nodig. Of iemand anders moet een voorzetje willen geven (curl-commando mag ook).

Invictaz commented 4 years ago

Ik heb even voor je gezocht @Reino17 het is nog niet zo simpel omdat die troep allemaal werkt tegenwoordig met oauth en tokens.

Soundcloud

https://gist.github.com/ic3y808/96d12b615fa0192ac36d

SUPEROUD VOOR MIXCLOUD IK WEET NIET OF HET NOG WERKT

mixurl=curl -s http://www.mixcloud.com/some/mixcloud/url | sed -rn 's/.*data-preview-url="([^"]+).*/\1/p' | sed -rn 's/previews/cloudcasts\/originals/p' ; for i in {1..20}; do curl -Of echo $mixurl | sed -rn "s/stream([0-9]+)/stream$i/p" ; done

Verder kwam ik dit tegen voor je, wellicht is het interessant om e.e.a. uit te slopen:

https://linoxide.com/linux-how-to/tizonia-command-line-music-player-linux/

Invictaz commented 4 years ago

Nog een API URL voor Soundcloud: http://api.soundcloud.com/tracks?q=Adventure&limit=5&client_id=7fda73e4303db4146b1b2145944d3e1c

Invictaz commented 4 years ago

Kan je hier nog wat mee?

https://git.superevilmegaco.com/walialu/dotfiles/blob/f83e133d48f7b2d2565326309a1cc37782a72bef/.mylocalbin/soundcloud-dl/scdl

Invictaz commented 4 years ago

Super oud maar maybe it works https://github.com/nuved/soundcloud-dl/blob/master/soundcloud_curl.sh

Reino17 commented 4 years ago

https://gist.github.com/ic3y808/96d12b615fa0192ac36d

http://api.soundcloud.com/tracks?q=Adventure&limit=5&client_id=7fda73e4303db4146b1b2145944d3e1c

https://git.superevilmegaco.com/walialu/dotfiles/blob/f83e133d48f7b2d2565326309a1cc37782a72bef/.mylocalbin/soundcloud-dl/scdl

Om gebruik te maken van de SoundCloud api heb je een account nodig (met een clientid, clientsecret, password, token en weet ik wat meer). Voor gebruik in xivid moet dat dus op een andere manier. youtube-dl maakt er ook geen gebruik van.

mixurl=curl -s http://www.mixcloud.com/some/mixcloud/url | sed -rn 's/.*data-preview-url="([^"]+).*/\1/p' | sed -rn 's/previews/cloudcasts\/originals/p' ; for i in {1..20}; do curl -Of echo $mixurl | sed -rn "s/stream([0-9]+)/stream$i/p" ; done

https://github.com/nuved/soundcloud-dl/blob/master/soundcloud_curl.sh

Misschien dat dat in het verleden heeft gewerkt, maar nu valt in de html-bron (van https://www.mixcloud.com/EricVanKleef/clubbin-12-wildfm-30-mei-2020/) niks meer terug te vinden.

Trouwens, je kunt je posts ook aanpassen, hè... i.p.v. 4 losse posts.

Invictaz commented 4 years ago

Ik kan het niet aanpassen in IE11, die browser wordt nog maar zeer beperkt ondersteund door Github. Dat is het gevaar van een oudere Windows machine ;)

Sommige van de code die ik gepost heb is (expres) zo jong mogelijk. Maar blijkbaar is de 2 jaar oude code al achterhaald. Ik heb de Youtube-dl code wel in gebruik in Foobar voor Mixcloud maar nog niet getest op Soundcloud.

Reino17 commented 4 years ago

Ik kan het niet aanpassen in IE11, die browser wordt nog maar zeer beperkt ondersteund door Github.
Dat is het gevaar van een oudere Windows machine ;)

Ah ja, ik weet er alles van. Mijn Pale Moon (Firefox fork) browser ondersteunt de nieuwste javascript ook niet, waardoor ik posts ook niet kan aanpassen. Dat moet ik op mijn smartphone doen. Daarom probeer ik het ook altijd in één keer goed te doen.

Ok, ik ben in ieder geval nu zo ver dat ik de desbetreffende JSON te pakken heb:

xidel -se '
  x:request(
    {
      "headers":(
        "X-CSRFToken: pXahjuUXJCpVe6ggOlOAy9MwvDqVpK4IrSS5JWwvmPlHeYBiq0pjeLuN7OPfvvBB",
        "Content-Type: application/json",
        "Referer: https://www.mixcloud.com/EricVanKleef/clubbin-12-wildfm-30-mei-2020/",
        "Cookie: __cfduid=d20d8c494e1196e16bc2400fdd9f95e871591047116; csrftoken=pXahjuUXJCpVe6ggOlOAy9MwvDqVpK4IrSS5JWwvmPlHeYBiq0pjeLuN7OPfvvBB; mx_t=16190190-b563-43f2-88db-044ed6791790; c=bpb0lwf36mr1o0fbicqxl6dei8a7803x"
      ),
      "post":"{""query"":""{cloudcastLookup(lookup:{username:\""EricVanKleef\"",slug:\""clubbin-12-wildfm-30-mei-2020\""}){name,owner{displayName,url,username},publishDate,audioLength,streamInfo{dashUrl,hlsUrl,url}}}""}",
      "url":"https://www.mixcloud.com/graphql"
    }
  )/json/data/cloudcastLookup
'
{
  "name": "CLUBBIN #12 @WILDFM 30 MEI 2020.",
  "owner": {
    "displayName": "Eric van Kleef",
    "url": "https://www.mixcloud.com/EricVanKleef/",
    "username": "EricVanKleef"
  },
  "publishDate": "2020-05-31T10:55:53+00:00",
  "audioLength": 5842,
  "streamInfo": {
    "hlsUrl": "ITItPyZtbmE1ISwsLmNmZz49KzcjKDAwfiImKWs8KywhNip4JiA8bnRpYmB8Yip3dSosNml9dWp6eGMgLzJ5cHZxZ3lxZzFkZHYkJjdhJXBqKXsvYD0qKzI2YiJyMX4=",
    "url": "ITItPyZtbmEnIDogID9le305OiwsKyohNG8qKylgPSo3MT0yYS9gLHAnfXl5Ynl3c2N+eidmcD8sNnp1fWdhZXEgMzJka2djYWJ/cTFncXAnJyx/K21qImMvczwoI3sUBX90KjkhJgFlEiUcPBAvMxkfBTc/"
  }
}

https://github.com/ytdl-org/youtube-dl/blob/master/youtube_dl/extractor/mixcloud.py#L141-L142:

            decrypted = self._decrypt_xor_cipher(
                self._DECRYPTION_KEY, compat_b64decode(format_url))

Het Base64 decoderen is niet zo spannend...

xidel -se 'x:request([...])/json//streamInfo/* ! binary-to-string(base64Binary(.))'
!2-?&mna5!,,.cfg>=+7#(00~"&)k<+,!6*x& <ntib`|b*wu*,6i}ujzxc /2ypvqgyqg1ddv$&7a%pj){/`=*+26b"r1~
!2-?&mna' :  ?e{}9:,,+*!4o*+)`=*71=2a/`,p'}yybywsc~z'fp?,6zu}gaeq 32dkgcabq1gqp'',+mj"c/s<(#{t*9!&e%</37?

...maar daar komt brabbeltaal uit en ik begrijp niet hoe die _DECRYPTION_KEY daar op losgelaten wordt.

Invictaz commented 4 years ago

Ik post het altijd vrij snel aangezien je soms een hele berg getikt hebt en dan is je pagina timed-out ofzo. Overigens is Pale Moon 28 de laatste voor XP, recenter is MyPal: https://github.com/Feodor2/Mypal

Ontopic: Wellicht heeft Xidel geen support voor die decryption key.

Wat is de uiteindelijke url van die json? Je voert dat complete commando in dus van

xidel -se ' tot "url": "ITItPyZtbmEnIDogID9le305OiwsKyohNG8qKylgPSo3MT0yYS9gLHAnfXl5Ynl3c2N+eidmcD8sNnp1fWdhZXEgMzJka2djYWJ/cTFncXAnJyx/K21qImMvczwoI3sUBX90KjkhJgFlEiUcPBAvMxkfBTc/" } }

En dan krijg je een url?

ik wist niet dat je regels onder elkaar kon invoeren in de commandline / terminal?

Reino17 commented 4 years ago

Palemoon 27.9.7 hier. Vanwege mijn oude pc kan ik Palemoon 28 niet gebruiken.
De preview-knop bij het maken van m'n posts werkt niet, dus bereid ik mijn posts voor, met opmaak en al, op https://jbt.github.io/markdown-editor/.

Wellicht heeft Xidel geen support voor die decryption key.

Je zult versteld staan van wat xidel allemaal kan!

Wat is de uiteindelijke url van die json?

Die is er niet. Er wordt een "POST"-request gedaan naar https://www.mixcloud.com/graphql, met die JSON als antwoord.

ik wist niet dat je regels onder elkaar kon invoeren in de commandline / terminal?

Vreemd dat je dat nog niet was opgevallen. In zowel xivid.bat als xivid.sh zie je dat bij alle queries. Op die manier is het veel leesbaarder. Alleen in xivid.bat is het dan weer wat minder leesbaar vanwege de verplichte escape-characters.

Je voert dat complete commando in dus van

xidel -se '
tot
"url": [...]

En dan krijg je een url?

Nee, je voert dit in...

xidel -se '
  x:request(
    {
      "headers":(
        "X-CSRFToken: pXahjuUXJCpVe6ggOlOAy9MwvDqVpK4IrSS5JWwvmPlHeYBiq0pjeLuN7OPfvvBB",
        "Content-Type: application/json",
        "Referer: https://www.mixcloud.com/EricVanKleef/clubbin-12-wildfm-30-mei-2020/",
        "Cookie: __cfduid=d20d8c494e1196e16bc2400fdd9f95e871591047116; csrftoken=pXahjuUXJCpVe6ggOlOAy9MwvDqVpK4IrSS5JWwvmPlHeYBiq0pjeLuN7OPfvvBB; mx_t=16190190-b563-43f2-88db-044ed6791790; c=bpb0lwf36mr1o0fbicqxl6dei8a7803x"
      ),
      "post":"{""query"":""{cloudcastLookup(lookup:{username:\""EricVanKleef\"",slug:\""clubbin-12-wildfm-30-mei-2020\""}){name,owner{displayName,url,username},publishDate,audioLength,streamInfo{dashUrl,hlsUrl,url}}}""}",
      "url":"https://www.mixcloud.com/graphql"
    }
  )/json/data/cloudcastLookup
'

...of dit...

xidel -s \
-H "X-CSRFToken: pXahjuUXJCpVe6ggOlOAy9MwvDqVpK4IrSS5JWwvmPlHeYBiq0pjeLuN7OPfvvBB" \
-H "Content-Type: application/json" \
-H "Referer: https://www.mixcloud.com/EricVanKleef/clubbin-12-wildfm-30-mei-2020/" \
-H "Cookie: __cfduid=d20d8c494e1196e16bc2400fdd9f95e871591047116; csrftoken=pXahjuUXJCpVe6ggOlOAy9MwvDqVpK4IrSS5JWwvmPlHeYBiq0pjeLuN7OPfvvBB; mx_t=16190190-b563-43f2-88db-044ed6791790; c=bpb0lwf36mr1o0fbicqxl6dei8a7803x" \
-d '{{"query":"{{cloudcastLookup(lookup:{{username:\"EricVanKleef\",slug:\"clubbin-12-wildfm-30-mei-2020\"}}){{name,owner{{displayName,url,username}},publishDate,audioLength,streamInfo{{hlsUrl,url}}}}}}"}}' \
https://www.mixcloud.com/graphql -e '$json//cloudcastLookup'

...en je krijgt de JSON als antwoord:

{
  "name": "CLUBBIN #12 @WILDFM 30 MEI 2020.",
  "owner": {
    "displayName": "Eric van Kleef",
    "url": "https://www.mixcloud.com/EricVanKleef/",
    "username": "EricVanKleef"
  },
  "publishDate": "2020-05-31T10:55:53+00:00",
  "audioLength": 5842,
  "streamInfo": {
    "hlsUrl": "ITItPyZtbmE1ISwsLmNmZz49KzcjKDAwfiImKWs8KywhNip4JiA8bnRpYmB8Yip3dSosNml9dWp6eGMgLzJ5cHZxZ3lxZzFkZHYkJjdhJXBqKXsvYD0qKzI2YiJyMX4=",
    "url": "ITItPyZtbmEnIDogID9le305OiwsKyohNG8qKylgPSo3MT0yYS9gLHAnfXl5Ynl3c2N+eidmcD8sNnp1fWdhZXEgMzJka2djYWJ/cTFncXAnJyx/K21qImMvczwoI3sUBX90KjkhJgFlEiUcPBAvMxkfBTc/"
  }
}

Deze commando's zijn trouwens voor Linux Bash. Voor Windows CMD is het...

xidel -se ^"^
  x:request(^
    {^
      'headers':(^
        'X-CSRFToken: pXahjuUXJCpVe6ggOlOAy9MwvDqVpK4IrSS5JWwvmPlHeYBiq0pjeLuN7OPfvvBB',^
        'Content-Type: application/json',^
        'Referer: https://www.mixcloud.com/EricVanKleef/clubbin-12-wildfm-30-mei-2020/',^
        'Cookie: __cfduid=d20d8c494e1196e16bc2400fdd9f95e871591047116; csrftoken=pXahjuUXJCpVe6ggOlOAy9MwvDqVpK4IrSS5JWwvmPlHeYBiq0pjeLuN7OPfvvBB; mx_t=16190190-b563-43f2-88db-044ed6791790; c=bpb0lwf36mr1o0fbicqxl6dei8a7803x'^
      ),^
      'post':'{\"query\":\"{cloudcastLookup(lookup:{username:\\\"EricVanKleef\\\",slug:\\\"clubbin-12-wildfm-30-mei-2020\\\"}){name,owner{displayName,url,username},publishDate,audioLength,streamInfo{hlsUrl,url}}}\"}',^
      'url':'https://www.mixcloud.com/graphql'^
    }^
  )/json/data/cloudcastLookup^
"

of

xidel -s ^
-H "X-CSRFToken: pXahjuUXJCpVe6ggOlOAy9MwvDqVpK4IrSS5JWwvmPlHeYBiq0pjeLuN7OPfvvBB" ^
-H "Content-Type: application/json" ^
-H "Referer: https://www.mixcloud.com/EricVanKleef/clubbin-12-wildfm-30-mei-2020/" ^
-H "Cookie: __cfduid=d20d8c494e1196e16bc2400fdd9f95e871591047116; csrftoken=pXahjuUXJCpVe6ggOlOAy9MwvDqVpK4IrSS5JWwvmPlHeYBiq0pjeLuN7OPfvvBB; mx_t=16190190-b563-43f2-88db-044ed6791790; c=bpb0lwf36mr1o0fbicqxl6dei8a7803x" ^
-d "{{\"query\":\"{{cloudcastLookup(lookup:{{username:\\\"EricVanKleef\\\",slug:\\\"clubbin-12-wildfm-30-mei-2020\\\"}}){{name,owner{{displayName,url,username}},publishDate,audioLength,streamInfo{{hlsUrl,url}}}}}}\"}}" ^
https://www.mixcloud.com/graphql -e "$json//cloudcastLookup"
Reino17 commented 4 years ago

@Invictaz Zou je de volgende (Windows) one-liner willen proberen?

xidel -s --module=xivid.xqm --json-mode=deprecated --xquery "declare function local:bin-xor($a,$b){let $bin:=($a,$b) ! x:integer-to-base(.,2),$len:=max($bin ! string-length()),$val:=$bin ! concat(string-join((1 to $len - string-length()) ! 0),.) return x:integer(string-join(for $x in 1 to $len return if (substring($val[1],$x,1) eq substring($val[2],$x,1)) then 0 else 1),2)}; declare variable $key:=x:cps('IFYOUWANTTHEARTISTSTOGETPAIDDONOTDOWNLOADFROMMIXCLOUD'); let $json:=x:request({'headers':('X-CSRFToken: pXahjuUXJCpVe6ggOlOAy9MwvDqVpK4IrSS5JWwvmPlHeYBiq0pjeLuN7OPfvvBB','Content-Type: application/json','Referer: https://www.mixcloud.com/EricVanKleef/clubbin-12-wildfm-30-mei-2020/','Cookie: __cfduid=d20d8c494e1196e16bc2400fdd9f95e871591047116; csrftoken=pXahjuUXJCpVe6ggOlOAy9MwvDqVpK4IrSS5JWwvmPlHeYBiq0pjeLuN7OPfvvBB; mx_t=16190190-b563-43f2-88db-044ed6791790; c=bpb0lwf36mr1o0fbicqxl6dei8a7803x'),'post':'{\"query\":\"{cloudcastLookup(lookup:{username:\\\"EricVanKleef\\\",slug:\\\"clubbin-12-wildfm-30-mei-2020\\\"}){name,owner{displayName,url,username},publishDate,audioLength,streamInfo{hlsUrl,url}}}\"}','url':'https://www.mixcloud.com/graphql'})/json/data/cloudcastLookup,$url:=$json/streamInfo/(url,hlsUrl) ! string-join(x:cps(for $x at $i in x:cps(binary-to-string(base64Binary(.))) return local:bin-xor($x,$key[(($i - 1) mod count($key)) + 1]))) return $json/{'name':concat(owner/displayName,' - ',name),'date':format-date(dateTime(publishDate),'[D01]-[M01]-[Y]'),'duration':format-time(audioLength * duration('PT1S'),'[H01]:[m01]:[s01]'),'formats':[{'id':'pg-1','format':'m4a[aac]','url':$url[1]},xivid:m3u8-to-json($url[2])]}"

(haal --json-mode=deprecated weg als je xidel binary ouder is dan 01 feb 2020.)

Als het goed is krijg je dan een JSON met "gedecrypte" audio-urls als output.
Ik ben er vrij zeker van dat het decrypten en creëren van de uiteindelijke JSON goed werkt, maar ik weet niet zeker of de headers statisch zijn. Misschien werken ze wel alleen voor mij.

Invictaz commented 4 years ago

@Reino17 It works :+1:

Het selecteren van dergelijke groen gekleurde urls kan wellicht slimmer??? Ik doe nu rechtermuisknop in het commandline venster, markeren met shift ingedrukt en dan is het de hele regel selecteren, op enter duwen en in notepad plakken. E.e.a. eraf knippen en dan luisteren maar.

Overigens kwam ik ook vandaag deze tegen: https://github.com/Oros42/mixcloud-dl/ Na heel veel zoeken.

image

Invictaz commented 4 years ago

Overigens is de PD stream (de eerste)

image

En de tweede de HLS-0 best een vreemde codec ADTS

image

En de tweede de HLS-1 maakt geen verschil. Die pakt ook die codec. Ik zie trouwens dat die Sig elke keer hetzelfde is aan het einde per bestand

In elk geval super bedankt. Misschien dit issue afsplitsen naar Mixcloud en dan een nieuw issue voor Soundcloud.

Dit eerste stuk van de code is echt heel indrukwekkend

--xquery "declare function local:bin-xor($a,$b){let $bin:=($a,$b) ! x:integer-to-base(.,2),$len:=max($bin ! string-length()),$val:=$bin ! concat(string-join((1 to $len - string-length()) ! 0),.) return x:integer(string-join(for $x in 1 to $len return if (substring($val[1],$x,1) eq substring($val[2],$x,1)) then 0 else 1),2)}; declare variable $key:=x:cps


Hmm als ik een andere url probeer werkt het niet, en ik heb het precies volgens het format erin geplakt. Zal wel een andere CSRF token zijn ofzo

Invictaz commented 4 years ago

Het is mij eindelijk gelukt om met de oneliner aan de slag te gaan en zelf urls te extracten. Het is niet eenvoudig Je CSRFtoken is gekoppeld aan het Cookie, de UID moet custom zijn.

Ik zat eerst te klooien met de manifest.mpd maar daar heb je niks aan, die haalt alle audio op in aparte .m4s bestanden. (MPEG-DASH). Dus het is best knap dat je de directe m4a en de m3u8 gevonden hebt.

De velden die je moet aanpassen in de code om een andere stream te pakken zijn:

X-CSRFToken: BLABLA Referer: https://www.mixcloud.com/BLABLABLA/ __cfduid=BLABLABLA csrftoken=BLABLABALA (deze is hetzelfde als hierboven) mx_t=BLABLABLA slug:\\"BLABLABLA\\

Als je 1 van deze vergeet aan te passen dan krijg je een 403 error in de commandline. Alles moet dus kloppen.

Ik heb deze eruit gehaald met Chrome -> Inspect element -> Zoek op graphql in de Network tab -> Copy request as cmd en dat resultaat in Notepad plakken. Variabelen eruit halen die je nodig hebt en in die oneliner plakken en dat in CMD zetten en uitvoeren. Dit zal overigens wel de absolute noob manier zijn, maarja it works... Mocht je tips hebben hoe dat slimmer kan dan hoor ik het graag.

De Sig is dus per bestand verschillend maar niet per sessie.

Nu hopen dat e.e.a. in Xivid verwerkt gaat worden zodat je niet steeds al die waarden handmatig moet overnemen. En je gewoon Xivid.sh of Xivid.bat MIXCLOUDURL kan doen en dat hij dan de hls-0 weergeeft. Dat is de volgende stap denk ik.

image

Reino17 commented 4 years ago

Het selecteren van dergelijke groen gekleurde urls kan wellicht slimmer? [...]

Dat is een nadeel van cmd. Bij het kopiëren van tekst krijg je alle afgeknotte regels precies zoals je ze ziet.
Je kunt xidel's output naar clip pipen, xidel [...] | clip, waarmee de output naar het klembord wordt gekopiëerd. Uiteraard kun je dit ook met de output van xivid doen.

Overigens kwam ik ook vandaag deze tegen: https://github.com/Oros42/mixcloud-dl/

Bedankt. Ik had natuurlijk kunnen weten dat met het bezoeken van de programma-url het "csrftoken" wordt aangemaakt.
Die repo is trouwens alweer achterhaald, omdat de audio-urls nu versleuteld zijn. En trouwens,... JSON ontleden met grep en awk... dat kan echt niet. Maar dat is een andere discussie.

Misschien dit issue afsplitsen naar Mixcloud en dan een nieuw issue voor Soundcloud.

Werkt die website weer heel anders dan?

Dit eerste stuk van de code [local:bin-xor()] is echt heel indrukwekkend

Bedankt. Zie https://github.com/benibela/xidel/issues/54. ;)

Ik zat eerst te klooien met de manifest.mpd maar daar heb je niks aan, die haalt alle audio op in aparte .m4s bestanden.

Met ffmpeg kun je die gewoon openen, maar ik heb er voor gekozen om voor xivid het bij de HLS streams te laten.

Dus het is best knap dat je de directe m4a en de m3u8 gevonden hebt.

Met de "POST query" kun je precies aangeven wat je wilt hebben. I.p.v. streamInfo{hlsUrl,url} krijg je met streamInfo{dashUrl} bijv. alleen de MPEG-DASH url.

Dit vraagt youtube-dl allemaal op. Ik heb daar een selectie uit gemaakt.

X-CSRFToken: BLABLA
[...]
slug:\"BLABLABLA\

Als je 1 van deze vergeet aan te passen dan krijg je een 403 error in de commandline. Alles moet dus kloppen.

Voor zover ik heb ondervonden zijn de volgende headers het minimale noodzakelijke:

"headers":(
  "Content-Type: application/json",
  "Referer: <url>",
  "X-CSRFToken: <csrftoken>",
  "Cookie: csrftoken=<csrftoken>"
)

Ik vind het vreemd dat ik in youtube-dl's mixcloud.py daar niks over heb kunnen vinden.

Nu hopen dat e.e.a. in Xivid verwerkt gaat worden [...] en je gewoon Xivid.sh of Xivid.bat MIXCLOUDURL kan doen

Ik heb een werkende extractor, dus ja, dat kan dan. :)
Ik denk dat ik 'm vandaag nog wel zal doorvoeren.

Invictaz commented 4 years ago
  1. Mixcloud is een totaal andere site dan Soundcloud
  2. Die link naar Benito's site gaat heel heel ver boven mijn pet. Ik weet wat een string en wat een integer is en dat base64 is maar de rest????
  3. Als ik het naar de clip pipe dan slaat hij alles op, dus niet alleen de HLS-0 maar ook de rest incl titel
  4. Manifest.mpd zijn voor televisiediensten vaak voorzien van een SAMPLE-AES of soortgelijk. Ik ken ook maar weinig spelers die het zo kunnen afspelen (misschien zelfs wel geen).
  5. Ik weet nog niet goed hoe je POST query's naar je hand kunt zetten, want dan zou ik diverse sites kunnen aanpassen. Ik heb het geprobeerd met 'resource override' in Chrome maar kom daar nog niet uit.
  6. Dat klopt niet want ik heb ook die uid noodzakelijk gehad anders kreeg ik alsnog een 403 error.
  7. Die Mixcloud.py ziet er sowieso heel anders uit met md5 en playlists enzovoorts.
Reino17 commented 4 years ago

Die link naar Benito's site gaat heel heel ver boven mijn pet. Ik weet wat een string en wat een integer is en dat base64 is maar de rest????

Voor het ontsleutelen van de Mixcloud audio-urls heb ik een "bitwise exclusive or"-functie nodig, maar xidel heeft die vooralsnog niet, dus moet ik 'm zelf maken.
Zie verder https://nl.wikipedia.org/wiki/Exclusieve_disjunctie en mijn notities.

Als ik het naar de clip pipe dan slaat hij alles op

Tuurlijk. Met clip koppiepeest je gehele output. Als je alleen de urls wilt hebben, dan zul je de query moeten veranderen.

Dat klopt niet want ik heb ook die uid noodzakelijk gehad anders kreeg ik alsnog een 403 error.

Bij mij werkt ie zonder uid.
Ik heb net de Mixcloud extractor doorgevoerd. Zou je kunnen testen of ie werkt?

Invictaz commented 4 years ago

Maar die exclusieve disjunctie (lijkt me trouwens niet helemaal netjes vertaald op Wikipedia) kan toch gewoon met if 1 dan dat,then dit else dat. Waarom moet dat met een XOR? Het is 1-0 wel goed 1-1 niet goed 0-0 niet goed 0-1 wel goed

Helaas werkt hij nog niet

image

Reino17 commented 4 years ago

Net als +, -, x en : is XOR gewoon de notatie, volgens mij.
Dat is ook precies wat ik doe: if (substring($v1,$x,1) eq substring($v2,$x,1)) then 0 else 1, oftewel "als \<a> = \<b> dan 0, anders 1".

Och ja, programma-urls met een / op het eind. Dat ging niet helemaal goed. Fixed.

Trouwens, zou je alsjeblieft codeblocks willen gebruiken i.p.v. plaatjes?! Dan hoef jij niet te "lakken" en hoef ik de programma-url niet over te typen.

Invictaz commented 4 years ago

Gek eigenlijk he, dat een trailing / zoveel extra code nodig heeft. Plaatjes is vrij simpel. Alt + printscreen en dan kopieren naar MS Paint. Komt omdat die kleurtjes voor mij makkelijker leest. Ben wel van plan om toch codeblokken te proberen ja.

Mixcloud werkt nu, dus ik sluit dit issue en maak er 1 aan voor Soundcloud, om het overzichtelijk te houden. Bedankt nogmaals.