Reino17 / BatchGemist

BatchGemist is een batchscript om video's van verscheidene websites te downloaden, of de videolink ervan te achterhalen.
GNU General Public License v3.0
3 stars 1 forks source link

RTL-XL other link support request... #4

Closed MatrixView closed 6 years ago

MatrixView commented 6 years ago

Hoi Reino,

Kun je links zoals de volgende ondersteunen? http://www.rtlxl.nl/#!/_rtl-late-night-301978/206a0db0-9bc8-3a32-bda3-e9b3a9d4d377

Deze komen van de site tvblik.nl (tv gids site met rss feeds) Bijv. http://tvblik.nl/rss/programma/rtl-late-night

xidel -s "https://tvblik.nl/rtl-late-night/aflevering-11-7" -e "<a class='custom-play external'>{@href}</a>"

Let op het uitroepteken in de link! i.v.m. delayedexpansion...

Alvast bedankt! --MV

Reino17 commented 6 years ago

Er zijn natuurlijk 2 mogelijkheden. Ik voeg ondersteuning voor tvblik.nl toe, net zoals uitzendinggemist.nl, of ik verander de regex om deze (oude!) RTL programma-urls te ondersteunen. Voorkeur?

xidel -s "https://tvblik.nl/rtl-late-night/aflevering-13-7" -e "uuid:=extract(//a[@id='play']
/@href,'.+/(.+)',1)"
uuid := 91472da6-3a28-a466-53f5-3b95e9ef53b7

met een GOTO rtlXL moet lukken.

MatrixView commented 6 years ago

tvblik.nl is tricky... pagina's die verwijzen naar NPO werken anders, evenals KIJK... voed bovenstaande xidel maar 's met "https://tvblik.nl/2doc/de-hoeder"... geen uuid.

TVblik's RTL-XL notatie blijkt daarnaast erg ouderwets (heb ik me laten vertellen) :-)

Heeft xidel een functie/optie die net als bij een browser redirects volgt?... net zoals bijv. "curl -L", dan ben je namelijk meteen van een hoop gezeur bij oude links af...

Dit is trouwens een van de redenen dat ik soms curl moet gebruiken in mijn scriptjes ipv xidel. :-)

Reino17 commented 6 years ago

Ah! Ik had ook niet verder gekeken, dus ik had niet in de gaten dat het eigenlijk een soort zelfde website is als uitzendinggemist.nl, met video's van alle 3 de grote tv zenders.

Je hebt dus RTL:

<a class="custom-play external popper" id="play" data-width="840" data-height="590" href="htt
p://www.rtlxl.nl/#!/_rtl-late-night-301978/91472da6-3a28-a466-53f5-3b95e9ef53b7" rel=nofollow
 target=_blank>

NPO:

<div class="custom-play" id="play" data-player-id=KN_1696401><span>2Doc - De hoeder</span></d
iv>

en KIJK:

<div id="other-player"><a href="http://www.kijk.nl/sbs6/hartvannederland/videos/LXu1cJgOY9G/h
art-van-nederland-vroeg-30-januari-2018" rel=nofollow target=_blank>Klik hier om deze uitzend
ing bij kijk.nl te bekijken</a></div>

met de nodige informatie, zoals je kunt zien, in verschillende tags. Wordt wel lastig zo.

Curl? Godslastering! Met uitzendinggemist.nl heb ik dat al gedaan met Xidel.

MatrixView commented 6 years ago

Curl = Blasphemy? hahaha... Je hebt Xidel in je ziel. Maar eh, heeft Xidel zo'n follow redirects functie? Dat zou voor mij erg interessant zijn.

Enne, doe geen moeite voor die TVblik.nl want ik weet echt niet of iemand anders dan ik dat überhaupt zou willen gebruiken... Ik heb TVblik puur voor de non-NPO RSS feeds (dus enkele shows van de commerciële zenders)

--MV

Reino17 commented 6 years ago

heeft Xidel zo'n follow redirects functie?

