/* Enqueue an item for preparsing, and play it, if needed */ static void GoAndPreparse( playlist_t *p_playlist, int i_mode, playlist_item_t *p_item ) { PL_ASSERT_LOCKED; if( (i_mode & PLAYLIST_GO ) ) { pl_priv(p_playlist)->request.b_request = true; pl_priv(p_playlist)->request.i_skip = 0; pl_priv(p_playlist)->request.p_item = p_item; if( pl_priv(p_playlist)->p_input ) input_Stop( pl_priv(p_playlist)->p_input, true ); pl_priv(p_playlist)->request.i_status = PLAYLIST_RUNNING; vlc_cond_signal( &pl_priv(p_playlist)->signal ); } /* Preparse if no artist/album info, and hasn't been preparsed allready and if user has some preparsing option (auto-preparse variable) enabled*/ char *psz_artist = input_item_GetArtist( p_item->p_input ); char *psz_album = input_item_GetAlbum( p_item->p_input ); if( pl_priv(p_playlist)->b_auto_preparse && input_item_IsPreparsed( p_item->p_input ) == false && ( EMPTY_STR( psz_artist ) || ( EMPTY_STR( psz_album ) ) ) ) libvlc_MetaRequest( p_playlist->p_libvlc, p_item->p_input ); free( psz_artist ); free( psz_album ); }
static int media_parse(libvlc_media_t *media) { libvlc_int_t *libvlc = media->p_libvlc_instance->p_libvlc_int; input_item_t *item = media->p_input_item; /* TODO: Fetch art on need basis. But how not to break compatibility? */ libvlc_ArtRequest(libvlc, item, META_REQUEST_OPTION_NONE); return libvlc_MetaRequest(libvlc, item, META_REQUEST_OPTION_NONE); }
static int media_parse(libvlc_media_t *media, bool b_async, libvlc_media_parse_flag_t parse_flag) { bool needed; vlc_mutex_lock(&media->parsed_lock); needed = !media->has_asked_preparse; media->has_asked_preparse = true; if (needed) media->is_parsed = false; vlc_mutex_unlock(&media->parsed_lock); if (needed) { libvlc_int_t *libvlc = media->p_libvlc_instance->p_libvlc_int; input_item_t *item = media->p_input_item; input_item_meta_request_option_t art_scope = META_REQUEST_OPTION_NONE; input_item_meta_request_option_t parse_scope = META_REQUEST_OPTION_SCOPE_LOCAL; int ret; if (parse_flag & libvlc_media_fetch_local) art_scope |= META_REQUEST_OPTION_SCOPE_LOCAL; if (parse_flag & libvlc_media_fetch_network) art_scope |= META_REQUEST_OPTION_SCOPE_NETWORK; if (art_scope != META_REQUEST_OPTION_NONE) { ret = libvlc_ArtRequest(libvlc, item, art_scope); if (ret != VLC_SUCCESS) return ret; } if (parse_flag & libvlc_media_parse_network) parse_scope |= META_REQUEST_OPTION_SCOPE_NETWORK; if (parse_flag & libvlc_media_do_interact) parse_scope |= META_REQUEST_OPTION_DO_INTERACT; ret = libvlc_MetaRequest(libvlc, item, parse_scope); if (ret != VLC_SUCCESS) return ret; } else return VLC_EGENERIC; if (!b_async) { vlc_mutex_lock(&media->parsed_lock); while (!media->is_parsed) vlc_cond_wait(&media->parsed_cond, &media->parsed_lock); vlc_mutex_unlock(&media->parsed_lock); } return VLC_SUCCESS; }