aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Library/ml_local/ml_local.h
blob: b607607c2f45e2283c98ba92f0e0930d87b61ae7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
#ifndef ML_LOCAL_HEADER
#define ML_LOCAL_HEADER

#include <windows.h>
#include <commctrl.h>

#include <iostream>   // for std::wstring

#include "..\..\General\gen_ml/gaystring.h"
#include "..\..\General\gen_ml/config.h"

#include <map>
#include "../nde/nde_c.h"
#include <vector>

struct ExtendedFields
{
	const wchar_t *ispodcast;
	const wchar_t *podcastchannel;
	const wchar_t *podcastpubdate;
	const wchar_t *GracenoteFileID;
	const wchar_t *GracenoteExtData;
	const wchar_t *lossless;
	const wchar_t *codec;
	const wchar_t *director;
	const wchar_t *producer;
	const wchar_t *width;
	const wchar_t *height;
	const wchar_t *mimetype;
	const wchar_t *realsize;
	const wchar_t *dateadded;
	const wchar_t *cloud;
};
extern const ExtendedFields extended_fields;

extern const int NUM_EXTRA_COLSW;
extern const unsigned char extra_idsW[]; // defined in view_media.cpp
extern const wchar_t *extra_strsW[];

extern HCURSOR hDragNDropCursor;
wchar_t *getRecordExtendedItem_fast(const itemRecordW *item, const wchar_t *name);
void setRecordExtendedItem_fast(itemRecordW *item, const wchar_t *name, const wchar_t *value);

int OnLocalMediaItemClick(int action, int item, HWND parent);
int OnLocalMediaClick(int action, HWND parent);
BOOL IPC_HookExtInfo(INT_PTR param);
BOOL IPC_HookExtInfoW(INT_PTR param);
BOOL IPC_HookTitleInfo(INT_PTR param);

#include "../winamp/wa_ipc.h"


#define INT_ENTRY_MAX_NUM       20
#define INT_ENTRY_MAX_PATHSIZE  512
#define INT_ENTRY_MAX_TEXTSIZE  128

#define TREE_IMAGE_LOCAL_AUDIO				101
#define TREE_IMAGE_LOCAL_VIDEO				102
#define TREE_IMAGE_LOCAL_MOSTPLAYED			103
#define TREE_IMAGE_LOCAL_RECENTLYADDED		104
#define TREE_IMAGE_LOCAL_RECENTLYPLAYED		105
#define TREE_IMAGE_LOCAL_NEVERPLAYED		106
#define TREE_IMAGE_LOCAL_TOPRATED			107
#define TREE_IMAGE_LOCAL_PODCASTS			108
#define TREE_IMAGE_LOCAL_RECENTLYMODIFIED	109


#define MAINTABLE_ID_FILENAME			0
#define MAINTABLE_ID_TITLE				1
#define MAINTABLE_ID_ARTIST				2
#define MAINTABLE_ID_ALBUM				3
#define MAINTABLE_ID_YEAR				4
#define MAINTABLE_ID_GENRE				5
#define MAINTABLE_ID_COMMENT			6
#define MAINTABLE_ID_TRACKNB			7
#define MAINTABLE_ID_LENGTH				8  // in seconds
#define MAINTABLE_ID_TYPE				9  // 0=audio, 1=video
#define MAINTABLE_ID_LASTUPDTIME		10 // last time (seconds since 1970) of db update of this item
#define MAINTABLE_ID_LASTPLAY			11 // last time (seconds since 1970) of last play
#define MAINTABLE_ID_RATING				12
#define MAINTABLE_ID_GRACENOTE_ID		14 // OLD Gracenote ID's.  Don't use this anymore!!!
#define MAINTABLE_ID_PLAYCOUNT			15 // play count
#define MAINTABLE_ID_FILETIME			16 // file time
#define MAINTABLE_ID_FILESIZE			17 // file size, bytes (was kilobytes until 5.7)
#define MAINTABLE_ID_BITRATE			18 // file bitratea, kbps
#define MAINTABLE_ID_DISC				19 // disc #
#define MAINTABLE_ID_ALBUMARTIST		20 // album artist
#define MAINTABLE_ID_ALBUMGAIN			21 // album gain (replaygain)
#define MAINTABLE_ID_TRACKGAIN			22 // track gain (replaygain)
#define MAINTABLE_ID_PUBLISHER			23 // publisher (record label)
#define MAINTABLE_ID_COMPOSER			24 // composer
#define MAINTABLE_ID_BPM				25 // beats per minute (tempo)
#define MAINTABLE_ID_DISCS				26 // number of discs total
#define MAINTABLE_ID_TRACKS				27 // number of tracks total
#define MAINTABLE_ID_ISPODCAST			28
#define MAINTABLE_ID_PODCASTCHANNEL		29
#define MAINTABLE_ID_PODCASTPUBDATE		30
#define MAINTABLE_ID_GRACENOTEFILEID	31
#define MAINTABLE_ID_GRACENOTEEXTDATA	32
#define MAINTABLE_ID_LOSSLESS			33
#define MAINTABLE_ID_CATEGORY			34
#define MAINTABLE_ID_CODEC				35
#define MAINTABLE_ID_DIRECTOR			36
#define MAINTABLE_ID_PRODUCER			37
#define MAINTABLE_ID_WIDTH				38
#define MAINTABLE_ID_HEIGHT				39
#define MAINTABLE_ID_MIMETYPE			40
#define MAINTABLE_ID_DATEADDED			41 // time file was added to the db

