diff --git a/.gitignore b/.gitignore
index db596a4..abf4f42 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
/includes/config.toml
/.idea
/fontawesome-free-6.5.2-web/
+/_form/
diff --git a/README.md b/README.md
index fc62843..50ae48e 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,59 @@
-[](https://crowdin.com/project/djmixhostingsoftware)
\ No newline at end of file
+* [DJ Mix Hosting Software](#dj-mix-hosting-software)
+ * [About](#about)
+ * [Features](#features)
+ * [Installation](#installation)
+ * [Usage](#usage)
+ * [Contributing](#contributing)
+ * [License](#license)
+ * [Contact](#contact)
+ * [Acknowledgements](#acknowledgements)
+
+# DJ Mix Hosting Software
+
+[](https://crowdin.com/project/djmixhostingsoftware)
+
+## About
+
+DJ Mix Hosting Software is a web application that allows users to upload and share their DJ mixes. The application is
+built using PHP and MySQL.
+
+## Features
+
+- User login/registration
+- Add, edit, delete DJs
+- Add, upload, edit, delete mixes
+- View mixes by DJ
+- View mixes by genre
+- Basic SEO
+- S3 file storage _(optional)_
+- MP3 tag editing _(optional)_
+
+## Installation
+The repo is the source code for the application. You will need to point your web server to this directory.
+Create a MySQL database using the .sql files in the `sql` directory.
+Copy `includes/config.toml.default` to `includes/config.toml` and update the settings as needed.
+
+## Usage
+The application is designed to be used by DJs to upload and share their mixes. Users can listen to mixes by DJ or genre.
+
+Why would you use this over Soundcloud or Mixcloud? You have full control over the mixes and can customize the application to your liking.
+
+## Contributing
+Contributions are welcome. Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information.
+
+## License
+This is to be determined.
+
+## Contact
+Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for contact information.
+
+## Acknowledgements
+- [Bootstrap](https://getbootstrap.com/)
+- [Font Awesome](https://fontawesome.com/)
+- [jQuery](https://jquery.com/)
+- [PHP](https://www.php.net/)
+- [MariaDB](https://mariadb.org/)
+- [AWS S3](https://aws.amazon.com/s3/)
+- [DigitalOcean](https://www.digitalocean.com/)
+- [Crowdin](https://crowdin.com/)
+- [Cody Cook](https://codycook.us])
\ No newline at end of file
diff --git a/classes/Schema.php b/classes/Schema.php
new file mode 100644
index 0000000..0b22277
--- /dev/null
+++ b/classes/Schema.php
@@ -0,0 +1,60 @@
+
+ {
+ "@context": "https://schema.org",
+ "@type": "MusicRecording",
+ "name": "Future Primitive",
+ "byArtist": {
+ "@type": "MusicGroup",
+ "name": "10-E",
+ "image": "/djs/10e/profile.jpg"
+ },
+ "inAlbum": {
+ "@type": "MusicAlbum",
+ "name": "Future Primitive"
+ },
+ "genre": "Trance",
+ "url": "https://utahsdjs.com/mix/future-primitive",
+ "image": "https://utahsdjs.com//djs/no-art-provided.png",
+
+ "duration": "PT1H11M5S",
+
+ "datePublished": "2009-03-02 23:57:01",
+ "description": "Listen to Future Primitive on Utah's DJs.",
+ "interactionStatistic": {
+ "@type": "InteractionCounter",
+ "interactionType": "https://schema.org/ListenAction",
+ "userInteractionCount": "537",
+ "url": "https://utahsdjs.com/mix/future-primitive/download"
+ }
+ }
+
+
+
+
+ */
+
+
+}
\ No newline at end of file
diff --git a/classes/Telegram.php b/classes/Telegram.php
new file mode 100644
index 0000000..a59db30
--- /dev/null
+++ b/classes/Telegram.php
@@ -0,0 +1,60 @@
+token = $token;
+ $this->chat_id = $chat_id;
+ $this->reply_to_message_id = $reply_to_message_id;
+ $this->url .= $this->token;
+ }
+
+ public function send_message($message)
+ {
+ $this->message = $message;
+ $result = $this->sendMessage();
+
+ if ($result) {
+ return json_decode($result, true);
+ }
+ return false;
+
+ }
+
+ private function sendMessage()
+ {
+ $ch = curl_init();
+ curl_setopt_array($ch, [
+ CURLOPT_URL => $this->url . "/sendMessage",
+ CURLOPT_POST => true,
+ CURLOPT_POSTFIELDS => [
+ 'chat_id' => $this->chat_id,
+ 'text' => $this->message,
+ 'parse_mode' => $this->parse_mode,
+ 'disable_web_page_preview' => $this->disable_web_page_preview,
+ 'disable_notification' => $this->disable_notification,
+ 'reply_to_message_id' => $this->reply_to_message_id
+ ],
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_HEADER => false,
+ CURLOPT_SSL_VERIFYPEER => false
+ ]);
+ $result = curl_exec($ch);
+ curl_close($ch);
+ return $result;
+
+
+ }
+
+}
\ No newline at end of file
diff --git a/classes/Upload.php b/classes/Upload.php
new file mode 100644
index 0000000..bb810b3
--- /dev/null
+++ b/classes/Upload.php
@@ -0,0 +1,88 @@
+file = $file;
+ $this->file_name = $file['name'];
+ $this->file_size = $file['size'];
+ $this->file_tmp = $file['tmp_name'];
+ $this->file_type = $file['type'];
+ $this->config = $config;
+ $ext = explode('.', $file['name']);
+ $this->file_ext = strtolower(end($ext));
+ $this->uuid = uniqid();
+
+ }
+
+ private function check_file_size(): bool
+ {
+ if ($this->file_size > $this->config['uploads']['max_file_size']){
+ $this->errors[] = "File size is too large";
+ return false;
+ }
+ return true;
+ }
+
+ private function check_file_extension(): bool
+ {
+ if (!in_array($this->file_ext, $this->extensions)){
+ $this->errors[] = "Invalid file extension";
+ return false;
+ }
+ return true;
+ }
+
+ private function check_file_exists(): bool
+ {
+ if (file_exists($this->upload_dir . $this->file_name)){
+ $this->errors[] = "File already exists";
+ return false;
+ }
+ return true;
+ }
+
+ private function move_file(): bool
+ {
+ if (move_uploaded_file($this->file_tmp, $this->upload_dir . $this->uuid)){
+ $this->file_path = $this->upload_dir . $this->uuid;
+ return true;
+ }
+ return false;
+ }
+
+ public function dump_all()
+ {
+ $array = array(
+ "file" => $this->file,
+ "file_name" => $this->file_name,
+ "file_size" => $this->file_size,
+ "file_tmp" => $this->file_tmp,
+ "file_type" => $this->file_type,
+ "file_ext" => $this->file_ext,
+ "file_path" => $this->file_path,
+ "extensions" => $this->extensions,
+ "upload_dir" => $this->upload_dir,
+ "errors" => $this->errors,
+ "ok" => $this->ok,
+ "uuid" => $this->uuid
+ );
+ }
+
+}
diff --git a/contact.php b/contact.php
new file mode 100644
index 0000000..d43a1c7
--- /dev/null
+++ b/contact.php
@@ -0,0 +1,66 @@
+send_message("Name: $name\nEmail: $email\nMessage: $message");
+}
+$title = $locale['contactus'];
+require_once 'includes/header.php';
+if ($_POST) {
+ if ($result['ok']) {
+ echo '
Message sent successfully
';
+ } else {
+ echo 'An error occurred while sending the message
';
+ }
+}
+?>
+
+
+
+
+
+
For any inquiries, please complete the form below.
+
+
+
+
+
+
+
+
diff --git a/includes/navbar.php b/includes/navbar.php
index bd96e35..bfd94de 100644
--- a/includes/navbar.php
+++ b/includes/navbar.php
@@ -58,7 +58,7 @@ $current_lang = $_SESSION['lang'] ?? $config['app']['locale'];
-
+
' . $locale['userProfile'] . '';
@@ -71,6 +71,7 @@ $current_lang = $_SESSION['lang'] ?? $config['app']['locale'];
aria-label="">
+
diff --git a/index.php b/index.php
index 4b90c39..a1a4ba1 100644
--- a/index.php
+++ b/index.php
@@ -15,4 +15,5 @@ require 'includes/header.php'; ?>
+
\ No newline at end of file
diff --git a/locale/en-US/messages.php b/locale/en-US/messages.php
index 02d3dba..3c9e3b0 100644
--- a/locale/en-US/messages.php
+++ b/locale/en-US/messages.php
@@ -51,6 +51,8 @@ return [
"downloadMix" => "Download Mix",
"plays" => "Plays",
"play" => "Play",
+ "contactus" => "Contact Us",
+ "allrightsreserved" => "All rights reserved.",
diff --git a/sql/database.sql b/sql/database.sql
new file mode 100644
index 0000000..16de4d4
--- /dev/null
+++ b/sql/database.sql
@@ -0,0 +1,404 @@
+-- --------------------------------------------------------
+-- Server version: 10.11.6-MariaDB-0+deb12u1 - Debian 12
+-- Server OS: debian-linux-gnu
+-- --------------------------------------------------------
+
+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
+/*!40101 SET NAMES utf8 */;
+/*!50503 SET NAMES utf8mb4 */;
+/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
+/*!40103 SET TIME_ZONE='+00:00' */;
+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
+/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
+
+
+-- Dumping database structure for djmixhostingsoftware
+DROP DATABASE IF EXISTS `djmixhostingsoftware`;
+CREATE DATABASE IF NOT EXISTS `djmixhostingsoftware` /*!40100 DEFAULT CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci */;
+USE `djmixhostingsoftware`;
+
+-- Dumping structure for table djmixhostingsoftware.djs
+DROP TABLE IF EXISTS `djs`;
+CREATE TABLE IF NOT EXISTS `djs` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `name` longtext NOT NULL,
+ `bio` longtext DEFAULT NULL,
+ `slug` longtext NOT NULL,
+ `img` longtext DEFAULT NULL,
+ `active` tinyint(1) unsigned DEFAULT NULL,
+ `deceased` tinyint(1) unsigned DEFAULT NULL,
+ `email` varchar(300) DEFAULT NULL,
+ `enabled` tinyint(4) NOT NULL DEFAULT 0,
+ `status` tinyint(4) DEFAULT NULL,
+ `facebook_url` varchar(50) DEFAULT NULL,
+ `instagram_url` varchar(50) DEFAULT NULL,
+ `myspace_url` varchar(50) DEFAULT NULL,
+ `custom1_url` varchar(200) DEFAULT NULL,
+ `homepage_url` varchar(200) DEFAULT NULL,
+ `twitter_url` varchar(50) DEFAULT NULL,
+ `linktree_url` varchar(50) DEFAULT NULL,
+ `soundcloud_url` varchar(50) DEFAULT NULL,
+ `mixcloud_url` varchar(50) DEFAULT NULL,
+ `socials` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`socials`)),
+ `claimed_by` varchar(50) DEFAULT NULL,
+ `count` int(11) DEFAULT NULL,
+ `created` timestamp NOT NULL DEFAULT current_timestamp(),
+ `lastupdated` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=903 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci COMMENT='The DJ database.';
+
+-- Data exporting was unselected.
+
+-- Dumping structure for table djmixhostingsoftware.emails
+DROP TABLE IF EXISTS `emails`;
+CREATE TABLE IF NOT EXISTS `emails` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `messageId` varchar(75) DEFAULT NULL,
+ `sender` varchar(128) DEFAULT NULL,
+ `recipients` text DEFAULT NULL,
+ `subject` text DEFAULT NULL,
+ `bodyText` text DEFAULT NULL,
+ `bodyHTML` text DEFAULT NULL,
+ `error` text DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `messageId` (`messageId`)
+) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
+
+-- Data exporting was unselected.
+
+-- Dumping structure for table djmixhostingsoftware.errors
+DROP TABLE IF EXISTS `errors`;
+CREATE TABLE IF NOT EXISTS `errors` (
+ `id` int(6) unsigned NOT NULL AUTO_INCREMENT,
+ `error` varchar(255) DEFAULT NULL,
+ `url` varchar(255) DEFAULT NULL,
+ `useragent` varchar(255) DEFAULT NULL,
+ `server` varchar(255) DEFAULT NULL,
+ `ip` varchar(255) DEFAULT NULL,
+ `time` varchar(255) DEFAULT NULL,
+ `querystring` varchar(255) DEFAULT NULL,
+ `requesturi` varchar(255) DEFAULT NULL,
+ `scriptname` varchar(255) DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=9143 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
+
+-- Data exporting was unselected.
+
+-- Dumping structure for table djmixhostingsoftware.genres
+DROP TABLE IF EXISTS `genres`;
+CREATE TABLE IF NOT EXISTS `genres` (
+ `item` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `id` int(11) unsigned NOT NULL,
+ `enabled` int(11) unsigned NOT NULL DEFAULT 1,
+ `count` int(11) unsigned NOT NULL DEFAULT 0,
+ `name` varchar(50) NOT NULL,
+ `slug` varchar(50) NOT NULL,
+ PRIMARY KEY (`item`),
+ UNIQUE KEY `slug` (`slug`)
+) ENGINE=InnoDB AUTO_INCREMENT=236 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci COMMENT='The Genre Database.';
+
+-- Data exporting was unselected.
+
+-- Dumping structure for table djmixhostingsoftware.mix
+DROP TABLE IF EXISTS `mix`;
+CREATE TABLE IF NOT EXISTS `mix` (
+ `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `title` varchar(200) NOT NULL,
+ `slug` varchar(50) NOT NULL,
+ `description` varchar(500) DEFAULT NULL,
+ `cover` varchar(150) DEFAULT NULL,
+ `url` varchar(200) NOT NULL,
+ `seconds` int(10) unsigned DEFAULT NULL,
+ `mediaplayer` int(11) unsigned DEFAULT NULL,
+ `dj1` int(11) unsigned NOT NULL,
+ `dj2` int(11) unsigned DEFAULT NULL,
+ `dj3` int(11) unsigned DEFAULT NULL,
+ `pending` tinyint(4) unsigned NOT NULL DEFAULT 1,
+ `recorded` timestamp NULL DEFAULT NULL,
+ `created` timestamp NULL DEFAULT current_timestamp(),
+ `lastupdated` timestamp NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `slug` (`slug`)
+) ENGINE=InnoDB AUTO_INCREMENT=1153 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
+
+-- Data exporting was unselected.
+
+-- Dumping structure for table djmixhostingsoftware.mix_file
+DROP TABLE IF EXISTS `mix_file`;
+CREATE TABLE IF NOT EXISTS `mix_file` (
+ `id` varchar(50) NOT NULL DEFAULT uuid(),
+ `filename` varchar(100) NOT NULL,
+ `seconds` int(11) unsigned NOT NULL,
+ `mime` varchar(50) NOT NULL,
+ `hash` char(50) NOT NULL,
+ `created` timestamp NOT NULL DEFAULT current_timestamp(),
+ `lastupdated` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
+ KEY `id` (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
+
+-- Data exporting was unselected.
+
+-- Dumping structure for table djmixhostingsoftware.mix_meta
+DROP TABLE IF EXISTS `mix_meta`;
+CREATE TABLE IF NOT EXISTS `mix_meta` (
+ `meta_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `mix_id` int(11) unsigned NOT NULL,
+ `attribute` longtext NOT NULL,
+ `value` longtext NOT NULL,
+ `created` timestamp NOT NULL DEFAULT current_timestamp(),
+ `updated` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
+ PRIMARY KEY (`meta_id`),
+ KEY `mixId` (`mix_id`)
+) ENGINE=InnoDB AUTO_INCREMENT=3987 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
+
+-- Data exporting was unselected.
+
+-- Dumping structure for table djmixhostingsoftware.plays
+DROP TABLE IF EXISTS `plays`;
+CREATE TABLE IF NOT EXISTS `plays` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `mix_id` int(11) unsigned NOT NULL,
+ `ip` varchar(100) NOT NULL,
+ `created` timestamp NULL DEFAULT current_timestamp(),
+ `updated` timestamp NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=5344 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci COMMENT='Implemented 2023/04/09 at 12:01 AM';
+
+-- Data exporting was unselected.
+
+-- Dumping structure for table djmixhostingsoftware.ratings
+DROP TABLE IF EXISTS `ratings`;
+CREATE TABLE IF NOT EXISTS `ratings` (
+ `id` char(36) NOT NULL DEFAULT uuid(),
+ `mixId` int(10) unsigned NOT NULL,
+ `guid` char(36) NOT NULL DEFAULT '0',
+ `rating` int(1) unsigned NOT NULL DEFAULT 5,
+ `created` timestamp NOT NULL DEFAULT current_timestamp(),
+ `updated` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `mixId_guid` (`mixId`,`guid`),
+ KEY `guid` (`guid`),
+ CONSTRAINT `guid` FOREIGN KEY (`guid`) REFERENCES `users` (`guid`) ON DELETE NO ACTION ON UPDATE NO ACTION,
+ CONSTRAINT `Rating` CHECK (`rating` >= 1 and `rating` <= 5)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
+
+-- Data exporting was unselected.
+
+-- Dumping structure for table djmixhostingsoftware.release
+DROP TABLE IF EXISTS `release`;
+CREATE TABLE IF NOT EXISTS `release` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `title` longtext NOT NULL,
+ `description` longtext DEFAULT NULL,
+ `cover` int(11) NOT NULL,
+ `lastupdated` datetime DEFAULT NULL,
+ `created` datetime DEFAULT NULL,
+ `slug` longtext DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
+
+-- Data exporting was unselected.
+
+-- Dumping structure for table djmixhostingsoftware.release_meta
+DROP TABLE IF EXISTS `release_meta`;
+CREATE TABLE IF NOT EXISTS `release_meta` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `release_id` int(11) NOT NULL,
+ `mix_id` int(11) NOT NULL,
+ `sortorder` int(11) NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
+
+-- Data exporting was unselected.
+
+-- Dumping structure for table djmixhostingsoftware.shows
+DROP TABLE IF EXISTS `shows`;
+CREATE TABLE IF NOT EXISTS `shows` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `name` longtext NOT NULL,
+ `description` longtext DEFAULT NULL,
+ `cover` longtext DEFAULT NULL,
+ `slug` longtext DEFAULT NULL,
+ `count` int(11) DEFAULT NULL,
+ `created` datetime DEFAULT current_timestamp(),
+ `lastupdated` datetime DEFAULT current_timestamp() ON UPDATE current_timestamp(),
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
+
+-- Data exporting was unselected.
+
+-- Dumping structure for table djmixhostingsoftware.stats
+DROP TABLE IF EXISTS `stats`;
+CREATE TABLE IF NOT EXISTS `stats` (
+ `id` bigint(20) NOT NULL AUTO_INCREMENT,
+ `uuid` varchar(50) NOT NULL DEFAULT uuid(),
+ `timestamp` timestamp NOT NULL DEFAULT current_timestamp(),
+ `djs` int(11) NOT NULL,
+ `mixes` int(11) NOT NULL,
+ `genres` int(11) NOT NULL,
+ `mixshows` int(11) NOT NULL,
+ `downloads` int(11) NOT NULL,
+ `plays` int(11) NOT NULL,
+ `seconds` bigint(20) NOT NULL,
+ PRIMARY KEY (`uuid`) USING BTREE,
+ KEY `id` (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=420 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
+
+-- Data exporting was unselected.
+
+-- Dumping structure for table djmixhostingsoftware.users
+DROP TABLE IF EXISTS `users`;
+CREATE TABLE IF NOT EXISTS `users` (
+ `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `guid` char(36) NOT NULL DEFAULT uuid(),
+ `username` varchar(25) NOT NULL,
+ `firstName` varchar(50) DEFAULT NULL,
+ `lastName` varchar(50) DEFAULT NULL,
+ `email` varchar(200) NOT NULL,
+ `emailVerified` tinyint(1) NOT NULL DEFAULT 0,
+ `password` varchar(255) NOT NULL,
+ `img` varchar(500) DEFAULT NULL,
+ `apiKey` varchar(64) DEFAULT NULL,
+ `created` timestamp NOT NULL DEFAULT current_timestamp(),
+ `lastupdated` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
+ `isAdmin` tinyint(1) unsigned DEFAULT 0,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `guid` (`guid`),
+ UNIQUE KEY `username` (`username`),
+ UNIQUE KEY `email` (`email`),
+ UNIQUE KEY `apiKey` (`apiKey`)
+) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
+
+-- Data exporting was unselected.
+
+-- Dumping structure for trigger djmixhostingsoftware.dj_insert_trigger
+DROP TRIGGER IF EXISTS `dj_insert_trigger`;
+SET @OLDTMP_SQL_MODE=@@SQL_MODE, SQL_MODE='ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
+DELIMITER //
+CREATE TRIGGER `dj_insert_trigger` BEFORE INSERT ON `djs` FOR EACH ROW BEGIN
+ SET NEW.email = IFNULL(NULLIF(NEW.email, ''), NULL);
+ SET NEW.facebook_url = IFNULL(NULLIF(NEW.facebook_url, ''), NULL);
+ SET NEW.instagram_url = IFNULL(NULLIF(NEW.instagram_url, ''), NULL);
+ SET NEW.myspace_url = IFNULL(NULLIF(NEW.myspace_url, ''), NULL);
+ SET NEW.custom1_url = IFNULL(NULLIF(NEW.custom1_url, ''), NULL);
+ SET NEW.homepage_url = IFNULL(NULLIF(NEW.homepage_url, ''), NULL);
+ SET NEW.twitter_url = IFNULL(NULLIF(NEW.twitter_url, ''), NULL);
+ SET NEW.bio = IFNULL(NULLIF(NEW.bio, ''), NULL);
+ SET NEW.img = IFNULL(NULLIF(NEW.img, ''), NULL);
+ SET NEW.linktree_url = IFNULL(NULLIF(NEW.linktree_url, ''), NULL);
+ SET NEW.soundcloud_url = IFNULL(NULLIF(NEW.soundcloud_url, ''), NULL);
+ SET NEW.mixcloud_url = IFNULL(NULLIF(NEW.mixcloud_url, ''), NULL);
+ SET NEW.claimed_by = IFNULL(NULLIF(NEW.claimed_by, ''), NULL);
+END//
+DELIMITER ;
+SET SQL_MODE=@OLDTMP_SQL_MODE;
+
+-- Dumping structure for trigger djmixhostingsoftware.dj_update_trigger
+DROP TRIGGER IF EXISTS `dj_update_trigger`;
+SET @OLDTMP_SQL_MODE=@@SQL_MODE, SQL_MODE='ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
+DELIMITER //
+CREATE TRIGGER `dj_update_trigger` BEFORE UPDATE ON `djs` FOR EACH ROW BEGIN
+ SET NEW.email = IFNULL(NULLIF(NEW.email, ''), NULL);
+ SET NEW.facebook_url = IFNULL(NULLIF(NEW.facebook_url, ''), NULL);
+ SET NEW.instagram_url = IFNULL(NULLIF(NEW.instagram_url, ''), NULL);
+ SET NEW.myspace_url = IFNULL(NULLIF(NEW.myspace_url, ''), NULL);
+ SET NEW.custom1_url = IFNULL(NULLIF(NEW.custom1_url, ''), NULL);
+ SET NEW.homepage_url = IFNULL(NULLIF(NEW.homepage_url, ''), NULL);
+ SET NEW.twitter_url = IFNULL(NULLIF(NEW.twitter_url, ''), NULL);
+ SET NEW.linktree_url = IFNULL(NULLIF(NEW.linktree_url, ''), NULL);
+ SET NEW.soundcloud_url = IFNULL(NULLIF(NEW.soundcloud_url, ''), NULL);
+ SET NEW.mixcloud_url = IFNULL(NULLIF(NEW.mixcloud_url, ''), NULL);
+ SET NEW.claimed_by = IFNULL(NULLIF(NEW.claimed_by, ''), NULL);
+ SET NEW.bio = IFNULL(NULLIF(NEW.bio, ''), NULL);
+ SET NEW.img = IFNULL(NULLIF(NEW.img, ''), NULL);
+END//
+DELIMITER ;
+SET SQL_MODE=@OLDTMP_SQL_MODE;
+
+-- Dumping structure for trigger djmixhostingsoftware.email_change
+DROP TRIGGER IF EXISTS `email_change`;
+SET @OLDTMP_SQL_MODE=@@SQL_MODE, SQL_MODE='ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
+DELIMITER //
+CREATE TRIGGER email_change
+ BEFORE UPDATE ON users
+ FOR EACH ROW
+BEGIN
+ IF NEW.email <> OLD.email THEN
+ SET NEW.emailVerified = 0;
+ END IF;
+END//
+DELIMITER ;
+SET SQL_MODE=@OLDTMP_SQL_MODE;
+
+-- Dumping structure for trigger djmixhostingsoftware.mix_before_update
+DROP TRIGGER IF EXISTS `mix_before_update`;
+SET @OLDTMP_SQL_MODE=@@SQL_MODE, SQL_MODE='ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
+DELIMITER //
+CREATE TRIGGER mix_before_update
+ BEFORE UPDATE ON mix
+ FOR EACH ROW
+BEGIN
+ IF NEW.description = '' THEN
+ SET NEW.description = NULL;
+ END IF;
+
+ IF NEW.cover = '' THEN
+ SET NEW.cover = NULL;
+ END IF;
+END//
+DELIMITER ;
+SET SQL_MODE=@OLDTMP_SQL_MODE;
+
+-- Dumping structure for trigger djmixhostingsoftware.mix_recorded_before_update
+DROP TRIGGER IF EXISTS `mix_recorded_before_update`;
+SET @OLDTMP_SQL_MODE=@@SQL_MODE, SQL_MODE='ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
+DELIMITER //
+CREATE TRIGGER mix_recorded_before_update
+ BEFORE UPDATE ON mix
+ FOR EACH ROW
+BEGIN
+ IF NEW.recorded = '0000-00-00 00:00:00' THEN
+ SET NEW.recorded = NULL;
+ END IF;
+END//
+DELIMITER ;
+SET SQL_MODE=@OLDTMP_SQL_MODE;
+
+-- Dumping structure for trigger djmixhostingsoftware.tracklist_trim_insert
+DROP TRIGGER IF EXISTS `tracklist_trim_insert`;
+SET @OLDTMP_SQL_MODE=@@SQL_MODE, SQL_MODE='ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
+DELIMITER //
+CREATE TRIGGER tracklist_trim_insert
+ BEFORE INSERT ON mix_meta
+ FOR EACH ROW
+BEGIN
+ IF NEW.attribute = 'tracklist' THEN
+ SET NEW.value = REGEXP_REPLACE(NEW.value, '^(\\s*(\\r\\n|\\r|\\n))+|(\\s*(\\r\\n|\\r|\\n))+$', '');
+ SET NEW.value = REGEXP_REPLACE(NEW.value, '(\\r\\n\\s*){2,}|(\\n\\s*){2,}', '\r\n\r\n');
+ END IF;
+END//
+DELIMITER ;
+SET SQL_MODE=@OLDTMP_SQL_MODE;
+
+-- Dumping structure for trigger djmixhostingsoftware.tracklist_trim_update
+DROP TRIGGER IF EXISTS `tracklist_trim_update`;
+SET @OLDTMP_SQL_MODE=@@SQL_MODE, SQL_MODE='ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
+DELIMITER //
+CREATE TRIGGER tracklist_trim_update
+ BEFORE UPDATE ON mix_meta
+ FOR EACH ROW
+BEGIN
+ IF NEW.attribute = 'tracklist' THEN
+ SET NEW.value = REGEXP_REPLACE(NEW.value, '^(\\s*(\\r\\n|\\r|\\n))+|(\\s*(\\r\\n|\\r|\\n))+$', '');
+ SET NEW.value = REGEXP_REPLACE(NEW.value, '(\\r\\n\\s*){2,}|(\\n\\s*){2,}', '\r\n\r\n');
+ END IF;
+END//
+DELIMITER ;
+SET SQL_MODE=@OLDTMP_SQL_MODE;
+
+/*!40103 SET TIME_ZONE=IFNULL(@OLD_TIME_ZONE, 'system') */;
+/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */;
+/*!40014 SET FOREIGN_KEY_CHECKS=IFNULL(@OLD_FOREIGN_KEY_CHECKS, 1) */;
+/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
+/*!40111 SET SQL_NOTES=IFNULL(@OLD_SQL_NOTES, 1) */;