Giter Site home page Giter Site logo

maddox / wallop Goto Github PK

View Code? Open in Web Editor NEW
167.0 38.0 41.0 6.58 MB

๐Ÿ“บ A transcoding server for your HDHomeRun Prime

Ruby 52.41% CSS 1.38% JavaScript 3.28% CoffeeScript 14.13% Shell 3.52% HTML 25.28%
video-streaming ffmpeg http-live-streaming ios

wallop's Introduction

โšก Wallop โšก

โš ๏ธโš ๏ธโš ๏ธ

This project has been discontinued. Check out what we made with the knowledge we learned by building Wallop: https://getchannels.com

โš ๏ธโš ๏ธโš ๏ธ

Wallop is a transcoding server for your HDHomeRun Prime.

Wallop lets you watch TV streams on your iPhone, iPad, Roku, Web, Android device. Even away from home.

Warning

Wallop is still very new, and because of that, it's unstable.

Not unstable as in crash prone, unstable as in lots will change. Not a lot has been decided on, so things could change any time. Keep an eye on the pull requests in this repo to see what is new and what has changed.

Why?

The HDHomeRun Prime is an amazing CableCard TV tuner. It has 3 tuners, and makes its tuned content available over your local network. It even lets you capture these streams via HTTP with a simple CURL command!

The problem is, TV is generally broadcast in MPEG2 at bitrates hovering around 16-20mbps. This causes 3 problems:

  • These streams are usually too large for WiFi.
  • These streams are definitely too large to stream to your mobile device when away from home.
  • Basically no modern devices decode MPEG2 in hardware, leaving the devices to do it with CPU.

This means, as awesome as this device is, and as accessible as the TV streams are, it's still basically useless. It can't stream to your phone, tablet, or even over your WiFi.

The solution is simple. Take these MPEG2 streams and transcode them to h.264 at a lower bitrate. That's what Wallop does.

How

Using FFMPEG, Wallop tunes the channel you request and consumes the stream from the HDHomeRun. It then transcodes it to a more consumable bitrate and broadcasts it as an HTTP Live Stream.

Voila! Now basically any modern device can stream TV from your HDHomeRun Prime.

Setup

Wallop is written in Ruby and runs fine with the Ruby that ships on OS X 10.8.

Wallop has only been tested running on OS X, though its just Ruby and FFMPEG, so it should run ok elsewhere.

FFMPEG

You should have a modern version of FFMPEG compiled and installed. I'd suggest you just compile a fresh version from the most recent source. Here are good instructions on how get FFMPEG built for OS X. It's not that bad!

$ brew update
$ cp vendor/libaacplus.rb /usr/local/Library/Formula/
$ cp vendor/x264.rb /usr/local/Library/Formula/
$ brew install x264 --HEAD
$ brew install vendor/ffmpeg.rb --with-fdk-aac --with-libaacplus --with-libvo-aacenc --with-schroedinger --with-opencore-amr --disable-stripping

Quickie Set Up

Wallop is a simple Ruby server. All you need to do is clone it down, install its dependencies, and start it up!

Be sure you have bundler installed first. gem install bundler Bundler is a dependency management tool for Ruby.

git clone https://github.com/maddox/wallop.git
cd wallop
script/setup
script/start
open http://127.0.0.1:8888

Starting Server

To start the server after you've already set it up, just run this:

script/start
open http://127.0.0.1:8888

Installing/Uninstalling

You can optionally use launchd in OS X to start Wallop on boot. Not only will this start the server when the computer boots, but it will keep it running in case it crashes.

I'd suggest you make sure Wallop is running normally via script/start before you install it this way.

Install

This will install the script to launch it at boot and keep it alive. If you seem to be having trouble, you can tail the log for the install at ~/Library/Logs/wallop.log.

script/install

Uninstall

This will remove the script from launchd.

script/uninstall

Restart

This will restart the server. If you update the server, you'll want to run this to get the updates running.

script/restart

Updating

If you want to update Wallop, just do a normal git pull on the repo you cloned down. Watch the development via this repo to see if there's anything you want to update for.

After updating the code, run:

script/update

This will fulfill any new dependencies as well as anything else that needs to happen after an update.

Configuring

Wallop is pretty simple, but it does have a couple user configurable settings.

You can edit these settings via the config/config.toml.example file. Once you have updated your setting save the file back to the config directory as config.toml.

hdhomerun_host = "192.168.1.13"
ffmpeg_path = "/usr/local/bin/ffmpeg"
transcoding_path = "./tmp"
port = "8888"
hd_start = 500
hdhomerun_host

The IP address of your HDHomeRun Prime on your network.

ffmpeg_path

The path to your FFMPEG binary.

transcoding_path

The path where Wallop will write the temporary segments when transcoding and streaming the tv streams. This defaults to the tmp directory in Wallops own directory. If you want these files written somewhere else, you can change that here.

port

The port that the server will run on.

hd_start

The start channel of your HD channels. Most providers start all of their HD channels at a certain number. Providing this number will let you browse JUST your HD channels.

Network Logos

Wallop supports the serving of Network Logos if you configure your channels to use them. Within the config.toml file, you can map your channels to images. Just map the channel number to a file name and place those files into /app/public/logos. Wallop will send the logo urls along in its JSON response to services talking to it.

[channel_logos]
506 = "cbs.png"
508 = "abc.png"
511 = "fox.png"
512 = "nbc.png"

you can see that cbs.png corresponds to:

Logs

Logs are written out to the log directory.

Wallop rolls its logs whenever it starts up. So only information for the current process will be found in log/wallop.log. When Wallop starts, it moves the old log to log/wallop.old.log before starting up.

Usage

Wallop is more of a tool than a user facing application. It's designed to be used in coordination with other things like:

  • an iPhone app
  • an XBMC/Plex addon/channel

It has a full API that lets you kick off the transcode, pick your resolution and bitrate, and provides status of the stream. Read the documentation on how to talk to Wallop.

Via Web

Wallop DOES have some web views that you can use to watch a stream though. Just open the server with your browser to see a list of channels. Tap/click a channel to start the stream.

Just point your browser to http://localhost:8888, or whatever host it's on.

Just tap/click a channel, and it will do it's thing and start streaming.

Favorite Channels

You have LOTS of channels. To alleviate this pain, you can set which ones are your favorites. Just tap/click the star and it will be set as a favorite channel.

This should speed up getting to the channels you want.

Browser Support

Basically the only browser that is supported right now is Safari. Sorry, Google hates HLS for some reason.

Chrome won't play the HLS stream natively, and JWPlayer wants $300 per year for their player that will fallback to flash for HLS streams. Even for non-commercial use. ๐Ÿ‘Ž

  • ๐Ÿ‘ iPhone (Safari)
  • ๐Ÿ‘ iPad (Safari)
  • ๐Ÿ‘ OS X (Safari)
  • ๐Ÿ‘Ž Chrome
  • โ“ Android

I don't have any Android devices, nor do I have any experience with them. So your milage may vary. I'd love to hear some feedback via issues

Docker Image

To get Wallop up and running quickly you can use the Docker image provided by ipstatic. It contains everything required to run Wallop.

On a machine that has Docker installed, pull the image down:

docker pull ipstatic/wallop

Next copy the sample config.toml file and ensure these directives are set:

ffmpeg_path = "/ffmpeg/bin/ffmpeg"
acodec = "libfdk_aac"
transcoding_path = "/tmp"

Then start the container:

docker run --rm --name wallop -v $(pwd)/config.toml:/wallop/config/config.toml -p 8888:8888 ipstatic/wallop:latest

Contributing

  • Fork the repo
  • Create a topic branch
  • Push your topic branch
  • Submit a pull request for your feature

wallop's People

Contributors

carl34 avatar dhowdy avatar ipstatic avatar jancona avatar kdoyen avatar maddox avatar natevick avatar technicalpickles avatar tmm1 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

wallop's Issues

JSON::ParserError - 399: unexpected token at

wallop refuses to coperate. I have installed it as pre the instructions.

message:

127.0.0.1 - - [14/Feb/2014 00:15:29] "GET /channels?type=favorites HTTP/1.1" 500 30 127.2288
JSON::ParserError - 399: unexpected token at '[{"GuideNumber":"1","GuideName":"SRF 1","Tags":"f..... way to many entries here ... GuideNumber":"839","GuideName":"Rai Radio 4","Tags":""}':
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/json-1.7.7/lib/json/common.rb:155:in `parse'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/json-1.7.7/lib/json/common.rb:155:in `parse'
    /Users/chronos/Documents/workspace/wallop/lib/wallop.rb:121:in `lineup'
    /Users/chronos/Documents/workspace/wallop/lib/wallop.rb:139:in `favorite_lineup'
    app/app.rb:45:in `block in <class:App>'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/sinatra-1.4.3/lib/sinatra/base.rb:1541:in `call'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/sinatra-1.4.3/lib/sinatra/base.rb:1541:in `block in compile!'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/sinatra-1.4.3/lib/sinatra/base.rb:950:in `[]'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/sinatra-1.4.3/lib/sinatra/base.rb:950:in `block (3 levels) in route!'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/sinatra-1.4.3/lib/sinatra/base.rb:966:in `route_eval'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/sinatra-1.4.3/lib/sinatra/base.rb:950:in `block (2 levels) in route!'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/sinatra-1.4.3/lib/sinatra/base.rb:987:in `block in process_route'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/sinatra-1.4.3/lib/sinatra/base.rb:985:in `catch'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/sinatra-1.4.3/lib/sinatra/base.rb:985:in `process_route'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/sinatra-1.4.3/lib/sinatra/base.rb:948:in `block in route!'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/sinatra-1.4.3/lib/sinatra/base.rb:947:in `each'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/sinatra-1.4.3/lib/sinatra/base.rb:947:in `route!'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/sinatra-1.4.3/lib/sinatra/base.rb:1059:in `block in dispatch!'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/sinatra-1.4.3/lib/sinatra/base.rb:1041:in `block in invoke'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/sinatra-1.4.3/lib/sinatra/base.rb:1041:in `catch'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/sinatra-1.4.3/lib/sinatra/base.rb:1041:in `invoke'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/sinatra-1.4.3/lib/sinatra/base.rb:1056:in `dispatch!'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/sinatra-1.4.3/lib/sinatra/base.rb:882:in `block in call!'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/sinatra-1.4.3/lib/sinatra/base.rb:1041:in `block in invoke'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/sinatra-1.4.3/lib/sinatra/base.rb:1041:in `catch'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/sinatra-1.4.3/lib/sinatra/base.rb:1041:in `invoke'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/sinatra-1.4.3/lib/sinatra/base.rb:882:in `call!'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/sinatra-1.4.3/lib/sinatra/base.rb:870:in `call'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/rack-1.5.2/lib/rack/commonlogger.rb:33:in `call'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/sinatra-1.4.3/lib/sinatra/base.rb:212:in `call'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/rack-protection-1.5.0/lib/rack/protection/xss_header.rb:18:in `call'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/rack-protection-1.5.0/lib/rack/protection/path_traversal.rb:16:in `call'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/rack-protection-1.5.0/lib/rack/protection/json_csrf.rb:18:in `call'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/rack-protection-1.5.0/lib/rack/protection/base.rb:49:in `call'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/rack-protection-1.5.0/lib/rack/protection/base.rb:49:in `call'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/rack-protection-1.5.0/lib/rack/protection/frame_options.rb:31:in `call'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/rack-1.5.2/lib/rack/logger.rb:15:in `call'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/rack-1.5.2/lib/rack/commonlogger.rb:33:in `call'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/sinatra-1.4.3/lib/sinatra/base.rb:212:in `call'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/sinatra-1.4.3/lib/sinatra/base.rb:205:in `call'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/rack-1.5.2/lib/rack/head.rb:11:in `call'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/sinatra-1.4.3/lib/sinatra/base.rb:175:in `call'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/sinatra-1.4.3/lib/sinatra/base.rb:1949:in `call'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/sinatra-1.4.3/lib/sinatra/base.rb:1449:in `block in call'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/sinatra-1.4.3/lib/sinatra/base.rb:1726:in `synchronize'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/sinatra-1.4.3/lib/sinatra/base.rb:1449:in `call'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/thin-1.5.1/lib/thin/connection.rb:81:in `block in pre_process'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/thin-1.5.1/lib/thin/connection.rb:79:in `catch'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/thin-1.5.1/lib/thin/connection.rb:79:in `pre_process'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/eventmachine-1.0.3/lib/eventmachine.rb:1037:in `call'
    /Users/chronos/Documents/workspace/wallop/vendor/gems/ruby/2.0.0/gems/eventmachine-1.0.3/lib/eventmachine.rb:1037:in `block in spawn_threadpool'

