moOde audio 7.3.0

moOde audio 7.3.0をインストールしました。
登録したサイマルラジオの画像データを少し整理しています。

moOde audio 7.3.0

720 –> 721ではいつからかアルバムの1枚が行方不明になっていたのですが見えるようになりました。バグ修正があったのかもしれません。

moOde audio730はMPDなどupdateされていますが当サイトの環境では特に目立った変化はないようです。
ラジオ関係についてはフォーラムのリリース情報で特に触れていないので720同様マニュアルでラジオデータをインポート

サイマルラジオ

テレビの無い当サイトは基本ラジオ生活を送っています。moOde audio + サイマルラジオを如何に使いやすくするかが鍵
moOde audioではラジオ局名を変更するには一旦削除、再登録が必要ですがロゴ画像は簡単に差し替え可能です。

調布FM
朝の情報番組など聞いていますがイメージに合ったロゴ画像が無い。ホームページの画像イメージを切り取って作成
サイズは300×300


湘南ビーチFM
富士山が小さく見える位置にロゴ貼り付け


こしがやFM
ホームページには女子画像が大きく載っています


コマラジ
ホームページのタイトルロゴと画像を合体

ここのところコミニュティFM放送局は年間数局新規開局しているようです。またCSRA(ListenRadio)からJCBA,FM++に移行、CSRAサーバー(?)からListenRadio配信などいろいろ動きがあります。少し整理しようと考えています。

 

シンプルなアプリケーションランチャー for Raspberry Pi

テキスト表示のシンプルなアプリケーションランチャーです。できるだけ簡単に設置、登録などできるようにしてみました。

アプリケーションメニュー

当サイト(Raspberry Pi)のアプリケーションメニューはpython3/tkinterで作成しています。 メインのボタンメニューは視認性、操作性とも良くダイレクトに実行、またカテゴリボタンは更にサブメニューを実行します。サブメニューは自前のツールやスクリプトを実行することも多くアイコンボタンメニューを作成することは困難になることからリストボックスによるテキスト形式で手軽に登録、再登録可能なサブメニューを作成

任意のディレクトリでファイラー(ranger)を起動

サブメニュー

雛形のサブメニューを作成
~/bin/app_menu/sub_default.py
雛形の”xxx”は変更しない
# — default — sub_file = “xxx”

雛形が決まったらコピー sub_menu.py
このときsub_file = “sub_menu.py”に変更
プログラム変更が可能になります 取り敢えずラベルカラーとボタンカラーを変更
デフォルトは’TButton’

メニュー項目はコマンドechoを実行してリストボックスから読み込みます。リストボックスは空白(space)があると分割してリスト表示 menu_listのechoコマンドは逆スラッシュで繋いで打ち込みやすくします。各文字列にspaceを含めることは出来ません。 select_selectionはリストの文字列から先頭2文字を取得 program_selectionで識別して実行

メニュー内で実行する際は関数を実行すると見やすくなります

sub_menuを呼び出すsub_master.py

devilspie2

Raspberry Pi(LightDM)は空いているスペースにウインドウを起動します。特に小さいウインドウは使いにくくなるので任意の位置に固定します。

$ sudo apt install devilspie2

http://git.savannah.gnu.org/cgit/devilspie2.git/plain/README

当サイトで使っているオプションを記載しています(– はコメント)

~/.config/devilspie2/applications.lua

----------------------------------------------------
-- devilspie2 - Lua-based window matching utility --
----------------------------------------------------
-- get_window_name()
-- get_application_name()
-- get_class_instance_name()
-- pin_window()
-- shade()
-- minimize()
-- make_always_on_top()
-- set_window_workspace(1)
-- undecorate_window()
-----------------------------------------------------

if (get_window_name()=="menu master") then
  set_window_geometry2 (1460,220,226,205)
end
if (get_window_name()=="menu sub") then
  set_window_geometry2 (1233,220,226,205)
end

