package org.xbmc.jsonrpc.client;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Iterator;
import org.codehaus.jackson.JsonNode;
import org.xbmc.api.business.INotifiableManager;
import org.xbmc.api.data.IInfoClient;
import org.xbmc.api.object.FileLocation;
import org.xbmc.api.object.Host;
import org.xbmc.api.type.DirectoryMask;
import org.xbmc.api.type.MediaType;
import org.xbmc.api.type.SortType;
import org.xbmc.jsonrpc.Connection;
/**
* The InfoClient basically takes care of everything else not covered by the
* other clients (music, video and control). That means its tasks are bound to
* system related stuff like directory listing and so on.
*
* @author Team XBMC
*/
public class InfoClient extends Client implements IInfoClient {
/**
* Class constructor needs reference to HTTP client connection
* @param connection
*/
public InfoClient(Connection connection) {
super(connection);
}
/**
* Updates host info on the connection.
* @param host
*/
public void setHost(Host host) {
mConnection.setHost(host);
}
/**
* Returns the contents of a directory
* @param path Path to the directory
* @param mask Mask to filter
* @param offset Offset (0 for none)
* @param limit Limit (0 for none)
* @return
*/
public ArrayList<FileLocation> getDirectory(INotifiableManager manager, String path, DirectoryMask mask, int offset, int limit, final int mMediaType) {
final ArrayList<FileLocation> dirs = new ArrayList<FileLocation>();
final JsonNode jsonDirs = mConnection.getJson(manager, "Files.GetDirectory", sort(obj().p("media", "files").p("directory", path), SortType.ALBUM, "descending"), "files");
for (Iterator<JsonNode> i = jsonDirs.getElements(); i.hasNext();) {
JsonNode jsonDir = (JsonNode)i.next();
dirs.add(new FileLocation(getString(jsonDir, "label"), getString(jsonDir, "file")));
}
return dirs;
}
/**
* Returns all the contents of a directory
* @param path Path to the directory
* @return
*/
public ArrayList<FileLocation> getDirectory(INotifiableManager manager, String path, int mMediaType) {
return getDirectory(manager, path, null, 0, 0, mMediaType);
}
/**
* Returns all defined shares of a media type
* @param mediaType Media type
* @return
*/
public ArrayList<FileLocation> getShares(INotifiableManager manager, int mediaType) {
final ArrayList<FileLocation> shares = new ArrayList<FileLocation>();
final JsonNode jsonShares = mConnection.getJson(manager, "Files.GetSources", obj().p("media", MediaType.getName(mediaType)));
if(jsonShares != null){
for (Iterator<JsonNode> i = jsonShares.get("sources").getElements(); i.hasNext();) {
JsonNode jsonShare = (JsonNode)i.next();
shares.add(new FileLocation(getString(jsonShare, "label"), getString(jsonShare, "file")));
}
}
return shares;
}
/**
* @TODO Implement for JSON-RPC
*/
public String getCurrentlyPlayingThumbURI(INotifiableManager manager) throws MalformedURLException, URISyntaxException {
int playerid = getActivePlayerId(manager);
if(playerid == -1)
return null;
final JsonNode item = mConnection.getJson(manager, "Player.GetItem", obj().p("playerid", playerid).p(PARAM_PROPERTIES, arr().add("thumbnail"))).get("item");
JsonNode dl = null;
if(getString(item, "thumbnail") != null && !getString(item, "thumbnail").equals(""))
dl = mConnection.getJson(manager, "Files.PrepareDownload", obj().p("path", getString(item, "thumbnail")));
if(dl != null){
JsonNode details = dl.get("details");
if(details != null)
return mConnection.getUrl(getString(details, "path"));
else
return null;
}
else
return null;
}
/**
* Returns any system info variable, see {@link org.xbmc.api.info.SystemInfo}
* @TODO Wait for JSON-RPC implementation
* @param field Field to return
* @return
*/
public String getSystemInfo(INotifiableManager manager, int field) {
JsonNode version = mConnection.getJson(manager, "Application.GetProperties", obj().p(PARAM_PROPERTIES, arr().add("version"))).get("version");
return getInt(version, "major") + "." + getInt(version, "minor") + " " + getString(version, "tag") + "\nGit: " + getString(version, "revision");
}
/**
* Returns a boolean GUI setting
* @TODO Wait for JSON-RPC implementation
* @param field
* @return
*/
public boolean getGuiSettingBool(INotifiableManager manager, int field) {
//TODO
//return mConnection.getBoolean(manager, "GetGuiSetting", GuiSettings.MusicLibrary.getType(field) + ";" + GuiSettings.MusicLibrary.getName(field));
return false;
}
/**
* Returns an integer GUI setting
* @TODO Wait for JSON-RPC implementation
* @param field
* @return
*/
public int getGuiSettingInt(INotifiableManager manager, int field) {
//TODO
//return mConnection.getInt(manager, "GetGuiSetting", GuiSettings.MusicLibrary.getType(field) + ";" + GuiSettings.MusicLibrary.getName(field));
return 0;
}
/**
* Returns a boolean GUI setting
* @param field
* @param value Value
* @return
*/
public boolean setGuiSettingBool(INotifiableManager manager, int field, boolean value) {
//TODO
// return mConnection.getBoolean(manager, "SetGuiSetting", GuiSettings.getType(field) + ";" + GuiSettings.getName(field) + ";" + value);
return false;
}
/**
* Returns an integer GUI setting
* @param field
* @param value Value
* @return
*/
public boolean setGuiSettingInt(INotifiableManager manager, int field, int value) {
//TODO
//return mConnection.getBoolean(manager, "SetGuiSetting", GuiSettings.getType(field) + ";" + GuiSettings.getName(field) + ";" + value);
return false;
}
/**
* Returns any music info variable see {@link org.xbmc.http.info.MusicInfo}
* @TODO Wait for JSON-RPC implementation
* @param field Field to return
* @return
*/
public String getMusicInfo(INotifiableManager manager, int field) {
//TODO
//return mConnection.getString(manager, "GetMusicLabel", String.valueOf(field));
return "";
}
/**
* Returns any video info variable see {@link org.xbmc.http.info.VideoInfo}
* @TODO Wait for JSON-RPC implementation
* @param field Field to return
* @return
*/
public String getVideoInfo(INotifiableManager manager, int field) {
//TODO
//return mConnection.getString(manager, "GetVideoLabel", String.valueOf(field));
return "";
}
}