Trouble opening m3u8 stream

First I just want to say thank you for making wallop! I will be working on first streaming to a simple Roku app for football season, then I may see if I can get it to stream to a plex media server. Should be fairly easy with your API.

I've got it running on my Mac, but I am unable to get the streams to actually play. I've tried it in Safari as well as opening the stream in VLC, both just hang there and don't display anything. I can see the clients are making GET requests to get the m3u8 and .ts files, but they never actually play the video. I can also see ffmpeg working. Any idea why I'm having trouble viewing the stream?

In case it helps, here is the output of ffmpeg -i. I compiled it just a few days ago.

ffmpeg version N-56198-gbbcaf25 Copyright (c) 2000-2013 the FFmpeg developers
  built on Sep 12 2013 00:33:06 with llvm-gcc 4.2.1 (LLVM build 2336.11.00)
  configuration: --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-libaacplus --enable-libcelt --enable-libfaac --enable-libfdk-aac --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-openssl --enable-libtheora --enable-libvo-aacenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxvid --prefix=/usr/local
  libavutil      52. 43.100 / 52. 43.100
  libavcodec     55. 31.101 / 55. 31.101
  libavformat    55. 16.102 / 55. 16.102
  libavdevice    55.  3.100 / 55.  3.100
  libavfilter     3. 84.100 /  3. 84.100
  libswscale      2.  5.100 /  2.  5.100
  libswresample   0. 17.103 /  0. 17.103
  libpostproc    52.  3.100 / 52.  3.100

Connection Refused

Do I need my HDHomeRun to be set up before I access the web interface?
When I try to access it I get [Internal Server Error] with the following in the command window.

Log

I also had to create the config file to even get the server to start, don't know if that was related.

Was messing around and broke something

Ok so I'll admit I was messing with ruby which I don't know and seemed to have broken something. Wallop started throwing 500s, I rolled back the code to master and then changed the config file again but when I went to run 'script/server' to test things were back to working order I got an error around being unable to load EventMachine C extension and to use "require 'em/pure_ruby'".

Adding that to boot.rb at least got sinatra booting again but things still appear to be white screening. Odd because I did a full git pull reset so none of my code hacking are around anymore.

Is it possible wallop is still running in a process somewhere? I did attempt to uninstall it from launchd.

All I was really trying to do was give Wallop another variable url to pull from, basically storing the raw url without the http protocol so I could attempt to pass it to other apps as a secondary link.

Suggestions

First thing first. This is a great start maddox. The picture quality of streaming video is great and the interface is simple and clean. i watched tv on my ipad mini today for an hour while working out. I think wallop has great potential and I hope you are working on it. I had few suggestions which i wanted to pass it along.

  1. The interface is simple but buggy. When i select a channel, it goes to tuning to preparing streaming to back to tuning to streaming is ready to play and sometimes that text keeps going on for pages. I don't think the text is beneficial for users, i would just show the icon of loading until the streaming starts.

  2. Once the streaming starts on mobile devices, it would be cool to make the video full screen automatically.

  3. The streaming takes a good 15-20 seconds to starts. I have a 6 core mac pro, gigabit ethernet. I'm not sure if this happens with other and if there is something could be done to improve the performance + start the streaming faster.

I have lot of other ideas but i'll hold on for now :)
thanks again for working on wallops.

Cannot configure images for channels with decimal points

Perhaps I am just using the toml syntax wrong, but when I set the image for a channel with a decimal place, like 5.1, I get this:

Failed to match sequence (ALL_SPACE (KEY_GROUP / KEY_VALUE / COMMENT_LINE){0, } ALL_SPACE) at line 10 char 1.
`- Don't know what to do with "5.1 = \"abc" at line 10 char 1.

config:

[channel_logos]
5.1 = "abc.png"

Issues with watching channels on FreeBSD

Hello,

I adapted your install guide as best as I could on my FreeBSD 9.1 system. I compiled ffmpeg from ports with:

AACPLUS
FAAC
FFSERVER
FREETYPE
FREI0R
OPENCV
SCHROEDINGER
THEORA
VORBIS
VO_AACENC
VPX
X264
XVID

I did a gem install bundler and then manually went through your scripts to install the dependencies. I changed the config file to point to my HDHomeRun Prime, made sure the ffmpeg path was correct and then started the server with RACK_ENV=production bundle exec ruby app/app.rb

I am able to browse to the server on port 8888 just fine and I see the channel lineup. However when I click on the channel using safari, it just loops between tuning channel and preparing stream.

The logs are filled with things such as:
10.50.3.142 - - [16/Oct/2013 17:56:11] "GET /channels/2/status HTTP/1.1" 404 - 0.0005
10.50.3.142 - - [16/Oct/2013 17:56:11] "POST /channels/2/tune HTTP/1.1" 200 29 0.0009

I realize that I'm using an unsupported platform, but was hoping someone would be able to shed some light on this.

Unknown encoder 'libfaac'

So... I compiled ffmpeg from source and tried to add libfaac, but it seems that libfaac support has been completely removed from ffmpeg.

http://git.videolan.org/?p=ffmpeg.git;a=commit;h=dc0f711459e0c682bf9f94ba38d26736e90cff45

It seems though that the HDHomeRun Prime is outputting FAAC audio, and the wallop.rb function is calling to just copy the audio streams, so ffmpeg is failing everything when using more modern versions.. any ideas how we can fix this? Maybe I'm not understanding the problem 100% either. Looking at the log looks like the wallop is trying to force faac encoding.. Here is a slice of my ffmpeg log:

Input #0, mpegts, from 'http://192.168.11.138:5004/auto/v1021':
Duration: N/A, start: 20007.707911, bitrate: N/A
Program 1020
Stream #0:0[0x1661], 64, 1/90000: Video: mpeg2video (Main), 1 reference frame ([2][0][0][0] / 0x0002), yuv420p(tv, top first, left), 1920x1080 [SAR 1:1 DAR 16:9], 0/1, Closed Captions, 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
Stream #0:10x1662, 65, 1/90000: Audio: ac3 ([129][0][0][0] / 0x0081), 48000 Hz, stereo, fltp, 384 kb/s
Stream #0:20x1663, 65, 1/90000: Audio: ac3 ([129][0][0][0] / 0x0081), 48000 Hz, stereo, fltp, 384 kb/s
Stream #0:3[0x1664], 0, 1/90000: Data: scte_35, 0/1
Successfully opened the file.
Parsing a group of options: output url /home/rreese/wallop/tmp/1021.m3u8.
Applying option ac (set number of audio channels) with argument 2.
Applying option acodec (force audio codec ('copy' to copy stream)) with argument libfaac.
Applying option b:v (video bitrate (please use -b:v)) with argument 3000k.
Applying option vcodec (force video codec ('copy' to copy stream)) with argument libx264.
Applying option s (set frame size (WxH or abbreviation)) with argument 1280x720.
Applying option r (set frame rate (Hz value, fraction or abbreviation)) with argument 29.97.
Applying option map (set input stream mapping) with argument 0:0.
Applying option map (set input stream mapping) with argument 0:1.
Successfully parsed a group of options.
Opening an output file: /home/rreese/wallop/tmp/1021.m3u8.
Unknown encoder 'libfaac'

Viewing Timeout?

Is is possible to have a viewing timeout? I've noticed over the course of a few weeks we have 1 or 2 sessions that just keep going. I'm not sure if this is due to a roku just getting left playing or if the roku didn't close the session properly.

If it's not something that can easily be implementing I guess we could just restart the wallop server via cron but I'd love a more elegant solution.

Thanks!

500 Internal Server Error when getting channel list

Hi,

When I use urllib or urllib2 in python to get a list of channels the servers returns an 500 error. I can use curl with no issue. I can also use urllib2 to tune and get the status of a channel. It only fails when I try to pull the list. Are there debug logs I can look at? I need to use python because I'm writing an XBMC plugin to play Wallop channels.

Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.

import urllib2
urllib2.urlopen("http://192.168.1.202:8888/channels")
Traceback (most recent call last):
File "", line 1, in
File "/usr/lib/python2.7/urllib2.py", line 127, in urlopen
return _opener.open(url, data, timeout)
File "/usr/lib/python2.7/urllib2.py", line 410, in open
response = meth(req, response)
File "/usr/lib/python2.7/urllib2.py", line 523, in http_response
'http', request, response, code, msg, hdrs)
File "/usr/lib/python2.7/urllib2.py", line 448, in error
return self._call_chain(_args)
File "/usr/lib/python2.7/urllib2.py", line 382, in _call_chain
result = func(_args)
File "/usr/lib/python2.7/urllib2.py", line 531, in http_error_default
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 500: Internal Server Error

New auto-tune isn't working for me

I just did a pull and got #4, but it doesn't appear to be working for me. I'm not sure if I should see a request for /channel/x/tune or a "tuning channel" entry in any of the outputs or logs (I'm not), but I've added a log entry right before the ffmpeg command that I'm not seeing either. It doesn't ever seem to be getting to tune command as near as I can tell.

Output looks as below, with 404s continuing until I eventually give up. Based on #4, I'm guessing the first 404 is expected, but after that it ought to tune...

== Sinatra/1.3.5 has taken the stage on 8888 for production with backup from Thin
>> Thin web server (v1.5.0 codename Knife)
>> Maximum connections set to 1024
>> Listening on 0.0.0.0:8888, CTRL+C to stop

192.168.1.191 - - [21/Jul/2013 10:20:55] "GET /channels/7 HTTP/1.1" 200 2354 0.0212
192.168.1.191 - - [21/Jul/2013 10:20:56] "GET /channels/7.m3u8 HTTP/1.1" 404 - 0.0043
192.168.1.191 - - [21/Jul/2013 10:20:56] "GET /channels/7/status HTTP/1.1" 404 - 0.0039
192.168.1.191 - - [21/Jul/2013 10:20:57] "GET /channels/7/status HTTP/1.1" 404 -

Thoughts?

Installed but just receiving 404s in logs

After installing FFMPEG, the proper GCC tweaks for ML and having the script run successfully (minus the caveat of the "missing" config file from the other issue.) I get Wallop to load, can reach the server page for it, it correctly shows channels but when I go to the stream page for a channel it just continues to spin and I receive the following on the command line:

127.0.0.1 - - [02/Jul/2013 17:44:32] "POST /channels/504/tune HTTP/1.1" 200 29 0.0030
127.0.0.1 - - [02/Jul/2013 17:44:32] "GET /channels/504 HTTP/1.1" 200 2406 0.0047
127.0.0.1 - - [02/Jul/2013 17:44:32] "GET /channels/504.m3u8 HTTP/1.1" 404 - 0.0014
127.0.0.1 - - [02/Jul/2013 17:44:32] "GET /channels/504/status HTTP/1.1" 404 - 0.0014
127.0.0.1 - - [02/Jul/2013 17:44:32] "GET /favicon.ico HTTP/1.1" 404 447 0.0015
127.0.0.1 - - [02/Jul/2013 17:44:33] "GET /channels/504/status HTTP/1.1" 404 - 0.0011
127.0.0.1 - - [02/Jul/2013 17:44:34] "GET /channels/504/status HTTP/1.1" 404 - 0.0011
127.0.0.1 - - [02/Jul/2013 17:44:35] "GET /channels/504/status HTTP/1.1" 404 - 0.0011

I've seen it throw 420 and 404 codes on the .m3u8 step as if its not creating the file or something, any help would be great, this is an AWESOME project.

Preparing stream...

When I hit the web interface I just see, Preparing stream..., tunning channel...

On the console I see this fly on the screen

192.168.15.185 - - [25/Jul/2015 18:05:14] "GET /channels/1999/status HTTP/1.1" 200 88 0.0027
192.168.15.185 - - [25/Jul/2015 18:05:14] "GET /channels/1999/status HTTP/1.1" 200 88 0.0027
192.168.15.185 - - [25/Jul/2015 18:05:14] "GET /channels/1999/status HTTP/1.1" 200 88 0.0030
192.168.15.185 - - [25/Jul/2015 18:05:14] "GET /channels/1999/status HTTP/1.1" 200 88 0.0026
192.168.15.185 - - [25/Jul/2015 18:05:14] "GET /channels/1999/status HTTP/1.1" 200 88 0.0025
192.168.15.185 - - [25/Jul/2015 18:05:14] "GET /channels/1999/status HTTP/1.1" 200 88 0.0026
192.168.15.185 - - [25/Jul/2015 18:05:14] "GET /channels/1999/status HTTP/1.1" 200 88 0.0027
192.168.15.185 - - [25/Jul/2015 18:05:14] "GET /channels/1999/status HTTP/1.1" 200 88 0.0028
192.168.15.185 - - [25/Jul/2015 18:05:14] "GET /channels/1999/status HTTP/1.1" 200 88 0.0027
192.168.15.185 - - [25/Jul/2015 18:05:14] "GET /channels/1999/status HTTP/1.1" 200 88 0.0026
192.168.15.185 - - [25/Jul/2015 18:05:14] "GET /channels/1999/status HTTP/1.1" 200 88 0.0026

What would be some reasons I don't actually see any video displayed in Safari?

Audio only

No matter what I do I can only get audio. Any idea?

Plex?

First let me say wallop is awesome, thanks!

Has anyone got it to work with Plex?

Internal server error

Hi,
Please, I have installed Wallop but I must have done something wrong.
When I run script/start I get "Internal server error" in the browser.
When I run script/server I get "OpenURI::HTTPError at /channels 404 Not Found".
selection_001

I have installed gem, ffmpeg and ruby first and then Wallop.
I changed config file to point to corret host and ffmpeg path.
PS: I have a PRIME.
Could you please shed some light on what could be the issue?
Thanks
Sbre

Terminal output:

Maximum connections set to 1024
Listening on 0.0.0.0:8888, CTRL+C to stop
194.168.0.15 - - [05/Aug/2014 08:37:08] "GET / HTTP/1.1" 302 - 0.0013
OpenURI::HTTPError - 404 Not Found:
/usr/lib/ruby/1.9.1/open-uri.rb:346:in open_http' /usr/lib/ruby/1.9.1/open-uri.rb:775:inbuffer_open'
/usr/lib/ruby/1.9.1/open-uri.rb:203:in block in open_loop' /usr/lib/ruby/1.9.1/open-uri.rb:201:incatch'
/usr/lib/ruby/1.9.1/open-uri.rb:201:in open_loop' /usr/lib/ruby/1.9.1/open-uri.rb:146:inopen_uri'
/usr/lib/ruby/1.9.1/open-uri.rb:677:in open' /usr/lib/ruby/1.9.1/open-uri.rb:33:inopen'
/home/gordo/apps/wallop/lib/wallop.rb:121:in lineup' /home/gordo/apps/wallop/lib/wallop.rb:139:infavorite_lineup'
app/app.rb:45:in block in <class:App>' /home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:1541:incall'
/home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:1541:in block in compile!' /home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:950:in[]'
/home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:950:in block (3 levels) in route!' /home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:966:inroute_eval'
/home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:950:in block (2 levels) in route!' /home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:987:inblock in process_route'
/home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:985:in catch' /home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:985:inprocess_route'
/home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:948:in block in route!' /home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:947:ineach'
/home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:947:in route!' /home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:1059:inblock in dispatch!'
/home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:1041:in block in invoke' /home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:1041:incatch'
/home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:1041:in invoke' /home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:1056:indispatch!'
/home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:882:in block in call!' /home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:1041:inblock in invoke'
/home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:1041:in catch' /home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:1041:ininvoke'
/home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:882:in call!' /home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:870:incall'
/home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/rack-1.5.2/lib/rack/commonlogger.rb:33:in call' /home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:212:incall'
/home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/rack-protection-1.5.0/lib/rack/protection/xss_header.rb:18:in call' /home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/rack-protection-1.5.0/lib/rack/protection/path_traversal.rb:16:incall'
/home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/rack-protection-1.5.0/lib/rack/protection/json_csrf.rb:18:in call' /home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/rack-protection-1.5.0/lib/rack/protection/base.rb:49:incall'
/home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/rack-protection-1.5.0/lib/rack/protection/base.rb:49:in call' /home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/rack-protection-1.5.0/lib/rack/protection/frame_options.rb:31:incall'
/home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/rack-1.5.2/lib/rack/logger.rb:15:in call' /home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/rack-1.5.2/lib/rack/commonlogger.rb:33:incall'
/home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:212:in call' /home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:205:incall'
/home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/rack-1.5.2/lib/rack/head.rb:11:in call' /home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/showexceptions.rb:21:incall'
/home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:175:in call' /home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:1949:incall'
/home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:1449:in block in call' /home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:1726:insynchronize'
/home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/sinatra-1.4.3/lib/sinatra/base.rb:1449:in call' /home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/thin-1.5.1/lib/thin/connection.rb:81:inblock in pre_process'
/home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/thin-1.5.1/lib/thin/connection.rb:79:in catch' /home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/thin-1.5.1/lib/thin/connection.rb:79:inpre_process'
/home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/eventmachine-1.0.3/lib/eventmachine.rb:1037:in call' /home/gordo/apps/wallop/vendor/gems/ruby/1.9.1/gems/eventmachine-1.0.3/lib/eventmachine.rb:1037:inblock in spawn_threadpool'

Log:

Logfile created on 2014-08-05 08:36:48 -0400 by logger.rb/31641

I, [2014-08-05T08:36:48.544000 #20018] INFO -- : Starting up
194.168.0.15 - - [05/Aug/2014 08:37:08] "GET / HTTP/1.1" 302 - 0.0010
194.168.0.15 - - [05/Aug/2014 08:37:08] "GET /sinatra/500.png HTTP/1.1" 304 - 0.0100
194.168.0.15 - - [05/Aug/2014 11:44:49] "GET /sinatra/500.png HTTP/1.1" 304 - 0.0023

"Internal Server Error" on Ubuntu 13.04 w/ HDHomeRun (Dual - NOT the Prime)

I'm probably doing something wrong here, but ...

What I did:

  • apt-get installed bundler and ffmpeg
  • cloned git repository
  • cd'd in, ran script/setup
  • received this error: "cp: cannot stat โ€˜config/config.example.tomlโ€™: No such file or directory"
  • checked /config directory, there was no config.example.toml file, so I commented that line out of the setup script and ran again just in case.
  • manually adjusted the config.toml file for my setup (entered static IP of my HDHomeRun, set it to start at channel 2 since I'm using OTA, adjusted path of ffmpeg to /usr/bin/ffmpeg, and changed transcoding path)
  • started the server
  • was able to connect via browser
  • clicking on links at top for All channels or HD channels just gives me an "Internal Server Error" message.

Now, I realize I'm not running it on the recommended setup at all, but I'm really hoping to get this working. Don't know where the logs are going, since I'm on Ubuntu (if they're going anywhere at all, didn't see a way to change this in any of the included files).

So is this not working because I'm on Linux, because it's not an HDHomeRun Prime, because I'm using OTA, or a combination of any/all of the above?

GREAT WORK by the way. Been waiting on something like this for a long time. This is truly exciting!

HD streams are jittery/pixelated (SD plays fine)

So excited to get this installed and running, thanks for your effort. I'm seeing one issue with my setup, SD streams play fine, but HD streams fail to play. The streams will usually start and immediately become unresponsive and distorted.

Here is my ffmpeg log, any thoughts? Running on Ubuntu 12.04.

Loops preparing and tuning

My installation keeps looping between preparing and tuning. I've seen similar issues on here that main end in correctly installing ACC.

67.185.134.181 - - [15/Aug/2016:21:00:26 -0700] "GET /channels/7/status HTTP/1.1" 200 79 0.0031
67.185.134.181 - - [15/Aug/2016:21:00:27 -0700] "GET /channels/7/status HTTP/1.1" 200 79 0.0030
67.185.134.181 - - [15/Aug/2016:21:00:27 -0700] "GET /channels/7/status HTTP/1.1" 200 79 0.0026
67.185.134.181 - - [15/Aug/2016:21:00:28 -0700] "GET /channels/7/status HTTP/1.1" 404 - 0.0021
67.185.134.181 - - [15/Aug/2016:21:00:28 -0700] "POST /channels/7/tune?resolution=640x360&bitrate=320k&profile=mobile HTTP/1.1" 200 29 0.0165
67.185.134.181 - - [15/Aug/2016:21:00:28 -0700] "GET /channels/7/status HTTP/1.1" 200 79 0.0024
67.185.134.181 - - [15/Aug/2016:21:00:29 -0700] "GET /channels/7/status HTTP/1.1" 200 79 0.0023
67.185.134.181 - - [15/Aug/2016:21:00:29 -0700] "GET /channels/7/status HTTP/1.1" 200 79 0.0024
67.185.134.181 - - [15/Aug/2016:21:00:29 -0700] "GET /channels/7/status HTTP/1.1" 200 79 0.0024
67.185.134.181 - - [15/Aug/2016:21:00:30 -0700] "GET /channels/7/status HTTP/1.1" 200 79 0.0023
67.185.134.181 - - [15/Aug/2016:21:00:30 -0700] "GET /channels/7/status HTTP/1.1" 200 79 0.0024
67.185.134.181 - - [15/Aug/2016:21:00:30 -0700] "GET /channels/7/status HTTP/1.1" 200 79 0.0024
67.185.134.181 - - [15/Aug/2016:21:00:31 -0700] "GET /channels/7/status HTTP/1.1" 200 79 0.0023
67.185.134.181 - - [15/Aug/2016:21:00:31 -0700] "GET /channels/7/status HTTP/1.1" 200 79 0.0025
67.185.134.181 - - [15/Aug/2016:21:00:31 -0700] "GET /channels/7/status HTTP/1.1" 200 79 0.0025
67.185.134.181 - - [15/Aug/2016:21:00:32 -0700] "GET /channels/7/status HTTP/1.1" 404 - 0.0024
67.185.134.181 - - [15/Aug/2016:21:00:32 -0700] "POST /channels/7/tune?resolution=640x360&bitrate=320k&profile=mobile HTTP/1.1" 200 29 0.0045
67.185.134.181 - - [15/Aug/2016:21:00:32 -0700] "GET /channels/7/status HTTP/1.1" 200 79 0.0023
67.185.134.181 - - [15/Aug/2016:21:00:32 -0700] "GET /channels/7/status HTTP/1.1" 200 79 0.0023
67.185.134.181 - - [15/Aug/2016:21:00:33 -0700] "GET /channels/7/status HTTP/1.1" 200 79 0.0023

Well I did the compile and it says I have ACC.

โžœ wallop git:(master) ffmpeg
ffmpeg version N-81350-g3282e31 Copyright (c) 2000-2016 the FFmpeg developers
built with gcc 6.1.1 (GCC) 20160621 (Red Hat 6.1.1-3)
configuration: --enable-gpl --enable-libx264 --enable-libmp3lame --enable-nonfree --enable-libfdk-aac
libavutil 55. 28.100 / 55. 28.100
libavcodec 57. 52.100 / 57. 52.100
libavformat 57. 46.101 / 57. 46.101
libavdevice 57. 0.102 / 57. 0.102
libavfilter 6. 51.100 / 6. 51.100
libswscale 4. 1.100 / 4. 1.100
libswresample 2. 1.100 / 2. 1.100
libpostproc 54. 0.100 / 54. 0.100
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

Use -h to get full help or, even better, run 'man ffmpeg'
โžœ wallop git:(master)

I also think I have the correct settings...

โžœ wallop git:(master) cat config/config.toml
hdhomerun_host = "10.0.0.100"
hdhr_transcode = false
ffmpeg_path = "/usr/local/bin/ffmpeg"
transcoding_path = "./tmp"
port = "8888"
hd_start = 500

[ffmpeg]
threads = 2
acodec = "libfaac"
framerate = "29.97"
h264_preset = "veryfast"
hls_time = 2
hls_wrap = 40
options = "-loglevel warning -async 1 -tune zerolatency -flags -global_header -fflags +genpts -map 0:0 -map 0:1"

[channel_logos]
506 = "cbs.png"
508 = "abc.png"
511 = "fox.png"
512 = "nbc.png"
โžœ wallop git:(master) ls /usr/local/bin/ffmpeg
/usr/local/bin/ffmpeg
โžœ wallop git:(master) ping -c 4 10.0.0.100
PING 10.0.0.100 (10.0.0.100) 56(84) bytes of data.
64 bytes from 10.0.0.100: icmp_seq=1 ttl=64 time=0.261 ms
64 bytes from 10.0.0.100: icmp_seq=2 ttl=64 time=0.369 ms
64 bytes from 10.0.0.100: icmp_seq=3 ttl=64 time=0.373 ms
64 bytes from 10.0.0.100: icmp_seq=4 ttl=64 time=0.374 ms

--- 10.0.0.100 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3000ms
rtt min/avg/max/mdev = 0.261/0.344/0.374/0.049 ms
โžœ wallop git:(master)

Ubuntu 15.04, Google Chrome not working

Hi,

I'm running wallop from a docker container on Ubuntu 14.04 server. I'm trying to watch stream in Google Chrome browser on Ubuntu 15.04 x64. I get :
image
but stream does not start to play.

This is part of wallop.log:

212.56.227.238 - - [05/Nov/2015 09:11:58] "GET /channels/5012 HTTP/1.1" 200 4891 0.0009
212.56.227.238 - - [05/Nov/2015 09:11:58] "GET /css/bootstrap.min.css HTTP/1.1" 304 - 0.0006
212.56.227.238 - - [05/Nov/2015 09:11:58] "GET /css/bootstrap-responsive.min.css HTTP/1.1" 304 - 0.0007
212.56.227.238 - - [05/Nov/2015 09:11:58] "GET /css/styles.css HTTP/1.1" 304 - 0.0015
212.56.227.238 - - [05/Nov/2015 09:11:58] "GET /css/font-awesome.min.css HTTP/1.1" 304 - 0.0021
212.56.227.238 - - [05/Nov/2015 09:11:58] "GET /js/jquery-ui-1.9.1.min.js HTTP/1.1" 304 - 0.0020
212.56.227.238 - - [05/Nov/2015 09:11:58] "GET /js/jquery-1.9.1.min.js HTTP/1.1" 304 - 0.0019
212.56.227.238 - - [05/Nov/2015 09:11:58] "GET /js/plugins/spin.min.js HTTP/1.1" 304 - 0.0006
212.56.227.238 - - [05/Nov/2015 09:11:58] "GET /js/plugins/jquery.spin.js HTTP/1.1" 304 - 0.0005
212.56.227.238 - - [05/Nov/2015 09:11:58] "GET /js/bootstrap.min.js HTTP/1.1" 304 - 0.0006
212.56.227.238 - - [05/Nov/2015 09:11:58] "GET /js/src/channel.coffee HTTP/1.1" 304 - 0.0005
212.56.227.238 - - [05/Nov/2015 09:11:58] "GET /js/src/favorites.coffee HTTP/1.1" 304 - 0.0006
212.56.227.238 - - [05/Nov/2015 09:11:58] "GET /js/src/settings.coffee HTTP/1.1" 304 - 0.0005
212.56.227.238 - - [05/Nov/2015 09:11:58] "GET /js/coffee-script.js HTTP/1.1" 304 - 0.0006
212.56.227.238 - - [05/Nov/2015 09:11:58] "GET /js/src/channel.coffee HTTP/1.1" 304 - 0.0010
212.56.227.238 - - [05/Nov/2015 09:11:58] "GET /channels/5012.m3u8 HTTP/1.1" 206 - 0.0023
212.56.227.238 - - [05/Nov/2015 09:11:59] "GET /channels/5012/status HTTP/1.1" 200 81 0.0015
212.56.227.238 - - [05/Nov/2015 09:11:59] "GET /js/src/favorites.coffee HTTP/1.1" 304 - 0.0013
212.56.227.238 - - [05/Nov/2015 09:11:59] "GET /channels/5012.m3u8 HTTP/1.1" 206 - 0.0017

and ffmpeg.log:

root@fb45c60c6b36:/wallop/log# tail -f ffmpeg.log 
[mpeg2video @ 0x34a9e20] Invalid frame dimensions 0x0.
    Last message repeated 9 times

wallop HTTP interface stuck on "preparing stream"

Just installed wallop since i have HDHomerun prime. Though when i try opening any channel. it gets stuck on "preparing stream"

On terminal, see this.

127.0.0.1 - - [14/Oct/2013 23:24:43] "GET /channels/622/status HTTP/1.1" 200 87 0.0008
127.0.0.1 - - [14/Oct/2013 23:24:44] "GET /channels/622/status HTTP/1.1" 200 87 0.0008
127.0.0.1 - - [14/Oct/2013 23:24:45] "GET /channels/622/status HTTP/1.1" 200 87 0.0009
127.0.0.1 - - [14/Oct/2013 23:24:46] "GET /channels/622/status HTTP/1.1" 200 87 0.0008
127.0.0.1 - - [14/Oct/2013 23:24:47] "GET /channels/622/status HTTP/1.1" 200 87 0.0008
127.0.0.1 - - [14/Oct/2013 23:24:48] "GET /channels/622/status HTTP/1.1" 200 87 0.0008
127.0.0.1 - - [14/Oct/2013 23:24:49] "GET /channels/622/status HTTP/1.1" 200 87 0.0008

mavericks help

I am having issues setting this up w/ Mavericks.

I've tried installing ffmpeg with brew, however it appears that brew doesn't fully support the Xcode version that ships with mavericks.

Error: Homebrew doesn't know what compiler versions ship with your version of
Xcode.

I found a precompiled version of ffmpeg but apparently its not compiled with fdk_aac
http://ffmpegmac.net ffmpeg pre compiled

I receive the following in the ffmpeg log while trying to play any stream via wallop...

[mpeg2video @ 0x7f9c7501d200] Invalid frame dimensions 0x0.
Last message repeated 8 times
Unknown encoder 'libfdk_aac'

If anyone has had luck compiling ffmpeg in Mavericks can you point me in the right direction.

Thanks in advance!!

Error running setup, should add one step to README

Hi, I was attempting to get wallop working on my server but the bundle install in the setup/script was failing.

/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/mkmf.rb:434:in `try_do': The compiler failed to generate an executable file. (RuntimeError)
You have to install development tools first.
        from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/mkmf.rb:513:in `block in try_link0'
        from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/tmpdir.rb:88:in `mktmpdir'
        from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/mkmf.rb:510:in `try_link0'
        from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/mkmf.rb:534:in `try_link'
        from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/mkmf.rb:620:in `block in try_ldflags'
        from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/mkmf.rb:613:in `with_ldflags'
        from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/mkmf.rb:619:in `try_ldflags'
        from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/mkmf.rb:1725:in `pkg_config'
        from extconf.rb:65:in `pkg_config_wrapper'
        from extconf.rb:92:in `<main>'

