diff src/core/anime_db.cc @ 173:de0a8d2f28b3

WILL NOT COMPILE: sample export ability for anime db
author Paper <mrpapersonic@gmail.com>
date Tue, 28 Nov 2023 13:53:54 -0500
parents d02fdf1d6708
children f88eda79c60a
line wrap: on
line diff
--- a/src/core/anime_db.cc	Tue Nov 28 13:22:35 2023 -0500
+++ b/src/core/anime_db.cc	Tue Nov 28 13:53:54 2023 -0500
@@ -1,6 +1,8 @@
 #include "core/anime_db.h"
 #include "core/anime.h"
 #include "core/strings.h"
+#include "core/json.h"
+
 #include <QDebug>
 
 namespace Anime {
@@ -93,7 +95,8 @@
 static T get_lowest_in_map(const std::unordered_map<T, U>& map) {
 	if (map.size() <= 0)
 		return 0;
-	T id;
+
+	T id = 0;
 	U ret = std::numeric_limits<U>::max();
 	for (const auto& t : map) {
 		if (t.second < ret) {
@@ -106,7 +109,7 @@
 
 /* This is really fugly but WHO CARES :P
 
-   This sort of ""advanced"" algorithm is only in effect because
+   This fairly basic algorithm is only in effect because
    there are some special cases, e.g. Another and Re:ZERO, where 
    we get the wrong match, so we have to create Advanced Techniques
    to solve this
@@ -115,31 +118,95 @@
      1. searches each anime item for a match to the preferred title
         AND all synonyms and marks those matches with
           `synonym.length() - (synonym.find(needle) + needle.length());`
-        which, on a title that exactly matches, will be 0
+        which should never be less than zero and will be zero if, and only if
+        the titles match exactly.
      2. returns the id of the match that is the lowest, which will most
         definitely match anything that exactly matches the title of the
         filename */
 int Database::GetAnimeFromTitle(const std::string& title) {
 	if (title.empty())
 		return 0;
-	std::unordered_map<int, long long> map;
-	for (const auto& a : items) {
-		long long ret = a.second.GetUserPreferredTitle().find(title);
-		if (ret != static_cast<long long>(std::string::npos)) {
-			map[a.second.GetId()] = a.second.GetUserPreferredTitle().length() - (ret + title.length());
+
+	std::unordered_map<int, size_t> map;
+
+	auto process_title = [&map](const Anime& anime, const std::string& title, const std::string& needle) -> bool {
+		size_t ret = title.find(needle);
+		if (ret == std::string::npos)
+			return false;
+
+		map[anime.GetId()] = title.length() - (ret + needle.length());
+		return true;
+	};
+
+	for (const auto& [id, anime] : items) {
+		if (process_title(anime, anime.GetUserPreferredTitle(), title))
 			continue;
-		}
-		for (const auto& synonym : a.second.GetTitleSynonyms()) {
-			ret = synonym.find(title);
-			if (ret != static_cast<long long>(std::string::npos)) {
-				map[a.second.GetId()] = synonym.length() - (ret + title.length());
+
+		for (const auto& synonym : anime.GetTitleSynonyms())
+			if (process_title(anime, synonym, title))
 				continue;
-			}
-		}
 	}
+
 	return get_lowest_in_map(map);
 }
 
+static bool GetListDataAsJSON(const Anime& anime, nlohmann::json& json) {
+	if (!anime.IsInUserList())
+		return false;
+
+	json = {
+		{"status", Translate::ToString(anime.GetUserStatus())},
+		{"progress", anime.GetUserProgress()},
+		{"score", anime.GetUserScore()},
+		//{"started", anime.GetUserDateStarted()},
+		//{"completed", anime.GetUserDateCompleted()},
+		{"private", anime.GetUserIsPrivate()},
+		{"rewatched_times", anime.GetUserRewatchedTimes()},
+		{"rewatching", anime.GetUserIsRewatching()},
+		{"updated", anime.GetUserTimeUpdated()},
+		{"notes", anime.GetUserNotes()}
+	};
+}
+
+static bool GetAnimeAsJSON(const Anime& anime, nlohmann::json& json) {
+	json = {
+		{"id", anime.GetId()},
+		{"title", {
+			{"native", anime.GetNativeTitle()},
+			{"romaji", anime.GetRomajiTitle()},
+			{"english", anime.GetEnglishTitle()}
+		}},
+		{"synonyms", anime.GetTitleSynonyms()},
+		{"episodes", anime.GetEpisodes()},
+		{"airing_status", anime.GetAiringStatus()},
+		{"air_date", anime.GetAirDate()},
+		{"genres", anime.GetGenres()},
+		{"producers", anime.GetProducers()},
+		{"format", anime.GetFormat()},
+		{"season", anime.GetSeason()},
+		{"audience_score", anime.GetAudienceScore()},
+		{"synopsis", anime.GetSynopsis()},
+		{"duration", anime.GetDuration()},
+		{"poster_url", anime.GetPosterUrl()},
+		{"service_url", anime.GetServiceUrl()}
+	};
+
+	nlohmann::json user;
+	if (GetListDataAsJSON(anime, user))
+		json.push_back({"list_data", user});
+
+	return true;
+}
+
+bool Database::GetDatabaseAsJSON(nlohmann::json& json) {
+	for (const auto& [id, anime] : items) {
+		nlohmann::json anime_json;
+		GetAnimeAsJSON(anime, anime_json);
+		json.push_back(anime_json);
+	}
+	return true;
+}
+
 Database db;
 
 } // namespace Anime
\ No newline at end of file