184 lines
6.5 KiB
PHP
184 lines
6.5 KiB
PHP
<?php
|
|
|
|
require_once dirname(__FILE__).'/../vendor/autoload.php';
|
|
|
|
$ini = parse_ini_file("/etc/homeaudio.ini");
|
|
if ( isset($argv[1]) && ($argv[1] == "simulate") ) {
|
|
define("SIMULATE", true);
|
|
} else {
|
|
define("SIMULATE", false);
|
|
}
|
|
|
|
define("MP3ROOTDIR", $ini['MP3DIR']);
|
|
define("ARTDIR", $ini['ARTDIR']);
|
|
define("SONGSTABLE", "songs");
|
|
|
|
$globaldbh = new PDO("mysql:host={$ini['DBHOST']};dbname={$ini['DBNAME']}", $ini['DBUSER'], $ini['DBPASS']);
|
|
$ignoredirs = array();
|
|
$ignoredirs[] = "Album Playlists";
|
|
$ignoredirs[] = "Alphabetical";
|
|
$ignoredirs[] = "Dad Music";
|
|
$ignoredirs[] = "Incoming2";
|
|
$ignoredirs[] = "Recent";
|
|
$ignoredirs[] = "Recent (1-2 Months)";
|
|
$ignoredirs[] = "Recent (2-3 Months)";
|
|
$ignoredirs[] = "playlists";
|
|
|
|
$extbymimetypes = array(
|
|
'image/jpg' => 'jpg',
|
|
'image/jpeg' => 'jpg',
|
|
'image/png' => 'png',
|
|
'image/gif' => 'gif'
|
|
);
|
|
|
|
function pruneDB() {
|
|
global $globaldbh;
|
|
$query = "SELECT id, path, song FROM " . SONGSTABLE . " ORDER BY path, song";
|
|
$sth = $globaldbh->prepare($query);
|
|
$sth->execute();
|
|
$querydel = "DELETE FROM " . SONGSTABLE . " WHERE id=:id";
|
|
$sthdel = $globaldbh->prepare($querydel);
|
|
$count = 0;
|
|
$prunecount = 0;
|
|
while ( $row = $sth->fetch() ) {
|
|
$count++;
|
|
if ( ($count % 1000) == 0 ) echo ".";
|
|
if ( !file_exists(MP3ROOTDIR . $row['path'] . $row['song']) ) {
|
|
$fieldsdel = array();
|
|
$fieldsdel[':id'] = $row['id'];
|
|
if ( SIMULATE ) {
|
|
echo "Would have removed: {$row['song']}\n";
|
|
} else {
|
|
$sthdel->execute($fieldsdel);
|
|
}
|
|
$prunecount++;
|
|
}
|
|
}
|
|
return $prunecount;
|
|
}
|
|
|
|
function addNewSongs($path = "") {
|
|
global $ignoredirs, $sth_exists, $sth_addnew, $newcount;
|
|
$fh = opendir(MP3ROOTDIR . $path);
|
|
while ( false !== ($entry = readdir($fh)) ) {
|
|
if ( in_array($entry, $ignoredirs) ) continue;
|
|
if ( ($entry == ".") || ($entry == "..") ) continue;
|
|
if ( is_dir(MP3ROOTDIR . $path . $entry) ) {
|
|
addNewSongs($path . $entry . "/");
|
|
} else {
|
|
if ( substr($entry, -3) != "mp3" ) continue;
|
|
$song = $path . $entry;
|
|
$fields = array();
|
|
$fields[':path'] = mb_convert_encoding($path, "UTF-8");
|
|
$fields[':song'] = mb_convert_encoding($entry, "UTF-8");
|
|
try {
|
|
$sth_exists->execute($fields);
|
|
} catch ( Exception $e ) {
|
|
echo "Could not query database for song: {$path}/{$entry}\n";
|
|
}
|
|
if ( $sth_exists->fetchColumn() == 0 ) {
|
|
$newcount++;
|
|
if ( ($newcount % 1000) == 0 ) echo ".";
|
|
if ( SIMULATE ) {
|
|
echo "Would have added: {$fields[':path']}{$fields[':song']}\n";
|
|
} else {
|
|
$sth_addnew->execute($fields);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
closedir($fh);
|
|
}
|
|
|
|
function parseSongs() {
|
|
global $globaldbh, $extbymimetypes;
|
|
$parsecount = 0;
|
|
$query = "SELECT id, path, song FROM " . SONGSTABLE . " WHERE parsed='false'";
|
|
$sth = $globaldbh->prepare($query);
|
|
$sth->execute();
|
|
$query_info = "UPDATE " . SONGSTABLE . " SET genre=:genre, title=:title, artist=:artist, album=:album, year=:year, length=:length, artfile=:artfile, parsed='true' WHERE id=:id";
|
|
$sth_info = $globaldbh->prepare($query_info);
|
|
while ( $row = $sth->fetch() ) {
|
|
$fields = array();
|
|
$fields[':id'] = $row['id'];
|
|
list($fields[':genre'], $junk) = explode("/", $row['path'], 2);
|
|
$getid3 = new getID3;
|
|
$info = $getid3->analyze(MP3ROOTDIR . $row['path'] . $row['song']);
|
|
if ( isset($info['id3v2']['comments']['title'][0]) ) {
|
|
$fields[':title'] = $info['id3v2']['comments']['title'][0];
|
|
}
|
|
if ( !isset($fields[':title']) || ($fields[':title'] == "") ) {
|
|
@list($junk, $fields[':title']) = explode(" - ", substr($row['song'], 0, -4), 2);
|
|
}
|
|
if ( isset($info['id3v2']['comments']['artist'][0]) ) {
|
|
$fields[':artist'] = $info['id3v2']['comments']['artist'][0];
|
|
}
|
|
if ( !isset($fields[':artist']) || ($fields[':artist'] == "") ) {
|
|
@list($fields[':artist'], $junk) = explode(" - ", basename($row['path']), 2);
|
|
}
|
|
if ( isset($info['id3v2']['comments']['album'][0]) ) {
|
|
$fields[':album'] = $info['id3v2']['comments']['album'][0];
|
|
}
|
|
if ( !isset($fields[':album']) || ($fields[':album'] == "") ) {
|
|
@list($junk, $fields[':album']) = explode(" - ", basename($row['path']), 2);
|
|
}
|
|
if ( isset($info['id3v2']['comments']['year'][0]) ) {
|
|
$fields[':year'] = $info['id3v2']['comments']['year'][0];
|
|
}
|
|
if ( !isset($fields[':year']) ) $fields[':year'] = "";
|
|
@list($min, $sec) = explode(":", $info['playtime_string'], 2);
|
|
$fields[':length'] = (intval($min) * 60) + intval($sec);
|
|
$fields[':artfile'] = "";
|
|
if ( isset($info['comments']['picture'][0]['data']) && !is_null($info['comments']['picture'][0]['data']) ) {
|
|
$artmd5 = md5($info['comments']['picture'][0]['data']);
|
|
$mimetype = $info['comments']['picture'][0]['image_mime'];
|
|
if ( array_key_exists($mimetype, $extbymimetypes) ) {
|
|
$fields[':artfile'] = $artmd5 . "." . $extbymimetypes[$mimetype];
|
|
}
|
|
}
|
|
if ( !SIMULATE ) {
|
|
if ( ($fields[':artfile'] != "") && !file_exists(ARTDIR . $fields[':artfile']) ) {
|
|
file_put_contents(ARTDIR . $fields[':artfile'], $info['comments']['picture'][0]['data']);
|
|
}
|
|
$sth_info->execute($fields);
|
|
}
|
|
$parsecount++;
|
|
if ( ($parsecount % 1000) == 0 ) echo ".";
|
|
}
|
|
return $parsecount;
|
|
}
|
|
|
|
if ( !file_exists(ARTDIR) ) {
|
|
echo "The album art folder doesn't exist. Let's try to creat it...";
|
|
$didmake = mkdir(ARTDIR, 0775, true);
|
|
if ( !$didmake ) {
|
|
echo "Oops!! Failed. Check path and perms.\n";
|
|
exit();
|
|
} else {
|
|
echo "success!\n";
|
|
}
|
|
}
|
|
|
|
echo "Pruning DB of missing files...";
|
|
$prunecount = pruneDB();
|
|
echo " ", $prunecount, " songs pruned.\n";
|
|
|
|
//
|
|
// We are prepping the DB statements here since the addNewSongs() function
|
|
// is recursive. We don't want to make a TON of statements and be a hog.
|
|
//
|
|
$query = "SELECT COUNT(*) FROM " . SONGSTABLE . " WHERE path=:path AND song=:song";
|
|
$sth_exists = $globaldbh->prepare($query);
|
|
$query = "INSERT INTO " . SONGSTABLE . " (path, song) VALUES(:path, :song)";
|
|
$sth_addnew = $globaldbh->prepare($query);
|
|
$newcount = 0;
|
|
echo "Adding new songs to DB...";
|
|
addNewSongs();
|
|
echo " ", $newcount, " songs added.\n";
|
|
|
|
echo "Parsing ID3 tags...";
|
|
$parsecount = parseSongs();
|
|
echo " ", $parsecount, " tags parsed.\n";
|
|
|
|
// vim: set et ts=3 sw=3 ai mouse-=a:
|