Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
Steve Lhomme
VLC
Commits
662ed774
Commit
662ed774
authored
Aug 18, 2007
by
Rafaël Carré
Browse files
Input access locking, part 2.
Fix [21193]
parent
a387a1ff
Changes
15
Hide whitespace changes
Inline
Side-by-side
include/vlc_input.h
View file @
662ed774
...
...
@@ -26,6 +26,11 @@
#error You are not libvlc or one of its plugins. You cannot include this file
#endif
#ifndef __USE_GNU
#define __USE_GNU
#endif
#include <string.h>
/* strcasestr() */
/* __ is need because conflict with <vlc/input.h> */
#ifndef _VLC__INPUT_H
#define _VLC__INPUT_H 1
...
...
@@ -222,11 +227,11 @@ static inline void input_item_SetMeta( input_item_t *p_i, vlc_meta_type_t meta_t
{
vlc_event_t
event
;
//
vlc_mutex_lock( &p_i->lock );
vlc_mutex_lock
(
&
p_i
->
lock
);
if
(
!
p_i
->
p_meta
)
p_i
->
p_meta
=
vlc_meta_New
();
vlc_meta_Set
(
p_i
->
p_meta
,
meta_type
,
psz_val
);
//
vlc_mutex_unlock( &p_i->lock );
vlc_mutex_unlock
(
&
p_i
->
lock
);
/* Notify interested third parties */
event
.
type
=
vlc_InputItemMetaChanged
;
...
...
@@ -236,10 +241,10 @@ static inline void input_item_SetMeta( input_item_t *p_i, vlc_meta_type_t meta_t
static
inline
vlc_bool_t
input_item_MetaMatch
(
input_item_t
*
p_i
,
vlc_meta_type_t
meta_type
,
const
char
*
psz
)
{
//
vlc_mutex_lock( &p_i->lock );
vlc_mutex_lock
(
&
p_i
->
lock
);
const
char
*
meta
=
vlc_meta_Get
(
p_i
->
p_meta
,
meta_type
);
vlc_bool_t
ret
=
meta
&&
strcasestr
(
meta
,
psz
);
//
vlc_mutex_unlock( &p_i->lock );
vlc_mutex_unlock
(
&
p_i
->
lock
);
return
ret
;
}
...
...
@@ -247,26 +252,26 @@ static inline vlc_bool_t input_item_MetaMatch( input_item_t *p_i, vlc_meta_type_
static
inline
char
*
input_item_GetMeta
(
input_item_t
*
p_i
,
vlc_meta_type_t
meta_type
)
{
char
*
psz
=
NULL
;
//
vlc_mutex_lock( &p_i->lock );
vlc_mutex_lock
(
&
p_i
->
lock
);
if
(
!
p_i
->
p_meta
)
{
//
vlc_mutex_unlock( &p_i->lock );
vlc_mutex_unlock
(
&
p_i
->
lock
);
return
NULL
;
}
if
(
vlc_meta_Get
(
p_i
->
p_meta
,
meta_type
)
)
psz
=
strdup
(
vlc_meta_Get
(
p_i
->
p_meta
,
meta_type
)
);
//
vlc_mutex_unlock( &p_i->lock );
vlc_mutex_unlock
(
&
p_i
->
lock
);
return
psz
;
}
static
inline
char
*
input_item_GetName
(
input_item_t
*
p_i
)
{
//
vlc_mutex_lock( &p_i->lock );
vlc_mutex_lock
(
&
p_i
->
lock
);
char
*
psz_s
=
p_i
->
psz_name
?
strdup
(
p_i
->
psz_name
)
:
NULL
;
//
vlc_mutex_unlock( &p_i->lock );
vlc_mutex_unlock
(
&
p_i
->
lock
);
return
psz_s
;
}
...
...
modules/misc/notify/growl.c
View file @
662ed774
...
...
@@ -124,21 +124,22 @@ static int ItemChange( vlc_object_t *p_this, const char *psz_var,
if
(
!
p_input
)
return
VLC_SUCCESS
;
vlc_object_yield
(
p_input
);
if
(
p_input
->
b_dead
||
!
input_GetItem
(
p_input
)
->
psz_name
)
char
*
psz_name
=
input_item_GetName
(
input_GetItem
(
p_input
)
);
if
(
p_input
->
b_dead
||
!
psz_name
)
{
/* Not playing anything ... */
free
(
psz_name
);
vlc_object_release
(
p_input
);
return
VLC_SUCCESS
;
}
free
(
psz_name
);
/* Playing something ... */
psz_artist
=
input_item_GetArtist
(
input_GetItem
(
p_input
)
)
?
strdup
(
input_item_GetArtist
(
input_GetItem
(
p_input
)
)
)
:
strdup
(
""
);
psz_album
=
input_item_GetAlbum
(
input_GetItem
(
p_input
)
)
?
strdup
(
input_item_GetAlbum
(
input_GetItem
(
p_input
)
)
)
:
strdup
(
""
);
psz_title
=
strdup
(
input_GetItem
(
p_input
)
->
psz_name
);
psz_artist
=
input_item_GetArtist
(
input_GetItem
(
p_input
)
);
if
(
psz_artist
==
NULL
)
psz_artist
=
strdup
(
""
);
psz_album
=
input_item_GetAlbum
(
input_GetItem
(
p_input
)
)
;
if
(
psz_album
==
NULL
)
psz_album
=
strdup
(
""
);
psz_title
=
input_item_GetName
(
input_GetItem
(
p_input
)
);
if
(
psz_title
==
NULL
)
psz_title
=
strdup
(
N_
(
"(no title)"
)
);
snprintf
(
psz_tmp
,
GROWL_MAX_LENGTH
,
"%s %s %s"
,
psz_title
,
psz_artist
,
psz_album
);
...
...
modules/misc/notify/notify.c
View file @
662ed774
...
...
@@ -150,13 +150,11 @@ static int ItemChange( vlc_object_t *p_this, const char *psz_var,
}
/* Playing something ... */
psz_artist
=
input_item_GetArtist
(
input_GetItem
(
p_input
)
)
?
strdup
(
input_item_GetArtist
(
input_GetItem
(
p_input
)
)
)
:
strdup
(
_
(
"no artist"
)
);
psz_album
=
input_item_GetAlbum
(
input_GetItem
(
p_input
)
)
?
strdup
(
input_item_GetAlbum
(
input_GetItem
(
p_input
)
)
)
:
strdup
(
_
(
"no album"
)
);
psz_title
=
strdup
(
input_GetItem
(
p_input
)
->
psz_name
);
psz_artist
=
input_item_GetArtist
(
input_GetItem
(
p_input
)
);
if
(
psz_artist
==
NULL
)
psz_artist
=
strdup
(
_
(
"no artist"
)
);
psz_album
=
input_item_GetAlbum
(
input_GetItem
(
p_input
)
)
;
if
(
psz_album
==
NULL
)
psz_album
=
strdup
(
_
(
"no album"
)
);
psz_title
=
input_item_GetName
(
input_GetItem
(
p_input
)
);
vlc_object_release
(
p_input
);
...
...
modules/misc/playlist/m3u.c
View file @
662ed774
...
...
@@ -65,13 +65,11 @@ static void DoChildren( playlist_t *p_playlist, playlist_export_t *p_export,
assert
(
p_current
->
p_input
->
psz_uri
);
/* General info */
if
(
p_current
->
p_input
->
psz_name
&&
strcmp
(
p_current
->
p_input
->
psz_uri
,
p_current
->
p_input
->
psz_name
)
)
char
*
psz_name
=
input_item_GetName
(
p_current
->
p_input
);
if
(
psz_name
&&
strcmp
(
p_current
->
p_input
->
psz_uri
,
psz_name
)
)
{
char
*
psz_artist
=
input_item_GetArtist
(
p_current
->
p_input
)
?
strdup
(
input_item_GetArtist
(
p_current
->
p_input
)
)
:
strdup
(
""
);
char
*
psz_artist
=
input_item_GetArtist
(
p_current
->
p_input
);
if
(
psz_artist
==
NULL
)
psz_artist
=
strdup
(
""
);
if
(
psz_artist
&&
*
psz_artist
)
{
/* write EXTINF with artist */
...
...
@@ -87,9 +85,9 @@ static void DoChildren( playlist_t *p_playlist, playlist_export_t *p_export,
(
int
)(
p_current
->
p_input
->
i_duration
/
1000000
),
p_current
->
p_input
->
psz_name
);
}
if
(
psz_artist
)
free
(
psz_artist
);
free
(
psz_artist
);
}
free
(
psz_name
);
/* VLC specific options */
for
(
j
=
0
;
j
<
p_current
->
p_input
->
i_options
;
j
++
)
...
...
modules/misc/playlist/xspf.c
View file @
662ed774
...
...
@@ -163,11 +163,10 @@ static void xspf_export_item( playlist_item_t *p_item, FILE *p_file,
}
/* -> the artist/creator */
psz
=
input_item_GetArtist
(
p_item
->
p_input
)
?
strdup
(
input_item_GetArtist
(
p_item
->
p_input
)
)
:
strdup
(
""
);
psz
=
input_item_GetArtist
(
p_item
->
p_input
);
if
(
psz
==
NULL
)
psz
=
strdup
(
""
);
psz_temp
=
convert_xml_special_chars
(
psz
);
if
(
psz
)
free
(
psz
);
free
(
psz
);
if
(
*
psz_temp
)
{
fprintf
(
p_file
,
"
\t\t\t
<creator>%s</creator>
\n
"
,
psz_temp
);
...
...
@@ -175,11 +174,10 @@ static void xspf_export_item( playlist_item_t *p_item, FILE *p_file,
free
(
psz_temp
);
/* -> the album */
psz
=
input_item_GetAlbum
(
p_item
->
p_input
)
?
strdup
(
input_item_GetAlbum
(
p_item
->
p_input
)
)
:
strdup
(
""
);
psz
=
input_item_GetAlbum
(
p_item
->
p_input
);
if
(
psz
==
NULL
)
psz
=
strdup
(
""
);
psz_temp
=
convert_xml_special_chars
(
psz
);
if
(
psz
)
free
(
psz
);
free
(
psz
);
if
(
*
psz_temp
)
{
fprintf
(
p_file
,
"
\t\t\t
<album>%s</album>
\n
"
,
psz_temp
);
...
...
@@ -187,24 +185,22 @@ static void xspf_export_item( playlist_item_t *p_item, FILE *p_file,
free
(
psz_temp
);
/* -> the track number */
psz
=
input_item_GetTrackNum
(
p_item
->
p_input
)
?
strdup
(
input_item_GetTrackNum
(
p_item
->
p_input
)
)
:
strdup
(
""
);
psz
=
input_item_GetTrackNum
(
p_item
->
p_input
);
if
(
psz
==
NULL
)
psz
=
strdup
(
""
);
if
(
psz
)
{
if
(
*
psz
)
{
fprintf
(
p_file
,
"
\t\t\t
<trackNum>%i</trackNum>
\n
"
,
atoi
(
psz
)
);
}
free
(
psz
);
}
free
(
psz
);
/* -> the description */
psz
=
input_item_GetDescription
(
p_item
->
p_input
)
?
strdup
(
input_item_GetDescription
(
p_item
->
p_input
)
)
:
strdup
(
""
);
psz
=
input_item_GetDescription
(
p_item
->
p_input
);
if
(
psz
==
NULL
)
psz
=
strdup
(
""
);
psz_temp
=
convert_xml_special_chars
(
psz
);
if
(
psz
)
free
(
psz
);
free
(
psz
);
if
(
*
psz_temp
)
{
fprintf
(
p_file
,
"
\t\t\t
<annotation>%s</annotation>
\n
"
,
psz_temp
);
...
...
modules/visualization/goom.c
View file @
662ed774
...
...
@@ -416,12 +416,10 @@ static char *TitleGet( vlc_object_t *p_this )
if
(
p_input
)
{
if
(
!
EMPTY_STR
(
input_item_GetTitle
(
input_GetItem
(
p_input
)
)
)
)
{
psz_title
=
strdup
(
input_item_GetTitle
(
input_GetItem
(
p_input
)
)
);
}
else
psz_title
=
strdup
(
input_item_GetTitle
(
input_GetItem
(
p_input
)
)
);
if
(
EMPTY_STR
(
psz_title
)
)
{
free
(
psz_title
);
char
*
psz
=
strrchr
(
input_GetItem
(
p_input
)
->
psz_uri
,
'/'
);
if
(
psz
)
...
...
src/input/control.c
View file @
662ed774
...
...
@@ -152,7 +152,7 @@ int input_vaControl( input_thread_t *p_input, int i_query, va_list args )
p_cat
=
malloc
(
sizeof
(
info_category_t
)
);
if
(
!
p_cat
)
{
vlc_mutex_lock
(
&
p_input
->
p
->
input
.
p_item
->
lock
);
vlc_mutex_
un
lock
(
&
p_input
->
p
->
input
.
p_item
->
lock
);
return
VLC_EGENERIC
;
}
p_cat
->
psz_name
=
strdup
(
psz_cat
);
...
...
@@ -180,7 +180,7 @@ int input_vaControl( input_thread_t *p_input, int i_query, va_list args )
p_info
=
malloc
(
sizeof
(
info_t
)
);
if
(
!
p_info
)
{
vlc_mutex_lock
(
&
p_input
->
p
->
input
.
p_item
->
lock
);
vlc_mutex_
un
lock
(
&
p_input
->
p
->
input
.
p_item
->
lock
);
return
VLC_EGENERIC
;
}
...
...
src/input/es_out.c
View file @
662ed774
...
...
@@ -487,12 +487,10 @@ static void EsOutProgramSelect( es_out_t *out, es_out_pgrm_t *p_pgrm )
}
/* Update now playing */
vlc_mutex_lock
(
&
p_input
->
p
->
input
.
p_item
->
lock
);
input_item_SetNowPlaying
(
p_input
->
p
->
input
.
p_item
,
p_pgrm
->
psz_now_playing
);
input_item_SetPublisher
(
p_input
->
p
->
input
.
p_item
,
p_pgrm
->
psz_publisher
);
vlc_mutex_unlock
(
&
p_input
->
p
->
input
.
p_item
->
lock
);
var_SetBool
(
p_sys
->
p_input
,
"intf-change"
,
VLC_TRUE
);
}
...
...
@@ -672,11 +670,7 @@ static void EsOutProgramMeta( es_out_t *out, int i_group, vlc_meta_t *p_meta )
if
(
psz_provider
)
{
if
(
p_sys
->
p_pgrm
==
p_pgrm
)
{
vlc_mutex_lock
(
&
p_input
->
p
->
input
.
p_item
->
lock
);
input_item_SetPublisher
(
p_input
->
p
->
input
.
p_item
,
psz_provider
);
vlc_mutex_unlock
(
&
p_input
->
p
->
input
.
p_item
->
lock
);
}
input_Control
(
p_input
,
INPUT_ADD_INFO
,
psz_cat
,
input_MetaTypeToLocalizedString
(
vlc_meta_Publisher
),
psz_provider
);
}
char
**
ppsz_all_keys
=
vlc_dictionary_all_keys
(
&
p_meta
->
extra_tags
);
...
...
@@ -798,10 +792,8 @@ static void EsOutProgramEpg( es_out_t *out, int i_group, vlc_epg_t *p_epg )
if
(
p_epg
->
p_current
&&
p_epg
->
p_current
->
psz_name
&&
*
p_epg
->
p_current
->
psz_name
)
p_pgrm
->
psz_now_playing
=
strdup
(
p_epg
->
p_current
->
psz_name
);
vlc_mutex_lock
(
&
p_input
->
p
->
input
.
p_item
->
lock
);
if
(
p_pgrm
==
p_sys
->
p_pgrm
)
input_item_SetNowPlaying
(
p_input
->
p
->
input
.
p_item
,
p_pgrm
->
psz_now_playing
);
vlc_mutex_unlock
(
&
p_input
->
p
->
input
.
p_item
->
lock
);
if
(
p_pgrm
->
psz_now_playing
)
{
...
...
src/input/input.c
View file @
662ed774
...
...
@@ -254,9 +254,7 @@ static input_thread_t *Create( vlc_object_t *p_parent, input_item_t *p_item,
input_Control
(
p_input
,
INPUT_DEL_INFO
,
_
(
VLC_META_INFO_CAT
),
_
(
VLC_META_NOW_PLAYING
)
);
vlc_mutex_lock
(
&
p_item
->
lock
);
input_item_SetNowPlaying
(
p_item
,
NULL
);
vlc_mutex_unlock
(
&
p_item
->
lock
);
/* */
if
(
p_input
->
b_preparsing
)
...
...
@@ -2505,39 +2503,44 @@ static void InputMetaUser( input_thread_t *p_input, vlc_meta_t *p_meta )
static
void
InputUpdateMeta
(
input_thread_t
*
p_input
,
vlc_meta_t
*
p_meta
)
{
input_item_t
*
p_item
=
p_input
->
p
->
input
.
p_item
;
char
*
psz_saved_arturl
=
NULL
;
const
char
*
psz_arturl
=
NULL
;
char
*
psz_arturl
=
NULL
;
char
*
psz_title
=
NULL
;
int
i
;
int
i_arturl_event
=
VLC_FALSE
;
if
(
!
p_meta
)
return
;
psz_arturl
=
input_item_GetArtURL
(
p_item
);
vlc_mutex_lock
(
&
p_item
->
lock
);
if
(
vlc_meta_Get
(
p_meta
,
vlc_meta_Title
)
&&
!
p_item
->
b_fixed_name
)
psz_title
=
strdup
(
vlc_meta_Get
(
p_meta
,
vlc_meta_Title
)
);
if
(
input_item_GetArtURL
(
p_item
)
)
psz_saved_arturl
=
strdup
(
input_item_GetArtURL
(
p_item
)
);
vlc_meta_Merge
(
p_item
->
p_meta
,
p_meta
);
if
(
psz_saved_arturl
&&
*
psz_saved_arturl
)
input_item_SetArtURL
(
p_item
,
psz_saved_arturl
);
if
(
psz_arturl
&&
*
psz_arturl
)
{
vlc_meta_Set
(
p_item
->
p_meta
,
vlc_meta_ArtworkURL
,
psz_arturl
);
i_arturl_event
=
VLC_TRUE
;
}
free
(
psz_saved_arturl
);
vlc_meta_Delete
(
p_meta
);
psz_arturl
=
input_item_GetArtURL
(
p_item
);
if
(
psz_arturl
&&
!
strncmp
(
psz_arturl
,
"attachment://"
,
strlen
(
"attachment"
)
)
)
{
/* Don't look for art cover if sout
* XXX It can change when sout has meta data support */
if
(
p_input
->
p
->
p_sout
&&
!
p_input
->
b_preparsing
)
input_item_SetArtURL
(
p_item
,
""
);
{
vlc_meta_Set
(
p_item
->
p_meta
,
vlc_meta_ArtworkURL
,
""
);
i_arturl_event
=
VLC_TRUE
;
}
else
input_ExtractAttachmentAndCacheArt
(
p_input
);
}
free
(
psz_arturl
);
input_item_SetPreparsed
(
p_item
,
VLC_TRUE
);
...
...
@@ -2550,6 +2553,16 @@ static void InputUpdateMeta( input_thread_t *p_input, vlc_meta_t *p_meta )
}
vlc_mutex_unlock
(
&
p_item
->
lock
);
if
(
i_arturl_event
==
VLC_TRUE
)
{
vlc_event_t
event
;
/* Notify interested third parties */
event
.
type
=
vlc_InputItemMetaChanged
;
event
.
u
.
input_item_meta_changed
.
meta_type
=
vlc_meta_ArtworkURL
;
vlc_event_send
(
&
p_item
->
event_manager
,
&
event
);
}
if
(
psz_title
)
{
input_Control
(
p_input
,
INPUT_SET_NAME
,
psz_title
);
...
...
src/input/meta.c
View file @
662ed774
...
...
@@ -119,24 +119,33 @@ int input_ArtFind( playlist_t *p_playlist, input_item_t *p_item )
{
int
i_ret
=
VLC_EGENERIC
;
module_t
*
p_module
;
char
*
psz_name
,
*
psz_title
,
*
psz_artist
,
*
psz_album
;
if
(
!
p_item
->
p_meta
)
return
VLC_EGENERIC
;
if
(
!
p_item
->
psz_name
&&
!
input_item_GetTitle
(
p_item
)
&&
(
!
input_item_GetArtist
(
p_item
)
||
!
input_item_GetAlbum
(
p_item
))
)
psz_name
=
input_item_GetName
(
p_item
);
psz_title
=
input_item_GetTitle
(
p_item
);
psz_artist
=
input_item_GetArtist
(
p_item
);
psz_album
=
input_item_GetAlbum
(
p_item
);
if
(
!
psz_name
&&
!
psz_title
&&
!
psz_artist
&&
!
psz_album
)
return
VLC_EGENERIC
;
free
(
psz_name
);
free
(
psz_title
);
/* If we already checked this album in this session, skip */
if
(
input_item_GetArtist
(
p_item
)
&&
input_item_GetAlbum
(
p_item
)
)
if
(
psz_artist
&&
psz_album
)
{
FOREACH_ARRAY
(
playlist_album_t
album
,
p_playlist
->
p_fetcher
->
albums
)
if
(
!
strcmp
(
album
.
psz_artist
,
input_item_GetArtist
(
p_item
)
)
&&
!
strcmp
(
album
.
psz_album
,
input_item_GetAlbum
(
p_item
)
)
)
if
(
!
strcmp
(
album
.
psz_artist
,
psz_artist
)
&&
!
strcmp
(
album
.
psz_album
,
psz_album
)
)
{
msg_Dbg
(
p_playlist
,
" %s - %s has already been searched"
,
input_item_GetArtist
(
p_item
),
input_item_GetAlbum
(
p_item
)
);
psz_artist
,
psz_album
);
/* TODO-fenrir if we cache art filename too, we can go faster */
free
(
psz_artist
);
free
(
psz_album
);
if
(
album
.
b_found
)
{
/* Actually get URL from cache */
...
...
@@ -150,23 +159,36 @@ int input_ArtFind( playlist_t *p_playlist, input_item_t *p_item )
}
FOREACH_END
();
}
free
(
psz_artist
);
free
(
psz_album
);
char
*
psz_arturl
=
input_item_GetArtURL
(
p_item
);
input_FindArtInCache
(
p_playlist
,
p_item
);
if
(
!
EMPTY_STR
(
input_item_GetArtURL
(
p_item
))
)
if
(
!
EMPTY_STR
(
psz_arturl
)
)
{
free
(
psz_arturl
);
return
0
;
}
free
(
psz_arturl
);
PL_LOCK
;
p_playlist
->
p_private
=
p_item
;
if
(
input_item_GetAlbum
(
p_item
)
&&
input_item_GetArtist
(
p_item
)
)
psz_album
=
input_item_GetAlbum
(
p_item
);
psz_artist
=
input_item_GetArtist
(
p_item
);
psz_name
=
input_item_GetName
(
p_item
);
psz_title
=
input_item_GetTitle
(
p_item
);
if
(
psz_album
&&
psz_artist
)
{
msg_Dbg
(
p_playlist
,
"searching art for %s - %s"
,
input_item_GetArtist
(
p_item
),
input_item_GetAlbum
(
p_item
)
);
psz_artist
,
psz_album
);
}
else
{
msg_Dbg
(
p_playlist
,
"searching art for %s"
,
input_item_GetTitle
(
p_item
)
?
input_item_GetTitle
(
p_item
)
:
p_item
->
psz_name
);
psz_title
?
psz_title
:
psz_name
);
}
free
(
psz_title
);
free
(
psz_name
);
p_module
=
module_Need
(
p_playlist
,
"art finder"
,
0
,
VLC_FALSE
);
...
...
@@ -176,14 +198,19 @@ int input_ArtFind( playlist_t *p_playlist, input_item_t *p_item )
msg_Dbg
(
p_playlist
,
"unable to find art"
);
/* Record this album */
if
(
input_item_GetArtist
(
p_item
)
&&
input_item_GetAlbum
(
p_item
)
)
if
(
psz_artist
&&
psz_album
)
{
playlist_album_t
a
;
a
.
psz_artist
=
strdup
(
input_item_GetArtist
(
p_item
)
)
;
a
.
psz_album
=
strdup
(
input_item_GetAlbum
(
p_item
)
)
;
a
.
psz_artist
=
psz_artist
;
a
.
psz_album
=
psz_album
;
a
.
b_found
=
(
i_ret
==
VLC_EGENERIC
?
VLC_FALSE
:
VLC_TRUE
);
ARRAY_APPEND
(
p_playlist
->
p_fetcher
->
albums
,
a
);
}
else
{
free
(
psz_artist
);
free
(
psz_album
);
}
if
(
p_module
)
module_Unneed
(
p_playlist
,
p_module
);
...
...
@@ -280,9 +307,9 @@ static char *ArtCacheCreateString( const char *psz )
static
int
__input_FindArtInCache
(
vlc_object_t
*
p_obj
,
input_item_t
*
p_item
)
{
const
char
*
psz_artist
;
const
char
*
psz_album
;
const
char
*
psz_title
;
char
*
psz_artist
;
char
*
psz_album
;
char
*
psz_title
;
char
psz_filename
[
MAX_PATH
+
1
];
int
i
;
struct
stat
a
;
...
...
@@ -293,9 +320,16 @@ static int __input_FindArtInCache( vlc_object_t *p_obj, input_item_t *p_item )
psz_artist
=
input_item_GetArtist
(
p_item
);
psz_album
=
input_item_GetAlbum
(
p_item
);
psz_title
=
input_item_GetTitle
(
p_item
);
if
(
!
psz_title
)
psz_title
=
p_item
->
psz_name
;
if
(
!
psz_title
)
psz_title
=
input_item_GetName
(
p_item
)
;
if
(
(
!
psz_artist
||
!
psz_album
)
&&
!
psz_title
)
return
VLC_EGENERIC
;
if
(
!
psz_title
&&
(
!
psz_album
||
!
psz_artist
)
)
{
free
(
psz_artist
);
free
(
psz_album
);
free
(
psz_title
);
return
VLC_EGENERIC
;
}
free
(
psz_title
);
for
(
i
=
0
;
i
<
5
;
i
++
)
{
...
...
@@ -306,9 +340,13 @@ static int __input_FindArtInCache( vlc_object_t *p_obj, input_item_t *p_item )
if
(
utf8_stat
(
psz_filename
+
7
,
&
a
)
==
0
)
{
input_item_SetArtURL
(
p_item
,
psz_filename
);
free
(
psz_artist
);
free
(
psz_album
);
return
VLC_SUCCESS
;
}
}
free
(
psz_artist
);
free
(
psz_album
);
return
VLC_EGENERIC
;
}
...
...
@@ -324,15 +362,23 @@ int input_DownloadAndCacheArt( playlist_t *p_playlist, input_item_t *p_item )
char
*
psz_artist
=
NULL
;
char
*
psz_album
=
NULL
;
char
*
psz_title
=
NULL
;
char
*
psz_artist_m
,
*
psz_album_m
,
*
psz_title_m
,
*
psz_name_m
,
*
psz_arturl_m
;
char
*
psz_type
;
if
(
input_item_GetArtist
(
p_item
)
)
psz_artist
=
ArtCacheCreateString
(
input_item_GetArtist
(
p_item
)
);
if
(
input_item_GetAlbum
(
p_item
)
)
psz_album
=
ArtCacheCreateString
(
input_item_GetAlbum
(
p_item
)
);
if
(
input_item_GetTitle
(
p_item
)
)
psz_title
=
ArtCacheCreateString
(
input_item_GetTitle
(
p_item
)
);
else
if
(
p_item
->
psz_name
)
psz_title
=
ArtCacheCreateString
(
p_item
->
psz_name
);
psz_artist_m
=
input_item_GetArtist
(
p_item
);
psz_album_m
=
input_item_GetAlbum
(
p_item
);
psz_title_m
=
input_item_GetTitle
(
p_item
);
psz_name_m
=
input_item_GetName
(
p_item
);
if
(
psz_artist_m
)
psz_artist
=
ArtCacheCreateString
(
psz_artist_m
);
if
(
psz_album_m
)
psz_album
=
ArtCacheCreateString
(
psz_album_m
);
if
(
psz_title_m
)
psz_title
=
ArtCacheCreateString
(
psz_title_m
);
else
if
(
psz_name_m
)
psz_title
=
ArtCacheCreateString
(
psz_name_m
);
free
(
psz_artist_m
);
free
(
psz_album_m
);
free
(
psz_title_m
);
free
(
psz_name_m
);
if
(
!
psz_title
&&
(
!
psz_artist
||
!
psz_album
)
)
{
...
...
@@ -342,9 +388,10 @@ int input_DownloadAndCacheArt( playlist_t *p_playlist, input_item_t *p_item )
return
VLC_EGENERIC
;
}
assert
(
!
EMPTY_STR
(
input_item_GetArtURL
(
p_item
))
);
psz_arturl_m
=
input_item_GetArtURL
(
p_item
);
assert
(
!
EMPTY_STR
(
psz_arturl_m
)
);
psz_type
=
strrchr
(
input_item_GetArtURL
(
p_item
)
,
'.'
);
psz_type
=
strrchr
(
psz_arturl_m
,
'.'
);
/* */
ArtCacheCreateName
(
p_playlist
,
psz_filename
,
psz_title
/* Used only if needed*/
,
...
...
@@ -358,13 +405,14 @@ int input_DownloadAndCacheArt( playlist_t *p_playlist, input_item_t *p_item )
free
(
psz_album
);
free
(
psz_title
);
if
(
!
strncmp
(
input_item_GetArtURL
(
p_item
)
,
"APIC"
,
4
)
)
if
(
!
strncmp
(
psz_arturl_m
,
"APIC"
,
4
)
)
{
msg_Warn
(
p_playlist
,
"APIC fetch not supported yet"
);
free
(
psz_arturl_m
);
return
VLC_EGENERIC
;
}
p_stream
=
stream_UrlNew
(
p_playlist
,
input_item_GetArtURL
(
p_item
)
);
p_stream
=
stream_UrlNew
(
p_playlist
,
psz_arturl_m
);
if
(
p_stream
)
{
uint8_t
p_buffer
[
65536
];
...
...
@@ -391,6 +439,7 @@ int input_DownloadAndCacheArt( playlist_t *p_playlist, input_item_t *p_item )
input_item_SetArtURL
(
p_item
,
psz_filename
);
i_status
=
VLC_SUCCESS
;
}
free
(
psz_arturl_m
);
return
i_status
;
}
...
...
@@ -402,6 +451,7 @@ void input_ExtractAttachmentAndCacheArt( input_thread_t *p_input )
char
*
psz_album
=
NULL
;
char
*
psz_title
=
NULL
;
char
*
psz_type
=
NULL
;
char
*
psz_artist_m
,
*
psz_album_m
,
*
psz_title_m
,
*
psz_name_m
;
char
psz_filename
[
MAX_PATH
+
1
];
FILE
*
f
;
input_attachment_t
*
p_attachment
;
...
...
@@ -411,9 +461,10 @@ void input_ExtractAttachmentAndCacheArt( input_thread_t *p_input )
/* TODO-fenrir merge input_ArtFind with download and make it set the flags FETCH
* and then set it here to to be faster */
psz_arturl
=
strdup
(
input_item_GetArtURL
(
p_item
)
);
psz_arturl
=
input_item_GetArtURL
(
p_item
);
if
(
!
psz_arturl
||
strncmp
(
psz_arturl
,
"attachment://"
,
strlen
(
"attachment://"
)
)
)
{
free
(
psz_arturl
);
msg_Err
(
p_input
,
"internal input error with input_ExtractAttachmentAndCacheArt"
);
return
;
}
...
...
@@ -445,14 +496,20 @@ void input_ExtractAttachmentAndCacheArt( input_thread_t *p_input )
goto
end
;
}
if
(
input_item_GetArtist
(
p_item
)
)
psz_artist
=
ArtCacheCreateString
(
input_item_GetArtist
(
p_item
)
);
if
(
input_item_GetAlbum
(
p_item
)
)
psz_album
=
ArtCacheCreateString
(
input_item_GetAlbum
(
p_item
)
);
if
(
input_item_GetTitle
(
p_item
)
)
psz_title
=
ArtCacheCreateString
(
input_item_GetTitle
(
p_item
)
);
else
if
(
p_item
->
psz_name
)
psz_title
=
ArtCacheCreateString
(
p_item
->
psz_name
);