// menu command id
#define IDM_DOSHITMENU_ADDNEWVIEW	40030
#define IDM_RESCANFOLDERSNOW		4066
#define IDM_ADD_DIRS				4067
#define IDM_REMOVE_UNUSED_FILES		4068
#define IDM_ADD_PLEDIT              4069



static const std::wstring _DB_FIELDNAME_tracknumber           = L"tracknumber";             static const wchar_t *DB_FIELDNAME_tracknumber           = _DB_FIELDNAME_tracknumber.c_str();
static const std::wstring _DB_FIELDNAME_track                 = L"track";                   static const wchar_t *DB_FIELDNAME_track                 = _DB_FIELDNAME_track.c_str();

static const std::wstring _DB_FIELDNAME_filename              = L"filename";                static const wchar_t *DB_FIELDNAME_filename              = _DB_FIELDNAME_filename.c_str();
static const std::wstring _DB_FIELDNAME_title                 = L"title";                   static const wchar_t *DB_FIELDNAME_title                 = _DB_FIELDNAME_title.c_str();
static const std::wstring _DB_FIELDNAME_artist                = L"artist";                  static const wchar_t *DB_FIELDNAME_artist                = _DB_FIELDNAME_artist.c_str();
static const std::wstring _DB_FIELDNAME_album                 = L"album";                   static const wchar_t *DB_FIELDNAME_album                 = _DB_FIELDNAME_album.c_str();
static const std::wstring _DB_FIELDNAME_year                  = L"year";                    static const wchar_t *DB_FIELDNAME_year                  = _DB_FIELDNAME_year.c_str();
static const std::wstring _DB_FIELDNAME_genre                 = L"genre";                   static const wchar_t *DB_FIELDNAME_genre                 = _DB_FIELDNAME_genre.c_str();
static const std::wstring _DB_FIELDNAME_comment               = L"comment";                 static const wchar_t *DB_FIELDNAME_comment               = _DB_FIELDNAME_comment.c_str();
static const std::wstring _DB_FIELDNAME_trackno               = L"trackno";                 static const wchar_t *DB_FIELDNAME_trackno               = _DB_FIELDNAME_trackno.c_str();
static const std::wstring _DB_FIELDNAME_length                = L"length";                  static const wchar_t *DB_FIELDNAME_length                = _DB_FIELDNAME_length.c_str();
static const std::wstring _DB_FIELDNAME_type                  = L"type";                    static const wchar_t *DB_FIELDNAME_type                  = _DB_FIELDNAME_type.c_str();
static const std::wstring _DB_FIELDNAME_lastupd               = L"lastupd";                 static const wchar_t *DB_FIELDNAME_lastupd               = _DB_FIELDNAME_lastupd.c_str();
static const std::wstring _DB_FIELDNAME_lastplay              = L"lastplay";                static const wchar_t *DB_FIELDNAME_lastplay              = _DB_FIELDNAME_lastplay.c_str();
static const std::wstring _DB_FIELDNAME_rating                = L"rating";                  static const wchar_t *DB_FIELDNAME_rating                = _DB_FIELDNAME_rating.c_str();
static const std::wstring _DB_FIELDNAME_tuid2                 = L"tuid2";                   static const wchar_t *DB_FIELDNAME_tuid2                 = _DB_FIELDNAME_tuid2.c_str();
static const std::wstring _DB_FIELDNAME_playcount             = L"playcount";               static const wchar_t *DB_FIELDNAME_playcount             = _DB_FIELDNAME_playcount.c_str();
static const std::wstring _DB_FIELDNAME_filetime              = L"filetime";                static const wchar_t *DB_FIELDNAME_filetime              = _DB_FIELDNAME_filetime.c_str();
static const std::wstring _DB_FIELDNAME_filesize              = L"filesize";                static const wchar_t *DB_FIELDNAME_filesize              = _DB_FIELDNAME_filesize.c_str();
static const std::wstring _DB_FIELDNAME_bitrate               = L"bitrate";                 static const wchar_t *DB_FIELDNAME_bitrate               = _DB_FIELDNAME_bitrate.c_str();
static const std::wstring _DB_FIELDNAME_disc                  = L"disc";                    static const wchar_t *DB_FIELDNAME_disc                  = _DB_FIELDNAME_disc.c_str();
static const std::wstring _DB_FIELDNAME_albumartist           = L"albumartist";             static const wchar_t *DB_FIELDNAME_albumartist           = _DB_FIELDNAME_albumartist.c_str();
static const std::wstring _DB_FIELDNAME_replaygain_album_gain = L"replaygain_album_gain";   static const wchar_t *DB_FIELDNAME_replaygain_album_gain = _DB_FIELDNAME_replaygain_album_gain.c_str();
static const std::wstring _DB_FIELDNAME_replaygain_track_gain = L"replaygain_track_gain";   static const wchar_t *DB_FIELDNAME_replaygain_track_gain = _DB_FIELDNAME_replaygain_track_gain.c_str();
static const std::wstring _DB_FIELDNAME_publisher             = L"publisher";               static const wchar_t *DB_FIELDNAME_publisher             = _DB_FIELDNAME_publisher.c_str();
static const std::wstring _DB_FIELDNAME_composer              = L"composer";                static const wchar_t *DB_FIELDNAME_composer              = _DB_FIELDNAME_composer.c_str();
static const std::wstring _DB_FIELDNAME_bpm                   = L"bpm";                     static const wchar_t *DB_FIELDNAME_bpm                   = _DB_FIELDNAME_bpm.c_str();
static const std::wstring _DB_FIELDNAME_discs                 = L"discs";                   static const wchar_t *DB_FIELDNAME_discs                 = _DB_FIELDNAME_discs.c_str();
static const std::wstring _DB_FIELDNAME_tracks                = L"tracks";                  static const wchar_t *DB_FIELDNAME_tracks                = _DB_FIELDNAME_tracks.c_str();
static const std::wstring _DB_FIELDNAME_ispodcast             = L"ispodcast";               static const wchar_t *DB_FIELDNAME_ispodcast             = _DB_FIELDNAME_ispodcast.c_str();
static const std::wstring _DB_FIELDNAME_podcastchannel        = L"podcastchannel";          static const wchar_t *DB_FIELDNAME_podcastchannel        = _DB_FIELDNAME_podcastchannel.c_str();
static const std::wstring _DB_FIELDNAME_podcastpubdate        = L"podcastpubdate";          static const wchar_t *DB_FIELDNAME_podcastpubdate        = _DB_FIELDNAME_podcastpubdate.c_str();
static const std::wstring _DB_FIELDNAME_GracenoteFileID       = L"GracenoteFileID";         static const wchar_t *DB_FIELDNAME_GracenoteFileID       = _DB_FIELDNAME_GracenoteFileID.c_str();
static const std::wstring _DB_FIELDNAME_GracenoteExtData      = L"GracenoteExtData";        static const wchar_t *DB_FIELDNAME_GracenoteExtData      = _DB_FIELDNAME_GracenoteExtData.c_str();
static const std::wstring _DB_FIELDNAME_lossless              = L"lossless";                static const wchar_t *DB_FIELDNAME_lossless              = _DB_FIELDNAME_lossless.c_str();
static const std::wstring _DB_FIELDNAME_category              = L"category";                static const wchar_t *DB_FIELDNAME_category              = _DB_FIELDNAME_category.c_str();
static const std::wstring _DB_FIELDNAME_codec                 = L"codec";                   static const wchar_t *DB_FIELDNAME_codec                 = _DB_FIELDNAME_codec.c_str();
static const std::wstring _DB_FIELDNAME_director              = L"director";                static const wchar_t *DB_FIELDNAME_director              = _DB_FIELDNAME_director.c_str();
static const std::wstring _DB_FIELDNAME_producer              = L"producer";                static const wchar_t *DB_FIELDNAME_producer              = _DB_FIELDNAME_producer.c_str();
static const std::wstring _DB_FIELDNAME_width                 = L"width";                   static const wchar_t *DB_FIELDNAME_width                 = _DB_FIELDNAME_width.c_str();
static const std::wstring _DB_FIELDNAME_height                = L"height";                  static const wchar_t *DB_FIELDNAME_height                = _DB_FIELDNAME_height.c_str();
static const std::wstring _DB_FIELDNAME_mimetype              = L"mimetype";                static const wchar_t *DB_FIELDNAME_mimetype              = _DB_FIELDNAME_mimetype.c_str();
static const std::wstring _DB_FIELDNAME_dateadded             = L"dateadded";               static const wchar_t *DB_FIELDNAME_dateadded             = _DB_FIELDNAME_dateadded.c_str();


