1
1
import base64
2
+ from typing import List
2
3
4
+ from auto_archiver .core import Media , Metadata
3
5
from fastapi .encoders import jsonable_encoder
6
+ from loguru import logger
7
+
8
+ from app .shared .db import models
4
9
5
10
6
11
def custom_jsonable_encoder (obj ):
@@ -14,3 +19,44 @@ def convert_priority_to_queue_dict(priority: str) -> dict:
14
19
"priority" : 0 if priority == "high" else 10 ,
15
20
"queue" : f"{ priority } _priority" ,
16
21
}
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