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); } }