Тема: AHK: Вывод информации о треке из AIMP
Есть у кого-нибудь скрипт о выводе названии исполнителя и трека?
Буду очень благодарен!
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Есть у кого-нибудь скрипт о выводе названии исполнителя и трека?
Буду очень благодарен!
Глобальный хоткей на current file info?
Глобальный хоткей на current file info?
Спасибо, конечно, но нужен скрипт ![]()
Если у кого-нибудь есть, поделитесь, пожалуйста))) Очень нужен
Как из AIMP, не знаю, но можно извлечь информацию непосредственно из файла.
Как из AIMP, не знаю, но можно извлечь информацию непосредственно из файла.
Нужно, чтобы была информация о играющем в текущий момент треке
Нет, не в курсе, как узнать, какой файл звучит, да и AIMP'ом не пользуюсь.
Нет, не в курсе, как узнать, какой файл звучит, да и AIMP'ом не пользуюсь.
Жаль. Ну может у Вас есть аналогичный скрипт под Winamp?
Хотя очень нужен под AIMP
Для Winamp скрипта тоже нет, посмотрю попозже, если будет время.
Для Winamp скрипта тоже нет, посмотрю попозже, если будет время.
Спасибо Вам большое!
f4
Есть плагин, записывающий инфо о текущем треке в файл, а его можно и скриптом обработать.
Имеются исходники на Дельфи, там можно поразбирать, как плагин работает, возможно и на AHK переделать получится.
Есть плагин, записывающий инфо о текущем треке в файл, а его можно и скриптом обработать.
Имеются исходники на Дельфи, там можно поразбирать, как плагин работает, возможно и на AHK переделать получится.
Все было бы отлично, если этот плагин был встроен по умолчанию..или хотя бы знать Дельфи )
В файле AIMPSDKRemote.h описаны способы взаимодействия с плеером «извне».
Получение информации о треке:
AIMP_GetTrackInfo() {
static AIMPRemoteAccessClass := "AIMP2_RemoteInfo"
, AIMPRemoteAccessMapFileSize := 2048
, FILE_MAP_READ := 4
if !hFile := DllCall("OpenFileMapping"
, "UInt", FILE_MAP_READ
, "UInt", true
, "Ptr", &AIMPRemoteAccessClass)
{
return false
}
info := DllCall("MapViewOfFile"
, "Ptr", hFile
, "UInt", FILE_MAP_READ
, "UInt", 0
, "UInt", 0
, "Ptr", AIMPRemoteAccessMapFileSize)
size := NumGet(info|0, 0, "UInt")
textOffset := info + size
albumLen := NumGet(info|0, 40, "UInt")
artistLen := NumGet(info|0, 44, "UInt")
dateLen := NumGet(info|0, 48, "UInt")
fileNameLen := NumGet(info|0, 52, "UInt")
genreLen := NumGet(info|0, 56, "UInt")
titleLen := NumGet(info|0, 60, "UInt")
TrackInfo := {
(Join,
active : NumGet(info|0, 4, "Int")
bitRate : NumGet(info|0, 8, "UInt")
channels : NumGet(info|0, 12, "UInt")
duration : NumGet(info|0, 16, "UInt")
fileSize : NumGet(info|0, 20, "Int64")
rating : NumGet(info|0, 28, "UInt")
sampleRate : NumGet(info|0, 32, "UInt")
trackID : NumGet(info|0, 36, "UInt")
album : StrGet(textOffset, albumLen)
artist : StrGet(textOffset += albumLen * 2, artistLen)
date : StrGet(textOffset += artistLen * 2, dateLen)
fileName : StrGet(textOffset += dateLen * 2, fileNameLen)
genre : StrGet(textOffset += fileNameLen * 2, genreLen)
title : StrGet(textOffset += genreLen * 2, titleLen)
)}
DllCall("CloseHandle", "Ptr", hFile)
return TrackInfo
}Результат работы функции — ассоциативный массив, содержащий в соответствующих полях всю доступную информацию о файле, или 0, если «что-то пошло не так».
Space::
track := AIMP_GetTrackInfo()
MsgBox % track.artist " — " track.title
returnПри нажатии пробела — «вывод названия исполнителя и трека».
creature.ws
Супер!
А возможно получить весь текущий плейлист желательно состоящий из полных путей, и запустить нужный из них на проигрывание?
получить весь текущий плейлист
В AIMPSDKRemote.h нет упоминаний о подобном.
А где лежит AIMPSDKRemote.h, я его ненашёл.
Первая ссылка в гугле
Как всегда, очки на носу потерял
Подумал что файл должен быть в папке с программой.
Так понял что есть ещё оконные сообщения, но непонял как ими пользоватся:
WM_USER := 0x400
WM_AIMP_PROPERTY := WM_USER + 0x77
AIMP_RA_PROPVALUE_GET := 0
AIMP_RA_PROPERTY_VERSION := 0x10
/*
// Messages, which you can send to window with "AIMPRemoteAccessClass" class
// You can receive Window Handle via FindWindow function (see MSDN for details)
// + How to:
// GET: SendMessage(Handle, WM_AIMP_PROPERTY, PropertyID | AIMP_RA_PROPVALUE_GET, 0);
// SET: SendMessage(Handle, WM_AIMP_PROPERTY, PropertyID | AIMP_RA_PROPVALUE_SET, NewValue);
//
// Receive Change Notification:
// 1) You should register notification hook using AIMP_RA_CMD_REGISTER_NOTIFY command
// 2) When property will change you receive WM_AIMP_NOTIFY message with following params:
// WParam: AIMP_RA_NOTIFY_PROPERTY (Notification ID)
// LParam: Property ID
*/
SendMessage, WM_AIMP_PROPERTY, AIMP_RA_PROPERTY_VERSION | AIMP_RA_PROPVALUE_GET, 0, , AIMP3
MsgBox % ErrorLevel
Return
Структура сообщения неверная, и что-то про окно "AIMPRemoteAccessClass", может не то окно указываю.
Константа AIMPRemoteAccessClass содержит имя класса окна в которое следует отправлять упомянутые сообщения.
creature.ws
Спасибо, понял.
Узнать громкость:
SendMessage, 0x0400+0x77, 0x50 , , , ahk_class AIMP2_RemoteInfo
MsgBox % ErrorLevelУстановить громкость:
SendMessage, 0x0400+0x77, 0x50 | 1, 100, , ahk_class AIMP2_RemoteInfoЕщё вопрос, как использовать это: "AIMP_RA_NOTIFY_TRACK_INFO = AIMP_RA_NOTIFY_BASE + 1" так понял оно тоже должно получать инфо о треке?
«Оно» — id, передаваемый в wParam окну, слушающему WM_AIMP_NOTIFY. Зарегистрировать окно скрипта в качестве получателя уведомлений о (в часности) смене трека можно с помощью WM_AIMP_COMMAND и AIMP_RA_CMD_REGISTER_NOTIFY.
Я плеером обсуждаемым не пользуюсь, в допиливании полноценной библиотеки не заинтересован.
Вот, что у меня получилось)
DetectHiddenWindows, on
IfWinExist, ahk_class Winamp v1.x ; проверяем включен ли АИМП
{
SendMessage, 0x400,, 104,, ahk_class Winamp v1.x ; проверяем не стоит ли на паузе
if ErrorLevel = 1
{
WinGetTitle, Title, ahk_class Winamp v1.x ; получаем заголовок окна; он содержит имя исполнителя и название песни
FoundPos := RegExMatch(Title, ". ")
StringTrimLeft, FoundPos, Title, FoundPos+1
StringTrimRight, Title, FoundPos, 8 ; обрезаем и записываем в переменную Title
}
}
Space::
msgbox %Title%
return
Браво. Код из сообщения #14 написан зря.
Браво. Код из сообщения #14 написан зря.
Отнюдь не зря! Из кода, который в посте #14 можно извлечь всю информацию о треке. А из поста #23 - только имя исполнителя и название песни
В файле AIMPSDKRemote.h описаны способы взаимодействия с плеером «извне».
Получение информации о треке:AIMP_GetTrackInfo() { static AIMPRemoteAccessClass := "AIMP2_RemoteInfo" , AIMPRemoteAccessMapFileSize := 2048 , FILE_MAP_READ := 4 if !hFile := DllCall("OpenFileMapping" , "UInt", FILE_MAP_READ , "UInt", true , "Ptr", &AIMPRemoteAccessClass) { return false } info := DllCall("MapViewOfFile" , "Ptr", hFile , "UInt", FILE_MAP_READ , "UInt", 0 , "UInt", 0 , "Ptr", AIMPRemoteAccessMapFileSize) size := NumGet(info|0, 0, "UInt") textOffset := info + size albumLen := NumGet(info|0, 40, "UInt") artistLen := NumGet(info|0, 44, "UInt") dateLen := NumGet(info|0, 48, "UInt") fileNameLen := NumGet(info|0, 52, "UInt") genreLen := NumGet(info|0, 56, "UInt") titleLen := NumGet(info|0, 60, "UInt") TrackInfo := { (Join, active : NumGet(info|0, 4, "Int") bitRate : NumGet(info|0, 8, "UInt") channels : NumGet(info|0, 12, "UInt") duration : NumGet(info|0, 16, "UInt") fileSize : NumGet(info|0, 20, "Int64") rating : NumGet(info|0, 28, "UInt") sampleRate : NumGet(info|0, 32, "UInt") trackID : NumGet(info|0, 36, "UInt") album : StrGet(textOffset, albumLen) artist : StrGet(textOffset += albumLen * 2, artistLen) date : StrGet(textOffset += artistLen * 2, dateLen) fileName : StrGet(textOffset += dateLen * 2, fileNameLen) genre : StrGet(textOffset += fileNameLen * 2, genreLen) title : StrGet(textOffset += genreLen * 2, titleLen) )} DllCall("CloseHandle", "Ptr", hFile) return TrackInfo }Результат работы функции — ассоциативный массив, содержащий в соответствующих полях всю доступную информацию о файле, или 0, если «что-то пошло не так».
Space:: track := AIMP_GetTrackInfo() MsgBox % track.artist " — " track.title returnПри нажатии пробела — «вывод названия исполнителя и трека».
Дайте код, пожалуйста, на AHK 1.0.48.05 (Не L)
Дайте код, пожалуйста, на AHK 1.0.48.05 (Не L)
И чтоб под windows 95 работал. 4 года с окончания поддержки — слишком малый срок для отказа от приложения.
Дайте код, пожалуйста, на AHK 1.0.48.05 (Не L)
И чтоб под windows 95 работал. 4 года с окончания поддержки — слишком малый срок для отказа от приложения.
Я до сих пор на нем работаю ![]()
«Оно» — id, передаваемый в wParam окну, слушающему WM_AIMP_NOTIFY. Зарегистрировать окно скрипта в качестве получателя уведомлений о (в часности) смене трека можно с помощью WM_AIMP_COMMAND и AIMP_RA_CMD_REGISTER_NOTIFY.Спасибо, буду пробовать.
Я плеером обсуждаемым не пользуюсь, в допиливании полноценной библиотеки не заинтересован. Плеером пользуюсь, но потребностей в полноценной библиотеке тоже нет. Интересуют пока только методы решения задач.
Отнюдь не зря! Из кода, который в посте #14 можно извлечь всю информацию о треке. А из поста #23 - только имя исполнителя и название песни
23 тоже не зря, я и неподумал про то что у аимп есть другие окна кроме ahk_class TAIMPMainForm, а окон у него оказалось 25 штук. Единственно что одного параметра ahk_class Winamp v1.x может быть недостаточно, например главное окно kmplayer тоже имеет такой класс, и нетолько kmplayer. Я бы записал как "ahk_class Winamp v1.x ahk_exe AIMP3.exe".
creature.ws, спасибо Вам за помощь
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться