make other_title and genre list[str] and compatible with legacy data
This commit is contained in:
parent
d6c0cfad56
commit
fa960a2c7a
16 changed files with 2354 additions and 27 deletions
|
@ -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):
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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=_("导演"),
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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, [])
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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]"
|
||||
)
|
||||
|
|
|
@ -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"]:
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -80,7 +80,7 @@
|
|||
{% if related_books.count > 0 %}
|
||||
<div class="aside-section-wrapper">
|
||||
<div class="action-panel">
|
||||
<div class="action-panel__label">{% trans '其他版本' %}</div>
|
||||
<div class="action-panel__label">{% trans '其它版本' %}</div>
|
||||
<div >
|
||||
{% for b in related_books %}
|
||||
<p>
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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"
|
||||
|
|
2274
test_data/https___music_douban_com_subject_1401362_
Normal file
2274
test_data/https___music_douban_com_subject_1401362_
Normal file
File diff suppressed because it is too large
Load diff
|
@ -23,7 +23,7 @@
|
|||
{{ site_name }}还在不断完善中,丰富的内容需要大家共同创造。
|
||||
试图添加垃圾数据(如添加信息混乱或缺失的书籍、以推广为主要目的的评论)将会受到严肃处理。
|
||||
{{ site_name }}继承了联邦宇宙的用户关系,比如您在联邦宇宙屏蔽了某人,那您将不会在书影音的公共区域看到TA的痕迹。
|
||||
本站为非盈利站点,cookie和其他数据保管使用原则请参阅<a href="/announcement/data-policy/">站内公告</a>。
|
||||
本站为非盈利站点,cookie和其它数据保管使用原则请参阅<a href="/announcement/data-policy/">站内公告</a>。
|
||||
</p>
|
||||
<p>
|
||||
此外,{{ site_name }}现处于测试阶段,疏漏在所难免,请妥善备份您的数据。
|
||||
|
@ -38,4 +38,4 @@
|
|||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
</html>
|
||||
|
|
Loading…
Add table
Reference in a new issue