Reino17 / xivid

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

ABHD.nl oude video's support #13

Closed Invictaz closed 3 years ago

Invictaz commented 3 years ago

De nieuwere video's van ABHD.nl (onderdeel van Autoblog / Autojunk / Apparata / Groen7) zijn allemaal Youtube video's.

De oudere video's zijn nog door hen zelf gehost. Bijvoorbeeld:

https://www.abhd.nl/video/brabus-rocket/

Kan je daar een extractor voor maken of een xidel commando?

Invictaz commented 3 years ago

Van begin 2007 tot zeker ver in 2015 waren er video's op het zelf gehoste platform (dit beslaat dus meer dan 9 jaar aan video)

Dit is (als het goed is) de eerste video die op Youtube gepost is. Dus alles van vóór deze datum is zelf gehost en Xivid heeft er nog geen ondersteuning voor.

https://www.abhd.nl/video/audi-a1-occasion/

Invictaz commented 3 years ago

Dit is als het goed is de laatste die op het oudere platform gehost is:

https://www.abhd.nl/video/alle-generaties-porsche-911-rs-deel-2/

Invictaz commented 3 years ago

Fun fact: ik ben benieuwd hoeveel gigabyte het is als ik het op een of andere manier in een batch zou indexeren. Elk filmpje is een bepaald aantal megabytes op hoogste resolutie. Ben benieuwd hoeveel gigabyte het is totaal (zonder de Youtube video's). Een hoop van wat ze op het oude platform hebben staan is op Youtube gezet, echter volgens mij niet alles.

Reino17 commented 3 years ago

Ik kwam er net achter dat BatchGemist er nog ondersteuning voor had. Helemaal vergeten. :D

Dit moet wel lukken om er, samen met xivid:autojunk(), één xivid:autoblog() functie van te maken, denk ik.

Fun fact [...]

Ok, ik hap toe. Dat betekent dat je https://www.abhd.nl/video/alle-generaties-porsche-911-rs-deel-2/ en de websites van alle video's daarvóór moet scrapen. Dat is nogal wat!

Ik doe er één voor, just for fun.

De JSON-array, ná clipData.assets =, die je wilt hebben:

$ xidel -s https://www.abhd.nl/video/alle-generaties-porsche-911-rs-deel-2/ -e '
  //script/extract(.,"clipData.assets = (.+\]);",1,"s")[.]
'
[{
      id: 1,
      mediatype: 'MP4_HD', // HD if higher then 720p, MP4_MAIN otherwise.
      src: 'https://static.autojunk.nl/flv/2015/1109/084402_hq.mp4',
      width: '1280',
      height: '720',
      bandwidth: '2000'
    }
    ,{
      id: 2,
      mediatype: 'MP4_MAIN',
      src: 'https://static.autojunk.nl/flv/2015/1109/084402_720p.mp4',
      width: '640',
      height: '360',
      bandwidth: '1200',
    }
    ]

Verwijder Javascript commentaar:

$ xidel -s <url> -e '
  replace(//script/extract(.,"clipData.assets = (.+\]);",1,"s")[.]," //.+","")
'
[{
      id: 1,
      mediatype: 'MP4_HD',
      src: 'https://static.autojunk.nl/flv/2015/1109/084402_hq.mp4',
      width: '1280',
      height: '720',
      bandwidth: '2000'
    }
    ,{
      id: 2,
      mediatype: 'MP4_MAIN',
      src: 'https://static.autojunk.nl/flv/2015/1109/084402_720p.mp4',
      width: '640',
      height: '360',
      bandwidth: '1200',
    }
    ]

Ontleed als JSON:

$ xidel -s <url> -e '
  json(
    replace(//script/extract(.,"clipData.assets = (.+\]);",1,"s")[.]," //.+","")
  )
'
[
  {
    "id": 1,
    "mediatype": "MP4_HD",
    "src": "https://static.autojunk.nl/flv/2015/1109/084402_hq.mp4",
    "width": "1280",
    "height": "720",
    "bandwidth": "2000"
  },
  {
    "id": 2,
    "mediatype": "MP4_MAIN",
    "src": "https://static.autojunk.nl/flv/2015/1109/084402_720p.mp4",
    "width": "640",
    "height": "360",
    "bandwidth": "1200"
  }
]

Selecteer het 1e JSON-object (er van uit gaande dat deze altijd de hoogste resolutie video heeft):

$ xidel -s <url> -e '
  json(
    replace(//script/extract(.,"clipData.assets = (.+\]);",1,"s")[.]," //.+","")
  )(1)
'
{
  "id": 1,
  "mediatype": "MP4_HD",
  "src": "https://static.autojunk.nl/flv/2015/1109/084402_hq.mp4",
  "width": "1280",
  "height": "720",
  "bandwidth": "2000"
}

Selecteer het src-attribuut voor de video-url, open de "HEAD" ervan (zodat je niet de hele video eerst moet downloaden) en laat de headers zien:

$ xidel -s <url> -f '
  {
    "method":"HEAD",
    "url":json(
      replace(//script/extract(.,"clipData.assets = (.+\]);",1,"s")[.]," //.+","")
    )(1)/src
  }
' -e '$headers'

#of

$ xidel -s <url> -e '
  json(
    replace(//script/extract(.,"clipData.assets = (.+\]);",1,"s")[.]," //.+","")
  )(1)/x:request({"method":"HEAD","url":src})/headers
'
HTTP/1.1 200 OK
Date: Wed, 18 Nov 2020 00:18:52 GMT
Content-Type: video/mp4
Content-Length: 223775743
Connection: keep-alive
[...]

De headers lijst in xidel is een array. Selecteer het 4e element; de bestandsgrootte (er van uit gaande dat dit altijd het 4e element is) en pak alleen de cijfers:

$ xidel -s <url> -e '
  json(
    replace(//script/extract(.,"clipData.assets = (.+\]);",1,"s")[.]," //.+","")
  )(1)/x:request({"method":"HEAD","url":src})/substring-after(
    headers[4],"Content-Length: "
  )
'
223775743

$ xidel -s <url> -e '
  json(
    replace(//script/extract(.,"clipData.assets = (.+\]);",1,"s")[.]," //.+","")
  )(1)/x:request({"method":"HEAD","url":src})/substring-after(
    headers[4],"Content-Length: "
  ) ! (
    .||" bytes",
    (. div 1024)||" kilobytes",
    (. div math:pow(1024,2))||" megabytes"
  )
'
223775743 bytes
218530.9990234375 kilobytes
213.40917873382568 megabytes

De rest is voor jou.

Invictaz commented 3 years ago

Met het handje doen dat is bijna onmogelijk.

Hoe voer ik (in Windows) bovendien zoiets in?

$ xidel -s https://www.abhd.nl/video/alle-generaties-porsche-911-rs-deel-2/ -e ' //script/extract(.,"clipData.assets = (.+]);",1,"s")[.] ' [{ id: 1, mediatype: 'MP4_HD', // HD if higher then 720p, MP4_MAIN otherwise. src: 'https://static.autojunk.nl/flv/2015/1109/084402_hq.mp4', width: '1280', height: '720', bandwidth: '2000' } ,{ id: 2, mediatype: 'MP4_MAIN', src: 'https://static.autojunk.nl/flv/2015/1109/084402_720p.mp4', width: '640', height: '360', bandwidth: '1200', } ]

Knip en plak ik dan gewoon het eerste gedeelte

xidel -s https://www.abhd.nl/video/alle-generaties-porsche-911-rs-deel-2/ -e ' //script/extract(.,"clipData.assets = (.+]);",1,"s")[.] '

in Windows 7 en spuugt hij de rest uit? Of hoe werkt dat? Je had het een keer uitgelegd maar ik kan het nergens meer vinden. Die issues zijn offline :(

Jammer dat dit dan weer geen opendir is: https://static.autojunk.nl/flv/2015/

Reino17 commented 3 years ago

Hoe voer ik (in Windows) bovendien zoiets in?

Ik heb het al eerder verteld, maar je zult de aanhalingstekens om moeten wisselen. Wat ik ook zeker kan aanraden is https://github.com/Reino17/xivid/blob/master/xivid_notes.txt#L870-L1102!

Als single-line-commando wordt dat dan:

xidel -s https://www.abhd.nl/video/alle-generaties-porsche-911-rs-deel-2/ -e "json(replace(//script/extract(.,'clipData.assets = (.+\]);',1,'s')[.],' //.+',''))(1)/x:request({'method':'HEAD','url':src})/substring-after(headers[4],'Content-Length: ')"

Die issues zijn offline :(

Voor het geval je het niet weet; ga naar https://github.com/Reino17/xivid/issues, haal in het filter is:open weg en druk op enter. Dan krijg je alle issues te zien.

Invictaz commented 3 years ago

Ja dat heb ik geprobeerd maar ik kon het niet meer vinden. Wie weet heb je het via mail uitgelegd.

Reino17 commented 3 years ago

Dit moet wel lukken om er, samen met xivid:autojunk(), één xivid:autoblog() functie van te maken, denk ik.

Eén xivid:autoblog() functie is het niet geworden, maar wel 3 aparte, omdat de websites toch te verschillend zijn. Zie:

https://github.com/Reino17/xivid/commit/267d53a69ad286b6fb2ffb71489c184574cc6051
https://github.com/Reino17/xivid/commit/170f50ec6ac09e9709934272345d1813fbf61d01
https://github.com/Reino17/xivid/commit/c78af598ccb68a16ad1b7fae5eed830f9bb758e4