どうも、OrangePi Oneを楽しんでいる瀬古草夫です。
9.99ドルで購入したOrangePi ONEでインターネットラジオを聴いた時の備忘録です。
目次
MPDでインターネットラジオを聴く
瀬古は普段ラジオを聞かないのですが、MPDをインストールした機会にインターネットラジオもMPDで聴けるようにする事にしました。
$ mpc add ストリーミングURL
上のコマンドで、どんどんURLを追加して、追加完了後、mpc saveするとプレイリストがm3u形式で保存されます。
ネットで検索したところ、海外のラジオステーションのShoutcastの追加方法が書かれています。
Shoutcastでは、m3u形式でストリーミングURLを保存できるので、保存したファイルをそのままプレイリストディレクトリの中に入れてやってmpc loadしてやればラジオを聴く事ができます。
日本のインターネットラジオ局の追加方法ですが、こちらのサイト記事が参考になりました。有難い事に、booska様が公開されておりますVBスクリプトのRajiruRec.vbsに日本のインターネットラジオ局のストリーミングURLの一覧がありましたので、今回このスクリプトからデータを抽出させていただき、m3u形式で保存するようにしました。
日本のラジオ局一覧を記載したM3Uファイルの作成
まずは、RajiruRec.vbsをダウンロードします。
$ wget https://gist.githubusercontent.com/booska/ce06605ccb9d7ba9f1cfc2184935a0bb/raw/3c00727988df9c67ef321abec442289791965030/RajiruRec.vbs
次に、RajiruRec.vbsからM3Uファイルを作成するプログラムを書きます。
$ vi ./makem3u.c
#include <stdio.h> #include <stdlib.h> #include <string.h> #define Radio_File "/home/seko/RajiruRec.vbs" #define Radio_SFile "/home/seko/mpd/playlists/radio.m3u" void frn(char *str); void kouzou_a (void); typedef struct ida { char rurl[200]; char rname[100]; struct ida *p_next; struct ida *p_pre; }IDA; IDA *p_id_syori; IDA *p_id_first; IDA *p_id_last; IDA *p_id_temp; int main(void) { FILE *fout; kouzou_a(); fout = fopen(Radio_SFile, "w"); fprintf(fout,"#EXTM3U\n"); while (p_id_syori != p_id_last) { fprintf(fout,"#EXTINF:-1,%s\n",p_id_syori->rname); fprintf(fout,"%s\n",p_id_syori->rurl); p_id_syori = p_id_syori->p_next; } p_id_syori = p_id_first; fclose(fout); return 0; } void kouzou_a (void) { FILE *fin; int flg = 0; char temp[500]; char temp1[100]; //初期処理 p_id_syori = (IDA*)malloc(sizeof(IDA)); p_id_temp = p_id_syori; p_id_first = p_id_syori = p_id_syori->p_next = (IDA*)malloc(sizeof(IDA)); fin = fopen(Radio_File, "r"); while (fgets(temp,500,fin) != NULL) { frn(temp); if (strncmp(temp,"aaNHK.Add",9) == 0) { flg = 1; sscanf(temp,"%*[^ ]%*[^,""],\"%[^\"\t']\"\t'%[^\n]",p_id_syori->rurl,p_id_syori->rname); //printf("%s,%s\n",p_id_syori->rurl,p_id_syori->rname); } else if (strncmp(temp,"aaJCBA.Add",10) == 0) { flg = 1; sscanf(temp,"%*[^ ]%*[^,""],\"%[^\"\t']\"\t'%[^\n]",temp1,p_id_syori->rname); sprintf(p_id_syori->rurl,"https://musicbird-hls.leanstream.co/musicbird/%s.stream/playlist.m3u8",temp1); //printf("%s,%s\n",p_id_syori->rurl,p_id_syori->rname); } else if (strncmp(temp,"aaCSRA.Add",10) == 0) { flg = 1; sscanf(temp,"%*[^ ]%*[^,""],\"%[^\"\t']\"\t'%[^\n]",p_id_syori->rurl,p_id_syori->rname); //printf("%s,%s\n",p_id_syori->rurl,p_id_syori->rname); } else if (strncmp(temp,"aaLISR.Add",10) == 0) { flg = 1; sscanf(temp,"%*[^ ]%*[^,""],\"%[^\"\t']\"\t'%[^\n]",temp1,p_id_syori->rname); sprintf(p_id_syori->rurl,"http://mtist.as.smartstream.ne.jp/%s/livestream/playlist.m3u8",temp1); //printf("%s,%s\n",p_id_syori->rurl,p_id_syori->rname); } else if (strncmp(temp,"aaAFN.Add",9) == 0) { flg = 1; sscanf(temp,"%*[^ ]%*[^,""],\"%[^\"\t']\"\t'%[^\n]",p_id_syori->rurl,p_id_syori->rname); //printf("%s,%s\n",p_id_syori->rurl,p_id_syori->rname); } if (flg == 1) { p_id_syori->p_pre = p_id_temp; p_id_syori->p_next = (IDA*)malloc(sizeof(IDA)); p_id_temp = p_id_syori; p_id_syori = p_id_syori->p_next; flg = 0; } } p_id_last = p_id_syori; p_id_syori = p_id_first; fclose(fin); } void frn(char *str) { if (strstr(str,"\r\n") != NULL) { str[(strlen(str))-2] = '\0'; } else if ((strstr(str,"\r") != NULL) || (strstr(str,"\n") != NULL)) { str[(strlen(str))-1] = '\0'; } }
コンパイルと実行
$ cc -o makem3u makem3u.c $ ./makem3u
MPDのプレイリストディレクトリに、全部で、323件のラジオ局のストリーミングURLと対応したラジオ局名をradio.m3uに収める事ができました。
$ mpc load radio $ mpc play
実際に確認してみると、ダブっている局やエラーが出る局がいくつかありましたので、あとは地道に手作業で削除します。
iphoneアプリ yaMPCの画面

ラジオ局名が表示されませんので、選曲が難しいです。
iphoneアプリ MaximumMPDの画面

ラジオ局が300局以上あるのでフリックにもたつきが感じられました。
日本語表示はOKでした。
Androidアプリ M.A.L.P.の画面

フリックはスムーズに動きましたが、一部、エラーが表示されるラジオ局を選択すると、操作が出来なくなり、強制終了をよぎなくされます。
ボリュームは、ハードウェアの音量ボタンで制御できるので便利です。
Aliexpressの紹介キャンペーン実施中!
下をクリックしてしてAliexpressに新規登録すると、もれなく2599円分のクーポンがもらえます。

コメント