Page 1 of 1
Find if a file is in the library
Posted: Thu Jun 14, 2018 10:36 am
does anyone have a snippet of code to determine if a song (designated by a complete path on a disk) exists in the current library? I know I should use the Database and QuerySongs but I don't know how to prepare the query nor do I know the format of the return. I know this is a really fundamental thing to do but I've spent a couple of hours looking in the forums and can't find what I need.
Input: a complete path to an mp3 or flac file
Output: the ID of the song if it is in the library or 0 if not found
Re: Find if a file is in the library
Posted: Sun Jun 17, 2018 10:25 am
It turns out that there is a real oddity in the way that MediaMonkey's QuerySong Function works. If you pass it a string of a file path on a network such as "\\myShare\myFolder\Songs\a Song.mp3" then everything works okay. On the other hand, if you have a path no a local drive then you first have to drop the drive letter before making the call. A remote possibility exists with the return and you can have multiple returns so you have to check the returns to find the one that has the drive letter you dropped off for the call.
I don't do scripting with MediaMonkey. However, I use it as a COM object and I work with MediaMonkey from VBA in Excel and Word and also sometime using Visual Basic 6. Bellow is a function that returns the song data in .SDBSongData form from a file path either no a local drive or a network drive.
Code: Select all
Function GetSongDataFromPath(FilePath As String, SongData As SDBSongData) As Long
[color=#40BF00]' Given a file path (e.g., D:\Songs\A Song.mp3"), this function will search through the
' MediaMonkey database and return the data for the file if it is in the database.
' Due to a quirk in the database query function for MediaMonkey, the drive letter must be dropped
' off of the file path string in order for it to work. Since it is possible, although unlikely, to have
' a song by the same name in the same path on a different drive, we use some extra code to cycle through
' the found songs, looking for the drive letter the same as ours. this is not done or needed if
' the specified FilePath is on a network (e.g., "\\Share\Folder\").
' At least in VBA, this function works with Unicode FilePath strings.
' FilePath - complete path to the song in question. Could be .mp3, .flac etc.
' SongData - MediaMonkey SDBSongData structure to hold return info if song is found in the database
' Note- SongData contains all 0's if the song is not found int he database.
' 0 Success! FilePath has been found in the database. SongData will hold the databse information on the file.
' -1 Could not connect to MediaMonkey (likely MediaMonkey is not running)
' -2 FilePath was not found in the MediaMonkey database
' -3 Got path match but no drive letter match.[/color]
Dim SDB As SongsDB.SDBApplication
Dim Cntr As Long
Dim tr As SDBSongIterator
Dim stDB As String
Dim IsUNC As Boolean
Dim Success As Boolean
On Error GoTo NoConnect
Set SongData = Nothing
Set SDB = New SongsDB.SDBApplication ' set COM connection to MediaMonkey
On Error GoTo 0
' if drive letter and not UNC network path, drop drive letter
If AscW(FilePath) <> 92 Then
stDB = Right$(FilePath, Len(FilePath) - 1)
IsUNC = False
stDB = FilePath
IsUNC = True
' Query the MediaMonkey database for the complete path of the song
Set tr = .QuerySongs("NOT STRICOMPW(SongPath," & ChrW$(34) & stDB & ChrW$(34) & ")")
If tr.EOF Then
' did not find the song
GetSongDataFromPath = -2
If IsUNC Then
Success = True
ElseIf AscW(tr.Item.Path) = AscW(FilePath) Then
Success = True
If Success Then
Set SongData = tr.Item
GetSongDataFromPath = 0
Cntr = Cntr + 1
Loop Until (tr.EOF) Or (Cntr > 100) ' give up if we get more than 100 duplicates
If GetSongDataFromPath <> 0 Then GetSongDataFromPath = -3 ' match but not the first character if is not a network path (UNC)
Set SDB = Nothing
GetSongDataFromPath = -1
Dim Track As SDBSongData, i As Long, myStr As String
myStr = Imports.Cells(20, 2).Value
'myStr = "F:\Media\Music\MP3s\1960's Soul\Brenton Wood\Gimme Little Sign _ Brenton Wood.mp3"
'myStr = "F:\Media\Music\MP3s\Jazz\Al Hirt\Alley Cat _ Al Hirt.mp3"
'myStr = "F:\zz\WeatherGirls.mp3"
i = GetSongDataFromPath(myStr, Track)
Select Case i
Case 0 ' success!
MsgBox myStr & vbCrLf & vbCrLf & "found in MediaMonkey. ID: " & Format(Track.ID, "#,##0"), vbInformation, "Successful MediaMonkey Search"
MsgBox "Could not connect to MediaMonkey (likely MediaMonkey is not running)", vbCritical
MsgBox myStr & vbCrLf & vbCrLf & "was not found in the MediaMonkey database", vbCritical
MsgBox "Got path match but no drive letter match."
MsgBox "Unknown error"
Set Track = Nothing