vlc | branch: master | Rémi Denis-Courmont <r...@remlab.net> | Wed Mar 7 18:30:13 2018 +0200| [9215854f0f49b072b313312d87d575997197dafb] | committer: Rémi Denis-Courmont
folder: clean up and simplify Fix variable shadowing, fix directory separator in URL (always /), deduplicate URI to path conversion and undo false loop vectorization. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=9215854f0f49b072b313312d87d575997197dafb --- modules/meta_engine/folder.c | 120 +++++++++++++++++-------------------------- 1 file changed, 46 insertions(+), 74 deletions(-) diff --git a/modules/meta_engine/folder.c b/modules/meta_engine/folder.c index aa25c8f945..a70c8b663c 100644 --- a/modules/meta_engine/folder.c +++ b/modules/meta_engine/folder.c @@ -55,8 +55,6 @@ static const char* cover_files[] = { "thumb.jpg", }; -static const int i_covers = (sizeof(cover_files)/sizeof(cover_files[0])); - /***************************************************************************** * Local prototypes *****************************************************************************/ @@ -75,15 +73,35 @@ vlc_module_begin () set_callbacks( FindMeta, NULL ) vlc_module_end () -/***************************************************************************** - *****************************************************************************/ +static bool ProbeArtFile(input_item_t *item, + const char *dirpath, const char *filename) +{ + char *filepath; + struct stat st; + bool found = false; + + if (asprintf(&filepath, "%s"DIR_SEP"%s", dirpath, filename) == -1) + return false; + + if (vlc_stat(filepath, &st) == 0 && S_ISREG(st.st_mode)) + { + char *url = vlc_path2uri(filepath, "file"); + if (likely(url != NULL)) + { + input_item_SetArtURL(item, url); + free(url); + found = true; + } + } + + free(filepath); + return found; +} + static int FindMeta( vlc_object_t *p_this ) { meta_fetcher_t *p_finder = (meta_fetcher_t *)p_this; input_item_t *p_item = p_finder->p_item; - bool b_have_art = false; - struct stat statinfo; - char *psz_path = NULL; if( !p_item ) return VLC_EGENERIC; @@ -92,82 +110,36 @@ static int FindMeta( vlc_object_t *p_this ) if( !psz_uri ) return VLC_EGENERIC; - if ( *psz_uri && psz_uri[strlen( psz_uri ) - 1] != DIR_SEP_CHAR ) - { - if ( asprintf( &psz_path, "%s"DIR_SEP, psz_uri ) == -1 ) - { - free( psz_uri ); - return VLC_EGENERIC; - } - char *psz_basedir = vlc_uri2path( psz_path ); - FREENULL( psz_path ); - if( psz_basedir == NULL ) - { - free( psz_uri ); - return VLC_EGENERIC; - } - if( vlc_stat( psz_basedir, &statinfo ) == 0 && S_ISDIR(statinfo.st_mode) ) - psz_path = psz_basedir; - else - free( psz_basedir ); - } + char *psz_basedir = vlc_uri2path(psz_uri); + free(psz_uri); + if (psz_basedir == NULL) + return VLC_EGENERIC; - if ( psz_path == NULL ) + /* If the item is an accessible directory, look for art inside it. + * Otherwise, look for art in the same directory. */ + struct stat st; + if (vlc_stat(psz_basedir, &st) == 0 && !S_ISDIR(st.st_mode)) { - char *psz_basedir = vlc_uri2path( psz_uri ); - if( psz_basedir == NULL ) - { - free( psz_uri ); - return VLC_EGENERIC; - } - char *psz_buf = strrchr( psz_basedir, DIR_SEP_CHAR ); - if( psz_buf ) - *++psz_buf = '\0'; - else - *psz_basedir = '\0'; /* relative path */ - psz_path = psz_basedir; + if (psz_buf != NULL) + *psz_buf = '\0'; } - free( psz_uri ); + int ret = VLC_EGENERIC; - for( int i = -1; !b_have_art && i < i_covers; i++ ) + char *filename = var_InheritString(p_this, "album-art-filename"); + if (filename != NULL && ProbeArtFile(p_item, psz_basedir, filename)) + ret = VLC_SUCCESS; + else { - const char *filename; - char *filebuf, *filepath; - - if( i == -1 ) /* higher priority : configured filename */ - { - filebuf = var_InheritString( p_this, "album-art-filename" ); - if( filebuf == NULL ) - continue; - filename = filebuf; - } - else - { - filename = cover_files[i]; - filebuf = NULL; - } - - if( asprintf( &filepath, "%s%s", psz_path, filename ) == -1 ) - filepath = NULL; - free( filebuf ); - if( unlikely(filepath == NULL) ) - continue; - - if( vlc_stat( filepath, &statinfo ) == 0 && S_ISREG(statinfo.st_mode) ) - { - char *psz_uri = vlc_path2uri( filepath, "file" ); - if( psz_uri ) + for (size_t i = 0; i < ARRAY_SIZE(cover_files); i++) + if (ProbeArtFile(p_item, psz_basedir, cover_files[i])) { - input_item_SetArtURL( p_item, psz_uri ); - free( psz_uri ); - b_have_art = true; + ret = VLC_SUCCESS; + break; } - } - free( filepath ); } - free( psz_path ); - return b_have_art ? VLC_SUCCESS : VLC_EGENERIC; + free(psz_basedir); + return ret; } _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org https://mailman.videolan.org/listinfo/vlc-commits