Raspberry Piでインターネットラジオを聴けるようにしてみました。

多くの記事で公開されているのでそれらを参考にしました。SHOUTcast というインターネットラジオ局を利用するのが一番手軽なようです。

第13回「ラズベリーラジオ前編 – インターネットラジオ受信と遠隔操作」- IT女子のラズベリーパイ入門奮闘記

こちらの記事に詳しく書かれているのでそれを元に試してみました。記事中はPHPを利用されていましたが、私はNode.jsを利用してみました。

こんな感じ

iPhoneからSSHで接続し、ディレクトリに移動し、node app.js
でローカルサーバーが起動します。

Raspberry PiのIPアドレスに指定した3000番にアクセスしてリモコンを立ち上げます。

リモコンボタンを押せばラジオが再生されます。

コード

app.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
var express = require('express');
var ejs = require("ejs");
var spawn = require('child_process').spawn;
var app = express();
app.engine('ejs',ejs.renderFile);
app.get('/', function(req, res){
res.render('radio.ejs',
{title: 'SHOUTcast Pi'});
});
app.get('/control', function (req, res) {
console.log(req.query);
var id = req.query.id;
var shoutcast = "http://yp.shoutcast.com/sbin/tunein-station.pls?id=" + id;
var cmd = "killall mplayer";
//console.log("cmd = "+cmd);
function shspawn(command) {
return spawn('sh', ['-c', command]);
}
var child = shspawn(cmd);
var buf="";
child.stdout.on('data',function(data){
buf=buf+data;
});
child.stderr.on('data',function (data){
//console.log('exec error: '+data);
});
child.on('close',function(code) {
console.log( 'CLEAR.' );
});
var cmd = "mplayer -playlist " + shoutcast + "";
function shspawn(command) {
return spawn('sh', ['-c', command]);
}
var child = shspawn(cmd);
var buf="";
child.stdout.on('data',function(data){
buf=buf+data;
});
child.stderr.on('data',function (data){
//console.log('exec error: '+data);
});
child.on('close',function(code) {
console.log( 'EXIT.' );
});
});
app.get('/stop', function (req, res) {
console.log(req.query);
var id = req.query.id;
var cmd = "killall mplayer";
//console.log("cmd = "+cmd);
function shspawn(command) {
return spawn('sh', ['-c', command]);
}
var child = shspawn(cmd);
var buf="";
child.stdout.on('data',function(data){
buf=buf+data;
});
child.stderr.on('data',function (data){
//console.log('exec error: '+data);
});
child.on('close',function(code) {
console.log( 'STOP.' );
});
});
var server = app.listen(3000, function () {
var host = server.address().address
var port = server.address().port
console.log('This app listening at http://192.168.0.12:'+ port)
});

radio.ejs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<!DOCTYPE html>
<html lang="ja">
<head>
<meta http-equiv="content-type"
content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0,user-scalable=no">
<title><%-<%= title %>%></title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" type="text/css" />
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css">
<style>
body{
margin: 0 auto;
max-width: 640px;
}
article{
margin: 20px;
}
</style>
</head>
<body>
<header>
<h1 class="text-center h2"><%-<%= title %>%></h1>
</header>
<article>
<div class="list-group">
<button type="button" class="list-group-item" id="402459">SOUL GOLD RADIO SMOOTH JAZZ</button>
<button type="button" class="list-group-item" id="389248">
#1 Hits</button>
<button type="button" class="list-group-item" id="484573"># After Hour - www.materrassefm.com</button>
<button type="button" class="list-group-item" id="190620">
#i99MusicRadio</button>
<button type="button" class="list-group-item" id="475565">#1 Classic Rock</button>
</div>
<button class="btn btn-default" id="stop">stop</button>
</article>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script>
$(".list-group-item").click(function() {
var station = $(this).attr("id"); 
$.get("http://192.168.0.12:3000/control", { id: station } );
});
$(".btn").click(function() {
var stop = $(this).attr("id"); 
$.get("http://192.168.0.12:3000/stop", { id: stop } );
});
</script>
</body>
</html>

音源の再生はmplayerを使ったのですが、パッケージが今ひとつ不安定ですぐに再生が切れてしまうので、child_process を利用してコマンドをJavaScriptから起動させてみました。(書き方が雑なのは多めにみて下さいませ)

参考になりました

node.jsでパイプを使ったコマンドを実行するには