そうだクラウドに自動的に格納してストリーミングで聞こう

趣味

そうだクラウドに自動転送してどこからでも聞ける様にしようぜ

WebDavでダウンロードするのもめんどくさいし+遅い
ストリーミングサーバをたてるのもめんどくさい・・・。
なんか、外からストリーミングに対応してる
クラウドにデータをアップするだけで簡単にきかれへん
かな?みたいな事を考え出した。

構成部品その1

番組ごとの移動先リストをまずは作成して使っている。
filemove.list_2014/05/09

フォーマットは以下の通りである

録音されるファイル名の一部スペース格納先/番組名

上記ファイルをダウンロードしてもらって解凍してもらえると良く分かるかと。

これ上記ファイルでセミ運用している所の画像を貼り付けて見ました。

トップディレクトリは局ディレクトリ

トップディレクトリ

下位は番組ディレクトリ

番組

ここから先はシェルで無ければ自動作成する。

年

月別ディレクトリ

月

その中にコンテンツを自動保存

コンテンツ

これで全世界このクラウドにアクセスさえできれば聞ける

クラウドからストリーミングで聞くことができるので
このクラウドにアクセスさえできれば聞く事ができる。

実行されると最後にメールで報告する仕組み

  • 動作サンプル「東京側」

    以下のファイルをクラウドに自動転送しました。

    1. +++++++++++++++++++++++++++++++
      FMT_シンクロのシティ_2014-05-07_15.00.04.mp3
      FMT_Blue-Ocean_2014-05-07_09.00.04.mp3
      FMT_JET-STREAM_2014-05-08_00.00.04.mp3
      FMT_TIME_LINE_2014-05-07_19.00.04.mp3
      FMT_中西哲生のクロノス_2014-05-07_06.00.04.mp3
    2. +++++++++++++++++++++++++++++++

    現在pogoplugクラウド上に 349489MB / 342GB 保存されています。(めやす)

    1. +++++++++++++++++++++++++++++++
      以下格納フォルダの状態です。データが残っている場合エラーログを確認してください。

    EOF

    1. +++++++++++++++++++++++++++++++
    1. +++++++++++++++++++++++++++++++
      開始時間 2014-05-08-04:00:04
      終了時間 2014-05-08-04:43:57
    2. +++++++++++++++++++++++++++++++
  • 動作サンプル「大阪側」

    以下のファイルをクラウドに自動転送しました。

    1. +++++++++++++++++++++++++++++++
      802_ForceClub_2014-05-08_20.48.04.mp3
      ABC_おはようパーソナリティー道上洋三_2014-05-08_06.30.04.mp3
      FMO_JET-STREAM_2014-05-09_00.00.04.mp3
      MBS_ありがとう浜村淳です_2014-05-08_08.00.06.mp3
    2. +++++++++++++++++++++++++++++++

    現在pogoplugクラウド上に 194117MB / 190GB 保存されています

    1. +++++++++++++++++++++++++++++++
      以下格納フォルダの状態です。データが残っている場合エラーログを確認してください。

    EOF

    1. +++++++++++++++++++++++++++++++

    サーバのHDD残容量は以下の通りです。
    11GBです。DiskFullにはくれぐれも注意してください。

    1. +++++++++++++++++++++++++++++++
      開始時間 2014-05-09-03:00:04
      終了時間 2014-05-09-03:12:33
    2. +++++++++++++++++++++++++++++++

一応最後に

このスクリプトも多々欠点があります。

1.クラウドに転送できなかった対処ができてない。

クラウドに転送できなかった場合、
エラーメールが来ないです。そもそも、録音したファイルがないときも来ないルーチンを入れているので、エラーなのか?そうでないか判断できない。

  • 解決方法

    これ単純にファンクションつくって、エラーの場合はメールだけは送る構造に変更すれば良いだけなんですけどね。

2.新番組など自動でディレクトリ等が作成されない。

