@@ -37,7 +37,72 @@ def libraries():
3737 return render_template ("libraries.html" , sections = sections )
3838
3939
40- # http://127.0.0.1:5000/browse/5?page=1&art_type=poster&art_page=1&season=3&episode=
40+ # new paginated item picker
41+ @app .route ("/browse/<section_key>/items" )
42+ def list_items (section_key ):
43+ plex = get_plex ()
44+ if not plex :
45+ return redirect (url_for ("connect" ))
46+
47+ # find the right library section
48+ section = next (
49+ (s for s in plex .library .sections () if str (s .key ) == section_key ),
50+ None ,
51+ )
52+ if not section :
53+ flash ("Library not found." )
54+ return redirect (url_for ("libraries" ))
55+
56+ # full list of items
57+ all_items_full = list (section .all ())
58+
59+ # give everything a global index
60+ global_index = 1
61+ for item in all_items_full :
62+ item .global_index = global_index
63+ global_index = global_index + 1
64+
65+ # optional letter filter (defaults to 'All')
66+ letter = request .args .get ("letter" , "All" )
67+ if letter != "All" :
68+ if letter [:1 ].isdigit ():
69+ items_filtered = [
70+ item
71+ for item in all_items_full
72+ if item .title and item .title [:1 ].isdigit ()
73+ ]
74+ else :
75+ items_filtered = [
76+ item
77+ for item in all_items_full
78+ if item .title and item .title .upper ().startswith (letter .upper ())
79+ ]
80+ else :
81+ items_filtered = all_items_full
82+
83+ # pagination params (based on filtered set)
84+ total = len (items_filtered )
85+ per_page = 20
86+ pages = math .ceil (total / per_page )
87+
88+ # clamp page number
89+ page = int (request .args .get ("page" , 1 ))
90+ page = max (1 , min (page , pages ))
91+
92+ # slice out this page from filtered items
93+ start = (page - 1 ) * per_page
94+ page_items = items_filtered [start : start + per_page ]
95+
96+ return render_template (
97+ "items.html" ,
98+ section = section ,
99+ items = page_items ,
100+ page = page ,
101+ pages = pages ,
102+ per_page = per_page ,
103+ alphabet = ALPHABET ,
104+ letter = letter ,
105+ )
41106
42107
43108@app .route ("/browse/<section_key>" )
@@ -54,6 +119,7 @@ def browse(section_key):
54119 items = list (section .all ())
55120 pages = len (items )
56121 item_page = int (request .args .get ("page" , 1 ))
122+ item_letter = request .args .get ("letter" , "All" )
57123 item_page = max (1 , min (item_page , pages ))
58124 item = items [item_page - 1 ]
59125
@@ -74,6 +140,7 @@ def browse(section_key):
74140 season_rating_key = season_rating_key ,
75141 items = items ,
76142 item_page = item_page ,
143+ item_letter = item_letter ,
77144 pages = pages ,
78145 art_type = art_type ,
79146 season = season ,
0 commit comments