Page 1 of 1

mozilla plugin "load playlist"

Posted: 19 Jan 2007 13:22
by makko
Hi all,

In case of interrest for someone, I've made a very little improvement to the mozilla plugin by adding ability to load playlist throught javascript.
Tell me if you are interrested by source code.

Posted: 22 Jan 2007 08:35
by Allclone
I would be Interested as it would be an interesting thing to use as a pre-loaded content setup.

Posted: 22 Jan 2007 12:41
by Spellcoder
Where does it save the playlist?
On a server, in a cookie or client-side session?

Code

Posted: 23 Jan 2007 09:16
by makko
Here come the code addons to the 0.8a svn version.

/include/libvlc.h (to be added)

Code: Select all

/**BM * Load a playlist file. * \param p_instance the instance * \param psz_filename the file to be loaded * \param p_exception an initialized exception * \return */ int libvlc_playlist_load( libvlc_instance_t *, const char *, libvlc_exception_t * ); /** @}*/


/src/control/playlist.c (to be added)

Code: Select all

/**BM * Load a playlist file. * \param p_instance the instance * \param psz_filename the file to be loaded * \param p_exception an initialized exception * \return */ int libvlc_playlist_load( libvlc_instance_t *p_instance, const char *psz_filename, libvlc_exception_t *p_e ) { assert( p_instance->p_playlist ); return playlist_Import( p_instance->p_playlist, psz_filename ); }
/mozilla/control/npolibvlc.cpp (sections to be replaced)

Code: Select all

const NPUTF8 * const LibvlcPlaylistNPObject::methodNames[] = { "add", "play", "playItem", "togglePause", "stop", "next", "prev", "clear", /* deprecated */ "removeItem", /* deprecated */ "load",/*BM : ajout chargement playlist*/ };

Code: Select all

enum LibvlcPlaylistNPObjectMethodIds { ID_playlist_add, ID_playlist_play, ID_playlist_playItem, ID_playlist_togglepause, ID_playlist_stop, ID_playlist_next, ID_playlist_prev, ID_playlist_clear, ID_playlist_removeitem, ID_playlist_load,/*BM : ajout chargement playlist*/ };

Code: Select all