新番組を録音する時に自動でディレクトリが作られない。

  • 暫定解決策

    今は、リストをつくってそれに沿ってファイルを指定場所に送られるようにしている為、そのリストに載っていない番組については一切転送されない。

    一応メールには、保存先を「ls」してその結果を掲載するようにしているので分かるんですが・・・。

    EPGで録音予約してしまった場合、もはや手動で移動するしかないというね・・・。作者プログラムなんか書いたこと無いし、パワーロジックなので・・・。
    まあ、無理してやってるほうなんでね・・・。

  • 解決策

    EPGで自動でつくファイル名から放送局を判断して
    番組名を切り出して、クラウド上にディレクトリがなければつくって格納すれば良いのでは?

    既に、なにげにプロファイルで局リストは毎回インクルードされているので(使ってないけど)後はファイル名から色々ディレクトリの元を切り出せば、行けそうな気配。

file局リスト_2014/05/11

3.ラジオには25時とか27時というのがある

例えば、ジェットストリームは日付を越えて放送しているが、ファイルのタイムスタンプは翌日になるんですよ。
当日は00:00~23:59までですが、実はラジオの世界では
27時(3時)くらいまでは当日扱いにしないとつじつまがあわなくなる。

たとえると、4月末に放送したジェットストリームは
実は、4月ディレクトリに格納しないと行けないのですが
タイムスタンプ上は、日付変更線を越えているのでシェルは5月と認識して、5月ディレクトリを作成してそこに移動してしまいます。

  • 解決策

    シェルを改修して、27時までを当日として処理する
    特別な時間帯のルーチンを入れると解決する。
    追々改修しよう。

その後27時対応を行いました。

27時間対応を組み込んだ

仕組み

まず、要件として以下の通り

  1. 0時~3時までは前日の日付でファイル名を生成する。
  2. 0時は24時 1時は25時・2時は26時・3時は27時とする。
  3. 4時~23時までは通常時間を適用する。

構文としては、if文で振り分けて対象時間帯の場合どうするかを追記した。
0~3時までは、exprを使い当日から-1Dayして計算するようにした。

今ふと思ったけど・・・これバグを作り込んでいると・・・。
例えば、5月1日に録音したとして、
0時以降3時までの番組だとexprで日付を-1をしようとする。

コマンドで打ってみると以下の通りの処理結果となる。

[root@trec system]# expr 1 - 1
0
ということは5月0日表記となる・・・。

さらにややこしい話をすると、
月によって31日の月・30日の月・28日の月が有り
閏年は29日の月が存在する。

ウザイすぎる・・・。

これは、それを定義して月の最終日に変更してしまわないと行けない。

今回の例で行くと4月30日の日付に変更する必要がある。
これでまた分岐が複雑になってくるよな。
うーん・・・・。

プログラムが組めない人が書いているので
構文もパワーロジックで汚いですし・・・。

この業界向いてないと本気で思いますね。

この問題に対して、思いつく所としては月末リストをつくって
1日の時のみ、その構文を通って評価し月をexprで-1して
5月1日なら5月から1を引いて4月へ
さらに、4月の最終日をリストから決定して
4月最終日を変数に当て込んで出す的なプログラムを追加する感じか。

閏年の処理

4年に1回の閏年は必ず4で割れるので
割り算して割れたら最終日を2月29日に変更する的な
処理を入れないと駄目ね。

exprを使うと小数点が見えないので
この用途に使えない・・・。

そして、bcを使う事で小数点の計算ができるので
こちらで計算させる事に・・・。

[root@trec ~]# echo "scale=1; 2012 / 4" | bc
503.0
[root@trec ~]# echo "scale=1; 2013 / 4" | bc
503.2
[root@trec ~]# echo "scale=1; 2014 / 4" | bc
503.5
[root@trec ~]# echo "scale=1; 2015 / 4" | bc
503.7
[root@trec ~]# echo "scale=1; 2016 / 4" | bc
504.0

上記の様に2月だけ別の評価で毎年2月は年を4で割って
小数点が0の場合は、最終日を29日に設定する条件で判断する。

user$ echo "scale=1; 2016 / 4" | bc | cut -c5-5

これで小数点だけ抽出できるので、
これが0かそうでないかで閏年かそうでないかを判断しよう。