extern BOOL myMenu;

int init(void);
void config(void);

int treeGetParam(HTREEITEM h);

class Table;
class C_Config;
extern CRITICAL_SECTION g_db_cs;
extern nde_database_t g_db;
extern nde_table_t g_table;
extern int g_table_dirty;
extern const wchar_t *WINAMP_INI;

extern HWND m_curview_hwnd;

extern wchar_t g_path[], g_tableDir[], g_viewsDir[];
extern C_Config *g_config;

extern HMENU g_context_menus, g_context_menus2;

typedef struct
{
	wchar_t *name;
	wchar_t *query;
	wchar_t *metafn; //filename, without path, of meta file
	int mode;
	int imgIndex;
	int index;
} queryItem;

typedef std::map <int, queryItem*> QueryList;
extern QueryList  m_query_list;
extern C_Config *g_view_metaconf;
extern int g_guessifany;
extern int g_querydelay;
extern int g_viewnotplay;

void loadQueryTree();
extern int m_query_tree;
extern int m_query_mode;
static wchar_t *m_query_metafile;
HWND onTreeViewSelectChange(HWND hwnd);

void db_setFieldStringW(nde_scanner_t s, unsigned char id, const wchar_t *data);
void db_setFieldInt(nde_scanner_t s, unsigned char id, int data);
void db_setFieldInt64(nde_scanner_t s, unsigned char id, __int64 data);
int db_getFieldInt(nde_scanner_t s, unsigned char id, int defaultVal);
void db_removeField(nde_scanner_t s, unsigned char id);