In m'n vorige bericht heb ik je al een link gestuurd, maar ik kan het je ook met een andere voorbeeld-url laten zien:

xidel -s -e "x:request({'data':'https://download.omroep.nl/nos/content/video/2017/12/09/21121
6/web03.mp4','method':'HEAD'})"
{
  "url": "https://content1a.omroep.nl/urishieldv2/l27m562fee3f568db073005a763829000000.48b940
2ea775b0beb9b0480cd75c4038/nos/content/video/2017/12/09/211216/web03.mp4",
  "type": "video/mp4",
  "headers": [
    "HTTP/1.1 200 OK",
    "Server: nginx/1.13.8",
    "Date: Sat, 03 Feb 2018 22:31:05 GMT",
    "Content-Type: video/mp4",
    "Content-Length: 11594360",
    "Last-Modified: Sat, 09 Dec 2017 17:51:20 GMT",
    "Connection: keep-alive",
    "ETag: \"5a2c2298-b0ea78\"",
    "X-Instance-Name: dl1afp.omroep.nl",
    "X-Clacks-Overhead: GNU Terry Pratchett",
    "Accept-Ranges: bytes",
    ""
  ],
  "raw": "",
  "doc": null
}

Het attribuut "url" is de redirect-url. Met --method=HEAD "<url>" -e "$headers" zie je dat dus niet, maar...

xidel -s --method=HEAD "https://download.omroep.nl/nos/content/video/2017/12/09/211216/web03.
mp4" -e "$url"
https://content1b.omroep.nl/urishieldv2/l27m663b993a6626d3bc005a763858000000.8fa9b35132ffff5d
e566fd37f5e9e131/nos/content/video/2017/12/09/211216/web03.mp4

...zo dus wel EN Xidel doet dat dus automatisch!

Met error-handling wordt het wat anders:

xidel -s --method=HEAD --error-handling=xxx=accept "https://download.omroep.nl/nos/content/vi
deo/2017/12/09/211216/web03.mp4" -e "$headers"
HTTP/1.1 302 Found
Date: Sat, 03 Feb 2018 22:33:54 GMT
Server: Apache/2.4.29 (Unix) PHP/5.6.32
X-Powered-By: PHP/5.6.32
Location: https://content1a.omroep.nl/urishieldv2/l27m205c3277720f76e4005a7638d2000000.f57f89
eef72ec8828913057464cfd515/nos/content/video/2017/12/09/211216/web03.mp4
Cache-Control: "max-age=60"
Expires: Sat, 03 Feb 2018 22:34:54 GMT
X-WorkerInstancename: dlr2d
Content-Type: text/html; charset=UTF-8
X-ProxyInstancename: dlr1b
Set-Cookie: balancer://dlr2cluster=balancer.dlr2dfp; path=/;
Connection: close

