$br && ! $found_br) { $delta = self::$_bitrates[$i] - $br; $br_delta = self::$_bitrates[$i] - self::$_bitrates[$i-1]; if (round($br_delta / 3) > $delta) { $found_br = self::$_bitrates[$i]; } else { $found_br = self::$_bitrates[$i-1]; } } elseif ($i == count(self::$_bitrates) - 1 && self::$_bitrates[$i] < $br && ! $found_br) { $delta = $br - self::$_bitrates[$i]; if ($delta < 32) { $found_br = self::$_bitrates[$i]; } else { $found_br = $br; } } } return $found_br; } /** * Проверяет файлы, рассчитывает битрейт и релевантность * * @param array $files Массив файлов для обработки * @return array Обработанный массив файлов * @author chez **/ public static function check($files, $artist_name, $track_name, $track_length) { $urls = array(); foreach($files as $i => $file) { $urls[$i] = $file['url']; } $headers = RemoteFile::getHeadersMT($urls); foreach ($files as $i => $file) { if (!isset($headers[$i]['http']) || $headers[$i]['http'] != 200) { unset($files[$i]); } else { $files[$i]['size'] = trim($headers[$i]['content_length']); } } $m = new TrackWeight(); $m->setTrackData($artist_name, $track_name, $track_length); $m->setFiles($files); $m->calculateWeight(); $files = $m->getFiles(); uasort($files, function($a, $b){ return $a['weight'] < $b['weight']; }); foreach ($files as $i => $file) { $files[$i]['bitrate'] = self::calculateBitrate($file['size'], $files[$i]['duration']); } return $files; } /** * Чистит строку для максимально точного сравнения * * @param string $str Необработанная строка * @return string Чистая строка * @author chez **/ public static function prepareQuery($str) { $str = trim($str); while(strpos($str, ' ') !== false) { $str = str_replace(' ', ' ', $str); } return $str; } /** * Преобразует длину из формата мм:сс в ссс * * @param string $duration Читабельная длина * @return int Длина в секундах * @author chez **/ public static function convertDuration($duration) { $tmp = explode(':', $duration); return ($tmp[0] * 60 + $tmp[1]); } }