See the JavaDoc of the IBackend interface for more usage examples.
In the following example we connect to a MythTV-backend and fetch the list of pending recordings.
// create a backend object and connect to the backend
IBackend backend = BackendFactory.createBackend("mythbox");
backend.connect();
// register as a playback client
backend.annotatePlayback();
// query pending recordings
IRecordingsPending pendingRecordings = backend.queryAllPending();
for (IProgramInfo program : pendingRecordings) {
// we are only interrested in recordings with "WILL_RECORD" status
IProgramRecordingStatus recStatus = program.getRecordingStatus();
if(!recStatus.hasStatus(IProgramRecordingStatus.Status.WILL_RECORD)) continue;
// print out the found recodings
System.out.println(String.format(
"%1$tF %1$tT - %2$s (%3$s)",
program.getStartDateTime(),
program.getTitle(),
program.getChannelSign()
));
}
// close backend connection
backend.close();
The above example will output, e.g.
MythTV has 4 pending records 2011-04-17 18:10:00 - Die Simpsons (PRO7) 2011-04-17 20:15:00 - 10.000 BC (PRO7) 2011-04-18 22:15:00 - Roter Drache (ZDF) 2011-04-21 20:15:00 - Dr. House (ORF1)
In the following example we print out all already recorded programs.
// connect to the backend
IBackend backend = BackendFactory.createBackend("mythbox");
backend.connect();
// register as a playback client
backend.annotatePlayback();
// query all available recordings
IProgramInfoList allRecordings = backend.queryRecordings();
// print the channel, length, file-size and title of all recordings
System.out.println("Channel | Length | Size | Title");
for(IProgramInfo program : allRecordings) {
// print out the found recordings
System.out.println(String.format(
"%-5s | %3d min | %8s | %s",
program.getChannelSign(),
program.getDuration(),
EncodingUtils.getFormattedFileSize(Locale.ENGLISH,program.getFileSize()),
program.getFullTitle()
));
}
// close backend connection
backend.close();
The above example will output, e.g.:
Channel | Length | Size | Title ATV+ | 55 min | 3.51 GB | Dr. Quinn - Ärztin aus Leidenschaft - Für das Leben der Cheyenne RTL2 | 30 min | 2.34 GB | King of Queens - Wer schön sein will ... RTL2 | 30 min | 2.34 GB | King of Queens - Das Haus am See
In the following example we query the next programs on all known channels.
// connect to the backend
IBackend backend = BackendFactory.createBackend("mythbox");
backend.connect();
// register as a monitoring client
backend.annotateMonitor();
// specify the time to use for query
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY,20);
cal.set(Calendar.MINUTE,15);
// fetch the programs of all channels today at 8:15 PM
List<IRecorderNextProgramInfo> nextPrograms = backend.getNextProgramInfos(cal.getTime());
for(IRecorderNextProgramInfo nextProgram : nextPrograms) {
if(!nextProgram.isValid()) continue; // if there is no valid EPG data for a channel
System.out.println(String.format(
"%tT | %tT | %-15s | %s",
nextProgram.getStartDateTime(), nextProgram.getEndDateTime(),
nextProgram.getChannelSign(), nextProgram.getTitle()
));
}
// close backend connection
backend.close();
The above example will output, e.g.:
20:15:01 | 23:05:01 | RTL | Harry Potter und der Stein der Weisen 20:15:01 | 21:15:01 | SAT.1 | Navy CIS 20:15:01 | 21:45:01 | ARD | Tatort 20:15:01 | 21:45:01 | ZDF | Rosamunde Pilcher: Englischer Wein 20:15:01 | 21:45:01 | SWBW | SonntagAbend 19:45:01 | 21:15:01 | BR3 | Kreuzwege 18:25:00 | 20:15:00 | PULS4 | American Pie Presents Band Camp 20:15:01 | 22:20:01 | PRO7 | Wall-E - Der Letzte räumt die Erde auf 20:15:01 | 22:55:01 | ATV+ | The Missing 20:15:01 | 22:10:01 | RTL2 | Ungeklärte Morde - Dem Täter auf der Spur 20:15:01 | 22:45:01 | ARTE | Fitzcarraldo 20:15:01 | 21:00:01 | 3SAT | Neues aus der Anstalt 20:15:01 | 21:50:01 | ORF2 | Tatort 20:15:01 | 21:40:01 | ORF1 | WALL-E - Der Letzte räumt die Erde auf 20:15:01 | 22:45:01 | VOX | Das perfekte Promi Dinner 20:15:01 | 21:15:01 | SUPRT | Abgefahren - Der lange Weg zum Führerschein 20:15:01 | 20:45:01 | KABE1 | Two and a Half Men
In the following example a recording file is downloaded to the client.
// connect to the backend
IBackend backend = BackendFactory.createBackend("mythbox");
backend.connect();
// register as a playback client
backend.annotatePlayback();
// getting previously recorded programs
IProgramInfoList programs = backend.queryRecordings();
// getting the recording to transfer (we just use the first recording)
IProgramInfo program = programs.get(0);
// annotate a new file transfer
IFileTransfer transfer = backend.annotateFileTransfer(program);
if (transfer.isOpen()) {
// create a local file
File tempFile = new File(System.getProperty("java.io.tmpdir"), program.getBaseName());
// copy data
transfer.transferTo(tempFile);
}
// close file transfer
transfer.close();
// close backend connection
backend.close();
In this example we query the free diskspace on the backend.
// connect to the backend
IBackend backend = BackendFactory.createBackend("mythbox");
backend.connect();
// register as a monitoring client
backend.annotateMonitor();
// query the free space
IBasicFreeSpace freeSpaceOverview = backend.getFreeSpaceOverview();
System.out.println(String.format(
"MythTV has used %s space out of %s.",
EncodingUtils.getFormattedFileSize(freeSpaceOverview.getUsedSpace()),
EncodingUtils.getFormattedFileSize(freeSpaceOverview.getTotalSpace())
));
// close backend connection
backend.close();
The above example will output, e.g.:
MythTV has used 3,31 GB space out of 3,72 GB.
In this example we determine the recording status of all MythTV recorders.
// connect to the backend
IBackend backend = BackendFactory.createBackend("mythbox");
backend.connect();
// register as a monitoring client
backend.annotateMonitor();
// get the IDs of all available (busy or idle) recorders
int[] allRecorderIDs = backend.getRecorderIDs();
System.out.println(String.format(
"%d recorders are available:", allRecorderIDs.length
));
for(int recorderId : allRecorderIDs) {
// get the recorder info
IRecorderInfo recorderInfo = backend.getRecorderForNum(recorderId);
// connect to the recorder
IRecorder recorder = backend.getRecorder(recorderInfo);
// get the recorder status
boolean isRecording = recorder.isRecording();
System.out.println(String.format(
"Recorder %d is %s",
recorderId,
isRecording? "busy" : "idle"
));
// disconnect from the recorder
recorder.close();
}
// close backend connection
backend.close();
The above example will output, e.g.:
3 recorders are available: Recorder 1 is busy Recorder 2 is idle Recorder 3 is idle
In the following example we reserve a free recorder and stream Live-TV data to the client.
// connect to the backend
IBackend backend = BackendFactory.createBackend("mythbox");
backend.connect();
// register as a playback client
backend.annotatePlayback();
// requesting a free recorder
IRecorderInfo recorderInfo = backend.getNextFreeRecorder();
if(recorderInfo != null) {
// connect to the recorder
IRecorder recorder = backend.getRecorder(recorderInfo);
// initialize Live-TV
String channelNr = "2";
boolean pictureInPicture = false;
if (recorder.spawnLiveTV(pictureInPicture,channelNr)) {
// wait (max. 10 seconds) for the recorder to enter the recording state
recorder.waitForIsRecording(10000);
// getting the program info to determine the streaming file
IProgramInfo programInfo = recorder.getRecording();
// annotate a new file transfer to receive the streaming data
IFileTransfer transfer = backend.annotateFileTransfer(programInfo);
if (transfer.isOpen()) {
// create a local file to copy Live-TV data into
File tempFile = File.createTempFile("livetv", ".mpg");
BufferedOutputStream fileOut = new BufferedOutputStream(new FileOutputStream(tempFile));
// initialize a byte buffer
int blockSize = 65536/2;
byte[] buffer = new byte[blockSize];
// receive data in a loop
boolean stopped = false;
while(!stopped) {
// reading the next block
int readSize = transfer.readBlock(buffer,blockSize);
// writing the block into the file
fileOut.write(buffer, 0, readSize);
fileOut.flush();
// TODO: do some check if the user has aborted Live-TV
if(tempFile.length() > 20*1024*1024) {
stopped = true;
}
}
// close file stream
fileOut.close();
} else {
System.err.println("Unable to open a file transfer connection.");
}
// close file transfer connection
transfer.close();
// shutdown live tv
recorder.stopLiveTv();
} else {
System.err.println("Unable to spawn Live-TV.");
}
// disconnect from the recorder
recorder.close();
} else {
System.err.println("No free recorder available.");
}
// close backend connection
backend.close();
In the following example add a new recording schedule into the database and inform the MythTV backend about the new scheduling rule.
// the mythtv database to connect to
IDatabase db = new DataBase("mythbox",IDatabase.DEFAULT_PORT,IDatabase.DEFAULT_DB,"mythtv","RhXhWF12");
// connect to the backend
IBackend backend = BackendFactory.createBackend("mythbox");
backend.connect();
// register as a client and enable events
backend.annotatePlayback(RequestUtils.getHostname(),EPlaybackSockEventsMode.NORMAL);
// the date of the program to record
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY,20);
cal.set(Calendar.MINUTE,15);
// the channel of the program to record
String callSign = "ARD";
final List<IRecorderChannelInfo> channelInfos = db.getChannelInfosByCallSign(callSign);
if(channelInfos.isEmpty()) {
System.err.println("No channel found for the given channel sign.");
return;
}
final IRecorderChannelInfo channelInfo = channelInfos.get(0);
// load the program to record
IRecorderNextProgramInfo programInfo = db.queryNextProgramInfo(channelInfo, cal.getTime());
if(programInfo == null) {
System.err.println("No program found for the given channel and time");
return;
}
// create the recording schedule object
Schedule schedule = Schedule.valueOf(backend.getVersionNr(),db.getDbVersion(),programInfo);
// change some properties (e.g. the priority and recording offset)
schedule.setRecordingPriority(10);
schedule.setStartOffset(Integer.valueOf(5));
schedule.setEndOffset(Integer.valueOf(15));
// add the recording schedule into the database
final Integer recordingId = db.addSchedule(schedule);
// inform the backend about the new scheduling rule
Boolean scheduled = backend.rescheduleRecordingsAndWait(recordingId,20,TimeUnit.SECONDS);
if(scheduled == null) {
System.err.println("Timeout while scheduling of recording.");
} else if(!scheduled.booleanValue()) {
System.err.println("Unable to schedule the recording.");
} else {
System.out.println("Recording successfully scheduled.");
}
// close backend connection
backend.close();