ウインドウの取得はget_window_name()が扱いやすいと思います。(ウインドウタイトル)
pythonプログラムではroot.title(‘menu sub’)

ターミナルから$ xwininfo で取得できます。
位置、サイズの並びが違うので注意
+値を記載

devilspie2は自動で起動しないので~/.config/autostartに新規作成
~/bin/app_menu/sub_master.pyはLXPanelなど使いやすいところから起動、もしくは同様に作成
~/.config/autostart/devilspie2.desktop

[Desktop Entry]
Type=Application
Name=Devilspie2
Exec=devilspie2

参考

sub_default.py
sub_master.py
sub_menu.py
sub_system.py

 

 

dd tools(archives tool) 続き

前回より引き続きテストを続行、現在は各ボタンの挙動もほぼ問題ないレベルになっていると思います(ほぼです)。deComp Toolはunarとunpigzをひとつのボタンにして拡張子で判断するようにしました。
Compression ToolはParallel Implementation系をメインとしてatoolは控え選手とすることにします。カレントディレクトリ変更の際などリスタートするのは仕様です。

Archives deComp Tool


unarをデフォルトの展開ツールとしてunpigzをひとつのボタンにした
aunpack unpは取り敢えずそのまま
Compボタンは同じディレクトリでCompression Tool起動

unar + unpigz
pigzの展開コマンド(unpigz)はgzip zipの展開に対応、展開に関しては大幅な短縮は期待できませんが各コマンドに対して30%〜40%の展開時間短縮が見込めます。容量の大きいファイルについては一定のメリットがありますがアーカイブファイルは圧縮時同様工夫(tar)が必要になります。
unpigzは単一ファイルのみ実行させることにして拡張子だけでは判断できないzipはlsarを実行3行目にデータが無い場合単一ファイルとみなしてunpigzを実行します。
通常アーカイブファイル(gzip)は(“.tar.gz”)または(“.tgz”)になっていると思います。
変数aにはリストで選択したファイル(ディレクトリ)名が入っています。末尾7文字が(“.tar.gz”)ならunar、以下3文字(“.gz”)はunpigz、以外はunar
拡張子が(“.zip”)でlsarの出力がnotならunpigz、以外はunar
送り先のunar_click() unpigz_click()のselect_selection()はコメント

def unar_unpi_click():
    global mark
    b = ""
    select_selection()
    if mark == 1:
        return
    else:
        ext = a[-7:]
        if ext == ".tar.gz":
            unar_click()
        else:
            ext = a[-4:]
            if ext == ".zip":
                b = ("lsar " + a + " | awk 'NR==3'")
                b = (subprocess.Popen(b, stdout=subprocess.PIPE, shell=True).communicate()[0]).decode('utf-8')
                b = b.strip()
                if not b:
                    unpigz_click()
                else:
                    unar_click()
            else:
                ext = a[-3:]
                if ext == ".gz":
                    unpigz_click()
                else:
                    unar_click()

テスト

$ lsar moode-r721-iso.zip
moode-r721-iso.zip: Zip
moode-r721-iso.img


tar.gz
unar


img.gz
unpigz


zip
unpigz


zip
unpigz


zip
unar


7z
unar

Compression Tool


コマンドボタンはParallel Implementationをメインにしてapackボタンを1つ残しています。プログラムはそのままあるのでボタンプログラムのコメントを入れ替えるだけで変更可能
リストボックスはリンクファイル、実行ファイルを非表示にした
file_dir_list
— | grep -v ‘@$’ | grep -v ‘*$’ | sort”)

テスト
サイズの小さいアーカイブファイルでテスト deComp Toolで展開

unarからrarファイルOK

展開したディレクトリ(projects)を各形式で圧縮


pixxとapackの出力は同じファイル名になるのでリネーム


apackから実行した各コマンドはpixxより少し小さくなっています
pbzip2は差が大きかったので圧縮率(-6 から -9)に変更
xz 7z形式もある程度のサイズまでストレス無く圧縮できます

イメージファイル
旧バージョンになったmoode audio720をイメージファイルにした(moode720-210506.img)を圧縮


