APL Tablo Client

One thought on your plans for commercial skipping…

The commercial skip algorithm used by Tablo is good, not great. Many times it will incorrectly detect the commercial too soon, skipping over video content.
With Tablo’s method of commercial skipping, I can at least backup and view the skipped video content.

If your plan is to completely cut the commercials from your output file, you may be cutting video content too. This will make it impossible to view the missing video content.

On the subject of included features…
I would like to see an “Autoplay” feature so that I can watch all the recordings of a given TV series. Similar to the way Netflix works.

I also have experienced that and when I was thinking about how to handle that, I quite simply decided to allow the ‘human’ in the loop to decide what should be removed from the eventual end file instead of the machine…so, the export exports the entire file, the mlt file generated uses the comskip data that Tablo provides as guidelines of what can/should be deleted, but in the end, it’s up to you to decide which segments of the video are removed and which are kept to be put into the final file.

Currently the ‘watch’ feature is relying on ffplay…and doesn’t give me much control over the playback…I’m not very happy with it and will likely replace it at some point, but I agree, a Netflix style ‘watch next episode’ would be nice

I have a system (back up) running devuan “Devuan GNU+Linux is a fork of Debian without systemd”. I’m going to load it down with Oracle’s Java SE jre-8u73 and see what difference that may make.

I have windows 10 (64bit) java 8 update 221 And I installed the JRE java 8 update 221 and all it does is get a blank window with two menu items File/close and Help/About neither of which work. So there are other dependencies that I do not have. I can provide the log of it running if that will help.

I think there are other dependencies that need to be included in APLTablo.jar All the user should need is the Java Run-time Environment aka JRE. If dependencies are needed sometime facilities are in place to retrieve them.

Clearly LJ_LongWing had invested a whole bunch of time in this project already. I suspect he’s working to fine tune a distribute-able package - or answers to tell us what we’re doing wrong. Coding is art, you can’t put a time or art… then it’s just work - to get something done.

You are correct, the jar I uploaded is enough to work on my machine, but obviously my machine has things that yours don’t, I tried including the jfxrt.jar in a copy to run on my Linux box, which changed the error, but didn’t allow it to run, I’m lucky enough to have a day job, but it doesn’t offer much time to work on this project, so this is a nights and weekend thing for me, I’ll keep working to get a version that you folks can use and evaluate, as always, your time effort in testing is just as valuable as my time developing, so it is appreciated, as is your patience while I get out an initial draft you can use :grinning:

1 Like

Open your properties file, change the logging from info to debug (assuming it’s not already debug) and post the log if you don’t mind.

It was already set for debug. Not every run results in a info message about the Tablo. The IP address is a static map on the DHCP server.

PS D:\APLTABLO-.01> dir

Directory: D:\APLTABLO-.01

Mode LastWriteTime Length Name


-a---- 8/15/2019 11:28 AM 20480 APLTablo.db
-a---- 8/13/2019 2:21 PM 24174838 APLTablo.jar
-a---- 8/15/2019 4:56 PM 996 APLTablo.log
-a---- 8/13/2019 2:16 PM 727 APLTablo.properties
-a---- 8/15/2019 5:06 PM 11730 run.log
-a---- 4/23/2019 9:15 AM 1357 Template.mlt

