view include/core/anime.h @ 187:9613d72b097e

*: multiple performance improvements like marking `static const` when it makes sense... date: change old stupid heap-based method to a structure which should make copying the thing actually make a copy. also many performance-based changes, like removing the std::tie dependency and forward-declaring nlohmann json *: replace every instance of QString::fromUtf8 to Strings::ToQString. the main difference is that our function will always convert exactly what is in the string, while some other times it would only convert up to the nearest NUL byte
author Paper <mrpapersonic@gmail.com>
date Wed, 06 Dec 2023 13:43:54 -0500
parents 62e336597bb7
children 649786bae914
line wrap: on
line source

#ifndef __core__anime_h
#define __core__anime_h
#include "core/date.h"
#include <array>
#include <map>
#include <vector>

namespace Anime {

enum class ListStatus {
	NOT_IN_LIST,
	CURRENT,
	COMPLETED,
	PAUSED,
	DROPPED,
	PLANNING
};

constexpr std::array<ListStatus, 5> ListStatuses{ListStatus::CURRENT, ListStatus::COMPLETED, ListStatus::PAUSED,
                                                 ListStatus::DROPPED, ListStatus::PLANNING};

enum class SeriesStatus {
	UNKNOWN,
	FINISHED,
	RELEASING,
	NOT_YET_RELEASED,
	CANCELLED,
	HIATUS
};

enum class SeriesFormat {
	UNKNOWN,
	TV,
	TV_SHORT,
	MOVIE,
	SPECIAL,
	OVA,
	ONA,
	MUSIC,
	MANGA,
	NOVEL,
	ONE_SHOT
};

enum class SeriesSeason {
	UNKNOWN,
	WINTER,
	SPRING,
	SUMMER,
	FALL
};

enum class TitleLanguage {
	ROMAJI,
	NATIVE,
	ENGLISH
};

enum class Services {
	NONE,
	ANILIST,
	NB_SERVICES
};

enum class ScoreFormat {
	POINT_100, // 0-100
	POINT_10_DECIMAL, // 0.0-10.0
	POINT_10, // 0-10
	POINT_5, // 0-5, should be represented in stars
	POINT_3 // 1-3, should be represented in smileys
};

struct ListInformation {
		int id = 0;
		int progress = 0;
		int score = 0; // note that this will ALWAYS be in POINT_100 format and must be converted
		ListStatus status = ListStatus::NOT_IN_LIST;
		Date started;
		Date completed;
		bool is_private = false;
		unsigned int rewatched_times = 0;
		bool rewatching = false;
		uint64_t updated = 0;
		std::string notes;
};

struct SeriesInformation {
		int id;
		struct {
				std::string romaji;
				std::string english;
				std::string native;
		} title;
		std::vector<std::string> synonyms;
		int episodes = 0;
		SeriesStatus status = SeriesStatus::UNKNOWN;
		Date air_date;
		std::vector<std::string> genres;
		std::vector<std::string> producers;
		SeriesFormat format = SeriesFormat::UNKNOWN;
		SeriesSeason season = SeriesSeason::UNKNOWN;
		int audience_score = 0;
		std::string synopsis;
		int duration = 0;
		std::string poster_url;
};

class Anime {
	public:
		/* User list data */
		ListStatus GetUserStatus() const;
		int GetUserProgress() const;
		int GetUserScore() const;
		std::string GetUserPresentableScore() const;
		Date GetUserDateStarted() const;
		Date GetUserDateCompleted() const;
		bool GetUserIsPrivate() const;
		unsigned int GetUserRewatchedTimes() const;
		bool GetUserIsRewatching() const;
		uint64_t GetUserTimeUpdated() const;
		std::string GetUserNotes() const;

		void SetUserStatus(ListStatus status);
		void SetUserScore(int score);
		void SetUserProgress(int progress);
		void SetUserDateStarted(Date const& started);
		void SetUserDateCompleted(Date const& completed);
		void SetUserIsPrivate(bool is_private);
		void SetUserRewatchedTimes(int rewatched);
		void SetUserIsRewatching(bool rewatching);
		void SetUserTimeUpdated(uint64_t updated);
		void SetUserNotes(std::string const& notes);

		/* Series data */
		int GetId() const;
		std::string GetRomajiTitle() const;
		std::string GetEnglishTitle() const;
		std::string GetNativeTitle() const;
		std::vector<std::string> GetTitleSynonyms() const;
		int GetEpisodes() const;
		SeriesStatus GetAiringStatus() const;
		Date GetAirDate() const;
		std::vector<std::string> GetGenres() const;
		std::vector<std::string> GetProducers() const;
		SeriesFormat GetFormat() const;
		SeriesSeason GetSeason() const;
		int GetAudienceScore() const; /* should be double once MAL and Kitsu are implemented */
		std::string GetSynopsis() const;
		int GetDuration() const;
		std::string GetPosterUrl() const;
		std::string GetServiceUrl() const;

		void SetId(int id);
		void SetRomajiTitle(std::string const& title);
		void SetEnglishTitle(std::string const& title);
		void SetNativeTitle(std::string const& title);
		void SetTitleSynonyms(std::vector<std::string> const& synonyms);
		void AddTitleSynonym(std::string const& synonym);
		void SetEpisodes(int episodes);
		void SetAiringStatus(SeriesStatus status);
		void SetAirDate(Date const& date);
		void SetGenres(std::vector<std::string> const& genres);
		void SetProducers(std::vector<std::string> const& producers);
		void SetFormat(SeriesFormat format);
		void SetSeason(SeriesSeason season);
		void SetAudienceScore(int audience_score);
		void SetSynopsis(std::string synopsis);
		void SetDuration(int duration);
		void SetPosterUrl(std::string poster);

		std::string GetUserPreferredTitle() const;

		/* User stuff */
		void AddToUserList();
		bool IsInUserList() const;
		void RemoveFromUserList();

	private:
		SeriesInformation info_;
		std::shared_ptr<struct ListInformation> list_info_;
};

} // namespace Anime

#endif // __core__anime_h