Add json rpc method/types to support file browsing/playing

This commit is contained in:
DanhDroid 2015-03-17 19:37:16 -07:00
parent 7bed0c7d1d
commit 8c91df5bf9
7 changed files with 114 additions and 131 deletions

View File

@ -21,7 +21,8 @@ import com.fasterxml.jackson.databind.node.ObjectNode;
import org.xbmc.kore.jsonrpc.ApiException;
import org.xbmc.kore.jsonrpc.ApiMethod;
import org.xbmc.kore.jsonrpc.type.FilesType;
import org.xbmc.kore.jsonrpc.type.SortType;
import org.xbmc.kore.jsonrpc.type.ItemType;
import org.xbmc.kore.jsonrpc.type.ListType;
import java.util.ArrayList;
import java.util.List;
@ -54,17 +55,13 @@ public class Files {
return new FilesType.PrepareDownloadReturnType(jsonObject.get(RESULT_NODE));
}
}
/**
* Files.GetSources command
*/
public static final class GetSources extends ApiMethod<List<FilesType.FileLocation>> {
public static final class GetSources extends ApiMethod<List<ItemType.Source>> {
public final static String METHOD_NAME = "Files.GetSources";
public final static String LIST_NODE = "sources";
public final static String SOURCE_NODE = "sources";
/**
* Provides a way to download a given file (e.g. providing an URL to the real file location)
*/
public GetSources(String mediaType) {
super();
addParameterToRequest("media", mediaType);
@ -74,17 +71,17 @@ public class Files {
public String getMethodName() { return METHOD_NAME; }
@Override
public List<FilesType.FileLocation> resultFromJson(ObjectNode jsonObject) throws ApiException {
JsonNode resultNode = jsonObject.get(RESULT_NODE);
ArrayNode items = resultNode.has(LIST_NODE) ?
(ArrayNode)resultNode.get(LIST_NODE) : null;
public List<ItemType.Source> resultFromJson(ObjectNode jsonObject) throws ApiException {
JsonNode resultNode = jsonObject.get(RESULT_NODE);
ArrayNode items = resultNode.has(SOURCE_NODE) ?
(ArrayNode) resultNode.get(SOURCE_NODE) : null;
if (items == null) {
return new ArrayList<FilesType.FileLocation>(0);
return new ArrayList<ItemType.Source>(0);
}
ArrayList<FilesType.FileLocation> result = new ArrayList<FilesType.FileLocation>(items.size());
ArrayList<ItemType.Source> result = new ArrayList<ItemType.Source>(items.size());
for (JsonNode item : items) {
result.add(new FilesType.FileLocation(item));
result.add(new ItemType.Source(item));
}
return result;
}
@ -93,17 +90,14 @@ public class Files {
/**
* Files.GetDirectory command
*/
public static final class GetDirectory extends ApiMethod<List<FilesType.FileLocation>> {
public static final class GetDirectory extends ApiMethod<List<ListType.ItemFile>> {
public final static String METHOD_NAME = "Files.GetDirectory";
public final static String SORT_NODE = "sort";
public final static String LIST_NODE = "files";
public final static String FILE_NODE = "files";
/**
* Provides a way to download a given file (e.g. providing an URL to the real file location)
*/
public GetDirectory(String path, SortType.Sort sort_params) {
public GetDirectory(String path, ListType.Sort sort_params) {
super();
addParameterToRequest("media", LIST_NODE);
addParameterToRequest("media", FILE_NODE);
addParameterToRequest("directory", path);
addParameterToRequest(SORT_NODE, sort_params.toJsonNode());
}
@ -112,20 +106,19 @@ public class Files {
public String getMethodName() { return METHOD_NAME; }
@Override
public List<FilesType.FileLocation> resultFromJson(ObjectNode jsonObject) throws ApiException {
public List<ListType.ItemFile> resultFromJson(ObjectNode jsonObject) throws ApiException {
JsonNode resultNode = jsonObject.get(RESULT_NODE);
ArrayNode items = resultNode.has(LIST_NODE) ?
(ArrayNode)resultNode.get(LIST_NODE) : null;
ArrayNode items = resultNode.has(FILE_NODE) ?
(ArrayNode) resultNode.get(FILE_NODE) : null;
if (items == null) {
return new ArrayList<FilesType.FileLocation>(0);
return new ArrayList<ListType.ItemFile>(0);
}
ArrayList<FilesType.FileLocation> result = new ArrayList<FilesType.FileLocation>(items.size());
ArrayList<ListType.ItemFile> result = new ArrayList<ListType.ItemFile>(items.size());
for (JsonNode item : items) {
result.add(new FilesType.FileLocation(item));
result.add(new ListType.ItemFile(item));
}
return result;
}
}
}
}

View File

@ -457,19 +457,6 @@ public class Player {
addParameterToRequest("item", playlistItem.toJsonNode());
}
/**
* Start playing with the specified filename
* @param media_uri location (full path name) of the media to open
*/
public Open(String media_uri) {
super();
PlayerType.Item item = new PlayerType.Item(media_uri);
PlayerType.ResumeMode resumeMode = new PlayerType.ResumeMode(true);
addParameterToRequest("item", item.toJsonNode());
addParameterToRequest("options",resumeMode.toJsonNode());
}
/**
* Select the active player
* @param playlistId playlist ID to select

View File

@ -20,7 +20,6 @@ import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.xbmc.kore.jsonrpc.ApiException;
import org.xbmc.kore.jsonrpc.ApiMethod;
import org.xbmc.kore.jsonrpc.type.FilesType;
import org.xbmc.kore.jsonrpc.type.ListType;
import org.xbmc.kore.jsonrpc.type.PlaylistType;
import org.xbmc.kore.jsonrpc.type.PlaylistType.GetPlaylistsReturnType;
@ -163,19 +162,6 @@ public class Playlist {
addParameterToRequest("item", item);
}
/**
* Add the media specified by fl.path to the selected playlist
* @param playlistId selected playlistId
* @param fl filelocation of the media to add
*/
public Add(int playlistId, FilesType.FileLocation fl) {
super();
addParameterToRequest("playlistid", playlistId);
final ObjectNode item = objectMapper.createObjectNode();
item.put("file", fl.path);
addParameterToRequest("item", item);
}
@Override
public String getMethodName() { return METHOD_NAME; }

View File

@ -45,37 +45,4 @@ public class FilesType {
path = JsonUtils.stringFromJsonNode(details, PATH);
}
}
public static final class FileLocation {
public final static String LABEL = "label";
public final static String FILE_PATH = "file";
public final static String FILE_TYPE = "file_type";
public final static String DIRECTORY = "directory";
public final String label;
public final String path;
public final boolean isDirectory;
private boolean isRoot;
public FileLocation(JsonNode node) {
label = JsonUtils.stringFromJsonNode(node,LABEL);
path = JsonUtils.stringFromJsonNode(node,FILE_PATH);
if (node.has(FILE_TYPE)) {
isDirectory = JsonUtils.stringFromJsonNode(node,FILE_TYPE).equalsIgnoreCase(DIRECTORY);
}
else {
isDirectory = path.endsWith("/") || path.endsWith("\\");
}
}
public boolean isRootDir() { return this.isRoot; }
public void setRootDir(boolean root) { this.isRoot = root; }
public FileLocation(String label, String path, boolean isDir) {
this.label = label;
this.path = path;
this.isDirectory = isDir;
this.isRoot = false;
}
}
}

View File

@ -37,4 +37,22 @@ public class ItemType {
label = null;
}
}
/**
* Item.Details.Source
*/
public static class Source extends DetailsBase {
public static final String FILE = "file";
public final String file;
public Source(JsonNode node) {
super(node);
JsonNode fileNode = node.get(FILE);
if (fileNode != null)
file = fileNode.asText();
else
file = null;
}
}
}

View File

@ -430,5 +430,79 @@ public class ListType {
LOCKED, CHANNELNUMBER, STARTTIME, ENDTIME
};
}
public static class ItemFile extends ItemBase {
public static final String FILETYPE = "filetype";
public static final String DIRECTORY = "directory";
public final String filetype;
public ItemFile(JsonNode node) {
super(node);
filetype = JsonUtils.stringFromJsonNode(node, FILETYPE, null);
}
}
public static class Sort implements ApiParameter {
public static final String SORT_METHOD_NONE = "none";
public static final String SORT_METHOD_LABEL = "label";
public static final String SORT_METHOD_DATE = "date";
public static final String SORT_METHOD_SIZE = "size";
public static final String SORT_METHOD_FILE = "file";
public static final String SORT_METHOD_PATH = "path";
public static final String SORT_METHOD_DRIVETYPE = "drivetype";
public static final String SORT_METHOD_TYPE = "title";
public static final String SORT_METHOD_TRACK = "track";
public static final String SORT_METHOD_TIME = "time";
public static final String SORT_METHOD_ARTIST = "artist";
public static final String SORT_METHOD_ALBUM = "album";
public static final String SORT_METHOD_ALBUMTYPE = "albumtype";
public static final String SORT_METHOD_GENRE = "genre";
public static final String SORT_METHOD_COUNTRY = "country";
public static final String SORT_METHOD_YEAR = "year";
public static final String SORT_METHOD_RATING = "rating";
public static final String SORT_METHOD_VOTES = "votes";
public static final String SORT_METHOD_TOP250 = "top250";
public static final String SORT_METHOD_PROGRAMCOUNT = "programcount";
public static final String SORT_METHOD_PLAYLIST = "playlist";
public static final String SORT_METHOD_EPISODE = "episode";
public static final String SORT_METHOD_SEASON = "season";
public static final String SORT_METHOD_TOTALEPISODES = "totalepisodes";
public static final String SORT_METHOD_WATCHEDEPISODES = "watchedepisodes";
public static final String SORT_METHOD_TVSHOWSTATUS = "tvshowstatus";
public static final String SORT_METHOD_TVSHOWTITLE = "tvshowtitle";
public static final String SORT_METHOD_SORTTITLE = "sorttitle";
public static final String SORT_METHOD_PRODUCTIONCODE = "productioncode";
public static final String SORT_METHOD_MPAA = "mpaa";
public static final String SORT_METHOD_STUDIO = "studio";
public static final String SORT_METHOD_DATEADDED = "dateadded";
public static final String SORT_METHOD_LASTPLAYED = "lastplayed";
public static final String SORT_METHOD_PLAYCOUNT = "playcount";
public static final String SORT_METHOD_LISTENERS = "listeners";
public static final String SORT_METHOD_BITRATE = "bitrate";
public static final String SORT_METHOD_RANDOM = "random";
static final String METHOD = "method";
static final String IGNORE_ARTICLE = "ignorearticle";
static final String ORDER = "order";
static final String ASCENDING_ORDER = "ascending";
static final String DESCENDING_ORDER = "descending";
protected static final ObjectMapper objectMapper = new ObjectMapper();
public final boolean ignore_article;
public final boolean ascending_order;
public final String sort_method;
public Sort(String method, boolean ascending, boolean ignore_article) {
this.sort_method = method;
this.ascending_order = ascending;
this.ignore_article = ignore_article;
}
public JsonNode toJsonNode() {
final ObjectNode node = objectMapper.createObjectNode();
node.put(ORDER, ascending_order ? ASCENDING_ORDER : DESCENDING_ORDER);
node.put(IGNORE_ARTICLE, ignore_article);
node.put(METHOD, sort_method);
return node;
}
}
}

View File

@ -328,46 +328,4 @@ public class PlayerType {
public final String CYCLE = "cycle";
}
/**
* Player.Open type
*/
public static final class ResumeMode implements ApiParameter {
private static final String RESUME_MODE = "resume";
public final boolean resume_mode;
protected static final ObjectMapper objectMapper = new ObjectMapper();
public ResumeMode(boolean resume) {
this.resume_mode = resume;
}
public JsonNode toJsonNode() {
final ObjectNode node = objectMapper.createObjectNode();
node.put(RESUME_MODE, resume_mode);
return node;
}
}
/**
* PlayerType.Item
*/
public static class Item implements ApiParameter {
protected static final ObjectMapper objectMapper = new ObjectMapper();
public final String uri;
/**
* Constructors
*/
public Item(String uri) {
this.uri = uri;
}
@Override
public JsonNode toJsonNode() {
final ObjectNode node = objectMapper.createObjectNode();
node.put("file", uri);
return node;
}
}
}