From a12713cccbae8825cfaaf540f10191cc8c12add4 Mon Sep 17 00:00:00 2001
From: Your Name
Date: Wed, 19 Jul 2023 11:12:58 -0400
Subject: [PATCH] support additional douban url format
---
catalog/performance/tests.py | 5 +++
catalog/sites/douban_book.py | 10 +++--
catalog/sites/douban_drama.py | 16 +++++---
catalog/sites/douban_game.py | 11 ++++--
catalog/sites/douban_movie.py | 13 ++++---
catalog/sites/douban_music.py | 9 +++--
common/templates/_sidebar_anonymous.html | 2 +-
journal/models.py | 49 ++++++++++++------------
8 files changed, 69 insertions(+), 46 deletions(-)
diff --git a/catalog/performance/tests.py b/catalog/performance/tests.py
index df1737bb..fdb2d02f 100644
--- a/catalog/performance/tests.py
+++ b/catalog/performance/tests.py
@@ -1,4 +1,5 @@
from django.test import TestCase
+
from catalog.common import *
from catalog.common.sites import crawl_related_resources_task
@@ -10,6 +11,9 @@ class DoubanDramaTestCase(TestCase):
def test_parse(self):
t_id = "24849279"
t_url = "https://www.douban.com/location/drama/24849279/"
+ t_url2 = (
+ "https://www.douban.com/doubanapp/dispatch?uri=/drama/24849279/&dt_dapp=1"
+ )
p1 = SiteManager.get_site_cls_by_id_type(IdType.DoubanDrama)
self.assertIsNotNone(p1)
p1 = SiteManager.get_site_by_url(t_url)
@@ -17,6 +21,7 @@ class DoubanDramaTestCase(TestCase):
self.assertEqual(p1.validate_url(t_url), True)
self.assertEqual(p1.id_to_url(t_id), t_url)
self.assertEqual(p1.url_to_id(t_url), t_id)
+ self.assertEqual(p1.url_to_id(t_url2), t_id)
@use_local_response
def test_scrape(self):
diff --git a/catalog/sites/douban_book.py b/catalog/sites/douban_book.py
index 3e6151a8..054292d6 100644
--- a/catalog/sites/douban_book.py
+++ b/catalog/sites/douban_book.py
@@ -1,9 +1,10 @@
-from catalog.common import *
-from .douban import *
-from catalog.book.models import *
-from catalog.book.utils import *
import logging
+from catalog.book.models import *
+from catalog.book.utils import *
+from catalog.common import *
+
+from .douban import *
_logger = logging.getLogger(__name__)
@@ -15,6 +16,7 @@ class DoubanBook(AbstractSite):
URL_PATTERNS = [
r"\w+://book\.douban\.com/subject/(\d+)/{0,1}",
r"\w+://m.douban.com/book/subject/(\d+)/{0,1}",
+ r"\w+://www.douban.com/doubanapp/dispatch\?uri=/book/(\d+)/",
]
WIKI_PROPERTY_ID = "?"
DEFAULT_MODEL = Edition
diff --git a/catalog/sites/douban_drama.py b/catalog/sites/douban_drama.py
index d59319ef..2f9bec0a 100644
--- a/catalog/sites/douban_drama.py
+++ b/catalog/sites/douban_drama.py
@@ -1,10 +1,13 @@
+import logging
+import re
+
+from django.core.cache import cache
+from lxml import html
+
from catalog.common import *
from catalog.models import *
+
from .douban import DoubanDownloader
-import logging
-from lxml import html
-from django.core.cache import cache
-import re
_logger = logging.getLogger(__name__)
@@ -112,7 +115,10 @@ class DoubanDramaVersion(AbstractSite):
class DoubanDrama(AbstractSite):
SITE_NAME = SiteName.Douban
ID_TYPE = IdType.DoubanDrama
- URL_PATTERNS = [r"\w+://www.douban.com/location/drama/(\d+)/[^#]*$"]
+ URL_PATTERNS = [
+ r"\w+://www.douban.com/location/drama/(\d+)/[^#]*$",
+ r"\w+://www.douban.com/doubanapp/dispatch\?uri=/drama/(\d+)/",
+ ]
WIKI_PROPERTY_ID = "P6443"
DEFAULT_MODEL = Performance
diff --git a/catalog/sites/douban_game.py b/catalog/sites/douban_game.py
index d639cdd4..c511b026 100644
--- a/catalog/sites/douban_game.py
+++ b/catalog/sites/douban_game.py
@@ -1,9 +1,11 @@
-from catalog.common import *
-from catalog.models import *
-from .douban import DoubanDownloader
-import dateparser
import logging
+import dateparser
+
+from catalog.common import *
+from catalog.models import *
+
+from .douban import DoubanDownloader
_logger = logging.getLogger(__name__)
@@ -15,6 +17,7 @@ class DoubanGame(AbstractSite):
URL_PATTERNS = [
r"\w+://www\.douban\.com/game/(\d+)/{0,1}",
r"\w+://m.douban.com/game/subject/(\d+)/{0,1}",
+ r"\w+://www.douban.com/doubanapp/dispatch\?uri=/game/(\d+)/",
]
WIKI_PROPERTY_ID = ""
DEFAULT_MODEL = Game
diff --git a/catalog/sites/douban_movie.py b/catalog/sites/douban_movie.py
index 21446d9d..0e28e5d3 100644
--- a/catalog/sites/douban_movie.py
+++ b/catalog/sites/douban_movie.py
@@ -1,12 +1,14 @@
+import json
+import logging
+
+from django.utils.translation import gettext_lazy as _
+
from catalog.common import *
-from .douban import *
from catalog.movie.models import *
from catalog.tv.models import *
-import logging
-import json
-from django.utils.translation import gettext_lazy as _
-from .tmdb import TMDB_TV, TMDB_TVSeason, search_tmdb_by_imdb_id, query_tmdb_tv_episode
+from .douban import *
+from .tmdb import TMDB_TV, TMDB_TVSeason, query_tmdb_tv_episode, search_tmdb_by_imdb_id
_logger = logging.getLogger(__name__)
@@ -18,6 +20,7 @@ class DoubanMovie(AbstractSite):
URL_PATTERNS = [
r"\w+://movie\.douban\.com/subject/(\d+)/{0,1}",
r"\w+://m.douban.com/movie/subject/(\d+)/{0,1}",
+ r"\w+://www.douban.com/doubanapp/dispatch\?uri=/movie/(\d+)/",
]
WIKI_PROPERTY_ID = "?"
# no DEFAULT_MODEL as it may be either TV Season and Movie
diff --git a/catalog/sites/douban_music.py b/catalog/sites/douban_music.py
index 1599cacd..e692f630 100644
--- a/catalog/sites/douban_music.py
+++ b/catalog/sites/douban_music.py
@@ -1,10 +1,12 @@
+import logging
+
+import dateparser
+
from catalog.common import *
from catalog.models import *
from catalog.music.utils import upc_to_gtin_13
-from .douban import DoubanDownloader
-import dateparser
-import logging
+from .douban import DoubanDownloader
_logger = logging.getLogger(__name__)
@@ -16,6 +18,7 @@ class DoubanMusic(AbstractSite):
URL_PATTERNS = [
r"\w+://music\.douban\.com/subject/(\d+)/{0,1}",
r"\w+://m.douban.com/music/subject/(\d+)/{0,1}",
+ r"\w+://www.douban.com/doubanapp/dispatch\?uri=/music/(\d+)/",
]
WIKI_PROPERTY_ID = ""
DEFAULT_MODEL = Album
diff --git a/common/templates/_sidebar_anonymous.html b/common/templates/_sidebar_anonymous.html
index 9bd6b684..ded99378 100644
--- a/common/templates/_sidebar_anonymous.html
+++ b/common/templates/_sidebar_anonymous.html
@@ -18,7 +18,7 @@
登录{{ site_name }}的最佳方式通过联邦宇宙(Fediverse,有时也被称为长毛象,一种分布式社交网络)实例账号,如果你还没有注册过,可先选择实例并注册。
- 如果还没准备好注册联邦宇宙也没问题,你可以在登录页面选择电子邮件注册,未来再连接到联邦宇宙。
+ 如果还没准备好注册联邦宇宙也没问题,你可以在登录页面选择电子邮件注册,未来再连接到联邦宇宙。
如果有任何问题或建议,欢迎通过联邦宇宙或Discord和我们联系。
diff --git a/journal/models.py b/journal/models.py
index 6deb3993..c6b4917f 100644
--- a/journal/models.py
+++ b/journal/models.py
@@ -1,30 +1,30 @@
-from django.db import models
+import re
+import uuid
+from functools import cached_property
+
+import django.dispatch
+from django.conf import settings
+from django.contrib.contenttypes.models import ContentType
+from django.core.exceptions import PermissionDenied
+from django.core.validators import MaxValueValidator, MinValueValidator, RegexValidator
+from django.db import connection, models
+from django.db.models import Avg, Count, Q
+from django.utils import timezone
+from django.utils.baseconv import base62
+from django.utils.translation import gettext_lazy as _
+from markdownx.models import MarkdownxField
from polymorphic.models import PolymorphicModel
+
+from catalog.collection.models import Collection as CatalogCollection
+from catalog.common import jsondata
+from catalog.common.models import Item, ItemCategory
+from catalog.common.utils import DEFAULT_ITEM_COVER, piece_cover_path
+from catalog.models import *
from mastodon.api import share_review
from users.models import User
-from catalog.common.models import Item, ItemCategory
+
from .mixins import UserOwnedObjectMixin
-from catalog.collection.models import Collection as CatalogCollection
-from markdownx.models import MarkdownxField
-from django.utils import timezone
-from django.conf import settings
-from django.core.validators import MaxValueValidator, MinValueValidator
-from django.utils.translation import gettext_lazy as _
-from django.core.validators import RegexValidator
-from functools import cached_property
-from django.db.models import Count, Avg
-from django.contrib.contenttypes.models import ContentType
-import django.dispatch
-import uuid
-import re
-from catalog.common.utils import DEFAULT_ITEM_COVER, piece_cover_path
-from django.utils.baseconv import base62
-from django.db.models import Q
-from catalog.models import *
from .renderers import render_md, render_text
-from catalog.common import jsondata
-from django.db import connection
-from django.core.exceptions import PermissionDenied
_logger = logging.getLogger(__name__)
@@ -703,7 +703,7 @@ class ShelfManager:
for qt in ShelfType:
self.shelf_list[qt] = Shelf.objects.create(owner=self.owner, shelf_type=qt)
- def locate_item(self, item) -> ShelfMember:
+ def locate_item(self, item) -> ShelfMember | None:
return ShelfMember.objects.filter(item=item, owner=self.owner).first()
def move_item(self, item, shelf_type, visibility=0, metadata=None):
@@ -1020,7 +1020,8 @@ class TagManager:
tag.append_item(item, visibility=default_visibility)
for title in current_titles - titles:
tag = Tag.objects.filter(owner=user, title=title).first()
- tag.remove_item(item)
+ if tag:
+ tag.remove_item(item)
@staticmethod
def get_item_tags_by_user(item, user):