483 lines
18 KiB
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;
|
|
}
|
|
}
|
|
}
|