diff --git a/Design/Database/YouTubeMDBot.drawio b/Design/Database/YouTubeMDBot.drawio new file mode 100644 index 0000000..6e7c827 --- /dev/null +++ b/Design/Database/YouTubeMDBot.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/Design/Database/YouTubeMDBot.pdf b/Design/Database/YouTubeMDBot.pdf new file mode 100644 index 0000000..3754129 Binary files /dev/null and b/Design/Database/YouTubeMDBot.pdf differ diff --git a/Design/Database/YouTubeMDBot.png b/Design/Database/YouTubeMDBot.png new file mode 100644 index 0000000..c003094 Binary files /dev/null and b/Design/Database/YouTubeMDBot.png differ diff --git a/Design/Database/YouTubeMDBot.svg b/Design/Database/YouTubeMDBot.svg new file mode 100644 index 0000000..95d49cb --- /dev/null +++ b/Design/Database/YouTubeMDBot.svg @@ -0,0 +1,3 @@ + + +
User
User
id
[Not supported by viewer]
name
name
tag
tag
lang
lang
first_access
first_access
History
<b>History</b>
date
date
file_id
[Not supported by viewer]
has
has
1:1
1:1
0:N
0:N
Preferences
<b>Preferences</b>
has
has
1:1
1:1
1:1
1:1
audio_format
audio_format
audio_quality
audio_quality
send_song_link
send_song_link
ask_for_metadata
ask_for_metadata
Metadata
<b>Metadata</b>
id
[Not supported by viewer]
title
title
artist
artist
album
album
cover
cover
release_id
release_id
recording_id
recording_id
duration
duration
custom_metadata
custom_metadata
youtube_id
youtube_id
File
[Not supported by viewer]
id
[Not supported by viewer]
audio_quality
audio_quality
size
size
has
has
1:1
1:1
1:1
1:1
Playlist
<b>Playlist</b>
id
[Not supported by viewer]
Statistics
<b>Statistics</b>
times
times
has been requested
has been requested
1:1
1:1
\ No newline at end of file diff --git a/Design/Database/database_model.mwb b/Design/Database/database_model.mwb deleted file mode 100755 index e36a68a..0000000 Binary files a/Design/Database/database_model.mwb and /dev/null differ diff --git a/Design/Database/database_model.mwb.bak b/Design/Database/database_model.mwb.bak deleted file mode 100755 index 03ffdc9..0000000 Binary files a/Design/Database/database_model.mwb.bak and /dev/null differ diff --git a/Design/Database/generated_sql_file.sql b/Design/Database/generated_sql_file.sql deleted file mode 100755 index 7ced06a..0000000 --- a/Design/Database/generated_sql_file.sql +++ /dev/null @@ -1,252 +0,0 @@ --- MySQL Script generated by MySQL Workbench --- jue 25 jul 2019 13:50:06 CEST --- Model: New Model Version: 1.0 --- MySQL Workbench Forward Engineering - -SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; -SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; -SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'; - --- ----------------------------------------------------- --- Schema youtubemd --- ----------------------------------------------------- - --- ----------------------------------------------------- --- Schema youtubemd --- ----------------------------------------------------- -CREATE SCHEMA IF NOT EXISTS `youtubemd` DEFAULT CHARACTER SET utf8mb4 ; -SHOW WARNINGS; -USE `youtubemd` ; - --- ----------------------------------------------------- --- Table `youtubemd`.`DownloadInformation` --- ----------------------------------------------------- -CREATE TABLE IF NOT EXISTS `youtubemd`.`DownloadInformation` ( - `file_id` VARCHAR(50) NOT NULL, - `audioQuality` ENUM('320k', '256k', '128k') NOT NULL, - `audioSampling` ENUM('44000', '48000') NULL, - `Metadata_idMetadata` INT NOT NULL, - `VideoInformation_id` VARCHAR(11) NOT NULL, - PRIMARY KEY (`file_id`, `Metadata_idMetadata`, `VideoInformation_id`), - CONSTRAINT `fk_DownloadInformation_Metadata1` - FOREIGN KEY (`Metadata_idMetadata`) - REFERENCES `youtubemd`.`Metadata` (`idMetadata`) - ON DELETE NO ACTION - ON UPDATE NO ACTION, - CONSTRAINT `fk_DownloadInformation_VideoInformation1` - FOREIGN KEY (`VideoInformation_id`) - REFERENCES `youtubemd`.`VideoInformation` (`id`) - ON DELETE NO ACTION - ON UPDATE NO ACTION) -ENGINE = InnoDB -CHECKSUM = 1; - -SHOW WARNINGS; -CREATE UNIQUE INDEX `file_id_UNIQUE` ON `youtubemd`.`DownloadInformation` (`file_id` ASC) VISIBLE; - -SHOW WARNINGS; -CREATE INDEX `fk_DownloadInformation_Metadata1_idx` ON `youtubemd`.`DownloadInformation` (`Metadata_idMetadata` ASC) VISIBLE; - -SHOW WARNINGS; -CREATE INDEX `fk_DownloadInformation_VideoInformation1_idx` ON `youtubemd`.`DownloadInformation` (`VideoInformation_id` ASC) VISIBLE; - -SHOW WARNINGS; - --- ----------------------------------------------------- --- Table `youtubemd`.`DownloadStatistics` --- ----------------------------------------------------- -CREATE TABLE IF NOT EXISTS `youtubemd`.`DownloadStatistics` ( - `timesRequested` INT NOT NULL DEFAULT 0, - `DownloadInformation_file_id` VARCHAR(50) NOT NULL, - PRIMARY KEY (`DownloadInformation_file_id`), - CONSTRAINT `fk_DownloadStatistics_DownloadInformation1` - FOREIGN KEY (`DownloadInformation_file_id`) - REFERENCES `youtubemd`.`DownloadInformation` (`file_id`) - ON DELETE NO ACTION - ON UPDATE NO ACTION) -ENGINE = InnoDB -CHECKSUM = 1; - -SHOW WARNINGS; - --- ----------------------------------------------------- --- Table `youtubemd`.`History` --- ----------------------------------------------------- -CREATE TABLE IF NOT EXISTS `youtubemd`.`History` ( - `User_id` INT(64) NOT NULL, - `DownloadInformation_file_id` VARCHAR(50) NOT NULL, - PRIMARY KEY (`User_id`, `DownloadInformation_file_id`), - CONSTRAINT `fk_History_User1` - FOREIGN KEY (`User_id`) - REFERENCES `youtubemd`.`User` (`id`) - ON DELETE NO ACTION - ON UPDATE NO ACTION, - CONSTRAINT `fk_History_DownloadInformation1` - FOREIGN KEY (`DownloadInformation_file_id`) - REFERENCES `youtubemd`.`DownloadInformation` (`file_id`) - ON DELETE NO ACTION - ON UPDATE NO ACTION) -ENGINE = InnoDB -CHECKSUM = 1; - -SHOW WARNINGS; -CREATE INDEX `fk_History_DownloadInformation1_idx` ON `youtubemd`.`History` (`DownloadInformation_file_id` ASC) VISIBLE; - -SHOW WARNINGS; - --- ----------------------------------------------------- --- Table `youtubemd`.`Metadata` --- ----------------------------------------------------- -CREATE TABLE IF NOT EXISTS `youtubemd`.`Metadata` ( - `idMetadata` INT NOT NULL AUTO_INCREMENT, - `title` VARCHAR(100) NOT NULL, - `artist` VARCHAR(60) NOT NULL, - `cover` BLOB NOT NULL, - `duration` INT NULL, - `customMetadata` TINYINT NOT NULL DEFAULT 0, - PRIMARY KEY (`idMetadata`)) -ENGINE = InnoDB -AUTO_INCREMENT = 0 -CHECKSUM = 1; - -SHOW WARNINGS; - --- ----------------------------------------------------- --- Table `youtubemd`.`Playlist` --- ----------------------------------------------------- -CREATE TABLE IF NOT EXISTS `youtubemd`.`Playlist` ( - `id` VARCHAR(60) NOT NULL, - PRIMARY KEY (`id`)) -ENGINE = InnoDB -CHECKSUM = 1; - -SHOW WARNINGS; -CREATE UNIQUE INDEX `id_UNIQUE` ON `youtubemd`.`Playlist` (`id` ASC) VISIBLE; - -SHOW WARNINGS; - --- ----------------------------------------------------- --- Table `youtubemd`.`Playlist_has_VideoInformation` --- ----------------------------------------------------- -CREATE TABLE IF NOT EXISTS `youtubemd`.`Playlist_has_VideoInformation` ( - `Playlist_id` VARCHAR(60) NOT NULL, - `VideoInformation_id` VARCHAR(11) NOT NULL, - PRIMARY KEY (`Playlist_id`, `VideoInformation_id`), - CONSTRAINT `fk_Playlist_has_VideoInformation_Playlist1` - FOREIGN KEY (`Playlist_id`) - REFERENCES `youtubemd`.`Playlist` (`id`) - ON DELETE NO ACTION - ON UPDATE NO ACTION, - CONSTRAINT `fk_Playlist_has_VideoInformation_VideoInformation1` - FOREIGN KEY (`VideoInformation_id`) - REFERENCES `youtubemd`.`VideoInformation` (`id`) - ON DELETE NO ACTION - ON UPDATE NO ACTION) -ENGINE = InnoDB -CHECKSUM = 1; - -SHOW WARNINGS; -CREATE INDEX `fk_Playlist_has_VideoInformation_VideoInformation1_idx` ON `youtubemd`.`Playlist_has_VideoInformation` (`VideoInformation_id` ASC) VISIBLE; - -SHOW WARNINGS; -CREATE INDEX `fk_Playlist_has_VideoInformation_Playlist1_idx` ON `youtubemd`.`Playlist_has_VideoInformation` (`Playlist_id` ASC) VISIBLE; - -SHOW WARNINGS; - --- ----------------------------------------------------- --- Table `youtubemd`.`PlaylistStatistics` --- ----------------------------------------------------- -CREATE TABLE IF NOT EXISTS `youtubemd`.`PlaylistStatistics` ( - `timesRequested` INT NOT NULL, - `Playlist_id` VARCHAR(60) NOT NULL, - PRIMARY KEY (`Playlist_id`), - CONSTRAINT `fk_PlaylistStatistics_Playlist1` - FOREIGN KEY (`Playlist_id`) - REFERENCES `youtubemd`.`Playlist` (`id`) - ON DELETE NO ACTION - ON UPDATE NO ACTION) -ENGINE = InnoDB -CHECKSUM = 1; - -SHOW WARNINGS; - --- ----------------------------------------------------- --- Table `youtubemd`.`Preferences` --- ----------------------------------------------------- -CREATE TABLE IF NOT EXISTS `youtubemd`.`Preferences` ( - `language` VARCHAR(3) NOT NULL DEFAULT 'en', - `audioQuality` ENUM('320k', '256k', '128k') NOT NULL DEFAULT '128k', - `audioSampling` ENUM('44000', '48000') NOT NULL DEFAULT '44000', - `sendSongLinks` TINYINT NOT NULL DEFAULT 0, - `askForMetadata` TINYINT NOT NULL DEFAULT 1, - `User_id` INT(64) NOT NULL, - PRIMARY KEY (`User_id`), - CONSTRAINT `fk_Preferences_User` - FOREIGN KEY (`User_id`) - REFERENCES `youtubemd`.`User` (`id`) - ON DELETE NO ACTION - ON UPDATE NO ACTION) -ENGINE = InnoDB -CHECKSUM = 1; - -SHOW WARNINGS; - --- ----------------------------------------------------- --- Table `youtubemd`.`User` --- ----------------------------------------------------- -CREATE TABLE IF NOT EXISTS `youtubemd`.`User` ( - `id` INT(64) NOT NULL DEFAULT 0, - `name` VARCHAR(45) NULL DEFAULT 'User', - `surname` VARCHAR(45) NULL, - `username` VARCHAR(45) NULL, - `lastSeen` DATETIME NOT NULL, - `firstUsage` DATETIME NOT NULL, - PRIMARY KEY (`id`)) -ENGINE = InnoDB -CHECKSUM = 1 -PACK_KEYS = 1; - -SHOW WARNINGS; -CREATE UNIQUE INDEX `id_UNIQUE` ON `youtubemd`.`User` (`id` ASC) VISIBLE; - -SHOW WARNINGS; -CREATE UNIQUE INDEX `username_UNIQUE` ON `youtubemd`.`User` (`username` ASC) VISIBLE; - -SHOW WARNINGS; - --- ----------------------------------------------------- --- Table `youtubemd`.`VideoInformation` --- ----------------------------------------------------- -CREATE TABLE IF NOT EXISTS `youtubemd`.`VideoInformation` ( - `id` VARCHAR(11) NOT NULL, - `title` VARCHAR(100) NOT NULL, - `channel` VARCHAR(60) NOT NULL, - PRIMARY KEY (`id`)) -ENGINE = InnoDB -CHECKSUM = 1; - -SHOW WARNINGS; -CREATE UNIQUE INDEX `id_UNIQUE` ON `youtubemd`.`VideoInformation` (`id` ASC) VISIBLE; - -SHOW WARNINGS; - --- ----------------------------------------------------- --- Table `youtubemd`.`VideoStatistics` --- ----------------------------------------------------- -CREATE TABLE IF NOT EXISTS `youtubemd`.`VideoStatistics` ( - `timesRequested` INT NOT NULL DEFAULT 0, - `VideoInformation_id` VARCHAR(11) NOT NULL, - PRIMARY KEY (`VideoInformation_id`), - CONSTRAINT `fk_VideoStatistics_VideoInformation1` - FOREIGN KEY (`VideoInformation_id`) - REFERENCES `youtubemd`.`VideoInformation` (`id`) - ON DELETE NO ACTION - ON UPDATE NO ACTION) -ENGINE = InnoDB -CHECKSUM = 1; - -SHOW WARNINGS; - -SET SQL_MODE=@OLD_SQL_MODE; -SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; -SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; diff --git a/Design/Database/img_database_model.png b/Design/Database/img_database_model.png deleted file mode 100755 index 8d061ce..0000000 Binary files a/Design/Database/img_database_model.png and /dev/null differ diff --git a/Design/Database/new_database_model.mwb b/Design/Database/new_database_model.mwb new file mode 100644 index 0000000..8a3992e Binary files /dev/null and b/Design/Database/new_database_model.mwb differ diff --git a/Design/Database/pdf_database_model.pdf b/Design/Database/pdf_database_model.pdf deleted file mode 100755 index 7275783..0000000 Binary files a/Design/Database/pdf_database_model.pdf and /dev/null differ diff --git a/Design/Database/psql_model.sql b/Design/Database/psql_model.sql new file mode 100644 index 0000000..7fffb89 --- /dev/null +++ b/Design/Database/psql_model.sql @@ -0,0 +1,266 @@ +-- PostgreSQL model for YouTubeMDBot application +-- Created by Javinator9889 - thu, 24 October, 2019 +-- Last modification: mon, 4 November, 2019 +-- Version 1.1 + +-- DROP schema - only for testing +-- DROP SCHEMA IF EXISTS youtubemd CASCADE; +-- DROP TYPE IF EXISTS AFORMAT; +-- DROP TYPE IF EXISTS aquality; +-- DROP TYPE IF EXISTS behaviour; + +-- Custom "enum" types +CREATE TYPE AFORMAT AS ENUM ('mp3', 'm4a', 'ogg'); +CREATE TYPE AQUALITY AS ENUM ('128k', '96k'); +CREATE TYPE BEHAVIOUR AS ENUM ('always', 'not_found', 'ask', 'never'); + +-- Create DB schema +CREATE SCHEMA IF NOT EXISTS youtubemd; + +-- --------------------------------------- +-- Table User -- +-- --------------------------------------- +CREATE TABLE IF NOT EXISTS youtubemd.User +( + "id" INT PRIMARY KEY NOT NULL, + "name" VARCHAR(45), + "tag" VARCHAR(45), + "lang" VARCHAR(2), + "first_access" date +); + +-- --------------------------------------------- +-- Table Preferences -- +-- --------------------------------------------- +CREATE TABLE IF NOT EXISTS youtubemd.Preferences +( + "audio_format" AFORMAT NOT NULL DEFAULT 'm4a', + "audio_quality" AQUALITY NOT NULL DEFAULT '128k', + "song_behaviour" BEHAVIOUR NOT NULL DEFAULT 'not_found', + "send_song_link" BOOLEAN DEFAULT False, + "user_id" INT NOT NULL, + PRIMARY KEY ("user_id"), + CONSTRAINT "fk_user_id" + FOREIGN KEY ("user_id") + REFERENCES youtubemd.User ("id") + ON DELETE CASCADE + ON UPDATE CASCADE +); + +-- ------------------------------------------ +-- Table YouTube -- +-- ------------------------------------------ +CREATE TABLE IF NOT EXISTS youtubemd.YouTube +( + "id" VARCHAR(11) UNIQUE NOT NULL, + "times_requested" INT NOT NULL DEFAULT 0, + PRIMARY KEY ("id") +); + +-- ------------------------------------------ +-- Table Metadata -- +-- ------------------------------------------ +CREATE TABLE IF NOT EXISTS youtubemd.Metadata +( + "id" BIGSERIAL NOT NULL, + "artist" VARCHAR(45) NOT NULL, + "album" VARCHAR(45) NOT NULL, + "cover" BYTEA NOT NULL, + "release_id" VARCHAR(36), + "recording_id" VARCHAR(36), + "duration" INT, + "title" VARCHAR(45), + "custom_metadata" BOOLEAN, + PRIMARY KEY ("id") +); + +-- ---------------------------------------------------- +-- Relation between YouTube and Metadata -- +-- ---------------------------------------------------- +CREATE TABLE IF NOT EXISTS youtubemd.Video_Has_Metadata +( + "id" VARCHAR(11) NOT NULL, + "metadata_id" INT NOT NULL, + PRIMARY KEY ("id", "metadata_id"), + CONSTRAINT "fk_video_id" + FOREIGN KEY ("id") + REFERENCES youtubemd.YouTube ("id"), + CONSTRAINT "fk_metadata_id" + FOREIGN KEY ("metadata_id") + REFERENCES youtubemd.Metadata ("id") +); + +-- -------------------------------------- +-- Table File -- +-- -------------------------------------- +CREATE TABLE IF NOT EXISTS youtubemd.File +( + "id" VARCHAR(50) UNIQUE NOT NULL, + "metadata_id" INT UNIQUE NOT NULL, + "audio_quality" AQUALITY NOT NULL, + "size" INT, + PRIMARY KEY ("id", "metadata_id"), + CONSTRAINT "fk_metadata_id" + FOREIGN KEY ("metadata_id") + REFERENCES youtubemd.Metadata ("id") +); + +-- ----------------------------------------- +-- Table History -- +-- ----------------------------------------- +CREATE TABLE IF NOT EXISTS youtubemd.History +( + "id" BIGSERIAL NOT NULL, + "file_id" VARCHAR(50) NOT NULL, + "user_id" INT NOT NULL, + "metadata_id" INT NOT NULL, + "date" date, + PRIMARY KEY ("id", "file_id", "user_id", "metadata_id"), + CONSTRAINT "fk_user_id" + FOREIGN KEY ("user_id") + REFERENCES youtubemd.User ("id") + ON DELETE CASCADE + ON UPDATE CASCADE, + CONSTRAINT "fk_file_id" + FOREIGN KEY ("file_id") + REFERENCES youtubemd.File ("id"), + CONSTRAINT "fk_metadata_id" + FOREIGN KEY ("metadata_id") + REFERENCES youtubemd.Metadata ("id") +); + +-- ------------------------------------------ +-- Table Playlist -- +-- ------------------------------------------ +CREATE TABLE IF NOT EXISTS youtubemd.Playlist +( + "id" VARCHAR(22) NOT NULL UNIQUE, + PRIMARY KEY ("id") +); + +-- ---------------------------------------------- +-- Table YouTube stats -- +-- ---------------------------------------------- +CREATE TABLE IF NOT EXISTS youtubemd.YouTubeStats +( + "id" VARCHAR(11) NOT NULL UNIQUE, + "daily_requests" INT NOT NULL DEFAULT 1, + "weekly_requests" INT NOT NULL DEFAULT 1, + "monthly_requests" INT NOT NULL DEFAULT 1, + PRIMARY KEY ("id"), + CONSTRAINT "fk_youtube_id" + FOREIGN KEY ("id") + REFERENCES youtubemd.YouTube ("id") +); + +-- Additional indexes +CREATE INDEX youtubemd.user_preferences_ix ON youtubemd.Preferences ("user_id"); +CREATE INDEX youtubemd.video_metadata_ix ON youtubemd.Video_Has_Metadata ("id", "metadata_id"); +CREATE INDEX youtubemd.history_ix ON youtubemd.History ("id", "file_id", "user_id", "metadata_id"); + +-- Trigger that updated the different stats +CREATE FUNCTION youtubemd.process_stats() RETURNS trigger AS +$$ +DECLARE + daily_value INT; + weekly_value INT; + monthly_value INT; +BEGIN + IF (SELECT EXISTS(SELECT 1 FROM youtubemd.YouTubeStats WHERE youtubemd.YouTubeStats.id = NEW.id)) THEN + SELECT INTO daily_value, weekly_value, monthly_value youtubemd.YouTubeStats.daily_requests, + youtubemd.YouTubeStats.weekly_requests, + youtubemd.YouTubeStats.monthly_requests + FROM youtubemd.YouTubeStats + WHERE youtubemd.YouTubeStats.id = NEW.id; + daily_value = daily_value + 1; + weekly_value = weekly_value + 1; + monthly_value = monthly_value + 1; + + UPDATE youtubemd.YouTubeStats + SET daily_requests = daily_value, + weekly_requests = weekly_value, + monthly_requests = monthly_value + WHERE id = NEW.id; + ELSE + INSERT INTO youtubemd.YouTubeStats (id) VALUES (NEW.id); + END IF; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +-- Complementary functions with useful operations +CREATE FUNCTION youtubemd.top_10_daily() + RETURNS TABLE + ( + id VARCHAR(11), + daily_requests INT + ) +AS +$$ +BEGIN + RETURN QUERY SELECT DISTINCT youtubemd.YouTubeStats.id, youtubemd.YouTubeStats.daily_requests + FROM youtubemd.youtubestats + ORDER BY daily_requests DESC + FETCH FIRST 10 ROWS ONLY; +END; +$$ LANGUAGE plpgsql; + +CREATE FUNCTION youtubemd.top_10_weekly() + RETURNS TABLE + ( + id VARCHAR(11), + weekly_requests INT + ) +AS +$$ +BEGIN + RETURN QUERY SELECT DISTINCT youtubemd.YouTubeStats.id, youtubemd.YouTubeStats.weekly_requests + FROM youtubemd.youtubestats + ORDER BY weekly_requests DESC + FETCH FIRST 10 ROWS ONLY; +END; +$$ LANGUAGE plpgsql; + +CREATE FUNCTION youtubemd.top_10_monthly() + RETURNS TABLE + ( + id VARCHAR(11), + monthly_requests INT + ) +AS +$$ +BEGIN + RETURN QUERY SELECT DISTINCT youtubemd.YouTubeStats.id, youtubemd.YouTubeStats.monthly_requests + FROM youtubemd.youtubestats + ORDER BY monthly_requests DESC + FETCH FIRST 10 ROWS ONLY; +END; +$$ LANGUAGE plpgsql; + +CREATE FUNCTION youtubemd.clear_daily_stats() AS +$$ +BEGIN + UPDATE youtubemd.YouTubeStats SET daily_requests = 0; +END; +$$ LANGUAGE plpgsql; + +CREATE FUNCTION youtubemd.clear_weekly_stats() AS +$$ +BEGIN + UPDATE youtubemd.YouTubeStats SET weekly_requests = 0; +END; +$$ LANGUAGE plpgsql; + +CREATE FUNCTION youtubemd.clear_monthly_stats() AS +$$ +BEGIN + UPDATE youtubemd.YouTubeStats SET monthly_requests = 0; +END; +$$ LANGUAGE plpgsql; + +-- Init the trigger +CREATE TRIGGER stats_update + AFTER INSERT OR UPDATE + ON youtubemd.YouTube + FOR EACH ROW +EXECUTE PROCEDURE youtubemd.process_stats(); diff --git a/Design/Database/vect_database_model.svg b/Design/Database/vect_database_model.svg deleted file mode 100755 index d0785cd..0000000 --- a/Design/Database/vect_database_model.svg +++ /dev/null @@ -1,3164 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/YouTubeMDBot/.idea/.gitignore b/YouTubeMDBot/.idea/.gitignore new file mode 100755 index 0000000..0e40fe8 --- /dev/null +++ b/YouTubeMDBot/.idea/.gitignore @@ -0,0 +1,3 @@ + +# Default ignored files +/workspace.xml \ No newline at end of file diff --git a/YouTubeMDBot/.idea/YouTubeMDBot.iml b/YouTubeMDBot/.idea/YouTubeMDBot.iml new file mode 100755 index 0000000..6711606 --- /dev/null +++ b/YouTubeMDBot/.idea/YouTubeMDBot.iml @@ -0,0 +1,11 @@ + + + + + + + + + + \ No newline at end of file diff --git a/YouTubeMDBot/.idea/codeStyles/codeStyleConfig.xml b/YouTubeMDBot/.idea/codeStyles/codeStyleConfig.xml new file mode 100755 index 0000000..a55e7a1 --- /dev/null +++ b/YouTubeMDBot/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/YouTubeMDBot/.idea/dictionaries/javinator9889.xml b/YouTubeMDBot/.idea/dictionaries/javinator9889.xml new file mode 100755 index 0000000..787b6ce --- /dev/null +++ b/YouTubeMDBot/.idea/dictionaries/javinator9889.xml @@ -0,0 +1,10 @@ + + + + acoustid + ffmpeg + fpcalc + javinator + + + \ No newline at end of file diff --git a/YouTubeMDBot/.idea/git_toolbox_prj.xml b/YouTubeMDBot/.idea/git_toolbox_prj.xml new file mode 100644 index 0000000..c7846c0 --- /dev/null +++ b/YouTubeMDBot/.idea/git_toolbox_prj.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/YouTubeMDBot/.idea/inspectionProfiles/profiles_settings.xml b/YouTubeMDBot/.idea/inspectionProfiles/profiles_settings.xml new file mode 100755 index 0000000..105ce2d --- /dev/null +++ b/YouTubeMDBot/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/YouTubeMDBot/.idea/misc.xml b/YouTubeMDBot/.idea/misc.xml new file mode 100755 index 0000000..8656114 --- /dev/null +++ b/YouTubeMDBot/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/YouTubeMDBot/.idea/modules.xml b/YouTubeMDBot/.idea/modules.xml new file mode 100755 index 0000000..48cc268 --- /dev/null +++ b/YouTubeMDBot/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/YouTubeMDBot/.idea/vcs.xml b/YouTubeMDBot/.idea/vcs.xml new file mode 100755 index 0000000..6c0b863 --- /dev/null +++ b/YouTubeMDBot/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file