about summary refs log tree commit diff stats
path: root/generator/generator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'generator/generator.cpp')
-rw-r--r--generator/generator.cpp109
1 files changed, 85 insertions, 24 deletions
diff --git a/generator/generator.cpp b/generator/generator.cpp index 19eba70..4244fd2 100644 --- a/generator/generator.cpp +++ b/generator/generator.cpp
@@ -6,7 +6,6 @@
6#include <json.hpp> 6#include <json.hpp>
7#include <hkutil/progress.h> 7#include <hkutil/progress.h>
8#include <hkutil/string.h> 8#include <hkutil/string.h>
9#include "mood.h"
10 9
11namespace cadence { 10namespace cadence {
12 namespace generator { 11 namespace generator {
@@ -93,7 +92,8 @@ namespace cadence {
93 DIR* subdir; 92 DIR* subdir;
94 if ((subdir = opendir(directory.c_str())) == nullptr) 93 if ((subdir = opendir(directory.c_str())) == nullptr)
95 { 94 {
96 throw std::invalid_argument("Invalid AcousticBrainz data directory"); 95 throw std::invalid_argument(
96 "Invalid AcousticBrainz data directory");
97 } 97 }
98 98
99 struct dirent* subent; 99 struct dirent* subent;
@@ -106,7 +106,8 @@ namespace cadence {
106 DIR* subsubdir; 106 DIR* subsubdir;
107 if ((subsubdir = opendir(subdirectory.c_str())) == nullptr) 107 if ((subsubdir = opendir(subdirectory.c_str())) == nullptr)
108 { 108 {
109 throw std::invalid_argument("Invalid AcousticBrainz data directory"); 109 throw std::invalid_argument(
110 "Invalid AcousticBrainz data directory");
110 } 111 }
111 112
112 struct dirent* subsubent; 113 struct dirent* subsubent;
@@ -149,27 +150,87 @@ namespace cadence {
149 150
150 try 151 try
151 { 152 {
152 std::vector<mood> moods; 153 auto& hl = jsonData["highlevel"];
153 moods.emplace_back(mood::type::danceable, jsonData["highlevel"]["danceability"]["all"]["danceable"]); 154
154 moods.emplace_back(mood::type::acoustic, jsonData["highlevel"]["mood_acoustic"]["all"]["acoustic"]); 155 double danceable = hl["danceability"]["all"]["danceable"];
155 moods.emplace_back(mood::type::aggressive, jsonData["highlevel"]["mood_aggressive"]["all"]["aggressive"]); 156 double acoustic = hl["mood_acoustic"]["all"]["acoustic"];
156 moods.emplace_back(mood::type::electronic, jsonData["highlevel"]["mood_electronic"]["all"]["electronic"]); 157 double aggressive = hl["mood_aggressive"]["all"]["aggressive"];
157 moods.emplace_back(mood::type::happy, jsonData["highlevel"]["mood_happy"]["all"]["happy"]); 158 double electronic = hl["mood_electronic"]["all"]["electronic"];
158 moods.emplace_back(mood::type::party, jsonData["highlevel"]["mood_party"]["all"]["party"]); 159 double happy = hl["mood_happy"]["all"]["happy"];
159 moods.emplace_back(mood::type::relaxed, jsonData["highlevel"]["mood_relaxed"]["all"]["relaxed"]); 160 double party = hl["mood_party"]["all"]["party"];
160 moods.emplace_back(mood::type::sad, jsonData["highlevel"]["mood_sad"]["all"]["sad"]); 161 double relaxed = hl["mood_relaxed"]["all"]["relaxed"];
161 moods.emplace_back(mood::type::instrumental, jsonData["highlevel"]["voice_instrumental"]["all"]["instrumental"]); 162 double sad = hl["mood_sad"]["all"]["sad"];
162 163 double instrumental = hl["voice_instrumental"]["all"]["instrumental"];
163 std::sort(std::begin(moods), std::end(moods), [] (const mood& left, const mood& right) -> bool { 164
164 return left.getProbability() > right.getProbability(); 165 std::string title = jsonData["metadata"]["tags"]["title"][0];
165 }); 166 std::string artist = jsonData["metadata"]["tags"]["artist"][0];
166 167
167 std::list<hatkirby::column> columns; 168 uint64_t songId = db_.insertIntoTable(
168 columns.emplace_back("title", jsonData["metadata"]["tags"]["title"][0].get<std::string>()); 169 "songs",
169 columns.emplace_back("artist", jsonData["metadata"]["tags"]["artist"][0].get<std::string>()); 170 {
170 columns.emplace_back("category", moods.front().getCategory()); 171 { "title", title },
171 172 { "artist", artist }
172 db_.insertIntoTable("songs", std::move(columns)); 173 });
174
175 std::list<std::string> moods;
176
177 // ~38%
178 if ((party > 0.5) || (danceable > 0.75))
179 {
180 moods.push_back("party");
181 }
182
183 // ~38%
184 if ((relaxed > 0.81) || (acoustic > 0.5))
185 {
186 moods.push_back("chill");
187 }
188
189 // ~42%
190 if ((aggressive > 0.5) || (electronic > 0.95))
191 {
192 moods.push_back("crazy");
193 }
194
195 // ~30%
196 if (happy > 0.5)
197 {
198 moods.push_back("happy");
199 }
200
201 // ~30%
202 if (sad > 0.5)
203 {
204 moods.push_back("sad");
205 }
206
207 // ~38%
208 if (instrumental > 0.9)
209 {
210 moods.push_back("instrumental");
211 }
212
213 // ~34%
214 if (instrumental < 0.2)
215 {
216 moods.push_back("vocal");
217 }
218
219 // ~1%
220 if (moods.empty())
221 {
222 moods.push_back("unknown");
223 }
224
225 for (const std::string& mood : moods)
226 {
227 db_.insertIntoTable(
228 "moods",
229 {
230 { "song_id", static_cast<int>(songId) },
231 { "mood", mood }
232 });
233 }
173 } catch (const std::domain_error& ex) 234 } catch (const std::domain_error& ex)
174 { 235 {
175 // Weird data. Ignore silently. 236 // Weird data. Ignore silently.