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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
又名: 橡胶灵魂
+
+
+
+
+
+ 表演者:
+
+ The Beatles
+
+
+
+
+
+
+
+
流派: 摇滚
+
+
+
+
+
+
专辑类型: 专辑
+
+
+
+
+
+
介质: Audio CD
+
+
+
+
+
+
发行时间: 1965
+
+
+
+
+
+
出版者: Capitol
+
+
+
+
+
+
唱片数: 1
+
+
+
+
+
+
条形码: 0077774644020
+
+
+
+
+
其他版本:
+
Rubber Soul
+ (
全部 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 豆瓣评分
+
+
+
+
+
+
+
+ 5星
+
+
+
+
+
+
82.0%
+
+
+
+
+ 4星
+
+
+
+
+
+
15.4%
+
+
+
+
+ 3星
+
+
+
+
+
+
2.3%
+
+
+
+
+ 2星
+
+
+
+
+
+
0.2%
+
+
+
+
+ 1星
+
+
+
+
+
+
0.2%
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 以下豆列推荐
+ · · · · · ·
+ (全部 )
+
+
+
+
+
+
+
+
+
+
+
+
+ 谁听这张唱片?
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
>
+ 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 @@
+ +-
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
++ + 3 + 有用 + + + Kreuzberg + + 2012-05-17 14:44:39 + + +
++ + 偶像组合转型~ +
+ + ++ + 16 + 有用 + + + 雨摇 + + 2013-08-04 23:09:39 + + +
++ + 这时期的Beatles我喜欢,介乎早期的清纯和后期的迷幻之间。后期Beatles在麦卡特尼的策划下,做作、玩概念,跟知识界、政客和歌迷,开特别逼真的玩笑。第二首的西塔琴是哈里森弹的,Beatles成员中最迷恋东方文化的那个。后来乐队去了印度修行,摇滚界曾逛起一股东方文化旋风。 +
+ + ++ + 27 + 有用 + + + 密谋小和弦 + + 2016-08-10 22:02:32 + + +
++ + 一首希腊挽歌,一首法国情歌,一首政府歌曲,一首生活小摘,一首嬉皮士独白和一首滥用关系的歌曲都包含在这张专辑里。 +
+ + ++ + 0 + 有用 + + + Enjoy🌈Rachel + + 2011-05-24 16:40:19 + + +
++ + 爱情秘籍,早期最美好的一张~~ +
+ + ++ + 1 + 有用 + + + 拾贝壳的猫 + + 2014-03-31 20:18:18 + + +
++ + 吉他敲得不错 +
+ + ++ +-
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
++ + 0 + 有用 + + + 还是No.3 + + 2023-04-03 14:59:50 + 山东 + +
++ + @2021-07-07 14:31:26 @2022-10-15 22:40:28 +
+ + ++ + 0 + 有用 + + + acid + + 2023-04-03 19:22:08 + 上海 + +
++ + 我心中Beatles的第一专辑。前后期风格的交汇结合以及高度主题化的音乐表达; +
+ + ++ + 0 + 有用 + + + 思議自在神通 + + 2023-04-15 11:51:47 + 中国台湾 + +
++ + 因為是完整聽過的第一張(有一張打口CD),所有曲目都很喜歡,最愛Michelle +
+ + ++ + 0 + 有用 + + + 卢 垚 + + 2023-04-15 15:33:33 + 广东 + +
++ + 转型的一张专辑 +
+ + ++ + 0 + 有用 + + + Kissability + + 2023-04-10 21:47:06 + 四川 + +
++ + 这张应该算是现代摇滚的起源了吧,很多有启发性的旋律,但感觉没放太开,还没华丽起来 +
+ + +