root/src/videoplayer.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#ifndef VIDEOPLAYER_H
#define VIDEOPLAYER_H

#include <QProcess>
#include <qhttprequest.h>
#include <qhttpresponse.h>
#include <QObject>
#include "metadataparser.h"
#include "thumbnailcreator.h"
#include "library.h"
#include "config.h"
#include "shortclipcreator.h"

class VideoProgress {
public:
    float seconds;
    MetaData metaData;
    TvShow* tvShow;
    QString path;

    QString toSecondsAndPathJson();
    QString toJson();
};

class VideoPlayer : public QObject
{
   Q_OBJECT // TODO build breaks here when trying to inherit qobject
public:
    explicit VideoPlayer(Library &library, const BaseConfig& baseConfig, QObject *parent = NULL);
    virtual ~VideoPlayer();
    bool playFile(QString filepath);

    void togglePause();
    void pause();
    void unPause();

    virtual void stop() = 0;

    virtual void jumpTo(int second);
    virtual void backwards(const int seconds = 5) = 0;
    virtual void forwards(const int seconds = 5) = 0;

    virtual float incrementVolume() = 0; ///< returns the new sound level
    virtual float decrementVolume() = 0; ///< returns the new sound level

    bool handleApiRequest(QHttpRequest* req, QHttpResponse* resp);

    const MetaDataParser *getMetaDataParser() const;
    void setMetaDataParser(const MetaDataParser *value);

    const ThumbnailCreator *getThumbnailCreator() const;
    void setThumbnailCreator(const ThumbnailCreator *value);

    QStringList getPlaylist() const;
    void setPlaylist(const QStringList &value);

    void resetPlayingStatus();
    VideoProgress getNowPlaying() const;

    void createGif(QHttpResponse* resp, ShortClipCreator::ApiData apiData);
signals:
    void paused();
    void unpaused();
    void jumped(int second);

    void playbackStarted();
    void playbackEnded();
    void playbackEndedNormally();
    void playbackCanceled();

    void exactProgressReady(float);

protected:
    virtual bool playFileImpl(QString filepath, const TvShowPlayerSettings& settings) = 0;
    virtual void pauseImpl() = 0;
    virtual void unPauseImpl() = 0;
    virtual bool customHandleApiRequest() { return false; }
    virtual void getExactProgress() { emit exactProgressReady(nowPlaying.seconds); }

    Library& library;
    const BaseConfig& baseConfig;
    const SnapshotConfig& snapshotConfig;
    const MetaDataParser* metaDataParser;
    const ThumbnailCreator* thumbnailCreator;
    QProcess process;
    bool pauseStatus;
    VideoProgress nowPlaying;

    QStringList playlist;

    // snapshots
    QMap<QString, QString> unhandledSnapshots;

    QString imageName(QString templateString, QString extension) const;
    QString snapshotOutputPath() const;
    QString shortClipOutputPath(const ShortClipCreator::Config& sccofig, float start, float end, QString extension) const;
    void convertSnapshots();
    bool convertSnapshot(const QString snapshotPath, const QString outputPath);

private:
    const ShortClipCreator::Config* initShortClipConfig(ShortClipCreator::Config* config, ShortClipCreator::ApiData apiData) const;

public slots:
    void onThumbnailCreated(const QByteArray img);
    void receivedPlaylist(QHttpResponse* resp, const QByteArray& body);
    void onGifReady(bool success);
    void onExactProgressReady(float);

private slots:
    void onPlaybackEndedNormally();
    void onPlaybackCanceled();
};

#endif // VIDEOPLAYER_H