You are not logged in.
I am always looking at my little mp3 player screen not only to see what track I am on, but am I on track 3 of 4, or track 3 of 18 tracks. "nn-NN Audio_Book_Title.mp3"
Serializer sets track "nn", but right now I have to change a rule to set the total number of tracks "NN" for each book. No big deal but I have over 400 books.
I have looked, can't find a way (or meta tag) for a rule to get/determine mp3 file count for the book/folder. Could this be possible in the Pascal rule?
Sorry if my question is vague, so many all nighters, my eye's are crossing.
Fathom
PS.
ReNamer is wonderful. I love the power and friendly too, rare to have both to such degree!
Offline
Hi Fathom!
Can you explain "get/determine mp3 file count for the book/folder"? What do you mean by that "mp3 file count"? Is it something that is stored in the filename, or in the ID3 tags of your MP3's? If so, you can probably access them via ReNamer's ID3_* meta tags, for example: ID3_TrackNo. More details/examples would be helpful...
Offline
I was afraid I was being vague.
I have audio books in folders of 8 to 30 tracks each. What I am trying to do is rename files for each book in the same manner pages of a document can be named; page 1 of 12, page 2 of 12, page 3 of 12, ...
For example, from:
Shelters of Stone-Part 1.mp3
Shelters of Stone-Part 2.mp3
Shelters of Stone-Part 3.mp3
...
Shelters of Stone-Part 12.mp3
To:
01-12 Shelters of Stone.mp3
02-12 Shelters of Stone.mp3
03-12 Shelters of Stone.mp3
...
12-12 Shelters of Stone.mp3
I have a rule set to do all this for files in any given audio book folder except for determining the total number of tracks for that book, in this case "12" the total number of tracks for that book, which I have to set manually for each book.
ID3_TrackNo provides the specific track, but there is no tag for "total number of tracks" or "number of last track". I use "Serialize" so I can pad.
I have been looking into Pascal tutorials. The only programming I have done since I retired 1992 are macro scripts. Before that was 25+ years of ASM and state machine design. So I'm feeling stupid.
Thanks for the response and sorry for the confusion,
Scott
ps.
this is what I have to generically handle most circumstances:
Last edited by Fathom (2007-05-10 23:02)
Offline
Ahh.. Ok, now I see the problem
You said that you have your audio books in folders, right? Does that mean that in each folder there is always only 1 audio book? So, the amount of mp3's in each folder would be the same as a number of track in the book? If so - PascalScript can do it! We can scan the folder of each file for amount of mp3's in it, and use that as a total number of tracks. Will that work for you?
Yee, there is quiet a difference between Pascal and ASM
Offline
Yes, yes, and yes. You have the idea even better than I explained it, since there are none mp3 files I don't want to count (such as folder.jpg).
I been trying to crash course pascal, I have used it before on a novice level many, many years ago, but I'm slow.
Your Pascal tools in ReNamer (prefab scripts, help, try to compile) seem to be a great resource. I thought I would study your prefab scripts in ReNamer as an initial tutorial.
Fathom
Offline
This will insert as prefix the number of mp3's from folder, here is the code:
var
Folder: WideString;
Files: TStringsArray;
begin
SetLength(Files, 0);
Folder := WideExtractFileDir(FilePath);
WideScanDirForFiles(Folder, Files,
False, False, False, '*.mp3');
FileName := IntToStr(Length(Files)) + FileName;
end.
P.S. There is only one problem - for each file there will be a scan of a folder. Even tho Windows caches these types of repeated requests, it might get a bit slow when processing 100's of files.
Last edited by den4b (2007-05-11 00:32)
Offline
I put your script to where I had my second rule (pictured above) and It works perfect.
Thanks so much. I will study it, and the other scripts in this forum. I have hundreds of book folders to process so this is a real help!!! I just started using ReNamer, I really like well written powerful intuitive programs like this! It is a gem.
I am still discovering great little tools and tricks with it.
Thanks again for your time and patience,
Fathom
Offline
Glad to be of help! Happy renaming
Offline
Thanks den4b,
You got me started,
The goal was to standardize audio track names, and to prefix them with [current track]-[total tracks], without renaming text and image files within same folder, and to work recursively. One mistake serializing audio book tracks would be a nightmare.
To be honest I don't know squat. All I know of compiled languages I picked up in this forum past couple of days. den4b got me started with first script and I hacked the hell out of "serialize duplicates" until things started to make sense and something worked. I thought the forum could use one more example since I couldn't find any tutorials in PascalScript.
Goals and Problems Resolved:
1. determine total number of tracks in audio book folder (that also contain text and image files) -thanks den4b
2. correctly serialize tagless mp3 tracks in folders and sub folders (that also contain text and image files)
3. rename mp3 files only, correctly prefixed with [CURRENT TRACK]--[TOTAL TRACKS]
4. cleanup and normalize various naming schemes, especially for small MP3 player screen viewing
5. rename these files from tree level in one pass (recursive)
6. be able to re-process the same tree without effecting files already renamed
X. The only complication is if ReNamer column sort is reverse natural order, that would reverse serial track order. Use "Name Digit" column for sorting. (select via context menu on column name)
An audio book with tracks out of sequence is a nightmare.
Tested with a directory tree four folders deep, four folders wide at base, each folder unique, containing various naming schemes (10 folders, 130 files).
Books have any number of title schemes that I would like to standardize:
original renamed
The Quiet Night track 1.mp3 01-12 Quiet Night.mp3
Silver Quest-Part3.mp3 03-42 Silver Quest.mp3
01 The Longest Day.mp3 01-18 Longest Day.mp3
track002 - Day and Night.mp3 03-09 Day and Night.mp3
Dog Days 1.mp3 01-07 Dog Days.mp3
Dog Days 2.mp3 02-07 Dog Days.mp3
... ...
Dog Days 07.mp3 07-07 Dog Days.mp3
The numbers represent: [CURRENT TRACK OF BOOK]---[TOTAL TRACKS IN BOOK]. Track numbers are prefixed so to always be visible on small mp3 player screens.
Total number of tracks in audio book:
//-------- TOTAL TRACKS <mp3> -------//
const
AudioExt = '.mp3';
var
AudioFiles: TStringsArray;
AudioTrack, CurrentFolder: WideString;
begin
AudioTrack := WideChangeFileExt(FilePath, AudioExt);
if WideFileExists(AudioTrack) then
begin
SetLength(AudioFiles, 0);
CurrentFolder := WideExtractFileDir(FilePath);
WideScanDirForFiles(CurrentFolder, AudioFiles, False, False, False, '*.mp3');
if Length(AudioFiles) < 10 then
FileName := '0' + IntToStr(Length(AudioFiles)) + ' ' + FileName
else FileName := IntToStr(Length(AudioFiles)) + ' ' + FileName;
end;
end.
Current Track in audio book:
//--- CURRENT TRACK <mp3> ---//
{ CREATE ARRAY }
var
Files: TStringsArray;
procedure Add(const S: WideString);
begin
SetLength(Files, Length(Files)+1);
Files[Length(Files)-1] := S;
end;
{ PASS THRU MATCHING FILE NAMES }
var
I: Integer;
function Exists(const S: WideString): Boolean;
begin
Result := False;
for I:=0 to Length(Files)-1 do
if WideSameText(Files[i], S) then
begin
Result := True;
Break; {I'm not sure this needs to be here}
end;
end;
{ PAD PREP }
function PadNum(const Num, NewLength: Integer): string;
begin
Result := IntToStr(Num);
while Length(Result) < NewLength do
Result := '0'+Result;
end;
{ SERIALIZE <mp3> }
var
NewFileName: WideString;
Counter: Integer;
begin
Counter := 1;
NewFileName := FileName;
if WideExtractFileExt(FileName) = '.mp3' then
NewFileName := PadNum(Counter,2) + '-' + WideExtractBaseName(FileName) + WideExtractFileExt(FileName);
while Exists(NewFileName) do
begin
NewFileName := PadNum(Counter,2) + '-' + WideExtractBaseName(FileName) + WideExtractFileExt(FileName);
Counter := Counter + 1;
end;
FileName := NewFileName;
Add(FileName);
end.
I may eventually create script to add author prefix to audio book folders, using pascal to read authors name from synopsis text file within the folder, but I have already renamed all folders manually.
Audio book folders are named by author such: (Huxley) Doors of Perception
Fathom
Last edited by Fathom (2007-05-25 11:27)
Offline
It's good to see people "take off" on PascalScript like that!
You "TOTAL TRACKS" script looks fine, but there are few things about "CURRENT TRACK" script that you should know:
1) "var I: Integer;" is declared globally, that means anything can access/change that variable.
You should put it in the local declaration for the function that uses it, like that:
function Exists(const S: WideString): Boolean;
var I: Integer;
begin ...
2) "Break;" - it is there for optimization. Once you found an item in the list, you don't have to continue searching until you reach the end of the list, you can break the loop straight after you find the string/filename - and that's exactly what "Break" does.
3) "if WideExtractFileExt(FileName) = '.mp3' then" - two problems with it. First, extension ".MP3" not equals to ".mp3", because comparison is done in a case sensative manner. the proper way to do it will be: "if WideSameText('.mp3', WideExtractFileExt(FileName)) then". The second problem is the fact that if/else statement for only for the immediately following line of code. If you want the code to get executed ONLY for MP3's, you have to put everything after the "IF" statement into the "begin ... end", otherwise that if statement will not make any sense. Example:
if WideSameText('.mp3', WideExtractFileExt(FileName)) then
begin
NewFileName := PadNum(Counter,2) + '-' + WideExtractBaseName(FileName) + WideExtractFileExt(FileName);
while Exists(NewFileName) do
begin
NewFileName := PadNum(Counter,2) + '-' + WideExtractBaseName(FileName) + WideExtractFileExt(FileName);
Counter := Counter + 1;
end;
FileName := NewFileName;
Add(FileName);
end;
Also, "WideExtractBaseName(FileName) + WideExtractFileExt(FileName)" is probably the same as "FileName" on its own. By the way, what exactly are you trying to do with the "CURRENT TRACK" script? Serialize duplicated new names in the list? Or add a current track number?? Because if it a second one - it is really a bad way of doing it, because you could simply use Serialize rule.
PascalScript is eventually a Delphi/Pascal programming language, so if you are looking for sample examples or tutorials - type in Google: Delphi OR Pascal.
Last edited by den4b (2007-05-26 09:19)
Offline