Kore/app/src/debug/java/org/xbmc/kore/testutils/tcpserver/handlers/PlayerHandler.java

373 lines
14 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;
import com.fasterxml.jackson.databind.JsonNode;
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.response.methods.Player;
import org.xbmc.kore.testutils.tcpserver.handlers.jsonrpc.response.notifications.Player.OnPause;
import org.xbmc.kore.testutils.tcpserver.handlers.jsonrpc.response.notifications.Player.OnPlay;
import org.xbmc.kore.testutils.tcpserver.handlers.jsonrpc.response.notifications.Player.OnPropertyChanged;
import org.xbmc.kore.testutils.tcpserver.handlers.jsonrpc.response.notifications.Player.OnSeek;
import org.xbmc.kore.testutils.tcpserver.handlers.jsonrpc.response.notifications.Player.OnSpeedChanged;
import org.xbmc.kore.utils.LogUtils;
import java.util.ArrayList;
import static org.xbmc.kore.testutils.tcpserver.handlers.PlayerHandler.TYPE.MUSIC;
/**
* Simulates Player JSON-RPC API
*/
public class PlayerHandler implements JSONConnectionHandlerManager.ConnectionHandler {
private static final String TAG = LogUtils.makeLogTag(PlayerHandler.class);
public enum TYPE {
MUSIC,
MOVIE,
EPISODE,
MUSICVIDEO,
UNKNOWN,
PICTURE,
CHANNEL
}
public static String[] repeatModes = {
"off",
"one",
"all"
};
private int currentRepeatMode;
private boolean shuffled;
private boolean playing;
private int position;
private long totalTimeSec = 240; // default value
private TYPE mediaType = MUSIC;
private Player.GetItem mediaItem = createSongItem();
private String playerType = PlayerType.GetActivePlayersReturnType.AUDIO;
private ArrayList<JsonResponse> notifications = new ArrayList<>();
@Override
public ArrayList<JsonResponse> getNotifications() {
ArrayList<JsonResponse> list = new ArrayList<>(notifications);
notifications.clear();
return list;
}
@Override
public void reset() {
this.shuffled = false;
this.currentRepeatMode = 0;
this.position = 0;
this.playing = false;
setMediaType(MUSIC);
}
@Override
public String[] getType() {
return new String[] {Player.GetActivePlayers.METHOD_NAME,
Player.GetProperties.METHOD_NAME,
Player.GetItem.METHOD_NAME,
Player.SetRepeat.METHOD_NAME,
Player.SetShuffle.METHOD_NAME,
Player.Seek.METHOD_NAME,
Player.PlayPause.METHOD_NAME};
}
@Override
public ArrayList<JsonResponse> getResponse(String method, ObjectNode jsonRequest) {
LogUtils.LOGD(TAG, "getResponse: method="+method);
ArrayList<JsonResponse> jsonResponses = new ArrayList<>();
JsonNode node = jsonRequest.get("id");
JsonResponse response = null;
int playerId;
switch (method) {
case Player.GetActivePlayers.METHOD_NAME:
response = new Player.GetActivePlayers(node.asInt(), 0, playerType);
break;
case Player.GetProperties.METHOD_NAME:
response = updatePlayerProperties(createPlayerProperties(node.asInt()));
break;
case Player.GetItem.METHOD_NAME:
mediaItem.setMethodId(node.asInt());
response = mediaItem;
break;
case Player.SetRepeat.METHOD_NAME:
response = new Player.SetRepeat(node.asInt(), "OK");
playerId = jsonRequest.get("params").get("playerid").asInt();
currentRepeatMode = ++currentRepeatMode % 3;
notifications.add(new OnPropertyChanged(repeatModes[currentRepeatMode], null, playerId));
break;
case Player.SetShuffle.METHOD_NAME:
response = new Player.SetShuffle(node.asInt(), "OK");
playerId = jsonRequest.get("params").get("playerid").asInt();
shuffled = !shuffled;
notifications.add(new OnPropertyChanged(null, shuffled, playerId));
break;
case Player.PlayPause.METHOD_NAME:
playing = !playing;
int speed = playing ? 1 : 0;
response = new Player.PlayPause(node.asInt(), speed);
playerId = jsonRequest.get("params").get("playerid").asInt();
if (playing)
notifications.add(new OnPlay(1580, getMediaItemType(), playerId, speed));
else
notifications.add(new OnPause(1580, getMediaItemType(), playerId, speed));
notifications.add(new OnSpeedChanged(1580, getMediaItemType(), playerId, speed));
break;
case Player.Seek.METHOD_NAME:
position = new GlobalType.Time(jsonRequest.get("params").get("value")).ToSeconds();
response = new Player.Seek(node.asInt(), (100 * position) / (double) totalTimeSec, position,
totalTimeSec);
playerId = jsonRequest.get("params").get("playerid").asInt();
notifications.add(new OnSeek(node.asInt(), getMediaItemType(), playerId,
playing ? 1 : 0, 0, position));
break;
}
jsonResponses.add(response);
return jsonResponses;
}
/**
* Sets the returned media type
* @param mediaType
*/
public void setMediaType(TYPE mediaType) {
switch (mediaType) {
case MOVIE:
mediaItem = createMovieItem();
playerType = PlayerType.GetActivePlayersReturnType.VIDEO;
break;
case MUSIC:
mediaItem = createSongItem();
playerType = PlayerType.GetActivePlayersReturnType.AUDIO;
break;
case UNKNOWN:
mediaItem = createUnknownItem();
playerType = PlayerType.GetActivePlayersReturnType.AUDIO;
break;
case MUSICVIDEO:
mediaItem = createMusicVideoItem();
playerType = PlayerType.GetActivePlayersReturnType.VIDEO;
break;
case PICTURE:
mediaItem = createPictureItem();
playerType = PlayerType.GetActivePlayersReturnType.PICTURE;
break;
case CHANNEL:
mediaItem = createChannelItem();
playerType = PlayerType.GetActivePlayersReturnType.VIDEO;
break;
}
}
public void startPlay() {
OnPlay onPlay = new OnPlay(1580, getMediaItemType(), 0, 1);
notifications.add(onPlay);
playing = true;
}
/**
* Returns the current media item for the media type set through {@link #setMediaType(TYPE)}
* @return
*/
public Player.GetItem getMediaItem() {
return mediaItem;
}
/**
* Returns the play position of the current media item
* @return the time elapsed in seconds
*/
public long getPosition() {
return position;
}
public boolean isPlaying() {
return playing;
}
public void setTotalTimeSec(long totalTimeSec) {
this.totalTimeSec = totalTimeSec;
}
private String getMediaItemType() {
switch (mediaType) {
case MOVIE:
return OnPlay.TYPE_MOVIE;
case MUSIC:
return OnPlay.TYPE_SONG;
case UNKNOWN:
return OnPlay.TYPE_UNKNOWN;
case MUSICVIDEO:
return OnPlay.TYPE_MUSICVIDEO;
case PICTURE:
return OnPlay.TYPE_PICTURE;
case CHANNEL:
return OnPlay.TYPE_MOVIE;
default:
return OnPlay.TYPE_SONG;
}
}
private Player.GetProperties updatePlayerProperties(Player.GetProperties playerProperties) {
if (playing)
position++;
if ( ( position > totalTimeSec ) && currentRepeatMode != 0 )
position = 0;
playerProperties.addPosition(position);
playerProperties.addPercentage((int) ((position * 100 ) / totalTimeSec));
playerProperties.addTime(0, 0, position, 767);
playerProperties.addShuffled(shuffled);
playerProperties.addRepeat(repeatModes[currentRepeatMode]);
return playerProperties;
}
private Player.GetProperties createPlayerProperties(int id) {
Player.GetProperties properties = new Player.GetProperties(id);
properties.addPlaylistId(0);
properties.addRepeat(repeatModes[currentRepeatMode]);
properties.addShuffled(false);
properties.addSpeed(playing ? 1 : 0);
properties.addTotaltime(0,0,240,41);
return properties;
}
private Player.GetItem createSongItem() {
Player.GetItem item = new Player.GetItem();
item.addAlbum("My Time Is The Right Time");
item.addAlbumArtist("Alton Ellis");
item.addArtist("Alton Ellis");
item.addDisplayartist("Alton Ellis");
item.addDuration(240);
item.addFile("/Users/martijn/Projects/dummymediafiles/media/music/Alton Ellis/My Time Is The Right Time/11-I Can't Stand It.mp3");
item.addGenre("Reggae");
item.addLabel("I Can't Stand It");
item.addRating(0);
item.addTitle("I Can't Stand It");
item.addTrack(11);
item.addType(Player.GetItem.TYPE.SONG);
item.addYear(2000);
return item;
}
private Player.GetItem createMovieItem() {
Player.GetItem item = new Player.GetItem();
item.addTitle("Elephants Dream");
item.addCast("", "Cas Jansen", "Emo");
item.addCast("", "Tygo Gernandt", "Proog");
item.addDuration(660);
item.addFile("/Users/martijn/Projects/dummymediafiles/media/movies/Elephants Dream (2006).mp4");
item.addGenre("Animation");
item.addRating(0);
item.addType(Player.GetItem.TYPE.MOVIE);
item.addYear(2006);
return item;
}
private Player.GetItem createEpisodeItem() {
Player.GetItem item = new Player.GetItem();
item.addShowtitle("According to Jim");
item.addCast("image://http%3a%2f%2fthetvdb.com%2fbanners%2factors%2f41995.jpg/", "James Belushi", "Jim");
item.addCast("image://http%3a%2f%2fthetvdb.com%2fbanners%2factors%2f41994.jpg/", "Courtney Thorne-Smith", "Cheryl");
item.addDuration(1800);
item.addFile("/Users/martijn/Projects/dummymediafiles/media/movies/Elephants Dream (2006).mp4");
item.addGenre("Comedy");
item.addRating(7);
item.addType(Player.GetItem.TYPE.EPISODE);
item.addFirstaired("2001-10-03");
item.addEpisode(1);
item.addSeason(1);
item.addDirector("Andy Cadiff");
item.addTitle("Pilot");
return item;
}
private Player.GetItem createMusicVideoItem() {
Player.GetItem item = new Player.GetItem();
item.addType(Player.GetItem.TYPE.MUSICVIDEO);
item.addAlbum("...Baby One More Time");
item.addDirector("Nigel Dick");
item.addThumbnail("image://http%3a%2f%2fwww.theaudiodb.com%2fimages%2fmedia%2falbum%2fthumb%2fbaby-one-more-time-4dcff7453745a.jpg/");
item.addYear(1999);
item.addTitle("(You Drive Me) Crazy");
item.addLabel("(You Drive Me) Crazy");
item.addRuntime(12);
item.addGenre("Pop");
item.addPremiered("1999-01-01");
return item;
}
private Player.GetItem createChannelItem() {
Player.GetItem item = new Player.GetItem();
item.addShowtitle("According to Jim");
item.addCast("image://http%3a%2f%2fthetvdb.com%2fbanners%2factors%2f41995.jpg/", "James Belushi", "Jim");
item.addCast("image://http%3a%2f%2fthetvdb.com%2fbanners%2factors%2f41994.jpg/", "Courtney Thorne-Smith", "Cheryl");
item.addDuration(1800);
item.addFile("/Users/martijn/Projects/dummymediafiles/media/movies/Elephants Dream (2006).mp4");
item.addGenre("Comedy");
item.addRating(7);
item.addType(Player.GetItem.TYPE.EPISODE);
item.addFirstaired("2001-10-03");
item.addEpisode(1);
item.addSeason(1);
item.addDirector("Andy Cadiff");
item.addTitle("Pilot");
item.addType(Player.GetItem.TYPE.CHANNEL);
return item;
}
private Player.GetItem createUnknownItem() {
Player.GetItem item = new Player.GetItem();
item.addTitle("Dumpert");
item.addCast("", "Martijn Kaiser", "himself");
item.addCast("", "", "Skipmode A1");
item.addCast("", "", "Sparkline");
item.addGenre("Addon");
item.addType(Player.GetItem.TYPE.UNKNOWN);
return item;
}
private Player.GetItem createPictureItem() {
Player.GetItem item = new Player.GetItem();
item.addTitle("Kore Artwork");
item.addFile("/Users/martijn/Projects/Kore/art/screenshots/Kore_Artwork_Concept_2.png");
item.addType(Player.GetItem.TYPE.PICTURE);
return item;
}
}