【问题标题】:Retrieve an iTunes Track object from its high/low persistent ID从其高/低持久 ID 中检索 iTunes Track 对象
【发布时间】:2014-01-30 06:49:13
【问题描述】:

我正在尝试使用 AutoHotkey (v1.1) 和 iTunes Windows 11 从其持久 ID 中检索轨道对象。该脚本运行良好,直到我尝试使用 ItemByPersistentID 方法。

objITunesunesApp := ComObjCreate("iTunes.Application")
objITunesLibrary := objITunesunesApp.Sources.Item(1)
objITunesPlaylist := objITunesLibrary.Playlists.Item(1)
objITunesTrack := objITunesPlaylist.Tracks.Item(1)

; Test if objects are OK
MsgBox, % objITunesTrack.Name ; Display the song name - OK

; Get high and low IDs
intIDHigh := objITunesunesApp.ITObjectPersistentIDHigh(objITunesTrack)
intIDLow := objITunesunesApp.ITObjectPersistentIDLow(objITunesTrack)
MsgBox, %intIDHigh% %intIDLow% ; Display: "-1071797520 -947434212" OK

; Try to get the track again using the persistent IDs
objTrackByID := objITunesLibrary.ItemByPersistentID(intIDHigh, intIDLow)
; Error:  0x80020006 - Name unknown
; Specifically: ItemByPersistentID

MsgBox, % "objTrackByID.Name: " . objTrackByID.Name ; name empty

我打电话给ItemByPersistentID 的方式是否正确?谢谢。

【问题讨论】:

    标签: com itunes autohotkey itunes-sdk


    【解决方案1】:

    除非其他人提供有关 ItemByPersistentID 函数的答案,否则我发现了另一种方法。更繁琐,因为您必须保存有关曲目的 4 个 ID 才能通过 ID 检索它,但它确实有效。

    objITunesunesApp := ComObjCreate("iTunes.Application") ; will launch iTunes if not running
    objITunesLibrary := objITunesunesApp.Sources.Item(1) ; main library
    objITunesPlaylist := objITunesLibrary.Playlists.Item(1) ; main playlist
    objITunesTrack := objITunesPlaylist.Tracks.Item(1) ; first track
    
    ; get IDs for this track
    sourceID := objITunesTrack.sourceID
    playlistID := objITunesTrack.playlistID
    databaseID := objITunesTrack.trackDatabaseID
    trackID := objITunesTrack.trackID
    ; check track name to see if we can retrieve the same track by IDs
    name := objITunesTrack.name
    
    MsgBox, % ""
        . "sourceID: " . sourceID . "`n"
        . "playlistID: " . playlistID . "`n"
        . "databaseID: " . databaseID . "`n"
        . "trackID: " . trackID . "`n"
        . "name: " . name . "`n"
    
    ; retrieve the same track using IDs
    objTrackByID := objITunesunesApp.GetITObjectByID(sourceID, playlistID, trackID, databaseID)
    
    MsgBox, % "objTrackByID.name: " . objTrackByID.name ; same name as previously -> WORKS!
    

    sourceIDplaylist 不会针对同一播放列表中的所有曲目进行更改。因此,我们只需要为每个轨道保存 2 个 ID 即可检索轨道。最后,只要可行,就不会比通过ItemByPersistentID 检索复杂多少。

    【讨论】:

    • 只需要考虑到这些 ID 不是持久的。如对象模型文档中所述:“IITObject 使用四个单独的 ID 唯一标识 iTunes 中的源、播放列表或曲目。这些是运行时 ID,它们仅在 iTunes 的当前实例运行时有效。”
    【解决方案2】:

    刚刚发现原脚本中的错误:

    objTrackByID := objITunesPlaylist.Tracks.ItemByPersistentID(intIDHigh, intIDLow)
    

    ItemByPersistentID 是 Tracks 集合的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-09
      • 1970-01-01
      • 1970-01-01
      • 2012-10-08
      • 1970-01-01
      • 2012-01-14
      • 2018-03-11
      • 1970-01-01
      相关资源
      最近更新 更多