Required plugins for this example: MBS MacBase Plugin, MBS Mac64bit Plugin, MBS Main Plugin
You find this example project in your Plugins Download as a Xojo project file within the examples folder: /Mac64bit/Media Library/Media Library Threaded KSW
Class App Inherits Application
Const kEditClear = "&Delete"
Const kFileQuit = "&Quit"
Const kFileQuitShortcut = ""
End Class
Class MainWindow Inherits Window
Control lstMain Inherits Listbox
ControlInstance lstMain Inherits Listbox
End Control
Control tmrCheckThread Inherits Timer
ControlInstance tmrCheckThread Inherits Timer
EventHandler Sub Action()
If xLoadMediaLibrary = Nil Then
me.Mode = Timer.ModeOff
Return
End If
Select Case xLoadMediaLibrary.State
Case Thread.NotRunning
me.Mode = Timer.ModeOff
If xLoadMediaLibrary.TimedOut Then
MsgBox "Media Library Timed Out"
Else
Dim i, iEnd As Integer
iEnd = uBound(xLoadMediaLibrary.Playlists)
For i =0 to iEnd
lstMain.AddRow xLoadMediaLibrary.Playlists(i).Name
lstMain.Cell(lstMain.LastIndex,1) = xLoadMediaLibrary.Playlists(i).Type
Next
End If
xLoadMediaLibrary = Nil
Return
End Select
End EventHandler
End Control
Control Label1 Inherits Label
ControlInstance Label1 Inherits Label
End Control
EventHandler Sub Open()
lstMain.DeleteAllRows()
xLoadMediaLibrary = New ThreadMediaLibrary
xLoadMediaLibrary.Run()
tmrCheckThread.Mode = Timer.ModeMultiple
End EventHandler
Property xLoadMediaLibrary As ThreadMediaLibrary
End Class
MenuBar MainMenuBar
MenuItem FileMenu = "&File"
MenuItem FileQuit = "#App.kFileQuit"
MenuItem EditMenu = "&Edit"
MenuItem EditUndo = "&Undo"
MenuItem EditSeparator1 = "-"
MenuItem EditCut = "Cu&t"
MenuItem EditCopy = "&Copy"
MenuItem EditPaste = "&Paste"
MenuItem EditClear = "#App.kEditClear"
MenuItem EditSeparator2 = "-"
MenuItem EditSelectAll = "Select &All"
End MenuBar
Class ThreadMediaLibrary Inherits Thread
EventHandler Sub Run()
Dim Options as New Dictionary
Dim dStarTicks As Double
Options.Value(MLMediaLibraryMBS.MLMediaLoadIncludeSourcesKey) = Array(MLMediaSourceMBS.MLMediaSourceiTunesIdentifier)
MediaLibrary = New MLMediaLibraryMBS(Options)
Const kTimeoutSeconds = 30
Dim dSources As Dictionary
dStarTicks = Ticks
Do
dSources = MediaLibrary.mediaSources
me.Sleep(1)
me.TimedOut = (Ticks-dStarTicks)/60 > kTimeoutSeconds
Loop Until dSources <> Nil or me.TimedOut
If me.TimedOut Then Return
System.DebugLog Str((Ticks-dStarTicks)/60) + " seconds to load media sources."
Dim xRootGroup As MLMediaGroupMBS
If dSources <> Nil Then
if dSources.Count = 0 then
return
end if
For Each x As Variant In dSources.Keys
Dim key_name As String = x
Dim xSource As MLMediaSourceMBS = dSources.Value(key_name)
dStarTicks = Ticks
Do
Dim xTest As MLMediaGroupMBS = xSource.rootMediaGroup
If xTest <> Nil Then
Select Case xTest.TypeIdentifier
Case MLMediaGroupMBS.MLiTunesRootGroupTypeIdentifier
xRootGroup = xTest
Else
System.DebugLog "Found " + xTest.Identifier + "; wanted: " + MLMediaGroupMBS.MLiTunesRootGroupTypeIdentifier
End Select
End If
me.Sleep(5)
me.TimedOut = (Ticks-dStarTicks)/60 > kTimeoutSeconds
Loop Until xRootGroup <> Nil or me.TimedOut
If me.TimedOut Then Return
System.DebugLog Str((Ticks-dStarTicks)/60) + " seconds to load root group."
Next
End If
Dim xChildGroups() As MLMediaGroupMBS
xChildGroups = xRootGroup.childGroups //Already loaded when we called
//Does not require waiting below as calling "rootMediaGroup" populated this already
'If xRootGroup <> Nil Then
'dStarTicks = Ticks
'Do
'xChildGroups = xRootGroup.childGroups //Already loaded when we called
'me.Sleep(1)
'me.TimedOut = (Ticks-dStarTicks)/60 > kTimeoutSeconds
'Loop Until uBound(xChildGroups) <> -1 or me.TimedOut
'If me.TimedOut Then Return
'System.DebugLog Str((Ticks-dStarTicks)/60) + " seconds to load childGroups."
'End If
For Each xThisChildGroup As MLMediaGroupMBS In xChildGroups
Select Case xThisChildGroup.TypeIdentifier
Case MLMediaGroupMBS.MLiTunesAudioBooksPlaylistTypeIdentifier, _
MLMediaGroupMBS.MLiTunesFolderPlaylistTypeIdentifier, _
MLMediaGroupMBS.MLiTunesGeniusPlaylistTypeIdentifier, _
MLMediaGroupMBS.MLiTunesiTunesUPlaylistTypeIdentifier, _
MLMediaGroupMBS.MLiTunesMoviesPlaylistTypeIdentifier, _
MLMediaGroupMBS.MLiTunesMusicPlaylistTypeIdentifier, _
MLMediaGroupMBS.MLiTunesMusicVideosPlaylistTypeIdentifier, _
MLMediaGroupMBS.MLiTunesPlaylistTypeIdentifier, _
MLMediaGroupMBS.MLiTunesPodcastPlaylistTypeIdentifier, _
MLMediaGroupMBS.MLiTunesPurchasedPlaylistTypeIdentifier, _
MLMediaGroupMBS.MLiTunesSavedGeniusPlaylistTypeIdentifier, _
MLMediaGroupMBS.MLiTunesTVShowsPlaylistTypeIdentifier, _
MLMediaGroupMBS.MLiTunesVideoPlaylistTypeIdentifier
Dim xNew As New iTunesPlaylistKSW
xNew.Name = xThisChildGroup.Name
xNew.Type = xThisChildGroup.TypeIdentifier
me.Playlists.Append xNew
End Select
Next
End EventHandler
Property MediaLibrary As MLMediaLibraryMBS
Property Playlists() As iTunesPlaylistKSW
Property TimedOut As Boolean
End Class