<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
- <style>
- html, body {
- margin: 0;
- padding: 0;
- width: 100%;
- height: 100%;
- max-height: 100%;
- background-color: #eaeaea;
- overflow: hidden;
- }
-
- .table {
- display: block;
- }
-
- .row {
- display: flex;
- flex: 1 0 auto;
- border-bottom: 1px solid black;
- }
-
- .label {
- flex-shrink: 1;
- padding: 1em;
- width: 8em;
- border-right: 1px solid black;
- }
-
- .item {
- flex-grow: 1;
- border-left: 0;
- padding: 1em;
- }
-
- .row input {
- flex-grow: 1;
- height: 4em;
- }
-
- td {
- border: 1px solid #000;
- padding: 1em;
- }
-
- tr td:first-child {
- width: 1%;
- white-space: nowrap;
- }
-
- input {
- margin: 0.5em;
- }
-
- article {
- display: flex;
- flex-flow: column;
- height: 100%;
- max-height: 100%;
- }
-
- article section {
- //border: 1px dotted black;
- flex: 0 1 auto;
- }
-
- .grow {
- flex: 1 1 auto;
- overflow: auto;
- }
-
- .shrink {
- flex: 0 1 auto;
- }
-
- #breadCrumbs {
- margin-left: 1em;
- margin-right: 1em;
- }
-
- #itemList {
- margin-left: 1em;
- margin-right: 1em;
- }
-
- #queueList div {
- background-color: #A7BDC7;
- padding: 1em;
- margin: 0.5em;
- text-align: left;
- }
-
- </style>
+ <link rel="stylesheet" href="style.css">
</head>
<body>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
- <style>
- html, body {
- margin: 0;
- padding: 0;
- width: 100%;
- height: 100%;
- max-height: 100%;
- background-color: #eaeaea;
- overflow: hidden;
- }
-
- .table {
- display: block;
- }
-
- .row {
- display: flex;
- flex: 1 0 auto;
- border-bottom: 1px solid black;
- }
-
- .label {
- flex-shrink: 1;
- padding: 1em;
- width: 8em;
- border-right: 1px solid black;
- }
-
- .item {
- flex-grow: 1;
- border-left: 0;
- padding: 1em;
- }
-
- .row input {
- flex-grow: 1;
- height: 4em;
- }
-
- td {
- border: 1px solid #000;
- padding: 1em;
- }
-
- tr td:first-child {
- width: 1%;
- white-space: nowrap;
- }
-
- input {
- margin: 0.5em;
- }
-
- article {
- display: flex;
- flex-flow: column;
- height: 100%;
- max-height: 100%;
- }
-
- article section {
- //border: 1px dotted black;
- flex: 0 1 auto;
- }
-
- .grow {
- flex: 1 1 auto;
- overflow: auto;
- }
-
- .shrink {
- flex: 0 1 auto;
- }
-
- #breadCrumbs {
- margin-left: 1em;
- margin-right: 1em;
- }
-
- #itemList {
- margin-left: 1em;
- margin-right: 1em;
- }
-
- #itemList div {
- background-color: #A7BDC7;
- padding: 1em;
- margin: 0.5em;
- }
-
- #queueList div {
- background-color: #A7BDC7;
- padding: 1em;
- margin: 0.5em;
- text-align: left;
- }
-
- </style>
+ <link rel="stylesheet" href="style.css">
</head>
<body>
</video>
<div class="badge" style="left: 1em;">
- <div><img src="./wifi.svg" width="64" height="64"></div>
+ <div><img src="./wifi.svg" width="96" height="96"></div>
<span>WIFI</span>
</div>
<div class="badge" style="right: 1em;">
- <div><img src="./control.svg" width="64" height="64"></div>
+ <div><img src="./control.svg" width="96" height="96"></div>
<span>APP</span>
</div>
--- /dev/null
+ html, body {
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100%;
+ max-height: 100%;
+ background-color: #eaeaea;
+ overflow: hidden;
+ }
+
+ .table {
+ display: block;
+ }
+
+ .row {
+ display: flex;
+ flex: 1 0 auto;
+ border-bottom: 1px solid black;
+ }
+
+ .label {
+ flex-shrink: 1;
+ padding: 1em;
+ width: 8em;
+ border-right: 1px solid black;
+ }
+
+ .item {
+ flex-grow: 1;
+ border-left: 0;
+ padding: 1em;
+ }
+
+ .row input {
+ flex-grow: 1;
+ height: 4em;
+ }
+
+ td {
+ border: 1px solid #000;
+ padding: 1em;
+ }
+
+ tr td:first-child {
+ width: 1%;
+ white-space: nowrap;
+ }
+
+ input {
+ margin: 0.5em;
+ }
+
+ article {
+ display: flex;
+ flex-flow: column;
+ height: 100%;
+ max-height: 100%;
+ }
+
+ article section {
+ //border: 1px dotted black;
+ flex: 0 1 auto;
+ }
+
+ .grow {
+ flex: 1 1 auto;
+ overflow: auto;
+ }
+
+ .shrink {
+ flex: 0 1 auto;
+ }
+
+ #breadCrumbs {
+ margin-left: 1em;
+ margin-right: 1em;
+ }
+
+ #itemList {
+ margin-left: 1em;
+ margin-right: 1em;
+ }
+
+ #itemList div {
+ background-color: #A7BDC7;
+ padding: 1em;
+ margin: 0.5em;
+ }
+
+ #queueList div {
+ background-color: #A7BDC7;
+ padding: 1em;
+ margin: 0.5em;
+ text-align: left;
+ }
"channels" => [
{
"name" => "Everything",
- "randomize" => false,
+ "randomize" => true,
"play_ads" => true,
"selectors" => [
"Movies",
db = ATV::Database.new(ATV_ROOT, CONFIG["sources"])
channels = CONFIG["channels"].map do |c|
- ATV::Channel.new(c["name"], db, c["selectors"])
+ ATV::Channel.new(db, c)
+# ATV::Channel.new(c["name"], db, c["selectors"])
end
player = ATV::Player.new(db, channels)
module ATV
class Channel
- def initialize(name, db, selectors = [])
- @name = name
+ def initialize(db, config)
+ # configuration
@db = db
- @selectors = selectors
+ @name = config["name"]
+ @selectors = config["selectors"]
+ @play_ads = config["play_ads"]
+ @randomize = config["randomize"]
+
+ # dynamic state
@time = 0
@index = 0
@queue = []
@time = 0
if @queue.length > 0
@current = @queue.shift
+ elsif @randomize
+ @current = pick_random()
else
@index = ((@index+1) >= files.length ? 0 : (@index+1))
@current = files[@index]
end
end
+ def pick_random()
+ # random walk the tree to find a leaf item and play that
+ tree = filedata[:tree]
+ while tree["path"].nil?
+ tree = tree[tree.keys.sample]
+ end
+ tree
+ end
+
def state()
next_index = ((@index+1) >= files.length ? 0 : (@index+1))
next_item = (@queue.length > 0 ? @queue.first : files[next_index])
end
def items()
-# pp filedata[:tree]
{ "items" => filedata[:tree] }
end