karaoke-management/AudioVideoHandler.php

185 lines
5.6 KiB
PHP

<?php
class AudioVideoHandler
{
private $directories;
public function __construct()
{
echo "[INFO] Fetching directories...";
$this->directories = glob( DOWNLOAD_PATH . '/*', GLOB_ONLYDIR );
echo "OK\n";
artistChoose:
$artist = readline( "Artist: " );
if( $artist === 'exit' )
{
return;
}
$searchDir = DOWNLOAD_PATH . '/' . $artist;
$searchDir = str_replace( "\\", '/', $searchDir );
echo "[INFO] Loading results...";
$matches = 0;
$_indexmatch = 0;
$_found = '';
foreach ( $this->directories as $index => $_dir )
{
if ( ( $lev = levenshtein( $_dir, $searchDir ) ) < 3 )
{
$_found .= "$index | $_dir\n";
$_indexmatch = $index;
$matches++;
}
#echo $lev . "\n";
}
echo "OK\n";
if ( $matches === 0 )
{
echo "[INFO] No matches found!\n";
goto artistChoose;
}
indexChoose:
if( $matches > 1 )
{
echo "[FOUND] $matches are found!\nIndex | Artist\n";
echo $_found;
$index = readline( "Name the index-number: " );
}
else
{
$index = $_indexmatch;
}
if ( isset( $this->directories[$index] ) === false )
{
echo "[ERROR] Index is invalid!\n";
goto indexChoose;
}
$dir = $this->directories[$index];
echo "[INFO] Scanning Artist directory...";
$files = scandir( $dir );
unset( $files[0], $files[1] );
echo "OK\n";
if ( count( $files ) < 1 )
{
echo "[WARNING] Directory $dir is empty!\n";
goto artistChoose;
}
echo "[INFO] " . count($files) . " songs found.";
$_titleOrFull = readline( "Do you want to download all songs or just an specific title?[A/t]: " );
if ( stripos( $_titleOrFull, 't' ) !== false || stripos( $_titleOrFull, 'title' ) !== false )
{
echo "\n";
// Only one
songChoose:
$song = readline( "Enter the Song name('list' to list): " );
if( $song === 'exit' )
{
return;
}
if( $song === 'list' )
{
echo "Listing all Songs...\n";
foreach( $files as $_song )
{
echo "$_song\n";
}
goto songChoose;
}
echo "[INFO] Searching...\n";
$matches = 0;
$artist = basename( $dir );
$_found = '';
$_indexmatch = 0;
foreach ( $files as $index => $name )
{
$name = str_replace( array( '.txt', '.mp3', '.mp4' ), '', $name );
if ( ( $lev = levenshtein( $name, $artist . ' - ' . $song ) ) < 4 )
{
$_found .= "$index | $song\n";
$matches++;
$_indexmatch = $index;
}
}
if ( $matches === 0 )
{
echo "[WARNING] No matches found!\n";
goto songChoose;
}
if( $matches > 1 )
{
echo "[FOUND] $matches are found!\nIndex | Song\n";
echo $_found;
$index = readline( "Name the index-number: " );
}
else
{
$index = $_indexmatch;
}
if ( isset( $files[$index] ) === false )
{
echo "[ERROR] Index is invalid!\n";
goto songChoose;
}
$files[$index] = str_replace( array( '.txt', '.mp3', '.mp4' ), '', $files[$index] );
$this->download( $files[$index] );
} else
{
echo "\n";
// All files
echo "[INFO] Downloading " . count( $files ) . " songs...\n";
foreach ( $files as $file )
{
if ( $file === '.' || $file === '..' || strpos( $file, '.mp3' ) !== false || strpos( $file, '.mp4' ) !== false )
{
continue;
}
$file = str_replace( array( '.txt', '.mp3', '.mp4' ), '', $file );
$this->download( $file );
}
}
}
private function download( $file )
{
echo "[INFO] Downloading $file...";
if( USE_INTERNAL_YOUTUBEDL_EXE )
{
exec( __DIR__ . '/youtube-dl.exe --extract-audio --no-warnings -q --embed-thumbnail --audio-format mp3 --recode-video mp4 --audio-quality 4 -k -o downloaded.%(ext)s "ytsearch: ' . $file . '"' );
}
else
{
exec( YOUTUBE_DL_PATH . ' --extract-audio --no-warnings -q --embed-thumbnail --audio-format mp3 --recode-video mp4 --audio-quality 4 -k -o downloaded.%(ext)s "ytsearch: ' . $file . '"' );
}
echo "OK\n";
list( $artist, $title ) = explode( ' - ', $file );
if ( file_exists( './downloaded.f135.mp4' ) === true )
{
rename( "./downloaded.f135.mp4", DOWNLOAD_PATH . '/' . $artist . "/$artist - $title.mp4" );
echo "[SUCCESS] MP4 saved!\n";
}
if ( file_exists( './downloaded.mp3' ) === true )
{
rename( "./downloaded.mp3", DOWNLOAD_PATH . '/' . $artist . "/$artist - $title.mp3" );
echo "[SUCCESS] MP3 saved!\n";
}
array_map( 'unlink', glob( "./downloaded.*" ) );
}
}