add jjwcx parser

This commit is contained in:
Jigsaw 2024-12-11 13:46:19 +00:00 committed by Henri Dickson
parent f500037d63
commit f1ad888de0
8 changed files with 77 additions and 2 deletions

View file

@ -234,6 +234,7 @@ class Edition(Item):
IdType.Goodreads,
IdType.GoogleBooks,
IdType.Qidian,
IdType.JJWXC,
]
return [(i.value, i.label) for i in id_types]

View file

@ -423,6 +423,25 @@ class QidianTestCase(TestCase):
self.assertEqual(site.resource.item.author[0], "爱潜水的乌贼")
class JinJiangTestCase(TestCase):
databases = "__all__"
@use_local_response
def test_scrape(self):
t_url = "https://www.jjwxc.net/onebook.php?novelid=5833245"
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.site_name, SiteName.JJWXC)
self.assertEqual(site.resource.id_type, IdType.JJWXC)
self.assertEqual(site.resource.id_value, "5833245")
self.assertEqual(
site.resource.item.display_title, "穿进赛博游戏后干掉BOSS成功上位"
)
self.assertEqual(site.resource.item.author[0], "桉柏")
class YpshuoTestCase(TestCase):
databases = "__all__"

View file

@ -53,6 +53,7 @@ class SiteName(models.TextChoices):
Qidian = "qidian", _("Qidian") # type:ignore[reportCallIssue]
Ypshuo = "ypshuo", _("Ypshuo") # type:ignore[reportCallIssue]
AO3 = "ao3", _("Archive of Our Own") # type:ignore[reportCallIssue]
JJWXC = "jjwxc", _("JinJiang") # type:ignore[reportCallIssue]
class IdType(models.TextChoices):
@ -117,6 +118,7 @@ class IdType(models.TextChoices):
Qidian = "qidian", _("Qidian") # type:ignore[reportCallIssue]
Ypshuo = "ypshuo", _("Ypshuo") # type:ignore[reportCallIssue]
AO3 = "ao3", _("Archive of Our Own") # type:ignore[reportCallIssue]
JJWXC = "jjwxc", _("JinJiang") # type:ignore[reportCallIssue]
IdealIdTypes = [

View file

@ -16,6 +16,7 @@ from .goodreads import Goodreads
from .google_books import GoogleBooks
from .igdb import IGDB
from .imdb import IMDB
from .jjwxc import JJWXC
from .qidian import Qidian
from .rss import RSS
from .spotify import Spotify

39
catalog/sites/jjwxc.py Normal file
View file

@ -0,0 +1,39 @@
import html
from catalog.common import *
from catalog.models import *
@SiteManager.register
class JJWXC(AbstractSite):
SITE_NAME = SiteName.JJWXC
ID_TYPE = IdType.JJWXC
URL_PATTERNS = [
r"https://www\.jjwxc\.net/onebook\.php\?novelid=(\d+)",
]
WIKI_PROPERTY_ID = ""
DEFAULT_MODEL = Edition
@classmethod
def id_to_url(cls, id_value):
return f"https://www.jjwxc.net/onebook.php?novelid={id_value}"
def scrape(self):
api_url = (
f"https://app.jjwxc.net/androidapi/novelbasicinfo?novelId={self.id_value}"
)
o = BasicDownloader(api_url).download().json()
return ResourceContent(
metadata={
"localized_title": [{"lang": "zh-cn", "text": o["novelName"]}],
"author": [o["authorName"]],
"format": Edition.BookFormat.WEB,
"localized_description": [
{
"lang": "zh-cn",
"text": html.unescape(o["novelIntro"]).replace("<br/>", "\n"),
}
],
"cover_image_url": o["novelCover"],
},
)

View file

@ -24,8 +24,14 @@ class Ypshuo(AbstractSite):
source = json.loads(o["data"]["source"])
lookup_ids = {}
for site in source:
if site["siteName"] == "起点中文网":
lookup_ids[IdType.Qidian] = site["bookId"]
match site["siteName"]:
case "起点中文网":
lookup_ids[IdType.Qidian] = site["bookId"]
case "晋江文学城":
lookup_ids[IdType.JJWXC] = site["bookPage"].rsplit("=", maxsplit=1)[
-1
]
return ResourceContent(
metadata={
"localized_title": [{"lang": "zh-cn", "text": o["data"]["novel_name"]}],

View file

@ -30,6 +30,12 @@
background-color: #9e252b;
}
.jjwxc {
border: none;
color: white;
background-color: #3c812e;
}
.douban {
border: none;
color: white;

File diff suppressed because one or more lines are too long