Um editor de tags com QT GUI e interface da linha de comando. Suporta MP4 (iTunes), ID3, Vorbis, Opus, FLAC e Matroska.
O editor de tags pode ler e escrever os seguintes formatos de tag:
Outras observações:
O editor de tags também pode exibir informações técnicas como ID, formato, idioma, taxa de bits, duração, tamanho, registro de data e hora, frequência de amostragem, FPS e outras informações das faixas.
Ele também permite inspecionar e validar a estrutura de elementos dos arquivos MP4 e Matroska.
Às vezes, o editor de tags precisa reescrever o arquivo inteiro para aplicar alterações. Isso leva à criação de um arquivo temporário. Com as configurações padrão da GUI, isso é imposto a ser conservador , pois os arquivos temporários também servem como um backup, caso algo dê errado, por exemplo, seu computador trava enquanto salva ou um bug no editor de tags quebra arquivos particularmente estruturados. Ao usar a CLI, também é recomendável usar --force-rewrite
.
A próxima seção descreve como ajustar as configurações para evitar a reescrita com o custo de não ter backup, tendo algum preenchimento dentro dos arquivos e/ou armazenamento de tags no final do arquivo.
No entanto, nem sempre será possível evitar a reescrita de um arquivo em todos os casos de qualquer maneira. Você pode configurar um diretório para arquivos temporários nas configurações da GUI ou na opção CLI --temp-dir
. Então você pode limpar facilmente todos os arquivos temporários em algum momento juntos. Para eficiência, o diretório temporário deve estar no mesmo sistema de arquivos que os arquivos que você está editando. Um recurso para excluir arquivos temporários automaticamente ainda não foi implementado.
O editor permite que você escolha se as tags devem ser colocadas no início ou no final de um arquivo MP4/Matroska. A colocação de tags no final do arquivo pode evitar a necessidade de reescrever o arquivo inteiro para aplicar alterações.
Na CLI, isso é controlado via --tag-pos
. Para aplicar um --tag-pos
específico, mesmo que isso exija que o arquivo seja reescrito, combine com a opção --force
.
Tags ID3v2 e comentários Vorbis/Opus só podem ser colocados no início. As tags ID3v1 só podem ser colocadas no final do arquivo. Portanto, essa configuração não tem efeito ao lidar com essas tags.
Também é possível controlar a posição do índice/pistas. No entanto, isso atualmente é suportado apenas ao lidar com arquivos Matroska.
Nota: Isso não pode ser implementado para MP4, pois as tags e o índice estão vinculados um ao outro. Ao lidar com os arquivos MP4, a posição do índice sempre será a mesma que a posição da tag.
Colocar o índice no início do arquivo às vezes é chamado de FastStart .
Para forçar o FastStart via CLI, são necessárias as seguintes opções:
tageditor set --index-pos front --force
O preenchimento permite adicionar informações adicionais de tag sem reescrever o arquivo inteiro ou anexar a tag. O uso do preenchimento pode ser configurado:
Também é possível forçar a reescrita de todo o arquivo para fazer cumprir o estofamento preferido.
As opções relevantes da CLI são --min-padding
, --max-padding
, --preferred-padding
e --force-rewrite
.
Atualmente, aproveitar o preenchimento não é suportado ao lidar com fluxos OGG (ele é suportado ao lidar com fluxos de FLAC em bruto).
Conforme explicado na seção "Backup/temporário", essa não é uma boa ideia como o arquivo temporário criado ao reescrever todo o arquivo também serve como backup. No entanto, se você quiser evitar reescrever o arquivo o máximo possível, defina o seguinte nas configurações "Layout do arquivo" da GUI:
Ao usar a CLI, você só precisa adicionar --max-padding 429496729
aos argumentos da CLI (e evitar qualquer outro argumento mencionado nas seções anteriores).
A edição de arquivos grandes (especialmente os arquivos Matroska) pode levar algum tempo. Para melhorar o desempenho, coloque o índice no final do arquivo (opção CLI --index-pos back
) porque o tamanho do índice nunca precisará ser recalculado. Siga também os conselhos da seção "Backup/Arquivos Temporários" para forçar a reescrita e colocar o diretório temporário no mesmo sistema de arquivos que o arquivo que você está editando. Forçar uma reescrita pode melhorar o desempenho, pois o editor de tags nem tentará ver se poderia ser evitado e, portanto, pode pular cálculos que podem levar um tempo notável para os arquivos Big Matroska.
É claro que ser capaz de evitar uma reescrita ainda seria mais ideal. Consulte a seção anterior sobre como conseguir isso. Para melhorar ainda mais o desempenho ao evitar uma reescrita, coloque a tag no final (opção da CLI --tag-pos back
). Em seguida, o editor de tags nem tentará colocar tags na frente e, portanto, pode pular alguns cálculos. (Evitar uma reescrita ainda não é uma boa ideia em geral.)
O formato de contêiner Matroska (e WebM, baseado em Matroska) está quebrando com convenções comuns. Portanto, nem todos os exemplos de CLI mencionados abaixo fazem sentido usar nesses arquivos.
Geralmente, um arquivo Matroska pode ter várias tags e cada tag tem um "Target" que decide a que os campos da tag se aplicam, por exemplo, a música ou o álbum inteiro. Portanto, ao usar a CLI ou a GUI, você precisa estar ciente de que tag/destino adicionar campos.
Matroska também não usa um campo combinado para o número de faixas/disco e total, como outros formatos. Em vez disso, ele usa a part
dos campos separados e totalparts
, que novamente precisam ser adicionados a uma tag do alvo desejado (por exemplo, 50/"Álbum" para o número da faixa e o total).
Confira a documentação oficial de Matroska sobre marcação para obter detalhes. Ele também contém exemplos de conteúdo de áudio e conteúdo de vídeo.
Observe que o editor de tags não suporta o formato XML mencionado na documentação de Matroska. Na GUI, você pode simplesmente adicionar/remover/editar tags e seus alvos através dos controles na parte superior do editor. Nas configurações, você também pode especificar que as tags de certas metas devem ser adicionadas automaticamente ao carregar um arquivo. Ao usar a CLI, você pode especificar que um campo deve ser adicionado a uma tag de um determinado alvo especificando o destino antes desse campo. Você também pode remover explicitamente as tags de determinados alvos. Exemplos do uso de CLI de concreto podem ser encontrados abaixo.
Veja a seção de liberação no Github.
tageditor-qt6
se disponível para o seu sistema operacional.tageditor
dos repositórios oficiaislibopengl0
está instalado no Debian/Ubuntu)QT_QPA_PLATFORM=xcb
para desativar o suporte de Wayland nativo se não funcionar no seu sistema)B9E36A7275FC61B464B67907E06FE8F53CDC6A4C
.B9E36A7275FC61B464B67907E06FE8F53CDC6A4C
.O editor de tags possui uma GUI baseada em QT e uma interface de linha de comando. Para uma interface da biblioteca C ++, checkout a biblioteca tagparser subjacente.
A GUI deve ser auto -expedida - muitos dos elementos da interface do usuário têm dicas de ferramentas com mais explicações. O fluxo de trabalho básico é bastante simples:
Você pode definir o comportamento do editor para manter os valores anteriores, para que não precise inserir informações como o nome do álbum ou o artista de todos os arquivos em um álbum repetidamente.
A GUI não suporta definir vários valores do mesmo campo (além de coberturas de diferentes tipos). Se um arquivo já contiver campos com vários valores, os valores adicionais serão descartados. Use a CLI se o suporte para vários valores por campo for necessário. Nem todos os formatos de tags suportam isso de qualquer maneira.
A GUI não suporta processamento em lote. Eu recomendo usar a CLI para isso.
Esta captura de tela mostra a pesquisa experimental MusicBrainz/Lyricwiki.
Consulte a caixa de diálogo Configurações. Você pode
As configurações da GUI não afetam a CLI.
Há também uma ferramenta para renomear arquivos usando as informações de tag armazenadas nos arquivos. O novo nome para cada arquivo é gerado por um pequeno JavaScript que pode ser personalizado. Um exemplo de script é fornecido. Antes que quaisquer alterações reais sejam feitas, você verá uma visualização com os nomes de arquivos gerados. Como mostrado no script de exemplo, também é possível mover arquivos para outro diretório.
O editor de tags também apresenta um MusicBrainz, Cover Art Archive e Lyricwiki Search.
tageditor <operation> [options]
Consulte as operações e opções disponíveis com --help
. Para uma lista de todos os nomes de campo disponíveis, rastrear nomes e modificadores, use a opção CLI --print-field-names
. Nem todos os campos são suportados por todos os formatos de tag/contêiner. Mais notavelmente, o formato do contêiner Matroska não usa track
/ disk
para armazenar o número de faixa / disco e total em um campo. Em vez disso, a part
dos campos e totalparts
precisam ser usados no alvo desejado.
Observe que os usuários do Windows devem usar tageditor-cli.exe
em vez do tageditor.exe
ou usar o Mintty como terminal. Confira a seção "Problemas específicos do Windows" para obter detalhes.
Aqui estão alguns exemplos de bash que ilustram obter informações sobre tags de obter e definir:
Exibe o título, álbum e artista de todos os arquivos *.m4a no diretório especificado:
tageditor get title album artist --files /some/dir/*.m4a
Exibe todos os campos suportados de todos os arquivos *.mkv no diretório especificado:
tageditor get --files /some/dir/*.mkv
Extrai a capa do arquivo especificado (Opus):
tageditor extract cover --output-file the-cover.jpg --file some-file.opus
--attachment
.Exibe informações técnicas sobre todos os arquivos *.m4a no diretório especificado:
tageditor info --files /some/dir/*.m4a
Define título, álbum, artista, capa e número de faixas de todos os arquivos *.m4a no diretório especificado:
tageditor set title="Title of "{1st,2nd,3rd}" file" title="Title of "{4..16}"th file"
album="The Album" artist="The Artist"
cover'=/path/to/image' lyrics'>=/path/to/lyrics' track'+=1/16' --files /some/dir/*.m4a
lyrics
do >
depois do nome do campo faz com que o editor de tags leia o valor do arquivo especificado. Isso também funciona para outros campos e está implícito para cover
.+
após a track
do nome do campo indica que o valor do campo deve ser aumentado após o processamento de um arquivo./path/to/image
e as letras do arquivo /path/to/lyrics
.Define o título de ambos os arquivos especificados e o álbum do segundo arquivo especificado:
tageditor set title0="Title for both files" album1="Album for 2nd file"
--files file1.ogg file2.mp3
O número após o nome do campo especifica o índice do primeiro arquivo para usar o valor. O primeiro índice é 0.
Define o título especificamente para a faixa com o ID 3134325680
e remove as tags direcionadas à música/faixa e o álbum/filme/episódio em geral:
tageditor set target-level=30 target-tracks=3134325680 title="Title for track 3134325680"
--remove-target target-level=50 --remove-target target-level=30
--files file.mka
Para obter mais informações, consulte a especificação Matroska.
Define campos personalizados:
tageditor set mkv:FOO=bar1 mp4:©foo=bar2 -f file.mkv file.m4a
FOO
está definido como bar1
no arquivo.mkv e o campo personalizado ©foo
está definido como bar2
no arquivo.m4a. Portanto, os prefixos informam ao editor de tags que o ID do campo especificado é um ID de campo nativo de um formato de tag específico, em vez de um identificador genérico. Os campos nativos são aplicados apenas ao formato correspondente, é claro.mp4
: ID do mp4/m4a no estilo iTune (deve ser exatamente 4 caracteres)mkv
: Matroska IDid3
: ID3V2 ID (deve ser exatamente 3 ou 4 caracteres, dependendo da versão da tag)vorbis
: Vorbis Comment ID, também funciona para o Opus (que também usa comentários de Vorbis)Remove a bandeira "forçada" de todas as faixas, sinaliza a faixa com o ID 2 como "padrão" e define seu idioma como "ger":
tageditor set track-id=all forced=no track-id=2 default=yes language=ger
Aqui está outro exemplo, demonstrando o uso de matrizes e a sintaxe em campos numéricos de aumento automático, como o número da faixa:
cd some/dir
# create an empty array
titles=()
# iterate through all music files in the directory
for file in *.m4a; do
# truncate the first 10 characters
title="${file:10}";
# append the title truncating the extension
titles+=("title=${title%.*}");
done
# now set the titles and other tag information
tageditor set "${titles[@]}" album="Some Album" track+=1/25 disk=1/1 -f *.m4a
Define uma capa de um tipo especial com uma descrição:
tageditor set cover=":front-cover" cover0="/path/to/back-cover.jpg:back-cover:The description" -f foo.mp3
path:cover-type:description
. O tipo de capa e a descrição são opcionais. O delimitador pode ser alterado via- --cover-type-delimiter
o que é útil se o caminho incluir a :
.0
após a 2ª cover
é necessária. Caso contrário, a segunda capa seria definida apenas no 2º arquivo (que nem é especificado neste exemplo).… cover= cover0="/path/to/back-cover.jpg:back-cover"
.:
está ausente), todas as capas existentes do tipo especificado são substituídas e a nova tampa terá uma descrição vazia.:
.… cover=":back-cover"
.tageditor --print-field-names
.Define campos executando um script para calcular as alterações dinamicamente:
tageditor set --pedantic debug --script path/to/script.js -f foo.mp3
main()
. Esta função é invocada para cada arquivo e passou um objeto representando o arquivo atual como o primeiro argumento. O arquivo modificado apenas se main()
retornar um valor verdadeiro ou undefined
; Caso contrário, o arquivo será ignorado completamente (e, portanto, não é modificado, portanto, os valores passados via --values
não são aplicados).testfiles/set-tags.js
neste repositório para um exemplo que aplica correções básicas e tenta buscar letras e cobrir a arte quando as configurações de acordo são passadas (por exemplo --script-settings addCover=1 addLyrics=1
).--pedantic debug
é muito útil. Você também pode adicionar --script-settings dryRun=1
e verifique essa configuração dentro do script, como mostrado em testfiles/set-tags.js
.testfiles/set-tags.js
.ArrayBuffer
. O uso também deve usar um ArrayBuffer
para definir o valor de campos binários, como a tampa.String
ou Number
. Você também deve usar um desses tipos para definir o valor desses campos. A representação da string do conteúdo atribuída será convertida automaticamente ao que é necessário internamente.utility
expõe métodos úteis, por exemplo, para registrar e controlar o loop do evento.testfiles/http.js
neste repositório para um exemplo de uso do XHR e controle do loop do evento.--id3v1-usage
). Portanto, as tags presentes durante a execução do script não representam necessariamente tags que estão realmente presentes no arquivo no disco (mas sim as tags que estarão presentes após salvar o arquivo).--values
), esses valores terão precedência sobre os valores definidos pelo script.file.rename(newPath)
). Isso será feito imediatamente e também se main()
retornar um valor falsamente (por isso é possível renomear apenas um arquivo sem modificá -lo retornando um valor falsamente). Se o caminho especificado for relativo, ele será interpretado em relação ao diretório atual do arquivo (e não ao diretório de trabalho atual do editor de tags).utility.openFile(path)
. Isso possibilita copiar tags de outro arquivo, por exemplo, para inserir as tags de volta dos arquivos originais que foram perdidos ao se converter para um formato diferente. O exemplo de script mencionado set-tags.js
também demonstra isso para capas e letras quando as configurações de scripts são aprovadas (por exemplo --script-settings addCover=1 originalDir=… originalExt=…
). Exemplo: cd '/…/music'
find 'artist/album' -iname '*.m4a' -exec tageditor set
--pedantic debug
--script /…/tageditor/testfiles/set-tags.js
--script-settings dryRun=1 originalDir='../music-lossless' originalExt=.flac addCover=1 addLyrics=1
--temp-dir /…/tmp/tageditor
--files {} +
tageditor set ... --pedantic warning -f ...
tageditor info --pedantic warning --validate -f ...
--encoding
e nas configurações da GUI.O aplicativo depende de utilitários C ++ e tagparser e é construído da mesma maneira que essas bibliotecas. Para instruções básicas, consulte o arquivo de leitura dos utilitários C ++. Quando a GUI do QT é ativada, o QT e o qtutilidades também são necessários.
Para evitar a criação de utilitários C ++/tagparser/qtutilidades separadamente, siga as instruções em "Construir isso reto". Há também documentação sobre várias variáveis de construção que podem ser transmitidas para o cmake para influenciar a construção.
A GUI QT é ativada por padrão. Os seguintes módulos QT são necessários (apenas a mais recente versão QT 5 e Qt 6 testada): Widgets de rede Concorrente Core Concurrent
Observe que as versões QT antigas não têm suporte para os recursos javascript modernos. Para usar a ferramenta de renomeação baseada em JavaScript, é recomendável usar pelo menos o QT 5.12.
Para especificar a versão qt principal a ser usada, defina QT_PACKAGE_PREFIX
(por exemplo, add -DQT_PACKAGE_PREFIX:STRING=Qt6
para os argumentos cmake).
-DWEBVIEW_PROVIDER:STRING=webkit/webengine/none
aos argumentos cmake para usar o QT Webkit (também funciona com a versão 'revivida'), qt webEngine ou nenhuma visualização da web. Se nenhuma visualização da Web for usada, as informações do arquivo só poderão ser mostradas usando uma visualização de árvore simples. Caso contrário, o usuário poderá escolher entre uma página da web e uma visualização em árvore.-DJS_PROVIDER:STRING=script/qml/none
aos argumentos cmake para usar o script QT, QT QML ou nenhum mecanismo JavaScript. Se nenhum mecanismo JavaScript for usado, o utilitário de renomeação será desativado.É possível construir sem a GUI se apenas a CLI for necessária. Nesse caso, não são necessárias dependências QT (incluindo qtutilidades).
Para construir sem GUI, adicione os seguintes parâmetros à chamada cmake:
-DWIDGETS_GUI=OFF -DQUICK_GUI=OFF
Como uma pequena demonstração para o reflexivo Rapidjson, o editor de tags apresenta uma exportação JSON opcional. Para ativá -lo, adicione -DENABLE_JSON_EXPORT=ON
aos argumentos cmake.
Quando ativado, as seguintes dependências adicionais são necessárias (apenas em tempo de construção): Rapidjson, reflexivo-Rapidjson e LLVM/CLANG
cd "$SOURCES"
git config core.symlinks true # only required on Windows
git clone https://github.com/Martchus/cpp-utilities.git c++utilities
git clone https://github.com/Martchus/tagparser.git
git clone https://github.com/Martchus/qtutilities.git # only required for Qt GUI
git clone https://github.com/Martchus/reflective-rapidjson.git # only required for JSON export
git clone https://github.com/Martchus/tageditor.git
git clone https://github.com/Martchus/subdirs.git
git config core.symlinks=true
é necessário apenas no Windows para lidar com o SyMlinks corretamente. Isso requer uma versão Git recente e um sistema de arquivos que suporta symblinks (NTFS Works). Além disso, você precisa ativar o modo de desenvolvedor do Windows. Se você se deparar com erros "não encontrados" na criação do Symlink, use git reset --hard
dentro do repositório para corrigir isso. cd "$BUILD_DIR"
cmake
-G Ninja
-DCMAKE_BUILD_TYPE=Release
-DLANGUAGE_FILE_ISO_639_2="/usr/share/iso-codes/json/iso_639-2.json"
-DCMAKE_INSTALL_PREFIX="/install/prefix"
"$SOURCES/subdirs/tageditor"
/install/prefix
pelo diretório onde você deseja instalar./usr/…/iso_639-2.json
pelo caminho para a instalação do seu ISO-Codes. cd "$BUILD_DIR"
ninja install
DESTDIR
como um local gravável (por exemplo, DESTDIR="temporary/install/dir" ninja install
) e mova os arquivos de lá para o local desejado depois. As advertências a seguir podem ser contadas usando o cli-wrapper em vez do executável principal. Este é o arquivo que termina com -cli.exe
. Como alternativa, você pode usar a Mintty (por exemplo, via MSYS2), que também não é afetado por esses problemas:
set ENABLE_CP_UTF8=0
se isso não for desejado.set ENABLE_CONSOLE=0
para desativar esse comportamento.O modo escuro deve funcionar fora da caixa no Windows 11 e, de outra forma, pode ser ativado selecionando o estilo de fusão.
O editor de tags suporta PMV2 fora da caixa a partir do QT 6. Você pode ajustar as configurações de acordo com a documentação do QT.
Copyright © 2015-2024 Marius Kittler
Todo o código está licenciado sob GPL-2-Or-Later.