void main_playQuery(C_Config *metaconf, const wchar_t *query, int enqueue, int startplaying=1); // enqueue =-1 sends it to the playlist
void main_playItemRecordList (itemRecordListW *obj, int enqueue, int startplaying=1);
int addQueryItem(const wchar_t *name, const wchar_t *val, int mode, int select, const wchar_t *metafn, int imageIndex, int num=-1);
void replaceQueryItem(int n, const wchar_t *name, const wchar_t *val, int mode, int imageIndex);
void saveQueryTree();

int pluginHandleIpcMessage(int msg, int param);

int openDb();
void closeDb();

void nukeLibrary(HWND hwndDlg);

//add.cpp
int addFileToDb(const wchar_t *filename, int onlyupdate, int use_metadata, int guess_mode, int playcnt=0, int lastplay=0, bool force=false); // adds a file to the db, gets info, etc.
int RemoveFileFromDB(/*const Table *table, */const wchar_t *filename);	// removes a file from the DB
void makeFilename2(const char *filename, char *filename2, int filename2_len);
void makeFilename2W(const wchar_t *filename, wchar_t *filename2, int filename2_len);

//gracenote.cpp
void gracenoteInit();
int gracenoteQueryFile(const wchar_t *filename);
void gracenoteCancelRequest();
int gracenoteDoTimerStuff();
void gracenoteSetValues(const wchar_t *artist, const wchar_t *album, const wchar_t *title);
const wchar_t *gracenoteGetTuid();
int gracenoteIsWorking();

