from dataclasses import dataclass, field
import json
from typing import List, Optional
class CountryLanguage:
CHINA = "zh"
USA = "en"
JAPAN = "ja"
MIN_YEAR = 1900
MAX_YEAR = 3000
MIN_RATE:float = 0
MAX_RATE:float = 10
MIN_RUNTIME = 0
MAX_RUNTIME = 10_000
@dataclass
class QueryCondition:
title: str = field(default_factory=str)
imdb_id: Optional[str] = None
douban_id: Optional[str] = None
director: List[str] = field(default_factory=list)
actors: List[str] = field(default_factory=list)
cinematographer: List[str] = field(default_factory=list)
composer: List[str] = field(default_factory=list)
tags: List[str] = field(default_factory=list)
genres: List[str] = field(default_factory=list)
start_year: Optional[int] = None
end_year: Optional[int] = None
min_rating: Optional[float] = None
max_rating: Optional[float] = None
min_runtime: Optional[int] = None
max_runtime: Optional[int] = None
country_language: Optional[CountryLanguage] = None
@classmethod
def from_json(cls, json_string: str) -> 'QueryCondition':
try:
data = json.loads(json_string)
except json.JSONDecodeError as e:
raise ValueError(f"无法解析 JSON 字符串: {e}")
if not data.get("title") and not data.get("imdb_id") and not data.get("douban_id"):
raise ValueError("查询条件必须包含 'title', 'imdb_id' 或 'douban_id' 中的至少一个")
start_year = data.get("start_year")
end_year = data.get("end_year")
if start_year is not None and start_year < MIN_YEAR:
raise ValueError(f"起始年份 {start_year} 小于最小年份 {MIN_YEAR}")
if end_year is not None and end_year > MAX_YEAR:
raise ValueError(f"终止年份 {end_year} 大于最大年份 {MAX_YEAR}")
if start_year is not None and end_year is not None and start_year > end_year:
raise ValueError(f"起始年份 {start_year} 不能大于终止年份 {end_year}")
min_rating = data.get("min_rating")
max_rating = data.get("max_rating")
if min_rating is not None and min_rating < MIN_RATE:
raise ValueError(f"最低评分 {start_year} 小于 {MIN_RATE}")
if max_rating is not None and max_rating > MAX_RATE:
raise ValueError(f"最高评分 {end_year} 大于 {MAX_RATE}")
if min_rating is not None and max_rating is not None and min_rating > max_rating:
raise ValueError(f"最低评分 {min_rating} 不能大于最高评分 {max_rating}。")
min_runtime = data.get("min_runtime")
max_runtime = data.get("max_runtime")
if min_runtime is not None and min_runtime < MIN_RUNTIME:
raise ValueError(f"最短片长 {min_runtime} 不能短于 {MIN_RUNTIME}。")
if max_runtime is not None and max_runtime > MAX_RUNTIME:
raise ValueError(f"最长片长 {max_runtime} 不能长于 {MAX_RUNTIME}。")
if min_runtime is not None and max_runtime is not None and min_runtime > max_runtime:
raise ValueError(f"最短片长 {min_runtime} 不能长于最长片长 {max_runtime}。")
country_language_str = data.get("country_language")
if country_language_str:
try:
data["country_language"] = getattr(CountryLanguage, country_language_str.upper())
except AttributeError:
raise ValueError(f"无效的国家/语言代码: '{country_language_str}'。")
return cls(**data)
def main():
print("Hello from pywork!")
if __name__ == "__main__":
main()