diff --git a/catalog/common/jsondata.py b/catalog/common/jsondata.py index bbffb5e1..9b59d9f2 100644 --- a/catalog/common/jsondata.py +++ b/catalog/common/jsondata.py @@ -236,7 +236,9 @@ class ArrayField(JSONFieldMixin, DJANGO_ArrayField): kwargs["help_text"] = _("多项之间以英文逗号分隔") super().__init__(*args, **kwargs) - pass + def from_json(self, value): # backward compatible with dirty legacy data + if value or value == []: + return value if isinstance(value, list) else [value] class JSONField(JSONFieldMixin, DJANGO_JSONField): diff --git a/catalog/game/models.py b/catalog/game/models.py index 253688bf..3ba4d5e4 100644 --- a/catalog/game/models.py +++ b/catalog/game/models.py @@ -39,7 +39,7 @@ class Game(Item): other_title = jsondata.ArrayField( base_field=models.CharField(blank=True, default="", max_length=500), - verbose_name=_("其他标题"), + verbose_name=_("其它标题"), null=True, blank=True, default=list, diff --git a/catalog/game/tests.py b/catalog/game/tests.py index 4a455810..d449cb4d 100644 --- a/catalog/game/tests.py +++ b/catalog/game/tests.py @@ -25,6 +25,9 @@ class IGDBTestCase(TestCase): self.assertEqual(site.resource.metadata["title"], "Portal 2") self.assertIsInstance(site.resource.item, Game) self.assertEqual(site.resource.item.steam, "620") + self.assertEqual( + site.resource.item.genre, ["Shooter", "Platform", "Puzzle", "Adventure"] + ) @use_local_response def test_scrape_non_steam(self): @@ -38,6 +41,7 @@ class IGDBTestCase(TestCase): ) self.assertIsInstance(site.resource.item, Game) self.assertEqual(site.resource.item.primary_lookup_id_type, IdType.IGDB) + self.assertEqual(site.resource.item.genre, ["Role-playing (RPG)", "Adventure"]) self.assertEqual( site.resource.item.primary_lookup_id_value, "the-legend-of-zelda-breath-of-the-wild", @@ -70,6 +74,9 @@ class SteamTestCase(TestCase): ) self.assertIsInstance(site.resource.item, Game) self.assertEqual(site.resource.item.steam, "620") + self.assertEqual( + site.resource.item.genre, ["Shooter", "Platform", "Puzzle", "Adventure"] + ) class DoubanGameTestCase(TestCase): @@ -94,6 +101,8 @@ class DoubanGameTestCase(TestCase): self.assertEqual(site.resource.metadata["title"], "传送门2 Portal 2") self.assertIsInstance(site.resource.item, Game) self.assertEqual(site.resource.item.douban_game, "10734307") + self.assertEqual(site.resource.item.genre, ["第一人称射击", "益智", "射击", "动作"]) + self.assertEqual(site.resource.item.other_title, []) class BangumiGameTestCase(TestCase): diff --git a/catalog/movie/models.py b/catalog/movie/models.py index bbb823f9..4c48df02 100644 --- a/catalog/movie/models.py +++ b/catalog/movie/models.py @@ -5,7 +5,7 @@ from django.db import models class MovieInSchema(ItemInSchema): orig_title: str | None = None - other_title: str | None = None + other_title: list[str] director: list[str] playwright: list[str] actor: list[str] @@ -52,8 +52,12 @@ class Movie(Item): orig_title = jsondata.CharField( verbose_name=_("原始标题"), blank=True, default="", max_length=500 ) - other_title = jsondata.CharField( - verbose_name=_("其他标题"), blank=True, default="", max_length=500 + other_title = jsondata.ArrayField( + verbose_name=_("其它标题"), + base_field=models.CharField(blank=True, default="", max_length=200), + null=True, + blank=True, + default=list, ) director = jsondata.ArrayField( verbose_name=_("导演"), diff --git a/catalog/music/models.py b/catalog/music/models.py index 297294d8..571e6929 100644 --- a/catalog/music/models.py +++ b/catalog/music/models.py @@ -5,7 +5,7 @@ from django.db import models class AlbumInSchema(ItemInSchema): - other_title: str | None = None + other_title: list[str] genre: list[str] artist: list[str] company: list[str] @@ -48,7 +48,13 @@ class Album(Item): verbose_name=_("艺术家"), default=list, ) - genre = jsondata.CharField(_("流派"), blank=True, default="", max_length=100) + genre = jsondata.ArrayField( + verbose_name=_("流派"), + base_field=models.CharField(blank=True, default="", max_length=50), + null=True, + blank=True, + default=list, + ) company = jsondata.ArrayField( models.CharField(blank=True, default="", max_length=500), verbose_name=_("发行方"), @@ -57,7 +63,13 @@ class Album(Item): default=list, ) track_list = jsondata.TextField(_("曲目"), blank=True, default="") - other_title = jsondata.CharField(_("其它标题"), blank=True, default="", max_length=500) + other_title = jsondata.ArrayField( + verbose_name=_("其它标题"), + base_field=models.CharField(blank=True, default="", max_length=200), + null=True, + blank=True, + default=list, + ) album_type = jsondata.CharField(_("专辑类型"), blank=True, default="", max_length=500) media = jsondata.CharField(_("介质"), blank=True, default="", max_length=500) bandcamp_album_id = jsondata.CharField(blank=True, default="", max_length=500) diff --git a/catalog/music/tests.py b/catalog/music/tests.py index ef616327..ab368080 100644 --- a/catalog/music/tests.py +++ b/catalog/music/tests.py @@ -35,6 +35,8 @@ class SpotifyTestCase(TestCase): self.assertEqual(site.resource.metadata["title"], "The Race For Space") self.assertIsInstance(site.resource.item, Album) self.assertEqual(site.resource.item.barcode, "3610159662676") + self.assertEqual(site.resource.item.genre, []) + self.assertEqual(site.resource.item.other_title, []) class DoubanMusicTestCase(TestCase): @@ -51,14 +53,16 @@ class DoubanMusicTestCase(TestCase): @use_local_response def test_scrape(self): - t_url = "https://music.douban.com/subject/33551231/" + t_url = "https://music.douban.com/subject/1401362/" site = SiteManager.get_site_by_url(t_url) self.assertEqual(site.ready, False) site.get_resource_ready() self.assertEqual(site.ready, True) - self.assertEqual(site.resource.metadata["title"], "The Race For Space") + self.assertEqual(site.resource.metadata["title"], "Rubber Soul") self.assertIsInstance(site.resource.item, Album) - self.assertEqual(site.resource.item.barcode, "3610159662676") + self.assertEqual(site.resource.item.barcode, "0077774644020") + self.assertEqual(site.resource.item.genre, ["摇滚"]) + self.assertEqual(site.resource.item.other_title, ["橡胶灵魂"]) class MultiMusicSitesTestCase(TestCase): @@ -102,6 +106,8 @@ class BandcampTestCase(TestCase): self.assertEqual(site.resource.metadata["title"], "In These Times") self.assertEqual(site.resource.metadata["artist"], ["Makaya McCraven"]) self.assertIsInstance(site.resource.item, Album) + self.assertEqual(site.resource.item.genre, []) + self.assertEqual(site.resource.item.other_title, []) class DiscogsReleaseTestCase(TestCase): @@ -130,6 +136,8 @@ class DiscogsReleaseTestCase(TestCase): self.assertEqual(site.resource.metadata["artist"], ["J.I.D"]) self.assertIsInstance(site.resource.item, Album) self.assertEqual(site.resource.item.barcode, "0602445804689") + self.assertEqual(site.resource.item.genre, ["Hip Hop"]) + self.assertEqual(site.resource.item.other_title, []) class DiscogsMasterTestCase(TestCase): @@ -155,3 +163,5 @@ class DiscogsMasterTestCase(TestCase): self.assertEqual(site.resource.metadata["title"], "Coexist") self.assertEqual(site.resource.metadata["artist"], ["The XX"]) self.assertIsInstance(site.resource.item, Album) + self.assertEqual(site.resource.item.genre, ["Electronic", "Rock", "Pop"]) + self.assertEqual(site.resource.item.other_title, []) diff --git a/catalog/performance/models.py b/catalog/performance/models.py index 13eeaed0..f5e6e74b 100644 --- a/catalog/performance/models.py +++ b/catalog/performance/models.py @@ -10,7 +10,7 @@ class Performance(Item): douban_drama = LookupIdDescriptor(IdType.DoubanDrama) other_title = jsondata.ArrayField( verbose_name=_("其它标题"), - base_field=models.CharField(), + base_field=models.CharField(blank=True, default="", max_length=200), null=False, blank=False, default=list, diff --git a/catalog/sites/discogs.py b/catalog/sites/discogs.py index e56b97e4..0f5445ab 100644 --- a/catalog/sites/discogs.py +++ b/catalog/sites/discogs.py @@ -30,7 +30,7 @@ class DiscogsRelease(AbstractSite): release = get_discogs_data("releases", self.id_value) title = release.get("title") artist = [artist.get("name") for artist in release.get("artists")] - genre = release.get("genres") + genre = release.get("genres", []) track_list = [track.get("title") for track in release.get("tracklist")] company = list( set([company.get("name") for company in release.get("companies")]) @@ -96,7 +96,7 @@ class DiscogsMaster(AbstractSite): master_release = get_discogs_data("masters", self.id_value) title = master_release.get("title") artist = [artist.get("name") for artist in master_release.get("artists")] - genre = master_release.get("genres") + genre = master_release.get("genres", []) track_list = [track.get("title") for track in master_release.get("tracklist")] image_url = None diff --git a/catalog/sites/douban_music.py b/catalog/sites/douban_music.py index 7ef01f7d..1599cacd 100644 --- a/catalog/sites/douban_music.py +++ b/catalog/sites/douban_music.py @@ -42,7 +42,7 @@ class DoubanMusic(AbstractSite): genre_elem = content.xpath( "//div[@id='info']//span[text()='流派:']/following::text()[1]" ) - genre = genre_elem[0].strip() if genre_elem else None + genre = genre_elem[0].strip().split(" / ") if genre_elem else [] date_elem = content.xpath( "//div[@id='info']//span[text()='发行时间:']/following::text()[1]" @@ -95,7 +95,7 @@ class DoubanMusic(AbstractSite): "//div[@id='info']//span[text()='又名:']/following-sibling::text()[1]" ) if other_elem: - data["other_title"] = other_elem[0].strip() + data["other_title"] = other_elem[0].strip().split(" / ") other_elem = content.xpath( "//div[@id='info']//span[text()='专辑类型:']/following-sibling::text()[1]" ) diff --git a/catalog/sites/spotify.py b/catalog/sites/spotify.py index e0aa4f35..790fb376 100644 --- a/catalog/sites/spotify.py +++ b/catalog/sites/spotify.py @@ -42,7 +42,7 @@ class Spotify(AbstractSite): title = res_data["name"] - genre = ", ".join(res_data["genres"]) + genre = res_data.get("genres", []) company = [] for com in res_data["copyrights"]: diff --git a/catalog/sites/tmdb.py b/catalog/sites/tmdb.py index 32593433..8426e674 100644 --- a/catalog/sites/tmdb.py +++ b/catalog/sites/tmdb.py @@ -131,7 +131,7 @@ class TMDB_Movie(AbstractSite): metadata={ "title": title, "orig_title": orig_title, - "other_title": None, + "other_title": [], "imdb_code": imdb_code, "director": director, "playwright": playwright, @@ -278,7 +278,7 @@ class TMDB_TV(AbstractSite): metadata={ "title": title, "orig_title": orig_title, - "other_title": None, + "other_title": [], "imdb_code": imdb_code, "director": director, "playwright": playwright, diff --git a/catalog/templates/edition.html b/catalog/templates/edition.html index ead5f41b..4c027bb8 100644 --- a/catalog/templates/edition.html +++ b/catalog/templates/edition.html @@ -80,7 +80,7 @@ {% if related_books.count > 0 %}
-
{% trans '其他版本' %}
+
{% trans '其它版本' %}
{% for b in related_books %}

