Sida 3 av 3

Re: Ändra filnamn på musikfiler [Typ löst…]

Postat: 15 nov 2010, 23:25
av ubot
Jo. Just det. Det tänkte jag inte på. Hur har det blivit så att dina taggar ligger på flera rader i en och samma comment[n]? Hur har du gjort för att infoga radbrytning i en tagg?

Så här t.ex:
comment[7]: DESCRIPTION=Drum machine programming: Johnny Andersson
Bass guitar: Johnny Andersson
Rhythm guitar: Johnny Andersson
Acoustic guitars: Johnny Rosenberg
Keyboards: Johnny Andersson
Hur skapade du en sån tagg från början?

Re: Ändra filnamn på musikfiler [Typ löst…]

Postat: 16 nov 2010, 19:26
av Johnny Rosenberg
ubot skrev:Jo. Just det. Det tänkte jag inte på. Hur har det blivit så att dina taggar ligger på flera rader i en och samma comment[n]? Hur har du gjort för att infoga radbrytning i en tagg?

Så här t.ex:
comment[7]: DESCRIPTION=Drum machine programming: Johnny Andersson
Bass guitar: Johnny Andersson
Rhythm guitar: Johnny Andersson
Acoustic guitars: Johnny Rosenberg
Keyboards: Johnny Andersson
Hur skapade du en sån tagg från början?
Jag har skapat dem med EasyTAG genom att först skriva dem i gedit och sedan klistra in dem i EasyTAG. De funkar också med ganska många program. Entagger visar dem precis som jag tänkt. Tar man egenskaper på filen i Nautilus så visas allt på en rad, men allt visas. I EasyTAG visas också allt på en rad, men varje rad skiljs åt av en liggande rektangel med texten ”000A” i, och i ghex2 kan jag verifiera att det är just tecknet \x0A som skiljer raderna från varandra.

Vad jag har förstått så ska flerradskommentarer vara ”giltiga”, eller vad man ska kalla dem, men det betyder ju inte automatiskt att just metaflac har stöd för dem.

Läser man på ”man metaflac” så ser man också att en av växlarna ännu inte har stöd för flerradskommentarer, nämligen just ”--import-tag-from”, vilket jag tycker är en antydan om att flerradskommentarer stöds generellt men ”inte här”…

Men jag har letat runt lite och funnit att så kanske inte är fallet. Flac-filer använder samma taggar som ogg-Vorbis-filer, nämligen just Vorbis, och det ledde mig till denna sida. Visserligen är det tillåtet att använda vilka taggar man vill, man kan alltså hitta på egna, men då är ju risken att man blir den ende som kan läsa dem… Tittar man på vad de skriver om DESCRIPTION, så nämner de bara att det kan vara en kortare beskrivning av innehållet. Det kan man ju tolka som ”enradskommentar” om man vill…

Som du kanske lagt märke till i mina tidigare försök, så står det samma information i DESCRIPTION som i COMMENT. På sidan nämns de fältnamn som man uppmuntras att använda och där är DESCRIPTION med men inte COMMENT. Taggarna i mina flac-filer är ju i de flesta fall skapade med EasyTAG, men även Entagger kan visa kommentarerna. Frågan är bara om Entagger läser DESCRIPTION- eller COMMENT-taggen…

Men i och för sig, när det gäller de filer jag skapar själv, där jag alltså själv medverkar och står för själva inspelningen, så är det ju bara där jag dokumenterar vem som spelar vad och så vidare och då är det ju bara jag som kommer att läsa dem ändå, så då kunde jag ju lika gärna skapa mina egna taggar, typ:
TRUMMOR=Bertil Stråtesjö
BAS=Bosse Kosseman
KOMPGITARR=Hölasse Frassestedt
KEYBOARD=Handtage Studslund
SOLOGITARR=Johnny Rosenberg
Eller liknande…
Eller bara, som vi varit inne på tidigare, ha flera DESCRIPTION-rader:
DESCRIPTION=Jöns Hildeström: Trummor, maraccas, tamburin och knallpistol
DESCRIPTION=Cristel Sjögurka: Bas, dammsugare och moraklocka
DESCRIPTION=Johnny Rosenberg: Gitarrer och keyboards
DESCRIPTION= Jöns ramlade av stolen tre gånger under inspelningens gång
DESCRIPTION=Cristels man förstörde bästa tagningen genom att storma in och bjuda på brända wienerbröd och spilla juice över mixerbordet, därav denna halvusla tagning där alla spelar fel hela tiden…
Frågan är bara vilka garantier man har att kommentarerna hamnar i rätt ordning i filen, men de verkar komma i den ordning man lägger in dem.

