Skip to main content


Please note that most of the software linked on this forum is likely to be safe to use. If you are unsure, feel free to ask in the relevant topics, or send a private message to an administrator or moderator. To help curb the problems of false positives, or in the event that you do find actual malware, you can contribute through the article linked here.
Recent Posts
3rd Party Plugins - (fb2k) / Re: foobar2000 DeskBand Controls
Last post by Foojuan -
Finally got this beauty to work & loving it. Just 1 thing i need help with...
I have it setup to use just play/pause & next. I was able to reduce the empty space on the right side but can't seem to do the same on the left side. Any help would be so much appreciated,
By default the left side is where album art picture is placed. If you don't need it, you can turn it off and move buttons to the left by setting their X coordinate respectively (starting from 0 for very left side).
You're a saint, Thank You! Works perfectly. ;))
3rd Party Plugins - (fb2k) / Re: foo_queuecontents - View and edit queue
Last post by da yuyu -
This new beta release fixes most issues related to the preference panel.
Final v2.0 should be almost ready.

Queue Editor v2.0 Beta 3


- Preference page: Field add/remove actions revised.
- Preference page: Reset and Apply.
- Column auto-size revision.

Whats new:

- Preference page: New list control context menu.
- General preference page layout revisions.

Mixing fixed and auto-sized columns probably works unusually.
In order to set an auto-sized 'Queue item' field surrounded by two fixed-sized fields:

- Disable the context menu auto-size option.
- Remove all header columns.
- Add fixed-sized column 'Queue index'.
- Enable auto-size in the context menu.
- Add auto-sized column 'Queue item'
- Disable auto-size.
- Add a fixed-sized column 'Codec'.

3rd Party Plugins - (fb2k) / Re: Biography Discussion
Last post by regor -
That's pretty weird yep.
The code is clear about using that though, for any album (and tab)
Also checked the fullURLWithPath variable, and it's the same than the on found at  the original URL.
Code: [Select]
function(e, t = {
  scroll: !0,
  toggle: !0
}) {
  let i = $(this);
  if (!0 === t.scroll && (window.location.hash = "review"), !"tabContent")) {
    let e = protocol + urlSubdomain + "" + fullURLWithPath + "/reviewAjax";
    $('<div class="tabContent review"><div class="loading"></div></div>').insertAfter(this), fetch(e, {
      cache: "no-store"
    }).then((function(e) {
      return e.text()
    })).then((e => {
      document.querySelector("").innerHTML = e, "no-scroll" === scroll_v7 && ramp.que.push((function() {
          selectorId: "reviewLB",
          type: "leaderboard_btf"
        }]).then((() => {
  handleTabClick(i, t), setActiveSidebarNavItem("review")

So it must be something related to the fetch part yep.
3rd Party Plugins - (fb2k) / Re: Biography Discussion
Last post by regor -
Not going to touch biography code unless I wanna spend an entire day to get what's going on, just to find the single line of code to build an URL xd Also it probably needs somre rework to properly parse the new source.
Have enough on my side, not gonna happen.

Maybe TT wants to do it, who has done some work before on Wil-B's cripts.
3rd Party Plugins - (fb2k) / Re: Biography Discussion
Last post by regor -
Wonder what have I won:
User review:!-mw0000019690/userReviewsAjax

Code: [Select]
function onStateChange(timer, resolve, reject, func = null) {
if (this !== null && timer !== null) { // this is xmlhttp bound
if (this.readyState === 4) {
clearTimeout(timer); timer = null;
if (this.status === 200) {
if (func) {return func(this.responseText);}
else {resolve(this.responseText);}

} else {
if (!func) {reject({status: this.status, responseText: this.responseText});}
} else if (!func) {reject({status: 408, responseText: this.responseText})}; // 408 Request Timeout
return null;

// May be used to async run a func for the response or as promise
function send({method = 'GET', URL, body = void(0), func = null, requestHeader = [/*[header, type]*/], bypassCache = false}) {
const p = new Promise((resolve, reject) => {
let timer = null;
const xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
// Add ('&' + new Date().getTime()) to URLS to avoid caching
URL + (bypassCache
? (/\?/.test(URL) ? '&' : '?') + new Date().getTime()
: '')
requestHeader.forEach((pair) => {
if (!pair[0] || !pair[1]) {console.log('HTTP Headers missing: ' + pair); return;}
if (bypassCache) {
xmlhttp.setRequestHeader('Cache-Control', 'private');
xmlhttp.setRequestHeader('Pragma', 'no-cache');
timer = setTimeout((xmlhttp) => {
timer = null;
if (!func) { // 408 Request Timeout
let status = 408;
try {status = xmlhttp.status;} catch(e) {}
reject({status, responseText: 'Request Timeout'});
}, 30000, xmlhttp);
xmlhttp.onreadystatechange = onStateChange.bind(xmlhttp, timer, resolve, reject, func);
xmlhttp.send(method === 'POST' ? body : void(0));
return p;

send({method: 'GET', URL: "!-mw0000019690/reviewAjax", func: fb.ShowPopupMessage.bind(fb)});