Coverage for src\utility\utils.py: 100%
105 statements
« prev ^ index » next coverage.py v7.10.1, created at 2025-10-19 21:13 +0800
« prev ^ index » next coverage.py v7.10.1, created at 2025-10-19 21:13 +0800
1from datetime import datetime, timezone
2from enum import Enum
3from msgspec import Struct
4from src.utility.models import AnimeDataClip, AnimeDataMark, DramaDataClip, DramaDataMark, MovieDataClip, MovieDataMark
5from typing import Any, Dict, Set, Tuple
6from urllib.parse import urljoin
9class EndpointType(str, Enum):
10 PATH = "path"
11 QUERY = "query"
12 COMBINED = "path+query"
15class ViewType(str, Enum):
16 ANIME = "anime"
17 DRAMA = "drama"
18 MOVIE = "movie"
20 @property
21 def mark(self) -> Struct:
22 marks: Dict[ViewType, Struct] = {
23 ViewType.ANIME: AnimeDataMark,
24 ViewType.DRAMA: DramaDataMark,
25 ViewType.MOVIE: MovieDataMark,
26 }
28 return marks[self]
30 @property
31 def clip(self) -> Struct:
32 clips: Dict[ViewType, Struct] = {
33 ViewType.ANIME: AnimeDataClip,
34 ViewType.DRAMA: DramaDataClip,
35 ViewType.MOVIE: MovieDataClip,
36 }
38 return clips[self]
41class OtherInfo(Tuple[str, str], Enum):
42 RELEASE_DATE = ("release_date", "公開日:")
43 SCREENING_DATE = ("screening_date", "上映日:")
44 PLAYBACK_TIME = ("playback_time", "再生時間:")
45 SCREENING_TIME = ("screening_time", "上映時間:")
46 COUNTRY_OF_ORIGIN = ("country_of_origin", "製作国・地域:")
47 PRODUCTION_COMPANY = ("production_company", "制作会社:")
48 GENRE = ("genre", "ジャンル:")
49 DISTRIBUTOR = ("distributor", "配給:")
51 @property
52 def key(self) -> str:
53 return self.value[0]
55 @property
56 def title(self) -> str:
57 return self.value[1]
59 @classmethod
60 def single_fields(cls) -> Set[Tuple[str, str]]:
61 return {
62 cls.RELEASE_DATE,
63 cls.SCREENING_DATE,
64 cls.PLAYBACK_TIME,
65 cls.SCREENING_TIME,
66 }
69class PersonInfo(Tuple[str, str], Enum):
70 CREATOR = ("creator", "原作")
71 PLANNER = ("planner", "企画")
72 PRODUCER_1 = ("producer", "制作")
73 PRODUCER_2 = ("producer", "製作")
74 EXECUTIVE_PRODUCER_1 = ("executive_producer", "制作総指揮")
75 EXECUTIVE_PRODUCER_2 = ("executive_producer", "製作総指揮")
76 CHIEF_DIRECTOR = ("chief_director", "総監督")
77 DIRECTOR = ("director", "監督")
78 SERIES_COMPOSER = ("series_composer", "シリーズ構成")
79 SCRIPTWRITER = ("scriptwriter", "脚本")
80 CHARACTER_ORIGINAL_DESIGNER = ("character_original_designer", "キャラクター原案")
81 CHARACTER_DESIGNER = ("character_designer", "キャラクターデザイン")
82 NARRATOR = ("narrator", "ナレーション")
83 ARTIST = ("artist", "主題歌/挿入歌")
84 CAST = ("cast", "出演者")
86 @property
87 def key(self) -> str:
88 return self.value[0]
90 @property
91 def title(self) -> str:
92 return self.value[1]
95class Utils:
96 FILMARKS_BASE = "https://filmarks.com/"
97 FILMARKS_REQUEST_HEADERS = {
98 "Referer": FILMARKS_BASE,
99 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36",
100 }
102 @staticmethod
103 def get_scrape_date() -> datetime:
104 return datetime.now(timezone.utc).isoformat(sep=" ", timespec="microseconds")
106 @staticmethod
107 def create_filmarks_link(url: str) -> str:
108 return urljoin(base=Utils.FILMARKS_BASE, url=url)
110 @staticmethod
111 def create_other_info(name: str, link: str) -> Dict[str, Any]:
112 other_info = {}
114 other_info["name"] = name
115 other_info["id"] = int(link.split("/")[-1])
116 other_info["link"] = Utils.create_filmarks_link(link)
118 return other_info
120 @staticmethod
121 def create_person_info(name: str, link: str, character: str = "") -> Dict[str, Any]:
122 person_info = {}
124 person_info["name"] = name
125 if character:
126 person_info["character"] = character
127 person_info["id"] = int(link.split("/")[-1])
128 person_info["link"] = Utils.create_filmarks_link(link)
130 return person_info
132 @staticmethod
133 def create_review_info(user_name: str, user_link: str, review_date: str, review_rating: str, review_contents: str = "", review_link: str = "") -> Dict[str, Any]:
134 review_info = {}
136 user = {}
137 user["name"] = user_name
138 user["id"] = user_link.split("/")[-1]
139 user["link"] = Utils.create_filmarks_link(user_link)
140 review_info["user"] = user
142 review = {}
143 review["date"] = review_date
144 review["rating"] = review_rating
145 if review_contents:
146 review["contents"] = review_contents
147 if review_link:
148 review["id"] = int(review_link.split("/")[-1])
149 review["link"] = Utils.create_filmarks_link(review_link)
150 review_info["review"] = review
152 return review_info