zipの13m25sに対してpigzは4m33sといい結果が出ています。
圧縮率
pigz -6
pixz -6
pbzip2 -9

Pi4のCPUパワーでは大きいサイズのファイル圧縮はpigzがベスト。
圧縮速度の兼ね合いになりますが一定サイズ以内であればpbzip2 pixzも充分メリットが得られると思います。

参考
dd_archives.py.20210623
dd_comp.py.20210623

dd tools(archives tool) Raspberry Pi

RaspberryPiOSなどのSDカードを作成するにはdd toolsではOSイメージをダウンロード、展開する必要があります。
RasPiOSはzip形式なのでunzipするだけと比較的簡単なのですがほかのOS(ディストリビューション)では様々な形式があります。
圧縮展開コマンドのフロントエンドになるCLIツールもいくつかありそれらを利用しながらdd toolsとして実験、動作を検証してみたいと思います。(RasPiOSはシンプルなXarchiverがデフォルトのアーカイバになっているがどうもうまく使えない!)

基本仕様

作成したツールはcompression(圧縮)とdecomp(展開)が別になっています。展開ツールはファイラー(ranger)と連携してrangerで圧縮ファイルを選択するとそのディレクトリで起動します。
展開ツールは圧縮ファイルのみ表示(拡張子)、圧縮ツールは圧縮ファイル以外をリストに表示します。ディレクトリ込でアーカイブする際はそのディレクトリのある場所で実行しないとフルパスを指定することになってしまいます。双方ともカレントディレクトリを変更する際はリスタートするためdevilspie2で起動位置を固定しないと使いにくくなってしまいます。
いずれもリストにあるファイル(カレントディレクトリ)を選択、ボタンひとつで圧縮展開する簡単操作を目標にしています。特別なオプションが必要な時はコマンドラインで実行します。

rangerはatoolをアーカイバのフロントエンドに採用しています。ディフォルトはビュー(als)ですが展開(aunpack)にすることで展開実行できますが右側ウインドウをクリックで開始してしまうため代わりに作成した展開ツールを起動します。
~/.config/ranger/rifle.conf (最初の方に記載)

ext 7z|ace|ar|arc|bz2?|cab|cpio|cpt|deb|dgc|dmg|gz,  = ~/bin/dd-tool/archives_start.py "$@" &
ext iso|jar|msi|pkg|rar|shar|tar|tgz|xar|xpi|xz|zip, = ~/bin/dd-tool/archives_start.py "$@" &

多重起動を防ぐためスクリプト経由で起動
~/bin/dd-tool/archives_start.py (chmod755)

#!/usr/bin/python3
import subprocess
kill = ("ps ax | grep python3 | grep dd_archives.py | grep -v grep | awk '{print $1}'")
kill = (subprocess.Popen(kill, stdout=subprocess.PIPE, shell=True).communicate()[0]).decode('utf-8')
if not kill:
    pass
else:
    subprocess.run("kill -9 " + kill, shell=True)
subprocess.run("~/bin/dd-tool/dd_archives.py &", shell=True)

展開ツール(dd_archives.py)の圧縮ファイル拡張子はrangerと同じ拡張子をfindで検索

# Listbox 1 (archives)
def arc_list():
    global archives_list
    archives_list = ("find . -maxdepth 1 -name '*.7z' -or -name '*.ace' -or -name '*.ar' -or -name '*.arc' -or -name '*.bz2' -or -name '*.cab' -or -name '*.cpio' -or -name '*.cpt' -or -name '*.deb' -or -name '*.dgc' -or -name '*.dmg' -or -name '*.gz' -or -name '*.iso' -or -name '*.jar' -or -name '*.msi' -or -name '*.pkg' -or -name '*.rar' -or -name '*.shar' -or -name '*.tar' -or -name '*.tgz' -or -name '*.xar' -or -name '*.xpi' -or -name '*.xz' -or -name '*.zip' | awk '{print substr($0, 3)}'")

