Music Search & Cross-Platform Integration API

Controlador: app/Http/Controllers/Api/MusicSearchController.php (348 líneas)

Integra con la iTunes Search API para buscar canciones. Todos los endpoints son públicos.


GET /api/music/search (pública)

Buscar canciones en iTunes.

Query params: | Param | Tipo | Default | Descripción | |—|—|—|—| | query | string (required) | — | Término de búsqueda (min 2, max 100 chars) | | limit | integer | 20 | Máximo resultados (1-50) | | country | string | US | Código de país ISO (2 chars) |

Ejemplo:

GET /api/music/search?query=Blinding+Lights&limit=10&country=US

Response:

{
  "success": true,
  "data": [
    {
      "trackId": 1499885833,
      "trackName": "Blinding Lights",
      "artistName": "The Weeknd",
      "collectionName": "After Hours",
      "artworkUrl100": "https://is1-ssl.mzstatic.com/.../100x100bb.jpg",
      "artworkUrl60": "https://is1-ssl.mzstatic.com/.../60x60bb.jpg",
      "previewUrl": "https://audio-ssl.itunes.apple.com/.../30s_preview.m4a",
      "trackViewUrl": "https://music.apple.com/us/album/.../1499885833",
      "trackTimeMillis": 200040,
      "country": "US",
      "primaryGenreName": "Pop",
      "releaseDate": "2020-03-20T...",
      "artworkUrlHigh": "https://is1-ssl.mzstatic.com/.../600x600bb.jpg",
      "duration": "3:20",
      "hasPreview": true,
      "appleMusicUrl": "https://music.apple.com/us/album/.../1499885833",
      "spotifySearchUrl": "https://open.spotify.com/search/The%20Weeknd%20Blinding%20Lights"
    }
  ],
  "count": 10
}

Flujo interno (searchTracks):

  1. Construye cache key: md5(query + limit + country)
  2. Si hay cache → devuelve resultado cacheado (TTL: 1 hora)
  3. Si no → HTTP GET https://itunes.apple.com/search con params:
  1. Transforma cada resultado:
  1. Filtra tracks que tengan nombre Y preview
  2. Guarda en cache y retorna

GET /api/music/track (pública)

Obtener información de un track específico por ID.

Query params: trackId (required, integer)

GET /api/music/track?trackId=1499885833

Response: Un solo objeto track con la misma estructura que los resultados de search.

Cache: Individual por trackId, TTL 1 hora.