📄 id3v2tag.c
字号:
{
/* Provide the item or subitem's text, if requested. */
if (pnmv->item.mask & LVIF_TEXT) {
ID3ITEM *pItem = (ID3ITEM *) (pnmv->item.lParam);
lstrcpy(pnmv->item.pszText,
pItem->aCols[pnmv->item.iSubItem]);
}
}
ID3ITEM *pItem;
int editItemIndex;
BOOL CALLBACK EditTextFrameProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
LV_ITEM lvi;
switch (message) {
case WM_INITDIALOG:
SetDlgItemText(hwndDlg, IDC_TEXTFRAMENAME, pItem->aCols[0]);
SetDlgItemText(hwndDlg, IDC_EDITTEXTFRAME, pItem->aCols[1]);
switch (pItem->frameId)
{
case ID3FID_ALBUM: case ID3FID_BPM:
case ID3FID_COMPOSER: case ID3FID_COPYRIGHT:
case ID3FID_DATE: case ID3FID_PLAYLISTDELAY:
case ID3FID_ENCODEDBY: case ID3FID_LYRICIST:
case ID3FID_FILETYPE: case ID3FID_TIME:
case ID3FID_CONTENTGROUP: case ID3FID_TITLE:
case ID3FID_SUBTITLE: case ID3FID_INITIALKEY:
case ID3FID_LANGUAGE: case ID3FID_SONGLEN:
case ID3FID_MEDIATYPE: case ID3FID_ORIGALBUM:
case ID3FID_ORIGFILENAME: case ID3FID_ORIGLYRICIST:
case ID3FID_ORIGARTIST: case ID3FID_ORIGYEAR:
case ID3FID_FILEOWNER: case ID3FID_LEADARTIST:
case ID3FID_BAND: case ID3FID_CONDUCTOR:
case ID3FID_MIXARTIST: case ID3FID_PARTINSET:
case ID3FID_PUBLISHER: case ID3FID_TRACKNUM:
case ID3FID_RECORDINGDATES: case ID3FID_NETRADIOSTATION:
case ID3FID_NETRADIOOWNER: case ID3FID_SIZE:
case ID3FID_ISRC: case ID3FID_ENCODERSETTINGS:
case ID3FID_YEAR: case ID3FID_WWWAUDIOFILE:
case ID3FID_WWWARTIST: case ID3FID_WWWAUDIOSOURCE:
case ID3FID_WWWCOMMERCIALINFO: case ID3FID_WWWCOPYRIGHT:
case ID3FID_WWWPUBLISHER: case ID3FID_WWWPAYMENT:
case ID3FID_WWWRADIOPAGE: case ID3FID_CONTENTTYPE:
{
EnableWindow(GetDlgItem(hwndDlg, IDC_TEXTFRAMENAME), FALSE);
EnableWindow(GetDlgItem(hwndDlg, IDC_EDITTEXTFRAME), TRUE);
break;
}
case ID3FID_USERTEXT: case ID3FID_COMMENT:
case ID3FID_UNSYNCEDLYRICS: case ID3FID_WWWUSER:
{
EnableWindow(GetDlgItem(hwndDlg, IDC_TEXTFRAMENAME), TRUE);
EnableWindow(GetDlgItem(hwndDlg, IDC_EDITTEXTFRAME), TRUE);
break;
}
default:
EnableWindow(GetDlgItem(hwndDlg, IDOK), FALSE);
EnableWindow(GetDlgItem(hwndDlg, IDC_TEXTFRAMENAME), FALSE);
EnableWindow(GetDlgItem(hwndDlg, IDC_EDITTEXTFRAME), FALSE);
break;
}
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDOK:
{
GetDlgItemText(hwndDlg, IDC_TEXTFRAMENAME, pItem->aCols[0], 1024);
GetDlgItemText(hwndDlg, IDC_EDITTEXTFRAME, pItem->aCols[1], 1024);
lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
lvi.state = 0;
lvi.stateMask = 0;
lvi.pszText = LPSTR_TEXTCALLBACK; /* app. maintains text */
lvi.iImage = 0;
lvi.iItem = editItemIndex;
lvi.iSubItem = 0;
lvi.lParam = (LPARAM)pItem; /* item data */
/* Add the item. */
ListView_SetItem(m_hwndList, &lvi);
ListView_Update(m_hwndList, editItemIndex);
} /* Fall through */
case IDCANCEL:
EndDialog(hwndDlg, wParam);
return TRUE;
}
}
return FALSE;
}
/* Double clicking means editing a frame */
BOOL List_EditData(HWND hwndApp, HWND hwndList)
{
LV_ITEM lvi;
BOOL result;
/* First get the selected item */
int index = ListView_GetNextItem(hwndList, -1, LVNI_SELECTED);
m_hwndList = hwndList;
if (index != -1)
{
lvi.mask = LVIF_PARAM;
lvi.iItem = index;
lvi.iSubItem = 0;
if (ListView_GetItem(hwndList, &lvi) == TRUE)
{
pItem = (ID3ITEM*)lvi.lParam;
editItemIndex = lvi.iItem;
result = DialogBox(hInstance_for_id3editor, MAKEINTRESOURCE(IDD_EDITTEXTFRAME),
hwndApp, EditTextFrameProc);
if (LOWORD(result) == IDOK)
return TRUE;
}
}
return FALSE;
}
/* Delete the selected frame */
BOOL List_DeleteSelected(HWND hwndApp, HWND hwndList)
{
int items;
/* First get the selected item */
int index = ListView_GetNextItem(hwndList, -1, LVNI_SELECTED);
if (index != -1)
ListView_DeleteItem(hwndList, index);
items = ListView_GetItemCount(hwndList);
if (index != -1) return TRUE;
else return FALSE;
}
/* Save the ID3 to the file */
void List_SaveID3(HWND hwndApp, HWND hwndList, char *filename)
{
LV_ITEM lvi;
ID3ITEM *pItem1;
int i, items;
ID3Tag *tag;
ID3Frame *frame;
ID3Field *field;
/* Strip the tag first, before completely rewriting it */
if ((tag = ID3Tag_New()) != NULL)
{
ID3Tag_Link(tag, filename);
ID3Tag_Strip(tag, ID3TT_ALL);
ID3Tag_Clear(tag);
if (SendMessage(GetDlgItem(hwndApp, IDC_ID3V2TAG), BM_GETCHECK, 0, 0) == BST_UNCHECKED)
{
/* No frames saved */
ID3Tag_Delete(tag);
EnableWindow(GetDlgItem(hwndApp, IDC_ID3V2TAG), FALSE);
ListView_DeleteAllItems(hwndList);
return;
}
/* First get the number of items */
items = ListView_GetItemCount(hwndList);
if (items > 0)
{
for (i = 0; i < items; i++)
{
lvi.mask = LVIF_PARAM;
lvi.iItem = i;
lvi.iSubItem = 0;
if (ListView_GetItem(hwndList, &lvi) == TRUE)
{
pItem1 = (ID3ITEM*)lvi.lParam;
frame = ID3Frame_NewID(pItem1->frameId);
switch (pItem1->frameId)
{
case ID3FID_ALBUM: case ID3FID_BPM:
case ID3FID_COMPOSER: case ID3FID_CONTENTTYPE:
case ID3FID_COPYRIGHT: case ID3FID_DATE:
case ID3FID_PLAYLISTDELAY: case ID3FID_ENCODEDBY:
case ID3FID_LYRICIST: case ID3FID_FILETYPE:
case ID3FID_TIME: case ID3FID_CONTENTGROUP:
case ID3FID_TITLE: case ID3FID_SUBTITLE:
case ID3FID_INITIALKEY: case ID3FID_LANGUAGE:
case ID3FID_SONGLEN: case ID3FID_MEDIATYPE:
case ID3FID_ORIGALBUM: case ID3FID_ORIGFILENAME:
case ID3FID_ORIGLYRICIST: case ID3FID_ORIGARTIST:
case ID3FID_ORIGYEAR: case ID3FID_FILEOWNER:
case ID3FID_LEADARTIST: case ID3FID_BAND:
case ID3FID_CONDUCTOR: case ID3FID_MIXARTIST:
case ID3FID_PARTINSET: case ID3FID_PUBLISHER:
case ID3FID_TRACKNUM: case ID3FID_RECORDINGDATES:
case ID3FID_NETRADIOSTATION: case ID3FID_NETRADIOOWNER:
case ID3FID_SIZE: case ID3FID_ISRC:
case ID3FID_ENCODERSETTINGS: case ID3FID_YEAR:
{
field = ID3Frame_GetField(frame, ID3FN_TEXT);
ID3Field_SetASCII(field, pItem1->aCols[1]);
ID3Tag_AddFrame(tag, frame);
break;
}
case ID3FID_USERTEXT:
case ID3FID_COMMENT: /* Can also contain an extra language field (but not used now) */
case ID3FID_UNSYNCEDLYRICS: /* Can also contain an extra language field (but not used now) */
{
field = ID3Frame_GetField(frame, ID3FN_DESCRIPTION);
ID3Field_SetASCII(field, pItem1->aCols[0]);
field = ID3Frame_GetField(frame, ID3FN_TEXT);
ID3Field_SetASCII(field, pItem1->aCols[1]);
ID3Tag_AddFrame(tag, frame);
break;
}
case ID3FID_WWWAUDIOFILE: case ID3FID_WWWARTIST:
case ID3FID_WWWAUDIOSOURCE: case ID3FID_WWWCOMMERCIALINFO:
case ID3FID_WWWCOPYRIGHT: case ID3FID_WWWPUBLISHER:
case ID3FID_WWWPAYMENT: case ID3FID_WWWRADIOPAGE:
{
field = ID3Frame_GetField(frame, ID3FN_URL);
ID3Field_SetASCII(field, pItem1->aCols[1]);
ID3Tag_AddFrame(tag, frame);
break;
}
case ID3FID_WWWUSER:
{
field = ID3Frame_GetField(frame, ID3FN_DESCRIPTION);
ID3Field_SetASCII(field, pItem1->aCols[0]);
field = ID3Frame_GetField(frame, ID3FN_URL);
ID3Field_SetASCII(field, pItem1->aCols[1]);
ID3Tag_AddFrame(tag, frame);
break;
}
default:
break;
}
}
}
ID3Tag_UpdateByTagType(tag, ID3TT_ID3V2);
}
ID3Tag_Delete(tag);
}
}
/* Get the title from the file */
void GetID3FileTitle(char *filename, char *title, char *format)
{
ID3Tag *tag;
ID3Frame *frame;
ID3Field *field;
char buffer[255];
int some_info = 0;
char *in = format;
char *out = title;
char *bound = out + (MAX_PATH - 10 - 1);
if ((tag = ID3Tag_New()) != NULL)
{
ID3Tag_Link(tag, filename);
while (*in && out < bound)
{
switch (*in) {
case '%':
++in;
break;
default:
*out++ = *in++;
continue;
}
/* handle % escape sequence */
switch (*in++) {
case '0':
if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_TRACKNUM)) != NULL) {
int size;
field = ID3Frame_GetField(frame, ID3FN_TEXT);
size = ID3Field_GetASCII(field, buffer, 255, 1);
lstrcpy(out, buffer); out += size;
some_info = 1;
}
break;
case '1':
if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_LEADARTIST)) != NULL) {
int size;
field = ID3Frame_GetField(frame, ID3FN_TEXT);
size = ID3Field_GetASCII(field, buffer, 255, 1);
lstrcpy(out, buffer); out += size;
some_info = 1;
}
break;
case '2':
if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_TITLE)) != NULL) {
int size;
field = ID3Frame_GetField(frame, ID3FN_TEXT);
size = ID3Field_GetASCII(field, buffer, 255, 1);
lstrcpy(out, buffer); out += size;
some_info = 1;
}
break;
case '3':
if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_ALBUM)) != NULL) {
int size;
field = ID3Frame_GetField(frame, ID3FN_TEXT);
size = ID3Field_GetASCII(field, buffer, 255, 1);
lstrcpy(out, buffer); out += size;
some_info = 1;
}
break;
case '4':
if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_YEAR)) != NULL) {
int size;
field = ID3Frame_GetField(frame, ID3FN_TEXT);
size = ID3Field_GetASCII(field, buffer, 255, 1);
lstrcpy(out, buffer); out += size;
some_info = 1;
}
break;
case '5':
if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_COMMENT)) != NULL) {
int size;
field = ID3Frame_GetField(frame, ID3FN_TEXT);
size = ID3Field_GetASCII(field, buffer, 255, 1);
lstrcpy(out, buffer); out += size;
some_info = 1;
}
break;
case '6':
if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_CONTENTTYPE)) != NULL) {
int size; char *tmp;
field = ID3Frame_GetField(frame, ID3FN_TEXT);
size = ID3Field_GetASCII(field, buffer, 255, 1);
tmp = GetGenre(buffer);
lstrcpy(out, tmp); out += size;
some_info = 1;
}
break;
case '7':
{
char *p=filename+lstrlen(filename);
int len = 0;
while (*p != '\\' && p >= filename) { p--; len++; }
lstrcpy(out, ++p); out += len;
some_info = 1;
break;
}
}
}
*out = '\0';
ID3Tag_Delete(tag);
}
if (!some_info)
{
char *p=filename+lstrlen(filename);
while (*p != '\\' && p >= filename) p--;
lstrcpy(title,++p);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -