11import base64
2+ from typing import List
23
4+ from auto_archiver .core import Media , Metadata
35from fastapi .encoders import jsonable_encoder
6+ from loguru import logger
7+
8+ from app .shared .db import models
49
510
611def custom_jsonable_encoder (obj ):
@@ -14,3 +19,44 @@ def convert_priority_to_queue_dict(priority: str) -> dict:
1419 "priority" : 0 if priority == "high" else 10 ,
1520 "queue" : f"{ priority } _priority" ,
1621 }
22+
23+
24+ def convert_if_media (media ):
25+ if isinstance (media , Media ):
26+ return media
27+ elif isinstance (media , dict ):
28+ try :
29+ return Media .from_dict (media )
30+ except Exception as e :
31+ logger .debug (f"error parsing { media } : { e } " )
32+ return False
33+
34+
35+ def get_all_urls (result : Metadata ) -> List [models .ArchiveUrl ]:
36+ db_urls = []
37+ for m in result .media :
38+ for i , url in enumerate (m .urls ):
39+ db_urls .append (
40+ models .ArchiveUrl (url = url , key = m .get ("id" , f"media_{ i } " ))
41+ )
42+ for k , prop in m .properties .items ():
43+ if prop_converted := convert_if_media (prop ):
44+ for i , url in enumerate (prop_converted .urls ):
45+ db_urls .append (
46+ models .ArchiveUrl (
47+ url = url , key = prop_converted .get ("id" , f"{ k } _{ i } " )
48+ )
49+ )
50+ if isinstance (prop , list ):
51+ for i , prop_media in enumerate (prop ):
52+ if prop_media := convert_if_media (prop_media ):
53+ for j , url in enumerate (prop_media .urls ):
54+ db_urls .append (
55+ models .ArchiveUrl (
56+ url = url ,
57+ key = prop_media .get (
58+ "id" , f"{ k } { prop_media .key } _{ i } .{ j } "
59+ ),
60+ )
61+ )
62+ return db_urls
0 commit comments