
私は長期にわたるラジオ番組でmp3ファイルを収集して整理するプロジェクトを持っています。命名規則とID2/3タグは、さまざまなソースとソースからどこにでも存在します。
正規化されたファイルセットを作成したいと思います。この目的のために、私はディレクトリ構造とファイル名を維持し、標準化されたディレクトリ構造とファイル名にシンボリックリンクを関連付け始めました。これにより、私が持っているものと不足しているものが何であるかを簡単に知ることができるだけでなく、私がすでに持っている「野生の」ショーにいつ接するのかがわかります。
しかし、まだID2 / 3タグの問題があります。また、正規化したいのですが、ソースmp3を変更しないとそうすることはできません。
理想的な世界では、mp3ファイルのコピーを更新し、元のファイルのバイナリパッチを作成し、どういうわけか元のファイルとそのパッチへのシンボリックリンクを作成してペアになる新しい正規化された仮想ファイルを作成すると思います。ファイルシステムは透明です。
この問題に対する同様の解決策はありますか?
答え1
いくつかのサーキットブレーカーファイルシステムを見てきましたが、最も簡単な作業方法は次のとおりです。ファイルシステム接続著者:ピーターシュライヤー他に何もない場合は、Cコードの実装が小さく、自己完結しているので、これは良い出発点になります。
デフォルトでは、すべてのファイルについてㅏ任意のソースディレクトリに「symlink」したいSあなたはファイルを作成します第二これには、必要なid3タグ情報(バージョン2)とマジックファイルのみが含まれています。氏ファイル名のどこかに「-concat-」文字が含まれています。このファイル氏名前が順番に含まれています。第二そしてㅏ。
concatfs プログラムの実行時にソースディレクトリを指定します。S2番目のランダムマウントポイントディレクトリ中サイズ。存在する中サイズと同じファイルがすべて表示されます。Sしかし、ファイルを読むとき氏あなたは接続を得るでしょう第二そしてㅏつまり、新しいタグの後に実際のmp3データが続きます。明らかに、マジックファイルだけが実際に存在するはずです。Sこれは、マジックファイルで絶対パスまたは相対パスを使用できるためです。
これは完璧ではありません。ㅏファイルにはid3v2タグ(ファイルの先頭)が含まれており、ファイルに追加されます。第二文書。さらに、id3v1タグ(ファイルの末尾)がまだ存在します。ただし、一部のCコーディングでは、これを抑制できます。ㅏ。また、マジック文字列「-concat-」を変更するのも簡単です。
以下は、concatfsをテストするために使用したコマンドです。fuse-devel
コードをコンパイルできるようにパッケージをインストールします。残りはルートを必要としません。
ダウンロードそしてソースを解凍してコンパイルします。
cd concatfs
gcc -Wall src/concatfs.c $(pkg-config fuse --cflags --libs) -o concatfs
2つのディレクトリを作成してコマンドを起動し、再生したいmp3ファイルをコピーしてすべてのタグを削除します。
mkdir -p ~/myfuse/src ~/myfuse/mnt
./concatfs ~/myfuse/src ~/myfuse/mnt # runs in background
cd ~/myfuse/src
cp ....sometestfile.mp3 try.mp3
id3v2 --delete-v1 try.mp3
id3v2 --delete-v2 try.mp3
id3info try.mp3
ダミーファイルであるマジックファイルを作成し、ダミーファイルにいくつかのid3v2タグを追加します。
echo -e 'dummy.mp3\ntry.mp3' > try.mp3-concat-.mp3
> dummy.mp3
id3v2 -2 -c 'my description:my comment' -a 'my artist' -A 'my album' -y '2010' -T 1/2 dummy.mp3
hexdump -C dummy.mp3
ls -l
2番目のディレクトリで同じファイルを見つけます。しかし、マジックファイルのサイズと内容は2つのファイルをリンクしたものです。
ls ../mnt/ -l
cat ../mnt/try.mp3-concat-.mp3 | wc -c
id3info ../mnt/try.mp3-concat-.mp3
mediainfo ../mnt/try.mp3-concat-.mp3
プログラムを終了すると、インストールをクリーンアップする必要があります。
fusermount -u ~/myfuse
答え2
データベースが良いソリューションになる理由は次のとおりです。
id_tag
SQLクエリ言語は非常に柔軟性があるため、宣言型アドレッシングシステムを使用して古いファイル名と新しいファイル名を関連付けることができます。- 追加の用途に拡張できます。たとえば、以下のスクリプトにカテゴリタグを追加しました。
- SQLiteを使用している場合は、コマンドラインで使用でき、パイプ、リダイレクトなどを介して出力できるSTDOUTを生成します。
私の例は、各プログラムが一意のレコードとして識別され、そのラジオプログラムに関するすべての情報が単一のテーブル(複数のテーブルよりも簡単です)に含まれているという考えに基づいています。sqlite
SQLiteのインストール
apt-get install sqlite3
またはソースまたはその他からビルドyum
、使用pacman
データベースディレクトリにCDを挿入し、スクリプトを作成します。
文書:music_db.sh
#!/bin/bash
if [ -f music_db ]
then
rm -v music_db
fi
sqlite3 music_db << 'EOF'
create table radio_shows(
original_filename text,
new_filename text,
id_tag text,
category_tags text
);
EOF
sqlite3 music_db << 'EOF'
insert into radio_shows
(original_filename, new_filename, id_tag, category_tags) values
('first_show-001', 'first_show-001--new_naming_scheme', 'id_tag aaa', 'favourite_shows'),
('first_show-002', 'first_show-002--new_naming_scheme', 'id_tag aab', 'favourite_shows'),
('first_show-003', 'first_show-003--new_naming_scheme', 'id_tag aac', 'crap_shows'),
('first_show-004', 'first_show-004--new_naming_scheme', 'id_tag aad', 'favourite_shows');
EOF
次に、コマンドラインで次を使用します。たとえば、新しいショーを追加します。
% sqlite3 music_db <<EOF
insert into radio_shows
(new_filename, id_tag, category_tags) values
('a_new_show', 'xyz_123', 'good_show');
EOF
プログラム(後で)を検索してSTDOUTとして印刷します。
% sqlite3 music_db <<EOF
select new_filename, id_tag
from radio_shows
where category_tags = "good_show";
EOF
結果
a_new_show|xyz_123