87 lines
2.3 KiB
PHP
87 lines
2.3 KiB
PHP
|
<?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]));
|
|||
|
}
|
|||
|
}
|