Repository: yt-dlp
Issue: Echo360 support request
Labels: site-request

### Checklist

- [X] I'm reporting a new site support request
- [X] I've verified that I'm running yt-dlp version **2022.05.18** ([update instructions](https://github.com/yt-dlp/yt-dlp#update)) or later (specify commit)
- [X] I've checked that all provided URLs are playable in a browser with the same IP and same login details
- [X] I've checked that none of provided URLs [violate any copyrights](https://github.com/ytdl-org/youtube-dl#can-you-add-support-for-this-anime-video-site-or-site-which-shows-current-movies-for-free) or contain any [DRM](https://en.wikipedia.org/wiki/Digital_rights_management) to the best of my knowledge
- [X] I've searched the [bugtracker](https://github.com/yt-dlp/yt-dlp/issues?q=) for similar issues including closed ones. DO NOT post duplicates
- [X] I've read the [guidelines for opening an issue](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#opening-an-issue)
- [ ] I've read about [sharing account credentials](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#are-you-willing-to-share-account-details-if-needed) and am willing to share it if required

### Region

Should be unrestricted

### Example URLs

In my current case, the URL structure is this:
https://echo360.net.au/media/xxxx-xxxxx-xxxxx-xxxxx-xxxxx-xxxxx/public

I believe that some other courses have structures like this (taken from other internet posts, I can't personally verify):
Single video: https://echo360.org.au/lesson/${video_ID}/classroom#sortDirection=desc
Playlist: https://echo360.org.au/section/${playlist_ID}/home

### Description

Echo360 is used by many universities for sharing lectures. Some courses are set up to allow downloads, but others aren't, and that's really difficult for users without permanent access to good internet.

In this specific case, some of my lectures are publicly accessible if you have the direct link, which I thought should make them easy to download, but so far I've been defeated - I constantly get 403: Forbidden errors.

I've spent 5 hours trying to figure it out, but I'm no coder, just a low level hobbyist. Would love any advice here.
Things I've tried (even though I would assume some shouldn't be necessary, given the video plays freely):
- VPN on/off
- --cookies-from-browser
- multiple --add-header options, including user agent, origin, authentication, referrer
- different m3u8 links - I can find 4 available (s1_av, s0q0, s0q1, s1q1), which seem to be different quality options
- starting download as quickly as possible after the resource loads, to try to beat any time-based restrictions

The browser extensions Video DownloadHelper and HLS Downloader have also failed to get anything useful from it.

EXAMPLE LINK: https://echo360.net.au/media/f04960a9-2efc-4b63-87b5-72e629081d15/public

SYNTAX ATTEMPTED:
```yt-dlp -vU "https://content.echo360.net.au/0000.d88cbb8d-7036-448f-ad95-946005ec9d97/6098a147-2d65-40f3-b9e9-a0204afe450c/1/s1q1.m3u8?x-uid=a0000000-0000-4000-0000-000000000000&x-instid=d88cbb8d-7036-448f-ad95-946005ec9d97&x-src=desktop&Policy=eyJTdGF0ZW1lbnQiOiBbeyJSZXNvdXJjZSI6Imh0dHBzOi8vKi5lY2hvMzYwLm5ldC5hdS8wMDAwLmQ4OGNiYjhkLTcwMzYtNDQ4Zi1hZDk1LTk0NjAwNWVjOWQ5Ny82MDk4YTE0Ny0yZDY1LTQwZjMtYjllOS1hMDIwNGFmZTQ1MGMvMS8qP3gtdWlkPWEwMDAwMDAwLTAwMDAtNDAwMC0wMDAwLTAwMDAwMDAwMDAwMCZ4LWluc3RpZD1kODhjYmI4ZC03MDM2LTQ0OGYtYWQ5NS05NDYwMDVlYzlkOTcmeC1zcmM9ZGVza3RvcCIsIkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTY1NDM4MTgwMH19fV19&Signature=1wNcsj5s%7ELDuc8EApeTZPhjF78sLZHP5MWEaExMB5uHNJhjp%7EO2Ky3IKsTPtznag-l4FpNiFvjoKHRK1scYgbuI1rYar%7ELcMESD%7EtUreTkoUSW23q-Dm6%7EUtPaRDWjMCfCqkXQwdH8m-ievzLgGFA2yDPx2oNDCQbc3X-xxFH%7Ea7Kfl4OoIgmtwtrpveOrDgSNGVJS5-rUSb%7EirAENqQPuuNfbWGNqBaXVUBrVNI4nMq5jicRPpxCw2753OmW3RuKEkWILIvFbwm1cmZ2txG0ZkNK-j1Yr7aBO2XmylNdTCMKDbG9sFFshGuMLNPrGDbrKVB2cBQmUPltjfEK8OHaQ__&Key-Pair-Id=APKAIPMYRDQXV3PXG2XA"```

### Verbose log

```shell
[debug] Command-line config: ['-vU', 'https://content.echo360.net.au/0000.d88cbb8d-7036-448f-ad95-946005ec9d97/6098a147-2d65-40f3-b9e9-a0204afe450c/1/s1q1.m3u8?x-uid=a0000000-0000-4000-0000-000000000000&x-instid=d88cbb8d-7036-448f-ad95-946005ec9d97&x-src=desktop&Policy=eyJTdGF0ZW1lbnQiOiBbeyJSZXNvdXJjZSI6Imh0dHBzOi8vKi5lY2hvMzYwLm5ldC5hdS8wMDAwLmQ4OGNiYjhkLTcwMzYtNDQ4Zi1hZDk1LTk0NjAwNWVjOWQ5Ny82MDk4YTE0Ny0yZDY1LTQwZjMtYjllOS1hMDIwNGFmZTQ1MGMvMS8qP3gtdWlkPWEwMDAwMDAwLTAwMDAtNDAwMC0wMDAwLTAwMDAwMDAwMDAwMCZ4LWluc3RpZD1kODhjYmI4ZC03MDM2LTQ0OGYtYWQ5NS05NDYwMDVlYzlkOTcmeC1zcmM9ZGVza3RvcCIsIkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTY1NDM4MTgwMH19fV19&Signature=1wNcsj5s%7ELDuc8EApeTZPhjF78sLZHP5MWEaExMB5uHNJhjp%7EO2Ky3IKsTPtznag-l4FpNiFvjoKHRK1scYgbuI1rYar%7ELcMESD%7EtUreTkoUSW23q-Dm6%7EUtPaRDWjMCfCqkXQwdH8m-ievzLgGFA2yDPx2oNDCQbc3X-xxFH%7Ea7Kfl4OoIgmtwtrpveOrDgSNGVJS5-rUSb%7EirAENqQPuuNfbWGNqBaXVUBrVNI4nMq5jicRPpxCw2753OmW3RuKEkWILIvFbwm1cmZ2txG0ZkNK-j1Yr7aBO2XmylNdTCMKDbG9sFFshGuMLNPrGDbrKVB2cBQmUPltjfEK8OHaQ__&Key-Pair-Id=APKAIPMYRDQXV3PXG2XA']
[debug] Encodings: locale cp1252, fs utf-8, pref cp1252, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version 2022.05.18 [b14d523] (win_exe)
[debug] Python version 3.8.10 (CPython 64bit) - Windows-10-10.0.19044-SP0
[debug] Checking exe version: ffprobe -bsfs
[debug] Checking exe version: ffmpeg -bsfs
[debug] exe versions: ffmpeg 2021-09-30-git-3ee4502753-full_build-www.gyan.dev (setts), ffprobe 2021-09-30-git-3ee4502753-full_build-www.gyan.dev
[debug] Optional libraries: Cryptodome-3.14.1, brotli-1.0.9, certifi-2021.10.08, mutagen-1.45.1, sqlite3-2.6.0, websockets-10.3
[debug] Proxy map: {}
Latest version: 2022.05.18, Current version: 2022.05.18
yt-dlp is up to date (2022.05.18)
[debug] [generic] Extracting URL: https://content.echo360.net.au/0000.d88cbb8d-7036-448f-ad95-946005ec9d97/6098a147-2d65-40f3-b9e9-a0204afe450c/1/s1q1.m3u8?x-uid=a0000000-0000-4000-0000-000000000000&x-instid=d88cbb8d-7036-448f-ad95-946005ec9d97&x-src=desktop&Policy=eyJTdGF0ZW1lbnQiOiBbeyJSZXNvdXJjZSI6Imh0dHBzOi8vKi5lY2hvMzYwLm5ldC5hdS8wMDAwLmQ4OGNiYjhkLTcwMzYtNDQ4Zi1hZDk1LTk0NjAwNWVjOWQ5Ny82MDk4YTE0Ny0yZDY1LTQwZjMtYjllOS1hMDIwNGFmZTQ1MGMvMS8qP3gtdWlkPWEwMDAwMDAwLTAwMDAtNDAwMC0wMDAwLTAwMDAwMDAwMDAwMCZ4LWluc3RpZD1kODhjYmI4ZC03MDM2LTQ0OGYtYWQ5NS05NDYwMDVlYzlkOTcmeC1zcmM9ZGVza3RvcCIsIkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTY1NDM4MTgwMH19fV19&Signature=1wNcsj5s%7ELDuc8EApeTZPhjF78sLZHP5MWEaExMB5uHNJhjp%7EO2Ky3IKsTPtznag-l4FpNiFvjoKHRK1scYgbuI1rYar%7ELcMESD%7EtUreTkoUSW23q-Dm6%7EUtPaRDWjMCfCqkXQwdH8m-ievzLgGFA2yDPx2oNDCQbc3X-xxFH%7Ea7Kfl4OoIgmtwtrpveOrDgSNGVJS5-rUSb%7EirAENqQPuuNfbWGNqBaXVUBrVNI4nMq5jicRPpxCw2753OmW3RuKEkWILIvFbwm1cmZ2txG0ZkNK-j1Yr7aBO2XmylNdTCMKDbG9sFFshGuMLNPrGDbrKVB2cBQmUPltjfEK8OHaQ__&Key-Pair-Id=APKAIPMYRDQXV3PXG2XA
[generic] s1q1: Requesting header
[debug] Identified a direct video link
[generic] s1q1: Downloading m3u8 information
[debug] Formats sorted by: hasvid, ie_pref, lang, quality, res, fps, hdr:12(7), vcodec:vp9.2(10), acodec, filesize, fs_approx, tbr, vbr, abr, asr, proto, vext, aext, hasaud, source, id
[debug] Default format spec: bestvideo*+bestaudio/best
[info] s1q1: Downloading 1 format(s): 0
[debug] Invoking hlsnative downloader on "https://content.echo360.net.au/0000.d88cbb8d-7036-448f-ad95-946005ec9d97/6098a147-2d65-40f3-b9e9-a0204afe450c/1/s1q1.m3u8?x-uid=a0000000-0000-4000-0000-000000000000&x-instid=d88cbb8d-7036-448f-ad95-946005ec9d97&x-src=desktop&Policy=eyJTdGF0ZW1lbnQiOiBbeyJSZXNvdXJjZSI6Imh0dHBzOi8vKi5lY2hvMzYwLm5ldC5hdS8wMDAwLmQ4OGNiYjhkLTcwMzYtNDQ4Zi1hZDk1LTk0NjAwNWVjOWQ5Ny82MDk4YTE0Ny0yZDY1LTQwZjMtYjllOS1hMDIwNGFmZTQ1MGMvMS8qP3gtdWlkPWEwMDAwMDAwLTAwMDAtNDAwMC0wMDAwLTAwMDAwMDAwMDAwMCZ4LWluc3RpZD1kODhjYmI4ZC03MDM2LTQ0OGYtYWQ5NS05NDYwMDVlYzlkOTcmeC1zcmM9ZGVza3RvcCIsIkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTY1NDM4MTgwMH19fV19&Signature=1wNcsj5s%7ELDuc8EApeTZPhjF78sLZHP5MWEaExMB5uHNJhjp%7EO2Ky3IKsTPtznag-l4FpNiFvjoKHRK1scYgbuI1rYar%7ELcMESD%7EtUreTkoUSW23q-Dm6%7EUtPaRDWjMCfCqkXQwdH8m-ievzLgGFA2yDPx2oNDCQbc3X-xxFH%7Ea7Kfl4OoIgmtwtrpveOrDgSNGVJS5-rUSb%7EirAENqQPuuNfbWGNqBaXVUBrVNI4nMq5jicRPpxCw2753OmW3RuKEkWILIvFbwm1cmZ2txG0ZkNK-j1Yr7aBO2XmylNdTCMKDbG9sFFshGuMLNPrGDbrKVB2cBQmUPltjfEK8OHaQ__&Key-Pair-Id=APKAIPMYRDQXV3PXG2XA"
[hlsnative] Downloading m3u8 manifest
[hlsnative] Total fragments: 666
[download] Destination: s1q1 [s1q1].mp4
[debug] File locking is not supported on this platform. Proceeding without locking
[download] Got server HTTP error: HTTP Error 403: Forbidden. Retrying fragment 1 (attempt 1 of 10) ...
[download] Got server HTTP error: HTTP Error 403: Forbidden. Retrying fragment 1 (attempt 2 of 10) ...
[download] Got server HTTP error: HTTP Error 403: Forbidden. Retrying fragment 1 (attempt 3 of 10) ...
[download] Got server HTTP error: HTTP Error 403: Forbidden. Retrying fragment 1 (attempt 4 of 10) ...
[download] Got server HTTP error: HTTP Error 403: Forbidden. Retrying fragment 1 (attempt 5 of 10) ...
[download] Got server HTTP error: HTTP Error 403: Forbidden. Retrying fragment 1 (attempt 6 of 10) ...
[download] Got server HTTP error: HTTP Error 403: Forbidden. Retrying fragment 1 (attempt 7 of 10) ...
[download] Got server HTTP error: HTTP Error 403: Forbidden. Retrying fragment 1 (attempt 8 of 10) ...
[download] Got server HTTP error: HTTP Error 403: Forbidden. Retrying fragment 1 (attempt 9 of 10) ...
[download] Got server HTTP error: HTTP Error 403: Forbidden. Retrying fragment 1 (attempt 10 of 10) ...
ERROR: Giving up after 10 fragment retries
  File "yt_dlp\__main__.py", line 16, in <module>
  File "yt_dlp\__init__.py", line 857, in main
  File "yt_dlp\__init__.py", line 847, in _real_main
  File "yt_dlp\YoutubeDL.py", line 3254, in download
  File "yt_dlp\YoutubeDL.py", line 3230, in wrapper
  File "yt_dlp\YoutubeDL.py", line 1386, in extract_info
  File "yt_dlp\YoutubeDL.py", line 1395, in wrapper
  File "yt_dlp\YoutubeDL.py", line 1479, in __extract_info
  File "yt_dlp\YoutubeDL.py", line 1535, in process_ie_result
  File "yt_dlp\YoutubeDL.py", line 2640, in process_video_result
  File "yt_dlp\YoutubeDL.py", line 3130, in process_info
  File "yt_dlp\YoutubeDL.py", line 2838, in dl
  File "yt_dlp\downloader\common.py", line 445, in download
  File "yt_dlp\downloader\hls.py", line 348, in real_download
  File "yt_dlp\downloader\fragment.py", line 520, in download_and_append_fragments
  File "yt_dlp\downloader\fragment.py", line 484, in download_fragment
  File "yt_dlp\YoutubeDL.py", line 936, in report_error
  File "yt_dlp\YoutubeDL.py", line 868, in trouble

ERROR: fragment 1 not found, unable to continue
  File "yt_dlp\__main__.py", line 16, in <module>
  File "yt_dlp\__init__.py", line 857, in main
  File "yt_dlp\__init__.py", line 847, in _real_main
  File "yt_dlp\YoutubeDL.py", line 3254, in download
  File "yt_dlp\YoutubeDL.py", line 3230, in wrapper
  File "yt_dlp\YoutubeDL.py", line 1386, in extract_info
  File "yt_dlp\YoutubeDL.py", line 1395, in wrapper
  File "yt_dlp\YoutubeDL.py", line 1479, in __extract_info
  File "yt_dlp\YoutubeDL.py", line 1535, in process_ie_result
  File "yt_dlp\YoutubeDL.py", line 2640, in process_video_result
  File "yt_dlp\YoutubeDL.py", line 3130, in process_info
  File "yt_dlp\YoutubeDL.py", line 2838, in dl
  File "yt_dlp\downloader\common.py", line 445, in download
  File "yt_dlp\downloader\hls.py", line 348, in real_download
  File "yt_dlp\downloader\fragment.py", line 521, in download_and_append_fragments
  File "yt_dlp\downloader\fragment.py", line 493, in append_fragment
  File "yt_dlp\YoutubeDL.py", line 936, in report_error
  File "yt_dlp\YoutubeDL.py", line 868, in trouble
```