To see why this extension failed to compile, please check the mkmf.log which can be found here:

  /Users/ejakubowski/wallop/vendor/gems/ruby/2.0.0/extensions/universal-darwin-14/2.0.0/eventmachine-1.2.0.1/mkmf.log

extconf failed, exit code 1

Gem files will remain installed in /Users/ejakubowski/wallop/vendor/gems/ruby/2.0.0/gems/eventmachine-1.2.0.1 for inspection.
Results logged to /Users/ejakubowski/wallop/vendor/gems/ruby/2.0.0/extensions/universal-darwin-14/2.0.0/eventmachine-1.2.0.1/gem_make.out

An error occurred while installing eventmachine (1.2.0.1), and Bundler cannot continue.
Make sure that `gem install eventmachine -v '1.2.0.1'` succeeds before bundling.

Based on the errors I installed the xcode command line tools with the following command:

xcode-select --install

After installing that the error went away and setup worked. I'm running on a Mac Yosemite. Thanks!

Changing channels results in multiple ffmpeg processes

I'm running this on a lightweight virtual server that only has enough resources to handle 1 channel at a time. If I start watching a channel then change to another, the system will spawn multiple ffmpeg processes until the unwatched one reaches some timeout. But until that timeout occurs, my latest channel is unwatchable due to resource contention of ffmpegs. Please add something like a max ffmpeg process setting to the config

