110 lines
2.7 KiB
Java

package me.mrletsplay.videobase.library;
import java.util.Map;
import java.util.Objects;
import me.mrletsplay.mrcore.json.JSONObject;
import me.mrletsplay.mrcore.json.JSONType;
import me.mrletsplay.mrcore.json.converter.JSONConstructor;
import me.mrletsplay.mrcore.json.converter.JSONConvertible;
import me.mrletsplay.simplehttpserver.http.validation.JsonObjectValidator;
public class VideoMetadata implements JSONConvertible {
public static final String
FIELD_SERIES = "series",
FIELD_TITLE = "title",
FIELD_AUTHOR = "author",
FIELD_INDEX = "index";
public static final String
DEFAULT_SERIES = "Unnamed Series",
DEFAULT_TITLE = "Unnamed Video",
DEFAULT_AUTHOR = "Unnamed Author";
public static final int
DEFAULT_INDEX = 0;
public static final VideoMetadata DEFAULT_METADATA = new VideoMetadata(new JSONObject(Map.of(
FIELD_SERIES, DEFAULT_SERIES,
FIELD_TITLE, DEFAULT_TITLE,
FIELD_AUTHOR, DEFAULT_AUTHOR,
FIELD_INDEX, DEFAULT_INDEX
)));
public static final JsonObjectValidator VALIDATOR = new JsonObjectValidator()
.optional(FIELD_SERIES, JSONType.STRING)
.optional(FIELD_TITLE, JSONType.STRING)
.optional(FIELD_AUTHOR, JSONType.STRING)
.optional(FIELD_INDEX, JSONType.INTEGER);
private JSONObject metadata;
@JSONConstructor
private VideoMetadata() {}
public VideoMetadata(JSONObject metadata) {
Objects.requireNonNull(metadata, "metadata");
this.metadata = metadata;
}
public String getSeries() {
return metadata.optString(FIELD_SERIES).orElse(null);
}
public String getTitle() {
return metadata.optString(FIELD_TITLE).orElse(null);
}
public String getAuthor() {
return metadata.optString(FIELD_AUTHOR).orElse(null);
}
public Integer getIndex() {
return metadata.optInt(FIELD_INDEX).orElse(null);
}
public JSONObject getRaw() {
return new JSONObject(metadata);
}
@Override
public void preDeserialize(JSONObject object) {
this.metadata = object;
}
@Override
public void preSerialize(JSONObject object) {
for(String key : metadata.keys()) {
object.set(key, metadata.get(key));
}
}
@Override
public String toString() {
return metadata.toString();
}
public static VideoMetadata inherit(VideoMetadata parent, VideoMetadata child) {
if(parent == null) return child;
if(child == null) return parent;
JSONObject meta = new JSONObject(parent == null ? null : parent.metadata);
for(String key : child.metadata.keys()) {
Object value = child.metadata.get(key);
if(value == null) { // Setting to null resets to default value if available, otherwise removes attribute
value = DEFAULT_METADATA.metadata.opt(key).orElse(null);
if(value == null) {
meta.remove(key);
continue;
}
}
meta.set(key, value);
}
return new VideoMetadata(meta);
}
}