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

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 

7 

8 

9class EndpointType(str, Enum): 

10 PATH = "path" 

11 QUERY = "query" 

12 COMBINED = "path+query" 

13 

14 

15class ViewType(str, Enum): 

16 ANIME = "anime" 

17 DRAMA = "drama" 

18 MOVIE = "movie" 

19 

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 } 

27 

28 return marks[self] 

29 

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 } 

37 

38 return clips[self] 

39 

40 

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", "配給:") 

50 

51 @property 

52 def key(self) -> str: 

53 return self.value[0] 

54 

55 @property 

56 def title(self) -> str: 

57 return self.value[1] 

58 

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 } 

67 

68 

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", "出演者") 

85 

86 @property 

87 def key(self) -> str: 

88 return self.value[0] 

89 

90 @property 

91 def title(self) -> str: 

92 return self.value[1] 

93 

94 

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 } 

101 

102 @staticmethod 

103 def get_scrape_date() -> datetime: 

104 return datetime.now(timezone.utc).isoformat(sep=" ", timespec="microseconds") 

105 

106 @staticmethod 

107 def create_filmarks_link(url: str) -> str: 

108 return urljoin(base=Utils.FILMARKS_BASE, url=url) 

109 

110 @staticmethod 

111 def create_other_info(name: str, link: str) -> Dict[str, Any]: 

112 other_info = {} 

113 

114 other_info["name"] = name 

115 other_info["id"] = int(link.split("/")[-1]) 

116 other_info["link"] = Utils.create_filmarks_link(link) 

117 

118 return other_info 

119 

120 @staticmethod 

121 def create_person_info(name: str, link: str, character: str = "") -> Dict[str, Any]: 

122 person_info = {} 

123 

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) 

129 

130 return person_info 

131 

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 = {} 

135 

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 

141 

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 

151 

152 return review_info