freeCodeCamp : Use the Twitchtv JSON API
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" />
$background: #ecf0e7;
$container: #e1e1e6;
$online: #b8cca6;
$header: #5c5457;
$text: #8ea7c2;
$offline: #4a5e82;
$grow: width 0.4s linear;
@import url(https://fonts.googleapis.com/css?family=Oswald:400,700|Droid+Serif:400,400italic);
body {
background-color: $background;
font-family: 'Droid Serif', serif;
font-size: 14px;
color: $text;
}
a, a:focus, a:hover, a:visited {
color: $online;
}
h1 {
font-family: 'Oswald', sans-serif;
font-weight: bold;
text-transform: uppercase;
text-align: left;
margin: 15px 0px;
font-size: 3em;
}
.container {
background-color: $container;
margin: 0px auto;
padding: 0px;
max-width: 700px;
}
.row {
margin: 2px 0px;
padding: 5px;
line-height: 50px;
}
.menu {
position: absolute;
right: 0px;
bottom: 5px;
color: $header;
font-family: 'Oswald', sans-serif;
font-size: 0.8em;
font-weight: bold;
text-transform: uppercase;
#all {
}
#online {
.circle {
background-color: $online;
}
}
#offline {
.circle {
background-color: $text;
}
}
.active, .selector:hover {
width: 65px !important;
transition: $grow;
cursor: pointer;
}
.selector {
line-height: 20px;
height: 20px;
background-color: $container;
padding: 0px 5px;
margin: 2px 0px;
width: 20px;
overflow: hidden;
float: right;
clear: right;
transition: $grow;
.circle {
height: 10px;
width: 10px;
border-radius: 50%;
background-color: $header;
border: 1px solid $header;
float: left;
margin: 5px 5px 5px 0px;
}
p {
float: right;
margin: 0px;
}
}
}
#header, #footer {
position: relative;
background-color: $header;
color: $container;
padding: 5px 65px 5px 15px;
}
.logo {
max-width: 50px;
max-height: 50px;
border-radius: 50%;
border: 3px solid $container;
}
.offline {
background-color: $offline;
}
.online {
background-color: $online;
color: $header;
a, a:focus, a:hover, a:visited {
color: $offline;
}
}
#streaming {
font-style: italic;
}
#name, #streaming {
line-height: 25px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
text-align: center;
}
@media (min-width: 768px) {
.container {
margin: 10px auto;
}
#name, #streaming {
line-height: 50px;
height: 50px;
}
#header {
padding-left: 65px;
}
}
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
var channels = ["freecodecamp","test_channel","ESL_SC2"];
function getChannelInfo() {
channels.forEach(function(channel) {
function makeURL(type, name) {
return 'https://wind-bow.gomix.me/twitch-api/' + type + '/' + name + '?callback=?';
};
$.getJSON(makeURL("streams", channel), function(data) {
var game,
status;
if (data.stream === null) {
game = "Offline";
status = "offline";
} else if (data.stream === undefined) {
game = "Account Closed";
status = "offline";
} else {
game = data.stream.game;
status = "online";
};
$.getJSON(makeURL("channels", channel), function(data) {
var logo = data.logo != null ? data.logo : "https://dummyimage.com/50x50/ecf0e7/5c5457.jpg&text=0x3F",
name = data.display_name != null ? data.display_name : channel,
description = status === "online" ? ': ' + data.status : "";
html = '<div class="row ' +
status + '"><div class="col-xs-2 col-sm-1" id="icon"><img src="' +
logo + '" class="logo"></div><div class="col-xs-10 col-sm-3" id="name"><a href="' +
data.url + '" target="_blank">' +
name + '</a></div><div class="col-xs-10 col-sm-8" id="streaming">'+
game + '<span class="hidden-xs">' +
description + '</span></div></div>';
status === "online" ? $("#display").prepend(html) : $("#display").append(html);
});
});
});
};
$(document).ready(function() {
getChannelInfo();
$(".selector").click(function() {
$(".selector").removeClass("active");
$(this).addClass("active");
var status = $(this).attr('id');
if (status === "all") {
$(".online, .offline").removeClass("hidden");
} else if (status === "online") {
$(".online").removeClass("hidden");
$(".offline").addClass("hidden");
} else {
$(".offline").removeClass("hidden");
$(".online").addClass("hidden");
}
})
});
<div class="container">
<div class="row" id="header">
<h1>Twitch Streamers</h1>
<div class="menu">
<div class="selector active" id="all">
<div class="circle"></div><p>All</p>
</div>
<div class="selector" id="online">
<div class="circle"></div><p>Online</p>
</div>
<div class="selector" id="offline">
<div class="circle"></div><p>Offline</p>
</div>
</div>
</div>
<div id="display">
</div>
<div class="row" id="footer">
</div>
</div>
A project to utilise the twitch api to display the status of various channels. Completed as part of FreeCodeCamp.
Forked from Lianne Turnbull's Pen Twitch Status.
Forked from Free Code Camp's Pen Twitch Status.
A Pen by HARUN PEHLİVAN on CodePen.