xidel -s --method=HEAD --error-handling=xxx=accept "https://download.omroep.nl/nos/content/vi
deo/2017/12/09/211216/web03.mp4" -e "substring-after($headers[starts-with(.,'Location')],'Loc
ation: ')"
https://content1b.omroep.nl/urishieldv2/l27m12e5e2e2626cef9b005a763de4000000.082a77ed2c83f323
86c0c8bdd655c4d8/nos/content/video/2017/12/09/211216/web03.mp4

MAAR dit heeft niks met jou 'issue' te maken.

doe geen moeite voor die TVblik.nl

Ik had verkeerd naar de tags gekeken. Het kan uiteindelijk wel. Zou jij deze diff op de minified-versie willen toepassen en uitproberen?

diff --git a/batchgemist.min.bat b/batchgemist.min.bat
index 4431357..de93a44 100755
--- a/batchgemist.min.bat
+++ b/batchgemist.min.bat
@@ -232,6 +232,8 @@ IF NOT "%url: =%"=="%url%" (
 ) ELSE IF NOT "%url:uitzendinggemist.net/aflevering=%"=="%url%" (
    FOR /F "delims=" %%A IN ('^"%xidel% "%url%" -e "url:=x:request({'data':let $a:=(//iframe[@class]/@src,extract(//@onclick,'(http.+?)''',1)) return replace($a,'.+(?:/|=)(.+)',if (contains($a,'npo')) then 'http://www.npo.nl/$1' else if (contains($a,'rtl')) then 'http://www.rtl.nl/video/$1' else 'http://www.kijk.nl/video/$1'),'user-agent':'%user-agent%','method':'HEAD'})/url" --output-format^=cmd^"') DO %%A
    GOTO Process
+) ELSE IF NOT "%url:tvblik.nl=%"=="%url%" (
+   FOR /F "delims=" %%A IN ('^"%xidel% "%url%" -e "let $a:=extract(//div[@id='embed-player']/(@data-episode,.//@href),'(\w+)\.nl.+(?:/|video=)([\w-]+)',(1,2)) return videos:=[{'1':{'prid':$a[2],'goto':$a[1]}}]" --output-format^=cmd^"') DO %%A
 ) ELSE IF NOT "%url:2doc.nl=%"=="%url%" (
    FOR /F "delims=" %%A IN ('^"%xidel% "%url%" -e "prid:=(//@data-media-id)[1],date:=replace((//@datetime)[1],'(\d+)-(\d+)-(\d+)','$3$2$1')" --output-format^=cmd^"') DO %%A
    GOTO NPO
@@ -384,7 +386,7 @@ IF DEFINED formats (
 REM ================================================================================================

 :rtlXL
-FOR /F "delims=" %%A IN ('^"%xidel% "http://www.rtl.nl/system/s4m/vfd/version=2/uuid=%uuid%/fmt=adaptive/" --xquery "$json[not(meta/nr_of_videos_total=0)]/(name:=replace(concat(.//station,': ',abstracts/name,' - ',if (.//classname='uitzending') then episodes/name else .//title,replace(.//original_date * duration('PT1S') + date('1970-01-01'),'(\d+)-(\d+)-(\d+)',' ($3$2$1)')),'[&quot;&apos;]',''''''),(material)()/(duration:=format-time(time(duration) + duration('PT0.5S'),'[H01]:[m01]:[s01]'),t:=hours-from-time($duration)*3600+minutes-from-time($duration)*60+seconds-from-time($duration),if ((.//ddr_timeframes)()[model='AVOD']/stop) then let $a:=(.//ddr_timeframes)()[model='AVOD']/stop * duration('PT1S') + dateTime('1970-01-01T00:00:00'),$b:=$a - current-dateTime() return expire:=concat(replace($a,'(\d+)-(\d+)-(\d+)T(.+)','$3-$2-$1 $4'),' (nog ',days-from-duration($b) ! (if (.=0) then () else if (.=1) then .||' dag en ' else .||' dagen en '),hours-from-duration($b) ! (if (.=0) then () else .||'u'),minutes-from-duration($b) ! (if (.=0) then () else .||'m'),round(seconds-from-duration($b)),'s)') else ()),formats:=x:request({'data':json('https://tm-videourlfeed.rtl.nl/api/url/%uuid%?device=pc&amp;format=hls')/url,'error-handling':'4xx=accept'})[contains(headers[1],'200')]/[{'format':'hls-0','extension':'m3u8','url':url},for $x at $i in tail(tokenize(raw,'#EXT-X-STREAM-INF:')) order by extract($x,'BANDWIDTH=(\d+)',1) count $i return {'format':'hls-'||$i,'extension':'m3u8','resolution':extract($x,'RESOLUTION=([\dx]+)',1),'vbitrate':extract($x,'video=(\d+)\d{3}',1) ! (if (.) then concat('v:',.,'k') else ''),'abitrate':replace($x,'.+audio.+?(\d+)\d{3}.+','a:$1k','s'),'url':resolve-uri('.',url)||extract($x,'(.+m3u8)',1),'ff_param':'-seekable 0'}])" --output-encoding^=oem --output-format^=cmd^"') DO %%A
+FOR /F "delims=" %%A IN ('^"%xidel% "http://www.rtl.nl/system/s4m/vfd/version=2/uuid=%prid%/fmt=adaptive/" --xquery "$json[not(meta/nr_of_videos_total=0)]/(name:=replace(concat(.//station,': ',abstracts/name,' - ',if (.//classname='uitzending') then episodes/name else .//title,replace(.//original_date * duration('PT1S') + date('1970-01-01'),'(\d+)-(\d+)-(\d+)',' ($3$2$1)')),'[&quot;&apos;]',''''''),(material)()/(duration:=format-time(time(duration) + duration('PT0.5S'),'[H01]:[m01]:[s01]'),t:=hours-from-time($duration)*3600+minutes-from-time($duration)*60+seconds-from-time($duration),if ((.//ddr_timeframes)()[model='AVOD']/stop) then let $a:=(.//ddr_timeframes)()[model='AVOD']/stop * duration('PT1S') + dateTime('1970-01-01T00:00:00'),$b:=$a - current-dateTime() return expire:=concat(replace($a,'(\d+)-(\d+)-(\d+)T(.+)','$3-$2-$1 $4'),' (nog ',days-from-duration($b) ! (if (.=0) then () else if (.=1) then .||' dag en ' else .||' dagen en '),hours-from-duration($b) ! (if (.=0) then () else .||'u'),minutes-from-duration($b) ! (if (.=0) then () else .||'m'),round(seconds-from-duration($b)),'s)') else ()),formats:=x:request({'data':json('https://tm-videourlfeed.rtl.nl/api/url/%prid%?device=pc&amp;format=hls')/url,'error-handling':'4xx=accept'})[contains(headers[1],'200')]/[{'format':'hls-0','extension':'m3u8','url':url},for $x at $i in tail(tokenize(raw,'#EXT-X-STREAM-INF:')) order by extract($x,'BANDWIDTH=(\d+)',1) count $i return {'format':'hls-'||$i,'extension':'m3u8','resolution':extract($x,'RESOLUTION=([\dx]+)',1),'vbitrate':extract($x,'video=(\d+)\d{3}',1) ! (if (.) then concat('v:',.,'k') else ''),'abitrate':replace($x,'.+audio.+?(\d+)\d{3}.+','a:$1k','s'),'url':resolve-uri('.',url)||extract($x,'(.+m3u8)',1),'ff_param':'-seekable 0'}])" --output-encoding^=oem --output-format^=cmd^"') DO %%A

 IF DEFINED formats (
    GOTO Formats
MatrixView commented 6 years ago

Thx Reino! De diff/patch werkt goed!

En bedankt ook voor de uitleg van --method=HEAD... Heb ik echt nooit bij stilgestaan. Als ik via een pagina naar z'n redirect wil gaan om daar iets te extracten dan zou ik met de volgende code uit de voeten kunnen?

xidel -s --method=HEAD "http://initital-page" -f "$url" -e "$raw"

Dat zou dan hetzelfde doen als Curl -L ? Het lijkt tenminste te werken als ik het zo probeer! --MV

Reino17 commented 6 years ago

Thx Reino! De diff/patch werkt goed!

Mooi. Ik zal 'm doorvoeren.

xidel -s --method=HEAD "http://initital-page" -f "$url" -e "$raw"

De redirects die ik tot nu toe ben tegen gekomen betrof altijd video-urls, zoals je in het voorbeeld hier boven ook hebt kunnen zien. Redirects met websites ben ik nog niet tegengekomen, maar dat zal hetzelfde werken, lijkt mij. xidel -s "http://initital-page" -e "$raw" zou volgens mij dus voldoende moeten zijn, omdat Xidel automatisch redirects volgt! Als je iets wilt extracten van de 'geredirecte' website, dan moet je --method=HEAD ook verwijderen, want anders laadt ie de website niet. --method=HEAD is alleen handig voor video-urls. Zonder wordt de hele video eerst gedownload voordat je de redirect-url krijgt te zien.

Invictaz commented 6 years ago

Interessante patch dat die uitzendingen van tvblik ook kan pakken!