summaryrefslogtreecommitdiff
path: root/src/travel.hh
diff options
context:
space:
mode:
Diffstat (limited to 'src/travel.hh')
-rw-r--r--src/travel.hh137
1 files changed, 137 insertions, 0 deletions
diff --git a/src/travel.hh b/src/travel.hh
new file mode 100644
index 0000000..c9cc891
--- /dev/null
+++ b/src/travel.hh
@@ -0,0 +1,137 @@
+#ifndef TRAVEL_HH
+#define TRAVEL_HH
+
+#include "date.hh"
+#include "location.hh"
+#include "rotation.hh"
+
+#include <filesystem>
+#include <functional>
+#include <memory>
+#include <string_view>
+
+class Config;
+class Logger;
+class TaskRunner;
+
+class Travel {
+public:
+ class Thumbnail {
+ public:
+ enum class ThumbType {
+ FILE,
+ EXIF,
+ };
+
+ virtual ~Thumbnail() = default;
+
+ virtual std::filesystem::path const& path() const = 0;
+
+ virtual ThumbType thumb_type() const = 0;
+
+ virtual std::string_view mime_type() const = 0;
+
+ virtual uint64_t size() const = 0;
+
+ protected:
+ Thumbnail() = default;
+ };
+
+ class Media {
+ public:
+ enum class Type {
+ IMAGE,
+ VIDEO,
+ };
+
+ virtual ~Media() = default;
+
+ virtual std::string_view id() const = 0;
+
+ virtual std::filesystem::path const& path() const = 0;
+
+ virtual Type type() const = 0;
+
+ virtual uint64_t width() const = 0;
+ virtual uint64_t height() const = 0;
+
+ virtual Location location() const = 0;
+
+ virtual Date date() const = 0;
+
+ // Only ever > 0.0 for videos
+ virtual double length() const = 0;
+
+ // Only ever != UNKNOWN for images
+ virtual Rotation rotation() const = 0;
+
+ // Returns nullptr if no thumbnail
+ virtual Thumbnail const* thumbnail() const = 0;
+
+ protected:
+ Media() = default;
+ };
+
+ class Day {
+ public:
+ virtual ~Day() = default;
+
+ // Returns 00:00:00 of the day in question.
+ virtual Date date() const = 0;
+
+ // Index in media array for first media for this day.
+ virtual size_t first() const = 0;
+
+ // Index in media array for the last media for this day.
+ // Days can't be empty, if there is just one media of the day then
+ // first() == last().
+ virtual size_t last() const = 0;
+
+ protected:
+ Day() = default;
+ };
+
+ class Trip {
+ public:
+ virtual ~Trip() = default;
+
+ virtual std::string_view id() const = 0;
+ virtual std::string_view title() const = 0;
+ virtual uint16_t year() const = 0;
+ virtual Location location() const = 0;
+ virtual uint64_t images() const = 0;
+ virtual uint64_t videos() const = 0;
+
+ virtual size_t media_count() const = 0;
+ virtual Media const& media(size_t i) const = 0;
+
+ virtual size_t day_count() const = 0;
+ virtual Day const& day(size_t i) const = 0;
+
+ protected:
+ Trip() = default;
+ };
+
+ virtual ~Travel() = default;
+
+ static std::unique_ptr<Travel> create(std::shared_ptr<Logger> logger,
+ std::shared_ptr<TaskRunner> runner);
+
+ virtual bool setup(Logger* logger, Config* config) = 0;
+
+ virtual void start() = 0;
+
+ virtual void reload() = 0;
+
+ virtual void call_when_loaded(std::function<void()> callback) = 0;
+
+ virtual size_t trips() const = 0;
+ virtual Trip const& trip(size_t i) const = 0;
+
+protected:
+ Travel() = default;
+ Travel(Travel const&) = delete;
+ Travel& operator=(Travel const&) = delete;
+};
+
+#endif // TRAVEL_HH