1
0
Fork 0
oldhaven/php/app/musicbrainz/models/Track.class.php

87 lines
2.3 KiB
PHP
Raw Normal View History

2011-03-31 02:01:16 +00:00
<?php
class Musicbrainz_TrackModel extends Model {
private $_bad_track_names = array(
'[silence]'
);
public function getReleaseTracks($releases_ids, $group_by_release = false) {
if (!is_array($releases_ids)) {
$releases_ids = array($releases_ids);
}
$tracks = $this->db->getRows(
$this->db->q('
SELECT *
FROM musicbrainz.bh_track
WHERE
release_id IN (\''. implode('\',\'', $releases_ids) .'\')
ORDER BY
release_id ASC,
position ASC
'),
'id'
);
foreach ($tracks as $track_id => $track_info) {
// Конвертируем миллисекунды в секунды
$tracks[$track_id]['length'] = round($track_info['length'] / 1000);
}
if ($group_by_release) {
$g_tracks = array();
foreach ($tracks as $track) {
if (!isset($g_tracks[$track['release_id']])) {
$g_tracks[$track['release_id']] = array();
}
$g_tracks[$track['release_id']][$track['id']] = $track;
}
return $g_tracks;
} else {
return $tracks;
}
}
public function getUniqueReleaseTracks($releases_ids) {
$tracks = $this->getReleaseTracks($releases_ids, true);
$track_list_unique = array();
$album_list = array();
$bonus_list = array();
$first_release = current($tracks);
// Заносим треки из первого релиза в массив основных
foreach ($first_release as $track_id => $track_info) {
if (!in_array($track_info['name'], $this->_bad_track_names)) {
$album_list[$track_id] = $track_info;
$track_list_unique[] = $this->clearTrackName($track_info['name']);
}
}
// Все треки, которые не встречаются на первом релизе заносим в бонусы
foreach ($tracks as $release_id => $release_tracks) {
foreach ($release_tracks as $track_id => $track_info) {
if (
!in_array($track_info['name'], $this->_bad_track_names) &&
!in_array($this->clearTrackName($track_info['name']), $track_list_unique)
) {
$bonus_list[$track_id] = $track_info;
$track_list_unique[] = $this->clearTrackName($track_info['name']);
}
}
}
return array(
'tracks' => $album_list,
'bonus' => $bonus_list
);
}
private function clearTrackName($name) {
$name = str_replace('&', 'and', $name);
preg_match_all('/[a-z0-9]/Ui', $name, $m);
return strtolower(implode($m[0]));
}
}