package org.xbmc.httpapi.client;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.util.ArrayList;
import org.xbmc.api.business.INotifiableManager;
import org.xbmc.api.data.IInfoClient;
import org.xbmc.api.info.GuiSettings;
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.httpapi.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 implements IInfoClient {
private final Connection mConnection;
/**
* Class constructor needs reference to HTTP client connection
* @param connection
*/
public InfoClient(Connection connection) {
mConnection = 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)
* @param mediaType MediaType
* @return
*/
public ArrayList<FileLocation> getDirectory(INotifiableManager manager, String path, DirectoryMask mask, int offset, int limit, int mediaType) {
ArrayList<String> result = new ArrayList<String>();
if (mediaType == MediaType.UNKNOWN) {
result = this.getNonAddonDirectory(manager, path, mask, offset, limit);
} else {
result = this.getAddonDirectory(manager, path, mediaType);
}
final ArrayList<FileLocation> files = new ArrayList<FileLocation>();
for (String file : result) {
files.add(new FileLocation(file));
}
return files;
}
private ArrayList<String> getNonAddonDirectory(INotifiableManager manager, String path, DirectoryMask mask, int offset, int limit) {
return mConnection.getArray(manager, "GetDirectory", path + ";" + (mask != null ? mask.toString() : " ") + ";" + (offset > 0 ? offset : " ") + ";"
+ (limit > 0 ? limit : " "));
}
private ArrayList<String> getAddonDirectory(INotifiableManager manager, String path, int mediaType) {
String mediaFileTypeName = MediaType.getName(mediaType);
return mConnection.getArray(manager, "GetMediaLocation", mediaFileTypeName + ";" + path);
}
/**
* Returns all the contents of a directory
* @param path Path to the directory
* @return
*/
public ArrayList<FileLocation> getDirectory(INotifiableManager manager, String path, int mediaType) {
return this.getDirectory(manager, path, null, 0, 0, mediaType);
}
/**
* Returns all defined shares of a media type
* @param mediaType Media type
* @return
*/
public ArrayList<FileLocation> getShares(INotifiableManager manager, int mediaType) {
final ArrayList<String> result = mConnection.getArray(manager, "GetShares", MediaType.getName(mediaType));
final ArrayList<FileLocation> shares = new ArrayList<FileLocation>();
for (String share : result) {
shares.add(new FileLocation(share));
}
return shares;
}
public String getCurrentlyPlayingThumbURI(INotifiableManager manager) throws MalformedURLException, URISyntaxException {
final ArrayList<String> array = mConnection.getArray(manager, "GetCurrentlyPlaying", " ; ; ;true");
Boolean isSlideShow = false;
int thumbNum = 0;
for (String s : array) {
if (s.startsWith("SlideFilename")) {
isSlideShow = true;
} else if (s.startsWith("Thumb")) {
// from XBMC r27606 the http api gives the slideshow thumb and the media thumb
if (!isSlideShow || ++thumbNum == 2) {
return mConnection.getUrl("FileDownload", s.substring(6));
}
}
}
return null;
}
/**
* Returns any system info variable, see {@link org.xbmc.api.info.SystemInfo}
* @param field Field to return
* @return
*/
public String getSystemInfo(INotifiableManager manager, int field) {
return mConnection.getString(manager, "GetSystemInfo", String.valueOf(field));
}
/**
* Returns a boolean GUI setting
* @param field
* @return
*/
public boolean getGuiSettingBool(INotifiableManager manager, int field) {
return mConnection.getBoolean(manager, "GetGuiSetting", GuiSettings.getType(field) + ";" + GuiSettings.getName(field));
}
/**
* Returns an integer GUI setting
* @param field
* @return
*/
public int getGuiSettingInt(INotifiableManager manager, int field) {
return mConnection.getInt(manager, "GetGuiSetting", GuiSettings.getType(field) + ";" + GuiSettings.getName(field));
}
/**
* Returns a boolean GUI setting
* @param field
* @param value Value
* @return
*/
public boolean setGuiSettingBool(INotifiableManager manager, int field, boolean value) {
return mConnection.getBoolean(manager, "SetGuiSetting", GuiSettings.getType(field) + ";" + GuiSettings.getName(field) + ";" + value);
}
/**
* Returns an integer GUI setting
* @param field
* @param value Value
* @return
*/
public boolean setGuiSettingInt(INotifiableManager manager, int field, int value) {
return mConnection.getBoolean(manager, "SetGuiSetting", GuiSettings.getType(field) + ";" + GuiSettings.getName(field) + ";" + value);
}
/**
* Returns any music info variable see {@link org.xbmc.http.info.MusicInfo}
* @param field Field to return
* @return
*/
public String getMusicInfo(INotifiableManager manager, int field) {
return mConnection.getString(manager, "GetMusicLabel", String.valueOf(field));
}
/**
* Returns any video info variable see {@link org.xbmc.http.info.VideoInfo}
* @param field Field to return
* @return
*/
public String getVideoInfo(INotifiableManager manager, int field) {
return mConnection.getString(manager, "GetVideoLabel", String.valueOf(field));
}
}