-
Notifications
You must be signed in to change notification settings - Fork 23
Expand file tree
/
Copy pathapp.py
More file actions
116 lines (102 loc) · 3.32 KB
/
app.py
File metadata and controls
116 lines (102 loc) · 3.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import os
import requests
from flask import Flask, flash, redirect, render_template, request, session, url_for
from plexapi.server import PlexServer
app = Flask(__name__)
app.secret_key = os.urandom(24)
def get_plex():
base_url = session.get("base_url")
token = session.get("token")
if not base_url or not token:
return None
return PlexServer(base_url, token)
@app.route("/", methods=["GET", "POST"])
def connect():
if request.method == "POST":
session["base_url"] = request.form["base_url"]
session["token"] = request.form["token"]
return redirect(url_for("libraries"))
return render_template("connect.html")
@app.route("/libraries")
def libraries():
plex = get_plex()
if not plex:
return redirect(url_for("connect"))
sections = plex.library.sections()
return render_template("libraries.html", sections=sections)
@app.route("/gallery/<section_key>")
def gallery(section_key):
plex = get_plex()
if not plex:
return redirect(url_for("connect"))
# find section by key
section = next(
(s for s in plex.library.sections() if str(s.key) == section_key), None
)
if not section:
flash("Library not found.")
return redirect(url_for("libraries"))
page = int(request.args.get("page", 1))
art_type = request.args.get("art_type", "poster")
items = list(section.all())
total = len(items)
per_page = 10
pages = (total + per_page - 1) // per_page
start = (page - 1) * per_page
end = start + per_page
page_items = items[start:end]
return render_template(
"gallery.html",
section=section,
items=page_items,
page=page,
pages=pages,
art_type=art_type,
)
@app.route("/download", methods=["POST"])
def download():
plex = get_plex()
if not plex:
return redirect(url_for("connect"))
rating_key = request.form["rating_key"]
art_type = request.form["art_type"]
section_key = request.form["section_key"]
page = request.form.get("page", 1)
item = plex.fetchItem(rating_key)
# Determine asset name (folder)
try:
media_file = item.media[0].parts[0].file
asset_name = os.path.basename(os.path.dirname(media_file))
except:
# Fallback for seasons: use show title
asset_name = item.title
# Build directory
base_dir = os.path.join(
os.getcwd(),
"assets",
"movies" if item.type == "movie" else "series",
asset_name,
)
os.makedirs(base_dir, exist_ok=True)
# Choose URL and filename
url = item.posterUrl if art_type == "poster" else item.artUrl
if item.type == "season":
filename = f"Season {item.index:02d}.jpg"
elif item.type == "episode":
s = item.seasonNumber
e = item.index
filename = f"S{s:02d}E{e:02d}.jpg"
else:
filename = f"{art_type}.jpg"
# Download and save
resp = requests.get(
f"{session['base_url']}{url}", headers={"X-Plex-Token": session["token"]}
)
with open(os.path.join(base_dir, filename), "wb") as f:
f.write(resp.content)
flash(f"Saved to {os.path.join(base_dir, filename)}")
return redirect(
url_for("gallery", section_key=section_key, page=page, art_type=art_type)
)
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)