55
66class JmBaseEntity :
77
8- @staticmethod
9- def fix_title (title : str , limit = 50 ):
10- """
11- 一些过长的标题可能含有 \n ,例如album: 360537
12- 该方法会把 \n 去除
13- """
14- if len (title ) > limit and '\n ' in title :
15- title = title .replace ('\n ' , '' )
16-
17- return title .strip ()
18-
198 def save_to_file (self , filepath ):
209 from common import PackerUtil
2110 PackerUtil .pack (self , filepath )
2211
2312
24- class DetailEntity (JmBaseEntity ):
25-
26- @property
27- def id (self ) -> str :
28- raise NotImplementedError
29-
30- @property
31- def name (self ) -> str :
32- return getattr (self , 'title' )
33-
34- # help for typing
35- JMPI = Union ['JmPhotoDetail' , 'JmImageDetail' ]
36-
37- def getindex (self , index : int ) -> JMPI :
13+ class IndexedEntity :
14+ def getindex (self , index : int ):
3815 raise NotImplementedError
3916
4017 def __len__ (self ):
4118 raise NotImplementedError
4219
43- def __iter__ (self ) -> Generator [JMPI , Any , None ]:
44- for index in range (len (self )):
45- yield self .getindex (index )
46-
47- def __str__ (self ):
48- return f'{ self .__class__ .__name__ } ({ self .id } -{ self .name } )'
49-
50- def __getitem__ (self , item ) -> Union [JMPI , List [JMPI ]]:
20+ def __getitem__ (self , item ) -> Any :
5121 if isinstance (item , slice ):
5222 start = item .start or 0
5323 stop = item .stop or len (self )
@@ -60,6 +30,24 @@ def __getitem__(self, item) -> Union[JMPI, List[JMPI]]:
6030 else :
6131 raise TypeError (f"Invalid item type for { self .__class__ } " )
6232
33+ def __iter__ (self ):
34+ for index in range (len (self )):
35+ yield self .getindex (index )
36+
37+
38+ class DetailEntity (JmBaseEntity , IndexedEntity ):
39+
40+ @property
41+ def id (self ) -> str :
42+ raise NotImplementedError
43+
44+ @property
45+ def name (self ) -> str :
46+ return getattr (self , 'title' )
47+
48+ def __str__ (self ):
49+ return f'{ self .__class__ .__name__ } ({ self .id } -{ self .name } )'
50+
6351 @classmethod
6452 def __alias__ (cls ):
6553 # "JmAlbumDetail" -> "album" (本子)
@@ -163,7 +151,7 @@ def __init__(self,
163151 ):
164152 self .photo_id : str = photo_id
165153 self .scramble_id : str = scramble_id
166- self .title : str = self . fix_title ( str (title ))
154+ self .title : str = str (title ). strip ( )
167155 self .sort : int = int (sort )
168156 self ._keywords : str = keywords
169157 self ._series_id : int = int (series_id )
@@ -290,7 +278,7 @@ def __getitem__(self, item) -> Union[JmImageDetail, List[JmImageDetail]]:
290278 def __len__ (self ):
291279 return len (self .page_arr )
292280
293- def __iter__ (self ) -> Generator [JmImageDetail , Any , None ]:
281+ def __iter__ (self ) -> Generator [JmImageDetail , None , None ]:
294282 return super ().__iter__ ()
295283
296284
@@ -418,39 +406,71 @@ def __getitem__(self, item) -> Union[JmPhotoDetail, List[JmPhotoDetail]]:
418406 def __len__ (self ):
419407 return len (self .episode_list )
420408
421- def __iter__ (self ) -> Generator [JmPhotoDetail , Any , None ]:
409+ def __iter__ (self ) -> Generator [JmPhotoDetail , None , None ]:
422410 return super ().__iter__ ()
423411
424412
425- class JmSearchPage (JmBaseEntity ):
413+ class JmSearchPage (JmBaseEntity , IndexedEntity ):
414+ ContentItem = Tuple [str , Dict [str , Any ]]
426415
427- def __init__ (self , album_info_list : List [Tuple [str , str , StrNone , StrNone , List [str ]]]):
428- # (album_id, title, category_none, label_sub_none, tag_list)
429- self .album_info_list = album_info_list
416+ def __init__ (self , content : List [ContentItem ]):
417+ # [
418+ # album_id, {title, tag_list, ...}
419+ # ]
420+ self .content = content
430421
431- def __len__ (self ):
432- return len (self .album_info_list )
422+ def iter_id (self ) -> Generator [str , None , None ]:
423+ """
424+ 返回 album_id 的迭代器
425+ """
426+ for aid , ainfo in self .content :
427+ yield aid
428+
429+ def iter_id_title (self ) -> Generator [Tuple [str , str ], None , None ]:
430+ """
431+ 返回 album_id, album_title 的迭代器
432+ """
433+ for aid , ainfo in self .content :
434+ yield aid , ainfo ['name' ]
433435
434- def __getitem__ (self , item ) -> Tuple [str , str ]:
435- return self .album_info_list [item ][0 :2 ]
436+ def iter_id_title_tag (self ) -> Generator [Tuple [str , str , List [str ]], None , None ]:
437+ """
438+ 返回 album_id, album_title, album_tag_list 的迭代器
439+ """
440+ for aid , ainfo in self .content :
441+ yield aid , ainfo ['name' ], ainfo ['tag_list' ]
442+
443+ # 下面的方法是对单个album的包装
444+
445+ @property
446+ def is_single_album (self ):
447+ return hasattr (self , 'album' )
436448
437449 @property
438450 def single_album (self ) -> JmAlbumDetail :
439451 return getattr (self , 'album' )
440452
441453 @classmethod
442454 def wrap_single_album (cls , album : JmAlbumDetail ) -> 'JmSearchPage' :
443- # ('462257', '[無邪気漢化組] [きょくちょ] 楓と鈴 4.5', '短篇', '漢化', [])
444- # (album_id, title, category_none, label_sub_none, tag_list)
445-
446- album_info = (
447- album .album_id ,
448- album .title ,
449- None ,
450- None ,
451- album .tag_list ,
452- )
453- obj = JmSearchPage ([album_info ])
454-
455+ obj = JmSearchPage ([(
456+ album .album_id , {
457+ 'name' : album .title ,
458+ 'tag_list' : album .tag_list ,
459+ }
460+ )])
455461 setattr (obj , 'album' , album )
456462 return obj
463+
464+ # 下面的方法实现方便的元素访问
465+
466+ def __len__ (self ):
467+ return len (self .content )
468+
469+ def __iter__ (self ):
470+ return self .iter_id_title ()
471+
472+ def __getitem__ (self , item ) -> Union [ContentItem , List [ContentItem ]]:
473+ return super ().__getitem__ (item )
474+
475+ def getindex (self , index : int ):
476+ return self .content [index ]
0 commit comments