mirror of
https://github.com/iv-org/invidious.git
synced 2024-12-24 12:02:39 +00:00
Add backend Compilation symbols
This commit is contained in:
parent
d0a3c994f4
commit
24f55a7876
@ -631,7 +631,7 @@ default_user_preferences:
|
|||||||
##
|
##
|
||||||
## Default: ["Popular", "Trending", "Subscriptions", "Playlists", "Compilations"] (show all feeds)
|
## Default: ["Popular", "Trending", "Subscriptions", "Playlists", "Compilations"] (show all feeds)
|
||||||
##
|
##
|
||||||
feed_menu: ["Popular", "Trending", "Subscriptions", "Playlists", "Compilations"]
|
#feed_menu: ["Popular", "Trending", "Subscriptions", "Playlists", "Compilations"]
|
||||||
|
|
||||||
##
|
##
|
||||||
## Default feed to display on the home page.
|
## Default feed to display on the home page.
|
||||||
|
29
config/sql/compilations.sql
Normal file
29
config/sql/compilations.sql
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
-- Type: public.privacy
|
||||||
|
|
||||||
|
-- DROP TYPE public.privacy;
|
||||||
|
|
||||||
|
CREATE TYPE public.privacy AS ENUM
|
||||||
|
(
|
||||||
|
'Public',
|
||||||
|
'Unlisted',
|
||||||
|
'Private'
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Table: public.playlists
|
||||||
|
|
||||||
|
-- DROP TABLE public.playlists;
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS public.playlists
|
||||||
|
(
|
||||||
|
title text,
|
||||||
|
id text primary key,
|
||||||
|
author text,
|
||||||
|
description text,
|
||||||
|
video_count integer,
|
||||||
|
created timestamptz,
|
||||||
|
updated timestamptz,
|
||||||
|
privacy privacy,
|
||||||
|
index int8[]
|
||||||
|
);
|
||||||
|
|
||||||
|
GRANT ALL ON public.playlists TO current_user;
|
14
src/invidious/compilations.cr
Normal file
14
src/invidious/compilations.cr
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
struct Compilation
|
||||||
|
include DB::Serializable
|
||||||
|
|
||||||
|
property title : String
|
||||||
|
property id : String
|
||||||
|
property author : String
|
||||||
|
property ucid : String
|
||||||
|
property length_seconds : Int32
|
||||||
|
property published : Time
|
||||||
|
property plid : String
|
||||||
|
property index : Int64
|
||||||
|
property live_now : Bool
|
||||||
|
|
||||||
|
end
|
261
src/invidious/database/compilations.cr
Normal file
261
src/invidious/database/compilations.cr
Normal file
@ -0,0 +1,261 @@
|
|||||||
|
require "./base.cr"
|
||||||
|
|
||||||
|
#
|
||||||
|
# This module contains functions related to the "playlists" table.
|
||||||
|
#
|
||||||
|
module Invidious::Database::Playlists
|
||||||
|
extend self
|
||||||
|
|
||||||
|
# -------------------
|
||||||
|
# Insert / delete
|
||||||
|
# -------------------
|
||||||
|
|
||||||
|
def insert(playlist : InvidiousPlaylist)
|
||||||
|
playlist_array = playlist.to_a
|
||||||
|
|
||||||
|
request = <<-SQL
|
||||||
|
INSERT INTO playlists
|
||||||
|
VALUES (#{arg_array(playlist_array)})
|
||||||
|
SQL
|
||||||
|
|
||||||
|
PG_DB.exec(request, args: playlist_array)
|
||||||
|
end
|
||||||
|
|
||||||
|
# deletes the given playlist and connected playlist videos
|
||||||
|
def delete(id : String)
|
||||||
|
PlaylistVideos.delete_by_playlist(id)
|
||||||
|
request = <<-SQL
|
||||||
|
DELETE FROM playlists *
|
||||||
|
WHERE id = $1
|
||||||
|
SQL
|
||||||
|
|
||||||
|
PG_DB.exec(request, id)
|
||||||
|
end
|
||||||
|
|
||||||
|
# -------------------
|
||||||
|
# Update
|
||||||
|
# -------------------
|
||||||
|
|
||||||
|
def update(id : String, title : String, privacy, description, updated)
|
||||||
|
request = <<-SQL
|
||||||
|
UPDATE playlists
|
||||||
|
SET title = $1, privacy = $2, description = $3, updated = $4
|
||||||
|
WHERE id = $5
|
||||||
|
SQL
|
||||||
|
|
||||||
|
PG_DB.exec(request, title, privacy, description, updated, id)
|
||||||
|
end
|
||||||
|
|
||||||
|
def update_description(id : String, description)
|
||||||
|
request = <<-SQL
|
||||||
|
UPDATE playlists
|
||||||
|
SET description = $1
|
||||||
|
WHERE id = $2
|
||||||
|
SQL
|
||||||
|
|
||||||
|
PG_DB.exec(request, description, id)
|
||||||
|
end
|
||||||
|
|
||||||
|
def update_subscription_time(id : String)
|
||||||
|
request = <<-SQL
|
||||||
|
UPDATE playlists
|
||||||
|
SET subscribed = now()
|
||||||
|
WHERE id = $1
|
||||||
|
SQL
|
||||||
|
|
||||||
|
PG_DB.exec(request, id)
|
||||||
|
end
|
||||||
|
|
||||||
|
def update_video_added(id : String, index : String | Int64)
|
||||||
|
request = <<-SQL
|
||||||
|
UPDATE playlists
|
||||||
|
SET index = array_append(index, $1),
|
||||||
|
video_count = cardinality(index) + 1,
|
||||||
|
updated = now()
|
||||||
|
WHERE id = $2
|
||||||
|
SQL
|
||||||
|
|
||||||
|
PG_DB.exec(request, index, id)
|
||||||
|
end
|
||||||
|
|
||||||
|
def update_video_removed(id : String, index : String | Int64)
|
||||||
|
request = <<-SQL
|
||||||
|
UPDATE playlists
|
||||||
|
SET index = array_remove(index, $1),
|
||||||
|
video_count = cardinality(index) - 1,
|
||||||
|
updated = now()
|
||||||
|
WHERE id = $2
|
||||||
|
SQL
|
||||||
|
|
||||||
|
PG_DB.exec(request, index, id)
|
||||||
|
end
|
||||||
|
|
||||||
|
# -------------------
|
||||||
|
# Salect
|
||||||
|
# -------------------
|
||||||
|
|
||||||
|
def select(*, id : String) : InvidiousPlaylist?
|
||||||
|
request = <<-SQL
|
||||||
|
SELECT * FROM playlists
|
||||||
|
WHERE id = $1
|
||||||
|
SQL
|
||||||
|
|
||||||
|
return PG_DB.query_one?(request, id, as: InvidiousPlaylist)
|
||||||
|
end
|
||||||
|
|
||||||
|
def select_all(*, author : String) : Array(InvidiousPlaylist)
|
||||||
|
request = <<-SQL
|
||||||
|
SELECT * FROM playlists
|
||||||
|
WHERE author = $1
|
||||||
|
SQL
|
||||||
|
|
||||||
|
return PG_DB.query_all(request, author, as: InvidiousPlaylist)
|
||||||
|
end
|
||||||
|
|
||||||
|
# -------------------
|
||||||
|
# Salect (filtered)
|
||||||
|
# -------------------
|
||||||
|
|
||||||
|
def select_like_iv(email : String) : Array(InvidiousPlaylist)
|
||||||
|
request = <<-SQL
|
||||||
|
SELECT * FROM playlists
|
||||||
|
WHERE author = $1 AND id LIKE 'IV%'
|
||||||
|
ORDER BY created
|
||||||
|
SQL
|
||||||
|
|
||||||
|
PG_DB.query_all(request, email, as: InvidiousPlaylist)
|
||||||
|
end
|
||||||
|
|
||||||
|
def select_not_like_iv(email : String) : Array(InvidiousPlaylist)
|
||||||
|
request = <<-SQL
|
||||||
|
SELECT * FROM playlists
|
||||||
|
WHERE author = $1 AND id NOT LIKE 'IV%'
|
||||||
|
ORDER BY created
|
||||||
|
SQL
|
||||||
|
|
||||||
|
PG_DB.query_all(request, email, as: InvidiousPlaylist)
|
||||||
|
end
|
||||||
|
|
||||||
|
def select_user_created_playlists(email : String) : Array({String, String})
|
||||||
|
request = <<-SQL
|
||||||
|
SELECT id,title FROM playlists
|
||||||
|
WHERE author = $1 AND id LIKE 'IV%'
|
||||||
|
SQL
|
||||||
|
|
||||||
|
PG_DB.query_all(request, email, as: {String, String})
|
||||||
|
end
|
||||||
|
|
||||||
|
# -------------------
|
||||||
|
# Misc checks
|
||||||
|
# -------------------
|
||||||
|
|
||||||
|
# Check if given playlist ID exists
|
||||||
|
def exists?(id : String) : Bool
|
||||||
|
request = <<-SQL
|
||||||
|
SELECT id FROM playlists
|
||||||
|
WHERE id = $1
|
||||||
|
SQL
|
||||||
|
|
||||||
|
return PG_DB.query_one?(request, id, as: String).nil?
|
||||||
|
end
|
||||||
|
|
||||||
|
# Count how many playlist a user has created.
|
||||||
|
def count_owned_by(author : String) : Int64
|
||||||
|
request = <<-SQL
|
||||||
|
SELECT count(*) FROM playlists
|
||||||
|
WHERE author = $1
|
||||||
|
SQL
|
||||||
|
|
||||||
|
return PG_DB.query_one?(request, author, as: Int64) || 0_i64
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
#
|
||||||
|
# This module contains functions related to the "playlist_videos" table.
|
||||||
|
#
|
||||||
|
module Invidious::Database::PlaylistVideos
|
||||||
|
extend self
|
||||||
|
|
||||||
|
private alias VideoIndex = Int64 | Array(Int64)
|
||||||
|
|
||||||
|
# -------------------
|
||||||
|
# Insert / Delete
|
||||||
|
# -------------------
|
||||||
|
|
||||||
|
def insert(video : PlaylistVideo)
|
||||||
|
video_array = video.to_a
|
||||||
|
|
||||||
|
request = <<-SQL
|
||||||
|
INSERT INTO playlist_videos
|
||||||
|
VALUES (#{arg_array(video_array)})
|
||||||
|
SQL
|
||||||
|
|
||||||
|
PG_DB.exec(request, args: video_array)
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete(index)
|
||||||
|
request = <<-SQL
|
||||||
|
DELETE FROM playlist_videos *
|
||||||
|
WHERE index = $1
|
||||||
|
SQL
|
||||||
|
|
||||||
|
PG_DB.exec(request, index)
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete_by_playlist(plid : String)
|
||||||
|
request = <<-SQL
|
||||||
|
DELETE FROM playlist_videos *
|
||||||
|
WHERE plid = $1
|
||||||
|
SQL
|
||||||
|
|
||||||
|
PG_DB.exec(request, plid)
|
||||||
|
end
|
||||||
|
|
||||||
|
# -------------------
|
||||||
|
# Salect
|
||||||
|
# -------------------
|
||||||
|
|
||||||
|
def select(plid : String, index : VideoIndex, offset, limit = 100) : Array(PlaylistVideo)
|
||||||
|
request = <<-SQL
|
||||||
|
SELECT * FROM playlist_videos
|
||||||
|
WHERE plid = $1
|
||||||
|
ORDER BY array_position($2, index)
|
||||||
|
LIMIT $3
|
||||||
|
OFFSET $4
|
||||||
|
SQL
|
||||||
|
|
||||||
|
return PG_DB.query_all(request, plid, index, limit, offset, as: PlaylistVideo)
|
||||||
|
end
|
||||||
|
|
||||||
|
def select_index(plid : String, vid : String) : Int64?
|
||||||
|
request = <<-SQL
|
||||||
|
SELECT index FROM playlist_videos
|
||||||
|
WHERE plid = $1 AND id = $2
|
||||||
|
LIMIT 1
|
||||||
|
SQL
|
||||||
|
|
||||||
|
return PG_DB.query_one?(request, plid, vid, as: Int64)
|
||||||
|
end
|
||||||
|
|
||||||
|
def select_one_id(plid : String, index : VideoIndex) : String?
|
||||||
|
request = <<-SQL
|
||||||
|
SELECT id FROM playlist_videos
|
||||||
|
WHERE plid = $1
|
||||||
|
ORDER BY array_position($2, index)
|
||||||
|
LIMIT 1
|
||||||
|
SQL
|
||||||
|
|
||||||
|
return PG_DB.query_one?(request, plid, index, as: String)
|
||||||
|
end
|
||||||
|
|
||||||
|
def select_ids(plid : String, index : VideoIndex, limit = 500) : Array(String)
|
||||||
|
request = <<-SQL
|
||||||
|
SELECT id FROM playlist_videos
|
||||||
|
WHERE plid = $1
|
||||||
|
ORDER BY array_position($2, index)
|
||||||
|
LIMIT $3
|
||||||
|
SQL
|
||||||
|
|
||||||
|
return PG_DB.query_all(request, plid, index, limit, as: String)
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue
Block a user