1
mirror of https://code.videolan.org/videolan/vlc synced 2024-09-24 20:48:52 +02:00

medialib: Expose the thumbnails states

This allows the UI not to ask for a thumbnail generation if the previous
one lead to a crash, or if it's been failing multiple times before.
This commit is contained in:
Hugo Beauzée-Luyssen 2020-08-20 14:37:18 +02:00
parent d9dc71bc94
commit 452897761d
6 changed files with 40 additions and 11 deletions

View File

@ -74,6 +74,15 @@ typedef enum vlc_ml_thumbnail_size_t
VLC_ML_THUMBNAIL_SIZE_COUNT
} vlc_ml_thumbnail_size_t;
typedef enum vlc_ml_thumbnail_status_t
{
VLC_ML_THUMBNAIL_STATUS_MISSING,
VLC_ML_THUMBNAIL_STATUS_AVAILABLE,
VLC_ML_THUMBNAIL_STATUS_FAILURE,
VLC_ML_THUMBNAIL_STATUS_PERSISTENT_FAILURE,
VLC_ML_THUMBNAIL_STATUS_CRASH,
} vlc_ml_thumbnail_status_t;
typedef enum vlc_ml_history_type_t
{
VLC_ML_HISTORY_TYPE_MEDIA,
@ -87,7 +96,7 @@ typedef struct vlc_ml_thumbnail_t
* True if a thumbnail is available, or if thumbnail generation was
* attempted but failed
*/
bool b_generated;
vlc_ml_thumbnail_status_t i_status;
} vlc_ml_thumbnail_t;
typedef struct vlc_ml_movie_t

View File

@ -61,7 +61,7 @@ MLAlbumTrack::MLAlbumTrack(vlc_medialibrary_t* _ml, const vlc_ml_media_t *_data,
}
for( const vlc_ml_thumbnail_t& thumbnail: _data->thumbnails )
if( thumbnail.b_generated )
if( thumbnail.i_status == VLC_ML_THUMBNAIL_STATUS_AVAILABLE )
{
m_cover = QString::fromUtf8(thumbnail.psz_mrl);
break;

View File

@ -121,7 +121,8 @@ public:
QStringList thumbnails;
thumbnails.reserve(8);
for( const vlc_ml_album_t& media: ml_range_iterate<vlc_ml_album_t>( album_list ) ) {
if (media.thumbnails[VLC_ML_THUMBNAIL_SMALL].b_generated) {
if (media.thumbnails[VLC_ML_THUMBNAIL_SMALL].i_status ==
VLC_ML_THUMBNAIL_STATUS_AVAILABLE) {
QUrl mediaURL( media.thumbnails[VLC_ML_THUMBNAIL_SMALL].psz_mrl );
//QImage only accept local file
if (mediaURL.isValid() && mediaURL.isLocalFile()) {

View File

@ -82,7 +82,7 @@ MLVideo::MLVideo(vlc_medialibrary_t* ml, const vlc_ml_media_t* data, QObject* pa
, m_thumbnail( QString::fromUtf8( data->thumbnails[VLC_ML_THUMBNAIL_SMALL].psz_mrl ) )
, m_progress( data->f_progress )
, m_playCount( data->i_playcount )
, m_thumbnailGenerated( data->thumbnails[VLC_ML_THUMBNAIL_SMALL].b_generated )
, m_thumbnailStatus( data->thumbnails[VLC_ML_THUMBNAIL_SMALL].i_status )
, m_ml_event_handle( nullptr, [this](vlc_ml_event_callback_t* cb ) {
assert( m_ml != nullptr );
vlc_ml_event_unregister_callback( m_ml, cb );
@ -165,11 +165,14 @@ void MLVideo::onMlEvent( const vlc_ml_event_t* event )
if ( event->i_type != VLC_ML_EVENT_MEDIA_THUMBNAIL_GENERATED ||
event->media_thumbnail_generated.i_size != VLC_ML_THUMBNAIL_SMALL )
return;
m_thumbnailGenerated = true;
if ( event->media_thumbnail_generated.p_media->i_id != m_id.id )
return;
if ( event->media_thumbnail_generated.b_success == false )
{
m_thumbnailStatus = VLC_ML_THUMBNAIL_STATUS_FAILURE;
return;
}
m_thumbnailStatus = VLC_ML_THUMBNAIL_STATUS_AVAILABLE;
auto thumbnailMrl = event->media_thumbnail_generated
.p_media->thumbnails[event->media_thumbnail_generated.i_size].psz_mrl;
m_thumbnail = QString::fromUtf8( thumbnailMrl );
@ -189,7 +192,8 @@ QString MLVideo::getTitle() const
QString MLVideo::getThumbnail()
{
if ( m_thumbnailGenerated == false )
if ( m_thumbnailStatus == VLC_ML_THUMBNAIL_STATUS_MISSING ||
m_thumbnailStatus == VLC_ML_THUMBNAIL_STATUS_FAILURE )
{
m_ml_event_handle.reset( vlc_ml_event_register_callback( m_ml, onMlEvent, this ) );
vlc_ml_media_generate_thumbnail( m_ml, m_id.id, VLC_ML_THUMBNAIL_SMALL,

View File

@ -139,7 +139,7 @@ private:
float m_progress;
QString m_progressTime;
unsigned int m_playCount;
bool m_thumbnailGenerated;
vlc_ml_thumbnail_status_t m_thumbnailStatus;
QObjectList m_audioDesc;
QObjectList m_videoDesc;

View File

@ -66,14 +66,29 @@ static bool convertThumbnails( const T input, vlc_ml_thumbnail_t *output )
for ( auto i = 0u; i < VLC_ML_THUMBNAIL_SIZE_COUNT; ++i )
{
auto sizeType = static_cast<medialibrary::ThumbnailSizeType>( i );
if ( input->thumbnailStatus( sizeType ) !=
medialibrary::ThumbnailStatus::Available )
switch ( input->thumbnailStatus( sizeType ) )
{
case medialibrary::ThumbnailStatus::Available:
output[i].i_status = VLC_ML_THUMBNAIL_STATUS_AVAILABLE;
break;
case medialibrary::ThumbnailStatus::Missing:
output[i].i_status = VLC_ML_THUMBNAIL_STATUS_MISSING;
break;
case medialibrary::ThumbnailStatus::Failure:
output[i].i_status = VLC_ML_THUMBNAIL_STATUS_FAILURE;
break;
case medialibrary::ThumbnailStatus::PersistentFailure:
output[i].i_status = VLC_ML_THUMBNAIL_STATUS_PERSISTENT_FAILURE;
break;
case medialibrary::ThumbnailStatus::Crash:
output[i].i_status = VLC_ML_THUMBNAIL_STATUS_CRASH;
break;
}
if ( output[i].i_status != VLC_ML_THUMBNAIL_STATUS_AVAILABLE )
{
output[i].psz_mrl = nullptr;
output[i].b_generated = false;
continue;
}
output[i].b_generated = true;
const auto thumbnailMrl = input->thumbnailMrl( sizeType );
if ( thumbnailMrl.empty() == false )
{