ytdl-org / youtube-dl

Command-line program to download videos from YouTube.com and other video sites
http://ytdl-org.github.io/youtube-dl/
The Unlicense
132.34k stars 10.03k forks source link

eVOD https://watch.evod.co.za/ Support #31653

Open garyvdm opened 1 year ago

garyvdm commented 1 year ago

Checklist

Example URLs

Description

eVOD is a online version of a South African TV Channel. It requires an account to be created, but is free of charge.

dirkf commented 1 year ago

It's a JS application so there's no easy win. The site script and/or network traffic would have to be analysed to determine if an extractor is possible.

Vangelis66 commented 1 year ago

The site script and/or network traffic would have to be analysed

The link in OP doesn't work for me, but this one below does:

https://watch.evod.co.za/player/36728/stream?assetType=movies&playlist_id=8

BTW, I didn't have to log-in for playback to commence... 😜

Basically, they're using the Brightcove framework to deliver their streams; at this time, it appears "in the clear" (i.e. without DRM): https://beacon.playback.api.brightcove.com/etv/api/assets/36728 ("device_type, device_layout are required" if tried on its own) Their Brightcove account id is: "bc_account_id": "6195169123001" POST: https://beacon.playback.api.brightcove.com/etv/api/assets/36728/streams/11567 GET: https://beacon.playback.api.brightcove.com/etv/api/assets/36728/streams/11567/related ("device_type, device_layout, layout_id are required" if tried on its own)) GET: https://edge.api.brightcove.com/playback/v1/accounts/6195169123001/videos/6290129032001 (requires request header below:

Accept application/json;pk=BCpkADawqM1IM5wmrZIO6d3tl4Md7LUkg7QegiZZDkWTtHbcugAhH5ArMphQ033ih5XsXS4aYAJxUB53UxkQIIyyaOKPxlnUgGko5H9VPFd238g6NW9bbBW5KF7o_DveKsjI1MyjRGEJEibN

); streams (+subtitles+thumbnails) are then returned in the BODY of the response (prettified):

