2025-02-09 23:51:04 +01:00
|
|
|
package me.mrletsplay.videobase.library;
|
|
|
|
|
|
|
|
import java.util.Map;
|
|
|
|
import java.util.Objects;
|
|
|
|
|
|
|
|
import me.mrletsplay.mrcore.json.JSONObject;
|
2025-02-10 22:56:55 +01:00
|
|
|
import me.mrletsplay.mrcore.json.JSONType;
|
2025-02-09 23:51:04 +01:00
|
|
|
import me.mrletsplay.mrcore.json.converter.JSONConstructor;
|
|
|
|
import me.mrletsplay.mrcore.json.converter.JSONConvertible;
|
2025-02-10 22:56:55 +01:00
|
|
|
import me.mrletsplay.simplehttpserver.http.validation.JsonObjectValidator;
|
2025-02-09 23:51:04 +01:00
|
|
|
|
|
|
|
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
|
|
|
|
)));
|
|
|
|
|
2025-02-10 22:56:55 +01:00
|
|
|
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);
|
|
|
|
|
2025-02-09 23:51:04 +01:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
2025-02-10 22:56:55 +01:00
|
|
|
public JSONObject getRaw() {
|
|
|
|
return new JSONObject(metadata);
|
|
|
|
}
|
|
|
|
|
2025-02-09 23:51:04 +01:00
|
|
|
@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()) {
|
2025-02-10 22:56:55 +01:00
|
|
|
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);
|
2025-02-09 23:51:04 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return new VideoMetadata(meta);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|