ein wunsch an den autor fuer die version 7.5
Moderators: Hacker, Stefan2, white
Ich würde es algorithmisch folgendermaßen lösen:
Pfadcheck()
1. Aus gegebenen Pfad Verzeichnispfad extrahieren und in Variable "neuerPfad" speichern.
2. Wenn Variable alterPfad leer ist oder neuerPad ungleich alterPfad dann berechneNeu(). Ansonsten weiter mit Wertrückgabe().
BerechneNeu()
1. Setze alterPfad auf neuerPfad
2. Ermittle albumTag von aktueller Datei.
3. Setze Variable albumTagGleich auf wahr.
4. Ermittle albumtag für alle anderen Dateien im Verzeichnis solange bis ein unterschiedliche gefunden wurde. Sollte ein abweichendes tag gefunden worden sein, so wird "albumTagGleich" auf falsch gesetzt.
5. Speichere Ergebnis der Berechnung in Variable albumTagGleich.
6. Ergebnis des Vergleichs zurückgeben.
Wertrückgabe()
1. Wert von albumTagGleich zurückgeben.
Pfadcheck()
1. Aus gegebenen Pfad Verzeichnispfad extrahieren und in Variable "neuerPfad" speichern.
2. Wenn Variable alterPfad leer ist oder neuerPad ungleich alterPfad dann berechneNeu(). Ansonsten weiter mit Wertrückgabe().
BerechneNeu()
1. Setze alterPfad auf neuerPfad
2. Ermittle albumTag von aktueller Datei.
3. Setze Variable albumTagGleich auf wahr.
4. Ermittle albumtag für alle anderen Dateien im Verzeichnis solange bis ein unterschiedliche gefunden wurde. Sollte ein abweichendes tag gefunden worden sein, so wird "albumTagGleich" auf falsch gesetzt.
5. Speichere Ergebnis der Berechnung in Variable albumTagGleich.
6. Ergebnis des Vergleichs zurückgeben.
Wertrückgabe()
1. Wert von albumTagGleich zurückgeben.
-
- Member
- Posts: 149
- Joined: 2008-10-14, 17:12 UTC
-
- Member
- Posts: 149
- Joined: 2008-10-14, 17:12 UTC
hier mal der leicht verkuerzte quellcode (an dem haperts ja nicht...
):

