当此曲目是收音机时,如何在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
,如果这有点帮助的话。
这可能吗?
答案 0 :(得分:7)
我查看了苹果脚本词典中的iTunes并搜索了“stream”...
tell application "iTunes"
current stream title
end tell
答案 1 :(得分:2)
看来,在iTunes 12.2中,各种有趣的事情正在发生。
current stream title
在请求来自“For You”的流的名称时返回missing value
(例如,当前音乐库中的某些不是)。 name of the current track
不存在。例如,我现在正在听“For You”中的“Alternative Gems:1994”(Yay- grad school days),我无法获得有关播放内容的任何信息。如果我转到专辑,该曲目正在播放其他内容,missing value
和name of current track
上的错误-1728。
按照上面@ivan的说法收听Beats 1电台时,我也得到missing value
但 name of the current track
我得到了“Beats 1”。正如@dougscripts指出的那样,stream title
内容在整个地图上都有所不同。
聆听通过“For You”创建的电台电台似乎给了我正确的name of the current track
。
所以,总之,混乱。
答案 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