ein wunsch an den autor fuer die version 7.5

German support forum

Moderators: Hacker, Stefan2, white

User avatar
Lefteous
Power Member
Power Member
Posts: 9537
Joined: 2003-02-09, 01:18 UTC
Location: Germany
Contact:

Post by *Lefteous »

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.
JustAnotherTCUser
Member
Member
Posts: 149
Joined: 2008-10-14, 17:12 UTC

Post by *JustAnotherTCUser »

genau _so_ hab ichs implementiert! :-)

ich denk das ist das optimum welches man unter den gegebenen umstaenden rausholen kann.

nur funktioniert es nicht wirklich gut, da ich nicht jeden verzeichniswechsel (pfadcheck) mitbekomme. und genau daran haperts!
JustAnotherTCUser
Member
Member
Posts: 149
Joined: 2008-10-14, 17:12 UTC

Post by *JustAnotherTCUser »

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;
}
User avatar
HolgerK
Power Member
Power Member
Posts: 5411
Joined: 2006-01-26, 22:15 UTC
Location: Europe, Aachen

Post by *HolgerK »

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().
JustAnotherTCUser wrote:genau _so_ hab ichs implementiert!
Sehe ich nicht.
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;
} 
Gruß
Holger
JustAnotherTCUser
Member
Member
Posts: 149
Joined: 2008-10-14, 17:12 UTC

Post by *JustAnotherTCUser »

HolgerK wrote: Sehe ich nicht.
dann verfolge mal die variable g_cLastDirUsed.

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.
User avatar
HolgerK
Power Member
Power Member
Posts: 5411
Joined: 2006-01-26, 22:15 UTC
Location: Europe, Aachen

Post by *HolgerK »

Genau das habe ich getan.
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
JustAnotherTCUser
Member
Member
Posts: 149
Joined: 2008-10-14, 17:12 UTC

Post by *JustAnotherTCUser »

siehe meinen nachtrag im letzten posting ;)

du warst schneller als ich :-)

ich hab das nach meiner pizza nochmal genauer angesehen.
User avatar
HolgerK
Power Member
Power Member
Posts: 5411
Joined: 2006-01-26, 22:15 UTC
Location: Europe, Aachen

Post by *HolgerK »

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.
Das Problem lag in deinem Code wahrscheinlich darin begraben, dass du erst bei der zweiten Abfrage die Konsitenz erneut überprüfst.
if(_stricmp(g_cLastDirUsed, PathInfo::getDirectory(FileName)))
{
g_cLastDirUsed[0] = 0;
}
Muss bereits bei der ersten Abfrage vor
if(g_cLastDirUsed[0] == 0)
erfolgen.

Gruss
Holger
User avatar
HolgerK
Power Member
Power Member
Posts: 5411
Joined: 2006-01-26, 22:15 UTC
Location: Europe, Aachen

Post by *HolgerK »

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
Last edited by HolgerK on 2009-02-06, 23:31 UTC, edited 1 time in total.
JustAnotherTCUser
Member
Member
Posts: 149
Joined: 2008-10-14, 17:12 UTC

Post by *JustAnotherTCUser »

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.
JustAnotherTCUser
Member
Member
Posts: 149
Joined: 2008-10-14, 17:12 UTC

Post by *JustAnotherTCUser »

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.
User avatar
HolgerK
Power Member
Power Member
Posts: 5411
Joined: 2006-01-26, 22:15 UTC
Location: Europe, Aachen

Post by *HolgerK »

Hätte nie gedacht, das es soweit kommt :cry:
Aus der Ferne vernehme ich ein leises *plonk*
Ich lass es gut sein.

Tschau
Holger
Post Reply