proxy_user = Config::get('proxy_host'); $snoopy->proxy_port = Config::get('proxy_port'); $snoopy->proxy_user = Config::get('proxy_user'); $snoopy->proxy_pass = Config::get('proxy_pass'); } $snoopy->fetch($url); $content = $snoopy->results; return simplexml_load_string($content); } // get_lastfm_results /** * get_songs_like * Returns a list of similar songs */ public static function get_songs_like($song_id, $limit = 5, $local_only = true) { $song = new Song($song_id); if (isset($song->mbid)) { $query = 'mbid=' . rawurlencode($song->mbid); } else { $query = 'track=' . rawurlencode($song->title); } if ($limit && !$local_only) { $query .= "&limit=$limit"; } $xml = self::get_lastfm_results('track.getsimilar', $query); foreach ($xml->similartracks->children() as $child) { $name = $child->name; $local_id = null; $artist_name = $child->artist->name; $s_artist_name = Catalog::trim_prefix($artist_name); $s_artist_name = Dba::escape($s_artist_name['string']); $sql = "SELECT `song`.`id` FROM `song` " . "LEFT JOIN `artist` ON " . "`song`.`artist`=`artist`.`id` WHERE " . "`song`.`title`='" . Dba::escape($name) . "' AND `artist`.`name`='$s_artist_name'"; $db_result = Dba::read($sql); if ($result = Dba::fetch_assoc($db_result)) { $local_id = $result['id']; } if (is_null($local_id)) { debug_event('Recommendation', "$name did not match any local song", 5); if (! $local_only) { $results[] = array( 'id' => null, 'title' => $name, 'artist' => $artist_name ); } } else { debug_event('Recommendation', "$name matched local song $local_id", 5); $results[] = array( 'id' => $local_id, 'title' => $name ); } if ($limit && count($results) >= $limit) { break; } } if (isset($results)) { return $results; } return false; } /** * get_artists_like * Returns a list of similar artists */ public static function get_artists_like($artist_id, $limit = 5, $local_only = true) { $artist = new Artist($artist_id); $query = 'artist=' . rawurlencode($artist->name); if ($limit && !$local_only) { $query .= "&limit=$limit"; } $xml = self::get_lastfm_results('artist.getsimilar', $query); foreach ($xml->similarartists->children() as $child) { $name = $child->name; $local_id = null; // First we check by MBID if ((string)$child->mbid) { $mbid = Dba::escape($child->mbid); $sql = "SELECT `id` FROM `artist` WHERE `mbid`='$mbid'"; $db_result = Dba::read($sql); if ($result = Dba::fetch_assoc($db_result)) { $local_id = $result['id']; } } // Then we fall back to the less likely to work exact // name match if (is_null($local_id)) { $searchname = Catalog::trim_prefix($name); $searchname = Dba::escape($searchname['string']); $sql = "SELECT `id` FROM `artist` WHERE `name`='$searchname'"; $db_result = Dba::read($sql); if ($result = Dba::fetch_assoc($db_result)) { $local_id = $result['id']; } } // Then we give up if (is_null($local_id)) { debug_event('Recommendation', "$name did not match any local artist", 5); if (! $local_only) { $results[] = array( 'id' => null, 'name' => $name ); } } else { debug_event('Recommendation', "$name matched local artist " . $local_id, 5); $results[] = array( 'id' => $local_id, 'name' => $name ); } // Don't do more work than we have to if ($limit && count($results) >= $limit) { break; } } if (isset($results)) { return $results; } return false; } // get_artists_like } // end of recommendation class ?>