Not Showing on CentOS release 6.2 (Final) x64

I have compiled ffmpeg by following Centos instruction at https://trac.ffmpeg.org/wiki/CentosCompilationGuide.

I see a dark grey frame saying "Stream is ready", but nothing is playing from channel 600. I am using FIOS in NJ. The top of ffmpeg log is as below. If you knew the fix, this would be a quickie for me. Otherwise, I will have to find time to dig into ffmpeg code to find the fixes.

[mpeg2video @ 0x205ca60] Invalid frame dimensions 0x0.
Last message repeated 24 times
[mpegts @ 0x2057040] Could not find codec parameters for stream 2 (Unknown: none ([5][0][0][0] / 0x0005)): unknown codec
Consider increasing the value for the 'analyzeduration' and 'probesize' options
[ac3 @ 0x205d4c0] frame sync error
Error while decoding stream #0:1: Invalid data found when processing input
[mpegts @ 0x2057040] PES packet size mismatch
Last message repeated 1 times
[ac3 @ 0x205d4c0] exponent out-of-range
[ac3 @ 0x205d4c0] error decoding the audio block
[mpegts @ 0x2057040] PES packet size mismatch
[ac3 @ 0x205d4c0] frame sync error
Error while decoding stream #0:1: Invalid data found when processing input
[mpeg2video @ 0x205ca60] ac-tex damaged at 7 64
[mpeg2video @ 0x205ca60] 00 motion_type at 41 5
[mpeg2video @ 0x205ca60] invalid mb type in P Frame at 36 6

Problem after upgrading to mavericks

after upgrading I'm getting this?/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:45:in require': cannot load such file -- bundler/setup (LoadError) from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:45:inrequire'
from bin/rackup:14:in `

'

assume something is wrong with my ruby? but I'm not up on ruby.

Any ideas?

thanks!

Video stutter / choppy both SD and HD regardless of resolution or bitrate

Maddox, I love your work on Wallop and it has caused me to explore ffmpeg and its streaming capabilities. I also had to learn a bit about ruby, home-brew etc. Thanks for the effort you have put into this. The streams I get are usable, but with some issues. Even after letting them line out for a minute or two, I still have issues and am trying to find out what can be done to get smooth HD video (720 p would be OK).

I am using ffmpeg 2.2.2 and have tried different versions of x264.rb as your vendor file does not have a copy. What do you suggest as the best source for x264.rb as the versions do vary greatly?

I get choppy video or stutter and pixilation several times per minute. I am on a desktop Mac with ethernet connection to the HDHomeRun. I am using a quad core i5 running at 3.4 Ghz and 16 GB of Ram.

So my issue seems to be software and not hardware related. Here is a small segment of the ffmpeg log file:

[mpeg2video @ 0x7f9c0a81d200] Invalid frame dimensions 0x0.
Last message repeated 18 times
[mpegts @ 0x7f9c0a017800] Could not find codec parameters for stream 2 (Unknown: none ([134][0][0][0] / 0x0086)): unknown codec
Consider increasing the value for the 'analyzeduration' and 'probesize' options
[mpegts @ 0x7f9c0a017800] PES packet size mismatch
[ac3 @ 0x7f9c0a81d800] exponent out-of-range
[ac3 @ 0x7f9c0a81d800] error decoding the audio block
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 7 51
[mpeg2video @ 0x7f9c0a81d200] invalid mb type in P Frame at 37 52
[mpeg2video @ 0x7f9c0a81d200] ac-tex damaged at 1 53
[mpeg2video @ 0x7f9c0a81d200] invalid mb type in P Frame at 10 54
[mpeg2video @ 0x7f9c0a81d200] ac-tex damaged at 1 55
[mpeg2video @ 0x7f9c0a81d200] ac-tex damaged at 1 56
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 5 57
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 1 58
[mpeg2video @ 0x7f9c0a81d200] ac-tex damaged at 39 59
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 16 60
[mpeg2video @ 0x7f9c0a81d200] ac-tex damaged at 18 61
[mpeg2video @ 0x7f9c0a81d200] invalid mb type in P Frame at 1 62
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 48 63
[mpeg2video @ 0x7f9c0a81d200] mb incr damaged
[mpeg2video @ 0x7f9c0a81d200] ac-tex damaged at 13 65
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 25 66
[mpeg2video @ 0x7f9c0a81d200] mb incr damaged
[mpeg2video @ 0x7f9c0a81d200] invalid mb type in P Frame at 18 49
[mpeg2video @ 0x7f9c0a81d200] mb incr damaged
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 17 23
[mpeg2video @ 0x7f9c0a81d200] mb incr damaged
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 16 25
[mpeg2video @ 0x7f9c0a81d200] invalid mb type in P Frame at 20 26
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 1 27
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 4 28
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 23 29
[mpeg2video @ 0x7f9c0a81d200] ac-tex damaged at 31 30
[mpeg2video @ 0x7f9c0a81d200] ac-tex damaged at 10 31
[mpeg2video @ 0x7f9c0a81d200] invalid mb type in P Frame at 38 32
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 1 33
[mpeg2video @ 0x7f9c0a81d200] mb incr damaged
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 12 35
[mpeg2video @ 0x7f9c0a81d200] ac-tex damaged at 1 36
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 3 37
[mpeg2video @ 0x7f9c0a81d200] ac-tex damaged at 0 38
[mpeg2video @ 0x7f9c0a81d200] ac-tex damaged at 1 39
[mpeg2video @ 0x7f9c0a81d200] slice mismatch
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 5 41
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 5 42
[mpeg2video @ 0x7f9c0a81d200] ac-tex damaged at 7 43
[mpeg2video @ 0x7f9c0a81d200] invalid cbp 0 at 8 44
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 24 45
[mpeg2video @ 0x7f9c0a81d200] ac-tex damaged at 3 46
[mpeg2video @ 0x7f9c0a81d200] ac-tex damaged at 1 47
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 4 48
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 0 49
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 15 50
[mpeg2video @ 0x7f9c0a81d200] Warning MVs not available
[ac3 @ 0x7f9c0a81d800] frame sync error
Error while decoding stream #0:1: Invalid data found when processing input
[mpegts @ 0x7f9c0a017800] PES packet size mismatch
[ac3 @ 0x7f9c0a81d800] bandwidth code = 62 > 60
[ac3 @ 0x7f9c0a81d800] error decoding the audio block
[mpeg2video @ 0x7f9c0a81d200] ac-tex damaged at 0 34
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 1 35
[mpeg2video @ 0x7f9c0a81d200] skip with previntra
[mpeg2video @ 0x7f9c0a81d200] ac-tex damaged at 0 37
[mpeg2video @ 0x7f9c0a81d200] skip with previntra
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 3 38
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 14 52
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 6 39
[mpeg2video @ 0x7f9c0a81d200] skip with previntra
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 7 40
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 9 54
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 14 41
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 9 55
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 2 42
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 7 56
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 15 43
[mpeg2video @ 0x7f9c0a81d200] ac-tex damaged at 0 57
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 33 44
[mpeg2video @ 0x7f9c0a81d200] mb incr damaged
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 28 45
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 3 59
[mpeg2video @ 0x7f9c0a81d200] mb incr damaged
[mpeg2video @ 0x7f9c0a81d200] invalid mb type in B Frame at 19 46
[mpeg2video @ 0x7f9c0a81d200] invalid mb type in B Frame at 3 61
[mpeg2video @ 0x7f9c0a81d200] ac-tex damaged at 0 47
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 18 62
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 6 48
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 2 63
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 12 49
[mpeg2video @ 0x7f9c0a81d200] mb incr damaged
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 6 50
[mpeg2video @ 0x7f9c0a81d200] ac-tex damaged at 7 65
[mpeg2video @ 0x7f9c0a81d200] ac-tex damaged at 25 66
[mpeg2video @ 0x7f9c0a81d200] mb incr damaged
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 87 26
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 2 11
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 1 12
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 5 13
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 2 14
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 1 15
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 9 16
[mpeg2video @ 0x7f9c0a81d200] ac-tex damaged at 2 17
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 2 18
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 2 19
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 2 20
[mpeg2video @ 0x7f9c0a81d200] ac-tex damaged at 0 21
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 11 22
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 11 23
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 33 24
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 1 25
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 2 26
[mpeg2video @ 0x7f9c0a81d200] mb incr damaged
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 27 28
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 3 29
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 26 30
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 28 31
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 4 32
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 12 33
[ac3 @ 0x7f9c0a81d800] frame sync error
Error while decoding stream #0:1: Invalid data found when processing input
[mpegts @ 0x7f9c0a017800] PES packet size mismatch
[ac3 @ 0x7f9c0a81d800] frame sync error
Error while decoding stream #0:1: Invalid data found when processing input
[mpeg2video @ 0x7f9c0a81d200] invalid mb type in B Frame at 10 51
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 28 52
[mpeg2video @ 0x7f9c0a81d200] 00 motion_type at 8 53

Wallop loads, but no channel list

Hello,

Sorry if a noob post / question, but I can't seem to get any channel data to load upon starting up wallop. The menu is visible, and I have setup my config file to point to the ip address of the homerun. I have noticed that there isn't a channels directory at all. (in app\public) Is this something that wallop automatically creates, or have I mucked something during installation? Would really love to get this working, but I seem to have hit a roadblock. Any suggestions? I can paste logs if needed, but I'm not showing any errors (404's or otherwise)...

[Docker] Can't open Web Interface

I'm using the docker image and I followed your instructions.

When I try to connect to the WebUI I get these errors:

wallop_1      | 10.0.0.61 - - [02/Nov/2016:01:01:56 +0000] "GET /channels/1/status HTTP/1.1" 404 - 0.0021
wallop_1      | 2016-11-02 01:01:56 - NoMethodError - undefined method `[]' for nil:NilClass:
wallop_1      | 	/wallop/lib/wallop.rb:29:in `ffmpeg_command'
wallop_1      | 	app/app.rb:75:in `block in <class:App>'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1611:in `call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1611:in `block in compile!'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:975:in `block (3 levels) in route!'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:994:in `route_eval'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:975:in `block (2 levels) in route!'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1015:in `block in process_route'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1013:in `catch'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1013:in `process_route'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:973:in `block in route!'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:972:in `each'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:972:in `route!'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1085:in `block in dispatch!'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in `block in invoke'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in `catch'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in `invoke'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1082:in `dispatch!'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:907:in `block in call!'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in `block in invoke'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in `catch'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in `invoke'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:907:in `call!'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:895:in `call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/rack-1.6.4/lib/rack/commonlogger.rb:33:in `call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:219:in `call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/rack-protection-1.5.3/lib/rack/protection/xss_header.rb:18:in `call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/rack-protection-1.5.3/lib/rack/protection/path_traversal.rb:16:in `call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/rack-protection-1.5.3/lib/rack/protection/json_csrf.rb:18:in `call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/rack-protection-1.5.3/lib/rack/protection/base.rb:49:in `call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/rack-protection-1.5.3/lib/rack/protection/base.rb:49:in `call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/rack-protection-1.5.3/lib/rack/protection/frame_options.rb:31:in `call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/rack-1.6.4/lib/rack/logger.rb:15:in `call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/rack-1.6.4/lib/rack/commonlogger.rb:33:in `call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:219:in `call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:212:in `call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/rack-1.6.4/lib/rack/head.rb:13:in `call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:182:in `call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:2013:in `call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1487:in `block in call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1787:in `synchronize'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1487:in `call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/thin-1.6.4/lib/thin/connection.rb:86:in `block in pre_process'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/thin-1.6.4/lib/thin/connection.rb:84:in `catch'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/thin-1.6.4/lib/thin/connection.rb:84:in `pre_process'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/eventmachine-1.2.0.1/lib/eventmachine.rb:1076:in `call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/eventmachine-1.2.0.1/lib/eventmachine.rb:1076:in `block in spawn_threadpool'

