1 #pragma once 2 3 #include "common/common_pch.h" 4 5 #include <QFileInfo> 6 #include <QStringList> 7 #include <QThread> 8 9 #include "mkvtoolnix-gui/merge/file_identification_pack.h" 10 #include "mkvtoolnix-gui/merge/source_file.h" 11 12 namespace mtx::gui::Merge { 13 14 class FileIdentificationWorkerPrivate; 15 class FileIdentificationWorker : public QObject { 16 Q_OBJECT 17 18 protected: 19 MTX_DECLARE_PRIVATE(FileIdentificationWorkerPrivate) 20 21 std::unique_ptr<FileIdentificationWorkerPrivate> const p_ptr; 22 23 explicit FileIdentificationWorker(FileIdentificationWorkerPrivate &p); 24 25 enum class Result { 26 Wait, 27 Continue, 28 }; 29 30 public: 31 FileIdentificationWorker(QObject *parent = nullptr); 32 virtual ~FileIdentificationWorker(); 33 34 void addPackToIdentify(IdentificationPack const &pack); 35 36 void addIdentifiedFile(SourceFilePtr const &identifiedFile); 37 void addIdentifiedFile(IdentificationPack::FileType type, QString const &fileName); 38 void abortPlaylistScan(); 39 40 bool isEmpty() const; 41 42 public Q_SLOTS: 43 void continueByScanningPlaylists(QFileInfoList const &files); 44 void identifyFiles(); 45 void abortIdentification(); 46 47 Q_SIGNALS: 48 void queueStarted(); 49 void queueFinished(); 50 51 void playlistScanStarted(int numFilesToScan); 52 void playlistScanFinished(); 53 void playlistScanProgressChanged(int numFilesScanned); 54 void playlistScanDecisionNeeded(std::shared_ptr<SourceFile> sourceFile, QFileInfoList files); 55 void playlistSelectionNeeded(QVector<std::shared_ptr<Merge::SourceFile>> identifiedPlaylists); 56 57 void packIdentified(Merge::IdentificationPack const &pack); 58 void identifiedAsPlaylist(); 59 60 void identificationFailed(QString const &errorTitle, QString const &errorText); 61 62 protected: 63 IdentificationPack::FileType determineIfFileThatShouldBeSelectedElsewhere(QString const &fileName); 64 std::optional<FileIdentificationWorker::Result> handleBlurayMainFile(QString const &fileName); 65 std::optional<FileIdentificationWorker::Result> handleIdentifiedPlaylist(SourceFilePtr const &sourceFile); 66 Result identifyThisFile(QString const &fileName); 67 68 Result scanPlaylists(QFileInfoList const &fileNames); 69 }; 70 71 class FileIdentificationThread : public QThread { 72 Q_OBJECT 73 74 protected: 75 std::unique_ptr<FileIdentificationWorker> m_worker; 76 77 public: 78 FileIdentificationThread(QObject *parent = nullptr); 79 virtual ~FileIdentificationThread(); 80 81 FileIdentificationWorker &worker(); 82 83 bool isEmpty() const; 84 85 void continueByScanningPlaylists(QFileInfoList const &files); 86 void continueIdentification(); 87 void abortIdentification(); 88 89 public Q_SLOTS: 90 void abortPlaylistScan(); 91 }; 92 93 } 94