PS D:\APLTABLO-.01> java -jar APLTablo.jar
2019-08-15 18:17:04,673 [INFO ] APL Tablo .01
2019-08-15 18:17:04,674 [INFO ] Starting Processing
log4j:ERROR Could not read configuration file [TabloClient.properties].
java.io.FileNotFoundException: TabloClient.properties (The system cannot find the file specified)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(Unknown Source)
at java.io.FileInputStream.(Unknown Source)
at java.io.FileInputStream.(Unknown Source)
at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:306)
at org.apache.log4j.PropertyConfigurator.configure(PropertyConfigurator.java:324)
at com.apl.Tablo.discover(Tablo.java:103)
at com.apl.Tablo.(Tablo.java:93)
at com.apl.view.MainOverviewController.(MainOverviewController.java:19)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
at sun.reflect.misc.ReflectUtil.newInstance(Unknown Source)
at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:927)
at javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:971)
at javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:220)
at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:744)
at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2707)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409)
at com.apl.MainApp.showMainOverview(MainApp.java:56)
at com.apl.MainApp.start(MainApp.java:33)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$8(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$7(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$5(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$6(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$3(WinApplication.java:177)
at java.lang.Thread.run(Unknown Source)
log4j:ERROR Ignoring configuration file [TabloClient.properties].
2019-08-15 18:17:09,657 [INFO ] Adding Tablo ‘TabloTV1’ (192.168.123.31)
javafx.fxml.LoadException:
com/apl/view/MainOverview.fxml:7

    at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2579)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409)
    at com.apl.MainApp.showMainOverview(MainApp.java:56)
    at com.apl.MainApp.start(MainApp.java:33)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$8(LauncherImpl.java:863)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$7(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl.lambda$null$5(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$6(PlatformImpl.java:294)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$3(WinApplication.java:177)
    at java.lang.Thread.run(Unknown Source)

Caused by: org.json.JSONException: JSONObject[“http”] is not an int.
at org.json.JSONObject.getInt(JSONObject.java:699)
at com.apl.Tablo.lambda$0(Tablo.java:117)
at java.lang.Iterable.forEach(Unknown Source)
at com.apl.Tablo.discover(Tablo.java:111)
at com.apl.Tablo.(Tablo.java:93)
at com.apl.view.MainOverviewController.(MainOverviewController.java:19)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
at sun.reflect.misc.ReflectUtil.newInstance(Unknown Source)
at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:927)
at javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:971)
at javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:220)
at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:744)
at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2707)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527)
… 13 more
Caused by: java.lang.ClassCastException: org.json.JSONObject$Null cannot be cast to java.lang.String
at org.json.JSONObject.getInt(JSONObject.java:696)
… 30 more

Ok…so, I was able to do some work on this this morning and got it working on my Linux machine. I’ve added a readme.txt to the archive (current version .02) and updated the download link…the current contents of the readme.txt are

APLTablo is a Graphical Java client for use with the Tablo OTA DVR Appliance. The graphical nature uses JavaFX. This used to be included
with Java, but is now not, and that complicates its usage, but not impossible…so, first you’ll need this tool (which you have because you are reading this)
then you need to have JavaFX. A precompiled version for your OS can be downloaded from here

Download and extract your OS Specific JavaFX that is the appropriate version for your Java, then from the command line issue the following command
from the APLTablo directory

java --module-path <place where you extracted it, we want the lib folder> --add-modules javafx.controls,javafx.fxml -jar APLTablo.jar

This should get you into the tool for now, I haven’t tested all of the functionality on Linux, but I’m sure you’ll let me know if there are problems

Please let me know if you are able to download the new version and test it out :slight_smile:

I have a Java application installed which has its own java implementation, so to make sure there wasn’t a conflict I tested .02 on my wifes laptop win10 64 bit it did not have any version of java installed. I installed java 8 221 JDK. It gets a javafx.fxml LoadException. Blank window as before.

Then I tried it on a Ubunto 18.04, openjdk 11.03 and JavaFX Linux SDK Same issue javafx.fxml LoadException. Blank window.

alan@pathfinder:~/tmp/APLTABLO/APLTablo-.02$ java --module-path /home/alan/tmp/APLTABLO/javafx-sdk-11.0.2/lib --add-modules javafx.controls,javafx.fxml -jar APLTablo.jar
2019-08-16 12:55:50,623 [INFO ] APL Tablo .02
2019-08-16 12:55:50,625 [INFO ] Starting Processing
javafx.fxml.LoadException:
com/apl/view/MainOverview.fxml:7

Is there more information in the stack trace than that?

I"m working on it. Not exactly JavaFX - Gluon which references OpenJFX, same url openjfx.io for the package openjfx I had already installed, with the same modules in your --add-modules. So I tried your command line with version .02, I though - first line 2019-08-16 16:01:24,142 [INFO ] APL Tablo .01 how can I verify version?