Or:

wallop_1      | 10.0.0.61 - - [02/Nov/2016:01:02:02 +0000] "GET /channels?type=hd HTTP/1.1" 500 30 0.0097
wallop_1      | 2016-11-02 01:02:05 - NoMethodError - undefined method `[]' for nil:NilClass:
wallop_1      | 	/wallop/lib/wallop.rb:128:in `block in lineup'
wallop_1      | 	/wallop/lib/wallop.rb:126:in `each'
wallop_1      | 	/wallop/lib/wallop.rb:126:in `lineup'
wallop_1      | 	app/app.rb:47:in `block in <class:App>'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1611:in `call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1611:in `block in compile!'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:975:in `block (3 levels) in route!'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:994:in `route_eval'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:975:in `block (2 levels) in route!'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1015:in `block in process_route'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1013:in `catch'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1013:in `process_route'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:973:in `block in route!'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:972:in `each'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:972:in `route!'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1085:in `block in dispatch!'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in `block in invoke'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in `catch'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in `invoke'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1082:in `dispatch!'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:907:in `block in call!'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in `block in invoke'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in `catch'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in `invoke'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:907:in `call!'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:895:in `call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/rack-1.6.4/lib/rack/commonlogger.rb:33:in `call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:219:in `call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/rack-protection-1.5.3/lib/rack/protection/xss_header.rb:18:in `call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/rack-protection-1.5.3/lib/rack/protection/path_traversal.rb:16:in `call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/rack-protection-1.5.3/lib/rack/protection/json_csrf.rb:18:in `call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/rack-protection-1.5.3/lib/rack/protection/base.rb:49:in `call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/rack-protection-1.5.3/lib/rack/protection/base.rb:49:in `call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/rack-protection-1.5.3/lib/rack/protection/frame_options.rb:31:in `call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/rack-1.6.4/lib/rack/logger.rb:15:in `call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/rack-1.6.4/lib/rack/commonlogger.rb:33:in `call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:219:in `call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:212:in `call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/rack-1.6.4/lib/rack/head.rb:13:in `call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:182:in `call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:2013:in `call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1487:in `block in call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1787:in `synchronize'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1487:in `call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/thin-1.6.4/lib/thin/connection.rb:86:in `block in pre_process'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/thin-1.6.4/lib/thin/connection.rb:84:in `catch'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/thin-1.6.4/lib/thin/connection.rb:84:in `pre_process'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/eventmachine-1.2.0.1/lib/eventmachine.rb:1076:in `call'
wallop_1      | 	/wallop/vendor/gems/ruby/2.3.0/gems/eventmachine-1.2.0.1/lib/eventmachine.rb:1076:in `block in spawn_threadpool'

no video... http 404 and 420

Super idea!

I am not getting video in browser, lets me select channels and then alternates between tuning/prepairing messages. Any idea where i should be looking to fix?

Setup works streaming to VLC client

Hardware Model HDHR3-CC
Firmware Version 20140121
DTCP-IP DTCP 1.7-SD20130219
WMDRM-NDT WMDRM 10-SD20130219
Memory Report 64 MB SDRAM, 2 MB Flash

Computer: MBP 2013
Browser: safari

== Sinatra/1.4.3 has taken the stage on 8888 for development with backup from Thin

Thin web server (v1.5.1 codename Straight Razor)
Maximum connections set to 1024
Listening on 0.0.0.0:8888, CTRL+C to stop
127.0.0.1 - - [28/Feb/2014 07:59:39] "GET / HTTP/1.1" 302 - 0.0019
127.0.0.1 - - [28/Feb/2014 07:59:39] "GET / HTTP/1.1" 302 - 0.0006
127.0.0.1 - - [28/Feb/2014 07:59:39] "GET /channels?type=favorites HTTP/1.1" 200 6071 0.0390
127.0.0.1 - - [28/Feb/2014 07:59:42] "GET /channels/504 HTTP/1.1" 200 4589 0.0031
127.0.0.1 - - [28/Feb/2014 07:59:42] "GET /channels/504/status HTTP/1.1" 404 - 0.0007
127.0.0.1 - - [28/Feb/2014 07:59:42] "GET /channels/504.m3u8 HTTP/1.1" 404 - 0.0006
127.0.0.1 - - [28/Feb/2014 07:59:42] "POST /channels/504/tune?resolution=1280x720&bitrate=8000k HTTP/1.1" 200 29 0.0028
127.0.0.1 - - [28/Feb/2014 07:59:42] "GET /channels/504.m3u8 HTTP/1.1" 420 - 0.0006
127.0.0.1 - - [28/Feb/2014 07:59:42] "GET /channels/504.m3u8 HTTP/1.1" 420 - 0.0005
127.0.0.1 - - [28/Feb/2014 07:59:43] "GET /channels/504/status HTTP/1.1" 200 82 0.0006
127.0.0.1 - - [28/Feb/2014 07:59:44] "GET /channels/504/status HTTP/1.1" 200 82 0.0006
127.0.0.1 - - [28/Feb/2014 07:59:45] "GET /channels/504/status HTTP/1.1" 200 82 0.0006
127.0.0.1 - - [28/Feb/2014 07:59:46] "GET /channels/504/status HTTP/1.1" 404 - 0.0006
127.0.0.1 - - [28/Feb/2014 07:59:46] "POST /channels/504/tune?resolution=1280x720&bitrate=8000k HTTP/1.1" 200 29 0.0009

plist doesn't work

Sep 18 15:52:05 xxxx com.apple.xpc.launchd1: Service could not initialize: Unable to set current working directory. error = 2: No such file or directory, path = /usr/opt/wallop: 15F34: xpcproxy + 12068 [1343][F7717708-ACF7-307D-B04E-998DFC36598F]: 0x2

The WorkingDirectory key is correct in the plist but the service won't start. I can't find any reference to /usr/opt/wallop anywhere. Not in the wallop dir, not in the com.wallop.plist file that I've generated from your scripts.

Channel never becomes ready for streaming

Looking at the Prime's tuner logs, you can see Wallop tuning and un-tuning at an alarmingly quick rate as well. Any ideas what may be causing this?

I, [2017-01-10T00:14:50.390900 #80097]  INFO -- : Tuning channel 760 with transcode profile mobile
I, [2017-01-10T00:14:50.391200 #80097]  INFO -- : Creating session for channel 760
192.168.1.184 - - [10/Jan/2017:00:14:50 -0800] "POST /channels/760/tune?resolution=1280x720&bitrate=3000k&profile=mobile HTTP/1.1" 200 29 0.0013
192.168.1.184 - - [10/Jan/2017:00:14:50 -0800] "POST /channels/760/tune?resolution=1280x720&bitrate=3000k&profile=mobile HTTP/1.1" 200 29 0.0004
192.168.1.184 - - [10/Jan/2017:00:14:50 -0800] "POST /channels/760/tune?resolution=1280x720&bitrate=3000k&profile=mobile HTTP/1.1" 200 29 0.0003
192.168.1.184 - - [10/Jan/2017:00:14:50 -0800] "POST /channels/760/tune?resolution=1280x720&bitrate=3000k&profile=mobile HTTP/1.1" 200 29 0.0003
192.168.1.184 - - [10/Jan/2017:00:14:50 -0800] "POST /channels/760/tune?resolution=1280x720&bitrate=3000k&profile=mobile HTTP/1.1" 200 29 0.0003
192.168.1.184 - - [10/Jan/2017:00:14:50 -0800] "POST /channels/760/tune?resolution=1280x720&bitrate=3000k&profile=mobile HTTP/1.1" 200 29 0.0003
192.168.1.184 - - [10/Jan/2017:00:14:50 -0800] "POST /channels/760/tune?resolution=1280x720&bitrate=3000k&profile=mobile HTTP/1.1" 200 29 0.0004
192.168.1.184 - - [10/Jan/2017:00:14:50 -0800] "POST /channels/760/tune?resolution=1280x720&bitrate=3000k&profile=mobile HTTP/1.1" 200 29 0.0003
I, [2017-01-10T00:14:50.432751 #80097]  INFO -- : CHECKING READY STATUS OF SESSION - {:channel=>"760", :pid=>80101, :ready=>false, :last_read=>2017-01-10 00:14:50 -0800}
I, [2017-01-10T00:14:50.933099 #80097]  INFO -- : CHECKING READY STATUS OF SESSION - {:channel=>"760", :pid=>80101, :ready=>false, :last_read=>2017-01-10 00:14:50 -0800}
I, [2017-01-10T00:14:51.434744 #80097]  INFO -- : CHECKING READY STATUS OF SESSION - {:channel=>"760", :pid=>80101, :ready=>false, :last_read=>2017-01-10 00:14:50 -0800}
I, [2017-01-10T00:14:51.939506 #80097]  INFO -- : CHECKING READY STATUS OF SESSION - {:channel=>"760", :pid=>80101, :ready=>false, :last_read=>2017-01-10 00:14:50 -0800}
192.168.1.184 - - [10/Jan/2017:00:14:52 -0800] "GET /channels/760/status HTTP/1.1" 200 83 0.0004
I, [2017-01-10T00:14:52.441468 #80097]  INFO -- : CHECKING READY STATUS OF SESSION - {:channel=>"760", :pid=>80101, :ready=>false, :last_read=>2017-01-10 00:14:50 -0800}
I, [2017-01-10T00:14:52.942747 #80097]  INFO -- : CHECKING READY STATUS OF SESSION - {:channel=>"760", :pid=>80101, :ready=>false, :last_read=>2017-01-10 00:14:50 -0800}
I, [2017-01-10T00:14:53.444934 #80097]  INFO -- : CHECKING READY STATUS OF SESSION - {:channel=>"760", :pid=>80101, :ready=>false, :last_read=>2017-01-10 00:14:50 -0800}
I, [2017-01-10T00:14:53.950279 #80097]  INFO -- : CHECKING READY STATUS OF SESSION - {:channel=>"760", :pid=>80101, :ready=>false, :last_read=>2017-01-10 00:14:50 -0800}
I, [2017-01-10T00:14:53.950402 #80097]  INFO -- : SESSSION COMPLETED - CLEANING UP - 760 - 80101
192.168.1.184 - - [10/Jan/2017:00:14:54 -0800] "GET /channels/760/status HTTP/1.1" 404 - 0.0004
I, [2017-01-10T00:14:54.397424 #80097]  INFO -- : Tuning channel 760 with transcode profile mobile
I, [2017-01-10T00:14:54.397788 #80097]  INFO -- : Creating session for channel 760
192.168.1.184 - - [10/Jan/2017:00:14:54 -0800] "POST /channels/760/tune?resolution=1280x720&bitrate=3000k&profile=mobile HTTP/1.1" 200 29 0.0010
192.168.1.184 - - [10/Jan/2017:00:14:54 -0800] "POST /channels/760/tune?resolution=1280x720&bitrate=3000k&profile=mobile HTTP/1.1" 200 29 0.0003
192.168.1.184 - - [10/Jan/2017:00:14:54 -0800] "POST /channels/760/tune?resolution=1280x720&bitrate=3000k&profile=mobile HTTP/1.1" 200 29 0.0009
192.168.1.184 - - [10/Jan/2017:00:14:54 -0800] "POST /channels/760/tune?resolution=1280x720&bitrate=3000k&profile=mobile HTTP/1.1" 200 29 0.0005
192.168.1.184 - - [10/Jan/2017:00:14:54 -0800] "POST /channels/760/tune?resolution=1280x720&bitrate=3000k&profile=mobile HTTP/1.1" 200 29 0.0004
192.168.1.184 - - [10/Jan/2017:00:14:54 -0800] "POST /channels/760/tune?resolution=1280x720&bitrate=3000k&profile=mobile HTTP/1.1" 200 29 0.0007
192.168.1.184 - - [10/Jan/2017:00:14:54 -0800] "POST /channels/760/tune?resolution=1280x720&bitrate=3000k&profile=mobile HTTP/1.1" 200 29 0.0004
192.168.1.184 - - [10/Jan/2017:00:14:54 -0800] "POST /channels/760/tune?resolution=1280x720&bitrate=3000k&profile=mobile HTTP/1.1" 200 29 0.0003
192.168.1.184 - - [10/Jan/2017:00:14:54 -0800] "POST /channels/760/tune?resolution=1280x720&bitrate=3000k&profile=mobile HTTP/1.1" 200 29 0.0003
192.168.1.184 - - [10/Jan/2017:00:14:54 -0800] "POST /channels/760/tune?resolution=1280x720&bitrate=3000k&profile=mobile HTTP/1.1" 200 29 0.0002
192.168.1.184 - - [10/Jan/2017:00:14:54 -0800] "POST /channels/760/tune?resolution=1280x720&bitrate=3000k&profile=mobile HTTP/1.1" 200 29 0.0002
192.168.1.184 - - [10/Jan/2017:00:14:54 -0800] "POST /channels/760/tune?resolution=1280x720&bitrate=3000k&profile=mobile HTTP/1.1" 200 29 0.0003
192.168.1.184 - - [10/Jan/2017:00:14:54 -0800] "POST /channels/760/tune?resolution=1280x720&bitrate=3000k&profile=mobile HTTP/1.1" 200 29 0.0002
192.168.1.184 - - [10/Jan/2017:00:14:54 -0800] "POST /channels/760/tune?resolution=1280x720&bitrate=3000k&profile=mobile HTTP/1.1" 200 29 0.0003
192.168.1.184 - - [10/Jan/2017:00:14:54 -0800] "POST /channels/760/tune?resolution=1280x720&bitrate=3000k&profile=mobile HTTP/1.1" 200 29 0.0005
192.168.1.184 - - [10/Jan/2017:00:14:54 -0800] "POST /channels/760/tune?resolution=1280x720&bitrate=3000k&profile=mobile HTTP/1.1" 200 29 0.0003
I, [2017-01-10T00:14:54.450850 #80097]  INFO -- : CHECKING READY STATUS OF SESSION - {:channel=>"760", :pid=>80103, :ready=>false, :last_read=>2017-01-10 00:14:54 -0800}
I, [2017-01-10T00:14:54.956187 #80097]  INFO -- : CHECKING READY STATUS OF SESSION - {:channel=>"760", :pid=>80103, :ready=>false, :last_read=>2017-01-10 00:14:54 -0800}
I, [2017-01-10T00:14:55.461496 #80097]  INFO -- : CHECKING READY STATUS OF SESSION - {:channel=>"760", :pid=>80103, :ready=>false, :last_read=>2017-01-10 00:14:54 -0800}

Docker Image

I have created a Docker image which contains the latest FFMPEG and Wallop. It can be found here:

https://registry.hub.docker.com/u/ipstatic/wallop/

I don't know if you would like to add it to the README or some other means to communicate it to anyone interested. Let me know if I can help in any way (adding a pull request with the updated README for example).

Error when attempting to launch script/server

I get this error:

Failed to match sequence (ALL_SPACE (TABLE / TABLE_ARRAY / KEY_VALUE / COMMENT_LINE){0, } ALL_SPACE) at line 5 char 1.
- Don't know what to do with "port = โ€œ88" at line 5 char 1. /Users/MoyChan/wallop/lib/wallop.rb:54:in expand_path': no implicit conversion of nil into String (TypeError)
from /Users/MoyChan/wallop/lib/wallop.rb:54:in transcoding_path' from /Users/MoyChan/wallop/lib/wallop.rb:59:in setup'
from /Users/MoyChan/wallop/app/boot.rb:22:in <top (required)>' from app/app.rb:2:in require'
from app/app.rb:2:in `