{
    "poster": "https://cf-images.eu-west-1.prod.boltdns.net/v1/static/6195169123001/b0c13c02-270a-4fd0-893b-09ca60025aeb/778e410c-951b-4673-8a60-559055696cb4/3840x2160/match/image.jpg",
    "thumbnail": "https://cf-images.eu-west-1.prod.boltdns.net/v1/static/6195169123001/b0c13c02-270a-4fd0-893b-09ca60025aeb/0ae1edef-9104-41ae-bf8a-b955763ebe36/800x450/match/image.jpg",
    "poster_sources": [
        {
            "src": "https://cf-images.eu-west-1.prod.boltdns.net/v1/static/6195169123001/b0c13c02-270a-4fd0-893b-09ca60025aeb/778e410c-951b-4673-8a60-559055696cb4/3840x2160/match/image.jpg"
        }
    ],
    "thumbnail_sources": [
        {
            "src": "https://cf-images.eu-west-1.prod.boltdns.net/v1/static/6195169123001/b0c13c02-270a-4fd0-893b-09ca60025aeb/0ae1edef-9104-41ae-bf8a-b955763ebe36/800x450/match/image.jpg"
        }
    ],
    "description": null,
    "tags": [
        "comedy",
        "highschool",
        "love",
        "raunchy",
        "romance",
        "seduction",
        "teen"
    ],
    "cue_points": [
        {
            "id": "6309495847001",
            "name": "AD 1",
            "type": "AD",
            "time": 900,
            "metadata": null,
            "force_stop": false
        },
        {
            "id": "6309495848001",
            "name": "AD 2",
            "type": "AD",
            "time": 1800,
            "metadata": null,
            "force_stop": false
        },
        {
            "id": "6309495849001",
            "name": "AD 3",
            "type": "AD",
            "time": 2700,
            "metadata": null,
            "force_stop": false
        },
        {
            "id": "6309495850001",
            "name": "AD 4",
            "type": "AD",
            "time": 3600,
            "metadata": null,
            "force_stop": false
        },
        {
            "id": "6309495851001",
            "name": "AD 5",
            "type": "AD",
            "time": 4500,
            "metadata": null,
            "force_stop": false
        },
        {
            "id": "6309495852001",
            "name": "AD 6",
            "type": "AD",
            "time": 5400,
            "metadata": null,
            "force_stop": false
        }
    ],
    "custom_fields": {
        "beacon_agerating": "za=18",
        "beacon_cast_actor": "Cary Elwes, Dylan McDermont",
        "beacon_cast_director": "Tim Garrick",
        "beacon_genre": "Comedy",
        "beacon_ingest": "Yes",
        "beacon_longdescription": "In this racy teen comedy, Rick Stevens (Nat Wolff) is willing to do whatever it takes to try to win the heart of beautiful Nina Pennington (Selena Gomez). Even if this means dealing with a mobster's son, a group of strippers, his best friend's mother, his drug abusing boss, a perverted principal, a priest with a secret, his suicidal mother, and a patron saint who dispenses cryptic advice. No one ever said love was easy.",
        "beacon_productionyear": "2013",
        "beacon_rights_0_adconfiguration": "d952c254-37fc-45cb-b837-40cbfd370fc9",
        "beacon_rights_0_devices": "iOS, Android, web, appletv, androidtv",
        "beacon_rights_0_enddate": "2025-11-30",
        "beacon_rights_0_locationspermit": "South Africa",
        "beacon_rights_0_packagename": "eVOD Free, Daily, eVOD Weekly, eVOD Monthly, eVOD Monthly APP",
        "beacon_rights_0_startdate": "2022-02-03",
        "beacon_rights_0_type": "SVOD",
        "beacon_shortdescription": "18L - In his quest to win the heart of the most beautiful girl in school (Selena Gomez), lovestruck teenager Rick (Nat Wolff) suffers uncomfortable racy experiences and must deal with his bestie's mom, a drug-abusing boss, a taciturn priest and the mob.",
        "beacon_video_type": "movie"
    },
    "account_id": "6195169123001",
    "sources": [
        {
            "codecs": "avc1,mp4a",
            "ext_x_version": "4",
            "src": "http://manifest.prod.boltdns.net/manifest/v1/hls/v4/clear/6195169123001/b0c13c02-270a-4fd0-893b-09ca60025aeb/10s/master.m3u8?fastly_token=NjNmODY2YzRfMWZlNGY0OTFlNzM5M2YzNGJlZjE4ZTlhOTIzNTM0YzQxMGMwNmFlNWRkOGFjODM1ZjQ3ZGZlZjViYzU3NjM2OQ%3D%3D",
            "type": "application/x-mpegURL"
        },
        {
            "codecs": "avc1,mp4a",
            "ext_x_version": "4",
            "src": "https://manifest.prod.boltdns.net/manifest/v1/hls/v4/clear/6195169123001/b0c13c02-270a-4fd0-893b-09ca60025aeb/10s/master.m3u8?fastly_token=NjNmODY2YzRfMWZlNGY0OTFlNzM5M2YzNGJlZjE4ZTlhOTIzNTM0YzQxMGMwNmFlNWRkOGFjODM1ZjQ3ZGZlZjViYzU3NjM2OQ%3D%3D",
            "type": "application/x-mpegURL"
        },
        {
            "codecs": "avc1,mp4a",
            "profiles": "urn:mpeg:dash:profile:isoff-live:2011",
            "src": "http://manifest.prod.boltdns.net/manifest/v1/dash/live-baseurl/clear/6195169123001/b0c13c02-270a-4fd0-893b-09ca60025aeb/6s/manifest.mpd?fastly_token=NjNmODY2YzRfODViZmMwZWY1Mzc1ZDg0ZjNiMmE2MWQ5MTg3OWFiOTA1NWIxN2E5MjkwNDU0MjA2YWE4Mjc4YmMxNDU4OTFhZg%3D%3D",
            "type": "application/dash+xml"
        },
        {
            "codecs": "avc1,mp4a",
            "profiles": "urn:mpeg:dash:profile:isoff-live:2011",
            "src": "https://manifest.prod.boltdns.net/manifest/v1/dash/live-baseurl/clear/6195169123001/b0c13c02-270a-4fd0-893b-09ca60025aeb/6s/manifest.mpd?fastly_token=NjNmODY2YzRfODViZmMwZWY1Mzc1ZDg0ZjNiMmE2MWQ5MTg3OWFiOTA1NWIxN2E5MjkwNDU0MjA2YWE4Mjc4YmMxNDU4OTFhZg%3D%3D",
            "type": "application/dash+xml"
        },
        {
            "avg_bitrate": 2098000,
            "codec": "H264",
            "container": "MP4",
            "duration": 5562432,
            "height": 720,
            "size": 1462306598,
            "src": "http://bc-evod.akamaized.net/media/v1/pmp4/static/clear/6195169123001/b0c13c02-270a-4fd0-893b-09ca60025aeb/ef2afbfa-be9e-49d6-9a8f-03c98cde90f6/main.mp4",
            "width": 1280
        },
        {
            "avg_bitrate": 2098000,
            "codec": "H264",
            "container": "MP4",
            "duration": 5562432,
            "height": 720,
            "size": 1462306598,
            "src": "https://bc-evod.akamaized.net/media/v1/pmp4/static/clear/6195169123001/b0c13c02-270a-4fd0-893b-09ca60025aeb/ef2afbfa-be9e-49d6-9a8f-03c98cde90f6/main.mp4",
            "width": 1280
        }
    ],
    "name": "Behaving Badly",
    "reference_id": null,
    "long_description": null,
    "duration": 5562432,
    "economics": "AD_SUPPORTED",
    "text_tracks": [
        {
            "id": null,
            "account_id": "6195169123001",
            "src": "http://manifest.prod.boltdns.net/thumbnail/v1/6195169123001/b0c13c02-270a-4fd0-893b-09ca60025aeb/f09950ff-7de5-4cc5-b77f-e059d96652c5/thumbnail.webvtt?fastly_token=NjNmODY2YzRfMGUxZWM2ZTA1ZWIzODI2MzY2ZjZjY2EwODA5ZWI5OTk4NDU5MDFlNzdlMGZmMTc2NWRlZWU3ZmQwZjExMDMzYg%3D%3D",
            "srclang": null,
            "label": "thumbnails",
            "kind": "metadata",
            "mime_type": "text/webvtt",
            "asset_id": null,
            "sources": null,
            "default": false,
            "width": 480,
            "height": 270,
            "bandwidth": 442
        },
        {
            "id": null,
            "account_id": "6195169123001",
            "src": "https://manifest.prod.boltdns.net/thumbnail/v1/6195169123001/b0c13c02-270a-4fd0-893b-09ca60025aeb/f09950ff-7de5-4cc5-b77f-e059d96652c5/thumbnail.webvtt?fastly_token=NjNmODY2YzRfMGUxZWM2ZTA1ZWIzODI2MzY2ZjZjY2EwODA5ZWI5OTk4NDU5MDFlNzdlMGZmMTc2NWRlZWU3ZmQwZjExMDMzYg%3D%3D",
            "srclang": null,
            "label": "thumbnails",
            "kind": "metadata",
            "mime_type": "text/webvtt",
            "asset_id": null,
            "sources": null,
            "default": false,
            "width": 480,
            "height": 270,
            "bandwidth": 442
        }
    ],
    "published_at": "2022-01-05T13:15:29.329Z",
    "created_at": "2022-01-05T13:15:29.318Z",
    "updated_at": "2022-06-08T07:33:16.753Z",
    "offline_enabled": false,
    "link": null,
    "id": "6290129032001",
    "ad_keys": null
}

Standalone MP4 containers, as well as stream fragments, are served from an Akamai bc-evod.akamaized.net hostname/CDN... I wouldn't rule out some content being geo-fenced for non-ZA IPs...

Should be doable 😄 ...