Tyrrrz / YoutubeExplode

Abstraction layer over YouTube's internal API
MIT License
2.93k stars 491 forks source link

Cannot get stream manifest of a video that is still being processed #734

Closed Mysterium-Mystery closed 3 weeks ago

Mysterium-Mystery commented 1 year ago

Version

Newest (6.3.3)

Platform

Windows 10

Steps to reproduce

var Vid = await YT.Videos.GetAsync(Link);`
var Manifests = await YT.Videos.Streams.GetManifestAsync(Vid.Id);

Using "https://www.youtube.com/watch?v=oKbKHd7nd0o" as Link. The second line of code from above will then throw an error

Details

YoutubeExplode always worked for me without any issues. Even now, it still works with pretty much every video. Only this one doesn't seem to work I do sort of have a theory why this might be the case though. The stream is still relatively new (It ended about 8 hours ago) and the chat is still not visible so it hasn't been processed by YouTube. So maybe YTExplode just can't get the manifest for streams which are still being processed. Can someone confirm if that's correct? If it is, of course it would be a nice feature to be able to download unprocessed streams but if that's too hard to do, that's okay but I think this should at least be noted somewhere

The exception: YoutubeExplode.Exceptions.VideoUnplayableException: Video 'oKbKHd7nd0o' does not contain any playable streams. at YoutubeExplode.Videos.Streams.StreamClient.GetManifestAsync(VideoId videoId, CancellationToken cancellationToken) in /_/YoutubeExplode/Videos/Streams/StreamClient.cs:line 246

Checklist

Mysterium-Mystery commented 1 year ago

Ok, the download works now so my theory seems to be correct (YouTube reaaaally took it's time with this one). I'll still leave the issue open because the underlying problem still exists

Tyrrrz commented 1 year ago

You are likely correct. The challenge is that there's only a very small window where this issue is observed, so it's hard to test against it.

I think, when the video is being processed, it may be possible to fetch it via segmented streams available in DASH, but it's currently not supported. And I'm not sure if that's actually going to work at all.

caverna commented 1 year ago

You are likely correct. The challenge is that there's only a very small window where this issue is observed, so it's hard to test against it.

I think, when the video is being processed, it may be possible to fetch it via segmented streams available in DASH, but it's currently not supported. And I'm not sure if that's actually going to work at all.

You can test that using any live stream, it gives the same error as reported...

caverna commented 1 year ago

Here's the output from a live video at VideoController.cs, at line 93 (response.Content.ReadAsStringAsync()):

{
  "responseContext": {
    "visitorData": "Cgs3Q2tIVk5jcXhVTSiI54qpBjIICgJERRICEgA%3D",
    "maxAgeSeconds": 0
  },
  "playabilityStatus": {
    "status": "OK",
    "playableInEmbed": true
  },
  "streamingData": {
    "expiresInSeconds": "21540",
    "dashManifestUrl": "https://manifest.googlevideo.com/api/manifest/dash/expire/1696794600/ei/iLMiZbfjEsCxx_APzLmNMA/ip/2003%3Acb%3Ad71b%3Ac477%3A3d7f%3A3d1b%3A7946%3A7b99/id/1U72z0ByXhI.2/source/yt_live_broadcast/requiressl/yes/tx/24554065/txs/24554063%2C24554064%2C24554065%2C24554066%2C24554067%2C24554068/as/fmp4_audio_clear%2Cwebm_audio_clear%2Cwebm2_audio_clear%2Cfmp4_sd_hd_clear%2Cwebm2_sd_hd_clear/vprv/1/pacing/0/itag_bl/374%2C375%2C376%2C377%2C384%2C385%2C407%2C408%2C409%2C410%2C411%2C412%2C557%2C558%2C612%2C613%2C617%2C619%2C623%2C628%2C655%2C656%2C660%2C662%2C666%2C671/keepalive/yes/fexp/24007246/beids/24350018/itag/0/playlist_type/DVR/sparams/expire%2Cei%2Cip%2Cid%2Csource%2Crequiressl%2Ctx%2Ctxs%2Cas%2Cvprv%2Citag%2Cplaylist_type/sig/AGM4YrMwRQIhAJ_SMjWqBUi7_s_KZS8IT158gCG42xllIqK9CZcdVjQFAiB2aDzioUQANSe_2xP5epo90fCtyGHBYu9S2InXPyJZtw%3D%3D",
    "hlsManifestUrl": "https://manifest.googlevideo.com/api/manifest/hls_variant/expire/1696794600/ei/iLMiZbfjEsCxx_APzLmNMA/ip/2003%3Acb%3Ad71b%3Ac477%3A3d7f%3A3d1b%3A7946%3A7b99/id/1U72z0ByXhI.2/source/yt_live_broadcast/requiressl/yes/tx/24554065/txs/24554063%2C24554064%2C24554065%2C24554066%2C24554067%2C24554068/hfr/1/vprv/1/go/1/pacing/0/nvgoi/1/keepalive/yes/fexp/24007246/beids/24350018/dover/11/itag/0/playlist_type/DVR/sparams/expire%2Cei%2Cip%2Cid%2Csource%2Crequiressl%2Ctx%2Ctxs%2Chfr%2Cvprv%2Cgo%2Citag%2Cplaylist_type/sig/AGM4YrMwRQIgKeIkQeBc1vYMlZ6tWRx4xQMH1IHo1NOmrkKfyikoS2wCIQC5Ci6-E3RL9wofeM0Wa5X3Wdi8KqzW14VAhH00HGxcgw%3D%3D/file/index.m3u8"
  },
  "heartbeatParams": {
    "intervalMilliseconds": "30000",
    "softFailOnError": true,
    "heartbeatServerData": "GAIgAg=="
  },
  "playbackTracking": {
    "videostatsPlaybackUrl": {
      "baseUrl": "https://s.youtube.com/api/stats/playback?cl=570785414&docid=1U72z0ByXhI&ei=iLMiZbfjEsCxx_APzLmNMA&fexp=v1%2C23946420%2C19788%2C17088%2C14760%2C6588%2C2602%2C26922%2C2780%2C40293%2C3497%2C40082%2C14490%2C4937%2C40927%2C4952%2C1251%2C54001%2C7577%2C6588%2C2%2C30243%2C2876%2C2307%2C76608%2C10019%2C311%2C4643%2C3060%2C5063%2C38113%2C22531%2C6998%2C7%2C5%2C510%2C5034%2C4851%2C7565%2C9132%2C15763%2C1563%2C3878%2C159%2C8639%2C3029%2C650%2C1045%2C3951%2C2417%2C10685%2C4125%2C330%2C712%2C85%2C825%2C2783%2C15%2C2063%2C489%2C2%2C1151%2C505%2C5816%2C3227%2C1088%2C3330%2C21785%2C376%2C108935%2C1910%2C1701%2C14625703%2C786%2C11678694%2C382%2C2158%2C2571%2C1034%2C119%2C868%2C720%2C75%2C150%2C192%2C385%2C41%2C1760%2C1115%2C1650%2C1170%2C759%2C114%2C543%2C184%2C944%2C2950%2C1007%2C888%2C418%2C374%2C616%2C1048%2C2%2C2438%2C124%2C977%2C1080%2C769%2C138%2C178%2C949%2C359%2C2992&live=dvr&ns=yt&plid=AAYHNL_zD0e_yqQm&delay=5&el=detailpage&len=0&of=qNw2AYySOk82WMEedkE6EA&vm=CAEQARgEOjJBQWpSVTZsZ3BENFI4TFVhcjhGVFhtbnNmT0hsTHBYRlhfU2lkRHoxbzducWxGeUNUUWJyQVBta0tESjQwTG5CN045Mk5FQ0ptenF6WE1ySmxhMEEtQWpiNVpBUURzTTQxWmFRbE1Rb3VlUDM0T1RSOEJFVXlqd0ljREI5bnZ6Y2Rhc05Ja2cxRnlCWFVzVkFlcW9vZEtXbC1pdWZNTFFpaE4tRUpBaAE",
      "headers": [
        {
          "headerType": "USER_AUTH"
        },
        {
          "headerType": "VISITOR_ID"
        }
      ]
    },
    "videostatsDelayplayUrl": {
      "baseUrl": "https://s.youtube.com/api/stats/delayplay?cl=570785414&docid=1U72z0ByXhI&ei=iLMiZbfjEsCxx_APzLmNMA&fexp=v1%2C23946420%2C19788%2C17088%2C14760%2C6588%2C2602%2C26922%2C2780%2C40293%2C3497%2C40082%2C14490%2C4937%2C40927%2C4952%2C1251%2C54001%2C7577%2C6588%2C2%2C30243%2C2876%2C2307%2C76608%2C10019%2C311%2C4643%2C3060%2C5063%2C38113%2C22531%2C6998%2C7%2C5%2C510%2C5034%2C4851%2C7565%2C9132%2C15763%2C1563%2C3878%2C159%2C8639%2C3029%2C650%2C1045%2C3951%2C2417%2C10685%2C4125%2C330%2C712%2C85%2C825%2C2783%2C15%2C2063%2C489%2C2%2C1151%2C505%2C5816%2C3227%2C1088%2C3330%2C21785%2C376%2C108935%2C1910%2C1701%2C14625703%2C786%2C11678694%2C382%2C2158%2C2571%2C1034%2C119%2C868%2C720%2C75%2C150%2C192%2C385%2C41%2C1760%2C1115%2C1650%2C1170%2C759%2C114%2C543%2C184%2C944%2C2950%2C1007%2C888%2C418%2C374%2C616%2C1048%2C2%2C2438%2C124%2C977%2C1080%2C769%2C138%2C178%2C949%2C359%2C2992&live=dvr&ns=yt&plid=AAYHNL_zD0e_yqQm&delay=5&el=detailpage&len=0&of=qNw2AYySOk82WMEedkE6EA&vm=CAEQARgEOjJBQWpSVTZsZ3BENFI4TFVhcjhGVFhtbnNmT0hsTHBYRlhfU2lkRHoxbzducWxGeUNUUWJyQVBta0tESjQwTG5CN045Mk5FQ0ptenF6WE1ySmxhMEEtQWpiNVpBUURzTTQxWmFRbE1Rb3VlUDM0T1RSOEJFVXlqd0ljREI5bnZ6Y2Rhc05Ja2cxRnlCWFVzVkFlcW9vZEtXbC1pdWZNTFFpaE4tRUpBaAE",
      "elapsedMediaTimeSeconds": 5,
      "headers": [
        {
          "headerType": "USER_AUTH"
        },
        {
          "headerType": "VISITOR_ID"
        }
      ]
    },
    "videostatsWatchtimeUrl": {
      "baseUrl": "https://s.youtube.com/api/stats/watchtime?cl=570785414&docid=1U72z0ByXhI&ei=iLMiZbfjEsCxx_APzLmNMA&fexp=v1%2C23946420%2C19788%2C17088%2C14760%2C6588%2C2602%2C26922%2C2780%2C40293%2C3497%2C40082%2C14490%2C4937%2C40927%2C4952%2C1251%2C54001%2C7577%2C6588%2C2%2C30243%2C2876%2C2307%2C76608%2C10019%2C311%2C4643%2C3060%2C5063%2C38113%2C22531%2C6998%2C7%2C5%2C510%2C5034%2C4851%2C7565%2C9132%2C15763%2C1563%2C3878%2C159%2C8639%2C3029%2C650%2C1045%2C3951%2C2417%2C10685%2C4125%2C330%2C712%2C85%2C825%2C2783%2C15%2C2063%2C489%2C2%2C1151%2C505%2C5816%2C3227%2C1088%2C3330%2C21785%2C376%2C108935%2C1910%2C1701%2C14625703%2C786%2C11678694%2C382%2C2158%2C2571%2C1034%2C119%2C868%2C720%2C75%2C150%2C192%2C385%2C41%2C1760%2C1115%2C1650%2C1170%2C759%2C114%2C543%2C184%2C944%2C2950%2C1007%2C888%2C418%2C374%2C616%2C1048%2C2%2C2438%2C124%2C977%2C1080%2C769%2C138%2C178%2C949%2C359%2C2992&live=dvr&ns=yt&plid=AAYHNL_zD0e_yqQm&el=detailpage&len=0&of=qNw2AYySOk82WMEedkE6EA&vm=CAEQARgEOjJBQWpSVTZsZ3BENFI4TFVhcjhGVFhtbnNmT0hsTHBYRlhfU2lkRHoxbzducWxGeUNUUWJyQVBta0tESjQwTG5CN045Mk5FQ0ptenF6WE1ySmxhMEEtQWpiNVpBUURzTTQxWmFRbE1Rb3VlUDM0T1RSOEJFVXlqd0ljREI5bnZ6Y2Rhc05Ja2cxRnlCWFVzVkFlcW9vZEtXbC1pdWZNTFFpaE4tRUpBaAE",
      "headers": [
        {
          "headerType": "USER_AUTH"
        },
        {
          "headerType": "VISITOR_ID"
        }
      ]
    },
    "ptrackingUrl": {
      "baseUrl": "https://www.youtube.com/ptracking?ei=iLMiZbfjEsCxx_APzLmNMA&oid=82ZyHtardRAbOneTQSSPtg&plid=AAYHNL_zD0e_yqQm&pltype=contentlive&ptchn=rkRKvn30Y7tzuyOBduzKXA&ptk=youtube_single&video_id=1U72z0ByXhI",
      "headers": [
        {
          "headerType": "USER_AUTH"
        },
        {
          "headerType": "VISITOR_ID"
        }
      ]
    },
    "qoeUrl": {
      "baseUrl": "https://s.youtube.com/api/stats/qoe?cl=570785414&docid=1U72z0ByXhI&ei=iLMiZbfjEsCxx_APzLmNMA&event=streamingstats&fexp=v1%2C23946420%2C19788%2C17088%2C14760%2C6588%2C2602%2C26922%2C2780%2C40293%2C3497%2C40082%2C14490%2C4937%2C40927%2C4952%2C1251%2C54001%2C7577%2C6588%2C2%2C30243%2C2876%2C2307%2C76608%2C10019%2C311%2C4643%2C3060%2C5063%2C38113%2C22531%2C6998%2C7%2C5%2C510%2C5034%2C4851%2C7565%2C9132%2C15763%2C1563%2C3878%2C159%2C8639%2C3029%2C650%2C1045%2C3951%2C2417%2C10685%2C4125%2C330%2C712%2C85%2C825%2C2783%2C15%2C2063%2C489%2C2%2C1151%2C505%2C5816%2C3227%2C1088%2C3330%2C21785%2C376%2C108935%2C1910%2C1701%2C14625703%2C786%2C11678694%2C382%2C2158%2C2571%2C1034%2C119%2C868%2C720%2C75%2C150%2C192%2C385%2C41%2C1760%2C1115%2C1650%2C1170%2C759%2C114%2C543%2C184%2C944%2C2950%2C1007%2C888%2C418%2C374%2C616%2C1048%2C2%2C2438%2C124%2C977%2C1080%2C769%2C138%2C178%2C949%2C359%2C2992&live=dvr&ns=yt&plid=AAYHNL_zD0e_yqQm",
      "headers": [
        {
          "headerType": "USER_AUTH"
        },
        {
          "headerType": "VISITOR_ID"
        }
      ]
    },
    "youtubeRemarketingUrl": {
      "baseUrl": "https://www.youtube.com/pagead/viewthroughconversion/962985656/?backend=innertube&cname=30&cver=1_9&foc_id=rkRKvn30Y7tzuyOBduzKXA&label=followon_view&ptype=no_rmkt&random=586117383",
      "elapsedMediaTimeSeconds": 0,
      "headers": [
        {
          "headerType": "USER_AUTH"
        },
        {
          "headerType": "VISITOR_ID"
        }
      ]
    }
  },
  "videoDetails": {
    "videoId": "1U72z0ByXhI",
    "title": "STOCK CAR 2023 AO VIVO | 9ª ETAPA - BUENOS AIRES / ARGENTINA",
    "lengthSeconds": "0",
    "isLive": true,
    "keywords": [
      "stockcar",
      "stock car 2020",
      "Toyota Corolla",
      "Chevrolet Cruze",
      "stock car 2021",
      "calendario 2021",
      "Stock Car ao vivo"
    ],
    "channelId": "UCrkRKvn30Y7tzuyOBduzKXA",
    "isOwnerViewing": false,
    "shortDescription": "#StockCar #StockCar2023\n\nSite Oficial: https://www.stockproseries.com.br/\n\nFacebook: https://www.facebook.com/stockcaroficial/\nInstagram: https://www.instagram.com/stock_car/\nTwitter: https://twitter.com/stock_car\nTikTok: https://www.tiktok.com/@stockcarbrasil",
    "isCrawlable": true,
    "isLiveDvrEnabled": true,
    "thumbnail": {
      "thumbnails": [
        {
          "url": "https://i.ytimg.com/vi/1U72z0ByXhI/default.jpg?v=65206c7c",
          "width": 120,
          "height": 90
        },
        {
          "url": "https://i.ytimg.com/vi/1U72z0ByXhI/mqdefault.jpg?v=65206c7c",
          "width": 320,
          "height": 180
        },
        {
          "url": "https://i.ytimg.com/vi/1U72z0ByXhI/hqdefault.jpg?v=65206c7c",
          "width": 480,
          "height": 360
        },
        {
          "url": "https://i.ytimg.com/vi/1U72z0ByXhI/sddefault.jpg?v=65206c7c",
          "width": 640,
          "height": 480
        }
      ]
    },
    "allowRatings": true,
    "viewCount": "4455",
    "author": "Stock Car",
    "isLowLatencyLiveStream": false,
    "isPrivate": false,
    "isUnpluggedCorpus": false,
    "latencyClass": "MDE_STREAM_OPTIMIZATIONS_RENDERER_LATENCY_NORMAL",
    "isLiveContent": true
  },
  "playerConfig": {
    "audioConfig": {
      "enablePerFormatLoudness": false
    },
    "exoPlayerConfig": {
      "useExoPlayer": true,
      "useAdaptiveBitrate": true,
      "maxInitialByteRate": 91136,
      "minDurationForQualityIncreaseMs": 15000,
      "maxDurationForQualityDecreaseMs": 500,
      "minDurationToRetainAfterDiscardMs": 21000,
      "lowWatermarkMs": 15000,
      "highWatermarkMs": 30000,
      "lowPoolLoad": 0.8,
      "highPoolLoad": 0.8,
      "sufficientBandwidthOverhead": 0.67,
      "bufferChunkSizeKb": 50,
      "httpConnectTimeoutMs": 16000,
      "httpReadTimeoutMs": 8000,
      "numAudioSegmentsPerFetch": 1,
      "numVideoSegmentsPerFetch": 2,
      "minDurationForPlaybackStartMs": 2500,
      "enableExoplayerReuse": false,
      "useRadioTypeForInitialQualitySelection": true,
      "blacklistFormatOnError": false,
      "enableBandaidHttpDataSource": true,
      "httpLoadTimeoutMs": 18000,
      "canPlayHdDrm": true,
      "videoBufferSegmentCount": 389,
      "audioBufferSegmentCount": 38,
      "useAbruptSplicing": false,
      "minRetryCount": 10,
      "minChunksNeededToPreferOffline": 2,
      "secondsToMaxAggressiveness": 0,
      "enableSurfaceviewResizeWorkaround": true,
      "enableVp9IfThresholdsPass": false,
      "matchQualityToViewportOnUnfullscreen": false,
      "lowAudioQualityConnTypes": [
        "MOBILE_CONNECTION_TYPE_CELLULAR_2G",
        "MOBILE_CONNECTION_TYPE_CELLULAR_3G"
      ],
      "useDashForLiveStreams": true,
      "enableLibvpxVideoTrackRenderer": false,
      "lowAudioQualityBandwidthThresholdBps": 0,
      "enableVariableSpeedPlayback": false,
      "preferOnesieBufferedFormat": false,
      "minimumBandwidthSampleBytes": 4096,
      "useDashForOtfAndCompletedLiveStreams": true,
      "disableCacheAwareVideoFormatEvaluation": false,
      "useLiveDvrForDashLiveStreams": true,
      "cronetResetTimeoutOnRedirects": true,
      "emitVideoDecoderChangeEvents": true,
      "onesieVideoBufferLoadTimeoutMs": "0",
      "onesieVideoBufferReadTimeoutMs": "0",
      "libvpxEnableGl": false,
      "enableVp9EncryptedIfThresholdsPass": false,
      "enableOpus": false,
      "usePredictedBuffer": true,
      "maxReadAheadMediaTimeMs": 120000,
      "useMediaTimeCappedLoadControl": true,
      "allowCacheOverrideToLowerQualitiesWithinRange": 0,
      "allowDroppingUndecodedFrames": true,
      "minDurationForPlaybackRestartMs": 5000,
      "serverProvidedBandwidthHeader": "",
      "liveOnlyPegStrategy": "LIVE_ONLY_PEG_STRATEGY_DO_NOT_PEG",
      "enableRedirectorHostFallback": false,
      "enableHighlyAvailableFormatFallbackOnPcr": false,
      "recordTrackRendererTimingEvents": false,
      "minErrorsForRedirectorHostFallback": 0,
      "nonHardwareMediaCodecNames": [
        "OMX.ffmpeg.vp9.decoder",
        "OMX.google.vp9.decoder",
        "c2.android.vp9.decoder",
        "OMX.Intel.sw_vd.vp9",
        "OMX.MTK.VIDEO.DECODER.SW.VP9",
        "c2.mtk.sw.vp9.decoder",
        "OMX.google.av1.decoder",
        "c2.android.av1.decoder",
        "OMX.sprd.av1.decoder"
      ],
      "enableVp9IfInHardware": false,
      "enableVp9EncryptedIfInHardware": false,
      "useOpusMedAsLowQualityAudio": false,
      "minErrorsForPcrFallback": 0,
      "useStickyRedirectHttpDataSource": false,
      "onlyVideoBandwidth": false,
      "useRedirectorOnNetworkChange": false,
      "enableMaxReadaheadAbrThreshold": true,
      "cacheCheckDirectoryWritabilityOnce": false,
      "predictorType": "PREDICTOR_TYPE_NEAREST_RANK",
      "slidingPercentile": 0.5,
      "slidingWindowSize": 12,
      "maxFrameDropIntervalMs": 100,
      "ignoreLoadTimeoutForFallback": false,
      "serverBweMultiplier": 1,
      "drmMaxKeyfetchDelayMs": 0,
      "maxResolutionForWhiteNoise": 0,
      "whiteNoiseRenderEffectMode": "RENDER_EFFECT_MODE_UNKNOWN",
      "enableLibvpxHdr": false,
      "enableCacheAwareStreamSelection": false,
      "useExoCronetDataSource": true,
      "whiteNoiseScale": 0,
      "whiteNoiseOffset": 0,
      "preventVideoFrameLaggingWithLibvpx": false,
      "enableMediaCodecHdr": false,
      "enableMediaCodecSwHdr": false,
      "liveOnlyWindowChunks": 10,
      "bearerMinDurationToRetainAfterDiscardMs": [
        21000,
        21000,
        21000,
        21000,
        120000,
        120000,
        90000,
        120000
      ],
      "forceWidevineL3": false,
      "useAverageBitrate": false,
      "useMedialibAudioTrackRendererForLive": true,
      "useExoPlayerV2": false,
      "logMediaRequestEventsToCsi": false,
      "onesieFixNonZeroStartTimeFormatSelection": false,
      "liveOnlyReadaheadStepSizeChunks": 1,
      "liveOnlyBufferHealthHalfLifeSeconds": 60,
      "liveOnlyMinBufferHealthRatio": 0.75,
      "liveOnlyMinLatencyToSeekRatio": 3,
      "manifestlessPartialChunkStrategy": "ANDROID_PARTIAL_CHUNK_STRATEGY_RETRY_RANGE",
      "ignoreViewportSizeWhenSticky": false,
      "enableLibvpxFallback": false,
      "disableLibvpxLoopFilter": false,
      "enableVpxMediaView": false,
      "hdrMinScreenBrightness": 0,
      "hdrMaxScreenBrightnessThreshold": 0,
      "onesieDataSourceAboveCacheDataSource": false,
      "httpNonplayerLoadTimeoutMs": 72000,
      "numVideoSegmentsPerFetchStrategy": "NUM_SEGMENTS_PER_FETCH_STRATEGY_CONSTANT",
      "maxVideoDurationPerFetchMs": 12000,
      "maxVideoEstimatedLoadDurationMs": -1,
      "estimatedServerClockHalfLife": 5,
      "estimatedServerClockStrictOffset": false,
      "minReadAheadMediaTimeMs": 0,
      "readAheadGrowthRate": 0,
      "useDynamicReadAhead": false,
      "useYtVodMediaSourceForV2": false,
      "enableV2Gapless": false,
      "useLiveHeadTimeMillis": false,
      "allowTrackSelectionWithUpdatedVideoItagsForExoV2": false,
      "maxAllowableTimeBeforeMediaTimeUpdateSec": 0,
      "enableDynamicHdr": false,
      "v2PerformEarlyStreamSelection": false,
      "v2UsePlaybackStreamSelectionResult": false,
      "v2MinTimeBetweenAbrReevaluationMs": 2000,
      "avoidReusePlaybackAcrossLoadvideos": false,
      "enableInfiniteNetworkLoadingRetries": false,
      "reportExoPlayerStateOnTransition": false,
      "manifestlessSequenceMethod": "MANIFESTLESS_SEQUENCE_METHOD_LIVE_HEAD",
      "useLiveHeadWindow": false,
      "enableDynamicHdrInHardware": false,
      "ultralowAudioQualityBandwidthThresholdBps": 0,
      "ignoreUnneededSeeksToLiveHead": false,
      "drmMetricsQoeLoggingFraction": 0.01,
      "useTimeSeriesBufferPrediction": false,
      "slidingPercentileScalar": 1,
      "minAdaptiveVideoQuality": 0,
      "platypusBackBufferDurationMs": 60000
    }
  },
  "trackingParams": "CAAQu2kiEwi3x8r_y-aBAxXA2BEIHcxcAwY=",
  "adBreakHeartbeatParams": "Q0FBJTNE"
}
caverna commented 1 year ago

Also if it helps, I noticed that PlayerResponse.cs, line 137, you search for "formats" value, which doesn't exists in a live stream. StreamData.Value contains only that:

{
    "expiresInSeconds": "21540",
    "dashManifestUrl": "https://manifest.googlevideo.com/api/manifest/dash/expire/1696797629/ei/Xb8iZfuEGobs1wLlsL_IAw/ip/2003%3Acb%3Ad71b%3Ac477%3A3d7f%3A3d1b%3A7946%3A7b99/id/1U72z0ByXhI.2/source/yt_live_broadcast/requiressl/yes/as/fmp4_audio_clear%2Cwebm_audio_clear%2Cwebm2_audio_clear%2Cfmp4_sd_hd_clear%2Cwebm2_sd_hd_clear/vprv/1/pacing/0/itag_bl/374%2C375%2C376%2C377%2C384%2C385%2C407%2C408%2C409%2C410%2C411%2C412%2C557%2C558%2C612%2C613%2C617%2C619%2C623%2C628%2C655%2C656%2C660%2C662%2C666%2C671/keepalive/yes/fexp/24007246/beids/24350018/itag/0/playlist_type/DVR/sparams/expire%2Cei%2Cip%2Cid%2Csource%2Crequiressl%2Cas%2Cvprv%2Citag%2Cplaylist_type/sig/AGM4YrMwRQIhAIyd-sNaFr4QybfTtK9W4A5KfHBte4MNjuSWXFHREgaAAiA3xU-B63EYxaXnqoRqVh9Oitu-WaRSYHhQBtlg_qAY6w%3D%3D",
    "hlsManifestUrl": "https://manifest.googlevideo.com/api/manifest/hls_variant/expire/1696797629/ei/Xb8iZfuEGobs1wLlsL_IAw/ip/2003%3Acb%3Ad71b%3Ac477%3A3d7f%3A3d1b%3A7946%3A7b99/id/1U72z0ByXhI.2/source/yt_live_broadcast/requiressl/yes/hfr/1/vprv/1/go/1/pacing/0/nvgoi/1/keepalive/yes/fexp/24007246/beids/24350018/dover/11/itag/0/playlist_type/DVR/sparams/expire%2Cei%2Cip%2Cid%2Csource%2Crequiressl%2Chfr%2Cvprv%2Cgo%2Citag%2Cplaylist_type/sig/AGM4YrMwRAIgZ4Qdx-VN-CcepyEaKL7SskbVQ627DtHer_OqDAjB3dQCIGkdVP4DOI-eYExHdng7oMnegA1etxsf_b3rxN4a-XB6/file/index.m3u8"
  }
Tyrrrz commented 1 year ago

Here's the output from a live video at VideoController.cs, at line 93 (response.Content.ReadAsStringAsync()):

Was that for a finished livestream?

caverna commented 1 year ago

no, it was during the livestream...

Tyrrrz commented 1 year ago

Yeah, an ongoing livestream can only be fetched through the HLS manifest. You can use the GetHttpLiveStreamUrlAsync(...) method.

Tyrrrz commented 3 weeks ago

This may have been fixed by #818. Please create a new issue if the problem persists.