'

I'm EXTREMELY green and can not for the life of me figure this out. Help!

H.265 support?

Would love to see support for H.265, with an option in settings to select desired codec. I know there aren't many devices that offer native support for it yet but being able to stream 1080p video in the same 3Mbps network footprint that a 720p H.264 stream consumes now would be pretty cool.

Expose bitrate, encoder, and other params in config

This is a suggestion for a future enhancement. I am using the graphics accelerated ffmpeg which uses a different video codec, h264_qsv instead of libx264. I'm also using wallop in conjunction with Roku-HDHomeRun and the quality seems to default to 3000k, but I would like it higher (ideal for hardwired connections). I also like to copy the audio as is instead of defaulting to 2 channel AAC. Thanks.

Issue with launchd

Several months ago when I first set this up I was able to install the process and have it boot on startup. However in the past month or so (first time getting to reporting it) the process says its already installed but it doesnt appear to boot automatically or recover from being stopped, I have manually launch it.

I've attempted numerous uninstall / reinstalls and just think I'm not doing something in the right order to clean up whatever went wrong.

Any suggestions?

Apache2 proxy via location

Not sure if this is something that needs a tweak to the underlying code or my own stupidity, but I'm trying to use Apache to proxy to wallop so that I can access my HDHR remotely from work and other firewalled locations (where port 8888 is blocked).

My apache config file contains the following:

 <Location /wallop>
 ProxyPass http://[wallop host]:8888/
 ProxyPassReverse http://[wallop host]:8888/
 RequestHeader set X-Forwarded-Proto "https"
 Order Deny,Allow
 Deny from all
 allow from [my specified IPs/domains]
 Satisfy any
 </Location>

When I got to https://[my apache host]/wallop I clearly get directed to the wallop server. But none of the urls that wallop generates internally to redirect between favorites/all channels/streams are rewritten to have an initial "wallop" so I quickly get bounced away from wallop and back to the main apache server (where it of course dies with a 404 file not found error). Is there some easy tweak I could do to install a "wallop/" prefix to all of the internally generated urls?

Thanks,

Seth Green

Ceton

Forgive me if this isn't the place or best place to request this, however I've looked endlessly for another solution and this appears to be the only thing close to what I need.

I have a setup that uses a 6 tuner ETH6 from Ceton, which in practice is the same as a HDHomeRun with less software support. The Ceton works well and uses only one cable card, which for reasons I won't go into was a requirement for me.

I'm interested in either customizing a solution or pulling together a few different pieces to enable my various android, roku, and perhaps RaspberryPI/xbmc devices as extenders to view live and/or recorded content either directly from the ETH6 and/or from the WMC

Let me know where else I should seek information if this is not the best place.

Safari windows

safari windows, Firefox and internet explorer does not work either as far as i can tell there is no way to view from this on a windows PC,

Docker Container - Internal Server Error

I receive an Internal Server Error after firing up wallop via docker. See below, and let me know if I provide any additional details.

config.toml
ffmpeg_path = "/ffmpeg/bin/ffmpeg"
acodec = "libfdk_aac"
transcoding_path = "/tmp"
hdhomerun_host = "10.0.0.106"
port = "8888"

docker startup command
docker run --rm --name wallop -v $(pwd)/config.toml:/wallop/config/config.toml -p 8888:8888 ipstatic/wallop:latest

hdhr firmware
20160902beta3

hdhr channel lineup
http://10.0.0.106/lineup.json
returns json

