Дык, загорелся идеей допилить в скрипт винампа возможность включать\выключать шафл. Как сделать?
Вроде визуал бэйсик, вроде-бы понятно что надо дописать еще 1 else с функцией, но куда обращаться всм команды и память я не понимаю.
Спойлер
Код: Выделить всё
//***************************************************************************
// WinAMP
//***************************************************************************
winampPath = getEnvironmentString("ProgramFiles") # "\WinAMP\WinAMP.exe";
etIgnore = 0;
etActivate = 1;
etBegin = 2;
etEnd = 3;
etKeyPress = 4;
etKeyRelease = 5;
etIntegerInput = 6;
etBack = 7;
etTimer = 8;
etNext = 9;
etTextInput = 10;
stNormal = 0;
stHelp = 1;
stVolume = 2;
stFastForward = 3;
stRewind = 4;
stExtraMenu = 5;
stBrowseAll = 6;
stBrowseArtists = 7;
stBrowseArtistSongs = 8;
stVolumeNoTimeout = 9;
stSearch = 10;
stSearchError = 11;
stSearchList = 12;
emSearch = 0;
emBrowseAll = 1;
emBrowseAllSorted = 2;
emBrowseArtists = 3;
showDialog = false;
windowClassName = "Winamp v1.x";
window = Windows.findWindow(windowClassName);
timeout = 50;
movementStep = 1000;
if(ExecuteData.type == etActivate)
{
showDialog = true;
RemoteController.setStore(new Array(3));
RemoteController.store[0] = stNormal;
}
else if(ExecuteData.type == etBegin)
{
RemoteController.startTimer(500);
}
else if(ExecuteData.type == etEnd)
{
RemoteController.stopTimer();
}
else if(ExecuteData.type == etTimer)
{
showDialog = true;
}
if(!window)
{
if(ExecuteData.type == etBack) return;
if(ExecuteData.type == etNext)
{
RemoteController.showProgress("Launching...");
if(!Windows.open(winampPath))
{
RemoteController.showDialog("WinAMP not installed");
RemoteController.stopTimer();
return;
}
for(i = 0; i < 20; i += 1)
{
window = Windows.findWindow(windowClassName);
if(window) break;
Windows.sleep(400);
}
showDialog = true;
}
}
else if(RemoteController.store[0] == stNormal)
{
if(ExecuteData.type == etBack) return;
if(ExecuteData.type == etNext)
{
// Play/Pause
showDialog = true;
state = window.sendMessageTimeout(0x400, 0, 104, timeout, 0);
if(state == 0) // Stopped
{
// Play
window.postMessage(0x111, 40045, 0);
}
else // Playing or paused
{
// Pause - this toggles it if paused already
window.postMessage(0x111, 40046, 0);
}
}
else if(ExecuteData.type == etKeyPress)
{
if(ExecuteData.keyID == "<")
{
// Rewind
RemoteController.store[0] = stRewind;
RemoteController.store[1] = movementStep;
RemoteController.startTimer(100);
}
else if(ExecuteData.keyID == ">")
{
// Fast Forward
RemoteController.store[0] = stFastForward;
RemoteController.store[1] = movementStep;
RemoteController.startTimer(100);
}
else if(ExecuteData.keyID == "c")
{
// Stop
window.postMessage(0x111, 40047, 0);
}
else if(ExecuteData.keyID == "^")
{
// Previous
window.postMessage(0x111, 40044, 0);
}
else if(ExecuteData.keyID == "v")
{
// Next
window.postMessage(0x111, 40048, 0);
}
else if(ExecuteData.keyID == "u" ||
ExecuteData.keyID == "d" ||
ExecuteData.keyID == "1")
{
volume = window.sendMessageTimeout(0x400, -666, 122, timeout, -1);
if(volume != -1)
{
RemoteController.showPercentInput("Volume", volume / 2.55);
RemoteController.store[0] = stVolume;
RemoteController.startTimer(3000);
}
}
else if(ExecuteData.keyID == "*")
{
// Help!
RemoteController.store[0] = stHelp;
showDialog = true;
}
else if(ExecuteData.keyID == "f")
{
// Menu!
RemoteController.store[0] = stExtraMenu;
RemoteController.stopTimer();
showDialog = true;
}
else if(ExecuteData.keyID == "4")
{
hWinampAl = Windows.findWindow("Winamp AL");
if(hWinampAl)
{
window.postMessage(0x111, 40047, 0);
hWinampAl.postMessage(0x400, 114, 0);
}
}
else if(ExecuteData.keyID == "6")
{
hWinampAl = Windows.findWindow("Winamp AL");
if(hWinampAl)
{
window.postMessage(0x111, 40047, 0);
hWinampAl.postMessage(0x400, 115, 0);
}
}
}
else if(ExecuteData.type == etKeyRelease)
{
if(ExecuteData.keyID == "<")
{
// Nothing
}
else if(ExecuteData.keyID == ">")
{
// Nothing
}
}
}
else if(RemoteController.store[0] == stHelp)
{
if(ExecuteData.type == etTimer) return;
if(ExecuteData.type == etBack || ExecuteData.type == etNext)
{
showDialog = true;
RemoteController.store[0] = stNormal;
}
}
else if(RemoteController.store[0] == stVolume)
{
if(ExecuteData.type == etTimer || ExecuteData.type == etBack || ExecuteData.type == etNext)
{
showDialog = true;
RemoteController.store[0] = stNormal;
RemoteController.startTimer(500);
}
else if(ExecuteData.type == etIntegerInput)
{
RemoteController.startTimer(3000);
window.postMessage(0x400, ExecuteData.input * 2.55, 122);
}
}
else if(RemoteController.store[0] == stVolumeNoTimeout)
{
if(ExecuteData.type == etBack || ExecuteData.type == etNext)
{
showDialog = true;
RemoteController.store[0] = stNormal;
RemoteController.startTimer(500);
}
else if(ExecuteData.type == etIntegerInput)
{
window.postMessage(0x400, ExecuteData.input * 2.55, 122);
}
}
else if(RemoteController.store[0] == stFastForward)
{
if(ExecuteData.type == etTimer)
{
time = window.sendMessageTimeout(0x400, 0, 105, timeout, -1);
if(time != -1)
{
window.postMessage(0x400, time+RemoteController.store[1], 106);
RemoteController.store[1] += 100;
}
}
else if(ExecuteData.type == etKeyRelease)
{
RemoteController.startTimer(500);
RemoteController.store[0] = stNormal;
}
}
else if(RemoteController.store[0] == stRewind)
{
if(ExecuteData.type == etTimer)
{
time = window.sendMessageTimeout(0x400, 0, 105, timeout, -1);
if(time != -1)
{
time = time - RemoteController.store[1];
if(time < 0) time = 0;
window.postMessage(0x400, time, 106);
RemoteController.store[1] += 100;
}
}
else if(ExecuteData.type == etKeyRelease)
{
RemoteController.startTimer(500);
RemoteController.store[0] = stNormal;
}
}
else if(RemoteController.store[0] == stExtraMenu)
{
if(ExecuteData.type == etBack || ExecuteData.type == etNext)
{
showDialog = true;
RemoteController.store[0] = stNormal;
RemoteController.startTimer(500);
}
else if(ExecuteData.type == etIntegerInput)
{
// 0 = Browse all
// 1 = Browse all sorted
// 2 = Browse by artist
if(ExecuteData.input == emBrowseAll)
{
// Request writing the playlist.
if(window.sendMessageTimeout(0x400, 0, 120, timeout, -1) == -1)
{
// Shit.. problems!
showDialog = true;
RemoteController.store[0] = stNormal;
}
m3uName = window.moduleFileName ^ "^(.*)\.exe$/$1.m3u/i";
m3uFile = new Reader(m3uName);
songArray = new Array(0);
songName = "";
while(m3uFile.isReadable())
{
line = m3uFile.readLine();
if(!line) continue;
if(line ~ "^#")
{
if(line ~ "^#EXTINF:\d+,(?:.*? - )?(.*?)$") songName = regex_captures[1];
}
else
{
if(!songName) songName = line ^ "^(?:.*\\)(.*)$/$1";
songArray.append(songName);
songName = "";
}
}
RemoteController.showMenu("Songs", songArray);
RemoteController.store[0] = stBrowseAll;
}
else if(ExecuteData.input == emBrowseAllSorted)
{
// Request writing the playlist.
if(window.sendMessageTimeout(0x400, 0, 120, timeout, -1) == -1)
{
// Shit.. problems!
showDialog = true;
RemoteController.store[0] = stNormal;
}
m3uName = window.moduleFileName ^ "^(.*)\.exe$/$1.m3u/i";
m3uFile = new Reader(m3uName);
songArray = new Array(0);
songName = "";
while(m3uFile.isReadable())
{
line = m3uFile.readLine();
if(!line) continue;
if(line ~ "^#")
{
if(line ~ "^#EXTINF:\d+,(?:.*? - )?(.*?)$") songName = regex_captures[1];
}
else
{
if(!songName) songName = line ^ "^(?:.*\\)(.*)$/$1";
songArray.append(songName);
songName = "";
}
}
RemoteController.showSortedMenu("Songs", songArray);
RemoteController.store[0] = stBrowseAll;
}
else if(ExecuteData.input == emBrowseArtists)
{
if(window.sendMessageTimeout(0x400, 0, 120, timeout, -1) == -1)
{
// Shit.. problems!
showDialog = true;
RemoteController.store[0] = stNormal;
}
m3uName = window.moduleFileName ^ "^(.*)\.exe$/$1.m3u/i";
m3uFile = new Reader(m3uName);
artistDictionary = new Dictionary;
artistName = "";
songName = "";
index = 0;
while(m3uFile.isReadable())
{
line = m3uFile.readLine();
if(!line) continue;
if(line ~ "^#")
{
if(line ~ "^#EXTINF:\d+,(?:(.*?) - )?(.*?)$")
{
artistName = regex_captures[1];
songName = regex_captures[2];
}
}
else
{
if(!artistName) artistName = "<Unknown artist>";
if(!songName) songName = line ^ "^(?:.*\\)(.*)$/$1";
if(!artistDictionary.hasKey(artistName)) artistDictionary.insert(artistName, new Array(0));
data = new Array(2);
data[0] = songName;
data[1] = index;
artistDictionary[artistName].append(data);
artistName = "";
songName = "";
index += 1;
}
}
// Now build artist array
artistArray = new Array(0);
artist = artistDictionary.enumerate;
while(artist) artistArray.append(artist.nextKey);
RemoteController.showMenu("Artists", artistArray);
RemoteController.store[0] = stBrowseArtists;
RemoteController.store[1] = artistDictionary;
}
else if(ExecuteData.input == emSearch)
{
RemoteController.store[0] = stSearch;
showDialog = true;
}
}
}
else if(RemoteController.store[0] == stBrowseAll)
{
if(ExecuteData.type == etBack)
{
showDialog = true;
RemoteController.store[0] = stExtraMenu;
}
else if(ExecuteData.type == etIntegerInput)
{
// Stop
window.sendMessageTimeout(0x111, 40047, 0, timeout, -1);
// Set play list pos
window.sendMessageTimeout(0x400, ExecuteData.input, 121, timeout, -1);
// Start play
window.sendMessageTimeout(0x111, 40045, 0, timeout, -1);
// Return to info display
showDialog = true;
RemoteController.store[0] = stNormal;
RemoteController.startTimer(500);
}
}
else if(RemoteController.store[0] == stBrowseArtists)
{
if(ExecuteData.type == etBack)
{
showDialog = true;
RemoteController.store[0] = stExtraMenu;
}
else if(ExecuteData.type == etIntegerInput)
{
artist = RemoteController.store[1].enumerate;
for(i = 0; i < ExecuteData.input; i += 1) artist.nextKey;
artistName = artist.nextKey;
if(artistName == "")
{
showDialog = true;
RemoteController.store[0] = stExtraMenu;
}
else
{
songList = new Array(0);
artistData = RemoteController.store[1][artistName];
for(i = 0; i < artistData.size; i += 1) songList.append(artistData[i][0]);
RemoteController.showMenu(artistName, songList);
RemoteController.store[0] = stBrowseArtistSongs;
RemoteController.store[2] = RemoteController.store[1][artistName];
}
}
}
else if(RemoteController.store[0] == stBrowseArtistSongs)
{
if(ExecuteData.type == etBack)
{
// Now build artist array
artistArray = new Array(0);
artist = RemoteController.store[1].enumerate;
while(artist)
{
artistArray.append(artist.nextKey);
}
RemoteController.showMenu("Artists", artistArray);
RemoteController.store[0] = stBrowseArtists;
}
else if(ExecuteData.type == etIntegerInput)
{
songIndex = RemoteController.store[2][ExecuteData.input][1];
// Stop
window.sendMessageTimeout(0x111, 40047, 0, timeout, -1);
// Set play list pos
window.sendMessageTimeout(0x400, songIndex, 121, timeout, -1);
// Start play
window.sendMessageTimeout(0x111, 40045, 0, timeout, -1);
// Return to info display
showDialog = true;
RemoteController.store[0] = stNormal;
RemoteController.startTimer(500);
}
}
else if(RemoteController.store[0] == stSearch)
{
if(ExecuteData.type == etBack)
{
showDialog = true;
RemoteController.store[0] = stExtraMenu;
}
else if(ExecuteData.type == etTextInput)
{
StringInput = ExecuteData.input;
if(String.length(StringInput) < 2)
{
RemoteController.showDialog("Search must be 2 characters or greater");
RemoteController.store[0] = stSearchError;
}
else
{
if(window.sendMessageTimeout(0x400, 0, 120, timeout, -1) == -1)
{
// Shit.. problems!
showDialog = true;
RemoteController.store[0] = stNormal;
}
m3uName = window.moduleFileName ^ "^(.*)\.exe$/$1.m3u/i";
m3uFile = new Reader(m3uName);
songArray = new Array(0);
match = false;
songName = "";
index = 0;
SearchString = (StringInput ^ "[^A-Za-z0-9 ]+//g") # "/i";
while(m3uFile.isReadable())
{
line = m3uFile.readLine();
if(!line) continue;
if(line ~ "^#")
{
if(line ~ "^#EXTINF:\d+,(?:(.*?) - )?(.*?)$") songName = regex_captures[2];
if(line ~ SearchString) match = true;
}
else
{
if(!songName) songName = line ^ "^(?:.*\\)(.*)$/$1";
if(line ~ SearchString) match = true;
if(match)
{
data = new Array(2);
data[0] = songName;
data[1] = index;
songArray.append(data);
}
songName = "";
match = false;
index += 1;
}
}
if(songArray.size == 0)
{
RemoteController.showDialog("No songs found");
RemoteController.store[0] = stSearchError;
}
else
{
// Now build artist array
menuArray = new Array(0);
for(i = 0; i < songArray.size; i += 1) menuArray.append( songArray[i][0] );
RemoteController.showSortedMenu("Search: " # StringInput, menuArray);
RemoteController.store[0] = stSearchList;
RemoteController.store[1] = songArray;
}
}
}
}
else if(RemoteController.store[0] == stSearchError)
{
if(ExecuteData.type == etBack || ExecuteData.type == etNext)
{
showDialog = true;
RemoteController.store[0] = stSearch;
}
}
else if(RemoteController.store == stSearchList)
{
if(ExecuteData.type == etBack)
{
showDialog = true;
RemoteController.store[0] = stSearch;
}
else if(ExecuteData.type == etIntegerInput)
{
songIndex = RemoteController.store[1][ExecuteData.input][1];
// Stop
window.sendMessageTimeout(0x111, 40047, 0, timeout, -1);
// Set play list pos
window.sendMessageTimeout(0x400, songIndex, 121, timeout, -1);
// Start play
window.sendMessageTimeout(0x111, 40045, 0, timeout, -1);
// Return to info display
showDialog = true;
RemoteController.store[0] = stNormal;
RemoteController.startTimer(500);
}
}
if(showDialog)
{
if(!window)
{
RemoteController.showDialog("Press OK to launch WinAMP");
}
else if(RemoteController.store[0] == stNormal ||
RemoteController.store[0] == stFastForward ||
RemoteController.store[0] == stRewind)
{
if(window.name ~ "\d+\.\s+(.+?)(?: - (.+?))?\s*- Winamp(?:\s*?\[(.+)\])?")
{
if(regex_captures[2]) text = regex_captures[2] # crlf # regex_captures[1];
else text = regex_captures[1];
}
else
{
text = window.name;
}
time = window.sendMessageTimeout(0x400, 0, 105, timeout, -1);
if(time != -1)
{
time = time / 1000;
text #= crlf # asInteger(time/60) # ":" # asBaseNString(time%60, 10, 2);
time = window.sendMessageTimeout(0x400, 1, 105, timeout, -1);
if(time != -1)
{
text #= "/" # asInteger(time/60) # ":" # asBaseNString(time%60, 10, 2);
}
}
text #= crlf # "(* for help)";
RemoteController.showDialog(text);
}
else if(RemoteController.store[0] == stHelp)
{
Text = "OK: Play/Pause" # crlf #
"Menu: Extras" # crlf #
"c: Stop" # crlf #
"+,-: Volume Up/Down" # crlf #
"Left,Right: Rewind/Fast Forward" # crlf #
"Up,Down: Previous/Next Track" # crlf #
"1: Change Volume";
if(Windows.findWindow("Winamp AL")) Text #= crlf # "4,6: Previous/Next Album";
RemoteController.showText("WinAMP", Text);
}
else if(RemoteController.store[0] == stVolume)
{
// Nothing.. Already done.
}
else if(RemoteController.store[0] == stVolumeNoTimeout)
{
// Nothing.. Already done.
}
else if(RemoteController.store[0] == stExtraMenu)
{
MenuItems = new Array(0);
MenuItems.append("Search...");
MenuItems.append("Browse all");
MenuItems.append("Browse all sorted");
MenuItems.append("Browse by artist");
RemoteController.showMenu("WinAMP", MenuItems);
}
else if(RemoteController.store[0] == stBrowseAll)
{
// Nothing.. already done
}
else if(RemoteController.store[0] == stBrowseArtists)
{
// Nothing.. already done
}
else if(RemoteController.store[0] == stBrowseArtistSongs)
{
// Nothing.. already done
}
else if(RemoteController.store[0] == stSearch)
{
RemoteController.showTextInput("Search...");
}
else if(RemoteController.store[0] == stSearchError)
{
// Nothing.. already done
}
else
{
RemoteController.showDialog("Internal error - unknown state");
}
}
//***************************************************************************
