Skip to content

Commit

Permalink
imported getid3 and hooked up a crawler to convert ID3 tags to field …
Browse files Browse the repository at this point in the history
…data

git-svn-id: https://svn.iamcal.com/public/php/iTunesServer/trunk@5732 ac7c8259-0de0-4f3c-bb6a-12394caf8efd
  • Loading branch information
iamcal committed Aug 18, 2010
1 parent b8f8480 commit a1d317c
Show file tree
Hide file tree
Showing 76 changed files with 31,280 additions and 0 deletions.
85 changes: 85 additions & 0 deletions feed/crawl.php
@@ -0,0 +1,85 @@
<?
include('../include/init.php');
include('../getid3/getid3.php');

define('GETID3_HELPERAPPSDIR', realpath(GETID3_INCLUDEPATH.'apps').DIRECTORY_SEPARATOR);


$getID3 = new getID3;

$rows = db_fetch_all("SELECT * FROM tracks");

foreach ($rows as $row){

$info = $getID3->analyze($row['file']);

$tags = array(
'artist' => null,
'album' => null,
'year' => null,
'num' => null,
'track' => null,
);

try_set($tags[artist], $info[tags][id3v2][artist]);
try_set($tags[artist], $info[tags][id3v1][artist]);

try_set($tags[album], $info[tags][id3v2][album]);
try_set($tags[album], $info[tags][id3v1][album]);

try_set($tags[year], $info[tags][id3v2][year]);
try_set($tags[year], $info[tags][id3v1][year]);

try_set($tags[num], $info[tags][id3v2][track_number]);
try_set($tags[num], $info[tags][id3v1][number]);

try_set($tags[track], $info[tags][id3v2][title]);
try_set($tags[track], $info[tags][id3v1][title]);
try_set($tags[track], filename_to_track($row['file']));

$hash = array();
foreach ($tags as $k => $v){
if (isset($v)){
$hash[$k] = AddSlashes($v);
}
}
if (count($hash)){

$hash[last_scanned] = time();

db_update('tracks', $hash, "id=$row[id]");
}

echo '. ';
}

echo "ok!";

function filename_to_track($file){

$bits = explode('/', $file);
$bits = explode('.', array_pop($bits));
array_pop($bits);
return implode('.', $bits);
}

function try_set(&$target, $a){

if (isset($target)) return;

if (is_array($a)){
foreach ($a as $x){
if (strlen($x)){
$target = $x;
return;
}
}
return;
}

if (strlen($a)){
$target = $a;
}
}

?>
Binary file added getid3/apps/cygwin1.dll
Binary file not shown.
Binary file added getid3/apps/head.exe
Binary file not shown.
Binary file added getid3/apps/md5sum.exe
Binary file not shown.
Binary file added getid3/apps/metaflac.exe
Binary file not shown.
Binary file added getid3/apps/sha1sum.exe
Binary file not shown.
Binary file added getid3/apps/shorten.exe
Binary file not shown.
Binary file added getid3/apps/tail.exe
Binary file not shown.
Binary file added getid3/apps/vorbiscomment.exe
Binary file not shown.
222 changes: 222 additions & 0 deletions getid3/extension.cache.dbm.php
@@ -0,0 +1,222 @@
<?php
/////////////////////////////////////////////////////////////////
/// getID3() by James Heinrich <info@getid3.org> //
// available at http://getid3.sourceforge.net //
// or http://www.getid3.org //
/////////////////////////////////////////////////////////////////
// //
// extension.cache.dbm.php - part of getID3() //
// Please see readme.txt for more information //
// ///
/////////////////////////////////////////////////////////////////
// //
// This extension written by Allan Hansen <ahØartemis*dk> //
// ///
/////////////////////////////////////////////////////////////////


