diff options
| author | Joel Klinghed <the_jk@spawned.biz> | 2021-11-17 22:34:57 +0100 |
|---|---|---|
| committer | Joel Klinghed <the_jk@spawned.biz> | 2021-11-17 22:34:57 +0100 |
| commit | 6232d13f5321b87ddf12a1aa36b4545da45f173d (patch) | |
| tree | 23f3316470a14136debd9d02f9e920ca2b06f4cc /src/travel.hh | |
Travel3: Simple image and video display site
Reads the images and videos from filesystem and builds a site in
memroy.
Diffstat (limited to 'src/travel.hh')
| -rw-r--r-- | src/travel.hh | 137 |
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 |
