// ==PREPROCESSOR==
// @import "%fb2k_profile_path%scripts\common.js"
// @import "%fb2k_profile_path%scripts\md5.js"
// @import "%fb2k_profile_path%scripts\utf8encode.js"
// @name "Biography, Last.fm main panel"
// Required for other Last.fm panels
// ==/PREPROCESSOR==
var username = utils.ReadINI(inifile, "default", "username", "");
var api_key = utils.ReadINI(inifile, "default", "api_key", "");
var lfm_secret = utils.ReadINI(inifile, "default", "secret", "");
var lfm_sk = utils.ReadINI(inifile, "default", "session_key", "");
var cache_life = utils.ReadINI(inifile, "default", "cache_life", 0);
var data_folder = utils.ReadINI(inifile, "default", "data_folder", "/");
var proxy_file = script_path + "wget.ini";
var languages = new Array("English", "日本語", "Deutsch", "Español", "Français", "Italiano", "Polski", "Português", "Руccкий", "Türkçe", "Svenska", "简体中文");
var langs = new Array("en", "jp", "de", "es", "fr", "it", "pl", "pt", "ru", "tr", "sv", "zh");
var lang = langs[window.GetProperty("language",100) - 100];
var artist = alartist = album = title = lastfm_artist = lastfm_artist_url = p_title = '';
var p_title_width = 0;
var p_title_need_calc = true;
var lfm_token = '';
var g_text = '';
var trackxml = '';
var working = 0;
var simartist_height = 0;
var simartists_height = 0;
var simartists = [];
var simartist_widths = [];
var simartist_urls = [];
var simartist_urls_ori = [];
var sc_cache = [];
var scrobbling = lfm_np_updating = false;
var sc_np_timer = null;
var sc_cache_file = fb.ProfilePath + "wsh_lfm_scrobble_cache.txt";
var need_calc_simartists_dim = true;
var g_drag = false;
var g_drag_y = 0;
var g_need_calc = true;
var g_offset = 0;
var g_textheight = 0;
var defoffset = 51;
var start_y = 0;
var dlartistart = false;
var startplay = true;
var token_timer = null;
var pf = fb.CreateProfiler("");
var pb_time = 0;
var playing = pausing = false;
var useragent = "thuan's foobar2000 lastfm wsh panels";
var g_tooltip = window.CreateTooltip();
var sc_hint_font = gdi.Font(font, 9, 0);
var p_title_font = gdi.Font(font, 16, 1);
g_tooltip.SetMaxWidth(600);
window.GetProperty("auto", true);
window.GetProperty("artistartcacherefresh", true);
window.GetProperty("offline", false);
window.GetProperty("scrobble", false);
window.GetProperty("onlymlfile", false);
window.GetProperty("walbum", true);
window.GetProperty("walbumartist", true);
window.GetProperty("wduration", true);
window.GetProperty("wtracknumber", true);
var limit = window.GetProperty("limit", 305) - 300;
var artistartsizes = ["Original", "Small", "Medium", "Large square", "Large", "Extra large"];
var artistartsizetext = ["original", "small", "medium", "largesquare", "large", "extralarge"];
var artistartsize = artistartsizetext[window.GetProperty("artistartsize",400) - 400];
var tf_artist = utils.ReadINI(inifile, "scrobbler", "tf_artist", "%artist%");
var tf_title = utils.ReadINI(inifile, "scrobbler", "tf_title", "$meta(title)");
cache_life = (!cache_life.match(/^(\d+)$/)) ? 0 : (parseInt(cache_life) * 86400000);
if (window.GetProperty("scrobble")) sc_cache_restore();
function on_notify_data(name, data) {
if (name == "getplayinginfo" && !window.GetProperty("offline")) {
get_playing_track_info(data[0], data[1]);
}
if (name == "getlastfmchart") {
refreshlastfmchart = false;
get_lastfm_chart(data[0], data[1], data[2], data[3]);
}
if (name == "refreshlastfmchart") {
refreshlastfmchart = true;
get_lastfm_chart(data[0], data[1], data[2], data[3]);
}
if (name == "getrecenttracks") {
if (!window.GetProperty("offline"))
get_recent_tracks();
else
window.NotifyOthers("recenttracks", "offline");
}
if (name == "getartistart") {
dlartistart = true;
load();
dlartistart = false;
}
if (name == "altlastfmlovedstate") {
alt_lastfm_loved_state(data[0], data[1], data[2]);
}
}
function on_timer(timer_id) {
if (token_timer && token_timer.ID == timer_id) {
window.KillTimer(token_timer) && token_timer.Dispose();
lfm_token = "";
}
if (sc_np_timer && sc_np_timer.ID == timer_id) {
window.KillTimer(sc_np_timer) && sc_np_timer.Dispose();
/*fb.trace("NP Total " + sc_cache.length + ":")
for (i in sc_cache) {
fb.trace(i + ":")
fb.trace(sc_cache[i].join("\n"));
}*/
if (fb.IsPlaying && !lfm_np_updating && !window.GetProperty("offline")) {
lfm_np_updating = true;
set_lfm_np(sc_cache.slice());
}
}
}
function on_size() {
ww = window.Width;
wh = window.Height;
reset();
}
function on_script_unload() {
if (window.GetProperty("scrobble")) sc_cache_save();
}
function on_paint(gr) {
gr.FillSolidRect( 0, 0, ww, wh, g_backcolor);
if(username.length == 0 || api_key.length != 32) {
gr.GdiDrawText("Please use the context menu to set your Last.fm username and API KEY.", g_font, g_textcolor, 0, 0, ww, wh, DT_VCENTER | DT_CENTER | DT_WORDBREAK | DT_CALCRECT | DT_NOPREFIX);
} else if(fb.IsPlaying) {
if (g_need_calc) {
calc(g_text, g_font, 6, 40, ww-16, wh - defoffset);
}
if (need_calc_simartists_dim) calc_simartists_dim();
if (simartists_height > 0) {
start_y = 40 + g_textheight - simartists_height + g_offset;
}
gr.GdiDrawText(g_text, g_font, g_textcolor, 6, g_offset + 40, ww-16, wh - g_offset - defoffset, DT_WORDBREAK | DT_NOPREFIX);
gr.FillSolidRect(0, 0, ww, 40, g_backcolor);
gr.FillSolidRect(0, wh-11, ww, 11, g_backcolor);
if (g_textheight > wh - defoffset) {
if (g_offset == 0) {
gr.GdiDrawText("▼", sc_hint_font, g_textcolor, 0, wh-12, ww, 12, DT_TOP | DT_CENTER | DT_NOPREFIX);
}
if (g_offset < 0 && g_offset > -g_textheight + wh - defoffset) {
gr.GdiDrawText("▲", sc_hint_font, g_textcolor, 0, 28, ww, 12, DT_TOP | DT_CENTER);
gr.GdiDrawText("▼", sc_hint_font, g_textcolor, 0, wh-12, ww, 12, DT_TOP | DT_CENTER);
}
if (g_offset == -g_textheight + wh - defoffset) {
gr.GdiDrawText("▲", sc_hint_font, g_textcolor, 0, 28, ww, 12, DT_TOP | DT_CENTER);
}
}
if (p_title_need_calc) {
p_title_width = gr.CalcTextWidth(p_title, p_title_font);
p_title_width = (p_title_width > ww-12) ? ww-12 : p_title_width;
p_title_need_calc = false;
}
gr.GdiDrawText(p_title, p_title_font, g_textcolor_hl, 6, 6, ww-12, 24, DT_VCENTER | DT_END_ELLIPSIS | DT_CALCRECT | DT_NOPREFIX);
gr.DrawLine(10, 29, ww-20, 29, 1, g_textcolor_hl);
gr.FillGradRect(5, 29,10, 1, 0, RGB(255,255,255), g_textcolor_hl);
gr.FillGradRect(ww-20, 29,10, 1, 0, g_textcolor_hl,RGB(255,255,255));
} else {
gr.GdiDrawText("[playback stopped]", g_font, g_textcolor, 0, 0, ww, wh, DT_VCENTER | DT_CENTER | DT_WORDBREAK | DT_CALCRECT | DT_NOPREFIX);
}
}
function on_playback_new_track(mdb) {
playing = true;
if (!pausing) pb_time += pf.Time;
pausing = false;
pb_time = Math.round(pb_time / 1000);
if (sc_cache.length > 0) {
if (window.GetProperty("scrobble")) {
entry = sc_cache[sc_cache.length-1];
if (pb_time <= 5 || entry[0] == -1)
sc_cache.pop();
else {
if (entry.length == 9) entry.push(pb_time);
if (!scrobbling && !window.GetProperty("offline")) {
//fb.trace("==============scrobble=======");
scrobbling = true;
lastfm_scrobble(get_sc_list());
}
}
} else sc_cache.pop();
}
pb_time = 0;
pf.Reset();
sc_cache_add(mdb, pb_start_time = Math.round(Date.parse(Date()) / 1000));
g_metadb && g_metadb.Dispose();
g_metadb = mdb;
alartist = fb.TitleFormat("%album artist%").EvalWithMetadb(g_metadb);
album = fb.TitleFormat("%album%").EvalWithMetadb(g_metadb);
title = fb.TitleFormat("%title%").EvalWithMetadb(g_metadb);
if (startplay) {
artist = fb.TitleFormat("%artist%").EvalWithMetadb(g_metadb);
load();
return;
}
if (artist == fb.TitleFormat("%artist%").EvalWithMetadb(g_metadb)) return;
artist = fb.TitleFormat("%artist%").EvalWithMetadb(g_metadb);
load();
}
function on_playback_seek() {
pb_time += pf.Time;
pf.Reset();
}
function on_playback_pause(state) {
if (state) {
pb_time += pf.Time;
if (pb_time <= 5000)
sc_np_timer && window.KillTimer(sc_np_timer) && sc_np_timer.Dispose();
pausing = true;
} else {
if (pb_time <= 5000)
sc_np_timer = window.CreateTimerTimeout(5000 - pb_time);
pausing = false;
pf.Reset();
}
}
function on_playback_edited() {
if (artist != fb.TitleFormat("%artist%").EvalWithMetadb(g_metadb)) load();
if (!window.GetProperty("scrobble")) return;
if (artist != fb.TitleFormat("%artist%").EvalWithMetadb(g_metadb) || alartist != fb.TitleFormat("%album artist%").EvalWithMetadb(g_metadb) || album != fb.TitleFormat("%album%").EvalWithMetadb(g_metadb) || title != fb.TitleFormat("%title%").EvalWithMetadb(g_metadb)) {
artist = fb.TitleFormat(tf_artist).EvalWithMetadb(g_metadb);
alartist = fb.TitleFormat("%album artist%").EvalWithMetadb(g_metadb);
album = fb.TitleFormat("%album%").EvalWithMetadb(g_metadb);
title = fb.TitleFormat(tf_title).EvalWithMetadb(g_metadb);
entry = sc_cache[sc_cache.length-1];
entry[1] = false;
entry[3] = album;
entry[4] = alartist;
entry[5] = artist;
entry[7] = title;
if (!lfm_np_updating && !window.GetProperty("offline")) {
lfm_np_updating = true;
set_lfm_np(sc_cache.slice());
}
}
}
function on_playback_stop(reason) {
if (reason == 0) startplay = true;
if (reason != 2) {
sc_np_timer && window.KillTimer(sc_np_timer) && sc_np_timer.Dispose();
if (reason != 3) playing = false;
if (!pausing) pb_time += pf.Time;
pausing = false;
pb_time = Math.round(pb_time / 1000);
if (window.GetProperty("scrobble")) {
entry = sc_cache[sc_cache.length-1];
if (pb_time <= 5 || entry[0] == -1)
sc_cache.pop();
else {
if (entry.length == 9) entry.push(pb_time);
}
} else sc_cache.pop();
window.Repaint();
}
}
function get_playing_track_info(tartist, ttitle) {
if (username.length == 0 || api_key.length != 32) return(fb.trace("Can't contact Last.fm. Check your username / API KEY settings."));
var listeners = 0;
var playcount = 0;
var userplaycount = 0;
var userloved = 0;
var lfm_artist = '';
var lfm_track = '';
trackxmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
qs = "&method=track.getinfo&autocorrect=1&username=" + username + "&artist=" + encodeURIComponent(tartist) + "&track=" + encodeURIComponent(ttitle);
trackxmlhttp.open("GET", "http://ws.audioscrobbler.com/2.0/?api_key=" + api_key + "&user=" + username + qs + "&s=" + Math.random(), true);
trackxmlhttp.setRequestHeader('User-Agent', useragent);
trackxmlhttp.send();
trackxmlhttp.onreadystatechange = function() {
if (trackxmlhttp.readyState == 4) {
if (trackxmlhttp.status == 200) {
trackxml = trackxmlhttp.responseText;
var trackxmldom= new ActiveXObject("Microsoft.XMLDOM");
trackxmldom.async="false";
trackxmldom.loadXML(trackxml);
try {
lfm_artist = trackxmldom.getElementsByTagName("artist")[0].childNodes[0].childNodes[0].nodeValue;
} catch (e) {};
try {
lfm_track = trackxmldom.getElementsByTagName("track")[0].childNodes[1].childNodes[0].nodeValue;
} catch (e) {};
try {
listeners = trackxmldom.getElementsByTagName("listeners")[0].childNodes[0].nodeValue;
} catch (e) {};
try {
playcount = trackxmldom.getElementsByTagName("playcount")[0].childNodes[0].nodeValue;
} catch (e) {};
try {
userplaycount = trackxmldom.getElementsByTagName("userplaycount")[0].childNodes[0].nodeValue;
} catch (e) {};
try {
userloved = trackxmldom.getElementsByTagName("userloved")[0].childNodes[0].nodeValue;
} catch (e) {};
} else {
fb.trace(trackxmlhttp.responseText);
}
window.NotifyOthers("playingtrack", [lfm_artist, lfm_track, listeners, playcount, userplaycount, userloved]);
}
}
}
function get_lastfm_chart(method, type, period, charts_folder) {
if(username.length == 0 || api_key.length != 32) return(fb.trace("Last.fm Charts: Can't contact Last.fm. Check your username / API KEY settings."));
top_el = method.substring(3).toLowerCase();
filename = charts_folder + "\\" + username+ "_" + type + "_" + period + ".xml";
ranks = new Array();
names = new Array();
name_widths = new Array();
tt_texts = new Array();
playcounts = new Array();
urls = new Array();
artists = new Array();
if(fso.fileExists(filename)) {
file = fso.Getfile(filename);
if((refreshlastfmchart || (Date.parse(Date()) - Date.parse(file.DateLastModified) > 86400000)) && !window.GetProperty("offline")) {
refreshlastfmchart = false;
lastfm("&user=" + username + "&method=user." + method + "&period=" + period, useragent, function() {save_xml_file(filename); get_lastfm_chart(method, type, period, charts_folder);});
return;
}
chartxml = utils.ReadTextFile(filename);
if(chartxml.length > 0) {
var temp_bmp = gdi.CreateImage(1, 1);
var temp_gr = temp_bmp.GetGraphics();
var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async="false";
xmlDoc.loadXML(chartxml);
try {
var tops = xmlDoc.getElementsByTagName(top_el)[0];
for(i = 0; i < tops.childNodes.length; i++) {
var top = tops.childNodes[i];
ranks[i] = top.getAttribute("rank");
for(j = 0; j < top.childNodes.length; j++) {
if(top.childNodes[j].tagName == "url") urls[i] = top.childNodes[j].childNodes[0].nodeValue;
if(top.childNodes[j].tagName == "name") names[i] = top.childNodes[j].childNodes[0].nodeValue;
if(top.childNodes[j].tagName == "playcount") playcounts[i] = top.childNodes[j].childNodes[0].nodeValue;
if(i > 0 && playcounts[i] == playcounts[i -1]) ranks[i] = ranks[i -1];
if(type != 0 && top.childNodes[j].tagName == "artist") {
artists[i] = top.childNodes[j].childNodes[0].childNodes[0].nodeValue;
}
}
tt_texts[i] = ((artists.length > 0) ? artists[i] + " - " : "") + names[i];
name_widths[i] = temp_gr.CalcTextWidth(names[i], g_font);
}
window.NotifyOthers("lastfmchart", [ranks, names, name_widths, tt_texts, playcounts, urls]);
} catch (e) {
window.NotifyOthers("lastfmchart", [[], [], [], [], [], []]);
}
temp_bmp.ReleaseGraphics(temp_gr);
temp_bmp.Dispose();
temp_gr = null;
temp_bmp = null;
}
} else if (!window.GetProperty("offline")){
lastfm("&user=" + username + "&method=user." + method + "&period=" + period, useragent, function() {save_xml_file(filename); get_lastfm_chart(method, type, period, charts_folder);});
} else window.NotifyOthers("lastfmchart", [[], [], [], [], [], []]);
}
function get_recent_tracks() {
if(username.length == 0 || api_key.length != 32) return(fb.trace("Last.fm Charts: Can't contact Last.fm. Check your username / API KEY settings."));
var ret = "";
recentxmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
recentxmlhttp.open("GET", "http://ws.audioscrobbler.com/2.0/?api_key=" + api_key + "&user=" + username + "&method=user.getrecenttracks&limit=20" + "&s=" + Math.random(), true);
recentxmlhttp.setRequestHeader('User-Agent',useragent);
recentxmlhttp.send();
recentxmlhttp.onreadystatechange = function() {
if (recentxmlhttp.readyState == 4) {
if (recentxmlhttp.status == 200) {
recentxml = recentxmlhttp.responseText;
var recentxmldom = new ActiveXObject("Microsoft.XMLDOM");
recentxmldom.async="false";
recentxmldom.loadXML(recentxml);
try {
tracks = recentxmldom.getElementsByTagName("name");
artists = recentxmldom.getElementsByTagName("artist");
for (i = 0; i < tracks.length; i++) {
ret += zeroPad((i + 1),2) + ". " + tracks[i].childNodes[0].nodeValue + "\n";
ret += " By " + artists[i].childNodes[0].nodeValue;
if (i < tracks.length - 1) ret += "\n";
}
} catch(e) {
ret = "User " + username + " does not have a recent track information on Last.fm.";
}
} else ret = "User " + username + " does not have a recent track information on Last.fm.";
window.NotifyOthers("recenttracks", ret);
}
}
}
function get_lastfm_token(func) {
lfmtokenxmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
lfmtokenxmlhttp.open("GET", "http://ws.audioscrobbler.com/2.0/?api_key=" + api_key + "&method=auth.getToken" + "&s=" + Math.random(), true);
lfmtokenxmlhttp.setRequestHeader('User-Agent',useragent);
lfmtokenxmlhttp.send();
lfmtokenxmlhttp.onreadystatechange = function() {
if (lfmtokenxmlhttp.readyState == 4) {
if (lfmtokenxmlhttp.status == 200) {
lfmtokenxml = lfmtokenxmlhttp.responseText;
var lfmtokenxmldom = new ActiveXObject("Microsoft.XMLDOM");
lfmtokenxmldom.async="false";
lfmtokenxmldom.loadXML(lfmtokenxml);
try {
lfm_token = lfmtokenxmldom.getElementsByTagName("token")[0].childNodes[0].nodeValue;
token_timer && window.KillTimer(token_timer) && token_timer.Dispose();
token_timer = window.CreateTimerTimeout(3600000);
get_lastfm_sk(func);
} catch (e) {
fb.trace(lfmtokenxml);
}
} else {
fb.trace(lfmtokenxmlhttp.responseText);
fb.ShowPopupMessage("Unable to get last.fm token. Please check foobar2000 console for furthur information.");
}
}
}
}
function get_lastfm_sk(func) {
if (api_key.length != 32) return(fb.ShowPopupMessage("Can't contact Last.fm. Check your username / API KEY settings."));
if (lfm_secret == "") return(fb.ShowPopupMessage("Last.fm secret missing, please reenter your last.fm secret in bio panel then try again."));
if (lfm_token == "") {
get_lastfm_token(func);
return;
}
WshShell.Run("\"" + lfm_auth_vbs + "\" http://www.last.fm/api/auth/?api_key=" + api_key + "&token=" + lfm_token, 0, true);
var api_sig = md5("api_key" + api_key + "methodauth.getSessiontoken" + lfm_token + lfm_secret);
lfmskxmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
lfmskxmlhttp.open("GET", "http://ws.audioscrobbler.com/2.0/?api_key=" + api_key + "&method=auth.getSession&token=" + lfm_token + "&api_sig=" + api_sig, true);
lfmskxmlhttp.setRequestHeader('User-Agent',useragent);
lfmskxmlhttp.send();
lfmskxmlhttp.onreadystatechange = function() {
if (lfmskxmlhttp.readyState == 4) {
if (lfmskxmlhttp.status == 200) {
lfmskxml = lfmskxmlhttp.responseText;
var lfmskxmldom = new ActiveXObject("Microsoft.XMLDOM");
lfmskxmldom.async="false";
lfmskxmldom.loadXML(lfmskxml);
try {
lfm_sk = lfmskxmldom.getElementsByTagName("key")[0].childNodes[0].nodeValue;
utils.WriteINI(inifile, "default", "session_key", lfm_sk);
fb.trace("Last.fm authentication complete");
func();
} catch (e) {
fb.trace(lfmskxml);
}
} else {
fb.trace(lfmskxmlhttp.responseText);
fb.ShowPopupMessage("Unable to get last.fm session key. Please check foobar2000 console for furthur information.");
}
}
}
}
function alt_lastfm_loved_state(artist, track, love) {
if (api_key.length != 32) return(fb.ShowPopupMessage("Can't contact Last.fm. Check your username / API KEY settings."));
if (lfm_secret == "") return(fb.ShowPopupMessage("Last.fm secret missing, please reenter your last.fm secret in bio panel then try again."));
if (lfm_sk == "") {
get_lastfm_sk(function() {alt_lastfm_loved_state(artist, track, love)});
return;
}
var method = love ? "track.love" : "track.unlove";
var api_sig = md5("api_key" + api_key + "artist" + artist + "method" + method + "sk" + lfm_sk + "track" + track + lfm_secret);
lfmaltlovehttp = new ActiveXObject("Microsoft.XMLHTTP");
lfmaltlovehttp.open("POST", "http://ws.audioscrobbler.com/2.0/", true);
lfmaltlovehttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
lfmaltlovehttp.setRequestHeader('User-Agent',useragent);
lfmaltlovehttp.send("api_key=" + api_key + "&method=" + method + "&api_sig=" + api_sig + "&artist=" + encodeURIComponent(artist) + "&track=" + encodeURIComponent(track) + "&sk=" + lfm_sk);
lfmaltlovehttp.onreadystatechange = function() {
if (lfmaltlovehttp.readyState == 4) {
if (lfmaltlovehttp.status == 200) {
window.NotifyOthers("lastfmlovedstate", love);
} else {
fb.trace(lfmaltlovehttp.responseText);
}
}
}
}
function sc_cache_save() {
ts = fso.OpenTextFile(sc_cache_file, 2, true, -1);
if (playing) {
if (!pausing) pb_time += pf.Time;
pb_time = Math.round(pb_time / 1000);
if (window.GetProperty("scrobble")) {
entry = sc_cache[sc_cache.length-1];
if (pb_time <= 5 || entry[0] == -1)
sc_cache.pop();
else {
if (entry.length == 9) entry.push(pb_time);
}
} else sc_cache.pop();
}
var sc_cache_str = "";
for (i in sc_cache) {
entry = sc_cache[i];
if (entry[0] != -1 && entry.length == 10) {
sc_cache_str += entry.join(String.fromCharCode(31));
sc_cache_str += String.fromCharCode(30);
}
}
ts.Write(sc_cache_str);
ts.Close();
}
function sc_cache_restore() {
var sc_cache_str = utils.ReadTextFile(sc_cache_file, 1200);
if (sc_cache_str) {
var entries = sc_cache_str.split(String.fromCharCode(30));
for (i in entries) {
if (entries[i]) {
entry = (entries[i]).split(String.fromCharCode(31));
sc_cache.push(entry);
}
}
/*fb.trace("SC Total " + sc_cache.length + ":")
for (i in sc_cache) {
fb.trace(i + ":")
fb.trace(sc_cache[i].join("\n"));
}*/
if (!lfm_np_updating && !window.GetProperty("offline")) {
lfm_np_updating = true;
set_lfm_np(sc_cache.slice());
}
//lastfm_scrobble(get_sc_list());
}
}
function sc_cache_add(mdb, timestamp) {
var ID;
if (window.GetProperty("onlymlfile")) {
if (fb.IsMetadbInMediaLibrary(mdb))
ID = Math.random();
else
ID = -1;
} else
ID = Math.random();
var track = fb.TitleFormat(tf_title).EvalWithMetadb(mdb);
var artist = fb.TitleFormat(tf_artist).EvalWithMetadb(mdb);
var album = fb.TitleFormat("%album%").EvalWithMetadb(mdb);
var albumArtist = fb.TitleFormat("%album artist%").EvalWithMetadb(mdb);
var trackNumber = fb.TitleFormat("$meta(tracknumber)").EvalWithMetadb(mdb);
var duration = Math.round(fb.PlaybackLength);
sc_cache.push([ID, false, timestamp, album, albumArtist, artist, duration, track, trackNumber]);
if (window.GetProperty("scrobble")) {
sc_np_timer && window.KillTimer(sc_np_timer) && sc_np_timer.Dispose();
sc_np_timer = window.CreateTimerTimeout(5000);
}
}
function sc_cache_update(ID, album, albumArtist, artist, track) {
for (i = 0; i < sc_cache.length; i++) {
entry = sc_cache[i];
if (ID == entry[0]) {
entry[1] = true;
if (album) entry[3] = album;
if (albumArtist && albumArtist != entry[4]) entry[4] = albumArtist;
if (artist) entry[5] = artist;
if (track) entry[7] = track;
}
//fb.trace(entry.join("\n"))
}
}
function sc_cache_remove(ID) {
for (i = 0; i < sc_cache.length; i++) {
entry = sc_cache[i];
if (ID == entry[0]) sc_cache.splice(i, 1);
}
}
function set_lfm_np(entries) {
if (api_key.length != 32) return(fb.ShowPopupMessage("Can't contact Last.fm. Check your username / API KEY settings."));
if (lfm_secret == "") return(fb.ShowPopupMessage("Last.fm secret missing, please reenter your last.fm secret in bio panel then try again."));
if (lfm_sk == "") {
get_lastfm_sk(function() {set_lfm_np(entries)});
return;
}
if (entries.length == 0) {
lfm_np_updating = false;
return;
}
var entry = entries.shift();
if (entry[1]) {
set_lfm_np(entries);
return;
}
//fb.trace("=======================called set_lfm_np========")
var ID = entry[0];
var artist = entry[5];
var track = entry[7];
if (track == "" || artist == "?" || track == "?" || artist == "") {
set_lfm_np(entries);
return(fb.trace("Track tags are incomplete, unable to set last.fm now playing."));
}
var album = entry[3];
var albumArtist = entry[4];
var duration = entry[6];
var trackNumber = entry[8];
var api_sig_raw = "";
var qs = "";
if (album != "?" && window.GetProperty("walbum")) {
api_sig_raw += "album" + album;
qs += "album=" + encodeURIComponent(album);
}
if (albumArtist != "?" && albumArtist != artist && window.GetProperty("walbumartist")) {
api_sig_raw += "albumArtist" + albumArtist;
qs += "&albumArtist=" + encodeURIComponent(albumArtist);
}
api_sig_raw += "api_key" + api_key;
qs += "&api_key=" + api_key;
api_sig_raw += "artist" + artist;
qs += "&artist=" + encodeURIComponent(artist);
if (duration != 0 && window.GetProperty("wduration")) {
api_sig_raw += "duration" + duration;
qs += "&duration=" + duration;
}
api_sig_raw += "methodtrack.updateNowPlaying" + "sk" + lfm_sk;
qs += "&method=track.updateNowPlaying" + "&sk=" + lfm_sk;
api_sig_raw += "track" + track;
qs += "&track=" + encodeURIComponent(track);
if (trackNumber != "" && window.GetProperty("wtracknumber")) {
api_sig_raw += "trackNumber" + trackNumber;
qs += "&trackNumber=" + trackNumber;
}
api_sig_raw += lfm_secret
var api_sig = md5(api_sig_raw);
qs += "&api_sig=" + api_sig;
//fb.trace(qs)
lfmsetnphttp = new ActiveXObject("Microsoft.XMLHTTP");
lfmsetnphttp.open("POST", "http://ws.audioscrobbler.com/2.0/", true);
lfmsetnphttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
lfmsetnphttp.setRequestHeader('User-Agent',useragent);
lfmsetnphttp.send(qs);
lfmsetnphttp.onreadystatechange = function() {
if (lfmsetnphttp.readyState == 4) {
if (lfmsetnphttp.status == 200) {
lfmsetnpxml = lfmsetnphttp.responseText;
var lfmsetnpdom = new ActiveXObject("Microsoft.XMLDOM");
lfmsetnpdom.async="false";
lfmsetnpdom.loadXML(lfmsetnpxml);
var t_artist = t_track = t_album = t_albumArtist = "";
try {
t_artist = lfmsetnpdom.getElementsByTagName("artist")[0].childNodes[0].nodeValue;
} catch (e) {}
try {
t_track = lfmsetnpdom.getElementsByTagName("track")[0].childNodes[0].nodeValue;
} catch (e) {}
try {
t_album = lfmsetnpdom.getElementsByTagName("album")[0].childNodes[0].nodeValue;
} catch (e) {}
try {
t_albumArtist = lfmsetnpdom.getElementsByTagName("albumArtist")[0].childNodes[0].nodeValue;
} catch (e) {}
sc_cache_update(ID, t_album, t_albumArtist, t_artist, t_track)
if (entries.length == 0 && fb.IsPlaying) fb.trace("Last.fm submission: Now playing... OK");
set_lfm_np(entries);
} else {
fb.trace(lfmsetnphttp.responseText);
set_lfm_np(entries);
}
}
}
}
function get_sc_list() {
var sc_list = [];
var sc_batch = [];
var discards = [];
var c = 0;
for (i = 0; i < sc_cache.length; i++) {
entry = sc_cache[i];
if (entry[1] && entry.length == 10) {
switch (true) {
case (entry[0] == -1):
case (entry[6] < 30):
case (entry[9] < 240 && entry[9] < Math.floor(entry[6] / 2)):
case (entry[5] == "" || entry[7] == "" || entry[5] == "?" || entry[7] == "?"):
discards.push(entry[0]);
break;
default:
sc_batch.push(entry);
c++;
if (c == 50) {
sc_list.push(sc_batch.slice());
sc_batch = [];
c = 0;
}
}
}
}
sc_list.push(sc_batch);
while (discards.length > 0) {
sc_cache_remove(discards.shift());
}
return sc_list;
}
function lastfm_scrobble(sl) {
if (api_key.length != 32) return(fb.ShowPopupMessage("Can't contact Last.fm. Check your username / API KEY settings."));
if (lfm_secret == "") return(fb.ShowPopupMessage("Last.fm secret missing, please reenter your last.fm secret in bio panel to scrobble."));
if (lfm_sk == "") {
get_lastfm_sk(function() {lastfm_scrobble(sl)});
return;
}
if (sl.length == 0) {
scrobbling = false;
return;
}
var entries = sl.shift();
if (entries.length == 0) {
lastfm_scrobble(sl);
return;
}
var qs_arr = [];
var scrobbled = [];
var qs = "";
var api_sig = "";
var duration, played_t = 0;
var album, albumArtist, artist, track, trackNumber = '';
for (i = 0; i < entries.length; i++) {
entry = entries[i];
ID = entry[0];
timestamp = entry[2];
album = entry[3];
albumArtist = entry[4];
artist = entry[5];
duration = entry[6];
track = entry[7];
trackNumber = entry[8];
played_t = entry[9];
scrobbled.push(ID);
qs_arr.push("timestamp[" + i + "]" + timestamp);
qs += "×tamp[" + i + "]=" + timestamp;
if (album != "?" && window.GetProperty("walbum")) {
qs_arr.push("album[" + i + "]" + album);
qs += "&album[" + i + "]=" + encodeURIComponent(album);
}
if (albumArtist != "?" && albumArtist != artist && window.GetProperty("walbumartist")) {
qs_arr.push("albumArtist[" + i + "]" + albumArtist);
qs += "&albumArtist[" + i + "]=" + encodeURIComponent(albumArtist);
}
qs_arr.push("artist[" + i + "]" + artist);
qs += "&artist[" + i + "]=" + encodeURIComponent(artist);
if (duration != 0 && window.GetProperty("wduration")) {
qs_arr.push("duration[" + i + "]" + duration);
qs += "&duration[" + i + "]=" + duration;
}
qs_arr.push("track[" + i + "]" + track);
qs += "&track[" + i + "]=" + encodeURIComponent(track);
if (trackNumber != "" && window.GetProperty("wtracknumber")) {
qs_arr.push("trackNumber[" + i + "]" + trackNumber);
qs += "&trackNumber[" + i + "]=" + trackNumber;
}
}
qs_arr.push("api_key" + api_key);
qs = "api_key=" + api_key + qs;
qs_arr.push("methodtrack.scrobble");
qs += "&method=track.scrobble";
qs_arr.push("sk" + lfm_sk);
qs += "&sk=" + lfm_sk;
qs_arr.sort();
var api_sig = md5(qs_arr.join("") + lfm_secret);
qs += "&api_sig=" + api_sig;
//fb.trace(qs)
lfmscrobblehttp = new ActiveXObject("Microsoft.XMLHTTP");
lfmscrobblehttp.open("POST", "http://ws.audioscrobbler.com/2.0/", true);
lfmscrobblehttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
lfmscrobblehttp.setRequestHeader('User-Agent',useragent);
lfmscrobblehttp.send(qs);
lfmscrobblehttp.onreadystatechange = function() {
if (lfmscrobblehttp.readyState == 4) {
if (lfmscrobblehttp.status == 200) {
fb.trace("Last.fm submission: Scrobbled " + entries.length + " track(s)... OK");
while (scrobbled.length > 0)
sc_cache_remove(scrobbled.shift());
lastfm_scrobble(sl);
} else {
fb.trace(lfmscrobblehttp.responseText);
lastfm_scrobble(sl);
}
}
}
}
function get_playing_artistart(path, artist) {
arr = [];
arr = read_images(path);
if (arr.length > 0) {
arr.push(path);
notify_artistart(arr);
return;
}
if (!window.GetProperty("auto") || window.GetProperty("offline")) {
notify_artistart([path]);
return;
}
if (username.length == 0 || api_key.length != 32) return(fb.trace("Can't contact Last.fm. Check your username / API KEY settings."));
wget = "\"" + script_path + "wget.exe\"";
if (artist != "") {
str = utils.ReadTextFile(path + "\\blacklist.txt");
if (!str) blacklist = "";
blacklist = str.split("|");
for (i in blacklist)
blacklist[i] = blacklist[i].split("\\").pop();
artistxmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
qs = "&method=artist.getimages&autocorrect=1&limit=" + limit + "&artist=" + encodeURIComponent(artist);
artistxmlhttp.open("GET", "http://ws.audioscrobbler.com/2.0/?api_key=" + api_key + qs + "&s=" + Math.random(), true);
artistxmlhttp.setRequestHeader('User-Agent',useragent);
artistxmlhttp.send();
artistxmlhttp.onreadystatechange = function() {
if (artistxmlhttp.readyState == 4) {
working++;
window.NotifyOthers("gettingartistart", true);
if (artistxmlhttp.status == 200) {
artistxml = artistxmlhttp.responseText;
artistxmldom = new ActiveXObject("Microsoft.XMLDOM");
artistxmldom.async="false";
artistxmldom.loadXML(artistxml);
try {
nodeList = artistxmldom.getElementsByTagName("size");
ts = fso.OpenTextFile(path + "\\dllist.txt", 2, true, 0);
getfiles = [];
geturls = [];
tails = [];
for (i = 0; i < nodeList.length; i++) {
if (nodeList[i].attributes != null && nodeList[i].attributes.getNamedItem("name") != null && nodeList[i].attributes.getNamedItem("name").nodeValue == artistartsize) {
geturl = nodeList[i].childNodes[0].nodeValue;
orifilename = geturl.split("/").pop();
getfiles.push(orifilename);
geturls.push(geturl.replace(orifilename, encodeURIComponent(orifilename)));
}
}
for (i in blacklist) {
tails = blacklist[i].match(/\.(\d+)\.(jpg|png|gif)$/);
count = 0;
for (j in getfiles) {
if (tails) {
delfile = blacklist[i].replace(tails[0], "." + tails[2]);
if (delfile == getfiles[j]) {
if (count == tails[1]) {
geturls[j] = "";
break;
}
count++;
}
} else {
if (blacklist[i] == getfiles[j]) {
geturls[j] = "";
break;
}
}
}
}
ts.Write(geturls.join("\n"));
ts.close();
var pathobj = fso.GetFolder(path);
WshShell.Run(wget + " -q " + "-P \"" + pathobj.ShortPath + "\" -i \"" + pathobj.ShortPath + "\\dllist.txt\"", 0, true);
fix_wget_clobber(path);
fso.DeleteFile(path + "\\dllist.txt");
arr = read_images(path);
arr.push(path);
} catch (e) { arr = [path]; }
} else {
arr = [path];
}
working--;
if (working == 0) {
window.NotifyOthers("gettingartistart", false);
notify_artistart(arr);
}
}
}
} else notify_artistart([path]);
}
function fix_wget_clobber(path) {
if (fso.FolderExists(path)) {
var files = new Enumerator((fso.GetFolder(path)).Files);
for (; !files.atEnd(); files.moveNext()) {
fnchunks = ((files.item()).Name).match(/^(.*)\.(jpg|png|gif)\.(\d+)$/);
if (fnchunks) {
newname = fnchunks[1] + "." + fnchunks[3] + "." + fnchunks[2];
fso.MoveFile((files.item()).Path, path + "\\" + newname);
}
}
}
}
function notify_artistart(arr) {
if (!fb.IsPlaying) return;
artist_folder = data_folder + "\\" + fb.TitleFormat("$crc32(%artist%)").EvalWithMetadb(g_metadb);
if (arr[arr.length - 1] != artist_folder) {
arr = [];
arr = read_images(artist_folder);
arr.push(artist_folder);
}
window.NotifyOthers("artistart", arr);
}
function load() {
if(!g_metadb) return(window.Repaint());
startplay = false;
if (data_folder == "/") data_folder = fb.ProfilePath + "wsh_lastfm";
df_chunks = data_folder.match(/^\?(.*)$/);
if (df_chunks) {
data_folder = fb.TitleFormat(df_chunks[1]).EvalWithMetadb(g_metadb) + "\\wsh_lastfm";
}
if(!fso.FolderExists(data_folder)) fso.CreateFolder(data_folder);
lastfm_artist = ret = "";
simartist_height = 0;
simartists_height = 0;
simartists = [];
simartist_urls_ori = [];
artist_folder = data_folder + "\\" + fb.TitleFormat("$crc32(%artist%)").EvalWithMetadb(g_metadb);
if(!fso.FolderExists(artist_folder)) fso.CreateFolder(artist_folder);
filename = artist_folder + "\\artistinfo.xml";
if(fso.fileExists(filename)) {
file = fso.Getfile(filename);
if (cache_life > 0 && (Date.parse(Date()) - Date.parse(file.DateLastModified) > cache_life)) {
get(filename, artist);
if (window.GetProperty("artistartcacherefresh")) {
var arr = [];
arr = read_images(artist_folder);
arr.push(artist_folder);
window.NotifyOthers("artistart", arr);
window.NotifyOthers("refreshartistart", 1);
}
return;
}
ret = utils.ReadTextFile(filename);
if (ret.match(/^offline/)) {
if (!window.GetProperty("offline")) {
get(filename, artist);
return;
}
ret = "offline";
} else {
var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async="false";
xmlDoc.loadXML(ret);
ret = ""
getartistart = false;
try {
lastfm_artist = xmlDoc.getElementsByTagName("name")[0].childNodes[0].nodeValue;
if (lastfm_artist != artist)
ret = "(redirected from " + artist + ")\n\n";
} catch (e) { lastfm_artist = ""; }
try {
if (xmlDoc.getElementsByTagName("image")[0].childNodes[0].nodeValue != "")
getartistart = true;
} catch (e) { getartistart = false; }
if (getartistart)
get_playing_artistart(artist_folder, lastfm_artist);
else
notify_artistart([artist_folder]);
if (dlartistart) return;
try {
bioraw = xmlDoc.getElementsByTagName("content")[0].childNodes[0].nodeValue;
ret += decodeXML(bioraw);
} catch(e) {
ret += "This artist does not have a biography page on Last.fm.";
}
try {
ret += "\n\nListeners: " + xmlDoc.getElementsByTagName("listeners")[0].childNodes[0].nodeValue;
} catch (e) {}
try {
playcount = xmlDoc.getElementsByTagName("playcount")[0].childNodes[0].nodeValue;
ret += "\nPlaycount: " + playcount + (playcount > 1 ? " times" : " time");
} catch (e) {}
try {
similars = xmlDoc.getElementsByTagName("similar")[0];
if (similars.childNodes.length > 1) {
ret += "\n\nSimilar artists:\n";
for (i = 0; i < similars.childNodes.length; i++) {
simartist = (i+1) + ". " + similars.childNodes[i].childNodes[0].childNodes[0].nodeValue;
ret += simartist;
if (i < similars.childNodes.length - 1) ret += "\n";
simartists.push(simartist);
simartist_urls_ori[i] = similars.childNodes[i].childNodes[1].childNodes[0].nodeValue;
}
}
} catch (e) {}
try {
lastfm_artist_url = xmlDoc.getElementsByTagName("url")[0].childNodes[0].nodeValue;
} catch (e) { lastfm_artist_url = "http://www.last.fm/music/" + ((lastfm_artist != "") ? encodeURIComponent(lastfm_artist.replace(/\s+/g,"+")) : encodeURIComponent(artist)); }
}
reset();
g_tooltip.Text = p_title = (lastfm_artist != "") ? lastfm_artist : artist;
g_text = ret;
window.Repaint();
} else {
get(filename, artist);
}
}
function get(path, artist) {
if (username.length == 0 || api_key.length != 32) return(fb.trace("Can't contact Last.fm. Check your username / API KEY settings."));
if (!window.GetProperty("offline"))
lastfm("&lang=" + lang + "&method=artist.getinfo&artist=" + encodeURIComponent(artist) + "&autocorrect=1", useragent, function() {save_xml_file(path); load()});
else {
xmlDoc = "offline";
save_xml_file(path);
load();
}
}
function lastfm(qs, user_agent, func) {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.open("GET", "http://ws.audioscrobbler.com/2.0/?api_key=" + api_key + "&user=" + username + qs + "&s=" + Math.random(), true);
xmlhttp.setRequestHeader('User-Agent',user_agent);
xmlhttp.send();
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4) {
if (xmlhttp.status == 200) {
xmlDoc = xmlhttp.responseText;
func();
} else {
fb.trace(xmlhttp.responseText);
func();
}
}
}
}
function save_xml_file(path) {
try {
ts = fso.OpenTextFile(path, 2, true, -1);
ts.WriteLine(xmlDoc);
ts.close();
} catch(e) {
}
}
function calc_simartists_dim() {
var temp_bmp = gdi.CreateImage(1, 1);
var temp_gr = temp_bmp.GetGraphics();
t_arr = [];
simartist_widths = [];
simartist_urls = [];
for (i in simartists)
t_arr[i] = temp_gr.CalcTextWidth(simartists[i], g_font);
for (i = 0; i < t_arr.length; i++) {
if (t_arr[i] >= ww-16) {
wrapped_lines = temp_gr.EstimateLineWrap(simartists[i], g_font, ww-16).toArray();
for (j = 1; j < wrapped_lines.length; j = j + 2) {
simartist_widths.push(wrapped_lines[j]);
simartist_urls.push(simartist_urls_ori[i]);
}
} else {
simartist_widths.push(t_arr[i]);
simartist_urls.push(simartist_urls_ori[i]);
}
}
if (simartist_widths.length != 0) {
simartist_height = temp_gr.CalcTextHeight(simartist_widths[0], g_font);
simartists_height = simartist_height * simartist_widths.length;
}
need_calc_simartists_dim = false;
temp_bmp.ReleaseGraphics(temp_gr);
temp_bmp.Dispose();
temp_gr = null;
temp_bmp = null;
}
function text_input_box(title, message, section, key, value) {
WshShell.Run("\"" + inputbox + "\" \"" + title + "\" \"" + message + "\" \"" + value + "\"", 0, true);
var wshEnv = WshShell.Environment("Volatile");
var input = wshEnv("WshEnv");
if (input != "") {
utils.WriteINI(inifile, section, key, input);
return input;
}
return value;
}
function read_images(path) {
var ret = [];
if (fso.FolderExists(path)) {
var files = new Enumerator((fso.GetFolder(path)).Files);
for (; !files.atEnd(); files.moveNext()) {
if (((files.item()).Name).match(/^.*\.(jpg|png|gif)$/)) {
ret.push(path + "\\" + (files.item()).Name);
}
}
}
return ret;
}
function decodeXML(value) {
value = value.replace(/<\/?[^>]+(>|$)/g, "");
doc = new ActiveXObject("htmlfile");
doc.open();
div = doc.createElement("div");
div.innerHTML = value.replace(/\n/g, "<br>");
value = div.innerHTML;
value = value.replace(/<BR>/g,"\n");
value = value.replace(/>/g,">");
value = value.replace(/</g,"<");
value = value.replace(/ /g," ");
return value.replace(/&/g,"&");
}
function zeroPad(num,count) {
var numZeropad = num + '';
while(numZeropad.length < count) {
numZeropad = "0" + numZeropad;
}
return numZeropad;
}
function on_mouse_wheel(delta) {
if (!fb.IsPlaying) return;
applyDelta(delta * 20, defoffset);
}
function on_mouse_lbtn_down(x, y) {
g_drag = true;
g_drag_y = y;
}
function on_mouse_move(x,y) {
if (!fb.IsPlaying) {
g_tooltip.Deactivate();
window.SetCursor(IDC_ARROW);
return;
}
index = Math.floor((y - start_y - 1)/simartist_height);
switch (true) {
case (simartists_height > 0 && x > 6 && x < Math.min(ww-16, 6 + simartist_widths[index]) && y > start_y && y < start_y + simartists_height && y < wh-11):
window.SetCursor(IDC_HAND);
if (g_tooltip.Text != simartist_urls[index]) g_tooltip.Text = simartist_urls[index];
g_tooltip.Activate();
break;
case (lastfm_artist_url != "" && x > 6 && x < 6 + p_title_width && y > 6 && y < 30):
if (p_title_width >= ww - 12) {
if (g_tooltip.Text != p_title) g_tooltip.Text = p_title;
g_tooltip.Activate();
} else g_tooltip.Deactivate();
window.SetCursor(IDC_HAND);
break;
default:
g_tooltip.Deactivate();
window.SetCursor(IDC_ARROW);
}
if (fb.IsPlaying && g_drag) {
applyDelta(y - g_drag_y, defoffset);
g_drag_y = y;
}
}
function on_mouse_lbtn_up(x, y) {
g_drag = false;
if (!fb.IsPlaying) return;
if (lastfm_artist_url != "" && x > 6 && x < 6 + p_title_width && y > 6 && y < 30)
WshShell.run(lastfm_artist_url);
index = Math.floor((y - start_y - 1)/simartist_height);
if (simartists_height > 0 && x > 6 && x < Math.min(ww-16, 6 + simartist_widths[index]) && y > start_y && y < start_y + simartists_height && y < wh-11)
WshShell.run(simartist_urls[index]);
}
function on_mouse_rbtn_up(x, y) {
var _menu = window.CreatePopupMenu();
var _languages = window.CreatePopupMenu();
var _lastfm = window.CreatePopupMenu();
var _artistart = window.CreatePopupMenu();
var _artistartsize = window.CreatePopupMenu();
var _limit = window.CreatePopupMenu();
var _scrobbler = window.CreatePopupMenu();
var idx;
_menu.AppendMenuItem(username.length > 0 && api_key.length == 32 && g_metadb && !window.GetProperty("offline") && fb.IsPlaying ? MF_STRING : MF_GRAYED, 1, "Update");
_menu.AppendMenuItem(MF_STRING, 2, "Work offline");
_menu.CheckMenuItem(2, window.GetProperty("offline"));
_menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
_lastfm.AppendMenuItem(MF_STRING, 3, "Set your username");
_lastfm.AppendMenuItem(MF_STRING, 4, "Set your API KEY");
_lastfm.AppendMenuItem(MF_STRING, 5, "Set your secret");
_lastfm.AppendMenuItem(MF_SEPARATOR, 0, 0);
_lastfm.AppendMenuItem(MF_STRING, 6, "Set biography text cache life");
_lastfm.AppendMenuItem(MF_STRING, 7, "Set data folder");
_lastfm.AppendMenuItem(MF_SEPARATOR, 0, 0);
_lastfm.AppendMenuItem(MF_STRING, 8, "Enable scrobbler");
_lastfm.CheckMenuItem(8, window.GetProperty("scrobble"));
_scrobbler.AppendMenuItem(MF_STRING, 81, "Only file in media library");
_scrobbler.CheckMenuItem(81, window.GetProperty("onlymlfile"));
_scrobbler.AppendMenuItem(MF_SEPARATOR, 0, 0);
_scrobbler.AppendMenuItem(MF_GRAYED, 0, "Modification");
_scrobbler.AppendMenuItem(MF_STRING, 82, "Artist");
_scrobbler.AppendMenuItem(MF_STRING, 83, "Title");
_scrobbler.AppendMenuItem(MF_SEPARATOR, 0, 0);
_scrobbler.AppendMenuItem(MF_GRAYED, 0, "Query inclusion");
_scrobbler.AppendMenuItem(MF_STRING, 84, "Album");
_scrobbler.CheckMenuItem(84, window.GetProperty("walbum"));
_scrobbler.AppendMenuItem(MF_STRING, 85, "Album Artist");
_scrobbler.CheckMenuItem(85, window.GetProperty("walbumartist"));
_scrobbler.AppendMenuItem(MF_STRING, 86, "Track duration");
_scrobbler.CheckMenuItem(86, window.GetProperty("wduration"));
_scrobbler.AppendMenuItem(MF_STRING, 87, "Track number");
_scrobbler.CheckMenuItem(87, window.GetProperty("wtracknumber"));
_lastfm.AppendMenuItem(window.GetProperty("scrobble") ? MF_STRING | MF_POPUP : MF_GRAYED, _scrobbler.ID, "Scrobble options");
_menu.AppendMenuItem(MF_STRING | MF_POPUP, _lastfm.ID, "Last.fm options");
_artistart.AppendMenuItem(MF_STRING, 1000, "Automatically download");
_artistart.CheckMenuItem(1000, window.GetProperty("auto"));
_artistart.AppendMenuItem(MF_STRING, 1001, "Refresh artist art with biography text cache");
_artistart.CheckMenuItem(1001, window.GetProperty("artistartcacherefresh"));
for (i in artistartsizes) {
_artistartsize.AppendMenuItem(MF_STRING, 400 + parseInt(i), artistartsizes[i]);
}
_artistartsize.CheckMenuRadioItem(400, 405, window.GetProperty("artistartsize", 100));
_artistart.AppendMenuItem(MF_STRING | MF_POPUP, _artistartsize.ID, "Size");
_limit.AppendMenuItem(MF_STRING, 301, "1");
_limit.AppendMenuItem(MF_STRING, 303, "3");
_limit.AppendMenuItem(MF_STRING, 305, "5");
_limit.AppendMenuItem(MF_STRING, 310, "10");
_limit.AppendMenuItem(MF_STRING, 320, "20");
_limit.CheckMenuRadioItem(301, 320, window.GetProperty("limit"));
_artistart.AppendMenuItem(MF_STRING | MF_POPUP, _limit.ID, "Limit");
_artistart.AppendMenuItem(MF_SEPARATOR, 0, 0)
_artistart.AppendMenuItem(MF_STRING, 1002, "Wget settings")
_menu.AppendMenuItem(MF_STRING | MF_POPUP, _artistart.ID, "Artist art options");
for(i in languages) {
_languages.AppendMenuItem(MF_STRING, 100 + parseInt(i), languages[i]);
}
_languages.CheckMenuRadioItem(100, 111, window.GetProperty("language",100));
_menu.AppendMenuItem(MF_STRING | MF_POPUP, _languages.ID, "Language");
if(utils.IsKeyPressed(0x10)) {
_menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
_menu.AppendMenuItem(MF_STRING, 10, "Configure...");
}
idx = _menu.TrackPopupMenu(x, y);
switch(idx) {
case 100:
case 101:
case 102:
case 103:
case 104:
case 105:
case 106:
case 107:
case 108:
case 109:
case 110:
case 111:
window.SetProperty("language", idx);
lang = langs[window.GetProperty("language",100) - 100];
if (!fb.IsPlaying) return;
get(filename, artist);
break;
case 1:
get(filename, artist);
break;
case 2:
window.SetProperty("offline", !window.GetProperty("offline"));
if (!window.GetProperty("offline")) {
fb.IsPlaying && load();
if (!lfm_np_updating && window.GetProperty("scrobble")) {
lfm_np_updating = true;
set_lfm_np(sc_cache.slice());
}
}
break;
case 3:
username = text_input_box("Simple Biography", "Please enter your Last.fm username", "default", "username", username);
if (username != "" && api_key != "") {
fb.IsPlaying && load();
window.NotifyOthers("lastfm_account", 1);
}
break;
case 4:
api_key = text_input_box("Simple Biography", "Please enter your Last.fm API KEY\n\nhttp://www.last.fm/api/account", "default", "api_key", api_key);
if (username != "" && api_key != "") {
fb.IsPlaying && load();
window.NotifyOthers("lastfm_account", 1);
}
break;
case 5:
lfm_secret = text_input_box("Simple Biography", "Please enter your Last.fm secret\n\nhttp://www.last.fm/api/account", "default", "secret", lfm_secret);
break;
case 6:
cache_life = text_input_box("Simple Biography", "Please enter your Last.fm artist biography text cache life (in days).\n\nUse 0 to disable", "default", "cache_life", cache_life / 86400000) * 86400000;
break;
case 7:
data_folder = text_input_box("Simple Biography", "Please enter your Last.fm cache data folder.\nTo use titleformatting please prefix your string with '?'.\n\nBy default Last.fm cache data is stored in wsh_lastfm folder inside foobar profile directory (enter / to use default).", "default", "data_folder", utils.ReadINI(inifile, "default", "data_folder", "/"));
if (data_folder == "/") data_folder = fb.ProfilePath + "wsh_lastfm";
break;
case 8:
window.SetProperty("scrobble", !window.GetProperty("scrobble"));
if (!lfm_np_updating && window.GetProperty("scrobble") && !window.GetProperty("offline")) {
lfm_np_updating = true;
set_lfm_np(sc_cache.slice());
}
break;
case 81:
window.SetProperty("onlymlfile", !window.GetProperty("onlymlfile"))
break;
case 82:
tf_artist = text_input_box("Simple Biography", "Enter titleformatting string to get track title.\n\nDefault is %artist% (enter blank string to use default)", "scrobbler", "tf_artist", tf_artist);
break;
case 83:
tf_title = text_input_box("Simple Biography", "Enter titleformatting string to get artist title.\n\nDefault is $meta(title) (enter blank string to use default)", "scrobbler", "tf_title", tf_title);
break;
case 84:
window.SetProperty("walbum", !window.GetProperty("walbum"));
break;
case 85:
window.SetProperty("walbumartist", !window.GetProperty("walbumartist"));
break;
case 86:
window.SetProperty("wduration", !window.GetProperty("wduration"));
break;
case 87:
window.SetProperty("wtracknumber", !window.GetProperty("wtracknumber"));
break;
case 10:
window.ShowConfigure();
break;
case 301:
case 303:
case 305:
case 310:
case 320:
window.SetProperty("limit", idx);
limit = idx - 300;
fb.IsPlaying && window.NotifyOthers("refreshartistart", 1);
break;
case 400:
case 401:
case 402:
case 403:
case 404:
case 405:
window.SetProperty("artistartsize", idx);
artistartsize = artistartsizetext[window.GetProperty("artistartsize", 400) - 400];
fb.IsPlaying && window.NotifyOthers("refreshartistart", 1);
break;
case 1000:
window.SetProperty("auto", !window.GetProperty("auto"));
fb.IsPlaying && window.NotifyOthers("refreshartistart", 1);
break;
case 1001:
window.SetProperty("artistartcacherefresh", !window.GetProperty("artistartcacherefresh"));
break;
case 1002:
WshShell.run("notepad.exe " + proxy_file, 1, true);
fb.IsPlaying && window.NotifyOthers("refreshartistart", 1);
break;
}
_scrobbler.Dispose();
_languages.Dispose();
_limit.Dispose();
_lastfm.Dispose();
_artistartsize.Dispose();
_artistart.Dispose();
_menu.Dispose();
return true;
}