Apple не особо афиширует, что у iTunes Store и других каталогов есть кривенькое, но простое поисковое API — поэтому я решил о нём написать. Из этой заметки вы узнаете, что API умеет и как его использовать.
Поиск в каталогах Apple
API ищет по содержимому iTunes Store, iBooks Store, Apple Podcasts и App Store. Соответственно, можно найти песни, фильмы, книги, подкасты и приложения.
API работает по давно забытому принципу JSONP, то есть возвращает Content-Type: text/javascript
вместо нормального application/json
.
GET /search?media=podcast&term=python HTTP/1.1
Host: itunes.apple.com
Accept: application/json
HTTP/2 200
content-type: text/javascript; charset=utf-8
{...}
Конечно, эту особенность можно просто игнорировать:
import requests
def search(term, media):
url = "https://itunes.apple.com/search"
payload = {"term": term, "media": media}
response = requests.get(url, params=payload)
response.raise_for_status()
results = response.json().get("results", [])
return results
>>> results = search("python", media="podcast")
>>> results[0]["collectionName"]
'Talk Python To Me'
Параметры запроса
Поиск можно настроить:
term
— поисковый запрос, единственный обязательный параметр;media
— тип произведения (movie
,podcast
,music
,audiobook
,software
,ebook
,all
), по умолчаниюall
;country
— страна произведения, двухсимвольный ISO-код (us
,ru
, ...), по умолчаниюus
;limit
— максимальное количество результатов, по умолчанию50
.
Пример функции, которая поддерживает все параметры:
import requests
def search(term, media="all", country="us", limit=10):
url = "https://itunes.apple.com/search"
payload = {"term": term, "media": media, "country": country, "limit": limit}
response = requests.get(url, params=payload)
response.raise_for_status()
results = response.json().get("results", [])
return results
Ответ
Общая структура ответа:
{
"resultCount": 10,
"results": [
{
"wrapperType": "track",
"kind": "song",
"artistId": 1495668306,
"collectionId": 527039271,
"trackId": 527039276,
"artistName": "Dodge & Fuski",
"collectionName": "Never Say Die (Deluxe Edition)",
"trackName":"Python",
...
},
{
"wrapperType": "track",
"kind": "podcast",
"collectionId": 979020229,
"trackId": 979020229,
"artistName": "Michael Kennedy (@mkennedy)",
"collectionName": "Talk Python To Me"
...
},
...
]
}
Конкретный набор полей зависит от типа произведения (kind
) и полноценно нигде не описан, насколько мне известно. Часто заполнены:
artistId
— идентификатор автора произведения;artistName
— автор;artistViewUrl
— ссылка на автора на сайте Apple;collectionId
— идентификатор альбома;collectionName
— название альбома;collectionViewUrl
— ссылка на альбом на сайте Apple;trackId
— идентификатор композиции;trackName
— название композиции;artworkUrl100
— ссылка на превьюшку произведения 100x100 пикселей;country
— страна произведения;primaryGenreName
— жанр произведения.
Для подкастов я сделал типизированную обёртку — пакет podsearch, можно посмотреть набор полей в нём.
Запрос по идентификатору
Если известен идентификатор объекта (artistId
, collectionId
, trackId
), можно вызвать метод lookup
по нему:
import requests
def lookup(object_id):
url = "https://itunes.apple.com/lookup"
payload = {"id": object_id}
response = requests.get(url, params=payload)
response.raise_for_status()
results = response.json().get("results", [])
return results
>>> results = lookup(979020229)
>>> results[0]["collectionName"]
'Talk Python To Me'
Нюансы
Про необычный Content-Type ответа я уже упомянул. Кроме того:
- Страна произведения (
country
) есть как в параметрах запроса, так и в ответе. Но в параметрах это двухсимвольный ISO-код (ru
), а в ответе — трёхсимвольный (RUS
). - Схемы ответа не существует.
- Apple ограничивает частоту вызова API 20 запросами в минуту.
Описание API на сайте Apple
Пакет для поиска по подкастам
Если хотите больше интересных штук на Python — подписывайтесь на канал @ohmypy