diff --git a/src/streamlink/plugins/bbciplayer.py b/src/streamlink/plugins/bbciplayer.py
index a4c4f7da..68ccef88 100644
--- a/src/streamlink/plugins/bbciplayer.py
+++ b/src/streamlink/plugins/bbciplayer.py
@@ -34,11 +34,8 @@ class BBCiPlayer(Plugin):
     tvip_re = re.compile(r'channel"\s*:\s*{\s*"id"\s*:\s*"(\w+?)"')
     tvip_master_re = re.compile(r'event_master_brand=(\w+?)&')
     account_locals_re = re.compile(r'window.bbcAccount.locals\s*=\s*({.*?});')
-    swf_url = "http://emp.bbci.co.uk/emp/SMPf/1.18.3/StandardMediaPlayerChromelessFlash.swf"
-    hash = base64.b64decode(
-        b"N2RmZjc2NzFkMGM2OTdmZWRiMWQ5MDVkOWExMjE3MTk5MzhiOTJiZg==")
-    api_url = ("http://open.live.bbc.co.uk/mediaselector/6/select/"
-               "version/2.0/mediaset/{platform}/vpid/{vpid}/format/json/atk/{vpid_hash}/asn/1/")
+    hash = base64.b64decode(b"N2RmZjc2NzFkMGM2OTdmZWRiMWQ5MDVkOWExMjE3MTk5MzhiOTJiZg==")
+    api_url = "https://open.live.bbc.co.uk/mediaselector/6/select/version/2.0/mediaset/{platform}/vpid/{vpid}/format/json/atk/{vpid_hash}/asn/1/"
     platforms = ("pc", "iptv-all")
     session_url = "https://session.bbc.com/session"
     auth_url = "https://account.bbc.com/signin"
diff --git a/src/streamlink/plugins/wwenetwork.py b/src/streamlink/plugins/wwenetwork.py
index c42944bd..cb18a093 100644
--- a/src/streamlink/plugins/wwenetwork.py
+++ b/src/streamlink/plugins/wwenetwork.py
@@ -21,7 +21,6 @@ class WWENetwork(Plugin):
     stream_url = "https://dce-frontoffice.imggaming.com/api/v2/stream/{id}"
     live_url = "https://dce-frontoffice.imggaming.com/api/v2/event/live"
     login_url = "https://dce-frontoffice.imggaming.com/api/v2/login"
-    page_config_url = "https://cdn.watch.wwe.com/api/page"
     API_KEY = "cca51ea0-7837-40df-a055-75eb6347b2e7"
 
     customer_id = 16
@@ -56,7 +55,9 @@ class WWENetwork(Plugin):
         return cls.url_re.match(url) is not None
 
     def get_title(self):
-        return self.item_config['title']
+        if self.page_config:
+            for page in self.page_config["cache"]["page"].values():
+                return page['item']['title']
 
     def request(self, method, url, **kwargs):
         headers = kwargs.pop("headers", {})
@@ -90,22 +91,11 @@ class WWENetwork(Plugin):
 
     @property
     @memoize
-    def item_config(self):
+    def page_config(self):
         log.debug("Loading page config")