Re: Ändra filnamn på musikfiler [Typ löst…]

Postat: 16 nov 2010, 19:37
av ubot
Det är inte så svårt att anpassa mitt skript så att varje rad som ingår i DESCRIPTION-taggen kommer med men där det blir lika många DESCRIPTION-taggar som rader i ursprungliga DESCRIPTIO-taggen. Jag tycker att det hade varit snyggare att sätta taggar precis som taggarna är på originalfilen. Dvs "klona" taggarna rakt av utan att behöva införa massor av DESCRIPTION-taggar för att få med alla rader. Frågan när bara hur man gör det?

Edit:

Ok, snyggt är det inte men jag tror det fungerar:

Kod: Markera allt

metaflac -list-tags file.flac | grep -A 1000 "comment\[.*\]" | grep -B 1000 "comment\[.*\]" | sed 's/^[^\ ].*/\\x0A&/' | tr -d '\n' | sed 's/comment\[/\ncomment\[/g'
Vad tror du om att helt enkelt byta ut newline mot \x0A så att alla rader ligger på en rad men med \x0A mellan raderna? Fungerar det att sätta en tagg som är: DESCRIPTION="Hey Ho\x0ALets Go" som sedan blir två rader när metaflac -list visar taggarna?

Mitt skript blir då så här:

Kod: Markera allt

#!/bin/bash

# Execute by: ./flacscript.sh "/home/username/Music/" "/path/to/new/files/"

# What is the path to the old files?
path=$(ls -1 $1 | sed 's/[^\/]*$//')

# What is the path to the new files?
newpath=$(ls -1 $2 | sed 's/[^\/]$/&\//')

# Array of file names.
files=( $(ls -1 $1 | grep -o "[^/]*$" | sed 's/^/"/' | sed 's/$/"/' | tr '\r\t\n' ' ') )

# Loop each file one by one.
for file in ${files[@]}; do

# Date and time?
now=$(date +%Y-%m-%d-%H\:%M\:S)

# Copy old file to new file. Add date and time to new file name.
cp $path$file $newpath$file-$now.flac

# Get all tags from old file.
tags=$(metaflac --list $path$file | grep -A 1000 "comment\[.*\]" | grep -B 1000 "comment\[.*\]" | sed 's/^[^\ ].*/\\x0A&/' | tr -d '\n' | sed 's/comment\[/\ncomment\[/g')

# How many comments are there?
comments=$(metaflac --list $path$file | grep "^\ *comment\[.*\]:" | wc -l)

# Loop through each comment one by one.
for (( i=0; i<$comments; i++ )); do

# Add a new tag to the new file.
metaflac --set-tag="$(echo "$tags" | grep "comment\[$i\]:" | sed "s/comment\[$i\]: //")" $newpath$file-$now.flac

# End of loop 2.
done

# End of loop 1.
done

Re: Ändra filnamn på musikfiler [Typ löst…]

Postat: 16 nov 2010, 20:31
av Johnny Rosenberg
ubot skrev:Det är inte så svårt att anpassa mitt skript så att varje rad som ingår i DESCRIPTION-taggen kommer med men där det blir lika många DESCRIPTION-taggar som rader i ursprungliga DESCRIPTIO-taggen. Jag tycker att det hade varit snyggare att sätta taggar precis som taggarna är på originalfilen. Dvs "klona" taggarna rakt av utan att behöva införa massor av DESCRIPTION-taggar för att få med alla rader. Frågan när bara hur man gör det?

Edit:

Ok, snyggt är det inte men jag tror det fungerar:

Kod: Markera allt

