[vlc-commits] addons: vorepository: add support for manually downloaded archives
Francois Cartegnie
git at videolan.org
Mon Feb 10 15:19:17 CET 2014
vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Mon Feb 10 15:11:11 2014 +0100| [58ea4aceecce4b8b5d56464efa70f03333b95425] | committer: Francois Cartegnie
addons: vorepository: add support for manually downloaded archives
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=58ea4aceecce4b8b5d56464efa70f03333b95425
---
modules/misc/addons/vorepository.c | 65 ++++++++++++++++++++++++++++++++++--
1 file changed, 63 insertions(+), 2 deletions(-)
diff --git a/modules/misc/addons/vorepository.c b/modules/misc/addons/vorepository.c
index e008691..8a49bd8 100644
--- a/modules/misc/addons/vorepository.c
+++ b/modules/misc/addons/vorepository.c
@@ -44,6 +44,8 @@ static int Open ( vlc_object_t * );
static void Close ( vlc_object_t * );
static int Find ( addons_finder_t *p_finder );
static int Retrieve ( addons_finder_t *p_finder, addon_entry_t *p_entry );
+static int OpenDesignated ( vlc_object_t * );
+static int FindDesignated ( addons_finder_t *p_finder );
#define ADDONS_MODULE_SHORTCUT "addons.vo"
#define ADDONS_REPO_SCHEMEHOST "http://api.addons.videolan.org"
@@ -59,6 +61,14 @@ vlc_module_begin ()
set_description(N_("addons.videolan.org addons finder"))
set_capability("addons finder", 100)
set_callbacks(Open, Close)
+add_submodule ()
+ set_category(CAT_ADVANCED)
+ set_subcategory(SUBCAT_ADVANCED_MISC)
+ set_shortname(N_("Videolan.org's single archive addons finder"))
+ add_shortcut(ADDONS_MODULE_SHORTCUT".vlp")
+ set_description(N_("single .vlp archive addons finder"))
+ set_capability("addons finder", 101)
+ set_callbacks(OpenDesignated, NULL)
vlc_module_end ()
struct addons_finder_sys_t
@@ -326,8 +336,12 @@ static int Find( addons_finder_t *p_finder )
static int Retrieve( addons_finder_t *p_finder, addon_entry_t *p_entry )
{
+ if ( !p_entry->psz_archive_uri )
+ return VLC_EGENERIC;
+
/* get archive and parse manifest */
stream_t *p_stream;
+
if ( p_entry->psz_archive_uri[0] == '/' )
{
/* Relative path */
@@ -348,7 +362,7 @@ static int Retrieve( addons_finder_t *p_finder, addon_entry_t *p_entry )
/* In case of pf_ reuse */
if ( p_finder->p_sys->psz_tempfile )
{
- unlink( p_finder->p_sys->psz_tempfile );
+ vlc_unlink( p_finder->p_sys->psz_tempfile );
FREENULL( p_finder->p_sys->psz_tempfile );
}
@@ -403,6 +417,38 @@ static int Retrieve( addons_finder_t *p_finder, addon_entry_t *p_entry )
return i_ret;
}
+static int FindDesignated( addons_finder_t *p_finder )
+{
+ char *psz_manifest;
+ const char *psz_path = p_finder->psz_uri + 7; // remove scheme
+
+ if ( asprintf( &psz_manifest, "unzip://%s!/manifest.xml",
+ psz_path ) < 1 )
+ return VLC_ENOMEM;
+
+ stream_t *p_stream = stream_UrlNew( p_finder, psz_manifest );
+ free( psz_manifest );
+ if ( !p_stream ) return VLC_EGENERIC;
+
+ if ( ParseCategoriesInfo( p_finder, p_stream ) )
+ {
+ /* Do archive uri fixup */
+ FOREACH_ARRAY( addon_entry_t *p_entry, p_finder->entries )
+ if ( likely( !p_entry->psz_archive_uri ) )
+ p_entry->psz_archive_uri = strdup( p_finder->psz_uri );
+ FOREACH_END()
+ }
+ else
+ {
+ stream_Delete( p_stream );
+ return VLC_EGENERIC;
+ }
+
+ stream_Delete( p_stream );
+
+ return VLC_SUCCESS;
+}
+
static int Open(vlc_object_t *p_this)
{
addons_finder_t *p_finder = (addons_finder_t*) p_this;
@@ -411,7 +457,7 @@ static int Open(vlc_object_t *p_this)
if ( !p_finder->p_sys )
return VLC_ENOMEM;
p_finder->p_sys->psz_tempfile = NULL;
- /* We only support listing the whole repo for now */
+ /* We only support listing the whole repo */
if ( p_finder->psz_uri )
return VLC_EGENERIC;
@@ -430,3 +476,18 @@ static void Close(vlc_object_t *p_this)
free( p_finder->p_sys );
}
}
+
+static int OpenDesignated(vlc_object_t *p_this)
+{
+ addons_finder_t *p_finder = (addons_finder_t*) p_this;
+ if ( !p_finder->psz_uri
+ || strncmp( "file://", p_finder->psz_uri, 7 )
+ || strncmp( ".vlp", p_finder->psz_uri + strlen( p_finder->psz_uri ) - 4, 4 )
+ )
+ return VLC_EGENERIC;
+
+ p_finder->pf_find = FindDesignated;
+ p_finder->pf_retrieve = Retrieve;
+
+ return VLC_SUCCESS;
+}
More information about the vlc-commits
mailing list