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:
parent
d9dc71bc94
commit
452897761d
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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()) {
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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 )
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user