-        p = urlparse(self.url)
-        res = self.session.http.get(self.page_config_url,
-                                    params=dict(device="web_browser",
-                                                ff="idp,ldp",
-                                                item_detail_expand="all",
-                                                lang="en-US",
-                                                list_page_size="1",
-                                                max_list_prefetch="1",
-                                                path=p.path,
-                                                segments="es",
-                                                sub="Registered",
-                                                text_entry_format="html"))
-        data = self.session.http.json(res)
-        return data["item"]
+        res = self.session.http.get(self.url)
+        m = self.site_config_re.search(res.text)
+        return m and json.loads(m.group(1))
 
     def _get_media_info(self, content_id):
         """
@@ -119,14 +109,16 @@ class WWENetwork(Plugin):
     def _get_video_id(self):
         #  check the page to find the contentId
         log.debug("Searching for content ID")
-        try:
-            if self.item_config['type'] == "channel":
-                return self._get_live_id()
-            else:
-                return "vod/{id}".format(id=self.item_config['customFields']['DiceVideoId'])
-        except KeyError:
-            log.error("Could not find video ID")
-            return
+        if self.page_config:
+            for page in self.page_config["cache"]["page"].values():
+                try:
+                    if page['item']['type'] == "channel":
+                        return self._get_live_id()
+                    else:
+                        return "vod/{id}".format(id=page['item']['customFields']['DiceVideoId'])
+                except KeyError:
+                    log.error("Could not find video ID")
+                    return
 
     def _get_live_id(self):
         log.debug("Loading live event")
diff --git a/src/streamlink/plugins/youtube.py b/src/streamlink/plugins/youtube.py
index 9d7d3ffe..b8c9b3e9 100644
--- a/src/streamlink/plugins/youtube.py
+++ b/src/streamlink/plugins/youtube.py
@@ -85,13 +85,8 @@ _config_schema = validate.Schema(
                 },
                 validate.optional("videoDetails"): {
                     validate.optional("isLive"): validate.transform(bool),
-                },
-                validate.optional("playabilityStatus"): {
-                    validate.optional("status"): validate.text,
-                    validate.optional("reason"): validate.all(validate.text,
-                                                              validate.transform(maybe_decode)),
-                },
-            },
+                }
+            }
         ),
         validate.optional("live_playback"): validate.transform(bool),
         validate.optional("reason"): validate.all(validate.text, validate.transform(maybe_decode)),
@@ -109,25 +104,20 @@ _ytdata_re = re.compile(r'window\["ytInitialData"\]\s*=\s*({.*?});', re.DOTALL)
 _url_re = re.compile(r"""(?x)https?://(?:\w+\.)?youtube\.com
     (?:
         (?:
-            /(?:
-                watch.+v=
-                |
-                embed/(?!live_stream)
-                |
-                v/
-            )(?P<video_id>[0-9A-z_-]{11})
+            /(?:watch.+v=|embed/(?!live_stream)|v/)
+            (?P<video_id>[0-9A-z_-]{11})
         )
         |
         (?:
             /(?:
-                (?:user|c(?:hannel)?)/
+                (?:user|channel)/
                 |
                 embed/live_stream\?channel=
-            )[^/?&]+
+            )(?P<user>[^/?&]+)
         )
         |
         (?:
-            /(?:c/)?[^/?]+/live/?$
+            /(?:c/)?(?P<liveChannel>[^/?]+)/live/?$
         )
     )
 """)
@@ -326,12 +316,9 @@ class YouTube(Plugin):
 
             res = self.session.http.get(self._video_info_url, params=params)
             info_parsed = parse_query(res.content if is_py2 else res.text, name="config", schema=_config_schema)
-            if (info_parsed.get("player_response", {}).get("playabilityStatus", {}).get("status") != "OK"
-                    or info_parsed.get("status") == "fail"):
-                reason = (info_parsed.get("player_response", {}).get("playabilityStatus", {}).get("reason")
-                          or info_parsed.get("reason"))
+            if info_parsed.get("status") == "fail":
                 log.debug("get_video_info - {0}: {1}".format(
-                    count, reason)
+                    count, info_parsed.get("reason"))
                 )
                 continue
             self.author = info_parsed.get("author")

BBC Links stopped working?
Anyone else BBC links stopped working?
diff --git a/tests/plugins/test_youtube.py b/tests/plugins/test_youtube.py
index 2cf454ed..d6e1ab60 100644
--- a/tests/plugins/test_youtube.py
+++ b/tests/plugins/test_youtube.py
@@ -6,39 +6,53 @@ from streamlink.plugins.youtube import YouTube, _url_re
 class TestPluginYouTube(unittest.TestCase):
     def test_can_handle_url(self):
         should_match = [
-            "https://www.youtube.com/EXAMPLE/live",
-            "https://www.youtube.com/c/EXAMPLE",
-            "https://www.youtube.com/c/EXAMPLE/",
             "https://www.youtube.com/c/EXAMPLE/live",
             "https://www.youtube.com/c/EXAMPLE/live/",
             "https://www.youtube.com/channel/EXAMPLE",
-            "https://www.youtube.com/channel/EXAMPLE/",
+            "https://www.youtube.com/v/aqz-KE-bpKQ",
             "https://www.youtube.com/embed/aqz-KE-bpKQ",
-            "https://www.youtube.com/embed/live_stream?channel=UCNye-wNBqNL5ZzHSJj3l8Bg",
-            "https://www.youtube.com/user/EXAMPLE",
             "https://www.youtube.com/user/EXAMPLE/",
-            "https://www.youtube.com/user/EXAMPLE/live",
-            "https://www.youtube.com/v/aqz-KE-bpKQ",
             "https://www.youtube.com/watch?v=aqz-KE-bpKQ",
+            "https://www.youtube.com/embed/live_stream?channel=UCNye-wNBqNL5ZzHSJj3l8Bg",
         ]
         for url in should_match:
-            self.assertTrue(YouTube.can_handle_url(url), url)
+            self.assertTrue(YouTube.can_handle_url(url))
 
         should_not_match = [
-            "https://accounts.google.com/",
             "https://www.youtube.com",
-            "https://www.youtube.com/account",
-            "https://www.youtube.com/feed/guide_builder",
-            "https://www.youtube.com/t/terms",
         ]
         for url in should_not_match:
-            self.assertFalse(YouTube.can_handle_url(url), url)
+            self.assertFalse(YouTube.can_handle_url(url))
 
     def _test_regex(self, url, expected_string, expected_group):
         m = _url_re.match(url)
         self.assertIsNotNone(m)
         self.assertEqual(expected_string, m.group(expected_group))
 
+    def test_regex_liveChannel_c(self):
+        self._test_regex("https://www.youtube.com/c/EXAMPLE/live",
+                         "EXAMPLE", "liveChannel")
+
+    def test_regex_liveChannel_no_c(self):
+        self._test_regex("https://www.youtube.com/EXAMPLE1/live",
+                         "EXAMPLE1", "liveChannel")
+
+    def test_regex_user_channel(self):
+        self._test_regex("https://www.youtube.com/channel/EXAMPLE2",
+                         "EXAMPLE2", "user")
+
+    def test_regex_user_user(self):
+        self._test_regex("https://www.youtube.com/channel/EXAMPLE3",
+                         "EXAMPLE3", "user")
+
+    def test_regex_user_embed_list_stream(self):
+        self._test_regex("https://www.youtube.com/embed/live_stream?channel=UCNye-wNBqNL5ZzHSJj3l8Bg",
+                         "UCNye-wNBqNL5ZzHSJj3l8Bg", "user")
+
+    def test_regex_user_embed_list_stream_2(self):
+        self._test_regex("https://www.youtube.com/embed/live_stream?channel=UCNye-wNBqNL5ZzHSJj3l8Bg&autoplay=1&modestbranding=1&rel=0&showinfo=0&color=white&fs=1",
+                         "UCNye-wNBqNL5ZzHSJj3l8Bg", "user")
+
     def test_regex_video_id_v(self):
         self._test_regex("https://www.youtube.com/v/aqz-KE-bpKQ",
                          "aqz-KE-bpKQ", "video_id")

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest pytest-cov codecov coverage mock requests-mock freezegun
apt-get update apt-get install -y gcc
3.9
dev-requirements.txt docs-requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
alabaster==0.7.16
babel==2.17.0
certifi==2025.1.31
charset-normalizer==3.4.1
codecov==2.1.13
commonmark==0.9.1
coverage==7.8.0
docutils==0.21.2
exceptiongroup==1.2.2
freezegun==1.5.1
idna==3.10
imagesize==1.4.1
iniconfig==2.1.0
iso-639==0.4.5
iso3166==2.1.1
isodate==0.7.2
Jinja2==3.1.6
MarkupSafe==3.0.2
mock==5.2.0
packaging==24.2
pluggy==1.5.0
pycryptodome==3.22.0
Pygments==2.19.1
PySocks==1.7.1
pytest==8.3.5
pytest-cov==6.0.0
python-dateutil==2.9.0.post0
recommonmark==0.7.1
requests==2.32.3
requests-mock==1.12.1
six==1.17.0
snowballstemmer==2.2.0
Sphinx==1.6.7
sphinxcontrib-serializinghtml==2.0.0
sphinxcontrib-websupport==1.2.4
-e git+https://github.com/streamlink/streamlink.git@a2e576b44d482d2ced4494732f643139ab769217#egg=streamlink
tomli==2.2.1
urllib3==2.3.0
websocket-client==1.8.0

name: streamlink
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - alabaster==0.7.16
      - babel==2.17.0
      - certifi==2025.1.31
      - charset-normalizer==3.4.1
      - codecov==2.1.13
      - commonmark==0.9.1
      - coverage==7.8.0
      - docutils==0.21.2
      - exceptiongroup==1.2.2
      - freezegun==1.5.1
      - idna==3.10
      - imagesize==1.4.1
      - iniconfig==2.1.0
      - iso-639==0.4.5
      - iso3166==2.1.1
      - isodate==0.7.2
      - jinja2==3.1.6
      - markupsafe==3.0.2
      - mock==5.2.0
      - packaging==24.2
      - pluggy==1.5.0
      - pycryptodome==3.22.0
      - pygments==2.19.1
      - pysocks==1.7.1
      - pytest==8.3.5
      - pytest-cov==6.0.0
      - python-dateutil==2.9.0.post0
      - recommonmark==0.7.1
      - requests==2.32.3
      - requests-mock==1.12.1
      - six==1.17.0
      - snowballstemmer==2.2.0
      - sphinx==1.6.7
      - sphinxcontrib-serializinghtml==2.0.0
      - sphinxcontrib-websupport==1.2.4
      - tomli==2.2.1
      - urllib3==2.3.0
      - websocket-client==1.8.0
prefix: /opt/conda/envs/streamlink

tests/plugins/test_youtube.py::TestPluginYouTube::test_regex_liveChannel_c tests/plugins/test_youtube.py::TestPluginYouTube::test_regex_liveChannel_no_c tests/plugins/test_youtube.py::TestPluginYouTube::test_regex_user_channel tests/plugins/test_youtube.py::TestPluginYouTube::test_regex_user_embed_list_stream tests/plugins/test_youtube.py::TestPluginYouTube::test_regex_user_embed_list_stream_2 tests/plugins/test_youtube.py::TestPluginYouTube::test_regex_user_user
tests/plugins/test_youtube.py::TestPluginYouTube::test_can_handle_url tests/plugins/test_youtube.py::TestPluginYouTube::test_regex_video_id_embed tests/plugins/test_youtube.py::TestPluginYouTube::test_regex_video_id_v tests/plugins/test_youtube.py::TestPluginYouTube::test_regex_video_id_watch
src/streamlink/plugins/youtube.py src/streamlink/plugins/bbciplayer.py src/streamlink/plugins/wwenetwork.py
src/streamlink/plugins/youtube.py src/streamlink/plugins/bbciplayer.py src/streamlink/plugins/wwenetwork.py