Skip to content

Commit

Permalink
Merge pull request #25 from pturcanu/roku-sub-bif
Browse files Browse the repository at this point in the history
Added support for SRT subtitles (and on/off toggle option) & BIF trick files (FF/REW on Roku)
  • Loading branch information
rshendershot committed Aug 17, 2014
2 parents 9a24e33 + 5c16573 commit c36c3e5
Show file tree
Hide file tree
Showing 9 changed files with 165 additions and 7 deletions.
45 changes: 39 additions & 6 deletions INSTALL
Expand Up @@ -40,15 +40,43 @@ Setup
around line 247:

case 'mp4' : return "$url.mp4";
case 'srt' : return "$url.srt";
case 'bif' : return "$url.bif";

Modify /usr/share/mythtv/mythweb/modules/stream/stream_raw.pl by adding an
Modify /usr/share/mythtv/mythweb/modules/stream/stream_raw.pl by adding
additonal elseif in the file type section:

elsif ($basename =~ /\.mp4$/)
{
$type = 'video/mp4';
$suffix = '.mp4';
}
if ($Path[3] =~ /srt/) {
#TODO language $Path[4]
$filename =~ s/\..+?$/\.srt/g;
$basename =~ s/\..+?$/\.srt/g;
$type = 'text/plain';
$suffix = '.srt';
}
elsif ($Path[3] =~ /bif/) {
my $HdSd = "";
$HdSd = "_$Path[4]" if ($Path[4]);
$filename =~ s/\..+?$/$HdSd\.bif/g;
$basename =~ s/\..+?$/$HdSd\.bif/g;
$type = 'image/jpeg';
$suffix = '.bif';
}
elsif ($basename =~ /\.mpe?g2?$/) {

[...]

elsif ($basename =~ /\.mp4$/) {
$type = 'video/mp4';
$suffix = '.mp4';
}
elsif ($basename =~ /\.srt$/) {
$type = 'text/plain';
$suffix = '.srt';
}
elsif ($basename =~ /\.bif$/) {
$type = 'image/jpeg';
$suffix = '.bif';
}

if you are using authentication to protect your mythweb (best practice)
you need to add the following to your mythweb.conf file (near the top)
Expand Down Expand Up @@ -110,6 +138,9 @@ Setup

http//192.168.1.10/mythweb/mythroku

6) Copy CCExtractor & biftool to /usr/bin to make them available system wide
if you intend to use subtitles & the Roku FF/REW bif trick files.

--------------------------------------------------------------------------------
Debugging
--------------------------------------------------------------------------------
Expand Down Expand Up @@ -149,4 +180,6 @@ rokuencode.sh:

Prerequisites:
- HandBrakeCLI: To convert recordings into H.264 format.
- CCExtractor: To extract srt subtitles (download from http://ccextractor.sourceforge.net/download-ccextractor.html)
- ffmpeg & biftool: To create bif trick files for fast forward/rewind; biftool is part of the Roku SDK. You must register your Roku account as a developer to download the SDK at https://owner.roku.com/Developer.

2 changes: 1 addition & 1 deletion Makefile
Expand Up @@ -37,7 +37,7 @@
APPNAME = MythRokuPlayer
VERSION = 1.1

ZIP_EXCLUDE= -x mythroku\* -x tools\* -x .\*
ZIP_EXCLUDE= -x mythroku\* -x tools\* -x zips\* -x .\*

include app.mk

8 changes: 8 additions & 0 deletions mythroku/xml_data.php
Expand Up @@ -161,6 +161,8 @@ function build_xml_vid( $sql_result, $index )
while ( $db_field = mysql_fetch_assoc($sql_result) )
{
$filename = $db_field['filename'];
$fname = pathinfo($filename, PATHINFO_FILENAME);
$fpath = pathinfo($filename, PATHINFO_DIRNAME);

$contentType = "movie";
$episode = "";
Expand Down Expand Up @@ -201,6 +203,9 @@ function build_xml_vid( $sql_result, $index )
'streamQuality' => $quality,
'streamContentId' => html_cleanup($filename),
'streamFormat' => pathinfo($filename, PATHINFO_EXTENSION),
'srtUrl' => "$mythtvdata/video/" . html_encode($fpath .'/'. $fname . '.srt'),# todo unless exists
'hdbifUrl' => "$mythtvdata/video/" . html_encode($fpath .'/'. $fname . '_hd.bif'),# todo unless exists
'sdbifUrl' => "$mythtvdata/video/" . html_encode($fpath .'/'. $fname . '_sd.bif'),# todo unless exists
'isHD' => $isHD,
'episode' => html_cleanup($episode),
'genres' => html_cleanup($genre),
Expand Down Expand Up @@ -267,6 +272,9 @@ function build_xml_rec( $sql_result, $index )
'streamQuality' => $quality,
'streamContentId' => html_cleanup($filename),
'streamFormat' => pathinfo($filename, PATHINFO_EXTENSION),
'srtUrl' => "$WebServer/pl/stream/" . html_encode($chanid_strtime) . "/srt",
'hdbifUrl' => "$WebServer/pl/stream/" . html_encode($chanid_strtime) . "/bif/hd",
'sdbifUrl' => "$WebServer/pl/stream/" . html_encode($chanid_strtime) . "/bif/sd",
'isHD' => $isHD,
'episode' => html_cleanup($episode),
'genres' => html_cleanup($db_field['category']),
Expand Down
3 changes: 3 additions & 0 deletions mythroku/xml_utils.php
Expand Up @@ -47,6 +47,9 @@ function xml_file( $args )
<streamQuality>{$args['streamQuality']}</streamQuality>
<streamContentId>{$args['streamContentId']}</streamContentId>
<streamFormat>{$args['streamFormat']}</streamFormat>
<srtUrl>{$args['srtUrl']}</srtUrl>
<hdbifUrl>{$args['hdbifUrl']}</hdbifUrl>
<sdbifUrl>{$args['sdbifUrl']}</sdbifUrl>
</media>
<isHD>{$args['isHD']}</isHD>
<episode>{$args['episode']}</episode>
Expand Down
6 changes: 6 additions & 0 deletions mythroku/xsl/mythtv_xml_test.xsl
Expand Up @@ -46,6 +46,9 @@

<xsl:if test="itemType = 'file'">
<xsl:variable name="url" select="media/streamUrl" />
<xsl:variable name="srtUrl" select="media/srtUrl" />
<xsl:variable name="hdbifUrl" select="media/hdbifUrl" />
<xsl:variable name="sdbifUrl" select="media/sdbifUrl" />

<b><xsl:text>[#</xsl:text><xsl:value-of select="index" /><xsl:text>] </xsl:text>
<xsl:value-of select="title" /><xsl:text> </xsl:text></b>
Expand Down Expand Up @@ -74,6 +77,9 @@
<td><b>Episode:</b></td><td><xsl:value-of select="episode" /></td>
</tr>
<tr><td colspan="8"><b>Stream Url:</b><br/><a href="{$url}"><xsl:copy-of select="$url" /></a></td></tr>
<tr><td colspan="8"><b>Srt Url:</b><br/><a href="{$srtUrl}"><xsl:copy-of select="$srtUrl" /></a></td></tr>
<tr><td colspan="8"><b>HDBif Url:</b><br/><a href="{$hdbifUrl}"><xsl:copy-of select="$hdbifUrl" /></a></td></tr>
<tr><td colspan="8"><b>SDBif Url:</b><br/><a href="{$sdbifUrl}"><xsl:copy-of select="$sdbifUrl" /></a></td></tr>
<tr><td colspan="8"><b>Synopsis:</b><br/><xsl:value-of select="synopsis" /></td></tr>
<xsl:if test="isRecording = 'true'">
<xsl:variable name="delcmd" select="delCmd" />
Expand Down
45 changes: 45 additions & 0 deletions source/appDetailScreen.brs
Expand Up @@ -100,6 +100,35 @@ function showDetailScreen(screen as object, showList as object, showIndex as int

end if

'set captions
if msg.GetIndex() = 9 then
srtOnOff = RegRead("MythRokuSrtOnOff")

'set to a default value if reg is empty
if (srtOnOff = invalid) then
print "MythRokuSrtOnOff not found in the registry"
srtOnOff = "srtOff"
'RegWrite("MythRokuSrtOnOff", srtOnOff)
end if

print "subtitles button pressed. current value: " + srtOnOff

Dbg("MythRoku: change srtOnOff. current value: " + srtOnOff)

'toggle values
if (srtOnOff = "srtOn")
srtOnOff = "srtOff"
else
srtOnOff = "srtOn"
end if

RegWrite("MythRokuSrtOnOff", srtOnOff)

Dbg("MythRoku: change srtOnOff. new value: " + srtOnOff)

refreshShowDetail(screen, showList, showIndex)
end if

end if
else
print "Unexpected message class: "; type(msg)
Expand Down Expand Up @@ -138,6 +167,22 @@ Function refreshShowDetail(screen As Object, showList As Object, showIndex as In
screen.AddButton(7, "Delete")
end if

'set captions
srtOnOff = RegRead("MythRokuSrtOnOff")

'set to a default value if reg is empty
if (srtOnOff = invalid) then
print "MythRokuSrtOnOff not found in the registry"
srtOnOff = "srtOff"
RegWrite("MythRokuSrtOnOff", srtOnOff)
end if

if (srtOnOff = "srtOn")
screen.AddButton(9, "Subtiles are on")
else
screen.AddButton(9, "Subtiles are off")
end if

screen.SetContent(show)
screen.Show()

Expand Down
17 changes: 17 additions & 0 deletions source/appVideoScreen.brs
Expand Up @@ -27,6 +27,23 @@ Function showVideoScreen(episode As Object)
screen.Show()
screen.SetPositionNotificationPeriod(30)
screen.SetContent(episode)

'set captions
srtOnOff = RegRead("MythRokuSrtOnOff")

'set to a default value if reg is empty
if (srtOnOff = invalid) then
print "MythRokuSrtOnOff not found in the registry"
srtOnOff = "srtOff"
RegWrite("MythRokuSrtOnOff", srtOnOff)
end if

if (srtOnOff = "srtOn")
screen.ShowSubtitle(true)
else
screen.ShowSubtitle(false)
end if

screen.Show()

'Uncomment this line to dump the contents of the episode to be played
Expand Down
13 changes: 13 additions & 0 deletions source/showFeed.brs
Expand Up @@ -71,6 +71,11 @@ function init_show_feed_item() as object
o.StreamContentIDs = CreateObject("roArray", 1, true)
o.StreamFormat = CreateObject("roArray", 1, true)

o.HDBifUrl = ""
o.SDBifUrl = ""
o.SubtitleUrl = ""
o.SubtitleConfig = ""

o.Length = 0
o.BookmarkPosition = 0
o.ReleaseDate = ""
Expand Down Expand Up @@ -201,6 +206,14 @@ function parse_file(element as object) as object
item.StreamContentIDs.Push(validstr(e.streamContentId.GetText()))
item.StreamFormat.Push( validstr(e.streamFormat.GetText()))

item.HDBifUrl = validstr(e.hdbifUrl.GetText())
item.SDBifUrl = validstr(e.sdbifsrtUrl.GetText())
item.SubtitleUrl = validstr(e.srtUrl.GetText())
item.SubtitleConfig = {
'ShowSubtitle: 1 ' alternatively use screen.ShowSubtitle(true) to toggle Srt
TrackName: item.SubtitleUrl
}

item.Length = strtoi( element.runtime.GetText())
' item.BookmarkPosition = strtoi( element..GetText())
item.ReleaseDate = validstr(element.date.GetText())
Expand Down
33 changes: 33 additions & 0 deletions tools/rokuencode.sh
Expand Up @@ -9,6 +9,16 @@ MPGFILE=$2
DATABASEUSER=mythtv
DATABASEPASSWORD=mythtv

if [ -f /usr/bin/ccextractor ]; then
# extract subtitles
srtbname=`echo $MPGFILE | sed 's/\(.*\)\..*/\1/'`
srtname="$MYTHDIR/$srtbname.srt"

# extract subtitles
/usr/bin/ccextractor -90090 --fixpadding --nofontcolor -out=srt --sentencecap "$MYTHDIR/$MPGFILE" -o "$srtname"
fi

# create mp4
newbname=`echo $MPGFILE | sed 's/\(.*\)\..*/\1/'`
newname="$MYTHDIR/$newbname.mp4"

Expand All @@ -22,5 +32,28 @@ mysql --user=$DATABASEUSER --password=$DATABASEPASSWORD mythconverg < /tmp/updat
# update the seek table
mythcommflag --file $newname --rebuild

if [ -f /usr/bin/biftool -a -f /usr/bin/ffmpeg ]; then
# create bif trick files
bifbname=`echo $MPGFILE | sed 's/\(.*\)\..*/\1/'`
sdbifname="/var/tmp/${bifbname}_sd"
hdbifname="/var/tmp/${bifbname}_hd"

mkdir $sdbifname
mkdir $hdbifname

/usr/bin/ffmpeg -i "$MYTHDIR/$MPGFILE" -r .1 -s 240x180 "$sdbifname/%08d.jpg"
/usr/bin/ffmpeg -i "$MYTHDIR/$MPGFILE" -r .1 -s 320x240 "$hdbifname/%08d.jpg"

cd /var/tmp
/usr/bin/biftool -t 10000 "$sdbifname"
/usr/bin/biftool -t 10000 "$hdbifname"

rm -rf "$sdbifname"
rm -rf "$hdbifname"

mv "$sdbifname.bif" $MYTHDIR
mv "$hdbifname.bif" $MYTHDIR
fi

# remove the orignal mpg
rm $MYTHDIR/$MPGFILE

0 comments on commit c36c3e5

Please sign in to comment.