//guess.cpp
wchar_t *guessTitles(const wchar_t *filename, 
					 int *tracknum,
					 wchar_t **artist,
					 wchar_t **album,
					 wchar_t **title); // should free the result of this function after using artist/album/title

//prefs.cpp
INT_PTR CALLBACK PrefsProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam);

int autoscan_add_directory(const wchar_t *path, int *guess, int *meta, int *recurse, int noaddjustcheck);// if we return 1, guess and meta will be filled in
void refreshPrefs(int screen);

//util.cpp
extern "C" {
	void process_substantives(wchar_t* dest);
	void ConvertRatingMenuStar(HMENU menu, UINT menu_id);
};

//view_audio.cpp
INT_PTR CALLBACK view_audioDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam);

//view_miniinfo.cpp
INT_PTR CALLBACK view_miniinfoDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam);

//view_errorinfo.cpp
INT_PTR CALLBACK view_errorinfoDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam);

/* bgscan.cpp */
void Scan_ScanFolderBackground(const wchar_t *path, int guess, int meta, int recurse);
void Scan_ScanFolder(HWND parent, const wchar_t *path, int guess, int meta, int recurse);
// When you call Scan_ScanFolders, it will own the memory and release it with free()
void Scan_ScanFolders(HWND parent, size_t count, wchar_t **paths, int *guess, int *meta, int *recurse);
void Scan_BackgroundScan();
void Scan_Cancel();
void Scan_Kill();
// remove missing files
void Scan_RemoveFiles(HWND parent);

//view_media.cpp
void makeQueryStringFromText(GayStringW *query, wchar_t *text, int nf=8);
inline BOOL WINAPI IsCharSpaceA(char c) { return (c == ' ' || c == '\t'); }
inline BOOL WINAPI IsCharSpaceW(wchar_t c) { return (c == L' ' || c == L'\t'); }
inline bool IsThe(const char *str) { if (str && (str[0] == 't' || str[0] == 'T') && (str[1] == 'h' || str[1] == 'H') && (str[2] == 'e' || str[2] == 'E') && (str[3] == ' ')) return true; else return false; }
__forceinline static bool IsTheW(const wchar_t *str) 
{
	if ((str[0] & ~0x20) == L'T'
		&& (str[1] & ~0x20) == L'H'
		&& (str[2] & ~0x20) == L'E'
		&& str[3] == L' ')
		return true;
	else
		return false;
}
#define SKIP_THE_AND_WHITESPACE(x) { char *save##x=(char*)x; while (IsCharSpaceA(*x) && *x) x++; if (IsThe(x)) x+=4; while (IsCharSpaceA(*x)) x++; if (!*x) x=save##x; }
#define SKIP_THE_AND_WHITESPACEW(x) { wchar_t *save##x=(wchar_t*)x; while ((*x == L' ' || *x == L'\t') && *x) x++; if (IsTheW(x)) x+=4; while ((*x == L' ' || *x == L'\t')) x++; if (!*x) x=save##x; }
//wherever this goes is fine

#define UPDATE_QUERY_TIMER_ID 505
#define UPDATE_RESULT_LIST_TIMER_ID 506
INT_PTR CALLBACK view_mediaDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam);
int WCSCMP_NULLOK(const wchar_t *pa, const wchar_t *pb);

typedef void (*resultsniff_funcW)(itemRecordW *items, int numitems, int user32, int *killswitch);

void bgQuery_Stop();
extern nde_scanner_t m_media_scanner;
typedef std::vector<wchar_t*> CloudFiles;

// returns length in seconds (high bit on means could be much more), or -1 if killed
int saveQueryToListW(C_Config *viewconf, nde_scanner_t s, itemRecordListW *obj,
					 CloudFiles *uploaded, CloudFiles *uploading,
					 resultsniff_funcW cb=0, int user32=0, int *killswitch=0, __int64 *total_bytes=0);

// queries.cpp
void view_queryContextMenu(INT_PTR param1, HWND hHost, POINTS pts, int item);
void queriesContextMenu(INT_PTR param1, HWND hHost, POINTS pts);
void queryEditItem(int n);
void addNewQuery(HWND parent);
void queryDeleteItem(HWND parent, int n);
BOOL windowOffScreen(HWND hwnd, POINT pt);

// handleMessage.cpp
INT_PTR HandleIpcMessage(INT_PTR msg, INT_PTR param);
extern "C" extern int (*warand)(void);

