Repository: yt-dlp
Issue: BBC Sounds playlist
Labels: site-enhancement,triage

### DO NOT REMOVE OR SKIP THE ISSUE TEMPLATE

- [X] I understand that I will be **blocked** if I *intentionally* remove or skip any mandatory\* field

### Checklist

- [X] I'm requesting a site-specific feature
- [X] I've verified that I'm running yt-dlp version **2023.07.06** ([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 searched [known issues](https://github.com/yt-dlp/yt-dlp/issues/3766) and 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)
- [X] 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 I'm willing to share it if required

### Region

_No response_

### Example URLs

https://www.bbc.co.uk/sounds/brand/b08lw2hh
https://www.bbc.co.uk/sounds/series/b01b34yk

### Provide a description that is worded well enough to be understood

It would be nice to have playlist iteration for subpages of https://www.bbc.co.uk/sounds/

It looks like there are a few different types of pages:

https://www.bbc.co.uk/sounds/categories

- https://www.bbc.co.uk/sounds/category/drama-historical
  - https://www.bbc.co.uk/sounds/series/b01b34yk
- https://www.bbc.co.uk/sounds/category/documentaries
  - https://www.bbc.co.uk/sounds/brand/p09k7ctp
  - https://www.bbc.co.uk/sounds/play/m00167xz

`/sounds/category/` are a higher category pages and `/sounds/series/` and `/sounds/brand/` are pages which only list episodes.

I only care about `/sounds/series/` and `/sounds/brand/` type episode list page enumeration but others might also care about `/sounds/category/` enumeration. category pages can contain the two episode list pages as well as `/sounds/play/` media pages

### Provide verbose output that clearly demonstrates the problem

- [X] Run **your** yt-dlp command with **-vU** flag added (`yt-dlp -vU <your command line>`)
- [ ] If using API, add `'verbose': True` to `YoutubeDL` params instead
- [X] Copy the WHOLE output (starting with `[debug] Command-line config`) and insert it below

### Complete Verbose Output

```shell
[debug] Command-line config: ['--cookies-from-browser', 'firefox', '--user-agent', 'Mozilla/5.0 (X11; Linux x86_64; rv:98.0) Gecko/20100101 Firefox/98.0', '-o', '%(uploader)s/%(title).200B [%(id).60B].%(ext)s', '--restrict-filenames', '--download-archive', '/home/xk/.local/share/yt_archive.txt', '--retries', '13', '--extractor-retries', '13', '--extractor-args', 'youtubetab:skip=authcheck', '--embed-metadata', '--reject-title', 'Trailer|Sneak Peek|Preview|Teaser|Promo|Live |Stream|Twitch|Crypto|Meetup|Montage|Bitcoin|Makeup|Apology|Clip |Top 10|Top Ten|Panel|Red Carpet Premiere|Now Playing|In Theaters| Scene|Announcement|First Look|Final Look|Outtakes|360|World Premiere|Event|TV Spot|Advert|campaign|Horror|Graphics Card| GPU | Terror| AWARD|Ceremony', '--youtube-skip-dash-manifest', '--youtube-skip-hls-manifest', '-f', 'bestaudio[ext=opus]/bestaudio[ext=webm]/bestaudio[ext=ogg]/bestaudio[ext=oga]/bestaudio/best', '--match-filter', 'live_status=?not_live', '-vvv', 'https://www.bbc.co.uk/sounds/brand/b08lw2hh']
[debug] Encodings: locale UTF-8, fs utf-8, pref UTF-8, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version stable@2023.07.06 [b532a3481] (pip)
[debug] Python 3.11.4 (CPython x86_64 64bit) - Linux-6.3.11-200.fc38.x86_64-x86_64-with-glibc2.37 (OpenSSL 3.0.9 30 May 2023, glibc 2.37)
[debug] exe versions: ffmpeg 6.0 (setts), ffprobe 6.0, phantomjs 2.1.1, rtmpdump 2.4
[debug] Optional libraries: Cryptodome-3.17, brotli-1.0.9, certifi-2023.05.07, mutagen-1.46.0, secretstorage-3.3.3, sqlite3-2.6.0, websockets-11.0.3, xattr-0.10.0
[Cookies] Extracting cookies from firefox
[debug] Extracting cookies from: "/home/xk/.mozilla/firefox/lka4ht7r.xxx/cookies.sqlite"
[Cookies] Extracted 1328 cookies from firefox
[debug] Proxy map: {}
[debug] Loaded 1855 extractors
[debug] Loading archive file '/home/xk/.local/share/yt_archive.txt'
[bbc] Extracting URL: https://www.bbc.co.uk/sounds/brand/b08lw2hh
[bbc] b08lw2hh: Downloading webpage
ERROR: the JSON object must be str, bytes or bytearray, not dict
Traceback (most recent call last):
  File "/home/xk/.local/lib/python3.11/site-packages/yt_dlp/YoutubeDL.py", line 1560, in wrapper
    return func(self, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/xk/.local/lib/python3.11/site-packages/yt_dlp/YoutubeDL.py", line 1688, in __extract_info
    ie_result = ie.extract(url)
                ^^^^^^^^^^^^^^^
  File "/home/xk/.local/lib/python3.11/site-packages/yt_dlp/extractor/common.py", line 710, in extract
    ie_result = self._real_extract(url)
                ^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/xk/.local/lib/python3.11/site-packages/yt_dlp/extractor/bbc.py", line 1186, in _real_extract
    initial_data = self._parse_json(initial_data, playlist_id, fatal=False)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/xk/.local/lib/python3.11/site-packages/yt_dlp/extractor/common.py", line 1008, in _parse_json
    return json.loads(
           ^^^^^^^^^^^
  File "/usr/lib64/python3.11/json/__init__.py", line 339, in loads
    raise TypeError(f'the JSON object must be str, bytes or bytearray, '
TypeError: the JSON object must be str, bytes or bytearray, not dict
```