I got a blank window, with a menu bar. Similar to the Windows error (in part)

java --module-path /usr/share/openjfx/lib --add-modules javafx.controls,javafx.fxml -jar APLTablo.jar
2019-08-16 15:29:39,694 [INFO ] APL Tablo .01
2019-08-16 15:29:39,695 [INFO ] Starting Processing
2019-08-16 15:29:39,807 [INFO ] Initalizing DB
log4j:ERROR Could not read configuration file [TabloClient.properties].
java.io.FileNotFoundException: TabloClient.properties (No such file or directory)
	at java.base/java.io.FileInputStream.open0(Native Method)

TabloClient.properties appears to be a show-stopper.

APLTablo.db had data in Server. Looks like data returned from https://api.tablotv.com/assocserver/getipinfo/ so there is some function! Control has 2 empty entries.

If/when it’s determined Gluon is absolutely necessary, it’s a SDK not a RE, I’m willing to work with you and install more stuff. Probably go to the Oracle JDK and or JFX.

Enjoy your weekend :smile:

Well, the fact that it’s saying .01 says .01…so…I just tested the jar I put in the zip, and it was in fact still .01…not very rigorous of me. I re-compiled the jar, re-created the zip, and re-uploaded that zip to my host…if you re-download .02, it should tell you that in the command line/log at this point…hopefully all of those problems today were related to my incompetence in being able to produce a JAR this morning.

1 Like

oops wrong jar sorry about that…

alan@pathfinder:~/tmp/APLTABLO/APLTablo-.02$ java --module-path /home/alan/tmp/APLTABLO/javafx-sdk-11.0.2/lib --add-modules javafx.controls,javafx.fxml -jar APLTablo.jar
2019-08-16 14:25:28,860 [INFO ] APL Tablo .02
2019-08-16 14:25:28,865 [INFO ] Starting Processing
2019-08-16 14:25:31,116 [INFO ] Adding Tablo ‘TabloTV1’ (192.168.123.31)
2019-08-16 14:25:31,325 [INFO ] Adding Tablo ‘TabloTV2’ (192.168.123.32)
javafx.fxml.LoadException:
com/apl/view/MainOverview.fxml:7

and from the win10 laptop.

PS C:\APLTablo\APLTABLO-.02> java -jar APLTablo.jar
2019-08-16 12:36:03,692 [INFO ] APL Tablo .02
2019-08-16 12:36:03,697 [INFO ] Starting Processing
2019-08-16 12:36:11,140 [INFO ] Initalizing DB
2019-08-16 12:36:25,133 [INFO ] Adding Tablo ‘TabloTV1’ (192.168.123.31)
2019-08-16 12:36:26,305 [INFO ] Adding Tablo ‘TabloTV2’ (192.168.123.32)
javafx.fxml.LoadException:
com/apl/view/MainOverview.fxml:7

Ok, to get a better handle on this I replaced my Java with

java version “11.0.4” 2019-07-16 LTS
Java™ SE Runtime Environment 18.9 (build 11.0.4+10-LTS)
Java HotSpot™ 64-Bit Server VM 18.9 (build 11.0.4+10-LTS, mixed mode)

This is Oracles…not Open, but in theory they should be similar…I’m on Windows and I executed the command

java --module-path “C:\Users\LJ\Downloads\javafx-sdk-11.0.2\lib” --add-modules javafx.controls,javafx.fxml -jar APLTablo.jar

and got the following output

2019-08-16 15:08:15,882 [INFO ] APL Tablo .02
2019-08-16 15:08:15,883 [INFO ] Starting Processing
2019-08-16 15:08:18,080 [INFO ] Adding Tablo ‘Tomah’ (192.168.1.9)
2019-08-16 15:08:18,517 [INFO ] Adding Tablo ‘Morris’ (192.168.1.8)
2019-08-16 15:08:18,517 [INFO ] Loaded 2 Tablos with 6 tuners

and I get the following screen

