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