圧縮ツール(dd_comp.py)は上記の拡張子を除外

# Listbox 1 (file&dir)
def fd_list():
    global file_dir_list
    file_dir_list = ("ls -F -I '*.7z' -I '*.ace' -I '*.ar' -I '*.arc' -I '*.bz2' -I '*.cab' -I '*.cpio' -I '*.cpt' -I '*.deb' -I '*.dgc' -I '*.dmg' -I '*.gz' -I '*.iso' -I '*.jar' -I '*.msi' -I '*.pkg' -I '*.rar' -I '*.shar' -I '*.tar' -I '*.tgz' -I '*.xar' -I '*.xpi' -I '*.xz' -I '*zip' | sort")

dd_archives.py(展開ツール)


ディレクトリボタンでカレントディレクトリ移動可
展開系ツールはテストしてボタン1つか2つにする予定
テストは主に2021-05-07-raspios-buster-armhf-lite.zipを使って進めてみます
wgetで配布ファイルダウンロード

CLIフロントエンドツールは以下を試してみます(pigzは専用コマンド)
atool : Perlで書かれている 展開(aunpack) 圧縮(apack) 一覧(als) その他
unar : MAC The Unarchiver のコマンドライン版 展開(unar) 一覧(lsar)
unp : Perlで書かれている
pigz : gzip zip 展開(unpigz) RasPiOSデフォルトインストール済

インストール

 # apt install atool unar unp

OSデフォルト、依存でインストール以外のコマンド

 # apt install p7zip-full unrar-free

GNU time 時間を計測 外部コマンド /usr/bin/time

 # apt install time

テスト

ディレクトリボタンはfiledialog.askdirectoryでディレクトリのみ表示します
ディレクトリを選択、OKでリスタートしてカレントディレクトリを変更
ファイルを選択して適当なCLIツールボタンをクリック

lsar filename.xxx | head -20 で20行まで表示
RasPiOSの配布イメージは単一ファイルですがアーカイブされたファイルを展開する際はディレクトリ付きか確認、よくやってしまうのが同一ディレクトリに展開、既存ファイルとゴッチャになってアチャー!という結果になります。判断がつきかねる時はディレクトリを作成移動して実行

unarで実行 OK 各CLIツールも基本同じ コマンドラインからも簡単


実行中はrangerから展開中のファイルにアクセスしないようにします。
cpu load averageが異常に上がってきます。
終了するとメッセージとともに保存したlogを表示
lsarはunzipコマンドを実行していると思います。
実質展開時間 33.2s


unpigzで実行 OK
pigzについては後述


結果は/tmp/expansion.logに保存しています。(上書き)基本実行コマンドはエラーが無ければ静かに終了します。(各CLIツール仕様)logにはGNU timeの結果だけが記載
実質展開時間 17.8s

unpigz -9kN のオプションを指定、展開時も圧縮率設定(展開時間)が効いてくるようです。
元ファイルをキープ、-Nで拡張子をそのまま
-0 to -9, -11 Compression level (level 11, zopfli, is much slower)
-k, –keep Do not delete original file after processing
-N, –name Store or restore file name and mod time

wget
配布ファイルの取得はwgetでダウンロードするのが好みです。ブラウザから右クリック、リンクのアドレスをコピーして貼り付け。最近のX更新で右クリックコピーもXセレクションに入るので中ボタンで貼り付けることが出来ます。
ダウンロードが終了したらついでにchecksumを実行、sha256sumを実行、moode audioのみmd5を実行。軽く眺めて合っていればOK

所感
いまのところ動作確認程度ですが無難にこなしてくれそうなのがunar
gzip zipはunpigzがパフォーマンスを発揮しそう
atoolはRARに対応していないhttps://www.nongnu.org/atool/

dd_comp.py(圧縮ツール)

当サイトでは圧縮はそう頻繁に使うことは無いのですが捨てられないファイルのアーカイブやmoode audioの旧バージョンイメージを圧縮保存する用途を考慮しています。