Code: Select all
#include "stdafx.h"
#include "ContentPlugin mp3 Album-Tag.h"
#include "wdx.h"
#include "PathInfo.h"
#include "MP3ID3.h"
#define fieldcount 5
char *fieldnames[fieldcount] =
{"Album",
"Artist",
"Title",
"AlbumTagIsConsistent",
"Tags"};
int fieldtypes[fieldcount] =
{ft_string,
ft_string,
ft_string,
ft_boolean,
ft_string};
char *fieldunits_and_multiplechoicestrings[fieldcount] =
{"",
"",
"",
"",
""};
char g_cLastDirUsed[_MAX_PATH] = ":";
bool g_bGetValueAborted = false;
bool g_bAlbumTagIsConsistent = true;
CMapStringToPtr g_mp3FileMap;
void FreeMp3FileMap()
{
// hier wird die liste geleert
}
int __stdcall ContentGetDetectString(char *DetectString, int maxlen)
{
// hier wird eben der detect-string EXT="MP3" zurueck gegeben
}
int __stdcall ContentGetSupportedField(int FieldIndex, char *FieldName, char *Units, int maxlen)
{
// hier werden vom TC die vom plugin angebotenen felder abgefragt
}
int __stdcall ContentGetValue(char *FileName, int FieldIndex, int UnitIndex, void *FieldValue, int maxlen, int flags)
{
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
DWORD dwError;
CString strSearchPath;
CString strSearchMask;
CString strFirstAlbumName;
CMP3Info *pmp3Info = NULL;
CMP3ID3 mp3ID3;
int iNumFilesInList = 0;
CString strTmp;
g_bGetValueAborted = false;
DWORD attrib;
attrib = GetFileAttributes(FileName);
if(attrib != INVALID_FILE_ATTRIBUTES && (attrib & FILE_ATTRIBUTE_DIRECTORY))
return ft_nosuchfield;
if(g_cLastDirUsed[0] == 0)
{
g_bAlbumTagIsConsistent = true;
FreeMp3FileMap();
strSearchPath = PathInfo::getDirectory(FileName);
strSearchMask = strSearchPath + "*.mp3";
strcpy_s(g_cLastDirUsed, sizeof(g_cLastDirUsed), strSearchPath);
hFind = FindFirstFile(strSearchMask, &FindFileData);
if(hFind == INVALID_HANDLE_VALUE)
return ft_fileerror;
do
{
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
continue;
if(g_mp3FileMap.Lookup(FindFileData.cFileName, (void *&)pmp3Info))
{
// dieser fall duerfte nie auftreten. ein dateiname mehr als einmal pro verzeichnis?!?
pmp3Info = NULL;
}
else
{
pmp3Info = new CMP3Info();
if(pmp3Info)
{
CString strCompleteFilepath = strSearchPath + FindFileData.cFileName;
*pmp3Info = mp3ID3.getMP3Info((LPCTSTR)strCompleteFilepath);
strTmp = FindFileData.cFileName;
g_mp3FileMap[strTmp.MakeLower()] = pmp3Info;
if(iNumFilesInList++ == 0)
{
strFirstAlbumName = pmp3Info->getAlbum().c_str();
strFirstAlbumName.Trim();
if(strFirstAlbumName == "")
g_bAlbumTagIsConsistent = false;
}
else
if(g_bAlbumTagIsConsistent &&
_stricmp(strFirstAlbumName, (const char *)pmp3Info->getAlbum().c_str()))
g_bAlbumTagIsConsistent = false;
pmp3Info = NULL;
}
}
} while(FindNextFile(hFind, &FindFileData));
dwError = GetLastError();
FindClose(hFind);
if(dwError != ERROR_NO_MORE_FILES)
return ft_fileerror;
}
BOOL bFound = FALSE;
strTmp = PathInfo::getName(FileName);
strTmp.MakeLower();
bFound = g_mp3FileMap.Lookup(strTmp, (void *&)pmp3Info);
switch(FieldIndex)
{
case 0: // "Album"
if(bFound)
strcpy_s((char*)FieldValue, maxlen - 1, (const char *)pmp3Info->getAlbum().c_str());
else
strcpy_s((char*)FieldValue, maxlen - 1, "***Error***");
break;
case 1: // "Artist"
if(bFound)
strcpy_s((char*)FieldValue, maxlen - 1, (const char *)pmp3Info->getArtist().c_str());
else
strcpy_s((char*)FieldValue, maxlen - 1, "***Error***");
break;
case 2: // "Title"
if(bFound)
strcpy_s((char*)FieldValue, maxlen - 1, (const char *)pmp3Info->getTitle().c_str());
else
strcpy_s((char*)FieldValue, maxlen - 1, "***Error***");
break;
case 3: // "AlbumTagIsConsistent"
if(_stricmp(g_cLastDirUsed, PathInfo::getDirectory(FileName)))
{
*(int *)FieldValue = true;
g_cLastDirUsed[0] = ':';
}
else
*(int *)FieldValue = g_bAlbumTagIsConsistent;
break;
case 4: // "Tags"
if(bFound)
if(pmp3Info->getNumID3v1Tags())
if(pmp3Info->getNumID3v2Tags())
strcpy_s((char*)FieldValue, maxlen - 1, "v1&2");
else
strcpy_s((char*)FieldValue, maxlen - 1, "v1");
else
if(pmp3Info->getNumID3v2Tags())
strcpy_s((char*)FieldValue, maxlen - 1, "v2");
else
strcpy_s((char*)FieldValue, maxlen - 1, "");
else
strcpy_s((char*)FieldValue, maxlen - 1, "?");
break;
default:
return ft_nosuchfield;
}
return fieldtypes[FieldIndex]; // very important!
}
void __stdcall ContentSendStateInformation(int state, char *path)
{
if(state == contst_readnewdir)
g_cLastDirUsed[0] = 0;
}
HolgerK wrote:Kann das Plugin nicht selber lokal festhalten, in welchem Verzeichnis die letzte Abfrage erfolgte?
Die erste Abfrage zu einer Datei aus einem neuen Verzeichnis könnte dann intern im Plugin die Gruppenüberprüfung aller Dateien des neuen Verzeichnisses antriggern.
Lefteous wrote:Pfadcheck()
1. Aus gegebenen Pfad Verzeichnispfad extrahieren und in Variable "neuerPfad" speichern.
2. Wenn Variable alterPfad leer ist oder neuerPad ungleich alterPfad dann berechneNeu(). Ansonsten weiter mit Wertrückgabe().
Sehe ich nicht.JustAnotherTCUser wrote:genau _so_ hab ichs implementiert!
Der Trigger wird nur von aussen angestossen über
Code: Select all
void __stdcall ContentSendStateInformation(int state, char *path)
{
if(state == contst_readnewdir)
g_cLastDirUsed[0] = 0;
}
Holger
-
- Member
- Posts: 149
- Joined: 2008-10-14, 17:12 UTC
dann verfolge mal die variable g_cLastDirUsed.HolgerK wrote: Sehe ich nicht.
dann wirst du genau diese vorgehensweise erkennen.
warum hab ich das gefuehl dass hier nur "auseinander genommen" wird und um den einfachen wunsch immer drumrum geredet wird?!? es _geht_ aktuell nur mit den von mir beschriebenen einschraenkungen!
gruss
nachtrag (ich editiere bwusst nicht an obigem rum):
da liege ich falsch! in diesem code wird tatsaechlich nur dann getriggert wenn TC es mitteilt!
ich hatte es mal so. aber das hat eben auch den bereits frueher beschriebenen haken, dass es nur zuverlaessig funktioniert, wenn in 'allen' besuchten verzeichnissen mindestens _ein_ mp3-file liegt. und das ist eben nicht so.
Last edited by JustAnotherTCUser on 2009-02-06, 22:57 UTC, edited 1 time in total.
Genau das habe ich getan.
Gruß
Holger
if(g_cLastDirUsed[0] == 0)
char g_cLastDirUsed[_MAX_PATH] = ":";
case 3: // "AlbumTagIsConsistent"
if(_stricmp(g_cLastDirUsed, PathInfo::getDirectory(FileName)))
{
*(int *)FieldValue = true;
g_cLastDirUsed[0] = ':';
}
else
*(int *)FieldValue = g_bAlbumTagIsConsistent;
Gruß
Holger
-
- Member
- Posts: 149
- Joined: 2008-10-14, 17:12 UTC
Das Problem lag in deinem Code wahrscheinlich darin begraben, dass du erst bei der zweiten Abfrage die Konsitenz erneut überprüfst.JustAnotherTCUser wrote:ich hatte es mal so. aber das hat eben auch den bereits frueher beschriebenen haken, dass es nur zuverlaessig funktioniert, wenn in 'allen' besuchten verzeichnissen mindestens _ein_ mp3-file liegt. und das ist eben nicht so.
Muss bereits bei der ersten Abfrage vorif(_stricmp(g_cLastDirUsed, PathInfo::getDirectory(FileName)))
{
g_cLastDirUsed[0] = 0;
}
erfolgen.if(g_cLastDirUsed[0] == 0)
Gruss
Holger
Mal ein ganz anderer Punkt:
Die Visualiserung ob ALLE Mp3-Tags eines Verzeichnisses einheitlich sind (oder nicht), ist eigentlich ein Eigenschaft des Verzeichnisses.
Es lohnt sich also eher das Verzeichnis farblich hervorzuheben, das uneinheitliche Tags enthält.
Sobald der Anwender in das Verzeichnis wechselt, ist er eher daran interessiert zu sehen welche Dateien die mehrheitlich identische Taginformation enthalten,
und welche unterschiedliche Taginformation haben.
Es sei eine von 200 MP3 falsch getaggt.
Viel Spass beim manuellen Suchen.
Genau um so etwas zu erleichtern sind Content Plugins hilfreich (z.B. in der <Alt+F7>Suche).
Gruss
Holger
Die Visualiserung ob ALLE Mp3-Tags eines Verzeichnisses einheitlich sind (oder nicht), ist eigentlich ein Eigenschaft des Verzeichnisses.
Es lohnt sich also eher das Verzeichnis farblich hervorzuheben, das uneinheitliche Tags enthält.
Sobald der Anwender in das Verzeichnis wechselt, ist er eher daran interessiert zu sehen welche Dateien die mehrheitlich identische Taginformation enthalten,
und welche unterschiedliche Taginformation haben.
Es sei eine von 200 MP3 falsch getaggt.
Viel Spass beim manuellen Suchen.
Genau um so etwas zu erleichtern sind Content Plugins hilfreich (z.B. in der <Alt+F7>Suche).
Gruss
Holger
Last edited by HolgerK on 2009-02-06, 23:31 UTC, edited 1 time in total.
-
- Member
- Posts: 149
- Joined: 2008-10-14, 17:12 UTC
ich weiss was du meinst. das ist schon richtig wie du das meinst!
schade dass ich zu hause keinen sourcesafe verwende!
es _war_ mal wie beschrieben implementiert (sonst waer das mit der verzeichnis-merkerei ja _ueberhaupt_ nicht drin). nur funktioniert es eben so nicht zuverlaessig. die gruende sind bereits beschrieben und hab mehrfach darauf hingewiesen (und wurde stur ignoriert).
es waer ja auch langweilig darauf einzugehen...
von der moeglichkeit verzeichnisabhaengige aktionen auszuloesen ganz zu schweigen!
lass gut sein. ich werd mich weiter mit der ahk-kruecke rumschlagen. ahk redet wenigstens nicht aus prinzip dagegen und ignoriert nicht was ich schreibe.
schade dass ich zu hause keinen sourcesafe verwende!
es _war_ mal wie beschrieben implementiert (sonst waer das mit der verzeichnis-merkerei ja _ueberhaupt_ nicht drin). nur funktioniert es eben so nicht zuverlaessig. die gruende sind bereits beschrieben und hab mehrfach darauf hingewiesen (und wurde stur ignoriert).
es waer ja auch langweilig darauf einzugehen...
von der moeglichkeit verzeichnisabhaengige aktionen auszuloesen ganz zu schweigen!
lass gut sein. ich werd mich weiter mit der ahk-kruecke rumschlagen. ahk redet wenigstens nicht aus prinzip dagegen und ignoriert nicht was ich schreibe.
-
- Member
- Posts: 149
- Joined: 2008-10-14, 17:12 UTC
die anwendung fuer dieses plugin hatte ich bereits beschrieben.
ob ein oder mehrere tags unterschiedlich sind ist mir egal. wenn auch nur einer "ausschert" tagge ich alle files eines verzeichnisses. dann sind automatisch alle gleich
das mit derfarblichen kennzeichnung eine ebene hoeher waere besser, ja.
aber das macht eine integration in den TC einiges komplizierter. es wuerde mir ja schon reichen wenn es so ginge wie ich es mir vorstellte. wobei mir die verzeichnisabhaengige benutzung von ansichten usw. noch lieber waere.
den das mit den mp3's kann ich auch ueber ein eigenstaendiges programm/script loesen. im TC waers halt schoener... eins der wenigen dinge die nicht recht mit dem TC funktionieren. schade.
ob ein oder mehrere tags unterschiedlich sind ist mir egal. wenn auch nur einer "ausschert" tagge ich alle files eines verzeichnisses. dann sind automatisch alle gleich

das mit derfarblichen kennzeichnung eine ebene hoeher waere besser, ja.
aber das macht eine integration in den TC einiges komplizierter. es wuerde mir ja schon reichen wenn es so ginge wie ich es mir vorstellte. wobei mir die verzeichnisabhaengige benutzung von ansichten usw. noch lieber waere.
den das mit den mp3's kann ich auch ueber ein eigenstaendiges programm/script loesen. im TC waers halt schoener... eins der wenigen dinge die nicht recht mit dem TC funktionieren. schade.