Вы не зашли.
Главная »
PHP » Как получить cover файлы с сайта musicbrainz.org
Недавно у себя реализовал.
Ну начнём (лишне с кода уберу, т.к. он работает у меня)
Код:
// Запрос releaseId |
foreach($db->query('SELECT * FROM base WHERE тут хз чё там у Вас') as $row) |
{ |
// Разделим название пополам |
$track = explode(' - ', $row['track']); |
// Закодируем запрос |
$query = urlencode('artist:'.$track[0].' release:'.$track[1]); |
// URL запроса releaseId |
$url = 'https://musicbrainz.org/ws/2/release/?query='.$query.'&fmt=json'; |
// Опции CURL |
$options = [ |
CURLOPT_USERAGENT => 'тут нужно указать Ваш сайт и мыло', |
CURLOPT_RETURNTRANSFER => true, |
CURLOPT_FOLLOWLOCATION => true, |
]; |
$ch = curl_init($url); |
curl_setopt_array($ch, $options); |
$response = curl_exec($ch); |
curl_close($ch); |
// Раскодируем полученные данные |
$result = json_decode($response, true); |
// Если есть releases |
if(isset($result['releases'][0]['id'])) |
{ |
// Обновим запись releaseId |
$stmt = $db->prepare('UPDATE base SET releaseId = :releaseId WHERE id = :id LIMIT 1'); |
$stmt->execute([':releaseId' => $result['releases'][0]['id'], ':id' => $row['id']]); |
} |
sleep(1); |
} |
|
// Выкачиваем обложки |
foreach($db->query('SELECT * FROM base WHERE тут хз чё там у Вас') as $row) |
{ |
// Путь хранения файлов |
$cacheFile = $setup['cover_cache'].$row['releaseId'].'.jpg'; |
// Если файла нет, продолжаем |
if(file_exists($cacheFile)) continue; |
// URL откуда будем брать cover файлы |
$url = 'https://coverartarchive.org/release/'.$row['releaseId'].'/front-500'; |
// Опции CURL |
$options = [ |
CURLOPT_RETURNTRANSFER => true, |
CURLOPT_FOLLOWLOCATION => true, |
]; |
$ch = curl_init($url); |
curl_setopt_array($ch, $options); |
$response = curl_exec($ch); |
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); |
curl_close($ch); |
// Если код ответа 200 |
if($httpCode === 200) |
{ |
// Скачиваем файл |
file_put_contents($cacheFile, $response); |
} |
// Если код ответа 404 |
if($httpCode === 404) |
{ |
// Удалим записанный releaseId |
$stmt = $db->prepare('UPDATE base SET releaseId = NULL WHERE id = :id LIMIT 1'); |
$stmt->execute([':id' => $row['id']]); |
} |
sleep(1); |
} |
вопрос почему 2 foreach?
у меня невозможно реализовать в одном)
вопрос зачем это?
ну я хз, может пригодится)
вопрос, начерта стоят sleep
потому что через крон пашет, чтоб не ддосило их)
нюанс, сервис часто выдаст 404 если часто его просить, поэтому стоит сохранение полученных файлов
файл суём в крон и пусть катает каждый день.
критикуйте)
Добавлено спустя 4 минуты 4 секунды: Выглядит это так, на готовом варианте
и да, php 8, на 7 не уверен что сработает
Отредактировано WapStyle (2023.04.20 19:07)
нету разделения логики. нужно отделять логику кэша, работы с БД, http запросы. вынеси в функции отдельные хотя бы.
Gemorroj написал:
нету разделения логики. нужно отделять логику кэша, работы с БД, http запросы. вынеси в функции отдельные хотя бы.
смысл этих действий? этот код никогда человеком не используется, делает всё крон
смысл в разделении кода, чтобы его можно было легко модифицировать.
Gemorroj написал:
смысл в разделении кода, чтобы его можно было легко модифицировать.
а нечего модернизировать, каждый 3 часа его гоняет крон, проблем нет
Дошли руки, переделал.
Запуск по крону раз в сутки
Можешь ругать))
тебе нужно разбивать код на функции/классы, иначе это сложно поддерживать.
с ходу видно, что нужно prepare вынести из циклов, иначе в них смысла нет вообще.
prepare всего лишь 3 позиции и то если их потребует (файл в кроне, "не для народа")
может мы разные по уровню "кодинга" но это то что я смог у себя в голове вспомнить, вроде не заговнокодил
з.ы. данный функционал скачивания очень трудно найти, по крупицам собирал
вот фигачит, тут скорее на сутки (файлов у меня много)
Отредактировано WapStyle (2023.12.22 20:08)
Gemorroj написал:
Если не трудно покажи пример, я не дурак, я учусь (вспоминаю и учусь), много уже времени прошло с тех времён когда мы "писали код"
Отредактировано WapStyle (2023.12.22 20:08)
очень приблизительно так. тут нельзя делать 1 файлом, нужно править в контексте проекта. но суть, думаю, ясна.
по поводу 1 инстанса крон джобы, то есть более правильные решения на уровне запуска задания. например такое
https://stackoverflow.com/questions/129 … -with-cron