この中で興味があるのが
pbzip2 pigz pixz
従来のコマンド系は面倒なのでapackに喰わせる
テストは展開した2021-05-07-raspios-buster-armhf-lite.imgを各形式で固めてみます

起動
一般ファイルはrangerと関連付け出来ないのでメニューから起動、または展開ツール(dd_archives.py)から起動します。
メニューからはユーザーのホームディレクトリ、展開ツールからは実行しているディレクトリがカレントディレクトリ。起動してからは展開ツール同様にディレクトリボタンで選択、設定したHome(ワークディレクトリ)
rangerを終了したりするとツールも終了するので圧縮展開実行中はできるだけ余計なことをしない

アーカイブファイル
ツールは基本ボタンだけで実行することを想定しているのでファイル(ディレクトリ)+形式
ファイル例 2021-05-07-raspios-buster-armhf-lite.img.gz
ディレクトリ例 sample_dir.tar.gz
zip 7z は特に指定なし
ファイル名の変更、移動、ディレクトリの作成等はファイラーなどで実行

Parallel Implementation
piXXはParallel Implementation(並列実装)
従来のコマンド系はシングルコアで実行するのに対してマルチコアに対応したコマンド系ですね。
pigz – Parallel Implementation of GZip
pbzip2 – parallel bzip2 implementation
pixz – parallel, indexing XZ compressor/decompressor
現在のRasPiOSではpigzはディフォルトでインストールされています。pigzには展開コマンド(unpigz)がありますが pbzip2 pixz には見つかりませんでした。

# apt install pbzip2 pixz


実行すると4つのコアがほぼ100%で動いています。p7zipもマルチコアに対応しているようです

Pi4ではかなりCPUパワーを消費するため特に圧縮については圧縮率と圧縮速度を天秤に掛ける必要があると思います。圧縮率を–best(-9)にしても実質10M〜20M改善するだけで圧縮にかかる時間だけがそれ以上にかかってきます。と言っても現在のunix系標準圧縮形式はgzと思っているので圧縮率をzipより悪くする訳にはいきません。zipと同等の圧縮率でzipコマンドより早い設定を探します。

$ pigz -6fk 2021-05-07-raspios-buster-armhf-lite.img

圧縮率 -6 、上書き -f 、キープ -k この設定を元にpythonプログラムに適用

シングルファイル
/usr/bin/time pigz -6fk file_name > /tmp/compression.log 2>&1
/usr/bin/time pbzip2 -6fk file_name > /tmp/compression.log 2>&1
/usr/bin/time pixz -6k file_name > /tmp/compression.log 2>&1
ディレクトリ
/usr/bin/time tar cvf dir_name.tar.gz --use-compress-prog='pigz -6fk' dir_name > /tmp/compression.log 2>&1
/usr/bin/time tar cvf dir_name.tar.bz2 --use-compress-prog='pbzip2 -6fk' dir_name > /tmp/compression.log 2>&1
/usr/bin/time tar cvf dir_name.tar.xz --use-compress-prog='pixz -6k' dir_name > /tmp/compression.log 2>&1

pixzはデフォルトで上書きするので”-f”オプションはありません。

テスト実行

zip 3m16s 445M


gz (apack) 3m14s 445M


pigz 1m06s 444M
やはりマルチコアでは早くなっています


pbzip2 3m07s 408M
pbzip2は中途半端な感じがしますが実際は圧縮するファイル形式で相当違いが出ると思います
圧縮率と速度でメリットが有るのでしょう


pixz 10m54s 308M
7zipとほぼ同等の圧縮率と思います


7zip 11m30s 302M

参考 あくまで参考です ファイル名にハイフン(“-“)があるといろいろ問題があるのでアンダースコア(“_”)に切り替えています。(取り敢えず現状は問題ありません)
06/20 10:30 間違いがあったので差し替えました(dd_archives.py dd_comp.py)
dd_archives.py
dd_comp.py
archives_start.py

