Commit b5c4baa4 authored by Jakob Leben's avatar Jakob Leben

playlist: use md5 hash for caching downloaded art by download URL

parent a7766273
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#include <vlc_strings.h> #include <vlc_strings.h>
#include <vlc_stream.h> #include <vlc_stream.h>
#include <vlc_url.h> #include <vlc_url.h>
#include <vlc_md5.h>
#include <limits.h> /* PATH_MAX */ #include <limits.h> /* PATH_MAX */
...@@ -63,7 +64,7 @@ static void ArtCacheCreateDir( const char *psz_dir ) ...@@ -63,7 +64,7 @@ static void ArtCacheCreateDir( const char *psz_dir )
vlc_mkdir( psz_dir, 0700 ); vlc_mkdir( psz_dir, 0700 );
} }
static char* ArtCacheGetDirPath( const char *psz_title, const char *psz_artist, static char* ArtCacheGetDirPath( const char *psz_arturl, const char *psz_artist,
const char *psz_album ) const char *psz_album )
{ {
char *psz_dir; char *psz_dir;
...@@ -84,12 +85,20 @@ static char* ArtCacheGetDirPath( const char *psz_title, const char *psz_artist, ...@@ -84,12 +85,20 @@ static char* ArtCacheGetDirPath( const char *psz_title, const char *psz_artist,
} }
else else
{ {
char * psz_title_sanitized = strdup( psz_title ); /* If artist or album missing cache by art download URL. The download
filename_sanitize( psz_title_sanitized ); URL will be md5 hashed to form a valid cache filename. We assume that
if( asprintf( &psz_dir, "%s" DIR_SEP "art" DIR_SEP "title" DIR_SEP psz_arturl is always the download URL and not the already hashed filename.
"%s", psz_cachedir, psz_title_sanitized ) == -1 ) (We should never need to call this function if art has already been
downloaded anyway). */
struct md5_s md5;
InitMD5( &md5 );
AddMD5( &md5, psz_arturl, sizeof( psz_arturl ) );
EndMD5( &md5 );
char * psz_arturl_sanitized = psz_md5_hash( &md5 );
if( asprintf( &psz_dir, "%s" DIR_SEP "art" DIR_SEP "arturl" DIR_SEP
"%s", psz_cachedir, psz_arturl_sanitized ) == -1 )
psz_dir = NULL; psz_dir = NULL;
free( psz_title_sanitized ); free( psz_arturl_sanitized );
} }
free( psz_cachedir ); free( psz_cachedir );
return psz_dir; return psz_dir;
...@@ -100,7 +109,7 @@ static char *ArtCachePath( input_item_t *p_item ) ...@@ -100,7 +109,7 @@ static char *ArtCachePath( input_item_t *p_item )
char* psz_path = NULL; char* psz_path = NULL;
const char *psz_artist; const char *psz_artist;
const char *psz_album; const char *psz_album;
const char *psz_title; const char *psz_arturl;
vlc_mutex_lock( &p_item->lock ); vlc_mutex_lock( &p_item->lock );
...@@ -111,14 +120,12 @@ static char *ArtCachePath( input_item_t *p_item ) ...@@ -111,14 +120,12 @@ static char *ArtCachePath( input_item_t *p_item )
psz_artist = vlc_meta_Get( p_item->p_meta, vlc_meta_Artist ); psz_artist = vlc_meta_Get( p_item->p_meta, vlc_meta_Artist );
psz_album = vlc_meta_Get( p_item->p_meta, vlc_meta_Album ); psz_album = vlc_meta_Get( p_item->p_meta, vlc_meta_Album );
/* cache by art URL instead of title - performs better in many cases psz_arturl = vlc_meta_Get( p_item->p_meta, vlc_meta_ArtworkURL );
when multiple items without album and artist have same art URL */
psz_title = vlc_meta_Get( p_item->p_meta, vlc_meta_ArtworkURL );
if( (!psz_artist || !psz_album ) && !psz_title ) if( (!psz_artist || !psz_album ) && !psz_arturl )
goto end; goto end;
psz_path = ArtCacheGetDirPath( psz_title, psz_artist, psz_album ); psz_path = ArtCacheGetDirPath( psz_arturl, psz_artist, psz_album );
end: end:
vlc_mutex_unlock( &p_item->lock ); vlc_mutex_unlock( &p_item->lock );
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment