10

当该曲目是收音机时,如何在 iTunes 中获取当前曲目的歌曲名称?

我的意思是出现在电台名称正下方的字符串:)

在此处输入图像描述

像下面这样查询它的名字给了我收音机的名字(Trance Channel - DIGGITALLY IMPORTED - we can't define it!)但不是歌曲

tell application "iTunes"
    set thisTrack to current track
    set trackName to the name of thisTrack
    set trackTime to thisTrack's time
end tell

这是预期的,因为我的图书馆中的信息是: 在此处输入图像描述 但是有没有办法专门处理这个流媒体轨道?并像第一张图片中的 iTunes 一样正确获取他们的信息?我知道当前曲目是收音机,因为如果这有帮助的话,它的时间将是missing value而不是形式。MM:SS

这可能吗?

4

6 回答 6

8

我查看了 iTunes 的 AppleScript 字典并搜索了“流”...

tell application "iTunes"
    current stream title
end tell
于 2012-05-04T06:25:28.053 回答
3

看来,在 iTunes 12.2 中,各种有趣的事情正在发生。

  1. current stream titlemissing value请求来自“For You”的流名称时返回(例如,不在您当前音乐库中的内容)。name of the current track不存在。例如,我现在正在听“For You”中的“Alternative Gems: 1994”(Yay-grad 学生时代),但我无法获得任何关于正在播放的信息。如果我转到正在播放曲目的专辑以播放其他内容,也会missing value出现错误-1728 name of current track

  2. 当按照上面的@ivan 收听 Beats 1 广播时,我也得到了,missing value 因为name of the current track我得到了“Beats 1”。正如@dougscripts 指出的那样,这些stream title东西在地图上各不相同。

  3. 收听通过“为你”创建的广播电台似乎给了我正确的name of the current track.

所以,简而言之,混乱。

于 2015-07-06T22:38:45.023 回答
1

并非所有流媒体都将流数据格式相同,因此当前流标题属性的结果可能不一致。

于 2012-05-05T15:55:22.677 回答
1

更多的黑客攻击,我终于找到了一种使用 SDK 直接从 iTunes 中获取数据的方法。

此方法将检查currentTrack正常情况,但是当检测到artist缺少 (在流式传输轨道时的常见理解)时,我们会使用 Accessibility 提供的值从 LCD 显示器获取值。

#!/usr/bin/env osascript -l JavaScript
/* globals Application */
function main () {
  var itunes = new Application('iTunes')
  var currentTrack = itunes.currentTrack
  var output = {
    name: currentTrack.name(),
    artist: currentTrack.artist(),
    position: itunes.playerPosition()
  }
  if (currentTrack.artist() === '') {
    var app = new Application('System Events')
    var itunesProcess = app.applicationProcesses.byName('iTunes')
    // Get the text values from the first scrollable area which is the LCD Display
    var arr = itunesProcess.windows[0].scrollAreas[0].staticTexts

    output.name = arr[0].name()
    // Clean up the artist name, as it may contain the Show Name. 
    output.artist = arr[2].name().replace(' — ' + currentTrack.name(), '')
  }
  return JSON.stringify(output, null, 2)
}
main()

示例输出:

{
    "name": "Wild Smooth (Gundam Radar Rip)",
    "position": "34:06",
    "artist": "MUBLA"
}

一定要chmod +x这个脚本。

请注意,它需要将调用应用程序添加到Accessibility Privacy

于 2018-06-18T21:19:08.363 回答
1

另一种选择 - 考虑到输出的不一致 - 可能是在VLC中播放并查询它 - AppleScript 支持非常有限,但至少源代码可用,因此您知道可以查询什么。

osascript -e 'tell application "VLC" to get name of current item'
于 2019-04-22T16:18:56.720 回答
0

经过数周的努力,我试图自己解决这个问题。我已经设法为这个确切的问题找到了一个非常hacky的解决方案。

不过,您不会喜欢它,请注意

即使音频是从 Beats 收音机流式传输的,为了获得当前播放曲目,您将不得不考虑 OCR 方法(截屏,将图像转换为文本)

以下 Ruby 代码将帮助您开始使用此解决方案。

它将检查当前轨道,如果该artist字段为空白,(这是流式传输轨道时的情况),则属于 OCR 方法。

require 'json'
require 'rtesseract'
class CurrentTrack
  def self.check
    js_command = %Q{var itunes = Application("iTunes");
    var currentTrack = itunes.currentTrack;
    JSON.stringify({
      window_bounds: itunes.windows[0].bounds(),
      name: currentTrack.name(),
      artist: currentTrack.artist(),
      position: itunes.playerPosition()
    })
    }
    command = "osascript -l JavaScript -e '#{js_command}'"
    result =  `#{command}`
    json = JSON.parse(result, symbolize_names: true)
    json[:position] = json[:position].to_i
    json[:cue] = Time.at(json[:position]).utc.strftime('%H:%M:%S')
    if json[:artist] == ''
      sc_command = %Q{screencapture -R #{json[:window_bounds][:x]},#{json[:window_bounds][:y].to_i + 30},#{json[:window_bounds][:width]},#{json[:window_bounds][:height]} capture.png}
      `#{sc_command}`
      image = RTesseract.new("capture.png", processor: 'none')
      ocr = image.to_s.split("\n") # Getting the value
      unless ocr.first == 'Soulection'
        json[:name] = ocr.first
        json[:artist] = ocr[1].split(' — ').first
      end
    end
    json.delete :window_bounds

    json
  end
end

您需要安装rtesseract才能使其正常工作。

需要注意的是,此脚本要求 iTunes 迷你播放器窗口在您桌面的某处可见。

于 2018-06-18T14:17:13.510 回答