Kore/app/src/debug/java/org/xbmc/kore/testutils/tcpserver/handlers/jsonrpc/response/methods/Player.java

483 lines
18 KiB
Java

/*
* Copyright 2016 Martijn Brekhof. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.xbmc.kore.testutils.tcpserver.handlers.jsonrpc.response.methods;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.xbmc.kore.jsonrpc.type.GlobalType;
import org.xbmc.kore.jsonrpc.type.PlayerType;
import org.xbmc.kore.testutils.tcpserver.handlers.jsonrpc.JsonResponse;
import org.xbmc.kore.testutils.tcpserver.handlers.jsonrpc.JsonUtils;
import org.xbmc.kore.testutils.tcpserver.handlers.jsonrpc.nodes.AudioDetailsNode;
import org.xbmc.kore.testutils.tcpserver.handlers.jsonrpc.nodes.SubtitleDetailsNode;
import org.xbmc.kore.testutils.tcpserver.handlers.jsonrpc.nodes.VideoDetailsNode;
import org.xbmc.kore.utils.LogUtils;
/**
* Serverside JSON RPC responses in Methods.Player.*
*/
public class Player {
/**
* JSON response for Player.Seek request
*
* Example:
* Query: {"jsonrpc":"2.0","method":"Player.Seek","id":41,"params":{"playerid":0,"value":{"hours":0,"milliseconds":0,"minutes":0,"seconds":2}}}
* Answer: {"id":41,"jsonrpc":"2.0","result":{"percentage":16.570009231567382812,"time":{"hours":0,"milliseconds":0,"minutes":0,"seconds":2},"totaltime":{"hours":0,"milliseconds":70,"minutes":0,"seconds":12}}}
*
* @return JSON string
*/
public static class Seek extends JsonResponse {
public final static String METHOD_NAME = "Player.Seek";
public Seek(int methodId, double percentage, long timeSec, long totalTime) {
super(methodId);
ObjectNode resultNode = (ObjectNode) getResultNode(TYPE.OBJECT);
resultNode.put("percentage", percentage);
resultNode.set("time", JsonUtils.createTimeNode(createObjectNode(), timeSec));
resultNode.set("totalTime", JsonUtils.createTimeNode(createObjectNode(), totalTime));
}
}
public static class SetShuffle extends JsonResponse {
public final static String METHOD_NAME = "Player.SetShuffle";
public SetShuffle(int methodId, String result) {
super(methodId);
setResultToResponse(result);
}
}
public static class SetRepeat extends JsonResponse {
public final static String METHOD_NAME = "Player.SetRepeat";
public SetRepeat(int methodId, String result) {
super(methodId);
setResultToResponse(result);
}
}
public static class PlayPause extends JsonResponse {
public final static String METHOD_NAME = "Player.PlayPause";
public PlayPause(int methodId, int speed) {
super(methodId);
((ObjectNode) getResultNode(TYPE.OBJECT)).put("speed", speed);
}
}
public static class GetActivePlayers extends JsonResponse {
public final static String METHOD_NAME = "Player.GetActivePlayers";
public GetActivePlayers(int methodId, int playerId, String type) {
super(methodId);
ObjectNode objectNode = createObjectNode();
objectNode.put("playerid", playerId);
objectNode.put("type", type);
((ArrayNode) getResultNode(TYPE.ARRAY)).add(objectNode);
}
}
public static class GetProperties extends JsonResponse {
public final static String METHOD_NAME = "Player.GetProperties";
final static String SPEED = PlayerType.PropertyName.SPEED;
final static String PERCENTAGE = PlayerType.PropertyName.PERCENTAGE;
final static String POSITION = PlayerType.PropertyName.POSITION;
final static String TIME = PlayerType.PropertyName.TIME;
final static String TOTALTIME = PlayerType.PropertyName.TOTALTIME;
final static String REPEAT = PlayerType.PropertyName.REPEAT;
final static String SHUFFLED = PlayerType.PropertyName.SHUFFLED;
final static String CURRENTAUDIOSTREAM = PlayerType.PropertyName.CURRENTAUDIOSTREAM;
final static String CURRENTSUBTITLE = PlayerType.PropertyName.CURRENTSUBTITLE;
final static String AUDIOSTREAMS = PlayerType.PropertyName.AUDIOSTREAMS;
final static String SUBTITLES = PlayerType.PropertyName.SUBTITLES;
final static String PLAYLISTID = PlayerType.PropertyName.PLAYLISTID;
public GetProperties(int methodId) {
super(methodId);
}
public void addSpeed(int value) {
((ObjectNode) getResultNode(TYPE.OBJECT)).put(SPEED, value);
}
public void addPercentage(int value) {
((ObjectNode) getResultNode(TYPE.OBJECT)).put(PERCENTAGE, value);
}
public void addPosition(int value) {
((ObjectNode) getResultNode(TYPE.OBJECT)).put(POSITION, value);
}
public void addTime(int hours, int minutes, int seconds, int milliseconds) {
ObjectNode timeNode = JsonUtils.createTimeNode(createObjectNode(), hours, minutes, seconds, milliseconds);
((ObjectNode) getResultNode(TYPE.OBJECT)).putObject(TIME).setAll(timeNode);
}
public void addTotaltime(int hours, int minutes, int seconds, int milliseconds) {
ObjectNode timeNode = JsonUtils.createTimeNode(createObjectNode(), hours, minutes, seconds, milliseconds);
((ObjectNode) getResultNode(TYPE.OBJECT)).putObject(TOTALTIME).setAll(timeNode);
}
public void addRepeat(String value) {
((ObjectNode) getResultNode(TYPE.OBJECT)).put(REPEAT, value);
}
public void addShuffled(boolean value) {
((ObjectNode) getResultNode(TYPE.OBJECT)).put(SHUFFLED, value);
}
public void addCurrentAudioStream(int channels, String codec, int bitrate) {
ObjectNode objectNode = createAudioStreamNode(channels, codec, bitrate);
((ObjectNode) getResultNode(TYPE.OBJECT)).putObject(CURRENTAUDIOSTREAM).setAll(objectNode);
}
public void addCurrentSubtitle(int index, String language, String name) {
ObjectNode objectNode = createSubtitleNode(index, language, name);
((ObjectNode) getResultNode(TYPE.OBJECT)).putObject(CURRENTSUBTITLE).setAll(objectNode);
}
public void addAudioStream(int channels, String codec, int bitrate) {
ObjectNode objectNode = createAudioStreamNode(channels, codec, bitrate);
addObjectToArray(AUDIOSTREAMS, objectNode);
}
public void addSubtitle(int index, String language, String name) {
ObjectNode objectNode = createSubtitleNode(index, language, name);
addObjectToArray(SUBTITLES, objectNode);
}
public void addPlaylistId(int value) {
((ObjectNode) getResultNode(TYPE.OBJECT)).put(PLAYLISTID, value);
}
private ObjectNode createAudioStreamNode(int channels, String codec, int bitrate) {
ObjectNode audioNode = createObjectNode();
audioNode.put("channels", channels);
audioNode.put("codec", codec);
audioNode.put("bitrate", bitrate);
return audioNode;
}
private ObjectNode createSubtitleNode(int index, String language, String name) {
ObjectNode subtitleNode = createObjectNode();
subtitleNode.put("index", index);
subtitleNode.put("language", language);
subtitleNode.put("name", name);
return subtitleNode;
}
private void addObjectToArray(String key, ObjectNode objectNode) {
ObjectNode resultNode = (ObjectNode) getResultNode(TYPE.OBJECT);
JsonNode jsonNode = resultNode.get(key);
if(jsonNode == null) {
ArrayNode arrayNode = createArrayNode().add(objectNode);
resultNode.set(key, arrayNode);
} else if(jsonNode.isArray()) {
((ArrayNode) jsonNode).add(objectNode);
} else {
LogUtils.LOGW("Player", "JsonNode at " + key + " is not of type ArrayNode");
}
}
}
public static class GetItem extends JsonResponse {
public final static String METHOD_NAME = "Player.GetItem";
final static String ITEM = "item";
final static String TYPE = "type";
final static String ART = "art";
final static String ARTIST = "artist";
final static String ALBUMARTIST = "albumartist";
final static String ALBUM = "album";
final static String CAST = "cast";
final static String DIRECTOR = "director";
final static String DISPLAYARTIST = "displayartist";
final static String DURATION = "duration";
final static String EPISODE = "episode";
final static String FANART = "fanart";
final static String FILE = "file";
final static String FIRSTAIRED = "firstaired";
final static String GENRE = "genre";
final static String IMDBNUMBER = "imdbnumber";
final static String PLOT = "plot";
final static String PREMIERED = "premiered";
final static String RATING = "rating";
final static String RESUME = "resume";
final static String RUNTIME = "runtime";
final static String SEASON = "season";
final static String SHOWTITLE = "showtitle";
final static String STREAMDETAILS = "streamdetails";
final static String STUDIO = "studio";
final static String TAGLINE = "tagline";
final static String THUMBNAIL = "thumbnail";
final static String TITLE = "title";
final static String TOP250 = "top250";
final static String TRACK = "track";
final static String VOTES = "votes";
final static String WRITER = "writer";
final static String YEAR = "year";
final static String DESCRIPTION = "description";
final static String LABEL = "label";
public enum TYPE { UNKNOWN,
MOVIE,
EPISODE,
MUSICVIDEO,
SONG,
PICTURE,
CHANNEL
}
private ObjectNode itemNode;
public GetItem() {
super();
ObjectNode resultNode = ((ObjectNode) getResultNode(JsonResponse.TYPE.OBJECT));
itemNode = createObjectNode();
resultNode.set(ITEM, itemNode);
}
public GetItem(int methodId) {
super(methodId);
ObjectNode resultNode = ((ObjectNode) getResultNode(JsonResponse.TYPE.OBJECT));
itemNode = createObjectNode();
resultNode.set(ITEM, itemNode);
}
public void setMethodId(int methodId) {
getResponseNode().put(ID_NODE, methodId);
}
public void addType(TYPE type) {
String strType;
switch (type) {
case MOVIE:
strType = "movie";
break;
case EPISODE:
strType = "episode";
break;
case MUSICVIDEO:
strType = "musicvideo";
break;
case SONG:
strType = "song";
break;
case PICTURE:
strType = "picture";
break;
case CHANNEL:
strType = "channel";
break;
case UNKNOWN:
default:
strType = "unknown";
break;
}
itemNode.put(TYPE, strType);
}
public void addArt(String banner, String poster, String fanart, String thumbnail) {
ObjectNode objectNode = createArtNode(banner, poster, fanart, thumbnail);
itemNode.putObject(ART).setAll(objectNode);
}
public void addArtist(String artist) {
addToArrayNode(itemNode, ARTIST, artist);
}
public void addAlbumArtist(String artist) {
addToArrayNode(itemNode, ALBUMARTIST, artist);
}
public void addAlbum(String album) {
itemNode.put(ALBUM, album);
}
public void addCast(String thumbnail, String name, String role) {
addToArrayNode(itemNode, CAST, createCastNode(thumbnail, name, role));
}
public void addDirector(String director) {
addToArrayNode(itemNode, DIRECTOR, director);
}
public void addDisplayartist(String displayartist) {
itemNode.put(DISPLAYARTIST, displayartist);
}
public void addDuration(int duration) {
itemNode.put(DURATION, duration);
}
public void addEpisode(int episode) {
itemNode.put(EPISODE, episode);
}
public void addFanart(String fanart) {
itemNode.put(FANART, fanart);
}
public void addFile(String file) {
itemNode.put(FILE, file);
}
public void addFirstaired(String firstaired) {
itemNode.put(FIRSTAIRED, firstaired);
}
public void addGenre(String genre) {
itemNode.put(GENRE, genre);
}
public void addImdbnumber(String imdbnumber) {
itemNode.put(IMDBNUMBER, imdbnumber);
}
public void addPlot(String plot) {
itemNode.put(PLOT, plot);
}
public void addPremiered(String premiered) {
itemNode.put(PREMIERED, premiered);
}
public void addRating(int rating) {
itemNode.put(RATING, rating);
}
public void addResume(int position, int total) {
itemNode.putObject(RESUME).setAll(createResumeNode(position, total));
}
public void addRuntime(int runtime) {
itemNode.put(RUNTIME, runtime);
}
public void addSeason(int season) {
itemNode.put(SEASON, season);
}
public void addShowtitle(String showtitle) {
itemNode.put(SHOWTITLE, showtitle);
}
public void addStreamdetails(AudioDetailsNode audioDetailsNode,
VideoDetailsNode videoDetailsNode,
SubtitleDetailsNode subtitleDetailsNode) {
ObjectNode objectNode = createObjectNode();
objectNode.putObject("audio").setAll(audioDetailsNode.getResponseNode());
objectNode.putObject("video").setAll(videoDetailsNode.getResponseNode());
objectNode.putObject("subtitle").setAll(subtitleDetailsNode.getResponseNode());
itemNode.set(STREAMDETAILS, objectNode);
}
public void addStudio(String studio) {
addToArrayNode(itemNode, STUDIO, studio);
}
public void addTagline(String tagline) {
itemNode.put(TAGLINE, tagline);
}
public void addThumbnail(String thumbnail) {
itemNode.put(THUMBNAIL, thumbnail);
}
public void addTitle(String title) {
itemNode.put(TITLE, title);
}
public String getTitle() {
JsonNode jsonNode = itemNode.get(TITLE);
if (jsonNode != null)
return jsonNode.asText();
else
return null;
}
public void addTop250(int top250) {
itemNode.put(TOP250, top250);
}
public void addTrack(int track) {
itemNode.put(TRACK, track);
}
public void addVotes(String votes) {
itemNode.put(VOTES, votes);
}
public void addWriter(String writer) {
addToArrayNode(itemNode, WRITER, writer);
}
public void addYear(int year) {
itemNode.put(YEAR, year);
}
public void addDescription(String description) {
itemNode.put(DESCRIPTION, description);
}
public void addLabel(String label) {
itemNode.put(LABEL, label);
}
private ObjectNode createArtNode(String banner,
String poster,
String fanart,
String thumbnail) {
ObjectNode objectNode = createObjectNode();
objectNode.put("poster", poster);
objectNode.put("fanart", fanart);
objectNode.put("thumbnail", thumbnail);
objectNode.put("banner", banner);
return objectNode;
}
private ObjectNode createArtworkNode(String banner, String poster, String fanart, String thumbnail) {
ObjectNode objectNode = createObjectNode();
objectNode.put("poster", poster);
objectNode.put("fanart", fanart);
objectNode.put("thumbnail", thumbnail);
return objectNode;
}
private ObjectNode createCastNode(String thumbnail, String name, String role) {
ObjectNode objectNode = createObjectNode();
objectNode.put("thumbnail", thumbnail);
objectNode.put("name", name);
objectNode.put("role", role);
return objectNode;
}
private ObjectNode createResumeNode(int position, int total) {
ObjectNode objectNode = createObjectNode();
objectNode.put("position", position);
objectNode.put("total", total);
return objectNode;
}
}
}