Skip to content

Commit 75cdf81

Browse files
committed
Update NOS extractor
- Extractors samengevoegd en queries gerepareerd en compleet vernieuwd. - Aparte NOS subroutine gemaakt, omdat $videos met informatie van alleen al 6 dynamische video's ver boven 8192 tekens uit komt. $videos bevat nu alleen nog maar de url van een losse video (uit een artikel) met een GOTO naar :NOS. - Ondersteuning voor losse dynamische/adaptive video's toegevoegd.
1 parent 2276c13 commit 75cdf81

File tree

3 files changed

+564
-406
lines changed

3 files changed

+564
-406
lines changed

batchgemist.bat

+203-133
Original file line numberDiff line numberDiff line change
@@ -332,140 +332,23 @@ IF NOT "%url: =%"=="%url%" (
332332
) ELSE IF NOT "%url:willemwever.kro-ncrv.nl=%"=="%url%" (
333333
FOR /F "delims=" %%A IN ('^"%xidel% "%url%" -e "prid:=//@data-video-id" --output-format^=cmd^"') DO %%A
334334
GOTO NPO
335-
) ELSE IF NOT "%url:nos.nl/livestream=%"=="%url%" (
336-
FOR /F "delims=" %%A IN ('^"%xidel% "%url%"
337-
--xquery ^"name:^=//h1^|^|replace^(
338-
'%date%'^,
339-
'.+?^(\d+^)-^(\d+^)-^(\d+^)'^,
340-
': Livestream ^($1$2$3^)'
341-
^)^,
342-
let $a:^=//video/x:request^(
343-
{
344-
'post':serialize-json^(
345-
{
346-
'stream':string^(@data-stream^)
347-
}
348-
^)^,
349-
'url':@data-path
350-
}
351-
^)/json/json^(
352-
substring-before^(
353-
url^,
354-
'p^&amp^;callback'
355-
^)
356-
^) return
357-
formats:^=[
358-
{
359-
'format':'hls-0'^,
360-
'extension':'m3u8'^,
361-
'resolution':'manifest'^,
362-
'url':$a
363-
}^,
364-
for $x at $i in tail^(
365-
tokenize^(
366-
extract^(
367-
unparsed-text^($a^)^,
368-
'^(#EXT-X-STREAM-INF.+m3u8$^)'^,
369-
1^,'ms'
370-
^)^,
371-
'#EXT-X-STREAM-INF:'
372-
^)
373-
^) order by extract^(
374-
$x^,
375-
'BANDWIDTH^=^(\d+^)'^,
376-
1
377-
^) count $i return {
378-
'format':'hls-'^|^|$i^,
379-
'extension':'m3u8'^,
380-
'resolution':extract^(
381-
$x^,
382-
'RESOLUTION^=^([\dx]+^)'^,
383-
1
384-
^) ! ^(
385-
if ^(.^) then
386-
.
387-
else
388-
'audiospoor'
389-
^)^,
390-
'vbitrate':extract^(
391-
$x^,
392-
'video^=^(\d+^)\d{3}'^,
393-
1
394-
^) ! ^(
395-
if ^(.^) then
396-
concat^(
397-
'v:'^,
398-
.^,
399-
'k'
400-
^)
401-
else
402-
''
403-
^)^,
404-
'abitrate':replace^(
405-
$x^,
406-
'.+audio.+?^(\d+^)\d{3}.+'^,
407-
'a:$1k'^,
408-
's'
409-
^)^,
410-
'url':resolve-uri^(
411-
'.'^,
412-
$a
413-
^)^|^|extract^(
414-
$x^,
415-
'^(.+m3u8^)'^,
416-
1
417-
^)
418-
}
419-
]^" --output-encoding^=oem --output-format^=cmd^"') DO %%A
420335
) ELSE IF NOT "%url:nos.nl=%"=="%url%" (
421-
FOR /F "delims=" %%A IN ('^"%xidel% "%url%"
422-
--xquery ^"videos:^=[
423-
^(
424-
if ^(//div[@class^='video-play']^) then
425-
//div[@class^='video-play']/a/doc^(@href^)
426-
else
427-
.
428-
^)/{
429-
position^(^):{
430-
'name':concat^(
431-
'NOS: '^,
432-
replace^(
433-
//h1^,
434-
'[^&quot^;^&apos^;]'^,
435-
''''''
436-
^)^,
437-
replace^(
438-
//@datetime^,
439-
'^(\d+^)-^(\d+^)-^(\d+^).+'^,
440-
' ^($3$2$1^)'
441-
^)
442-
^)^,
443-
'formats':for $x at $i in //source order by extract^(
444-
$x/@data-label^,
445-
'^(\d+^)p'^,
446-
1
447-
^) count $i
448-
return {
449-
'format':'mp4-'^|^|$i^,
450-
'extension':'mp4'^,
451-
'url':if ^(
452-
contains^(
453-
$x/@src^,
454-
'ipv4-api'
455-
^)
456-
^) then
457-
x:request^(
458-
{
459-
'data':$x/@src^,
460-
'method':'HEAD'
461-
}
462-
^)/url
463-
else
464-
$x/@src
465-
}
466-
}
467-
}
468-
]^" --output-encoding^=oem --output-format^=cmd^"') DO %%A
336+
IF NOT "%url:artikel=%"=="%url%" (
337+
FOR /F "delims=" %%A IN ('^"%xidel% "%url%"
338+
--xquery ^"videos:^=[
339+
//div[@class^='block_video block_largecenter']/{
340+
position^(^):{
341+
'name':replace^(
342+
.//div[@class^='caption_content']/text^(^)^,
343+
'[^&quot^;^&apos^;]'^,
344+
''''''
345+
^)^,
346+
'url':resolve-uri^(.//@href^)^,
347+
'goto':'NOS'
348+
}
349+
}
350+
]^" --output-encoding^=oem --output-format^=cmd^"') DO %%A
351+
) ELSE GOTO NOS
469352
) ELSE IF NOT "%url:eenvandaag.avrotros.nl=%"=="%url%" (
470353
FOR /F "delims=" %%A IN ('^"%xidel% "%url%" -e "prid:=json(//@data-at-player)/video_id" --output-format^=cmd^"') DO %%A
471354
GOTO NPO
@@ -3522,6 +3405,193 @@ IF DEFINED formats (
35223405

35233406
REM ================================================================================================
35243407

3408+
:NOS
3409+
FOR /F "delims=" %%A IN ('^"%xidel% "%url%"
3410+
--xquery ^"name:^=concat^(
3411+
'NOS: '^,
3412+
replace^(
3413+
//h1[
3414+
ends-with^(
3415+
@class^,
3416+
'__title'
3417+
^)
3418+
]^,
3419+
'[^&quot^;^&apos^;]'^,
3420+
''''''
3421+
^)^,
3422+
if ^(.//video/@data-type^='livestream'^) then
3423+
replace^(
3424+
'%date%'^,
3425+
'.+?^(\d+^)-^(\d+^)-^(\d+^)'^,
3426+
': Livestream ^($1$2$3^)'
3427+
^)
3428+
else
3429+
replace^(
3430+
//@datetime^,
3431+
'^(\d+^)-^(\d+^)-^(\d+^).+'^,
3432+
' ^($3$2$1^)'
3433+
^)
3434+
^)^,
3435+
formats:^=//video/^(
3436+
if ^(@data-type^='livestream'^) then
3437+
let $a:^=x:request^(
3438+
{
3439+
'url'://video/@data-stream^,
3440+
'method':'HEAD'
3441+
}
3442+
^)/url return [
3443+
{
3444+
'format':'hls-0'^,
3445+
'extension':'m3u8'^,
3446+
'resolution':'manifest'^,
3447+
'url':$a
3448+
}^,
3449+
for $x at $i in tail^(
3450+
tokenize^(
3451+
extract^(
3452+
unparsed-text^($a^)^,
3453+
'^(#EXT-X-STREAM-INF.+m3u8$^)'^,
3454+
1^,'ms'
3455+
^)^,
3456+
'#EXT-X-STREAM-INF:'
3457+
^)
3458+
^) order by extract^(
3459+
$x^,
3460+
'BANDWIDTH^=^(\d+^)'^,
3461+
1
3462+
^) count $i return {
3463+
'format':'hls-'^|^|$i^,
3464+
'extension':'m3u8'^,
3465+
'resolution':extract^(
3466+
$x^,
3467+
'RESOLUTION^=^([\dx]+^)'^,
3468+
1
3469+
^) ! ^(
3470+
if ^(.^) then
3471+
.
3472+
else
3473+
'audiospoor'
3474+
^)^,
3475+
'vbitrate':extract^(
3476+
$x^,
3477+
'video^=^(\d+^)\d{3}'^,
3478+
1
3479+
^) ! ^(
3480+
if ^(.^) then
3481+
concat^(
3482+
'v:'^,
3483+
.^,
3484+
'k'
3485+
^)
3486+
else
3487+
''
3488+
^)^,
3489+
'abitrate':replace^(
3490+
$x^,
3491+
'.+audio.+?^(\d+^)\d{3}.+'^,
3492+
'a:$1k'^,
3493+
's'
3494+
^)^,
3495+
'url':resolve-uri^(
3496+
'.'^,
3497+
$a
3498+
^)^|^|extract^(
3499+
$x^,
3500+
'^(.+m3u8^)'^,
3501+
1
3502+
^)
3503+
}
3504+
]
3505+
else if ^(@data-adaptive^='true'^) then
3506+
let $a:^=x:request^(
3507+
{
3508+
'url':source/@src^,
3509+
'method':'HEAD'
3510+
}
3511+
^)/url return [
3512+
{
3513+
'format':'hls-0'^,
3514+
'extension':'m3u8'^,
3515+
'resolution':'manifest'^,
3516+
'url':$a
3517+
}^,
3518+
for $x at $i in tail^(
3519+
tokenize^(
3520+
unparsed-text^($a^)^,
3521+
'#EXT-X-STREAM-INF:'
3522+
^)
3523+
^) return {
3524+
'format':'hls-'^|^|$i^,
3525+
'extension':'m3u8'^,
3526+
'resolution':extract^(
3527+
$x^,
3528+
'RESOLUTION^=^([\dx]+^)'^,
3529+
1
3530+
^)^,
3531+
'vbitrate':concat^(
3532+
'v:'^,
3533+
extract^(
3534+
$x^,
3535+
'video.+?^(\d+^)\d{3}'^,
3536+
1
3537+
^)^,
3538+
'k'
3539+
^)^,
3540+
'abitrate':replace^(
3541+
$x^,
3542+
'.+audio.+?^(\d+^)\d{3}.+'^,
3543+
'a:$1k'^,
3544+
's'
3545+
^)^,
3546+
'url':resolve-uri^(
3547+
'.'^,
3548+
$a
3549+
^)^|^|extract^(
3550+
$x^,
3551+
'^(.+m3u8^)'^,
3552+
1
3553+
^)
3554+
}
3555+
]
3556+
else [
3557+
for $x at $i in source order by extract^(
3558+
$x/@data-label^,
3559+
'^(\d+^)p'^,
3560+
1
3561+
^) count $i return {
3562+
'format':'mp4-'^|^|$i^,
3563+
'extension':'mp4'^,
3564+
'url':if ^(
3565+
contains^(
3566+
$x/@src^,
3567+
'ipv4-api'
3568+
^)
3569+
^) then
3570+
x:request^(
3571+
{
3572+
'data':$x/@src^,
3573+
'method':'HEAD'
3574+
}
3575+
^)/url
3576+
else
3577+
$x/@src
3578+
}
3579+
]
3580+
^)^" --output-encoding^=oem --output-format^=cmd^"') DO %%A
3581+
3582+
IF DEFINED formats (
3583+
GOTO Formats
3584+
) ELSE (
3585+
ECHO.
3586+
ECHO Video niet ^(meer^) beschikbaar.
3587+
ECHO.
3588+
ECHO.
3589+
ENDLOCAL
3590+
GOTO Input
3591+
)
3592+
3593+
REM ================================================================================================
3594+
35253595
:rtlXL
35263596
FOR /F "delims=" %%A IN ('^"%xidel% "http://www.rtl.nl/system/s4m/vfd/version=2/uuid=%prid%/fmt=adaptive/"
35273597
--xquery ^"$json[

batchgemist.min.bat

+19-3
Original file line numberDiff line numberDiff line change
@@ -248,10 +248,10 @@ IF NOT "%url: =%"=="%url%" (
248248
) ELSE IF NOT "%url:willemwever.kro-ncrv.nl=%"=="%url%" (
249249
FOR /F "delims=" %%A IN ('^"%xidel% "%url%" -e "prid:=//@data-video-id" --output-format^=cmd^"') DO %%A
250250
GOTO NPO
251-
) ELSE IF NOT "%url:nos.nl/livestream=%"=="%url%" (
252-
FOR /F "delims=" %%A IN ('^"%xidel% "%url%" --xquery "name:=//h1||replace('%date%','.+?(\d+)-(\d+)-(\d+)',': Livestream ($1$2$3)'),let $a:=//video/x:request({'post':serialize-json({'stream':string(@data-stream)}),'url':@data-path})/json/json(substring-before(url,'p&callback')) return formats:=[{'format':'hls-0','extension':'m3u8','resolution':'manifest','url':$a},for $x at $i in tail(tokenize(extract(unparsed-text($a),'(#EXT-X-STREAM-INF.+m3u8$)',1,'ms'),'#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) ! (if (.) then . else 'audiospoor'),'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('.',$a)||extract($x,'(.+m3u8)',1)}]" --output-encoding^=oem --output-format^=cmd^"') DO %%A
253251
) ELSE IF NOT "%url:nos.nl=%"=="%url%" (
254-
FOR /F "delims=" %%A IN ('^"%xidel% "%url%" --xquery "videos:=[(if (//div[@class='video-play']) then //div[@class='video-play']/a/doc(@href) else .)/{position():{'name':concat('NOS: ',replace(//h1,'["']',''''''),replace(//@datetime,'(\d+)-(\d+)-(\d+).+',' ($3$2$1)')),'formats':for $x at $i in //source order by extract($x/@data-label,'(\d+)p',1) count $i return {'format':'mp4-'||$i,'extension':'mp4','url':if (contains($x/@src,'ipv4-api')) then x:request({'data':$x/@src,'method':'HEAD'})/url else $x/@src}}}]" --output-encoding^=oem --output-format^=cmd^"') DO %%A
252+
IF NOT "%url:artikel=%"=="%url%" (
253+
FOR /F "delims=" %%A IN ('^"%xidel% "%url%" --xquery "videos:=[//div[@class='block_video block_largecenter']/{position():{'name':replace(.//div[@class='caption_content']/text(),'["']',''''''),'url':resolve-uri(.//@href),'goto':'NOS'}}]" --output-encoding^=oem --output-format^=cmd^"') DO %%A
254+
) ELSE GOTO NOS
255255
) ELSE IF NOT "%url:eenvandaag.avrotros.nl=%"=="%url%" (
256256
FOR /F "delims=" %%A IN ('^"%xidel% "%url%" -e "prid:=json(//@data-at-player)/video_id" --output-format^=cmd^"') DO %%A
257257
GOTO NPO
@@ -387,6 +387,22 @@ IF DEFINED formats (
387387

388388
REM ================================================================================================
389389

390+
:NOS
391+
FOR /F "delims=" %%A IN ('^"%xidel% "%url%" --xquery "name:=concat('NOS: ',replace(//h1[ends-with(@class,'__title')],'["']',''''''),if (.//video/@data-type='livestream') then replace('%date%','.+?(\d+)-(\d+)-(\d+)',': Livestream ($1$2$3)') else replace(//@datetime,'(\d+)-(\d+)-(\d+).+',' ($3$2$1)')),formats:=//video/(if (@data-type='livestream') then let $a:=x:request({'url'://video/@data-stream,'method':'HEAD'})/url return [{'format':'hls-0','extension':'m3u8','resolution':'manifest','url':$a},for $x at $i in tail(tokenize(extract(unparsed-text($a),'(#EXT-X-STREAM-INF.+m3u8$)',1,'ms'),'#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) ! (if (.) then . else 'audiospoor'),'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('.',$a)||extract($x,'(.+m3u8)',1)}] else if (@data-adaptive='true') then let $a:=x:request({'url':source/@src,'method':'HEAD'})/url return [{'format':'hls-0','extension':'m3u8','resolution':'manifest','url':$a},for $x at $i in tail(tokenize(unparsed-text($a),'#EXT-X-STREAM-INF:')) return {'format':'hls-'||$i,'extension':'m3u8','resolution':extract($x,'RESOLUTION=([\dx]+)',1),'vbitrate':concat('v:',extract($x,'video.+?(\d+)\d{3}',1),'k'),'abitrate':replace($x,'.+audio.+?(\d+)\d{3}.+','a:$1k','s'),'url':resolve-uri('.',$a)||extract($x,'(.+m3u8)',1)}] else [for $x at $i in source order by extract($x/@data-label,'(\d+)p',1) count $i return {'format':'mp4-'||$i,'extension':'mp4','url':if (contains($x/@src,'ipv4-api')) then x:request({'data':$x/@src,'method':'HEAD'})/url else $x/@src}])" --output-encoding^=oem --output-format^=cmd^"') DO %%A
392+
393+
IF DEFINED formats (
394+
GOTO Formats
395+
) ELSE (
396+
ECHO.
397+
ECHO Video niet ^(meer^) beschikbaar.
398+
ECHO.
399+
ECHO.
400+
ENDLOCAL
401+
GOTO Input
402+
)
403+
404+
REM ================================================================================================
405+
390406
:rtlXL
391407
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)')),'["']',''''''),(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&format=hls')/url,'error-handling':'4xx=accept'})[contains(headers[1],'200')]/[{'format':'hls-0','extension':'m3u8','resolution':'manifest','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) ! (if (.) then . else 'audiospoor'),'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':let $a:=extract($x,'(.+m3u8)',1) return if (starts-with($a,'http')) then $a else resolve-uri('.',url)||$a,'ff_param':'-seekable 0'}])" --output-encoding^=oem --output-format^=cmd^"') DO %%A
392408

0 commit comments

Comments
 (0)