metaflac -list-tags file.flac | grep -A 1000 "comment\[.*\]" | grep -B 1000 "comment\[.*\]" | sed 's/^[^\ ].*/\\x0A&/' | tr -d '\n' | sed 's/comment\[/\ncomment\[/g'
Vad tror du om att helt enkelt byta ut newline mot \x0A så att alla rader ligger på en rad men med \x0A mellan raderna? Fungerar det att sätta en tagg som är: DESCRIPTION="Hey Ho\x0ALets Go" som sedan blir två rader när metaflac -list visar taggarna?
Testade detta (fast i rättad form – det finns inget som heter ”-list-tags” men jag antog att du menade ”--list”) och resultatet blir att den nya filen får kommentarerna på en rad med tecknen \x0A mellan ”raderna”, så det blir alltså inga nya rader.

Har inte provkört skriptet dock, men det verkade innehålla samma rad, eller tittade jag för snabbt?

Men som sagt, jag är inte så säker på att jag verkligen vill ha flerradiga kommentarer längre, kanske det är bättre att ha flera kommentarer istället.

Re: Ändra filnamn på musikfiler [Typ löst…]

Postat: 16 nov 2010, 20:52
av ubot
Skriptet innehåller samma rad, svar ja. Jag testade också och ser att metaflac --list file.flac skriver ut taggarna på samma rad med \x0A mellan som du sa. :(
Tja, det är ju enkelt fixat att lägga till --set-tag=DESCIPTION="rad 1", --set-tag=DESCIPTION="rad 2" osv. Problemet är ju att man faktiskt manipulerar taggarna då. Du kommer få massor av comment[n] jämfört med originalet.

Re: Ändra filnamn på musikfiler [Typ löst…]

Postat: 16 nov 2010, 21:06
av Johnny Rosenberg
ubot skrev:Skriptet innehåller samma rad, svar ja. Jag testade också och ser att metaflac --list file.flac skriver ut taggarna på samma rad med \x0A mellan som du sa. :(
Tja, det är ju enkelt fixat att lägga till --set-tag=DESCIPTION="rad 1", --set-tag=DESCIPTION="rad 2" osv. Problemet är ju att man faktiskt manipulerar taggarna då. Du kommer få massor av comment[n] jämfört med originalet.
Fast jag tänkte i så fall göra om originalt från scratch (det är inte så många original än så länge) och köra med fler kommentarer konsekvent.
När det gäller den nya filen, om man har en gammal att plocka taggar ifrån, så kan man ju, för säkerhets skull först radera alla taggar i den nya filen, ifall man exempelvis skulle klanta sig i Audacity så att det kommer dit någon oönskad tagg eller så. Man kan ju i så fall använda ”--remove-all-tags” på den nya filen innan man gör något ytterligare.

Apropå datum på den gamla filen, så fick jag intrycket att ditt skript gav den dagens datum och tid, men det skulle nog vara mer önskvärt att använda filens skapad-datum och -tid istället. Jag finner det mer intressant att veta när filen skapades än när den blev ersatt av en ny…

Finns något enkelt sätt att få fram datum på en fil? Eller det är klart att det gör, men jag tänkte om du vet något när vi ändå håller på och skriver här fram och tillbaka…
Annars kan jag väl googla fram något själv, i och för sig…

Re: Ändra filnamn på musikfiler [Typ löst…]

Postat: 16 nov 2010, 21:06
av Konservburk
ubot skrev:

Kod: Markera allt

# Array of file names.
files=( $(ls -1 $1 | grep -o "[^/]*$" | sed 's/^/"/' | sed 's/$/"/' | tr '\r\t\n' ' ') )

# Loop each file one by one.
for file in ${files[@]}; do
Vad försöker du göra här? Vad händer om något filnamn innehåller t.ex. citat-tecken, tab-tecken eller nyrad?

Re: Ändra filnamn på musikfiler [Typ löst…]

Postat: 16 nov 2010, 21:22
av ubot
Det går garanterat att få fram datum med ls och någon flagga till kommandot. ls -l ger t.ex. output som innehåller datum för när filen skapades.

Så här t.ex:

Kod: Markera allt

now=$(ls -l file | grep -Eo "[[:digit:]]{4}\-[[:digit:]]{2}\-[[:digit:]]{2}"\ [[:digit:]]{2}\:[[:digit:]]{2})
Testa själv med kommandot ls -l file | grep -Eo "[[:digit:]]{4}\-[[:digit:]]{2}\-[[:digit:]]{2}"\ [[:digit:]]{2}\:[[:digit:]]{2} så ser du.

Re: Ändra filnamn på musikfiler [Typ löst…]

Postat: 16 nov 2010, 21:30
av ubot
Konservburk skrev:
ubot skrev:

Kod: Markera allt

# Array of file names.
files=( $(ls -1 $1 | grep -o "[^/]*$" | sed 's/^/"/' | sed 's/$/"/' | tr '\r\t\n' ' ') )

# Loop each file one by one.
for file in ${files[@]}; do
Vad försöker du göra här? Vad händer om något filnamn innehåller t.ex. citat-tecken, tab-tecken eller nyrad?
Ja, vad försöker jag göra där? :|

Jo, just det. Jag kör kommandot ls -1 för att få en fin lista med filnamn. grep -o "[/]*$" ska inte vara med. Det är fel (tror jag). Däremot så ska sed 's/^/"/' och sed 's/$/"/' vara med för att omsluta filnamnen med "-tecken så att varje filnamn blir ett element i arrayn. Annars så finns risken att varje ord i filnamnen kommer att bli ett element. Sista tr-kommandot gör att allt läggs på en rad så att slutresultatet blir: files=( "filnamn1" "filnamn2" "filnamn3" ... "filnamnX" ). Det har med hur bash hanterar arrays.

array_exempel1=( Hey Ho Lets Go ) är en array med 4 element. echo "${array_exempel1[0]}" ger Hey.
array_exempel2=( "Hey Ho Lets Go" ) är en array med 1 element. echo "${array_exempel2[0]}" ger Hey Ho Lets Go.

Det är därför jag omsluter filnamnen med "-tecken.

Om du har filnamn som innehåller "-tecken så måste man lägga till sed 's/\"/\\"/g' direkt efter ls -1 $1 så att filnamnens "-tecken inte förväxlas med citationstecknen som omsluter resp. filnamn. Jag vet inte hur man löser filnamn med nyrad i. Går det att ha filnamn med nyrad i? :|
När det gäller den nya filen, om man har en gammal att plocka taggar ifrån, så kan man ju, för säkerhets skull först radera alla taggar i den nya filen, ifall man exempelvis skulle klanta sig i Audacity så att det kommer dit någon oönskad tagg eller så. Man kan ju i så fall använda ”--remove-all-tags” på den nya filen innan man gör något ytterligare.
Det är enkelt fixat. Då kör man bara metaflac --remove-all-tags på den nya filen så hoppas jag att metaflac gör jobbet som det står i man metaflac.

Re: Ändra filnamn på musikfiler [Typ löst…]

Postat: 16 nov 2010, 22:53
av Konservburk
ubot skrev:Jag kör kommandot ls -1 för att få en fin lista med filnamn.
http://mywiki.wooledge.org/ParsingLs
ubot skrev:Däremot så ska sed 's/^/"/' och sed 's/$/"/' vara med för att omsluta filnamnen med "-tecken så att varje filnamn blir ett element i arrayn. Annars så finns risken att varje ord i filnamnen kommer att bli ett element.
Men det blir just så att varje ord blir ett element nu eftersom dina "-tecknen blir en del av själva strängen. Där du vill ha ett element foo bar kommer du att få två element, först "foo och sedan bar".
ubot skrev:Sista tr-kommandot gör att allt läggs på en rad så att slutresultatet blir: files=( "filnamn1" "filnamn2" "filnamn3" ... "filnamnX" ). Det har med hur bash hanterar arrays.
Men du ersätter ju även tecken i själva filnamnen, inte bara mellan dem. Och bash klarar dessutom av att skapa arrayer med nyrader som elementavdelare:

Kod: Markera allt

files=(
"filnamn1"
"filnamn2"
"filnamn3"
...
"filnamnX"
)
ubot skrev:array_exempel1=( Hey Ho Lets Go ) är en array med 4 element. echo "${array_exempel1[0]}" ger Hey.
array_exempel2=( "Hey Ho Lets Go" ) är en array med 1 element. echo "${array_exempel2[0]}" ger Hey Ho Lets Go.
array_exempel3=( $(echo Hey Ho Lets Go | sed 's/^/"/' | sed 's/$/"/') ) är en array med 4 element och echo "${array_exempel3[0]}" ger "Hej
ubot skrev:Om du har filnamn som innehåller "-tecken så måste man lägga till sed 's/\"/\\"/g' direkt efter ls -1 $1 så att filnamnens "-tecken inte förväxlas med citationstecknen som omsluter resp. filnamn. Jag vet inte hur man löser filnamn med nyrad i. Går det att ha filnamn med nyrad i? :|
Filnamn kan innehålla precis vilka tecken som helst utom / och nolltecken, och är det en fullständing sökväg så finns ju även / med. Men för att komma till hur du bör göra för att dina skript ska fungera oavsett vilka tecken som råkar finnas i filnamnen. Om du vill ha en array med filnamn så skapar du den så här:

Kod: Markera allt

files=(/sökväg/*)
Eller utan sökväg om du redan står i rätt katalog. Ska du bara ha en array med filnamn för att kunna loopa över filerna så behöver du egentligen ingen array till att börja med. Då räcker det att loopa direkt så här:

Kod: Markera allt

for file in /sökväg/*; do
Gör du på något av de här sätten så fungerar det oavsett vilka tecken som finns i filnamnen, men bara om du du har "-tecken runt variabeln när du använder den.

Re: Ändra filnamn på musikfiler [Typ löst…]

Postat: 17 nov 2010, 08:47
av ubot
Konservburk skrev:
ubot skrev:Jag kör kommandot ls -1 för att få en fin lista med filnamn.
http://mywiki.wooledge.org/ParsingLs
ubot skrev:Däremot så ska sed 's/^/"/' och sed 's/$/"/' vara med för att omsluta filnamnen med "-tecken så att varje filnamn blir ett element i arrayn. Annars så finns risken att varje ord i filnamnen kommer att bli ett element.
Men det blir just så att varje ord blir ett element nu eftersom dina "-tecknen blir en del av själva strängen. Där du vill ha ett element foo bar kommer du att få två element, först "foo och sedan bar".
ubot skrev:Sista tr-kommandot gör att allt läggs på en rad så att slutresultatet blir: files=( "filnamn1" "filnamn2" "filnamn3" ... "filnamnX" ). Det har med hur bash hanterar arrays.
Men du ersätter ju även tecken i själva filnamnen, inte bara mellan dem. Och bash klarar dessutom av att skapa arrayer med nyrader som elementavdelare:

Kod: Markera allt

files=(
"filnamn1"
"filnamn2"
"filnamn3"
...
"filnamnX"
)
ubot skrev:array_exempel1=( Hey Ho Lets Go ) är en array med 4 element. echo "${array_exempel1[0]}" ger Hey.
array_exempel2=( "Hey Ho Lets Go" ) är en array med 1 element. echo "${array_exempel2[0]}" ger Hey Ho Lets Go.
array_exempel3=( $(echo Hey Ho Lets Go | sed 's/^/"/' | sed 's/$/"/') ) är en array med 4 element och echo "${array_exempel3[0]}" ger "Hej
ubot skrev:Om du har filnamn som innehåller "-tecken så måste man lägga till sed 's/\"/\\"/g' direkt efter ls -1 $1 så att filnamnens "-tecken inte förväxlas med citationstecknen som omsluter resp. filnamn. Jag vet inte hur man löser filnamn med nyrad i. Går det att ha filnamn med nyrad i? :|
Filnamn kan innehålla precis vilka tecken som helst utom / och nolltecken, och är det en fullständing sökväg så finns ju även / med. Men för att komma till hur du bör göra för att dina skript ska fungera oavsett vilka tecken som råkar finnas i filnamnen. Om du vill ha en array med filnamn så skapar du den så här:

Kod: Markera allt

files=(/sökväg/*)
Eller utan sökväg om du redan står i rätt katalog. Ska du bara ha en array med filnamn för att kunna loopa över filerna så behöver du egentligen ingen array till att börja med. Då räcker det att loopa direkt så här:

Kod: Markera allt

for file in /sökväg/*; do
Gör du på något av de här sätten så fungerar det oavsett vilka tecken som finns i filnamnen, men bara om du du har "-tecken runt variabeln när du använder den.
Ok, tack för infon och länken. Jag har bara använt ls för att lista filer jag har skapat själv förut och då har jag haft full kontroll på namngivningen varför problemet aldrig har uppstått. Det är klart att man får hitta på en annan lösning eftersom skriptet inte ska fela bara för att filnamnet har ny rad osv. Det räcker med att loopa filerna direkt från sökvägen som du visade.

Det här duger nog bra:

Kod: Markera allt

for file in "$path"*; do
Och mitt skript ser nu ut så här:

Kod: Markera allt

#!/bin/bash

# Execute by: ./flacscript.sh "/home/username/Music/" "/path/to/new/files/"

# What is the path to the old files?
path=$(echo "$1" | sed 's/[^\/]$/&\//')

# What is the path to the new files?
newpath=$(echo "$2" | sed 's/[^\/]$/&\//')

# Loop each file one by one.
for file in "$path"*; do

# Date and time?
now=date-from-old-file

# Copy old file to new file. Add date and time to new file name.
cp $path$file $newpath$file-$now.flac

# Get all tags from old file.
tags=$(metaflac --list $path$file | grep -A 1000 "comment\[.*\]" | grep -B 1000 "comment\[.*\]" | sed 's/^[^\ ].*/\\x0A&/' | tr -d '\n' | sed 's/comment\[/\ncomment\[/g')

# How many comments are there?
comments=$(metaflac --list $path$file | grep "^\ *comment\[.*\]:" | wc -l)

# Loop through each comment one by one.
for (( i=0; i<$comments; i++ )); do

# Add a new tag to the new file.
metaflac --set-tag="$(echo "$tags" | grep "comment\[$i\]:" | sed "s/comment\[$i\]: //")" $newpath$file-$now.flac

# End of loop 2.
done

# End of loop 1.
done
Den här koden förutsätter säkert att sökvägen inte innehåller nyrad eller något men någon måtta får det vara på eländet. :) Det behövs lite kontrollfunktioner för att dubbelkolla att det är en flac-fil m.m men det som är viktigast nu är att alla taggar kommer med oavsett om taggarna står på flera rader i en comment[n]:.

Re: Ändra filnamn på musikfiler [Typ löst…]

Postat: 03 dec 2010, 11:35
av ubot
Hörredu Johnny, ta en titt på programmet gprename: http://gprename.sourceforge.net/screenshot.php

Det finns i Ubuntus förråd och ser ut att göra mycket av det som du är ute efter. Jag vet inte om det är till någon hjälp men tänkte tips om det iaf så du har sett det.

Det finns även ett program som heter pyrenamer: http://www.infinicode.org/code/pyrenamer/
Programmet finns också i Ubuntus förråd.

arename ser också lovande ut:
Package: arename
State: not installed
Version: 3.1-1
Priority: optional
Section: universe/sound
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Uncompressed Size: 193k
Depends: perl, libreadonly-perl, libmp3-tag-perl, libogg-vorbis-header-perl, libaudio-flac-header-perl
Description: automatic audio file renaming
arename is a tool that is able to rename audio files by looking at a file's tagging information. It uses this information to
assemble a consistent destination file name. The user can define the format of the destination filename by the use of
template strings.
Homepage: http://ft.bewatermyfriend.org/comp/arename.html

Re: Ändra filnamn på musikfiler [Typ löst…]

Postat: 20 dec 2010, 00:20
av ubot
När vi ändå är inne på id3-taggar. Jag snubblade över det här programmet som skapar ett "filsystem" baserat på id3-taggarna: http://www.webupd8.org/2010/12/id3fs-cr ... music.html