투명한 "symlink + 바이너리 패치"

투명한 "symlink + 바이너리 패치"

저는 장기간 진행되는 라디오 쇼에서 mp3 파일을 수집하고 정리하는 프로젝트를 가지고 있습니다. 명명 규칙과 ID2/3 태그는 다양한 출처와 출처로 인해 어디에나 존재합니다.

정규화된 파일 세트를 만들고 싶습니다. 이를 위해 저는 디렉터리 구조와 파일 이름을 유지하고 표준화된 디렉터리 구조와 파일 이름에 심볼릭 링크를 연결하기 시작했습니다. 이렇게 하면 내가 가지고 있는 것과 부족한 것이 무엇인지 쉽게 알 수 있을 뿐만 아니라, 내가 이미 갖고 있는 "야생적인" 쇼를 언제 접하게 되는지도 알 수 있습니다.

하지만 여전히 ID2/3 태그의 문제가 있습니다. 또한 정규화하고 싶지만 소스 mp3를 변경하지 않으면 그렇게 할 수 없습니다.

이상적인 세계에서는 mp3 파일의 복사본을 업데이트하고 원본 파일에 대해 바이너리 패치를 만든 다음 어떻게든 원본 파일과 함께 해당 패치에 대한 심볼릭 링크를 만들어 쌍을 이루는 새로운 정규화된 가상 파일을 생성한다고 생각합니다. 파일 시스템은 투명합니다.

이 문제에 대한 비슷한 해결책이 있습니까?

답변1

일부 회로 차단기 파일 시스템을 살펴보았는데 가장 간단한 작업 방법은 다음과 같습니다.파일 시스템 연결저자: 피터 슈라이어 다른 것이 없다면 C 코드 구현이 작고 자체 포함되어 있으므로 이는 좋은 출발점이 될 것입니다.

기본적으로 모든 파일에 대해임의의 소스 디렉토리에 "symlink"하고 싶습니다에스당신은 파일을 만듭니다두번째여기에는 원하는 id3 태그 정보(버전 2)와 매직 파일만 포함되어 있습니다.파일 이름 어딘가에 "-concat-" 문자가 포함되어 있습니다. 이 파일이름이 순서대로 포함되어 있습니다.두번째그리고.

concatfs 프로그램을 실행할 때 소스 디렉터리를 지정합니다.에스두 번째 임의 마운트 지점 디렉터리중간 사이즈. 존재하다중간 사이즈에서와 동일한 파일이 모두 표시됩니다.에스하지만 파일을 읽을 때당신은 연결을 얻을 것입니다두번째그리고즉, 새 태그 뒤에 실제 mp3 데이터가 옵니다. 분명히 매직 파일만 실제로 있어야 합니다.에스, 매직 파일에서 절대 또는 상대 경로를 사용할 수 있기 때문입니다.

이것은 완벽하지 않습니다.파일에는 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

두 번째 디렉터리에서 동일한 파일을 찾으세요. 하지만 매직 파일의 크기와 내용은 두 파일을 연결한 것입니다.

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_tagSQL 쿼리 언어는 매우 유연하기 때문에 선언적 주소 지정 시스템을 통해 이전 파일 이름과 새 파일 이름을 연결할 수 있습니다.
  • 추가 용도로 확장할 수 있습니다. 예를 들어 아래 스크립트에 카테고리 태그를 추가했습니다.
  • 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

관련 정보