get_catalog_files(); echo "Starting Catalog: $catalog->name\n"; /* Foreach through each file and find it a home! */ foreach ($songs as $song) { /* Find this poor song a home */ $song->format_song(); $directory = sort_find_home($song,$catalog->sort_pattern,$catalog->path); $filename = sort_find_filename($song,$catalog->rename_pattern); /* Check for Demo Mode */ if ($test_mode) { /* We're just talking here... no work */ echo "Moving File:\n\tSource: $song->file\n\tDest: $fullpath\n"; flush(); } /* We need to actually do the moving (fake it if we are testing) */ sort_move_file($song,$fullpath); $fullpath = $directory . "/" . $filename; } // end foreach song } // end foreach catalogs /************** FUNCTIONS *****************/ /** * sort_find_filename * This gets the filename that this file should have, it takes the rename pattern of the catalog * along with the song object. Nothing Special Here */ function sort_find_filename($song,$rename_pattern) { $extension = ltrim(substr($song->file,strlen($song->file)-4,4),"."); /* Create the filename that this file should have */ $album = $song->f_album_full; $artist = $song->f_artist_full; $genre = $song->f_genre; $track = $song->track; $title = $song->title; $year = $song->year; /* Start replacing stuff */ $replace_array = array('%a','%A','%t','%T','%y','%g'); $content_array = array($artist,$album,$title,$track,$year,$genre); $rename_pattern = str_replace($replace_array,$content_array,$rename_pattern); $rename_pattern = preg_replace("[^A-Za-z0-9\-\_\ \'\,\(\)]","_",$rename_pattern); return $rename_pattern . "." . $extension; } // sort_find_filename /** * sort_find_home * Get the directory for this file from the catalog and the song info using the sort_pattern * takes into account various artists and the alphabet_prefix */ function sort_find_home($song,$sort_pattern,$base) { $home = rtrim($base,"\/"); $home = rtrim($home,"\\"); /* Create the filename that this file should have */ $album = $song->f_album_full; $artist = $song->f_artist_full; $genre = $song->f_genre; $track = $song->track; $title = $song->title; $year = $song->year; /* Do the various check */ $album_object = new Album($song->album); if ($album_object->artist_count != '1') { $artist = "Various"; } /* IF we want a,b,c,d we need to know the first element */ if ($GLOBALS['alphabet_prefix']) { $sort_pattern = preg_replace("/\/?%o\//","",$sort_pattern); $first_element = substr($sort_pattern,0,2); $element = sort_element_name($first_element); $alphabet = strtoupper(substr(${$element},0,1)); $alphabet = preg_replace("/[^A-Za-z0-9]/","ZZ",$alphabet); $home .= "/$alphabet"; } /* Replace everything we can find */ $replace_array = array('%a','%A','%t','%T','%y','%g'); $content_array = array($artist,$album,$title,$track,$year,$genre); $sort_pattern = str_replace($replace_array,$content_array,$sort_pattern); /* Remove non A-Z0-9 chars */ $sort_pattern = preg_replace("[^\\\/A-Za-z0-9\-\_\ \'\,\(\)]","_",$sort_pattern); $home .= "/$sort_pattern"; return $home; } // sort_find_home /** * sort_element_name * gets the name of the %? in a yea.. too much beer */ function sort_element_name($key) { switch ($key) { case '%t': return 'title'; break; case '%T': return 'track'; break; case '%a': return 'artist'; break; case '%A': return 'album'; break; case '%y': return 'year'; break; case '%g': return 'genre'; break; default: return 'album'; break; } // switch on key return false; } // sort_element_name /** * sort_move_file * All this function does is, move the friggin file and then update the database * We can't use the rename() function of PHP because it's functionality depends on the * current phase of the moon, the alignment of the planets and my current BAL * Instead we cheeseball it and walk through the new dir structure and make * sure that the directories exist, once the dirs exist then we do a copy * and unlink.. This is a little unsafe, and as such it verifys the copy * worked by doing a filesize() before unlinking. */ function sort_move_file($song,$fullname) { $info = pathinfo($fullname); $directory = $info['dirname']; $file = $info['basename']; $data = preg_split("/[\/\\\]/",$directory); $path = ''; /* We not need the leading / */ unset($data[0]); foreach ($data as $dir) { $path .= "/" . $dir; /* We need to check for the existance of this directory */ if (!is_dir($path)) { if ($GLOBALS['test_mode']) { echo "\tMaking $path Directory\n"; } else { $results = mkdir($path); if (!$results) { echo "Error: Unable to create $path move failed\n"; return false; } } // else we aren't in test mode } // if it's not a dir } // foreach dir /* Now that we've got the correct directory structure let's try to copy it */ if ($GLOBALS['test_mode']) { echo "\tCopying $file to $directory\n"; $sql = "UPDATE song SET file='" . sql_escape($fullname) . "' WHERE id='" . sql_escape($song->id) . "'"; echo "\tSQL: $sql\n"; } else { $results = copy($song->file,$fullname); if (!$results) { echo "Error: Unable to copy file to $fullname\n"; return false; } /* Check the md5sums */ $new_sum = filesize($fullname); $old_sum = filesize($song->file); if ($new_sum != $old_sum OR !$new_sum) { echo "Error: Size Inconsistency, not deleting " . $song->file . "\n"; return false; } // end if sum's don't match /* If we've made it this far it should be safe */ $results = unlink($song->file); if (!$results) { echo "Error: Unable to delete " . $song->file . "\n"; } /* Update the catalog */ $sql = "UPDATE song SET file='" . sql_escape($fullname) . "' WHERE id='" . sql_escape($song->id) . "'"; $db_results = mysql_query($sql, dbh()); } // end else return true; } // sort_move_file ?>