@@ -20,45 +20,73 @@ def fetch_releases(user=None, items_to_process=None):
20
20
if items_to_process and items_to_process [0 ].source == Sources .MANUAL .value :
21
21
return "Manual sources are not processed"
22
22
23
- if not items_to_process :
24
- items_to_process = get_items_to_process (user )
25
-
23
+ items_to_process = items_to_process or get_items_to_process (user )
26
24
if not items_to_process :
27
25
return "No items to process"
28
26
27
+ events_bulk , skipped_items = process_items (items_to_process )
28
+ save_events (events_bulk )
29
+ cleanup_invalid_events (events_bulk )
30
+
31
+ return generate_final_message (items_to_process , skipped_items )
32
+
33
+
34
+ def process_items (items_to_process ):
35
+ """Process items and categorize them."""
29
36
events_bulk = []
30
37
anime_to_process = []
38
+ skipped_items = []
31
39
32
40
for item in items_to_process :
33
- # anime can later be processed in bulk
34
41
if item .media_type == MediaTypes .ANIME .value :
35
42
anime_to_process .append (item )
36
43
elif item .media_type == MediaTypes .TV .value :
37
- process_tv (item , events_bulk )
44
+ process_tv (item , events_bulk , skipped_items )
38
45
elif item .media_type == MediaTypes .COMIC .value :
39
- process_comic (item , events_bulk )
46
+ process_comic (item , events_bulk , skipped_items )
40
47
else :
41
- process_other (item , events_bulk )
48
+ process_other (item , events_bulk , skipped_items )
42
49
43
50
process_anime_bulk (anime_to_process , events_bulk )
51
+ return events_bulk , skipped_items
44
52
53
+
54
+ def save_events (events_bulk ):
55
+ """Save events in bulk."""
45
56
for event in events_bulk :
46
57
Event .objects .update_or_create (
47
58
item = event .item ,
48
59
content_number = event .content_number ,
49
60
defaults = {"datetime" : event .datetime },
50
61
)
51
62
52
- cleanup_invalid_events (events_bulk )
53
63
54
- result_msg = "\n " .join (
55
- f"{ item } ({ item .get_media_type_display ()} )" for item in items_to_process
56
- )
64
+ def generate_final_message (items_to_process , skipped_items ):
65
+ """Generate the final message summarizing the results."""
66
+ successful_items = [item for item in items_to_process if item not in skipped_items ]
67
+ final_message_parts = []
68
+
69
+ if successful_items :
70
+ success_details = "\n " .join (
71
+ f" - { item } ({ item .get_media_type_display ()} )" for item in successful_items
72
+ )
73
+ final_message_parts .append (
74
+ f"Releases have been fetched for the following items:\n { success_details } " ,
75
+ )
57
76
58
- if len (items_to_process ) > 0 :
59
- return f"""Releases have been fetched for the following items:
60
- { result_msg } """
61
- return "No releases have been fetched for any items."
77
+ if skipped_items :
78
+ skipped_details = "\n " .join (
79
+ f" - { item } ({ item .get_media_type_display ()} )" for item in skipped_items
80
+ )
81
+ final_message_parts .append (
82
+ f"The following items were skipped due to errors:\n { skipped_details } " ,
83
+ )
84
+
85
+ return (
86
+ "\n \n " .join (final_message_parts )
87
+ if final_message_parts
88
+ else "No releases have been fetched for any items."
89
+ )
62
90
63
91
64
92
def cleanup_invalid_events (events_bulk ):
@@ -306,7 +334,7 @@ def get_anime_schedule_bulk(media_ids):
306
334
return all_data
307
335
308
336
309
- def process_tv (tv_item , events_bulk ):
337
+ def process_tv (tv_item , events_bulk , skipped_items ):
310
338
"""Process TV item and create events for all seasons and episodes.
311
339
312
340
Only processes:
@@ -330,8 +358,12 @@ def process_tv(tv_item, events_bulk):
330
358
"Failed to fetch metadata for %s" ,
331
359
tv_item ,
332
360
)
361
+ if tv_item not in skipped_items :
362
+ skipped_items .append (tv_item )
333
363
except Exception :
334
364
logger .exception ("Error processing %s" , tv_item )
365
+ if tv_item not in skipped_items :
366
+ skipped_items .append (tv_item )
335
367
336
368
337
369
def get_seasons_to_process (tv_item ):
@@ -561,7 +593,7 @@ def get_tvmaze_episode_map(tvdb_id):
561
593
return tvmaze_map
562
594
563
595
564
- def process_comic (item , events_bulk ):
596
+ def process_comic (item , events_bulk , skipped_items ):
565
597
"""Process comic item and add events to the event list."""
566
598
logger .info ("Fetching releases for %s" , item )
567
599
try :
@@ -575,6 +607,8 @@ def process_comic(item, events_bulk):
575
607
"Failed to fetch metadata for %s" ,
576
608
item ,
577
609
)
610
+ if item not in skipped_items :
611
+ skipped_items .append (item )
578
612
return
579
613
580
614
# get latest event
@@ -592,6 +626,8 @@ def process_comic(item, events_bulk):
592
626
"Failed to fetch issue metadata for %s" ,
593
627
item ,
594
628
)
629
+ if item not in skipped_items :
630
+ skipped_items .append (item )
595
631
return
596
632
597
633
if issue_metadata ["store_date" ]:
@@ -610,7 +646,7 @@ def process_comic(item, events_bulk):
610
646
)
611
647
612
648
613
- def process_other (item , events_bulk ):
649
+ def process_other (item , events_bulk , skipped_items ):
614
650
"""Process other types of items and add events to the event list."""
615
651
logger .info ("Fetching releases for %s" , item )
616
652
try :
@@ -624,6 +660,8 @@ def process_other(item, events_bulk):
624
660
"Failed to fetch metadata for %s" ,
625
661
item ,
626
662
)
663
+ if item not in skipped_items :
664
+ skipped_items .append (item )
627
665
return
628
666
629
667
date_key = media_type_config .get_date_key (item .media_type )
0 commit comments