/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package moe.nekojimi.chords; import com.amihaiemil.eoyaml.Yaml; import com.amihaiemil.eoyaml.YamlMapping; import java.util.Objects; import javax.json.JsonObject; /** * * @author jimj316 */ class Format { private final String code; private final String extension; private final String resolution; private final String note; private long size = -1; private int samplerate = -1; private boolean audioOnly = false; public Format(String code, String extension, String resolution, String note) { this.code = code; this.extension = extension; this.resolution = resolution; this.note = note; } /** * Read format info from a youtube-dl JSON response. * * @param object the JSON object from youtube-dl. * @return a new Format object if the JSON is valid, or null if not. */ public static Format fromJSON(JsonObject object) { String code = object.getString("format_id"); String ext = object.getString("ext"); // String res = object.getString() String res = object.getString("format"); String note = ""; Format ret = new Format(code, ext, res, note); int asr = object.getInt("asr", -1); int size = object.getInt("filesize", -1); ret.setSampleRate(asr); ret.setSize(size); return ret; } public static Format fromYaml(YamlMapping yaml) { Format format = new Format( yaml.string("code"), yaml.string("extension"), yaml.string("resolution"), yaml.string("note")); return format; } public YamlMapping toYaml() { return Yaml.createYamlMappingBuilder() .add("code", code) .add("extension", extension) .add("resolution", resolution) .add("note", note) .build(); } public boolean isAudioOnly() { if (audioOnly) return true; return resolution.trim().toLowerCase().contains("audio only") || note.trim().toLowerCase().contains("tiny"); } public void setAudioOnly(boolean audioOnly) { this.audioOnly = audioOnly; } public long getSize() { if (size != -1) return size; // try to find eg. "1.32MiB" inside note long size = Util.parseSize(note); return size; } public int getSampleRate() { if (samplerate != -1) return samplerate; // try to find eg. "51k" inside note return Util.parseSampleRate(note); } public void setSampleRate(int samplerate) { this.samplerate = samplerate; } public void setSize(long size) { this.size = size; } public String getCode() { return code; } public String getExtension() { return extension; } public String getResolution() { return resolution; } public String getNote() { return note; } @Override public String toString() { return "Format{" + "code=" + code + ", extension=" + extension + ", resolution=" + resolution + ", note=" + note + '}'; } @Override public int hashCode() { int hash = 7; hash = 97 * hash + Objects.hashCode(this.extension); hash = 97 * hash + Objects.hashCode(this.resolution); hash = 97 * hash + (int) (this.size ^ (this.size >>> 32)); hash = 97 * hash + this.samplerate; hash = 97 * hash + (this.audioOnly ? 1 : 0); return hash; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; final Format other = (Format) obj; if (this.size != other.size) return false; if (this.samplerate != other.samplerate) return false; if (this.audioOnly != other.audioOnly) return false; if (!Objects.equals(this.code, other.code)) return false; if (!Objects.equals(this.extension, other.extension)) return false; if (!Objects.equals(this.resolution, other.resolution)) return false; return true; } }