[vlc-devel] [PATCH 4/7] medialib: Split initialization in multiple steps

Hugo Beauzée-Luyssen hugo at beauzee.fr
Thu Dec 12 15:10:53 CET 2019


- Always create the instance as part of the constructor
- Replicate the 2 initialize() & start() steps in the module
This will allow more control in later commits
---
 modules/misc/medialibrary/medialib.cpp   | 50 +++++++++++++-----------
 modules/misc/medialibrary/medialibrary.h |  1 +
 2 files changed, 28 insertions(+), 23 deletions(-)

diff --git a/modules/misc/medialibrary/medialib.cpp b/modules/misc/medialibrary/medialib.cpp
index 2102b57787..c56a2c8b99 100644
--- a/modules/misc/medialibrary/medialib.cpp
+++ b/modules/misc/medialibrary/medialib.cpp
@@ -345,28 +345,25 @@ void MediaLibrary::onRescanStarted()
 MediaLibrary::MediaLibrary( vlc_medialibrary_module_t* ml )
     : m_vlc_ml( ml )
 {
-}
-
-bool MediaLibrary::Start()
-{
-    if ( m_ml != nullptr )
-        return true;
-
-    std::unique_ptr<medialibrary::IMediaLibrary> ml( NewMediaLibrary() );
+    m_ml.reset( NewMediaLibrary() );
 
     m_logger.reset( new Logger( VLC_OBJECT( m_vlc_ml ) ) );
-    ml->setVerbosity( var_InheritInteger( VLC_OBJECT( m_vlc_ml ), "verbose" ) >= 4 ?
+    m_ml->setVerbosity( var_InheritInteger( VLC_OBJECT( m_vlc_ml ), "verbose" ) >= 4 ?
                           medialibrary::LogLevel::Debug : medialibrary::LogLevel::Info );
-    ml->setLogger( m_logger.get() );
+    m_ml->setLogger( m_logger.get() );
+}
 
+bool MediaLibrary::Init()
+{
+    if ( m_ml->isInitialized() == true )
+        return true;
     auto userDir = vlc::wrap_cptr( config_GetUserDir( VLC_USERDATA_DIR ) );
     std::string mlDir = std::string{ userDir.get() } + "/ml/";
 
-    auto initStatus = ml->initialize( mlDir + "ml.db", mlDir + "/mlstorage/", this );
+    auto initStatus = m_ml->initialize( mlDir + "ml.db", mlDir + "/mlstorage/", this );
     switch ( initStatus )
     {
         case medialibrary::InitializeResult::AlreadyInitialized:
-            msg_Info( m_vlc_ml, "MediaLibrary was already initialized" );
             return true;
         case medialibrary::InitializeResult::Failed:
             msg_Err( m_vlc_ml, "Medialibrary failed to initialize" );
@@ -388,10 +385,10 @@ bool MediaLibrary::Start()
             switch ( res )
             {
                 case 1:
-                    ml->clearDatabase( true );
+                    m_ml->clearDatabase( true );
                     break;
                 case 2:
-                    ml->clearDatabase( false );
+                    m_ml->clearDatabase( false );
                     break;
                 default:
                     return false;
@@ -400,10 +397,10 @@ bool MediaLibrary::Start()
         }
     }
 
-    ml->addParserService( std::make_shared<MetadataExtractor>( VLC_OBJECT( m_vlc_ml ) ) );
+    m_ml->addParserService( std::make_shared<MetadataExtractor>( VLC_OBJECT( m_vlc_ml ) ) );
     try
     {
-        ml->addThumbnailer( std::make_shared<Thumbnailer>( m_vlc_ml ) );
+        m_ml->addThumbnailer( std::make_shared<Thumbnailer>( m_vlc_ml ) );
     }
     catch ( const std::runtime_error& ex )
     {
@@ -413,10 +410,18 @@ bool MediaLibrary::Start()
     }
 
     auto networkFs = std::make_shared<vlc::medialibrary::SDFileSystemFactory>( VLC_OBJECT( m_vlc_ml ), "smb://");
-    ml->addNetworkFileSystemFactory( networkFs );
-    ml->setDiscoverNetworkEnabled( true );
+    m_ml->addNetworkFileSystemFactory( networkFs );
+    m_ml->setDiscoverNetworkEnabled( true );
+
+    return true;
+}
+
+bool MediaLibrary::Start()
+{
+    if ( Init() == false )
+        return false;
 
-    if ( ml->start() == false )
+    if ( m_ml->start() == false )
     {
         msg_Err( m_vlc_ml, "Failed to start the MediaLibrary" );
         return false;
@@ -425,7 +430,7 @@ bool MediaLibrary::Start()
     // Reload entry points we already know about, and then add potential new ones.
     // Doing it the other way around would cause the initial scan to be performed
     // twice, as we start discovering the new folders, then reload them.
-    ml->reload();
+    m_ml->reload();
 
     auto folders = vlc::wrap_cptr( var_InheritString( m_vlc_ml, "ml-folders" ) );
     if ( folders != nullptr && strlen( folders.get() ) > 0 )
@@ -433,7 +438,7 @@ bool MediaLibrary::Start()
         std::istringstream ss( folders.get() );
         std::string folder;
         while ( std::getline( ss, folder, ';' ) )
-            ml->discover( folder );
+            m_ml->discover( folder );
     }
     else
     {
@@ -444,13 +449,12 @@ bool MediaLibrary::Start()
             if( folder == nullptr )
                 continue;
             auto folderMrl = vlc::wrap_cptr( vlc_path2uri( folder.get(), nullptr ) );
-            ml->discover( folderMrl.get() );
+            m_ml->discover( folderMrl.get() );
             varValue += std::string{ ";" } + folderMrl.get();
         }
         if ( varValue.empty() == false )
             config_PutPsz( "ml-folders", varValue.c_str()+1 ); /* skip initial ';' */
     }
-    m_ml = std::move( ml );
     return true;
 }
 
diff --git a/modules/misc/medialibrary/medialibrary.h b/modules/misc/medialibrary/medialibrary.h
index 5a63e83c09..c359e8c7e0 100644
--- a/modules/misc/medialibrary/medialibrary.h
+++ b/modules/misc/medialibrary/medialibrary.h
@@ -135,6 +135,7 @@ class MediaLibrary : public medialibrary::IMediaLibraryCb
 {
 public:
     MediaLibrary( vlc_medialibrary_module_t* ml );
+    bool Init();
     bool Start();
     int Control( int query, va_list args );
     int List( int query, const vlc_ml_query_params_t* params, va_list args );
-- 
2.20.1



More information about the vlc-devel mailing list