/**
* This is a caching extension for getID3(). It works the exact same
* way as the getID3 class, but return cached information very fast
*
* Example:
*
* Normal getID3 usage (example):
*
* require_once 'getid3/getid3.php';
* $getID3 = new getID3;
* $getID3->encoding = 'UTF-8';
* $info1 = $getID3->analyze('file1.flac');
* $info2 = $getID3->analyze('file2.wv');
*
* getID3_cached usage:
*
* require_once 'getid3/getid3.php';
* require_once 'getid3/getid3/extension.cache.dbm.php';
* $getID3 = new getID3_cached('db3', '/tmp/getid3_cache.dbm',
* '/tmp/getid3_cache.lock');
* $getID3->encoding = 'UTF-8';
* $info1 = $getID3->analyze('file1.flac');
* $info2 = $getID3->analyze('file2.wv');
*
*
* Supported Cache Types
*
* SQL Databases: (use extension.cache.mysql)
*
* cache_type cache_options
* -------------------------------------------------------------------
* mysql host, database, username, password
*
*
* DBM-Style Databases: (this extension)
*
* cache_type cache_options
* -------------------------------------------------------------------
* gdbm dbm_filename, lock_filename
* ndbm dbm_filename, lock_filename
* db2 dbm_filename, lock_filename
* db3 dbm_filename, lock_filename
* db4 dbm_filename, lock_filename (PHP5 required)
*
* PHP must have write access to both dbm_filename and lock_filename.
*
*
* Recommended Cache Types
*
* Infrequent updates, many reads any DBM
* Frequent updates mysql
*/


class getID3_cached_dbm extends getID3
{

// public: constructor - see top of this file for cache type and cache_options
function getID3_cached_dbm($cache_type, $dbm_filename, $lock_filename) {

// Check for dba extension
if (!extension_loaded('dba')) {
die('PHP is not compiled with dba support, required to use DBM style cache.');
}

// Check for specific dba driver
if (function_exists('dba_handlers')) { // PHP 4.3.0+
if (!in_array('db3', dba_handlers())) {
die('PHP is not compiled --with '.$cache_type.' support, required to use DBM style cache.');
}
}
else { // PHP <= 4.2.3
ob_start(); // nasty, buy the only way to check...
phpinfo();
$contents = ob_get_contents();
ob_end_clean();
if (!strstr($contents, $cache_type)) {
die('PHP is not compiled --with '.$cache_type.' support, required to use DBM style cache.');
}
}

// Create lock file if needed
if (!file_exists($lock_filename)) {
if (!touch($lock_filename)) {
die('failed to create lock file: ' . $lock_filename);
}
}

// Open lock file for writing
if (!is_writeable($lock_filename)) {
die('lock file: ' . $lock_filename . ' is not writable');
}
$this->lock = fopen($lock_filename, 'w');

// Acquire exclusive write lock to lock file
flock($this->lock, LOCK_EX);

// Create dbm-file if needed
if (!file_exists($dbm_filename)) {
if (!touch($dbm_filename)) {
die('failed to create dbm file: ' . $dbm_filename);
}
}

// Try to open dbm file for writing
$this->dba = @dba_open($dbm_filename, 'w', $cache_type);
if (!$this->dba) {

// Failed - create new dbm file
$this->dba = dba_open($dbm_filename, 'n', $cache_type);

if (!$this->dba) {
die('failed to create dbm file: ' . $dbm_filename);
}

// Insert getID3 version number
dba_insert(GETID3_VERSION, GETID3_VERSION, $this->dba);
}

// Init misc values
$this->cache_type = $cache_type;
$this->dbm_filename = $dbm_filename;

// Register destructor
register_shutdown_function(array($this, '__destruct'));

// Check version number and clear cache if changed
if (dba_fetch(GETID3_VERSION, $this->dba) != GETID3_VERSION) {
$this->clear_cache();
}

parent::getID3();
}



// public: destuctor
function __destruct() {

// Close dbm file
@dba_close($this->dba);

// Release exclusive lock
@flock($this->lock, LOCK_UN);

// Close lock file
@fclose($this->lock);
}



// public: clear cache
function clear_cache() {

// Close dbm file
dba_close($this->dba);

// Create new dbm file
$this->dba = dba_open($this->dbm_filename, 'n', $this->cache_type);

if (!$this->dba) {
die('failed to clear cache/recreate dbm file: ' . $this->dbm_filename);
}

// Insert getID3 version number
dba_insert(GETID3_VERSION, GETID3_VERSION, $this->dba);

// Reregister shutdown function
register_shutdown_function(array($this, '__destruct'));
}



// public: analyze file
function analyze($filename) {

if (file_exists($filename)) {

// Calc key filename::mod_time::size - should be unique
$key = $filename . '::' . filemtime($filename) . '::' . filesize($filename);

// Loopup key
$result = dba_fetch($key, $this->dba);

// Hit
if ($result !== false) {
return unserialize($result);
}
}

// Miss
$result = parent::analyze($filename);

// Save result
if (file_exists($filename)) {
dba_insert($key, serialize($result), $this->dba);
}

return $result;
}

}


?>

0 comments on commit a1d317c

Please sign in to comment.