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 @@
+
+
+
\ 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