圧縮した各形式を展開
デフォルトのzip元ファイルをunzipしたsha256sumと比較、各形式とも全て正常に圧縮展開しています

もう少しテストをしてボタンは再配置する予定です

moOde audio 7.2.0

moOde audio 7.2.0がリリースされています。710のラジオマネージャーからのデータ(EXPORT)形式が変更になっていますね。ラジオロゴとjsonファイルのシンプルな形式になっています。 720で試してみることにします(失敗しました)

moOde audio 7.2.0

moOde audio 710からEXPORTしたstations.zipはIMPORT可能、登録したラジオ局も復活するのですがデフォルトのラジオ局も710のものになります。720のjsonファイルに登録したラジオ局データを追記、編集すればいいと思うのですがロゴのLocationが違うとかなんとかではねられてしまいます。

jsonファイルはテキスト形式ですが登録数が多いと面倒です。 登録したロゴ画像も管理しておく必要があります。

気がついたのはBBC RADIOですがURLが変更になっています。デフォルトのラジオ局は変更が少ないので気がついたところだけ修正していけば充分なのですがどうも気に入らないので今回もデータベースに手作業で登録していきます。 今回は前回整備したLoop deviceやスクリプトを利用して少しだけスマートに実行してみることにます。 ロゴ画像、plsファイルは展開したmoode-r720-iso.imgをLoop deviceとして予めコピー、また710のmoode-sqlite3.dbをコピー同様に取り込んでおきます。
コピー先は ロゴ画像 /var/local/www/imagesw/radio-logos
plsファイル /var/lib/mpd/music/RADIO
moode-sqlite3.db(710)はファイルネームを変更、またデフォルトのmoode-sqlite3.db(720)もコピーを取る

/var/local/www/db/moode-sqlite3.db (default 720)
# cp moode-sqlite3.db moode-sqlite3.db.current (720)
# cp moode-sqlite3.db moode-sqlite3.db.befor (710)

/home/pi/radio-import.sh
スクリプトもimgファイルの/home/piに放り込んでおきます。

#!/bin/sh
cd /var/local/www/db
# current radio data(720)
sudo sqlite3 -csv moode-sqlite3.db "SELECT * from cfg_radio ;" > cfg_radio.csv
# befor radio data(710)
sudo sqlite3 -csv moode-sqlite3.db.befor "SELECT * from cfg_radio ;" > cfg_radio.csv.befor
# befor radio user_data(710)
sudo cat cfg_radio.csv.befor | awk -F "," '$1 >= 500 {print}' > cfg_radio.csv.user_data
# current add user_data(720)
sudo cat cfg_radio.csv.user_data >> cfg_radio.csv

# Import
sudo  sqlite3 moode-sqlite3.db
#SQLite version 3.16.2 2017-01-06 16:32:41
#Enter ".help" for usage hints.
#sqlite> .separator ,
#sqlite> delete from cfg_radio;
#sqlite> .mode csv
#sqlite> .import cfg_radio.csv cfg_radio
#sqlite> .exit

# reboot
sh -c 'echo -n "Hit Enter key to reboot..."; read x'
sudo reboot

起動時から音が出るように/boot/config.txtにI2Sデバイスを追記しています。

dtparam=audio=off
dtoverlay=hifiberry-dac

上記の作業が終わったらloop deviceを閉じてカードに焼きます。当サイトではイメージファイルの段階で修正しましたがカードを作成してから修正を加えても同じことです。

起動実行

$ ssh pi@moode
$ sh radio-import.sh


スクリプトを実行するとsqlite3の対話モードになります。
実行内容は710の500番以降のユーザー登録データを720のデータベースに追記します。
ウェブブラウザはキャッシュをクリアしておくといいでしょう

上記のIMPORT項目のとおり打ち込みます。
Enterで再起動


720のデフォルトラジオ局に登録したラジオ局が追加出来ました。
ここからいつものとおりvncserverなどインストールします。UIは全く同じ、moOde audioもどこが変わっているか気がつきません。

 
 
 

Top