いやはや、後の月はリストをグレップして
awkかなんかで情報を引っ張ってきて最終日を
設定する方向でいいかな?

なんか分からないけど、10数行の構文の追加(見込)って言うのもめんどくさい話ですね。

結局このような処理に変更

  • DATE27の変数に時間をシステムから取得して代入
  • DAY27の変数に日付をシステムから取得して代入
  • MAN27の変数に時間(分)をシステムから取得して代入

閏年の判定は、上で書いている通りNOWの年から4で割って
小数点第1迄をDAY29の変数に代入、さらにその月からexprを使って-1DayしてMAN31_Aに代入

この場合、01日目でexprで計算結果が0でも
そのまま代入して後で当該数値の場合処理を入れて対応。

次に、exprして【02-01】を計算させると【1】と帰ってしまうので
0~9と1桁となりこれを回避すべくcutを使って2桁目が取れるかどうかで
評価して取れない場合は最初に【0】を追加して
【01~09】と【10~12】までの体裁を整える処理を追加している。

初期設定及び閏年対応

00時を24時として05時まで(29時)迄を生成する部分

DATE27変数に格納された時間が00の場合は、HON変数に24と
03まで分岐で評価して変数に格納している単純な処理となります。

また、DAY27から1日引いて翌日の日付に付け替えもやってます。
この際、01日であっても-1して0日になったとしても
後続の構文で処理させているのであえて実数を代入して通過させる。

27時間対応

なんですとぉ!!どうもラジオの世界では29時が最後らしい
分岐点をもう少し増やします

EPGで確認した所

下記の様なパワーロジックでねじ伏せました・・・。
本当は配列に入れ込んで、それをぐるっと判断させれば
シンプルなんじゃないかと思いますが
まあ、動けばいいんじゃないと・・・。

動作効率なんか考えずコーディングwwww

改修やっぱ配列に突っ込みたいな

あれ?ここ最近送られてこないと思ったら
前回改修した部分バグってると言うね・・・。

本当は}書かないと行けない所を]と書いて締まって
数日間東京局側のラジオが録音できなかったというね・・・。

限りなく馬鹿なシンタックスエラー

まあ、ジェットストリームだけではFM大阪で録ってるの
問題無かったんだけどw

そのほかは軒並みだめねwww
おぺちょんには気をつけようね。

月末処理

まずは、DAY28に何か入っているかを評価して
入ってなかった場合、且つ、DAY28に0と代入されている場合
月次処理をする対象だと分かるので次の処理を実行する。

DAY28は1つ前の処理で、DAY27から-1した値が入っている。
01の場合は、0がDAY28に代入されている。
  • 次にMAN31変数を評価して00を評価する。
    MAN31が00の場合は、1月しかないのでこれは決め打ちで
    12.31の処理をハードコーディングしている。

ここでもバグを作り込んでますね
yyyy年で年も-1しないと行けませんね
ロジックというか構文追加ですね

バグ修正

デバッグモードで2014年01月01日の2時に録音した想定で
ファイル名をシェル内部で処理した結果です。

処理結果01/01録音分の想定

次に、MAN31が00以外で02と閏年フラグが0のものは
4年ごとの閏年しかないので、2.29をハードコーディングしている。

さらに、上記2種類にマッチしなかったものは、
下記月末日数リストからcatしてgrepしてawk(第2パラメーターを代入)して
最終日をDAY29に代入している。

月末日数リスト
01 31
02 28
03 31
04 30

これで、基本的にやりたい事はできるシェルが作成できたので、
実際にテストを実施して確認してみる。

月末処理

テスト結果想定通りの挙動ですねw

処理結果

/tmp/FMT_test1_2014-05-19_25.41.52.mp3

実際に動作した結果昨日のファイルを公開

実際の処理結果

といい気になっていたらバグ発生

なんかおかしくね?

日付が01~09日までの時に且つ00時~05時において
exprで-1するのですが、その際にやっぱ0が消えて5とかに
なっておりファイルのネーミングルールが崩れてしまった。

これ修正した。

修正した箇所