使用Applescript在iTunes中获取流媒体曲目的歌曲名称

时间:2012-05-04 05:46:09

标签: macos applescript itunes

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

我的意思是出现在收音机名称正下方的字符串:)

enter image description here

如下所示查询其名称会给我收音机的名称(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

这是预期的,因为我的库中的信息是: enter image description here 但有没有办法专门处理这些流媒体曲目?并像第一张图片中的iTunes一样正确获取他们的信息?我知道当前的音轨是收音机,因为它的时间是missing value而不是格式为MM:SS,如果这有点帮助的话。

这可能吗?

6 个答案:

答案 0 :(得分:7)

我查看了苹果脚本词典中的iTunes并搜索了“stream”...

tell application "iTunes"
    current stream title
end tell

答案 1 :(得分:2)

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

  1. current stream title在请求来自“For You”的流的名称时返回missing value(例如,当前音乐库中的某些不是)。 name of the current track不存在。例如,我现在正在听“For You”中的“Alternative Gems:1994”(Yay- grad school days),我无法获得有关播放内容的任何信息。如果我转到专辑,该曲目正在播放其他内容,missing valuename of current track上的错误-1728。

  2. 按照上面@ivan的说法收听Beats 1电台时,我也得到missing value name of the current track我得到了“Beats 1”。正如@dougscripts指出的那样,stream title内容在整个地图上都有所不同。

  3. 聆听通过“For You”创建的电台电台似乎给了我正确的name of the current track

  4. 所以,总之,混乱。

答案 2 :(得分:1)

并非所有的流式传输器都会将流数据的格式设置为相同,因此当前流标题属性的结果可能不一致。

答案 3 :(得分:1)

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

此方法会检查currentTrack是否正常,但是当它检测到artist丢失时(在流式传输轨道时常见的理解),我们会陷入困境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

答案 4 :(得分: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迷你播放器窗口在桌面的某个位置可见。

答案 5 :(得分:0)

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

PHP 7.1