transparente “symlink + patch binário”

3

Eu tenho um projeto onde estou coletando e organizando arquivos de mp3 de um programa de rádio de longa duração. Sendo de várias origens e origens, as convenções de nomenclatura e as tags ID2 / 3 estão em todo lugar.

Eu quero criar um conjunto de arquivos canonizados. Para esse fim, eu tomei para preservar a estrutura de diretórios e nomes de arquivos, e ligando isso simbolicamente a uma estrutura de diretórios padronizada e nome de arquivo. Dessa forma, posso facilmente dizer o que tenho e o que me falta, mas também sei quando encontro um show "em estado selvagem" que já tenho.

Mas permanece o problema das tags ID2 / 3. Eu quero padronizá-los também, mas não posso fazê-lo sem alterar a fonte mp3.

Eu estava pensando que, em um mundo ideal, eu atualizo uma cópia do arquivo mp3, crio um patch binário contra o original e, de alguma forma, crio um symlink desse patch, mais o arquivo original, para criar um novo, arquivo virtual canonizado que é transparente para o sistema de arquivos.

Existe alguma solução semelhante para esse problema?

    
por user394 07.08.2016 / 00:07

2 respostas

1

Eu dei uma olhada em alguns sistemas de arquivos de fusíveis, e o mais simples de trabalhar é o concatfs de Peter Schlaile. Se nada mais, seria um bom lugar para começar, já que a implementação do código C é pequena e autônoma.

Basicamente, para qualquer arquivo A você quer "symlink", em algum diretório de fontes arbitrárias S você cria um arquivo B que contém apenas as informações da tag id3 (versão 2) que você quer, então um arquivo mágico C com um nome de arquivo que contém os caracteres "-concat-" em algum lugar. Este arquivo C contém, em ordem, os nomes B e A .

Quando você executa o programa concatfs, você especifica o diretório de origem S e um segundo diretório de ponto de montagem arbitrário M . Em M você verá todos os mesmos arquivos que em S , mas quando você ler o arquivo C você obterá uma concatenação de B e A , ou seja, suas novas tags, seguidas pelos dados mp3 reais. Obviamente, apenas os arquivos mágicos precisam estar em S , já que você pode usar caminhos absolutos ou relativos em um arquivo mágico.

Isto não é perfeito porque se o seu arquivo A contiver as tags id3v2 (no início do arquivo) elas serão adicionadas àquelas em seu arquivo B . Além disso, as tags id3v1 (no final do arquivo) ainda estarão lá. No entanto, com algum código C, deve ser possível suprimir o início e o fim de A . Além disso, é trivial mudar a sequência mágica "-concat -".

Aqui estão os comandos que usei para testar concatfs. Instale o pacote fuse-devel para que você possa compilar o código. O resto não precisa de você para ser root. Faça o download e descompacte as fontes e compile-as:

cd concatfs
gcc -Wall src/concatfs.c $(pkg-config fuse --cflags --libs) -o concatfs

Crie os 2 diretórios, inicie o comando e copie alguns arquivos mp3 para tocar, removendo quaisquer tags:

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

Crie o arquivo fictício, o arquivo mágico, e adicione algumas tags id3v2 ao arquivo fictício:

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

Procure no segundo diretório para encontrar os mesmos arquivos, mas o tamanho e o conteúdo do arquivo mágico é a concatenação dos dois arquivos:

ls ../mnt/ -l
cat ../mnt/try.mp3-concat-.mp3 | wc -c
id3info ../mnt/try.mp3-concat-.mp3
mediainfo ../mnt/try.mp3-concat-.mp3

Quando você mata o programa, pode ser necessário limpar a montagem:

fusermount -u ~/myfuse
    
por 09.08.2016 / 21:24
1

Aqui está o meu caso de por que um banco de dados pode ser uma boa solução:

  • Como a linguagem de consulta SQL é flexível, ela permite associar nomes de arquivos antigos e novos a um id_tag por meio de um sistema de endereçamento declarativo.
  • Ele pode ser estendido para fornecer usos adicionais. Por exemplo, eu adicionei uma tag de categoria no script abaixo.
  • se estiver usando o SQLite, ele pode ser usado a partir da linha de comando e produz STDOUT, que pode ser canalizado, redirecionado, etc.

Meu exemplo é baseado na idéia de que cada show é identificado por um registro único, em uma única tabela (mais simples que várias tabelas) todas as informações sobre esse programa de rádio estarão contidas em um registro nessa tabela usando sqlite

instala o sqlite

apt-get install sqlite3

ou use yum , pacman , compilação a partir da fonte ou qualquer outra coisa

Entre no seu diretório de banco de dados e crie um script

arquivo

: 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

Em seguida, use a partir da linha de comando: por exemplo. adicionar um novo show

% sqlite3 music_db <<EOF
insert into radio_shows                  
(new_filename, id_tag, category_tags) values 
('a_new_show', 'xyz_123', 'good_show'); 
EOF

recupere o show (em uma data posterior) e imprima para STDOUT

% sqlite3 music_db <<EOF
select new_filename, id_tag
from radio_shows
where category_tags = "good_show";
EOF

resultado

a_new_show|xyz_123
    
por 07.08.2016 / 04:42