diff --git a/catalog/tv/models.py b/catalog/tv/models.py index d437b1a2..a2ed1a4a 100644 --- a/catalog/tv/models.py +++ b/catalog/tv/models.py @@ -33,7 +33,7 @@ from django.utils.translation import gettext_lazy as _ class TVShowInSchema(ItemInSchema): season_count: int | None = None orig_title: str | None = None - other_title: str | None = None + other_title: list[str] director: list[str] playwright: list[str] actor: list[str] @@ -54,7 +54,7 @@ class TVShowSchema(TVShowInSchema, BaseSchema): class TVSeasonInSchema(ItemInSchema): season_number: int | None = None orig_title: str | None = None - other_title: str | None = None + other_title: list[str] director: list[str] playwright: list[str] actor: list[str] @@ -105,8 +105,12 @@ class TVShow(Item): orig_title = jsondata.CharField( verbose_name=_("原始标题"), blank=True, default="", max_length=500 ) - other_title = jsondata.CharField( - verbose_name=_("其他标题"), blank=True, default="", max_length=500 + other_title = jsondata.ArrayField( + base_field=models.CharField(blank=True, default="", max_length=500), + verbose_name=_("其它标题"), + null=True, + blank=True, + default=list, ) director = jsondata.ArrayField( verbose_name=_("导演"), @@ -229,7 +233,7 @@ class TVSeason(Item): verbose_name=_("原始标题"), blank=True, default="", max_length=500 ) other_title = jsondata.ArrayField( - verbose_name=_("其他标题"), + verbose_name=_("其它标题"), base_field=models.CharField(blank=True, default="", max_length=500), null=True, blank=True, diff --git a/catalog/tv/tests.py b/catalog/tv/tests.py index 56266f0f..956e536b 100644 --- a/catalog/tv/tests.py +++ b/catalog/tv/tests.py @@ -3,6 +3,18 @@ from catalog.common import * from catalog.tv.models import * +class JSONFieldTestCase(TestCase): + def test_legacy_data(self): + o = TVShow() + self.assertEqual(o.other_title, []) + o.other_title = "test" + self.assertEqual(o.other_title, ["test"]) + o.other_title = ["a", "b"] + self.assertEqual(o.other_title, ["a", "b"]) + o.other_title = None + self.assertEqual(o.other_title, None) + + class TMDBTVTestCase(TestCase): def test_parse(self): t_id = "57243" diff --git a/test_data/https___music_douban_com_subject_1401362_ b/test_data/https___music_douban_com_subject_1401362_ new file mode 100644 index 00000000..7091f984 --- /dev/null +++ b/test_data/https___music_douban_com_subject_1401362_ @@ -0,0 +1,2274 @@ + + + + + + + + + Rubber Soul (豆瓣) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +

+ Rubber Soul +
+

+ +
+ +
+ + +
+ + + +
+
+ + + +
+
+ + + Rubber Soul + + +
+ + + + + + + + +
+ +
+ + + + + + 又名: 橡胶灵魂 +
+ + + + + 表演者: + + The Beatles + + + +
+ + + + 流派: 摇滚 +
+ + + + + 专辑类型: 专辑 +
+ + + + + 介质: Audio CD +
+ + + + + 发行时间: 1965 +
+ + + + + 出版者: Capitol +
+ + + + + 唱片数: 1 +
+ + + + + 条形码: 0077774644020 +
+ + + + 其他版本:  + Rubber Soul + (全部) +
+
+
+ + + + + + + +
+
+ +
+ 9.6 + +
+
+ +
+
+ + + + + + 5星 + + + +
+ + 82.0% +
+ + + + 4星 + + + +
+ + 15.4% +
+ + + + 3星 + + + +
+ + 2.3% +
+ + + + 2星 + + + +
+ + 0.2% +
+ + + + 1星 + + + +
+ + 0.2% +
+
+
+ + + + + +
+ + + + + +
+ + + + + +
+ + + 评价: + + + + + + + +
+ + + + + +
+ + + + + + + + +
+ +
+ + + + + + + + + +
+ + + + + +
+ + +
+
+ +
+ + + +
+
+ + + + + + +
+
+
+ + + + + + + + + + + + + + + +

+ 以下豆列推荐 + · · · · · · + (全部) +

+
+ + + +
+ + + + + + + + + +

+ 谁听这张唱片? +

+
+ + + + + + +
+ 阿诚会发疯 +
+
+ 阿诚会发疯 +
+
今天凌晨听过
+
+
+
+
+
+ + +
+ wjjjjjjjjj +
+
+ wjjjjjjjjj +
+
昨天听过
+
+ + tags:Rock +
+
+
+
+ + +
+ 24½ +
+
+ 24½ +
+
昨天听过
+
+
+
+
+
+ + +
+ 🐙 +
+
+ 🐙 +
+
昨天想听
+
+
+
+
+
+ + + + + +

> + 595人在听 +

+ +

> + 15021人听过 +

+ +

> + 1886人想听 +

+
+ + + + + + + + + + + +
+ + + + + + + + + + + + + + +

订阅关于Rubber Soul的评论:
+ feed: rss 2.0

+ + + +
+
+ + + + +
+ + + + + +
+
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/users/templates/users/register.html b/users/templates/users/register.html index deda3bb3..76d9f8c4 100644 --- a/users/templates/users/register.html +++ b/users/templates/users/register.html @@ -23,7 +23,7 @@ {{ site_name }}还在不断完善中,丰富的内容需要大家共同创造。 试图添加垃圾数据(如添加信息混乱或缺失的书籍、以推广为主要目的的评论)将会受到严肃处理。 {{ site_name }}继承了联邦宇宙的用户关系,比如您在联邦宇宙屏蔽了某人,那您将不会在书影音的公共区域看到TA的痕迹。 - 本站为非盈利站点,cookie和其他数据保管使用原则请参阅站内公告。 + 本站为非盈利站点,cookie和其它数据保管使用原则请参阅站内公告

此外,{{ site_name }}现处于测试阶段,疏漏在所难免,请妥善备份您的数据。 @@ -38,4 +38,4 @@ - \ No newline at end of file +