diff --git a/api/Database.php b/api/Database.php index 578cc2e..583289f 100644 --- a/api/Database.php +++ b/api/Database.php @@ -2,13 +2,13 @@ class Database { - private static $instance = null; - private $conn; + private static ?Database $instance = null; + private mysqli $conn; - private $servername = "192.168.0.30"; - private $username = "root"; - private $password = "1qayxsw2"; - private $dbname = "mediacenter"; + private string $servername = "192.168.0.30"; + private string $username = "root"; + private string $password = "1qayxsw2"; + private string $dbname = "mediacenter"; // The db connection is established in the private constructor. private function __construct() @@ -34,4 +34,8 @@ class Database { return $this->conn; } + + public function getDatabaseName(){ + return $this->dbname; + } } diff --git a/api/extractvideopreviews.php b/api/extractvideopreviews.php index e0d6207..e420c7c 100755 --- a/api/extractvideopreviews.php +++ b/api/extractvideopreviews.php @@ -26,48 +26,73 @@ foreach ($arr as $elem) { // insert if not available in db if (!mysqli_fetch_assoc($result)) { // try to fetch data from TMDB + $poster = -1; if (!is_null($dta = $tmdb->searchMovie($moviename))) { $pic = file_get_contents($tmdb->picturebase . $dta->poster_path); + $poster = shell_exec("ffmpeg -hide_banner -loglevel panic -ss 00:04:00 -i \"../videos/prn/$elem\" -vframes 1 -q:v 2 -f singlejpeg pipe:1 2>/dev/null"); } else { echo "nothing found with TMDB!\n"; $pic = shell_exec("ffmpeg -hide_banner -loglevel panic -ss 00:04:00 -i \"../videos/prn/$elem\" -vframes 1 -q:v 2 -f singlejpeg pipe:1 2>/dev/null"); } + //convert video to base64 $image_base64 = base64_encode($pic); - + // add base64 fileinfo $image = 'data:image/jpeg;base64,' . $image_base64; + // extract other video attributes $video_attributes = _get_video_attributes($elem); + $duration = 0; + $size = 0; + $width = 0; - $duration = 60 * $video_attributes['hours'] + $video_attributes['mins']; + if ($video_attributes) { + $duration = $video_attributes->media->track[0]->Duration; // in seconds + $size = $video_attributes->media->track[0]->FileSize; // in Bytes + $width = $video_attributes->media->track[1]->Width; // width + } - $query = "INSERT INTO videos(movie_name,movie_url,thumbnail,quality,length) + + if ($poster != -1) { + $poster_base64 = 'data:image/jpeg;base64,' . base64_encode($poster); + + $query = "INSERT INTO videos(movie_name,movie_url,poster,thumbnail,quality,length) + VALUES ('" . mysqli_real_escape_string($conn, $moviename) . "', + '" . mysqli_real_escape_string($conn, 'videos/prn/' . $elem) . "', + '$poster_base64', + '$image', + '$width', + '$duration')"; + } else { + $query = "INSERT INTO videos(movie_name,movie_url,thumbnail,quality,length) VALUES ('" . mysqli_real_escape_string($conn, $moviename) . "', '" . mysqli_real_escape_string($conn, 'videos/prn/' . $elem) . "', '$image', - '" . $video_attributes['height'] . "', + '$width', '$duration')"; + } + if ($conn->query($query) === TRUE) { echo('successfully added ' . $elem . " to video gravity\n"); $last_id = $conn->insert_id; // full hd - if ($video_attributes['height'] >= 1080) { + if ($width >= 1900) { $query = "INSERT INTO video_tags(video_id,tag_id) VALUES ($last_id,2)"; if ($conn->query($query) !== TRUE) { echo "failed to add default tag here.\n"; } } - if ($video_attributes['height'] >= 720 && $video_attributes['height'] < 1080) { + if ($width >= 1250 && $width < 1900) { $query = "INSERT INTO video_tags(video_id,tag_id) VALUES ($last_id,4)"; if ($conn->query($query) !== TRUE) { echo "failed to add default tag here.\n"; } } - if ($video_attributes['height'] < 720) { + if ($width < 1250) { $query = "INSERT INTO video_tags(video_id,tag_id) VALUES ($last_id,3)"; if ($conn->query($query) !== TRUE) { echo "failed to add default tag here.\n"; @@ -83,7 +108,7 @@ foreach ($arr as $elem) { } else { $all++; } - }else{ + } else { echo($elem . " does not contain a .mp4 extension! - skipping \n"); } } @@ -119,7 +144,7 @@ $size = -1; $query = "SELECT table_schema AS \"Database\", ROUND(SUM(data_length + index_length) / 1024 / 1024, 3) AS \"Size\" FROM information_schema.TABLES - WHERE TABLE_SCHEMA='hub' + WHERE TABLE_SCHEMA='" . Database::getInstance()->getDatabaseName() . "' GROUP BY table_schema;"; $result = $conn->query($query); if ($result->num_rows == 1) { @@ -135,41 +160,7 @@ echo "errored in this run: " . $failed . "\n"; function _get_video_attributes($video) { - global $ffmpeg; - - $command = "$ffmpeg -i \"../videos/prn/$video\" -vstats 2>&1"; + $command = "mediainfo \"../videos/prn/$video\" --Output=JSON"; $output = shell_exec($command); - - $codec = "null"; - $width = 0; - $height = 0; - - $regex_sizes = "/Video: ([^,]*), ([^,]*), ([0-9]{1,4})x([0-9]{1,4})/"; // or : $regex_sizes = "/Video: ([^\r\n]*), ([^,]*), ([0-9]{1,4})x([0-9]{1,4})/"; (code from @1owk3y) - if (preg_match($regex_sizes, $output, $regs)) { - $codec = $regs [1] ? $regs [1] : "null"; - $width = $regs [3] ? $regs [3] : 0; - $height = $regs [4] ? $regs [4] : 0; - } - - $hours = 0; - $mins = 0; - $secs = 0; - $ms = 0; - - $regex_duration = "/Duration: ([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}).([0-9]{1,2})/"; - if (preg_match($regex_duration, $output, $regs)) { - $hours = $regs [1] ? $regs [1] : 0; - $mins = $regs [2] ? $regs [2] : 0; - $secs = $regs [3] ? $regs [3] : 0; - $ms = $regs [4] ? $regs [4] : 0; - } - - return array('codec' => $codec, - 'width' => $width, - 'height' => $height, - 'hours' => $hours, - 'mins' => $mins, - 'secs' => $secs, - 'ms' => $ms - ); + return json_decode($output); } diff --git a/api/videoload.php b/api/videoload.php index 916478e..fedfb38 100755 --- a/api/videoload.php +++ b/api/videoload.php @@ -55,13 +55,18 @@ if (isset($_POST['action'])) { echo(json_encode($return)); break; case "loadVideo": - $query = "SELECT movie_name,movie_url,thumbnail,likes,quality,length FROM videos WHERE movie_id='" . $_POST['movieid'] . "'"; + $query = "SELECT movie_name,movie_url,thumbnail,poster,likes,quality,length FROM videos WHERE movie_id='" . $_POST['movieid'] . "'"; $result = $conn->query($query); $row = $result->fetch_assoc(); $arr = array(); - $arr["thumbnail"] = $row["thumbnail"]; + if($row["poster"] == null){ + $arr["thumbnail"] = $row["thumbnail"]; + }else{ + $arr["thumbnail"] = $row["poster"]; + } + $arr["movie_name"] = $row["movie_name"]; $arr["movie_url"] = $row["movie_url"]; $arr["likes"] = $row["likes"]; diff --git a/database.sql b/database.sql index 8eadc74..2005183 100644 --- a/database.sql +++ b/database.sql @@ -12,10 +12,11 @@ create table if not exists videos movie_name varchar(200) null, movie_url varchar(250) null, thumbnail mediumblob null, + poster mediumblob null, likes int default 0 null, - create_date datetime default CURRENT_TIMESTAMP null, quality int null, - length int null comment 'in seconds' + length int null comment 'in seconds', + create_date datetime default CURRENT_TIMESTAMP null ); create table if not exists video_tags @@ -27,3 +28,10 @@ create table if not exists video_tags constraint video_tags_videos_movie_id_fk foreign key (video_id) references videos (movie_id) ); + +INSERT INTO tags (tag_id, tag_name) +VALUES (2, 'fullhd'); +INSERT INTO tags (tag_id, tag_name) +VALUES (3, 'lowquality'); +INSERT INTO tags (tag_id, tag_name) +VALUES (4, 'hd'); diff --git a/src/HomePage.js b/src/HomePage.js index 8910973..3013b8c 100644 --- a/src/HomePage.js +++ b/src/HomePage.js @@ -57,7 +57,7 @@ class HomePage extends React.Component { selectionnr: this.data.length }); this.loadindex = 0; - this.loadPreviewBlock(12); + this.loadPreviewBlock(16); })) .catch(() => { console.log("no connection to backend"); @@ -176,7 +176,7 @@ class HomePage extends React.Component { // comparison if current scroll position is on bottom // 200 stands for bottom offset to trigger load if (window.innerHeight + document.documentElement.scrollTop + 200 >= document.documentElement.offsetHeight) { - this.loadPreviewBlock(6); + this.loadPreviewBlock(8); } } } diff --git a/src/RandomPage.js b/src/RandomPage.js index 082574f..6b4bfd5 100644 --- a/src/RandomPage.js +++ b/src/RandomPage.js @@ -15,7 +15,7 @@ class RandomPage extends React.Component { } componentDidMount() { - this.loadShuffledvideos(6); + this.loadShuffledvideos(4); } render() { @@ -50,7 +50,7 @@ class RandomPage extends React.Component { } shuffleclick() { - this.loadShuffledvideos(6); + this.loadShuffledvideos(4); } loadShuffledvideos(nr) { diff --git a/src/css/Preview.css b/src/css/Preview.css index 0d16a96..1ac3c5b 100644 --- a/src/css/Preview.css +++ b/src/css/Preview.css @@ -3,6 +3,7 @@ color: #3d3d3d; text-align: center; font-weight: bold; + max-width: 266px; } .previewpic { @@ -11,13 +12,15 @@ } .previewimage { - width: 100%; - overflow: hidden; + max-width: 100%; + max-height: 100%; } .videopreview { height: 500px; - width: 250px; + min-width: 266px; + max-width: 410px; + /*width: 250px;*/ float: left; margin-left: 25px; margin-top: 25px;