forked from itsToggle/plex_debrid
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathdatabase_setup.sql
More file actions
351 lines (324 loc) · 11.4 KB
/
database_setup.sql
File metadata and controls
351 lines (324 loc) · 11.4 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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
-- Plex Debrid Database Setup
-- This script creates all necessary tables and views for the web interface
-- ============================================================================
-- TABLE CREATION
-- ============================================================================
-- Movies table
CREATE TABLE IF NOT EXISTS media_movie (
guid TEXT PRIMARY KEY,
title TEXT,
year INTEGER,
imdb TEXT,
tmdb TEXT,
tvdb TEXT,
released INTEGER,
collected INTEGER,
watched INTEGER,
downloading INTEGER,
ignored INTEGER,
blacklisted INTEGER DEFAULT 0,
watchlisted_by TEXT,
watchlisted_at TEXT,
source TEXT,
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
);
-- Shows table
CREATE TABLE IF NOT EXISTS media_show (
guid TEXT PRIMARY KEY,
leaf_count INTEGER,
child_count INTEGER,
title TEXT,
year INTEGER,
public_pages_url TEXT,
imdb TEXT,
tmdb TEXT,
tvdb TEXT,
released INTEGER,
collected INTEGER,
watched INTEGER,
ignored INTEGER,
blacklisted INTEGER DEFAULT 0,
watchlisted_by TEXT,
watchlisted_at TEXT,
source TEXT,
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
);
-- Seasons table
CREATE TABLE IF NOT EXISTS media_season (
guid TEXT PRIMARY KEY,
parent_title TEXT,
title TEXT,
parent_guid TEXT,
year INTEGER,
leaf_count INTEGER,
idx INTEGER,
collected INTEGER,
ignored INTEGER,
blacklisted INTEGER DEFAULT 0,
watchlisted_by TEXT,
source TEXT,
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
);
-- Episodes table
CREATE TABLE IF NOT EXISTS media_episode (
guid TEXT PRIMARY KEY,
grandparent_title TEXT,
parent_title TEXT,
title TEXT,
parent_guid TEXT,
parent_index INTEGER,
idx INTEGER,
year INTEGER,
collected INTEGER,
downloading INTEGER,
ignored INTEGER,
blacklisted INTEGER DEFAULT 0,
watchlisted_by TEXT,
source TEXT,
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
);
-- Releases table
CREATE TABLE IF NOT EXISTS media_release (
guid TEXT NOT NULL,
title TEXT,
size REAL,
link TEXT,
hash TEXT,
seeders INTEGER,
source TEXT,
requested_at TEXT,
status TEXT DEFAULT 'pending',
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
PRIMARY KEY (guid, hash)
);
-- Real-Debrid torrents cache table
CREATE TABLE IF NOT EXISTS realdebrid_torrents (
id TEXT PRIMARY KEY,
filename TEXT,
hash TEXT,
bytes INTEGER,
progress INTEGER,
status TEXT,
added TEXT,
ended TEXT,
created_at TEXT NOT NULL DEFAULT (datetime('now')),
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
deleted_at TEXT,
sync_marker TEXT
);
-- Real-Debrid torrent files cache table
-- Note: Files are considered deleted when their parent torrent is deleted (no deleted_at needed)
CREATE TABLE IF NOT EXISTS realdebrid_torrent_files (
torrent_id TEXT NOT NULL,
file_id INTEGER NOT NULL,
path TEXT,
bytes INTEGER,
selected INTEGER DEFAULT 0,
created_at TEXT NOT NULL DEFAULT (datetime('now')),
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
PRIMARY KEY (torrent_id, file_id),
FOREIGN KEY (torrent_id) REFERENCES realdebrid_torrents(id)
);
-- ============================================================================
-- VIEW CREATION
-- ============================================================================
-- Drop existing views if they exist
DROP VIEW IF EXISTS v_media;
-- Create comprehensive media view with all items and their status
CREATE VIEW v_media AS
-- Movies with status
SELECT
'movie' as media_type,
guid,
title,
year,
imdb,
tmdb,
tvdb,
watchlisted_by,
COALESCE(datetime(watchlisted_at), datetime('1970-01-01')) as watchlisted_at,
source,
COALESCE(datetime(updated_at), datetime('1970-01-01')) as updated_at,
CASE
WHEN blacklisted = 1 THEN 'blacklisted'
WHEN collected = 1 THEN 'collected'
WHEN ignored = 1 THEN 'ignored'
WHEN downloading = 1 THEN 'downloading'
ELSE 'pending'
END as status,
collected,
ignored,
downloading,
blacklisted
FROM media_movie
UNION ALL
-- Shows with status
SELECT
'show' as media_type,
guid,
title,
year,
imdb,
tmdb,
tvdb,
watchlisted_by,
COALESCE(datetime(watchlisted_at), datetime('1970-01-01')) as watchlisted_at,
source,
COALESCE(datetime(updated_at), datetime('1970-01-01')) as updated_at,
CASE
WHEN blacklisted = 1 THEN 'blacklisted'
WHEN collected = 1 THEN 'collected'
WHEN ignored = 1 THEN 'ignored'
ELSE 'pending'
END as status,
collected,
ignored,
0 as downloading,
blacklisted
FROM media_show
UNION ALL
-- Seasons with status
SELECT
'season' as media_type,
guid,
CASE
WHEN parent_title IS NOT NULL AND parent_title != ''
THEN title || ' (' || parent_title || ')'
ELSE title
END as title,
year,
NULL as imdb,
NULL as tmdb,
NULL as tvdb,
watchlisted_by,
COALESCE(datetime(updated_at), datetime('1970-01-01')) as watchlisted_at,
source,
COALESCE(datetime(updated_at), datetime('1970-01-01')) as updated_at,
CASE
WHEN blacklisted = 1 THEN 'blacklisted'
WHEN collected = 1 THEN 'collected'
WHEN ignored = 1 THEN 'ignored'
ELSE 'pending'
END as status,
collected,
ignored,
0 as downloading,
blacklisted
FROM media_season
UNION ALL
-- Episodes with status
SELECT
'episode' as media_type,
guid,
CASE
WHEN grandparent_title IS NOT NULL AND grandparent_title != '' AND parent_title IS NOT NULL AND parent_title != ''
THEN title || ' (' || grandparent_title || ' - ' || parent_title || ')'
WHEN grandparent_title IS NOT NULL AND grandparent_title != ''
THEN title || ' (' || grandparent_title || ')'
WHEN parent_title IS NOT NULL AND parent_title != ''
THEN title || ' (' || parent_title || ')'
ELSE title
END as title,
year,
NULL as imdb,
NULL as tmdb,
NULL as tvdb,
watchlisted_by,
COALESCE(datetime(updated_at), datetime('1970-01-01')) as watchlisted_at,
source,
COALESCE(datetime(updated_at), datetime('1970-01-01')) as updated_at,
CASE
WHEN blacklisted = 1 THEN 'blacklisted'
WHEN collected = 1 THEN 'collected'
WHEN ignored = 1 THEN 'ignored'
WHEN downloading = 1 THEN 'downloading'
ELSE 'pending'
END as status,
collected,
ignored,
downloading,
blacklisted
FROM media_episode;
-- ============================================================================
-- INDEXES FOR PERFORMANCE
-- ============================================================================
-- Create indexes on commonly queried columns
CREATE INDEX IF NOT EXISTS idx_media_movie_status ON media_movie(collected, ignored, downloading);
CREATE INDEX IF NOT EXISTS idx_media_movie_year ON media_movie(year);
CREATE INDEX IF NOT EXISTS idx_media_movie_watchlisted_by ON media_movie(watchlisted_by);
CREATE INDEX IF NOT EXISTS idx_media_movie_watchlisted_at ON media_movie(watchlisted_at);
CREATE INDEX IF NOT EXISTS idx_media_movie_source ON media_movie(source);
CREATE INDEX IF NOT EXISTS idx_media_movie_blacklisted ON media_movie(blacklisted);
CREATE INDEX IF NOT EXISTS idx_media_show_status ON media_show(collected, ignored);
CREATE INDEX IF NOT EXISTS idx_media_show_year ON media_show(year);
CREATE INDEX IF NOT EXISTS idx_media_show_watchlisted_by ON media_show(watchlisted_by);
CREATE INDEX IF NOT EXISTS idx_media_show_watchlisted_at ON media_show(watchlisted_at);
CREATE INDEX IF NOT EXISTS idx_media_show_source ON media_show(source);
CREATE INDEX IF NOT EXISTS idx_media_show_blacklisted ON media_show(blacklisted);
CREATE INDEX IF NOT EXISTS idx_media_season_status ON media_season(collected, ignored);
CREATE INDEX IF NOT EXISTS idx_media_season_year ON media_season(year);
CREATE INDEX IF NOT EXISTS idx_media_season_watchlisted_by ON media_season(watchlisted_by);
CREATE INDEX IF NOT EXISTS idx_media_season_updated_at ON media_season(updated_at);
CREATE INDEX IF NOT EXISTS idx_media_season_source ON media_season(source);
CREATE INDEX IF NOT EXISTS idx_media_season_blacklisted ON media_season(blacklisted);
CREATE INDEX IF NOT EXISTS idx_media_episode_status ON media_episode(collected, ignored, downloading);
CREATE INDEX IF NOT EXISTS idx_media_episode_year ON media_episode(year);
CREATE INDEX IF NOT EXISTS idx_media_episode_watchlisted_by ON media_episode(watchlisted_by);
CREATE INDEX IF NOT EXISTS idx_media_episode_updated_at ON media_episode(updated_at);
CREATE INDEX IF NOT EXISTS idx_media_episode_source ON media_episode(source);
CREATE INDEX IF NOT EXISTS idx_media_episode_blacklisted ON media_episode(blacklisted);
-- Indexes for media_release table
CREATE INDEX IF NOT EXISTS idx_media_release_status ON media_release(status);
CREATE INDEX IF NOT EXISTS idx_media_release_requested_at ON media_release(requested_at);
CREATE INDEX IF NOT EXISTS idx_media_release_guid ON media_release(guid);
-- Indexes for realdebrid_torrents table
CREATE INDEX IF NOT EXISTS idx_realdebrid_torrents_hash ON realdebrid_torrents(hash);
CREATE INDEX IF NOT EXISTS idx_realdebrid_torrents_status ON realdebrid_torrents(status);
CREATE INDEX IF NOT EXISTS idx_realdebrid_torrents_updated_at ON realdebrid_torrents(updated_at);
CREATE INDEX IF NOT EXISTS idx_realdebrid_torrents_deleted_at ON realdebrid_torrents(deleted_at);
-- Indexes for realdebrid_torrent_files table
CREATE INDEX IF NOT EXISTS idx_realdebrid_torrent_files_torrent_id ON realdebrid_torrent_files(torrent_id);
CREATE INDEX IF NOT EXISTS idx_realdebrid_torrent_files_path ON realdebrid_torrent_files(path);
-- ============================================================================
-- USAGE EXAMPLES
-- ============================================================================
-- Example queries for the web interface:
--
-- Get all pending items:
-- SELECT * FROM v_media WHERE status = 'pending';
--
-- Get pending movies only:
-- SELECT * FROM v_media WHERE status = 'pending' AND media_type = 'movie';
--
-- Get pending seasons only:
-- SELECT * FROM v_media WHERE status = 'pending' AND media_type = 'season';
--
-- Get downloading items:
-- SELECT * FROM v_media WHERE status = 'downloading';
--
-- Get ignored items:
-- SELECT * FROM v_media WHERE status = 'ignored';
--
-- Get collected items:
-- SELECT * FROM v_media WHERE status = 'collected';
--
-- Get locally requested releases:
-- SELECT * FROM media_release WHERE status = 'pending' AND requested_at IS NOT NULL;
--
-- Get items by source:
-- SELECT * FROM v_media WHERE watchlisted_by LIKE '%plex%';
--
-- Get items by year:
-- SELECT * FROM v_media WHERE year = 2024;
--
-- Get items by search term:
-- SELECT * FROM v_media WHERE title LIKE '%search_term%';
--
-- Get statistics:
-- SELECT
-- SUM(CASE WHEN status = 'pending' AND media_type = 'movie' THEN 1 ELSE 0 END) as pending_movies,
-- SUM(CASE WHEN status = 'pending' AND media_type = 'show' THEN 1 ELSE 0 END) as pending_shows,
-- SUM(CASE WHEN status = 'pending' AND media_type = 'season' THEN 1 ELSE 0 END) as pending_seasons,
-- SUM(CASE WHEN status = 'pending' AND media_type = 'episode' THEN 1 ELSE 0 END) as pending_episodes,
-- (SELECT COUNT(*) FROM media_release WHERE status = 'pending' AND requested_at IS NOT NULL) as local_requests
-- FROM v_media;