2020-05-16 20:18:32 +02:00
<? php
2020-05-23 23:47:15 +02:00
require 'Database.php' ;
2020-06-03 18:26:30 +02:00
require 'TMDBMovie.php' ;
2020-07-18 01:10:04 +02:00
require 'SSettings.php' ;
2020-06-03 18:26:30 +02:00
2020-07-23 22:20:43 +02:00
// allow UTF8 characters
setlocale ( LC_ALL , 'en_US.UTF-8' );
2020-06-04 22:19:18 +02:00
writeLog ( "starting extraction! \n " );
2020-06-02 16:15:12 +02:00
$ffmpeg = 'ffmpeg' ; //or: /usr/bin/ffmpeg , or /usr/local/bin/ffmpeg - depends on your installation (type which ffmpeg into a console to find the install path)
2020-06-03 18:26:30 +02:00
$tmdb = new TMDBMovie ();
2020-06-12 20:09:54 +02:00
// initial load of all available movie genres
2020-06-08 17:52:58 +02:00
$tmdbgenres = $tmdb -> getAllGenres ();
2020-05-23 23:47:15 +02:00
$conn = Database :: getInstance () -> getConnection ();
2020-07-18 01:10:04 +02:00
$settings = new SSettings ();
2020-05-23 23:47:15 +02:00
2020-07-18 01:10:04 +02:00
// load video path from settings
$scandir = "../" . $settings -> getVideoPath ();
2020-06-03 18:26:30 +02:00
$arr = scandir ( $scandir );
2020-05-16 20:18:32 +02:00
2020-05-23 23:47:15 +02:00
$all = 0 ;
$added = 0 ;
2020-05-27 21:35:02 +02:00
$deleted = 0 ;
2020-05-23 23:47:15 +02:00
$failed = 0 ;
2020-05-16 20:18:32 +02:00
foreach ( $arr as $elem ) {
2020-07-23 22:20:43 +02:00
$ext = pathinfo ( $elem , PATHINFO_EXTENSION );
if ( $ext == "mp4" ) {
$moviename = substr ( $elem , 0 , - 4 );
2020-05-23 23:47:15 +02:00
2020-07-23 22:20:43 +02:00
$query = "SELECT * FROM videos WHERE movie_name = '" . mysqli_real_escape_string ( $conn , $moviename ) . "'" ;
$result = $conn -> query ( $query );
2020-05-27 21:35:02 +02:00
2020-07-23 22:20:43 +02:00
// insert if not available in db
if ( ! mysqli_fetch_assoc ( $result )) {
$genres = - 1 ;
$poster = - 1 ; // initially disable poster supp
// extract poster from video
$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" );
// check if tmdb grabbing is enabled
if ( $settings -> isTMDBGrabbingEnabled ()) {
// search in tmdb api
if ( ! is_null ( $dta = $tmdb -> searchMovie ( $moviename ))) {
$poster = file_get_contents ( $tmdb -> picturebase . $dta -> poster_path );
2020-07-18 01:10:04 +02:00
2020-07-23 22:20:43 +02:00
// error handling for download error
if ( ! $poster ) {
echo "Failed to load Picture from TMDB! \n " ;
2020-06-08 19:54:20 +02:00
}
2020-07-23 22:20:43 +02:00
// store genre ids for parsing later
$genres = $dta -> genre_ids ;
} else {
// nothing found with tmdb
echo "nothing found with TMDB! \n " ;
writeLog ( "nothing found with TMDB! \n " );
2020-06-03 18:26:30 +02:00
}
2020-07-23 22:20:43 +02:00
}
2020-05-23 23:47:15 +02:00
2020-07-23 22:20:43 +02:00
// convert video to base64
$image = 'data:image/jpeg;base64,' . base64_encode ( $pic );
2020-05-23 23:47:15 +02:00
2020-07-23 22:20:43 +02:00
// extract other video attributes
$video_attributes = _get_video_attributes ( $elem );
$duration = 0 ;
$size = 0 ;
$width = 0 ;
2020-06-02 16:15:12 +02:00
2020-07-23 22:20:43 +02:00
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
}
2020-06-02 16:15:12 +02:00
2020-06-04 00:15:06 +02:00
2020-07-23 22:20:43 +02:00
if ( ! $poster ) {
$poster_base64 = 'data:image/jpeg;base64,' . base64_encode ( $poster );
2020-06-04 00:15:06 +02:00
2020-07-23 22:20:43 +02:00
$query = "INSERT INTO videos(movie_name,movie_url,poster,thumbnail,quality,length)
2020-06-04 00:15:06 +02:00
VALUES ('" . mysqli_real_escape_string ( $conn , $moviename ) . "',
'" . mysqli_real_escape_string ( $conn , 'videos/prn/' . $elem ) . "',
' $poster_base64 ',
' $image ',
' $width ',
' $duration ')" ;
2020-07-23 22:20:43 +02:00
} else {
$query = "INSERT INTO videos(movie_name,movie_url,thumbnail,quality,length)
2020-06-03 18:26:30 +02:00
VALUES ('" . mysqli_real_escape_string ( $conn , $moviename ) . "',
2020-06-02 16:15:12 +02:00
'" . mysqli_real_escape_string ( $conn , 'videos/prn/' . $elem ) . "',
' $image ',
2020-06-04 00:15:06 +02:00
' $width ',
2020-06-02 16:15:12 +02:00
' $duration ')" ;
2020-07-23 22:20:43 +02:00
}
if ( $conn -> query ( $query ) === TRUE ) {
echo ( 'successfully added ' . $elem . " to video gravity \n " );
writeLog ( 'successfully added ' . $elem . " to video gravity \n " );
// add this entry to the default tags
$last_id = $conn -> insert_id ;
// full hd
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 " ;
writeLog ( "failed to add default tag here. \n " );
}
}
// HD
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 " ;
writeLog ( "failed to add default tag here. \n " );
}
}
// SD
if ( $width < 1250 && $width > 0 ) {
$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 " ;
writeLog ( "failed to add default tag here. \n " );
}
}
// handle tmdb genres here!
if ( $genres != - 1 ) {
// transform genre ids in valid names
foreach ( $genres as $genreid ) {
// check if genre is already a tag in db if not insert it
$tagname = array_column ( $tmdbgenres , 'name' , 'id' )[ $genreid ];
$tagid = tagExists ( $tagname );
$query = "INSERT INTO video_tags(video_id,tag_id) VALUES ( $last_id , $tagid )" ;
if ( $conn -> query ( $query ) !== TRUE ) {
echo "failed to add $genreid tag here. \n " ;
writeLog ( "failed to add $genreid tag here. \n " );
}
}
2020-06-04 00:15:06 +02:00
}
2020-05-23 23:47:15 +02:00
2020-07-23 22:20:43 +02:00
$added ++ ;
2020-06-03 18:26:30 +02:00
$all ++ ;
2020-07-23 22:20:43 +02:00
} else {
echo ( 'errored item: ' . $elem . " \n " );
writeLog ( 'errored item: ' . $elem . " \n " );
echo ( '{"data":"' . $conn -> error . '"}\n' );
writeLog ( '{"data":"' . $conn -> error . '"}\n' );
$failed ++ ;
2020-05-23 23:47:15 +02:00
}
2020-06-04 00:15:06 +02:00
} else {
2020-07-23 22:20:43 +02:00
$all ++ ;
2020-05-23 23:47:15 +02:00
}
2020-07-23 22:20:43 +02:00
} else {
echo ( $elem . " does not contain a .mp4 extension! - skipping \n " );
writeLog ( $elem . " does not contain a .mp4 extension! - skipping \n " );
2020-05-23 23:47:15 +02:00
}
2020-05-16 20:18:32 +02:00
}
2020-05-23 23:47:15 +02:00
2020-06-08 17:52:58 +02:00
// auto cleanup db entries
2020-05-27 21:35:02 +02:00
$query = "SELECT COUNT(*) as count FROM videos" ;
$result = $conn -> query ( $query );
$r = mysqli_fetch_assoc ( $result );
if ( $all < $r [ 'count' ]) {
echo "should be in gravity: " . $all . " \n " ;
2020-06-04 22:19:18 +02:00
writeLog ( "should be in gravity: " . $all . " \n " );
2020-05-27 21:35:02 +02:00
echo "really in gravity: " . $r [ 'count' ] . " \n " ;
2020-06-04 22:19:18 +02:00
writeLog ( "really in gravity: " . $r [ 'count' ] . " \n " );
2020-05-27 21:35:02 +02:00
echo "cleaning up gravity \n " ;
2020-06-04 22:19:18 +02:00
writeLog ( "cleaning up gravity \n " );
2020-05-27 21:35:02 +02:00
$query = "SELECT movie_id,movie_url FROM videos" ;
$result = $conn -> query ( $query );
while ( $r = mysqli_fetch_assoc ( $result )) {
if ( ! file_exists ( "../" . $r [ 'movie_url' ])) {
2020-07-23 22:20:43 +02:00
$query = "SET foreign_key_checks = 0; DELETE FROM videos WHERE movie_id='" . $r [ 'movie_id' ] . "'" ;
2020-05-27 21:35:02 +02:00
if ( $conn -> query ( $query ) === TRUE ) {
echo ( 'successfully deleted ' . $r [ 'movie_url' ] . " from video gravity \n " );
2020-06-04 22:19:18 +02:00
writeLog ( 'successfully deleted ' . $r [ 'movie_url' ] . " from video gravity \n " );
2020-05-27 21:35:02 +02:00
$deleted ++ ;
} else {
echo "failed to delete " . $r [ 'movie_url' ] . " from gravity: " . $conn -> error . " \n " ;
2020-06-04 22:19:18 +02:00
writeLog ( "failed to delete " . $r [ 'movie_url' ] . " from gravity: " . $conn -> error . " \n " );
2020-05-27 21:35:02 +02:00
}
}
}
}
// calculate size of databse here
$size = - 1 ;
$query = "SELECT table_schema AS \" Database \" ,
ROUND(SUM(data_length + index_length) / 1024 / 1024, 3) AS \" Size \"
FROM information_schema.TABLES
2020-06-04 00:15:06 +02:00
WHERE TABLE_SCHEMA='" . Database :: getInstance () -> getDatabaseName () . "'
2020-05-27 21:35:02 +02:00
GROUP BY table_schema;" ;
$result = $conn -> query ( $query );
if ( $result -> num_rows == 1 ) {
$row = $result -> fetch_assoc ();
$size = $row [ "Size" ];
}
2020-05-23 23:47:15 +02:00
echo "Total gravity: " . $all . " \n " ;
2020-06-04 22:19:18 +02:00
writeLog ( "Total gravity: " . $all . " \n " );
2020-05-27 21:35:02 +02:00
echo "Size of Databse is: " . $size . "MB \n " ;
2020-06-04 22:19:18 +02:00
writeLog ( "Size of Databse is: " . $size . "MB \n " );
2020-05-23 23:47:15 +02:00
echo "added in this run: " . $added . " \n " ;
2020-06-04 22:19:18 +02:00
writeLog ( "added in this run: " . $added . " \n " );
2020-05-27 21:35:02 +02:00
echo "deleted in this run: " . $deleted . " \n " ;
2020-06-04 22:19:18 +02:00
writeLog ( "deleted in this run: " . $deleted . " \n " );
2020-06-02 16:15:12 +02:00
echo "errored in this run: " . $failed . " \n " ;
2020-06-04 22:19:18 +02:00
writeLog ( "errored in this run: " . $failed . " \n " );
2020-06-02 16:15:12 +02:00
2020-06-08 17:52:58 +02:00
writeLog ( "-42" ); // terminating characters to stop webui requesting infos
/**
* get all videoinfos of a video file
*
* @param $video string name including extension
* @return object all infos as object
*/
2020-06-02 16:15:12 +02:00
function _get_video_attributes ( $video )
{
2020-06-04 00:15:06 +02:00
$command = "mediainfo \" ../videos/prn/ $video \" --Output=JSON" ;
2020-06-02 16:15:12 +02:00
$output = shell_exec ( $command );
2020-06-04 00:15:06 +02:00
return json_decode ( $output );
2020-06-02 16:15:12 +02:00
}
2020-06-04 22:19:18 +02:00
2020-06-08 17:52:58 +02:00
/**
* write a line to the output log file
*
* @param string $message message to write
*/
2020-06-04 22:19:18 +02:00
function writeLog ( string $message )
{
file_put_contents ( "/tmp/output.log" , $message , FILE_APPEND );
flush ();
}
2020-06-08 17:52:58 +02:00
/**
* ckecks if tag exists -- if not creates it
* @param string $tagname the name of the tag
* @return integer the id of the inserted tag
*/
function tagExists ( string $tagname )
{
global $conn ;
$query = "SELECT * FROM tags WHERE tag_name=' $tagname '" ;
$result = $conn -> query ( $query );
if ( $result -> num_rows == 0 ) {
// tag does not exist --> create it
$query = "INSERT INTO tags (tag_name) VALUES (' $tagname ')" ;
if ( $conn -> query ( $query ) !== TRUE ) {
echo "failed to create $tagname tag in database \n " ;
writeLog ( "failed to create $tagname tag in database \n " );
}
return $conn -> insert_id ;
} else {
return $result -> fetch_assoc ()[ 'tag_id' ];
}
}