1+ # 06-06-2025 By @FrancescoGrazioso -> "https://github.com/FrancescoGrazioso"
2+
3+
4+ import importlib
5+ from typing import List , Optional
6+
7+
8+ # Internal utilities
9+ from .base import BaseStreamingAPI , MediaItem , Season , Episode
10+
11+
12+ # External utilities
13+ from StreamingCommunity .Util .config_json import config_manager
14+ from StreamingCommunity .Api .Site .animeunity .util .ScrapeSerie import ScrapeSerieAnime
15+
16+
17+
18+ class AnimeUnityAPI (BaseStreamingAPI ):
19+ def __init__ (self ):
20+ super ().__init__ ()
21+ self .site_name = "animeunity"
22+ self ._load_config ()
23+ self ._search_fn = None
24+
25+ def _load_config (self ):
26+ """Load site configuration."""
27+ self .base_url = (config_manager .get_site ("animeunity" , "full_url" ) or "" ).rstrip ("/" )
28+
29+ def _get_search_fn (self ):
30+ """Lazy load the search function."""
31+ if self ._search_fn is None :
32+ module = importlib .import_module ("StreamingCommunity.Api.Site.animeunity" )
33+ self ._search_fn = getattr (module , "search" )
34+ return self ._search_fn
35+
36+ def search (self , query : str ) -> List [MediaItem ]:
37+ """
38+ Search for content on AnimeUnity.
39+
40+ Args:
41+ query: Search term
42+
43+ Returns:
44+ List of MediaItem objects
45+ """
46+ try :
47+ search_fn = self ._get_search_fn ()
48+ database = search_fn (query , get_onlyDatabase = True )
49+
50+ results = []
51+ if database and hasattr (database , 'media_list' ):
52+ for element in database .media_list :
53+ item_dict = element .__dict__ .copy () if hasattr (element , '__dict__' ) else {}
54+
55+ media_item = MediaItem (
56+ id = item_dict .get ('id' ),
57+ title = item_dict .get ('name' ),
58+ slug = item_dict .get ('slug' , '' ),
59+ type = item_dict .get ('type' ),
60+ url = item_dict .get ('url' ),
61+ poster = item_dict .get ('image' ),
62+ raw_data = item_dict
63+ )
64+ results .append (media_item )
65+
66+ return results
67+
68+ except Exception as e :
69+ raise Exception (f"AnimeUnity search error: { e } " )
70+
71+ def get_series_metadata (self , media_item : MediaItem ) -> Optional [List [Season ]]:
72+ """
73+ Get seasons and episodes for an AnimeUnity series.
74+ Note: AnimeUnity typically has single season anime.
75+
76+ Args:
77+ media_item: MediaItem to get metadata for
78+
79+ Returns:
80+ List of Season objects (usually one season), or None if not a series
81+ """
82+ # Check if it's a movie or OVA
83+ if media_item .is_movie :
84+ return None
85+
86+ try :
87+ scraper = ScrapeSerieAnime (self .base_url )
88+ scraper .setup (series_name = media_item .slug , media_id = media_item .id )
89+
90+ episodes_count = scraper .get_count_episodes ()
91+ if not episodes_count :
92+ return None
93+
94+ # AnimeUnity typically has single season
95+ episodes = []
96+ for ep_num in range (1 , episodes_count + 1 ):
97+ episode = Episode (
98+ number = ep_num ,
99+ name = f"Episodio { ep_num } " ,
100+ id = ep_num
101+ )
102+ episodes .append (episode )
103+
104+ season = Season (number = 1 , episodes = episodes )
105+ return [season ]
106+
107+ except Exception as e :
108+ raise Exception (f"Error getting series metadata: { e } " )
109+
110+ def start_download (self , media_item : MediaItem , season : Optional [str ] = None , episodes : Optional [str ] = None ) -> bool :
111+ """
112+ Start downloading from AnimeUnity.
113+
114+ Args:
115+ media_item: MediaItem to download
116+ season: Season number (typically 1 for anime)
117+ episodes: Episode selection
118+
119+ Returns:
120+ True if download started successfully
121+ """
122+ try :
123+ search_fn = self ._get_search_fn ()
124+
125+ # Prepare direct_item from MediaItem
126+ direct_item = media_item .raw_data or media_item .to_dict ()
127+
128+ # For AnimeUnity, we only use episode selection
129+ selections = None
130+ if episodes :
131+ selections = {'episode' : episodes }
132+
133+ elif not media_item .is_movie :
134+ # Default: download all episodes
135+ selections = {'episode' : '*' }
136+
137+ # Execute download
138+ search_fn (direct_item = direct_item , selections = selections )
139+ return True
140+
141+ except Exception as e :
142+ raise Exception (f"Download error: { e } " )
0 commit comments