extern WNDPROC wa_oldWndProc;

wchar_t *itemrecordWTagFunc(wchar_t * tag, void * p);
wchar_t *fieldTagFunc(wchar_t * tag, void * p); //return 0 if not found
void ndeTagFuncFree(wchar_t * tag, void * p); // for NDE strings
DWORD doGuessProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );
void TAG_FMT_EXT(const wchar_t *filename, void *f, void *ff, void *p, wchar_t *out, int out_len, int extended);
extern int asked_for_playcount;
LRESULT APIENTRY wa_newWndProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
extern int m_calling_getfileinfo;
extern HMENU wa_play_menu ;
void add_pledit_to_library();
void add_to_library(HWND wndparent);
extern int g_bgscan_scanning, g_bgrescan_force, g_bgrescan_do, g_bgrescan_int;
extern WNDPROC ml_oldWndProc;
extern time_t g_bgscan_last_rescan;
int runBGscan(int ms);
void compactRecordList(itemRecordListW *obj);

LRESULT APIENTRY ml_newWndProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
int FLOATCMP_NULLOK(const char *pa, const char *pb);
int FLOATWCMP_NULLOK(const wchar_t *pa, const wchar_t *pb);
void ClearTitleHookCache();

int FindFileInDatabase(nde_scanner_t s, int fieldId, const wchar_t *filename, wchar_t alternate[MAX_PATH]);

__int64 ScannerRefToObjCacheNFNW(nde_scanner_t s, itemRecordListW *obj, bool compat);
__int64 ScannerRefToObjCacheNFNW(nde_scanner_t s, itemRecordW *obj, bool compat);
int updateFileInfo(const wchar_t *filename, const wchar_t *metadata, wchar_t *data);
void sortResults(C_Config *viewconf, itemRecordListW *obj);
void queryStrEscape(const char *raw, GayString &str);
void queryStrEscape(const wchar_t *raw, GayStringW &str);
void ParseIntSlashInt(wchar_t *string, int *part, int *parts);

HWND updateCurrentView(HWND hwndDlg);

#define MEDIAVIEW_COL_ARTIST			0
#define MEDIAVIEW_COL_TITLE				1
#define MEDIAVIEW_COL_ALBUM				2
#define MEDIAVIEW_COL_LENGTH			3
#define MEDIAVIEW_COL_TRACK				4
#define MEDIAVIEW_COL_GENRE				5
#define MEDIAVIEW_COL_YEAR				6
#define MEDIAVIEW_COL_FILENAME			7
#define MEDIAVIEW_COL_RATING			8
#define MEDIAVIEW_COL_PLAYCOUNT			9
#define MEDIAVIEW_COL_LASTPLAY			10
#define MEDIAVIEW_COL_LASTUPD			11
#define MEDIAVIEW_COL_FILETIME			12
#define MEDIAVIEW_COL_COMMENT			13
#define MEDIAVIEW_COL_FILESIZE			14
#define MEDIAVIEW_COL_BITRATE			15
#define MEDIAVIEW_COL_TYPE				16
#define MEDIAVIEW_COL_DISC				17
#define MEDIAVIEW_COL_ALBUMARTIST		18
#define MEDIAVIEW_COL_FULLPATH			19
#define MEDIAVIEW_COL_ALBUMGAIN			20
#define MEDIAVIEW_COL_TRACKGAIN			21
#define MEDIAVIEW_COL_PUBLISHER			22
#define MEDIAVIEW_COL_COMPOSER			23
#define MEDIAVIEW_COL_EXTENSION			24
#define MEDIAVIEW_COL_ISPODCAST			25
#define MEDIAVIEW_COL_PODCASTCHANNEL	26
#define MEDIAVIEW_COL_PODCASTPUBDATE	27
#define MEDIAVIEW_COL_BPM				28
#define MEDIAVIEW_COL_CATEGORY			29
#define MEDIAVIEW_COL_DIRECTOR			30
#define MEDIAVIEW_COL_PRODUCER			31
#define MEDIAVIEW_COL_DIMENSION			32
#define MEDIAVIEW_COL_DATEADDED			33
#define MEDIAVIEW_COL_CLOUD				34

#define MEDIAVIEW_COL_NUMS 35			// number of columns
#endif // ML_LOCAL_HEADER