RuntimeNPObject::InvokeResult LibvlcPlaylistNPObject::invoke(int index, const NPVariant *args, uint32_t argCount, NPVariant &result) { VlcPlugin *p_plugin = reinterpret_cast<VlcPlugin *>(_instance->pdata); if( p_plugin ) { libvlc_exception_t ex; libvlc_exception_init(&ex); switch( index ) { case ID_playlist_add: { if( (argCount < 1) || (argCount > 3) ) return INVOKERESULT_NO_SUCH_METHOD; char *url = NULL; // grab URL if( NPVARIANT_IS_STRING(args[0]) ) { char *s = stringValue(NPVARIANT_TO_STRING(args[0])); if( s ) { url = p_plugin->getAbsoluteURL(s); if( url ) delete s; else // problem with combining url, use argument url = s; } else return INVOKERESULT_OUT_OF_MEMORY; } else return INVOKERESULT_NO_SUCH_METHOD; char *name = NULL; // grab name if available if( argCount > 1 ) { if( NPVARIANT_IS_NULL(args[1]) ) { // do nothing } else if( NPVARIANT_IS_STRING(args[1]) ) { name = stringValue(NPVARIANT_TO_STRING(args[0])); } else return INVOKERESULT_NO_SUCH_METHOD; } int i_options = 0; char** ppsz_options = NULL; // grab options if available if( argCount > 2 ) { if( NPVARIANT_IS_NULL(args[2]) ) { // do nothing } else if( NPVARIANT_IS_STRING(args[2]) ) { parseOptions(NPVARIANT_TO_STRING(args[2]), &i_options, &ppsz_options); } else if( NPVARIANT_IS_OBJECT(args[2]) ) { parseOptions(NPVARIANT_TO_OBJECT(args[2]), &i_options, &ppsz_options); } } int item = libvlc_playlist_add_extended(p_plugin->getVLC(), url, name, i_options, const_cast<const char **>(ppsz_options), &ex); delete url; delete name; for( int i=0; i< i_options; ++i ) { if( ppsz_options[i] ) free(ppsz_options[i]); } if( ppsz_options ) free(ppsz_options); if( libvlc_exception_raised(&ex) ) { NPN_SetException(this, libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return INVOKERESULT_GENERIC_ERROR; } else { INT32_TO_NPVARIANT(item, result); return INVOKERESULT_NO_ERROR; } } case ID_playlist_play: if( argCount == 0 ) { libvlc_playlist_play(p_plugin->getVLC(), -1, 0, NULL, &ex); if( libvlc_exception_raised(&ex) ) { NPN_SetException(this, libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return INVOKERESULT_GENERIC_ERROR; } else { VOID_TO_NPVARIANT(result); return INVOKERESULT_NO_ERROR; } } return INVOKERESULT_NO_SUCH_METHOD; case ID_playlist_playItem: if( (argCount == 1) && isNumberValue(args[0]) ) { libvlc_playlist_play(p_plugin->getVLC(), numberValue(args[0]), 0, NULL, &ex); if( libvlc_exception_raised(&ex) ) { NPN_SetException(this, libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return INVOKERESULT_GENERIC_ERROR; } else { VOID_TO_NPVARIANT(result); return INVOKERESULT_NO_ERROR; } } return INVOKERESULT_NO_SUCH_METHOD; case ID_playlist_togglepause: if( argCount == 0 ) { libvlc_playlist_pause(p_plugin->getVLC(), &ex); if( libvlc_exception_raised(&ex) ) { NPN_SetException(this, libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return INVOKERESULT_GENERIC_ERROR; } else { VOID_TO_NPVARIANT(result); return INVOKERESULT_NO_ERROR; } } return INVOKERESULT_NO_SUCH_METHOD; case ID_playlist_stop: if( argCount == 0 ) { libvlc_playlist_stop(p_plugin->getVLC(), &ex); if( libvlc_exception_raised(&ex) ) { NPN_SetException(this, libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return INVOKERESULT_GENERIC_ERROR; } else { VOID_TO_NPVARIANT(result); return INVOKERESULT_NO_ERROR; } } return INVOKERESULT_NO_SUCH_METHOD; case ID_playlist_next: if( argCount == 0 ) { libvlc_playlist_next(p_plugin->getVLC(), &ex); if( libvlc_exception_raised(&ex) ) { NPN_SetException(this, libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return INVOKERESULT_GENERIC_ERROR; } else { VOID_TO_NPVARIANT(result); return INVOKERESULT_NO_ERROR; } } return INVOKERESULT_NO_SUCH_METHOD; case ID_playlist_prev: if( argCount == 0 ) { libvlc_playlist_prev(p_plugin->getVLC(), &ex); if( libvlc_exception_raised(&ex) ) { NPN_SetException(this, libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return INVOKERESULT_GENERIC_ERROR; } else { VOID_TO_NPVARIANT(result); return INVOKERESULT_NO_ERROR; } } return INVOKERESULT_NO_SUCH_METHOD; case ID_playlist_clear: /* deprecated */ if( argCount == 0 ) { libvlc_playlist_clear(p_plugin->getVLC(), &ex); if( libvlc_exception_raised(&ex) ) { NPN_SetException(this, libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return INVOKERESULT_GENERIC_ERROR; } else { VOID_TO_NPVARIANT(result); return INVOKERESULT_NO_ERROR; } } return INVOKERESULT_NO_SUCH_METHOD; case ID_playlist_removeitem: /* deprecated */ if( (argCount == 1) && isNumberValue(args[0]) ) { libvlc_playlist_delete_item(p_plugin->getVLC(), numberValue(args[0]), &ex); if( libvlc_exception_raised(&ex) ) { NPN_SetException(this, libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return INVOKERESULT_GENERIC_ERROR; } else { VOID_TO_NPVARIANT(result); return INVOKERESULT_NO_ERROR; } } return INVOKERESULT_NO_SUCH_METHOD; case ID_playlist_load:/* BM Ajout méthode chargement playlist */ { if(argCount != 1) return INVOKERESULT_NO_SUCH_METHOD; char *filename = NULL; // grab file name if( NPVARIANT_IS_STRING(args[0]) ) { /* char *s = stringValue(NPVARIANT_TO_STRING(args[0])); if( s ) { filename = p_plugin->getAbsoluteURL(s); if( filename ) delete s; else // problem with combining url, use argument filename = s; } */ filename = stringValue(NPVARIANT_TO_STRING(args[0])); if(!filename) return INVOKERESULT_OUT_OF_MEMORY; } else return INVOKERESULT_NO_SUCH_METHOD; //Chargement playlist int res=libvlc_playlist_load(p_plugin->getVLC(),filename,&ex); delete filename; if( libvlc_exception_raised(&ex) ) { NPN_SetException(this, libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return INVOKERESULT_GENERIC_ERROR; } else { INT32_TO_NPVARIANT(res, result); return INVOKERESULT_NO_ERROR; } } default: ; } } return INVOKERESULT_GENERIC_ERROR; }
After compiling as usual, the playlist object handles a new "load" method.
Be careful as the first itemID to be played is 6. I don't know why. May be some VLC's guru could explain this.

Posted: 28 Jan 2007 19:51
by Quovodis
hmmm, i don't know how useful this addition is as you can already load a playlist using the add(MRL) methods