Docker Terminal Output after accessing http://localhost:8888 and receiving Internal Server Error
== Sinatra (v1.4.7) has taken the stage on 8888 for production with backup from Thin
172.17.0.1 - - [18/Sep/2016:08:56:33 +0000] "GET / HTTP/1.1" 302 - 0.0026
2016-09-18 08:56:33 - NoMethodError - undefined method []' for nil:NilClass: /wallop/lib/wallop.rb:128:inblock in lineup'
/wallop/lib/wallop.rb:126:in each' /wallop/lib/wallop.rb:126:inlineup'
/wallop/lib/wallop.rb:143:in favorite_lineup' app/app.rb:45:inblock in class:App'
/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1611:in call' /wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1611:inblock in compile!'
/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:975:in block (3 levels) in route!' /wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:994:inroute_eval'
/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:975:in block (2 levels) in route!' /wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1015:inblock in process_route'
/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1013:in catch' /wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1013:inprocess_route'
/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:973:in block in route!' /wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:972:ineach'
/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:972:in route!' /wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1085:inblock in dispatch!'
/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in block in invoke' /wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:incatch'
/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in invoke' /wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1082:indispatch!'
/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:907:in block in call!' /wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:inblock in invoke'
/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in catch' /wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:ininvoke'
/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:907:in call!' /wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:895:incall'
/wallop/vendor/gems/ruby/2.3.0/gems/rack-1.6.4/lib/rack/commonlogger.rb:33:in call' /wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:219:incall'
/wallop/vendor/gems/ruby/2.3.0/gems/rack-protection-1.5.3/lib/rack/protection/xss_header.rb:18:in call' /wallop/vendor/gems/ruby/2.3.0/gems/rack-protection-1.5.3/lib/rack/protection/path_traversal.rb:16:incall'
/wallop/vendor/gems/ruby/2.3.0/gems/rack-protection-1.5.3/lib/rack/protection/json_csrf.rb:18:in call' /wallop/vendor/gems/ruby/2.3.0/gems/rack-protection-1.5.3/lib/rack/protection/base.rb:49:incall'
/wallop/vendor/gems/ruby/2.3.0/gems/rack-protection-1.5.3/lib/rack/protection/base.rb:49:in call' /wallop/vendor/gems/ruby/2.3.0/gems/rack-protection-1.5.3/lib/rack/protection/frame_options.rb:31:incall'
/wallop/vendor/gems/ruby/2.3.0/gems/rack-1.6.4/lib/rack/logger.rb:15:in call' /wallop/vendor/gems/ruby/2.3.0/gems/rack-1.6.4/lib/rack/commonlogger.rb:33:incall'
/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:219:in call' /wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:212:incall'
/wallop/vendor/gems/ruby/2.3.0/gems/rack-1.6.4/lib/rack/head.rb:13:in call' /wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:182:incall'
/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:2013:in call' /wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1487:inblock in call'
/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1787:in synchronize' /wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1487:incall'
/wallop/vendor/gems/ruby/2.3.0/gems/thin-1.6.4/lib/thin/connection.rb:86:in block in pre_process' /wallop/vendor/gems/ruby/2.3.0/gems/thin-1.6.4/lib/thin/connection.rb:84:incatch'
/wallop/vendor/gems/ruby/2.3.0/gems/thin-1.6.4/lib/thin/connection.rb:84:in pre_process' /wallop/vendor/gems/ruby/2.3.0/gems/eventmachine-1.2.0.1/lib/eventmachine.rb:1076:incall'
/wallop/vendor/gems/ruby/2.3.0/gems/eventmachine-1.2.0.1/lib/eventmachine.rb:1076:in block in spawn_threadpool' 172.17.0.1 - - [18/Sep/2016:08:56:33 +0000] "GET /channels?type=favorites HTTP/1.1" 500 30 0.0196 172.17.0.1 - - [18/Sep/2016:08:56:33 +0000] "GET / HTTP/1.1" 302 - 0.0015 2016-09-18 08:56:33 - NoMethodError - undefined method[]' for nil:NilClass:
/wallop/lib/wallop.rb:128:in block in lineup' /wallop/lib/wallop.rb:126:ineach'
/wallop/lib/wallop.rb:126:in lineup' /wallop/lib/wallop.rb:143:infavorite_lineup'
app/app.rb:45:in block in <class:App>' /wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1611:incall'
/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1611:in block in compile!' /wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:975:inblock (3 levels) in route!'
/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:994:in route_eval' /wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:975:inblock (2 levels) in route!'
/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1015:in block in process_route' /wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1013:incatch'
/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1013:in process_route' /wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:973:inblock in route!'
/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:972:in each' /wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:972:inroute!'
/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1085:in block in dispatch!' /wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:inblock in invoke'
/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in catch' /wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:ininvoke'
/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1082:in dispatch!' /wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:907:inblock in call!'
/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in block in invoke' /wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:incatch'
/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in invoke' /wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:907:incall!'
/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:895:in call' /wallop/vendor/gems/ruby/2.3.0/gems/rack-1.6.4/lib/rack/commonlogger.rb:33:incall'
/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:219:in call' /wallop/vendor/gems/ruby/2.3.0/gems/rack-protection-1.5.3/lib/rack/protection/xss_header.rb:18:incall'
/wallop/vendor/gems/ruby/2.3.0/gems/rack-protection-1.5.3/lib/rack/protection/path_traversal.rb:16:in call' /wallop/vendor/gems/ruby/2.3.0/gems/rack-protection-1.5.3/lib/rack/protection/json_csrf.rb:18:incall'
/wallop/vendor/gems/ruby/2.3.0/gems/rack-protection-1.5.3/lib/rack/protection/base.rb:49:in call' /wallop/vendor/gems/ruby/2.3.0/gems/rack-protection-1.5.3/lib/rack/protection/base.rb:49:incall'
/wallop/vendor/gems/ruby/2.3.0/gems/rack-protection-1.5.3/lib/rack/protection/frame_options.rb:31:in call' /wallop/vendor/gems/ruby/2.3.0/gems/rack-1.6.4/lib/rack/logger.rb:15:incall'
/wallop/vendor/gems/ruby/2.3.0/gems/rack-1.6.4/lib/rack/commonlogger.rb:33:in call' /wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:219:incall'
/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:212:in call' /wallop/vendor/gems/ruby/2.3.0/gems/rack-1.6.4/lib/rack/head.rb:13:incall'
/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:182:in call' /wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:2013:incall'
/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1487:in block in call' /wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1787:insynchronize'
/wallop/vendor/gems/ruby/2.3.0/gems/sinatra-1.4.7/lib/sinatra/base.rb:1487:in call' /wallop/vendor/gems/ruby/2.3.0/gems/thin-1.6.4/lib/thin/connection.rb:86:inblock in pre_process'
/wallop/vendor/gems/ruby/2.3.0/gems/thin-1.6.4/lib/thin/connection.rb:84:in catch' /wallop/vendor/gems/ruby/2.3.0/gems/thin-1.6.4/lib/thin/connection.rb:84:inpre_process'
/wallop/vendor/gems/ruby/2.3.0/gems/eventmachine-1.2.0.1/lib/eventmachine.rb:1076:in call' /wallop/vendor/gems/ruby/2.3.0/gems/eventmachine-1.2.0.1/lib/eventmachine.rb:1076:inblock in spawn_threadpool'
172.17.0.1 - - [18/Sep/2016:08:56:33 +0000] "GET /channels?type=favorites HTTP/1.1" 500 30 0.0016

Wallop getting 404 - Stuck on "Preparing Stream"

Not sure what I'm missing, getting the same results on two different MAC installs:

Here is the log entry from the FFMPEG log:

[mpeg2video @ 0x7f951b83fa00] 0x0 is invalid
Last message repeated 4 times
[mpegts @ 0x7f951b806600] max_analyze_duration 2000000 reached at 2002000 microseconds
[mpegts @ 0x7f951b806600] Estimating duration from bitrate, this may be inaccurate
Unknown encoder 'libfdk_aac'

Terminal display:

127.0.0.1 - - [19/Jan/2014 11:35:41] "POST /channels/3.1/tune HTTP/1.1" 200 29 0.0012
127.0.0.1 - - [19/Jan/2014 11:35:41] "GET /channels/3.1/status HTTP/1.1" 200 88 0.0008
127.0.0.1 - - [19/Jan/2014 11:35:41] "GET /channels/3.1/status HTTP/1.1" 200 88 0.0007
127.0.0.1 - - [19/Jan/2014 11:35:41] "GET /channels/3.1/status HTTP/1.1" 200 88 0.0007
127.0.0.1 - - [19/Jan/2014 11:35:42] "GET /channels/3.1/status HTTP/1.1" 200 88 0.0007
127.0.0.1 - - [19/Jan/2014 11:35:42] "GET /channels/3.1/status HTTP/1.1" 200 88 0.0007
127.0.0.1 - - [19/Jan/2014 11:35:42] "GET /channels/3.1/status HTTP/1.1" 200 88 0.0007
127.0.0.1 - - [19/Jan/2014 11:35:42] "GET /channels/3.1/status HTTP/1.1" 200 88 0.0008
127.0.0.1 - - [19/Jan/2014 11:35:42] "GET /channels/3.1/status HTTP/1.1" 200 88 0.0007
127.0.0.1 - - [19/Jan/2014 11:35:42] "GET /channels/3.1/status HTTP/1.1" 200 88 0.0007
127.0.0.1 - - [19/Jan/2014 11:35:42] "GET /channels/3.1/status HTTP/1.1" 200 88 0.0007
127.0.0.1 - - [19/Jan/2014 11:35:43] "GET /channels/3.1/status HTTP/1.1" 200 88 0.0011
127.0.0.1 - - [19/Jan/2014 11:35:43] "GET /channels/3.1/status HTTP/1.1" 200 88 0.0007
127.0.0.1 - - [19/Jan/2014 11:35:43] "GET /channels/3.1/status HTTP/1.1" 200 88 0.0008
127.0.0.1 - - [19/Jan/2014 11:35:43] "GET /channels/3.1/status HTTP/1.1" 200 88 0.0007
127.0.0.1 - - [19/Jan/2014 11:35:43] "GET /channels/3.1/status HTTP/1.1" 200 88 0.0007
127.0.0.1 - - [19/Jan/2014 11:35:43] "GET /channels/3.1/status HTTP/1.1" 200 88 0.0007
127.0.0.1 - - [19/Jan/2014 11:35:43] "GET /channels/3.1/status HTTP/1.1" 200 88 0.0007
127.0.0.1 - - [19/Jan/2014 11:35:44] "GET /channels/3.1/status HTTP/1.1" 200 88 0.0007
127.0.0.1 - - [19/Jan/2014 11:35:44] "GET /channels/3.1/status HTTP/1.1" 200 88 0.0007
127.0.0.1 - - [19/Jan/2014 11:35:44] "GET /channels/3.1/status HTTP/1.1" 200 88 0.0007
127.0.0.1 - - [19/Jan/2014 11:35:44] "GET /channels/3.1/status HTTP/1.1" 404 - 0.0006
127.0.0.1 - - [19/Jan/2014 11:35:44] "GET /channels/3.1/status HTTP/1.1" 404 - 0.0016

Proxy support

Wallop is really nifty! I'm most excited that it seems to provide a ffmpeg configuration that doesn't freeze during streaming. Thanks!

I was wondering if you had any suggestions for hooking wallop up to some sort of proxy running elsewhere. I have a server that has great upstream bandwidth but my home connection (where my tuner is) does not. It would be nice to support multiple clients watching the same stream while only paying for the bandwidth 1x out of my home connection.

I was thinking about using the nginx-rtmp-module.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.