diff --git a/catalog/common/sites.py b/catalog/common/sites.py index a4591434..d6b6f11e 100644 --- a/catalog/common/sites.py +++ b/catalog/common/sites.py @@ -13,6 +13,7 @@ from dataclasses import dataclass, field from typing import Callable, Type import django_rq +import requests from .models import ExternalResource, IdealIdTypes, IdType, Item, SiteName @@ -275,6 +276,21 @@ class SiteManager: cls = next( filter(lambda p: p.validate_url(url), SiteManager.registry.values()), None ) + if cls is None: + try: + url2 = requests.head(url, allow_redirects=True, timeout=1).url + if url2 != url: + cls = next( + filter( + lambda p: p.validate_url(url2), + SiteManager.registry.values(), + ), + None, + ) + if cls: + url = url2 + except: + pass if cls is None: cls = next( filter( @@ -292,11 +308,6 @@ class SiteManager: cls = SiteManager.registry[id_type] return cls(id_value=id_value) - @staticmethod - def get_id_by_url(url: str): - site = SiteManager.get_site_by_url(url) - return site.url_to_id(url) if site else None - @staticmethod def get_all_sites(): return SiteManager.register.values() diff --git a/catalog/music/tests.py b/catalog/music/tests.py index 58e622e9..d6cced8d 100644 --- a/catalog/music/tests.py +++ b/catalog/music/tests.py @@ -26,6 +26,12 @@ class SpotifyTestCase(TestCase): self.assertEqual(site.url, t_url) self.assertEqual(site.id_value, t_id_value) + t_url2 = "https://spotify.link/poyfZyBo6Cb" + t_id_value2 = "3yu2aNKeWTxqCjqoIH4HDU" + site = SiteManager.get_site_by_url(t_url2) + self.assertIsNotNone(site) + self.assertEqual(site.id_value, t_id_value2) + @use_local_response def test_scrape(self): t_url = "https://open.spotify.com/album/65KwtzkJXw7oT819NFWmEP"