diff --git a/Design/Database/database_model.mwb b/Design/Database/database_model.mwb
index 03ffdc9..e36a68a 100644
Binary files a/Design/Database/database_model.mwb and b/Design/Database/database_model.mwb differ
diff --git a/Design/Database/database_model.mwb.bak b/Design/Database/database_model.mwb.bak
index ea968e3..03ffdc9 100644
Binary files a/Design/Database/database_model.mwb.bak and b/Design/Database/database_model.mwb.bak differ
diff --git a/Design/Database/generated_sql_file.sql b/Design/Database/generated_sql_file.sql
index e65336e..7ced06a 100644
--- a/Design/Database/generated_sql_file.sql
+++ b/Design/Database/generated_sql_file.sql
@@ -1,5 +1,5 @@
-- MySQL Script generated by MySQL Workbench
--- lun 22 jul 2019 14:28:48 CEST
+-- jue 25 jul 2019 13:50:06 CEST
-- Model: New Model Version: 1.0
-- MySQL Workbench Forward Engineering
@@ -18,82 +18,6 @@ CREATE SCHEMA IF NOT EXISTS `youtubemd` DEFAULT CHARACTER SET utf8mb4 ;
SHOW WARNINGS;
USE `youtubemd` ;
--- -----------------------------------------------------
--- 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`.`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,
- `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`.`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`.`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`.`DownloadInformation`
-- -----------------------------------------------------
@@ -128,6 +52,23 @@ CREATE INDEX `fk_DownloadInformation_VideoInformation1_idx` ON `youtubemd`.`Down
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`
-- -----------------------------------------------------
@@ -154,35 +95,18 @@ CREATE INDEX `fk_History_DownloadInformation1_idx` ON `youtubemd`.`History` (`Do
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;
-
--- -----------------------------------------------------
--- Table `youtubemd`.`DownloadStatistics`
+-- Table `youtubemd`.`Metadata`
-- -----------------------------------------------------
-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)
+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;
@@ -246,6 +170,83 @@ 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
index 6046766..8d061ce 100644
Binary files a/Design/Database/img_database_model.png and b/Design/Database/img_database_model.png differ
diff --git a/Design/Database/pdf_database_model.pdf b/Design/Database/pdf_database_model.pdf
index 4cdb445..7275783 100644
Binary files a/Design/Database/pdf_database_model.pdf and b/Design/Database/pdf_database_model.pdf differ
diff --git a/Design/Database/vect_database_model.svg b/Design/Database/vect_database_model.svg
index fe40b7a..d0785cd 100644
--- a/Design/Database/vect_database_model.svg
+++ b/Design/Database/vect_database_model.svg
@@ -30,187 +30,190 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
+
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -270,13 +273,13 @@
-
-
-
-
-
+
+
+
+
+
-
+
@@ -290,265 +293,134 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
+
+
+
+
-
+
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -562,168 +434,324 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
-
-
+
+
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
-
-
+
+
+
+
-
-
+
+
-
-
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
+
-
+
-
-
-
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
-
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
+
-
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
@@ -733,85 +761,85 @@
-
+
-
+
-
-
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
@@ -825,45 +853,45 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
+
-
+
-
-
-
+
+
+
-
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
@@ -872,89 +900,89 @@
-
-
-
+
+
+
-
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
-
+
-
+
-
-
-
+
+
+
-
-
-
+
+
+
-
+
-
-
+
+
-
-
-
+
+
+
@@ -963,13 +991,13 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -983,116 +1011,116 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
+
-
+
-
+
-
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
+
-
-
-
+
+
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
-
-
+
+
+
+
-
-
+
+
-
-
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
+
-
+
-
-
-
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
-
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
+
-
+
@@ -1100,10 +1128,10 @@
-
-
+
+
-
+
@@ -1112,38 +1140,38 @@
-
-
-
+
+
+
-
+
-
-
+
+
-
-
-
-
-
+
+
+
+
+
-
+
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
@@ -1157,186 +1185,186 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
+
+
+
-
-
+
+
-
+
-
-
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
-
+
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
-
+
-
-
-
-
-
-
+
+
+
+
+
+
-
-
+
+
-
+
-
+
-
+
-
-
-
+
+
+
-
+
-
+
-
-
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
-
+
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
@@ -1352,34 +1380,34 @@
-
+
-
+
-
+
-
-
-
+
+
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
@@ -1396,15 +1424,15 @@
-
+
-
+
-
-
+
+
@@ -1414,79 +1442,79 @@
-
+
-
+
-
-
+
+
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
-
-
+
+
+
-
+
-
-
+
+
-
-
-
-
-
+
+
+
+
+
-
+
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
@@ -1502,90 +1530,90 @@
-
+
-
+
-
+
-
+
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
@@ -1599,85 +1627,85 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
+
-
+
-
+
-
-
-
+
+
+
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
-
-
+
+
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
@@ -1691,9 +1719,9 @@
-
-
-
+
+
+
@@ -1741,265 +1769,134 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
+
+
+
+
-
+
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
@@ -2013,240 +1910,396 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
-
-
+
+
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
-
-
+
+
+
+
-
-
+
+
-
-
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
+
-
+
-
-
-
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
-
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
+
-
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
-
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
@@ -2260,45 +2313,45 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
+
-
+
-
-
-
+
+
+
-
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
@@ -2307,89 +2360,89 @@
-
-
-
+
+
+
-
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
-
+
-
+
-
-
-
+
+
+
-
-
-
+
+
+
-
+
-
-
+
+
-
-
-
+
+
+
@@ -2398,13 +2451,13 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -2418,116 +2471,116 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
+
-
+
-
+
-
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
+
-
-
-
+
+
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
-
-
+
+
+
+
-
-
+
+
-
-
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
+
-
+
-
-
-
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
-
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
+
-
+
@@ -2535,10 +2588,10 @@
-
-
+
+
-
+
@@ -2547,38 +2600,38 @@
-
-
-
+
+
+
-
+
-
-
+
+
-
-
-
-
-
+
+
+
+
+
-
+
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
@@ -2592,186 +2645,186 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
+
+
+
-
-
+
+
-
+
-
-
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
-
+
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
-
+
-
-
-
-
-
-
+
+
+
+
+
+
-
-
+
+
-
+
-
+
-
+
-
-
-
+
+
+
-
+
-
+
-
-
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
-
+
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
@@ -2787,34 +2840,34 @@
-
+
-
+
-
+
-
-
-
+
+
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
@@ -2830,79 +2883,79 @@
-
+
-
+
-
-
+
+
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
-
-
+
+
+
-
+
-
-
+
+
-
-
-
-
-
+
+
+
+
+
-
+
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
@@ -2918,90 +2971,90 @@
-
+
-
+
-
+
-
+
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
@@ -3015,85 +3068,85 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
+
-
+
-
+
-
-
-
+
+
+
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
-
-
+
+
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
diff --git a/YouTubeMDBot/constants/__init__.py b/YouTubeMDBot/constants/__init__.py
index b8d3e20..1402386 100644
--- a/YouTubeMDBot/constants/__init__.py
+++ b/YouTubeMDBot/constants/__init__.py
@@ -13,5 +13,4 @@
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-from ..constants.app_constants import ydl_options
-from ..constants.app_constants import STREAM_OFFSET
+from ..constants.app_constants import ydl_cli_options
diff --git a/YouTubeMDBot/constants/app_constants.py b/YouTubeMDBot/constants/app_constants.py
index f738ade..e1a7cb1 100644
--- a/YouTubeMDBot/constants/app_constants.py
+++ b/YouTubeMDBot/constants/app_constants.py
@@ -13,9 +13,5 @@
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-ydl_options: dict = {
- "format": "bestaudio[ext=m4a]",
- "outtmpl": "-",
- "logger": ""
-}
-STREAM_OFFSET: int = 0
+ydl_cli_options = ["youtube-dl", "--format", "bestaudio[ext=m4a]", "--quiet", "--output",
+ "-"]
diff --git a/YouTubeMDBot/decorators/decorators.py b/YouTubeMDBot/decorators/decorators.py
index 5c305b4..b378e01 100644
--- a/YouTubeMDBot/decorators/decorators.py
+++ b/YouTubeMDBot/decorators/decorators.py
@@ -16,10 +16,9 @@
from functools import wraps
from .. import PROGRAM_ARGS
-from .. import LoggingHandler
-logging = LoggingHandler()
+# logging = LoggingHandler()
def send_action(action):
diff --git a/YouTubeMDBot/downloader/youtube_downloader.py b/YouTubeMDBot/downloader/youtube_downloader.py
index b956952..8736255 100644
--- a/YouTubeMDBot/downloader/youtube_downloader.py
+++ b/YouTubeMDBot/downloader/youtube_downloader.py
@@ -13,27 +13,31 @@
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-import logging
-import youtube_dl
-
-from contextlib import redirect_stdout as save_to
from io import BytesIO
+from typing import Tuple
-from ..constants.app_constants import ydl_options
-from ..constants.app_constants import STREAM_OFFSET
+from ..constants.app_constants import ydl_cli_options
class YouTubeDownloader(object):
- def __init__(self, url: str,
- logger: logging = logging.getLogger("empty-logger")):
+ def __init__(self, url: str):
self.__url: str = url
- self.__options: dict = ydl_options
- self.__options["logger"] = logger
+ self.__options: list = ydl_cli_options.copy()
+ self.__options.append(self.__url)
+
+ def download(self) -> Tuple[BytesIO, bytes]:
+ import subprocess
- def download(self, io: BytesIO = BytesIO()) -> BytesIO:
- with save_to(io):
- with youtube_dl.YoutubeDL(self.__options) as yt_downloader:
- yt_downloader.download([self.__url])
+ proc = subprocess.Popen(self.__options,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ stdout, stderr = proc.communicate()
+ retcode = proc.returncode
+ if retcode == 0:
+ return BytesIO(stdout), stdout
+ else:
+ raise RuntimeError("youtube-dl downloader exception - more info: " +
+ str(stderr))
- io.seek(STREAM_OFFSET)
- return io
+ def get_url(self) -> str:
+ return self.__url
diff --git a/YouTubeMDBot/tests/__main__.py b/YouTubeMDBot/tests/__main__.py
new file mode 100644
index 0000000..5cb134d
--- /dev/null
+++ b/YouTubeMDBot/tests/__main__.py
@@ -0,0 +1,4 @@
+from .downloader import DownloadTest
+
+if __name__ == '__main__':
+ DownloadTest.test_multithread_download()
diff --git a/YouTubeMDBot/tests/downloader.py b/YouTubeMDBot/tests/downloader.py
new file mode 100644
index 0000000..3402283
--- /dev/null
+++ b/YouTubeMDBot/tests/downloader.py
@@ -0,0 +1,32 @@
+import threading
+import unittest
+
+from YouTubeMDBot.downloader import YouTubeDownloader
+
+
+class DownloadTest(unittest.TestCase):
+ def test_multithread_download(self):
+ yt1 = YouTubeDownloader(url="https://www.youtube.com/watch?v=Inm-N5rLUSI")
+ yt2 = YouTubeDownloader(url="https://www.youtube.com/watch?v=-_ZwpOdXXcA")
+ yt3 = YouTubeDownloader(url="https://www.youtube.com/watch?v=WOGWZD5iT10")
+ yt4 = YouTubeDownloader(url="https://www.youtube.com/watch?v=9HfoNUjw5u8")
+ t1 = threading.Thread(target=self.write_to_file, args=(yt1, "v1.m4a",))
+ t2 = threading.Thread(target=self.write_to_file, args=(yt2, "v2.m4a",))
+ t3 = threading.Thread(target=self.write_to_file, args=(yt3, "v3.m4a",))
+ t4 = threading.Thread(target=self.write_to_file, args=(yt4, "v4.m4a",))
+
+ t1.start()
+ t2.start()
+ t3.start()
+ t4.start()
+
+ @staticmethod
+ def write_to_file(yt: YouTubeDownloader, name: str):
+ _, data = yt.download()
+ print(name + " downloaded")
+ with open(name, "wb") as f:
+ f.write(data)
+
+
+if __name__ == '__main__':
+ unittest.main()