0 votos

¿Cómo añadir una pista de Apple Music a tu biblioteca con AppleScript?

Dado un ID de álbum (por ejemplo, 1646945378) y un ID de pista (por ejemplo, 1646945384), ¿hay alguna manera de agregar una pista a la biblioteca usando AppleScript/JXA?

  • macOS: Sonoma 14.2
  • Música: 1.4.2.83

Sé que puedes hacer algo como

duplicate current track to playlist "Library"

Idealmente, no quiero reproducir la pista antes de agregarla a mi biblioteca, pero no puedo encontrar una forma de obtener un objeto pista compartida solo con los ID de álbum y pista.

He descubierto cómo abrir el álbum y seleccionar la pista:

set albumID to "1646945378"
set trackID to "1646945384"

tell application "Music" to open location "itmss://geo.music.apple.com/album/" & albumID & "?i=" & trackID & "&ls=1&app=music"

Sin embargo, no puedo obtener la pista seleccionada. Este código registra listas vacías:

tell application "Music"
  log (get browser window 1's selection)
  log (get selection)
  -- Como se está navegando por un álbum, no una lista de reproducción, ‘get browser 1's view’ no funciona tampoco
end tell

Como último recurso, pensé que podría intentar hacer clic manualmente en el botón de agregar a la biblioteca, pero no puedo averiguar cómo saber si una pista está seleccionada o no, ya que todos los elementos de la interfaz parecen tener selected:missing value.

tell application "System Events"
  tell process "Music"
    set tracksList to get window 1's splitter group 1's scroll area 2's list 1's list 2
    set trackGroups to tracksList's groups

    -- Con la pista de ejemplo anterior, la primera pista está seleccionada

    set t1 to get trackGroups's item 1
    set t2 to get trackGroups's item 2

    -- Cada grupo tiene un elemento secundario de la interfaz de usuario: otro grupo. Este grupo contiene cosas como
    -- el número de pista, nombre, botones, etc.
    log (get t1's properties) -- focused:missing value, selected:missing value
    log (get t2's properties) -- focused:missing value, selected:missing value

    log (get t1's group 1's properties) -- focused:false, selected:missing value
    log (get t2's group 1's properties) -- focused:false, selected:missing value
  end tell
end tell

Podría usar la API de Apple Music para obtener el número de pista de la pista que quiero agregar a mi biblioteca (o en mi caso específico ni siquiera necesitaría usar la API para hacer esto) y hacer clic en el botón de agregar a la biblioteca de esa manera.

Sin embargo, todo esto parece bastante tedioso y molesto para algo que creo que debería ser un comando de AppleScript integrado. ¿Hay una mejor/manera más fácil de hacer esto?


Relacionado:

0voto

Bastien Puntos 332

Aquí está mi solución actual un poco chapucera (JXA) que utiliza la API de Apple Music para obtener el número de la pista:

const delayAmount = 0.1

// para una versión síncrona algo así debería funcionar (no probada):
/*
const app = Application.currentApplication()
app.includeStandardAdditions = true
const token = '...'
const appleMusicRequest = path => JSON.parse(app.doShellScript(`/usr/bin/curl -f -H authorization:'Bearer ${token}' -H origin:https://amp-api.music.apple.com https://amp-api.music.apple.com/v1/${path}`))
*/
const appleMusicRequest = (() => {
  ObjC.import('Cocoa')

  const token = 'eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IldlYlBsYXlLaWQifQ.eyJpc3MiOiJBTVBXZWJQbGF5IiwiaWF0IjoxNzAyNTAyMjM0LCJleHAiOjE3MDk3NTk4MzQsInJvb3RfaHR0cHNfb3JpZ2luIjpbImFwcGxlLmNvbSJdfQ.zzeMLmez71PLinP9GozYSQnF7NYyCiXHB9tKL3-cyu3LzyeRnYz0ejLj4CrNJs0dlNkFg9_mwKmMLueUAR-KRg'
  const sessionConfig = $.NSURLSessionConfiguration.defaultSessionConfiguration
  sessionConfig.HTTPAdditionalHeaders = $({authorization: `Bearer ${token}`, origin: 'https://amp-api.music.apple.com'})
  const session = $.NSURLSession.sessionWithConfiguration(sessionConfig)
  const baseURL = $.NSURL.URLWithString($('https://amp-api.music.apple.com/v1/'))
  // o si eres parte del Programa de Desarrolladores de Apple puedes usar tu propio token:
  /*
  const token = 'tu token de desarrollador'
  const sessionConfig = $.NSURLSessionConfiguration.defaultSessionConfiguration
  sessionConfig.HTTPAdditionalHeaders = $({authorization: `Bearer ${token}`})
  const session = $.NSURLSession.sessionWithConfiguration(sessionConfig)
  const baseURL = $.NSURL.URLWithString($('https://api.music.apple.com/v1/'))
  */

  return async path => new Promise((resolve, reject) =>
    session.dataTaskWithURLCompletionHandler(
      $.NSURL.URLWithStringRelativeToURL($(path), baseURL),
      (data, response, error) => {
        if (!error.isNil()) {
          reject(error)
          return
        }
        const string = $.NSString.alloc.initWithDataEncoding(data, $.NSUTF8StringEncoding).js
        response.statusCode === '200'
          ? resolve(JSON.parse(string))
          : reject(new Error(`Código de estado ${response.statusCode}: ${string}`))
      }
    ).resume
  )
})()
const appleMusicTrack = async (trackID, storefront = 'au') => (await appleMusicRequest(`catalog/${storefront}/songs/${trackID}`)).data[0]

const Music = Application('Music')
Music.includeStandardAdditions = true

const SystemEvents = Application('System Events')
const musicProcess = SystemEvents.processes.Music

const addTrack = async (albumID, trackID) => {
  Music.openLocation(`itmss://geo.music.apple.com/album/${albumID}?ls=1&app=music`)
  const mainUIElement = musicProcess.windows[0].splitterGroups[0].scrollAreas[1].lists[0]
  while (mainUIElement.lists().length !== 2 || !mainUIElement.lists[1].groups().length) delay(delayAmount)

  const trackContainer = mainUIElement.lists[1]

  const trackNumber = (await appleMusicTrack(trackID)).attributes.trackNumber
  const trackGroup = trackContainer.groups[trackNumber - 1].groups[0]

  trackGroup.buttons.whose({description: 'Más'})[0].click()
  while (!trackGroup.menus().length) delay(delayAmount)

  trackGroup.menus[0].menuItems['Agregar a la biblioteca'].click()
}

Con suerte hay una mejor forma de hacer esto.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X