diff --git a/configure.ac b/configure.ac index e18ada3c49..a493f86b3d 100644 --- a/configure.ac +++ b/configure.ac @@ -4355,7 +4355,7 @@ dnl Libnotify notification plugin dnl PKG_ENABLE_MODULES_VLC([NOTIFY], [], [libnotify], [libnotify notification], [auto]) -PKG_ENABLE_MODULES_VLC([MEDIALIBRARY], [medialibrary], [medialibrary >= 0.9.2], (medialibrary support), [auto]) +PKG_ENABLE_MODULES_VLC([MEDIALIBRARY], [medialibrary], [medialibrary >= 0.9.3], (medialibrary support), [auto]) dnl dnl Endianness check diff --git a/include/vlc_media_library.h b/include/vlc_media_library.h index 0a22c9a475..008dd2882b 100644 --- a/include/vlc_media_library.h +++ b/include/vlc_media_library.h @@ -575,7 +575,6 @@ enum vlc_ml_playback_state VLC_ML_PLAYBACK_STATE_TITLE, VLC_ML_PLAYBACK_STATE_CHAPTER, VLC_ML_PLAYBACK_STATE_PROGRAM, - VLC_ML_PLAYBACK_STATE_SEEN, VLC_ML_PLAYBACK_STATE_VIDEO_TRACK, VLC_ML_PLAYBACK_STATE_ASPECT_RATIO, VLC_ML_PLAYBACK_STATE_ZOOM, @@ -638,11 +637,13 @@ enum vlc_ml_event_type VLC_ML_EVENT_BOOKMARKS_DELETED, /** * A discovery started. - * For each VLC_ML_EVENT_DISCOVERY_STARTED event, there will be - * 1 VLC_ML_EVENT_DISCOVERY_COMPLETED event, and N - * VLC_ML_EVENT_DISCOVERY_PROGRESS events. - * The entry point being discovered is stored in - * vlc_ml_event_t::discovery_started::psz_entry_point. + * + * This event will be emitted when the media library starts discovering a + * scheduled entry point. + * If more than a single entry point are queued, this event won't be fired + * again until all operations are completed and a new operation is scheduled. + * Once all currently queued operations are done + * VLC_ML_EVENT_DISCOVERY_COMPLETED will be emitted. */ VLC_ML_EVENT_DISCOVERY_STARTED, /** @@ -652,13 +653,15 @@ enum vlc_ml_event_type */ VLC_ML_EVENT_DISCOVERY_PROGRESS, /** - * Sent when an entry point discovery is completed. - * The entry point that was being discovered is stored in - * vlc_ml_event_t::discovery_completed::psz_entry_point. - * The success or failure state is stored in - * vlc_ml_event_t::discovery_completed::b_success + * Sent when all queued discovery operations are done being processed. */ VLC_ML_EVENT_DISCOVERY_COMPLETED, + /** + * This event is sent when a discovery failed. The entry point that failed to + * be discovered is stored in + * vlc_ml_event_t::discovery_failed::psz_entry_point + */ + VLC_ML_EVENT_DISCOVERY_FAILED, /** * Sent when a new entry point gets added to the database. * The entry point that was added is stored in @@ -730,10 +733,6 @@ typedef struct vlc_ml_event_t int i_type; union { - struct - { - const char* psz_entry_point; - } discovery_started; struct { const char* psz_entry_point; @@ -741,8 +740,7 @@ typedef struct vlc_ml_event_t struct { const char* psz_entry_point; - bool b_success; - } discovery_completed; + } discovery_failed; struct { const char* psz_entry_point; diff --git a/modules/gui/macosx/library/VLCLibraryDataTypes.h b/modules/gui/macosx/library/VLCLibraryDataTypes.h index ad0af0c2ea..bc4a357329 100644 --- a/modules/gui/macosx/library/VLCLibraryDataTypes.h +++ b/modules/gui/macosx/library/VLCLibraryDataTypes.h @@ -190,7 +190,6 @@ extern const long long int VLCMediaLibraryMediaItemDurationDenominator; @property (readwrite) int lastTitle; @property (readwrite) int lastChapter; @property (readwrite) int lastProgram; -@property (readwrite) BOOL seen; @property (readwrite) int lastVideoTrack; @property (readwrite) NSString *lastAspectRatio; @property (readwrite) NSString *lastZoom; diff --git a/modules/gui/macosx/library/VLCLibraryDataTypes.m b/modules/gui/macosx/library/VLCLibraryDataTypes.m index 0ed3489e2f..a66f3b87f3 100644 --- a/modules/gui/macosx/library/VLCLibraryDataTypes.m +++ b/modules/gui/macosx/library/VLCLibraryDataTypes.m @@ -639,16 +639,6 @@ NSString *VLCMediaLibraryMediaItemLibraryID = @"VLCMediaLibraryMediaItemLibraryI [self setIntegerPreference:lastProgram forKey:VLC_ML_PLAYBACK_STATE_PROGRAM]; } -- (BOOL)seen -{ - return [self integerPreferenceForKey:VLC_ML_PLAYBACK_STATE_SEEN] > 0 ? YES : NO; -} - -- (void)setSeen:(BOOL)seen -{ - [self setIntegerPreference:seen forKey:VLC_ML_PLAYBACK_STATE_SEEN]; -} - - (int)lastVideoTrack { return [self integerPreferenceForKey:VLC_ML_PLAYBACK_STATE_VIDEO_TRACK]; diff --git a/modules/misc/medialibrary/entities.cpp b/modules/misc/medialibrary/entities.cpp index 3f5e2fa702..ae951b87b2 100644 --- a/modules/misc/medialibrary/entities.cpp +++ b/modules/misc/medialibrary/entities.cpp @@ -252,7 +252,7 @@ bool Convert( const medialibrary::IMedia* input, vlc_ml_media_t& output ) output.i_duration = input->duration(); output.b_is_favorite = input->isFavorite(); output.i_playcount = input->playCount(); - output.f_progress = input->progress(); + output.f_progress = input->lastPosition(); output.i_last_played_date = input->lastPlayedDate(); output.psz_title = strdup( input->title().c_str() ); diff --git a/modules/misc/medialibrary/fs/fs.cpp b/modules/misc/medialibrary/fs/fs.cpp index 94bc7a0413..6d3378d241 100644 --- a/modules/misc/medialibrary/fs/fs.cpp +++ b/modules/misc/medialibrary/fs/fs.cpp @@ -172,6 +172,19 @@ void vlc::medialibrary::SDFileSystemFactory::onDeviceUnmounted(const std::string m_callbacks->onDeviceUnmounted(*device, mountpoint); } +bool SDFileSystemFactory::waitForDevice(const std::string& mrl, + uint32_t timeout) const +{ + auto deadline = vlc_tick_now() + VLC_TICK_FROM_MS(timeout); + vlc::threads::mutex_locker lock{ m_mutex }; + while ( deviceByMrl(mrl) == nullptr ) + { + if ( m_cond.timedwait(m_mutex, deadline) != 0 ) + return false; + } + return true; +} + std::shared_ptr SDFileSystemFactory::deviceByUuid(const std::string& uuid) { auto it = std::find_if( begin( m_devices ), end( m_devices ), @@ -188,7 +201,7 @@ bool SDFileSystemFactory::isStarted() const return m_callbacks != nullptr; } -std::shared_ptr SDFileSystemFactory::deviceByMrl(const std::string& mrl) +std::shared_ptr SDFileSystemFactory::deviceByMrl(const std::string& mrl) const { std::shared_ptr res; std::string mountpoint; diff --git a/modules/misc/medialibrary/fs/fs.h b/modules/misc/medialibrary/fs/fs.h index 30025e6fb6..6ffec46c4a 100644 --- a/modules/misc/medialibrary/fs/fs.h +++ b/modules/misc/medialibrary/fs/fs.h @@ -87,13 +87,16 @@ public: void onDeviceUnmounted(const std::string& uuid, const std::string& mountpoint) override; + bool + waitForDevice(const std::string& mrl, uint32_t timeout) const override; + private: std::shared_ptr deviceByUuid(const std::string& uuid); bool isStarted() const override; - std::shared_ptr deviceByMrl(const std::string& mrl); + std::shared_ptr deviceByMrl(const std::string& mrl) const; private: vlc_object_t *const m_parent; @@ -103,7 +106,8 @@ private: IFileSystemFactoryCb *m_callbacks; bool m_isNetwork; - vlc::threads::mutex m_mutex; + mutable vlc::threads::mutex m_mutex; + mutable vlc::threads::condition_variable m_cond; std::vector> m_devices; }; diff --git a/modules/misc/medialibrary/medialibrary.cpp b/modules/misc/medialibrary/medialibrary.cpp index b1c46fe4f4..9515b447cc 100644 --- a/modules/misc/medialibrary/medialibrary.cpp +++ b/modules/misc/medialibrary/medialibrary.cpp @@ -150,6 +150,10 @@ void MediaLibrary::onMediaDeleted( std::set mediaIds ) wrapEntityDeletedEventCallback( m_vlc_ml, mediaIds, VLC_ML_EVENT_MEDIA_DELETED ); } +void MediaLibrary::onMediaConvertedToExternal(std::set) +{ +} + void MediaLibrary::onArtistsAdded( std::vector artists ) { wrapEntityCreatedEventCallback( m_vlc_ml, artists, VLC_ML_EVENT_ARTIST_ADDED ); @@ -248,11 +252,10 @@ void MediaLibrary::onBookmarksDeleted( std::set bookmarkIds ) VLC_ML_EVENT_BOOKMARKS_DELETED ); } -void MediaLibrary::onDiscoveryStarted( const std::string& entryPoint ) +void MediaLibrary::onDiscoveryStarted() { vlc_ml_event_t ev; ev.i_type = VLC_ML_EVENT_DISCOVERY_STARTED; - ev.discovery_started.psz_entry_point = entryPoint.c_str(); m_vlc_ml->cbs->pf_send_event( m_vlc_ml, &ev ); } @@ -264,15 +267,22 @@ void MediaLibrary::onDiscoveryProgress( const std::string& entryPoint ) m_vlc_ml->cbs->pf_send_event( m_vlc_ml, &ev ); } -void MediaLibrary::onDiscoveryCompleted( const std::string& entryPoint, bool success ) +void MediaLibrary::onDiscoveryCompleted() { vlc_ml_event_t ev; ev.i_type = VLC_ML_EVENT_DISCOVERY_COMPLETED; - ev.discovery_completed.psz_entry_point = entryPoint.c_str(); - ev.discovery_completed.b_success = success; m_vlc_ml->cbs->pf_send_event( m_vlc_ml, &ev ); } +void MediaLibrary::onDiscoveryFailed( const std::string& entryPoint ) +{ + vlc_ml_event_t ev; + ev.i_type = VLC_ML_EVENT_DISCOVERY_FAILED; + ev.discovery_failed.psz_entry_point = entryPoint.c_str(); + m_vlc_ml->cbs->pf_send_event( m_vlc_ml, &ev ); +} + + void MediaLibrary::onEntryPointAdded( const std::string& entryPoint, bool success ) { vlc_ml_event_t ev; @@ -309,11 +319,11 @@ void MediaLibrary::onEntryPointUnbanned( const std::string& entryPoint, bool suc m_vlc_ml->cbs->pf_send_event( m_vlc_ml, &ev ); } -void MediaLibrary::onParsingStatsUpdated( uint32_t progress ) +void MediaLibrary::onParsingStatsUpdated( uint32_t done, uint32_t scheduled ) { vlc_ml_event_t ev; ev.i_type = VLC_ML_EVENT_PARSING_PROGRESS_UPDATED; - ev.parsing_progress.i_percent = progress; + ev.parsing_progress.i_percent = (float)done / (float)scheduled * 100.f; m_vlc_ml->cbs->pf_send_event( m_vlc_ml, &ev ); } @@ -1162,8 +1172,6 @@ medialibrary::IMedia::MetadataType MediaLibrary::metadataType( int meta ) return medialibrary::IMedia::MetadataType::Chapter; case VLC_ML_PLAYBACK_STATE_PROGRAM: return medialibrary::IMedia::MetadataType::Program; - case VLC_ML_PLAYBACK_STATE_SEEN: - return medialibrary::IMedia::MetadataType::Seen; case VLC_ML_PLAYBACK_STATE_VIDEO_TRACK: return medialibrary::IMedia::MetadataType::VideoTrack; case VLC_ML_PLAYBACK_STATE_ASPECT_RATIO: @@ -1349,7 +1357,7 @@ int MediaLibrary::controlMedia( int query, va_list args ) switch( query ) { case VLC_ML_MEDIA_UPDATE_PROGRESS: - if ( m->setProgress( va_arg( args, double ) ) == false ) + if ( m->setLastPosition( va_arg( args, double ) ) == false ) return VLC_EGENERIC; return VLC_SUCCESS; case VLC_ML_MEDIA_GET_MEDIA_PLAYBACK_STATE: diff --git a/modules/misc/medialibrary/medialibrary.h b/modules/misc/medialibrary/medialibrary.h index 1fa82221c0..2b007ff895 100644 --- a/modules/misc/medialibrary/medialibrary.h +++ b/modules/misc/medialibrary/medialibrary.h @@ -198,6 +198,7 @@ public: virtual void onMediaAdded(std::vector media) override; virtual void onMediaModified(std::set media) override; virtual void onMediaDeleted(std::set mediaIds) override; + virtual void onMediaConvertedToExternal(std::set mediaIds) override; virtual void onArtistsAdded(std::vector artists) override; virtual void onArtistsModified(std::set artists) override; virtual void onArtistsDeleted(std::set artistsIds) override; @@ -216,14 +217,15 @@ public: virtual void onBookmarksAdded( std::vector bookmarks ) override; virtual void onBookmarksModified( std::set bookmarksIds ) override; virtual void onBookmarksDeleted( std::set bookmarksIds ) override; - virtual void onDiscoveryStarted(const std::string& entryPoint) override; + virtual void onDiscoveryStarted() override; virtual void onDiscoveryProgress(const std::string& entryPoint) override; - virtual void onDiscoveryCompleted(const std::string& entryPoint, bool success) override; + virtual void onDiscoveryCompleted() override; + virtual void onDiscoveryFailed( const std::string& entryPoint ) override; virtual void onEntryPointAdded(const std::string& entryPoint, bool success) override; virtual void onEntryPointRemoved(const std::string& entryPoint, bool success) override; virtual void onEntryPointBanned(const std::string& entryPoint, bool success) override; virtual void onEntryPointUnbanned(const std::string& entryPoint, bool success) override; - virtual void onParsingStatsUpdated(uint32_t percent) override; + virtual void onParsingStatsUpdated(uint32_t done, uint32_t scheduled) override; virtual void onBackgroundTasksIdleChanged(bool isIdle) override; virtual void onMediaThumbnailReady(medialibrary::MediaPtr media, medialibrary::ThumbnailSizeType sizeType,