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..."; exec( '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 . '"' ); 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.*" ) ); } }