getmusicbee.com

Support => Developers' Area => MusicBee API => Topic started by: e-motiv on March 30, 2012, 10:08:37 PM

Title: New plugin: Ghost files! Can API provide? Suggestions needed!
Post by: e-motiv on March 30, 2012, 10:08:37 PM
I am (slowly) writing a new plugin that will let one keeps ghost files / tracks.  These are are not longer on your file system (deleted), but all info of it is still saved (like filename, size, tags, how many times you listened, rating, ..).
My main reason is a better organization for "music collecting", e.g. you listen to some new music from friend or site or whatever, and you keep/download the tracks you like, but delete the others, but some other time you happen to listen to some new tracks, you might be listening to the same ones you discarded before.  With ghost files, you will know you have listened to it before and you save yourself time and headaches.

Now, I have some questions (for everyone, but I need some answers from Steven):

Thanks and appreciation in advance!!  ;)
Title: Re: New plugin: Ghost files! Can API provide? Suggestions needed!
Post by: Steven on March 31, 2012, 08:05:23 AM
  • Can the database engine be accessed via the API? If not, is there any dll that can be double used from MB?
the API supports accessing the library and fields
            public Library_GetFilePropertyDelegate Library_GetFileProperty;
            public Library_GetFileTagDelegate Library_GetFileTag;
            public Library_GetLyricsDelegate Library_GetLyrics;
            public Library_GetArtworkDelegate Library_GetArtwork;
            public Library_QueryFilesDelegate Library_QueryFiles;

  • Shall I keep these ghost files in a seperate DB, or same DB, but different table or the actual MB database tables themselves in conjuction with an extra table, or should I work together with Steven for some extra fields so it will all be in the exact same DB table from MB???
keep the files in your own storage
            public Setting_GetPersistentStoragePathDelegate Setting_GetPersistentStoragePath;
this api returns the writteable storage area. Suggest you create your own sub-folder and files there. Whether you use SQL Lite or your own flat file scheme is up to you
  • I guess .NET 4 (MB2+) is the safest way to be future proof? Is the .NET4 API the one of the first post of the API topic  or the last post with API update?
the api is compatible with .NET2 up to API revision 10 - see the MusicBeeApiInterface structure
            public short ApiRevision;
