INTERACT FORUM
Windows => Plug-in Development => Topic started by: MrHaugen on January 23, 2007, 12:45:02 pm
-
I'm trying to develop a plugin for tag management.
I've used Mr Chriz' template plugin for VB.net, and looks like it works well. Even with MC 12.
At this point I can do all sorts of things except for interacting with the library or playlists.
What I want to do is to make my plugin retrieve all tracks from playing now, to a listbox or similar.
I have searched the developer pages, but have a problem finding the right piece of code.
Would really appreciate it if someone could point me in the right direction or show me an example or two.
-
I have some C# code that does this, so I've converted it into VB,
although I've not got time to test it, so this is from memory effectively.
You may have to play around a bit but you should get the picture
I'm used to VB6 rather than .NET so a few things may have changed for example.
--------------------------------------------------------
'Get the current playing now playlist
Dim playlist as MediaJukebox.IMJCurPlaylistAutomation playlist;
Set playlist = mediaCenterInterface.GetCurPlaylist ( )
'Iterate through all the files in the playlist
for (counter = 0 to playlist.GetNumberFiles() )
'Get the file from the current position in the playlist
dim track as MediaJukebox.MJFileAutomation
set track = playlist.GetFile(counter)
'Get the tracks filename
dim trackFileName as string = track.Filename
'Print the trackname
call debug.print (trackFileName)
next
----------------------------------------------------------
If only I had my .NET Script Plugin working I'd be able to test it...
Must get back to that sometime =)
-
I tried to modify your example to Visual Studio 2005, but didn't get far.
The problem now is that mediaCenterInterface is not declared. What should it be declared as?
Sorry. Only used to string, integer, char etc. Have to admit this is a bit beyond my capabilities...
If only I had my .NET Script Plugin working I'd be able to test it...
I've tried to integrate your suggestion in the template. Only have to build the project in Visual Studio 2005 and run MC.
You can download it here if you have the time to take a quick look at it: kirkegata.com\div\mc_vbnetplugintemplate.rar (http://kirkegata.com\div\mc_vbnetplugintemplate.rar)
Or just tell me what the hell i'm doing from the example under. Trying to get the playlist in some kind of box.
I might have just screwed it up more...
-------------------------------------------------------------------------------------------------------
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'Get the current playing now playlist
Dim playlist As MediaJukebox.MJCurPlaylistAutomationClass
playlist = mediaCenterInterface.GetCurPlaylist()
'Iterate through all the files in the playlist
For counter = 0 To playlist.GetNumberFiles()
'Get the file from the current position in the playlist
Dim track As MediaJukebox.MJFileAutomation
track = playlist.GetFile(counter)
'Get the tracks filename
Dim trackFileName As String = track.Filename
'Print the trackname
Call Debug.Print(trackFileName)
Next
End Sub
-
Sorry in the VB plugin I appear to have refered to it as mediaCenterRef
Try changing mediaCenterInterface to me.mediaCenterRef
Hang in there, all will become clear soon I think!
-
I hope it will too. Thanks for being so patient ChriZ
It got me a little further though.. Still got a couple of errors. 3 years without programming does something with your memory. Even the little things I knew. I ended up with this:
-----------------------------------------------------------------------------------
Dim playlist As String (Something I tested. Obviously wrong)
Dim counter As Integer (Something I tested. Might be wrong)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim playlist As MediaJukebox.IMJCurPlaylistAutomation playlist (end of statement expected)
playlist = Me.mediaCenterRef.GetCurPlaylist()
For counter = 0 To playlist.GetNumberFiles() (GetNumberFiles not member of 'String')
Dim track As MediaJukebox.MJFileAutomation
track = playlist.GetFile(counter) (GetFile not member of 'String')
Dim trackFileName As String = track.Filename
Call Debug.Print(trackFileName)
Next
-
OK I just done a quick compile of this, and it compiled ok:
-----------------------------------------------------
'Get the current playing now playlist
Dim counter As Integer 'You're correct I forgot to define this one
Dim playlist As MediaJukebox.MJCurPlaylistAutomationClass 'Should be OK
playlist = mediaCenterRef.GetCurPlaylist()
Dim listOfTrackNames As String = ""
'Iterate through all the files in the playlist
For counter = 0 To ( playlist.GetNumberFiles() - 1 ) 'Out by 1 problem was here
'Get the file from the current position in the playlist
Dim track As MediaJukebox.MJFileAutomation
track = playlist.GetFile(counter)
'Get the tracks filename
Dim trackFileName As String = track.Filename
'Create a list of track names
listOfTrackNames = listOfTrackNames + vbCrLf + trackFileName
Next
MessageBox.Show(listOfTrackNames)
-----------------------------------------------
I Changed this one to use a messagebox instead of Debug.Print since
I'm not sure Debug.Print will actually show you anything given that
there's no output window.
You'll have to excuse me, I'm really short on time at the moment, alot of work
on else I'd come up with something more helpful,
hopefully that will allow you see that you've got a list of tracks however (Presuming theres some tracks in there)
If you get any more errors let me know.
If it compiles ok and you're getting problems with run time errors, let me know
and I'll point out how you can debug the plugin while it's running in MC.
-
I know, time is precious.... Go with your own pace. I'm not in a hurry.
The compiling was ok now. Started the plugin and ended up with a Object reference error though :o
I'm afraid it don't tell me much. Pasting the result here:
************** Exception Text **************
System.NullReferenceException: Object reference not set to an instance of an object.
at MC_VBNETPlugin_Template.MainInterface.MainInterface_Load(Object sender, EventArgs e) in D:\mc_vbnetplugintemplate\VB_NetPluginSoloution\VB_NetPluginProject\MainInterface.vb:line 54
at System.Windows.Forms.UserControl.OnLoad(EventArgs e)
at System.Windows.Forms.UserControl.OnCreateControl()
at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
at System.Windows.Forms.Control.CreateControl()
at System.Windows.Forms.Control.WmShowWindow(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
at System.Windows.Forms.ContainerControl.WndProc(Message& m)
at System.Windows.Forms.UserControl.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ActiveXImpl.System.Windows.Forms.IWindowTarget.OnM essage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
************** Loaded Assemblies **************
mscorlib
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll
----------------------------------------
MC_VBNETPlugin_Template
Assembly Version: 1.0.0.0
Win32 Version: 1.0.0.0
CodeBase: file:///D:/mc_vbnetplugintemplate/VB_NetPluginSoloution/VB_NetPluginProject/bin/Release/MC_VBNETPlugin_Template.dll
----------------------------------------
System.Windows.Forms
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Windows.Forms/2.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Drawing
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Drawing/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
Accessibility
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/Accessibility/2.0.0.0__b03f5f7f11d50a3a/Accessibility.dll
----------------------------------------
MediaJukebox
Assembly Version: 1.0.0.0
Win32 Version: 1.0.0.0
CodeBase: file:///D:/mc_vbnetplugintemplate/VB_NetPluginSoloution/VB_NetPluginProject/bin/Release/MediaJukebox.DLL
----------------------------------------
-
If you go to Tools->Options->Text Editor->Basic
within Visual Studio you should see an option to turn on Line Numbering.
Do this, and then see if you can find line 54.
You've got something trying to happen in the panels load event.
-
Yea. I know. Just forgot to tell wich line it was. Here it is. Marked in read.
Something needs to be done with the mediaCenterRef or what? Not sure what object the error refers to.
----------------------------------------------------------------------------------------------------------------
Private Sub MainInterface_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Get the current playing now playlist
Dim counter As Integer 'You're correct I forgot to define this one
Dim playlist As MediaJukebox.MJCurPlaylistAutomationClass 'Should be OK
playlist = mediaCenterRef.GetCurPlaylist()
Dim listOfTrackNames As String = ""
'Iterate through all the files in the playlist
For counter = 0 To (playlist.GetNumberFiles() - 1) 'Out by 1 problem was here
'Get the file from the current position in the playlist
Dim track As MediaJukebox.MJFileAutomation
track = playlist.GetFile(counter)
'Get the tracks filename
Dim trackFileName As String = track.Filename
'Create a list of track names
listOfTrackNames = listOfTrackNames + vbCrLf + trackFileName
Next
MessageBox.Show(listOfTrackNames)
End Sub
-
Does the same error occur if that code is put back behind a button press?
I suspect the forms load event is occuring before the initialization from MC.
So the refrence to the Media Center object isn't ready to be used yet.
Make sure that the init method still looks something like this->
___________________________________________________
' <summary>
' After the plugin has been created Media Center
' will call the following method, giving us a reference
' to the Media Center interface.
' </summary>
' <param name="mediaCenterReference">
' Media Center Reference
' </param>
Public Sub init(ByVal mediaCenterRef As MediaJukebox.MJAutomation)
Try
Me.mediaCenterRef = mediaCenterRef
Catch ex As Exception
MessageBox.Show("Failed loading plugin (Name of Plugin Here)/n Exception Thrown: /n" + ex.ToString())
'On reflection message in template isn't complete here, so here's a better version but it won't make any difference as long as the plugin is working
End Try
End Sub
___________________________________________________
-
The loading of the plugin is not the problem.
Still get an error, but a different one, if I use a button to initialize the code.
Here's the message:
************** Exception Text **************
System.InvalidCastException: Unable to cast COM object of type 'System.__ComObject' to class type 'MediaJukebox.MJCurPlaylistAutomationClass'. COM components that enter the CLR and do not support IProvideClassInfo or that do not have any interop assembly registered will be wrapped in the __ComObject type. Instances of this type cannot be cast to any other class; however they can be cast to interfaces as long as the underlying COM component supports QueryInterface calls for the IID of the interface.
at MC_VBNETPlugin_Template.MainInterface.Button1_Click(Object sender, EventArgs e) in D:\mc_vbnetplugintemplate\VB_NetPluginSoloution\VB_NetPluginProject\MainInterface.vb:line 54
The rest remains the same. It points to the exact same line
-
Sorry not sure where I copied that original code from but it was wrong
try changing line 53 to
Dim playlist As MediaJukebox.IMJCurPlaylistAutomation
I promise you it will get simpler than this in the end, I seem to be having a few brain dead moments. ::)
-
Another thing that may help coding is AxTools for VB Net
-
Another thing that may help coding is AxTools for VB Net
Hmm that does look quite interesting. Especially the code flow explorer.
-
I have Used It For About 3 Years..
It will also check for dead code, Dead Vars and will analyze your code to ensure it runs fast, it will make some changes for you, some changes you must make manually.
"$Mid" Runs Faster Than "Mid" etc....
-
It finally worked!
For the rest of you who might wonder what the actual code was at the end:
-----------------------------------------------------------------------------------------------------------
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'Get the current playing now playlist
Dim counter As Integer 'You're correct I forgot to define this one
'Dim playlist As MediaJukebox.MJCurPlaylistAutomationClass 'Should be OK
Dim playlist As MediaJukebox.IMJCurPlaylistAutomation
playlist = mediaCenterRef.GetCurPlaylist()
Dim listOfTrackNames As String = ""
'Iterate through all the files in the playlist
For counter = 0 To (playlist.GetNumberFiles() - 1) 'Out by 1 problem was here
'Get the file from the current position in the playlist
Dim track As MediaJukebox.MJFileAutomation
track = playlist.GetFile(counter)
'Get the tracks filename
Dim trackFileName As String = track.Filename
'Create a list of track names
listOfTrackNames = listOfTrackNames + vbCrLf + trackFileName
Next
MessageBox.Show(listOfTrackNames)
End Sub
--------------------------------------------------------------------
Combine it with ChriZ' .Net Plugin template and you have a small but functional plugin with playlist import.
I'll test the AxTools later King. Looks promising.
Thanks alot for your help ChriZ! Could not have done it without you!
-
Note: I Got A Discount On AxTools, Because I Asked For One.
They Had To Make A Special Link For Me To Buy...
I Told Them I Just Play With Code As A Hobby
I Still Paid A Chunk Of Change, But If You Don't Ask You Will Never Know..