77

I’m using the exact same jar, and nothing that you guys shouldn’t be using, yet mine’s loading and I don’t understand why yours isn’t.

There isn’t anything beyond the MainOverview.fxml:7?

I didn’t get any “Adding Tablo” so I though I was a complete failure, then realized I received the same LoadException otherwise, so not complete :neutral_face:

 java --module-path /usr/share/openjfx/lib --add-modules javafx.controls,javafx.fxml -jar APLTablo.jar
2019-08-16 17:00:07,323 [INFO ] APL Tablo .02
2019-08-16 17:00:07,324 [INFO ] Starting Processing
2019-08-16 17:00:07,434 [INFO ] Initalizing DB
javafx.fxml.LoadException: 
com/apl/view/MainOverview.fxml:7

Note, obviously get DB line once. Delete APLTablo.db and of course it get Initialized and recreated, as expected.

@andersonas25 has 2 different platforms, each with a different version with virtually the same Exception each. Your developer system must be over-the-top with IDEs and SDKs.

Here is the full debug output.

alan@pathfinder:~/tmp/APLTABLO/APLTablo-.02$ java --module-path /home/alan/tmp/APLTABLO/javafx-sdk-11.0.2/lib --add-modules javafx.controls,javafx.fxml -jar APLTablo.jar
2019-08-16 14:45:32,572 [INFO ] APL Tablo .02
2019-08-16 14:45:32,575 [INFO ] Starting Processing
javafx.fxml.LoadException:
com/apl/view/MainOverview.fxml:7

    at javafx.fxml/javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2625)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2603)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2466)
    at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:2435)
    at com.apl.MainApp.showMainOverview(MainApp.java:56)
    at com.apl.MainApp.start(MainApp.java:33)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
    at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
    at javafx.graphics/com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
    at javafx.graphics/com.sun.glass.ui.gtk.GtkApplication.lambda$runLoop$11(GtkApplication.java:277)
    at java.base/java.lang.Thread.run(Thread.java:834)

Caused by: org.json.JSONException: JSONObject[“http”] is not an int.
at org.json.JSONObject.getInt(JSONObject.java:699)
at com.apl.Tablo.lambda$0(Tablo.java:117)
at java.base/java.lang.Iterable.forEach(Iterable.java:75)
at com.apl.Tablo.discover(Tablo.java:111)
at com.apl.Tablo.(Tablo.java:93)
at com.apl.view.MainOverviewController.(MainOverviewController.java:19)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
at java.base/java.lang.Class.newInstance(Class.java:584)
at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:936)
at javafx.fxml/javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:980)
at javafx.fxml/javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:227)
at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:752)
at javafx.fxml/javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2722)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2552)
… 13 more
Caused by: java.lang.ClassCastException: class org.json.JSONObject$Null cannot be cast to class java.lang.String (org.json.JSONObject$Null is in unnamed module of loader java.net.URLClassLoader @5d6f64b1; java.lang.String is in module java.base of loader ‘bootstrap’)
at org.json.JSONObject.getInt(JSONObject.java:696)
… 29 more

I can provide the full output from the win10 laptop also.

Agreed, which is why I went to my CentOS box that I never use for anything, and have certainly never used for this tool, and got it working this morning with the downloads and command line I specified. I’m not saying it’s anyone’s fault, I’m just trying to find the delta between my system and your guys so that I can find the common denominator and bring it together to allow you guys to run this tool :smiley:

Over the weekend I’ll build out a new fresh Ubuntu box and see what I can do, if I need to do anything special at all, to get it working over there.

Are your Tablos named after your cats by any chance?

1 Like

Here’s what I get…

 java --version
openjdk 11.0.4 2019-07-16
OpenJDK Runtime Environment (build 11.0.4+11-post-Debian-1)
OpenJDK 64-Bit Server VM (build 11.0.4+11-post-Debian-1, mixed mode, sharing)

openjfx 11.0.2+1-1 (retrieved from changelog)

lsb_release -d
Description:	Debian GNU/Linux bullseye/sid