but i expect you will need new features so best just work with the new API and .NET4
  • Would it be possible to use the current Music Library (including filtering) and default (what's it called?) organizing panels?
i would need to add support and can do. For the panels, i will need a good idea of how you think it should be implemented
Title: Re: New plugin: Ghost files! Can API provide? Suggestions needed!
Post by: e-motiv on March 31, 2012, 12:21:17 PM
Thanks, Steven! Still have some questions though:
  • Can the database engine be accessed via the API? If not, is there any dll that can be double used from MB?
the API supports accessing the library and fields
            public Library_GetFilePropertyDelegate Library_GetFileProperty;
            public Library_GetFileTagDelegate Library_GetFileTag;
            public Library_GetLyricsDelegate Library_GetLyrics;
            public Library_GetArtworkDelegate Library_GetArtwork;
            public Library_QueryFilesDelegate Library_QueryFiles;
These are only for tracks from MB's own database and table, right? And only possible with their own fields, or? (And no write access, but I guess the other functions can do that.)
If so, I am more interested in general SQL Lite access functions since I will have my own DB and table (after your suggestion). Since you already use SQL Lite, I was thinking to double use the function-library MB already uses itself, via calling the same dll (or via the API).  To evade having to add another dll myself, just for the same DB access (not same DB, just same engine=SQL Lite)
[/quote]
  • Would it be possible to use the current Music Library (including filtering) and default (what's it called?) organizing panels?
i would need to add support and can do. For the panels, i will need a good idea of how you think it should be implemented
Great!
In the music library I would just have to be able to feed my table into it (with similar, but also extra track fields e.g. "ghost file yes/no") or have a distinct menu item under it in the library dropdown, or what were you thinking? Maybe there are other options.
-About the panels: First, that's only needed if the above is not possible.  I just need a tab to display my ghost music tracks the exact same way as MB displays any track list today.  (Except for some extra fields maybe (like "ghost file" yes/no.)
So, just a list of tracks with fields (and if possible all the other things that come with it, such as the different views, the different filters, the mouse context menus, ordering, etc..).  I could actually also use this latter solution for my Radio Dig plugin (which has a limited amount of fields.)
Concerning good ideas, I am afraid I am not much of use, especially since I don't  (have time nor will to ;D) know your code, but maybe the function that you use to display a track list panel can have an extra parameter and that parameter tells it what source it should take (MB itself or a plugin-propagated source; this source being a handle, pointer, class-object whatever you use today, or maybe even a database connection).

Thanks in advance, whatever and however you would get this done.
Title: Re: New plugin: Ghost files! Can API provide? Suggestions needed!
Post by: e-motiv on April 02, 2012, 11:52:35 AM
Hi Steven,
Regarding double use sql dll, after much searching I found this solution:
In build file,reference MB dll:
Code
			<references>
        <include name='C:\Program Files (x86)\MusicBee\System.Data.SQLite.dll'/>
</references>
In source, just SQlite away:
Code
using System.Data.SQLite; //http://system.data.sqlite.org
pluginDBFileName = mbApi.Setting_GetPersistentStoragePath()+sep+about.Name+".db";
DB = new SQLiteConnection(@"Data Source="+pluginDBFileName);
DB.Open();
That simple!

But now, my main block is that I can't ghost-delete the current selected file (in library or player or wherever).
I think the current API doesn't cover the following things or does it?:

OR just an extra option in  MB's own delete confirmation which (if checked) triggers a plugin method / notification.
[/list]
Think you can implement any of those, Steven? I do allow a lot of options, don't I?  ;D ;D
(I think the last one is the best for as well you as users, don't you think?)

Later on, I would need even more I am afraid, like:

What would be even cooler is that one can search into library and ghost files at same time (so checkbox option "also search ghost file")

Anything much appreciated!  :-*
Title: Re: New plugin: Ghost files! Can API provide? Suggestions needed!
Post by: Steven on April 02, 2012, 12:20:53 PM
i'm still looking at the theater mode plugin so probably wont be able to start looking at this until next weekend.
But i can advise you a couple of things now
- i will only make access available to musicbee data via the existing API. As a principle i dont want to build dependencies on plugins that have any sort direct access - this is so i can make internal changes if i need to without worrying about any plugins
- for the same reason you will need to have your own data store that is completely independent to musicbee's data storage. If you choose to use SQL Lite that is fine
- their is a way to get the selected file - its a bit crappy, but on Library_QueryFiles(string query), the query string supports the following:
"domain=SelectedFiles"
"domain=DisplayedFiles"
- you can add toolbar menu items using MB_AddMenuItem(...) where the path parameter can be:
mnuView/xxxx
mnuTools/xxxx
mnuTools/mnuTagTools/xxxx
mnuTools/mnuTagTools/mnuAdvanced/xxxx
- for context menus, i will need to add an api call for that


Title: Re: New plugin: Ghost files! Can API provide? Suggestions needed!
Post by: e-motiv on April 04, 2012, 11:30:42 AM
.

Now, let me give you a better request overview for when you find some more time.

Summary list:                                     (in order of priority)


Thanks again, Steven.  I'll hold my horses for now!  ;)
Title: Re: New plugin: Ghost files! Can API provide? Suggestions needed!
Post by: Steven on April 04, 2012, 12:14:42 PM
actually it occured to me yesterday that you can probably acheive what you want using an existing but not documented API i created for the SubSonic plugin.
So the idea would be that you would advertise your plugin to MusicBee as a storage server. MusicBee would add a node to the Computer section, and clicking on it will show files

in the plugin initialisation
        about.Type = PluginType.PluginStorage
        about.ReceiveNotifications = ReceiveNotificationFlags.StartupOnly
        about.TargetApplication = "GhostFiles"   ' this is used as an Id in musicbee for a folder or file path eg. GhostFiles\\xxxxx\x.mp3

    Public Sub ReceiveNotification(ByVal sourceFileUrl As String, ByVal type As NotificationType)
        If type = NotificationType.PluginStartup Then
            ' do your initialisation
            mbApiInterface.MB_SendNotification(CallBackType.StorageReady)  ' or CallBackType.StorageFailed
        End If
    End Sub

by doing that MusicBee will look for the following methods that you would expose (this is in VB but can be C#):
    Public Function IsReady() As Boolean
        ' is the database available for file retrieval
    End Function

    Public Function GetIcon() As Bitmap
        ' return an 16x16 icon for the main navigation node
    End Function

    Public Sub Refresh()
        ' refresh any cached files - called when the user presses F5 or does some operation that requires a refresh of data. In your case this probably wouldnt need to do anything
    End Sub

    Public Function GetFolders(ByVal path As String) As String()
        ' i guess in your case you wouldnt have folders so you would just return one dummy master folder
        ' if there is a structure, depending on whether the user has clicked the main navigation node or a specific folder, MusicBee will call GetFiles(path) with the appropriate path
    End Function

    Public Function FolderExists(ByVal path As String) As Boolean
    End Function

    Public Function GetFiles(ByVal path As String) As KeyValuePair(Of Byte, String)()()
        ' return an array for file tag data
        ' each row on the array represents a file
        ' and a file consists of an array of tags (FilePropertyType and MetaDataType) and values
    End Function

    Public Function FileExists(ByVal url As String) As Boolean
    End Function

    Public Function GetFile(ByVal url As String) As KeyValuePair(Of Byte, String)()
    End Function

    Public Function GetFileArtwork(ByVal url As String) As Byte()
        ' return base64 representation of bitmap data
    End Function

    Public Function GetPlaylists() As KeyValuePair(Of String, String)()
    End Function

    Public Function GetPlaylistFiles(ByVal id As String) As KeyValuePair(Of Byte, String)()()
    End Function

    Public Function GetStream(ByVal url As String) As IO.Stream
    End Function

    Public Function GetError() As Exception
    End Function
Title: Re: New plugin: Ghost files! Can API provide? Suggestions needed!
Post by: e-motiv on April 05, 2012, 12:24:26 PM
Another woraround! Grea! Keeps me going!  :D
And now I know what all those functions were for in the "TestCSharpDll.cs"!  :D

Unfortunatly, I am stuck.  I managed to get the computer menu show my ghost tracks, but it stops there. As if MB is never asking for folders nor files. I tried Message.Show boxes on all these get functions, but none EVER show up. Maybe the only way to make MB do it anymore, is via notification?

Here is my relevant code:
Code
        public void ReceiveNotification(string sourceFileUrl, NotificationType type)	// receive event notifications from MusicBee
       { //MessageBox.Show(about.Name+" notification:"+type);//debug
         switch (type)
         {    //perform startup initialisation
            case NotificationType.PluginStartup:
          mbAPI.MB_SendNotification(CallbackType.StorageReady); //Must be done here
        //MessageBox.Show("storage ready");
            break;
         }
      }

        public string[] GetFolders(string path) // return the full path of folders in a folder
        { //MessageBox.Show("GetFolders:"+path);
            return new string[]{"test","Test2"};
        }

        public Bitmap GetIcon() // return a 16x16 bitmap for the storage icon
        { //MessageBox.Show("GetIcon:"+Application.StartupPath+sep+"Plugins"+sep+about.Name+sep+about.Name+".png");
            return new Bitmap(Application.StartupPath+sep+"Plugins"+sep+about.Name+sep+about.Name+".png");//
        }

        public byte[] GetFileArtwork(string url ) // return an array of bytes for the raw picture data
        {
            return null;
        }

        public bool FileExists(string url)
        {
            return true;
        }

        //  each file is represented as a array of tags - each tag being a KeyValuePair(Of Byte, String), where Byte is a FilePropertyType or MetaDataType enum value and String is the value
        // a tag for FilePropertyType.Url must be included
        public KeyValuePair<byte, string>[] GetFile(string url)
        { //MessageBox.Show("GetFile:"+url);
            return null;
        }
       

        // return an array of playlist identifiers
        // where each playlist identifier is a KeyValuePair(id, name)
        public KeyValuePair<string, string>[] GetPlaylists()
        { //MessageBox.Show("GetPlaylists");
            return null;
        }

        // return an array of files in a playlist - a playlist being identified by the id parameter returned by GetPlaylists()
        // each file is represented as a array of tags - each tag being a KeyValuePair(Of Byte, String), where Byte is a FilePropertyType or MetaDataType enum value and String is the value
        // a tag for FilePropertyType.Url must be included
        public KeyValuePair<byte, string>[][] GetPlaylistFiles(string id)
        { //MessageBox.Show("GetPlaylistFiles");
            return null;
        }

        // return a stream that can read through the raw (undecoded) bytes of a music file
        public System.IO.Stream GetStream(string url)
        {
            return null;
        }

        public bool FolderExists(string path)
        { //MessageBox.Show("FolderExists");
            return true;
        }


        public  Exception GetError()        // return the last error that occurred
        { //MessageBox.Show("GetError");
            return null;
        }


        // you can initially return false and then use MB_SendNotification when the storage is ready (or failed)
        public bool IsReady()        // is the server ready
        {
            return false;
        }
        // user initiated refresh (eg. pressing F5) - reconnect/ clear cache as appropriate
        public void Refresh()
        { //MessageBox.Show("Refresh");
        }

        #endregion
Title: Re: New plugin: Ghost files! Can API provide? Suggestions needed!
Post by: Steven on April 05, 2012, 12:34:19 PM
try returning true for IsReady()
in a fully implemented solution, it should be returning false until your initialisation has completed sucessfully and then true
Title: Re: New plugin: Ghost files! Can API provide? Suggestions needed!
Post by: e-motiv on April 05, 2012, 12:39:32 PM
NEVER MIND! Got it! IsReady never returns true!
For the record:
Code
..in Initialise...
storageReady=true;
....
            case NotificationType.PluginStartup:
          mbAPI.MB_SendNotification(storageReady?CallbackType.StorageReady:CallbackType.StorageFailed); //Must be done here        //MessageBox.Show("storage ready");
....
        public bool IsReady()        // is the server ready
        { MessageBox.Show("IsReady");
            return storageReady?true:false;
        }
I don't know which notification can substitute that, so I used a variable
Title: Re: New plugin: Ghost files! Can API provide? Suggestions needed!
Post by: e-motiv on April 05, 2012, 12:40:24 PM
try returning true for IsReady()
LoL!  Just realized!  Sorry to have bothered you!  :)
Title: Re: New plugin: Ghost files! Can API provide? Suggestions needed!
Post by: beehive on April 05, 2012, 09:33:56 PM
Sounds like a useful plugin!
Title: Re: New plugin: Ghost files! Can API provide? Suggestions needed!
Post by: e-motiv on June 30, 2013, 01:13:45 AM
Here is an alpha release (https://dl.dropboxusercontent.com/u/10044846/MB_Ghost%20Tracks%200.0.189.zip) for whomever.
I still want to finish integrating it in MB Music search, Delete action and hopefull out of Computer Node before beta.
Title: Re: New plugin: Ghost files! Can API provide? Suggestions needed!
Post by: e-motiv on June 30, 2013, 02:59:06 PM
@Steven,
I'd like to start with the delete action and I presume I need your help. Can you make the following possible (via the API)?

Title: Re: New plugin: Ghost files! Can API provide? Suggestions needed!
Post by: boroda on June 30, 2013, 05:01:32 PM
  • Allow for an extra parameter/option in the delete confirmation dialog? In my plugin this would be  "[checkbox] keep a ghost file"one level deeper under the existing bullet (remove from computer).
Probably you could display your own confirmation dialog after user confirmed deletion from computer?
Title: Re: New plugin: Ghost files! Can API provide? Suggestions needed!
Post by: e-motiv on July 03, 2013, 01:57:11 PM
    • Allow for an extra parameter/option in the delete confirmation dialog? In my plugin this would be  "[checkbox] keep a ghost file"one level deeper under the existing bullet (remove from computer).
    Probably you could display your own confirmation dialog after user confirmed deletion from computer?
    That's true. Didn't really think about that (together with a possible plugin "always ghost file" option in "Options").  Though it's not that user-friendly.  But if too much trouble, that will work, yes.
    Still leaves the delete notification of course.
    Title: Re: New plugin: Ghost files! Can API provide? Suggestions needed!
    Post by: Steven on July 07, 2013, 09:32:56 PM
    for the next v2.2 update i have added these notifications:
            FileDeleting = 25
            FileDeleted = 26

    FileDeleting (and RatingChanging, TagsChanging) will be synchronous meaning you can be sure you receive the notification before the file is deleted (rating/ tags changed) but it needs to be used carefully in that any slowness in your plugin will be blocking musicbee itself. The other notifications are asynchronous.
    I will make a link available in the next day or two
    Title: Re: New plugin: Ghost files! Can API provide? Suggestions needed!
    Post by: e-motiv on July 10, 2013, 09:18:47 AM
    Double thanks, Steven!
    (Double since I guess the ratingchanging being synchronous will also solve my "speak back" plugin problem.)

    (I am a bit busy right now, but I'm sure to implement it soon.)
    Title: Re: New plugin: Ghost files! Can API provide? Suggestions needed!
    Post by: e-motiv on July 18, 2013, 10:59:37 AM
    Hello Steven,

    I am ready to test. Any idea when you'll put the 2.2 update?  (No pressure, just to plan my things.)
    Title: Re: New plugin: Ghost files! Can API provide? Suggestions needed!
    Post by: Steven on July 19, 2013, 08:33:52 AM
    its already available on:
    http://musicbee.niblseed.com/V2_2/MusicBee_Exe_Patched.zip
    Title: Re: New plugin: Ghost files! Can API provide? Suggestions needed!
    Post by: e-motiv on August 29, 2013, 07:29:42 PM
    Thanks for the RatingChanging, TagsChanging, Steven!  I could finally update my speakback plugin.  Great!

    This specific plugin( Ghost files) will still need the deleting notifications, but I suddenly had to stop developing back then, so it will just have to wait a bit, but I will use it!
    Title: Re: New plugin: Ghost files! Can API provide? Suggestions needed!
    Post by: Frunk on May 24, 2020, 07:44:07 AM
    I realise this is very dead, but I thought I should point out the download button links to spam-loops. A shame. This seems like it would be good for me.
    Title: Re: New plugin: Ghost files! Can API provide? Suggestions needed!
    Post by: Kane on November 27, 2024, 03:36:18 PM
    link is dead. I want a new one.
    Title: Re: New plugin: Ghost files! Can API provide? Suggestions needed!
    Post by: MotleyG on November 27, 2024, 05:33:50 PM
    link is dead. I want a new one.
    This thread is more than 12 years old. What link do you want revived and why?
    Title: Re: New plugin: Ghost files! Can API provide? Suggestions needed!
    Post by: phred on November 27, 2024, 06:12:00 PM
    In addition, the developer of this plugin (and this thread) hasn't been on the forum for more than four years.
    Title: Re: New plugin: Ghost files! Can API provide? Suggestions needed!
    Post by: BoringName on November 27, 2024, 11:44:19 PM
    Considering the past tense usage in this post.
    https://getmusicbee.com/forum/index.php?topic=33013.0

    I'd say the author abandoned it long before they stopped frequenting the forum. it probably stopped working with newer versions of MB and they didn't want to update it.

    Title: Re: New plugin: Ghost files! Can API provide? Suggestions needed!
    Post by: Kane on November 28, 2024, 02:53:40 AM
    link is dead. I want a new one.
    This thread is more than 12 years old. What link do you want revived and why?

    i want the plugin. I recently deleted some files and it resetted play count of that artist. that's why
    Title: Re: New plugin: Ghost files! Can API provide? Suggestions needed!
    Post by: phred on November 28, 2024, 03:44:46 AM
    i want the plugin.
    Not very likely that you'll get it and even if you do it probably won't work on the current version of MB.
    Development stopped quite some time ago, and I said earlier, the developer hasn't been on the forum in more than four years.
    Title: Re: New plugin: Ghost files! Can API provide? Suggestions needed!
    Post by: Kane on November 28, 2024, 04:27:28 AM
    saaad🥲
    Title: Re: New plugin: Ghost files! Can API provide? Suggestions needed!
    Post by: BoringName on November 28, 2024, 10:30:15 AM
    i want the plugin. I recently deleted some files and it resetted play count of that artist. that's why

    I considered taking this on but honestly can't see the demand for it. If you had a backup of your Musicbee database (like you should) you could have retrieved those play counts.

    So it's only benefit comes down to letting a user know if they have previously deleted music. Without it you might accidentally listen to something you don't like again... I don't think that's a bad thing, you never know when your tastes will change.

    Title: Re: New plugin: Ghost files! Can API provide? Suggestions needed!
    Post by: e-motiv on December 02, 2024, 10:22:10 AM
    I have indeed abandoned the project. For my own use and needs, I now add tracks to a "Ghost" playlist before deleting them. It's not perfect and I miss some benefits, but my life is too difficult now with too many free coding projects and the ones from Musicbee always needed to many frequent updates because of incompatible changes (No blame, it is how it is and i am very grateful).

    Find the source code here for however wants to take it over. (https://www.dropbox.com/scl/fi/mcfjzk13v5jx0oogvzn63/Ghost-Tracks.7z?rlkey=y5aue7zze3f0xwxp1ybwq31ra&st=kn02mfrz&dl=0)
    Title: Re: New plugin: Ghost files! Can API provide? Suggestions needed!
    Post by: BoringName on December 04, 2024, 08:00:40 AM
    I've got the basic functionality of this working but it needs A LOT of work. I don't think that source code is from the included DLL as it's missing variable declarations and a few other things that would prevent it compiling regardless of what program it was created in.

    The only real benefit I can think of is it could act as a recycle bin. Restoring any info to a previously deleted track not kept in the actual file. Eg) play counts without needing to copy them over manually from a backup.

    I don't really know if it's worth keeping a database of every deleted song just in case that event happens?

    I was mainly interested as I feel like there is probably some other application for this thing but I can't put my finger on it. Aside from the initial concept of keeping track of songs you don't like.

    So if anyone can give me a compelling reason this should exist, I'll have a crack at updating it a bit otherwise I will just release it with the changes I've made to get the basics working.

    As is, you need to use a hot key to send any selected files to the ghost tracks database and there is no way to remove them once they are in there. It doesn't track notifications and automatically kick in when you delete something.

    Title: Re: New plugin: Ghost files! Can API provide? Suggestions needed!
    Post by: Mayibongwe on December 04, 2024, 06:20:03 PM
    i want the plugin. I recently deleted some files and it resetted play count of that artist. that's why
    The only real benefit I can think of is it could act as a recycle bin.
    Restoring any info to a previously deleted track not kept in the actual file. Eg) play counts without needing to copy them over manually from a backup.
    Specifically for this use-case, I was (and still am) under the impression that MusicBee doesn't remove the stats of deleted tracks until you compress the library.
    So unless I've misunderstood, one can always add the deleted track back again to regain the play counts if they so wish to?

    When a track's removed from the library, the track info's still retained in the MusicBee database.
    See here - sveakul brought it up a while back: https://getmusicbee.com/forum/index.php?topic=39332.0
    Title: Re: New plugin: Ghost files! Can API provide? Suggestions needed!
    Post by: BoringName on December 04, 2024, 08:50:26 PM
    When a track's removed from the library, the track info's still retained in the MusicBee database.
    See here - sveakul brought it up a while back: https://getmusicbee.com/forum/index.php?topic=39332.0

    Right, so it would only be useful if the user selected "Delete from library and computer".

    Can anyone think of a another use for having a separate database of track info without any actual track files attached to that data?
    Title: Re: New plugin: Ghost files! Can API provide? Suggestions needed!
    Post by: BoringName on December 05, 2024, 03:56:24 AM
    GhostTracks.zip (https://www.mediafire.com/file/mpyu1bfcfie6xun/Ghost+Tracks.zip/file)

    Here it is if anyone wants to play around. Modified source file included. I've only modified it enough to get it working. There's still a few unused variables and things that need cleaning up.

    You need to copy all the DLL's into the plugins folder. For whatever reason getting Sqlite DLL's to compile into a single package is a PITA so I didn't bother.

    To use it you have to go into Edit Preferences-> Hotkeys and assign a key to Delete (keep Ghost File). I used shift+delete.

    Then just highlight tracks in the main window and use the hotkey, there will be no indication to tell you it copied over. You just have to click on the ghost tracks link in the navigator window and see if the added tracks are there.

    Changes
    - Updated to use Microsoft.Data.Sqlite (if you want to play with the source code you will need to add this package).
    - Instead of using a pre-made database, it will now create a new database dynamically based on the existing FilePropertyTypes and MetaDataTypes in Musicbee. Note this only occurs when no database is present, if new file properties or metadata types are added to Musicbee, they will not be added to the database. It will need to be deleted and let the plugin create a new database to add those columns.
    - The database file is located at AppData\Plugins\Ghost Tracks\Ghost Tracks.db

    Issues
    - For whatever reason the ghost drives folder will not appear in the Folder Browser element until you hit F5 to refresh it. I tried using MB_RefreshPanels() but no luck, I didn't try that hard to solve the issue. It appears just fine in the Navigator element.
    - While you can browse through the songs and filter them with the search command etc... just like the rest of the library, because they are not linked to an actual file some things will produce an error eg) The artwork tab and Tag Inspector. Even though you can't look at things like virtual tags they are stored in the ghost tracks database.
    - There isn't a current method to remove a track from the ghost tracks database. Once it's in there it staying there unless you delete the database.
    - The plugin keeps 20 backups of the database, I meant to reduce this before I compiled but forgot.

    That's all I'm going to do with this unless someone gives me a reason like I mentioned earlier.