Скрипты для foo_uie_wsh_panel_mod

Список разделов foobar2000 Секреты foobar2000

Описание: Кнопочки, конфиги, секреты, советы.

Сообщение #121 Nikolaich » 20.01.2014, 14:40

kgena_ua:команду для скрипта в WHS Panel Mod
звиняй! каков вопрос, не такой ответ :fie:
WHS Panel Mod использую только готовые, и всего 2-а: seek и volume,
из-за ограничений в размерах других соответствующих окон:
при изменении размеров окна фу нужно ковырять их настройки, что для мя вовсе неприемлемо!
Nikolaich M
Откуда: Пермь
Репутация: 16
С нами: 15 лет 6 месяцев

Сообщение #122 CGGB » 22.01.2014, 21:50

Есть last.fm панель из конфига Damask by so_kindly, как заставить её работать и с радио?
CGGB
Аватара
Репутация: 2
С нами: 12 лет 2 месяца

Сообщение #123 vladj » 22.01.2014, 22:20

Никак отдельно, или скрипт переделывать или конфиг тот ставить. Ведь ошибка указывает на то, что нет путей к skins\\Damask\\images\\lastfm.
Т.е в сборке, в папке скинов нужна папка Damask, в ней папка images, в ней папка lastfm. У тебя есть они ? То-то и оно.
Плюс там в конце скрипта должна быть регистация на ЛастФМ и отдадут-ли что они сомнительно, ибо не бессеребренники и зарабатывают на пользователях,
типа даром, только за амбаром, а у них платить нужно. И даже не факт, что скрипт заработает, если делался давно, при старых библиотеках и если
не совпадёт foo_uie_wsh_panel_mod. Но я не последняя истина, возможно ошибаюсь .
vladj M
Аватара
Откуда: Пермский край
Репутация: 427
С нами: 14 лет 9 месяцев

Сообщение #124 CGGB » 23.01.2014, 15:23

Вы совсем не туда) Вопрос лишь как заставить её работать с потоками? Эта панель не реагирует на радио. И всё) Всё остальное нормально.
CGGB
Аватара
Репутация: 2
С нами: 12 лет 2 месяца

Сообщение #125 kgena_ua » 24.01.2014, 14:04

Добрый день.
В своих скриптах использую "эффект fading".
Т.е. есть переменная on_mouse, которая принимает значения true или false в зависимости от события.
При изменении значения переменной on_mouse запускается "таймер", который плавно изменяет какое-то значение. Вроде все нормально работает.
А вопрос следующий.
Иногда происходит такое: открыл окно Foobar(а) и вижу что функция таймера "отключилась" - скрипт не отрабатывает условие, хотя
в тестовой строке (gr.DrawString( on_mouse, ..... ) я вижу, что переменная on_mouse меняет свое значение при наступлении события.
Решается перезапуском Foobar(а). Но.
На работе (XP) и все вроде нормально, а дома (7) происходят такие глюки.
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 11 лет 7 месяцев

Сообщение #126 onv » 25.01.2014, 03:39

К T.P.Wang-у по поводу косяков в 1.5.6 сто лет назад приставали. Но он давно забил на WSH PM. Поэтому, если не жизненно необходимы новые фишки, появившиеся в 1.5.6, имеет смысл откатиться на стабильную 1.5.4
onv M
Откуда: Харьков
Репутация: 52
С нами: 12 лет 6 месяцев

Сообщение #127 kgena_ua » 02.02.2014, 17:47

Добрый день.
Решил заняться "рейтингом" на WSH. Запись в базу и чтение из базы работает.
Запись рейтинга в тег тоже вроде получилось.
Вопрос такой: как прочитать рейтинг из тега.
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 11 лет 7 месяцев

Сообщение #128 kgena_ua » 03.02.2014, 19:21

Если будут желающие, нужно протестировать код для wsh panel mod - rating.
В директорию foobar\ положить папку rating.
Сомнения вызывает запись рейтинга или в базу или в тег (прав.кл. - меню).
Может нужно записывать и туда и туда сразу.
Или какие комбинации вы подскажете.
Код: Выделить всё
//ColorTypeCUI = { background: 3,};
//var bgcolor = window.GetColorCUI(ColorTypeCUI.background);

function RGB(r,g,b) { return (0xff000000|(r<<16)|(g<<8)|(b)); }
function RGBA(r, g, b, a) { return ((a << 24) | (r << 16) | (g << 8) | (b)); }
var font = gdi.Font("Arial",11,1);

//var path = fb.ProfilePath + "\\maybe\\textures\\rating\\";
var path = fb.ProfilePath + "\\rating\\";

var pos;
var offset = 20;
var img_nrating;
var img_rating;

var g_drag = false;
var on_mouse = false;

var rating;
var TAGrating;
var DBrating;
var nrating = 0;
var rating_m;

var g_metadb;

on_item_focus_change();

getNRating = function() {
    if (fb.IsPlaying) {   
        nrating = Math.ceil(( pos - offset ) / 14 );
        if ( nrating > 5 ) nrating = 5;
        if ( nrating < 0 ) nrating = 0;
        return nrating;
    }
}
getDBrating = function() {
    if (g_metadb) {
        DBrating = fb.TitleFormat("%rating%").EvalWithMetadb(g_metadb);
        if (DBrating == "?") DBrating = 0;
    }
    return DBrating;
}

getTAGrating = function() {
    if (g_metadb) {
        var fileinfo = g_metadb.GetFileInfo();
        var idx = fileinfo.MetaFind("rating");
        var TAGrating = fileinfo.MetaValue(idx, 0);
    }
    return TAGrating;
}

var fading = true;

function on_paint(gr){
   
    ww = window.Width;   
   wh = window.Height;
//    gr.FillSolidRect (0, 0, ww, wh, bgcolor);
    gr.FillSolidRect (0, 0, ww, wh, RGB(30,30,30));

    rating_m = window.GetProperty("Rating Mode", 0);
       
    rating =  rating_m == 0 ? getDBrating() : getTAGrating();
       
    if (fb.IsPlaying) {   
        gr.DrawImage( gdi.Image( path + "fon.png" ) , offset, 0, 80, 14, 0, 0, 80, 14, 0, 255 );
       
        if (rating > 0) {   
            img_rating = gdi.Image( path + ("rating_" + rating + ".png") );   
            gr.DrawImage( img_rating, offset, 0, 80, 14, 0, 0, 80, 14, 0, 255 );
        }   

        if (nrating > 0) {   
            img_nrating = gdi.Image( path + ("nrating_" + nrating + ".png") );   
            gr.DrawImage( img_nrating, offset, 0, 80, 14, 0, 0, 80, 14, 0, fader );   
        }   

        if (g_drag && fading) {fader = Fader_on();}
        if (!g_drag && fading) {fader = Fader_off();}
    }
//    gr.DrawString( "nr" + nrating + " tr" + getTAGrating()+ " dbr" + getDBrating() + " r" + rating + " " + rating_m , font, RGBA(255,255,200,255), 1, 8, ww, wh, 0 );
}

function on_mouse_lbtn_up(x,y){
    if (fb.IsPlaying) {   
        if (rating_m == 0) {
            fb.RunContextCommandWithMetadb( "Playback Statistics/Rating/" + ((nrating == 0) ? "<not set>" : nrating),g_metadb) ;
        } else {
            g_metadb.UpdateFileInfoSimple("Rating", (nrating == 0) ? "" : nrating);
        }
        fb.RunMainMenuCommand('View/Columns playlist/Activate now playing');
    }
    g_drag = false;
}   

function on_mouse_wheel(delta){}

function on_mouse_lbtn_down(x,y) {
    g_drag = true;
    if (!fading) { if (g_drag){fader = 255} else {fader = 0}};
    pos = x;
    nrating = getNRating();
    window.Repaint();   
}   

function on_mouse_move(x, y) {   
    on_mouse = true;   
    if (!fading) { if (g_drag) {fader = 255} else {fader = 0}};
    window.SetCursor(32649);   
    if (g_drag){   
        pos = x;
        nrating = getNRating();   
    }   
    window.Repaint();   
}   

function on_mouse_leave() {   
    window.SetCursor(32512);   
    on_mouse = false;   
   on_metadb_changed()
}   

function on_item_focus_change() {   
   if (g_metadb) window.UnwatchMetadb();   
   g_metadb = fb.IsPlaying ? fb.GetNowPlaying() : fb.GetFocusItem();   
   if (g_metadb) {   
      on_metadb_changed();
      window.WatchMetadb(g_metadb);
   }
}      

function on_metadb_changed() {      
}      

function on_playback_new_track(g_metadb) {      
   on_item_focus_change();   
}

function on_mouse_rbtn_up (x, y){      

    var _menu = window.CreatePopupMenu();
    var ret = 1;

//    var MF_ENABLED = 0x00000000;
//    var MF_GRAYED = 0x00000001;
//    MF_STRING = rating == 0 ? MF_GRAYED : MF_ENABLED;
//    _menu.AppendMenuItem(MF_STRING, ret++, "Remove Rating");

    _menu.AppendMenuItem(0x00000000, ret++, "Store ratings in the database");
    _menu.AppendMenuItem(0x00000000, ret++, "Store ratings in the file tags");
    _menu.AppendMenuItem(0x00000800, 0, 0);
    _menu.AppendMenuItem(0x00000000, 3, "Configure...");
 
    _menu.CheckMenuRadioItem(1, ret, rating_m + 1);      
   _menu.EnableMenuItem(rating_m + 1, 1);      

    ret = _menu.TrackPopupMenu(x, y);
    if (ret == 0) return;

    switch (ret) {
    case 1:
        window.SetProperty("Rating Mode", 0);
        break;
    case 2:
        window.SetProperty("Rating Mode", 1);
        break;
    case 3:
        window.ShowConfigure();      
        break   
    }
    return true;
}

var fader = 0;
var fading_step = 5;
var g_timer;
var g_timer_refresh = 1;

Fader_on = function() {
    window.ClearInterval(g_timer);
    g_timer = window.SetInterval(function(){
        fader = fader + fading_step ;         
        if (fader >= 255) {fader = 255; window.ClearInterval(g_timer)}
        window.Repaint();
    }, g_timer_refresh);
    return fader;
}
   
Fader_off = function() {
    window.ClearInterval(g_timer);
    g_timer = window.SetInterval(function(){
        fader = fader - fading_step ;               
        if (fader <= 0) { fader = 0; window.ClearInterval(g_timer)}
        window.Repaint();
    }, g_timer_refresh);
    return fader;
}

Вложения
rating.rar
(14.23 КБ) Скачиваний: 554
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 11 лет 7 месяцев

Сообщение #129 kgena_ua » 16.02.2014, 00:47

Новый скрипт для wsh panel mod - rating.
Основное отличие - используется всего два файла png с изображениями (можно заменить на свои).
Выбор рейтинга происходит при нажатой лев.кл., что более удобно и контролируемо. :smile:
Код: Выделить всё
//ColorTypeCUI = { background: 3,};
//var bgcolor = window.GetColorCUI(ColorTypeCUI.background);

function RGB(r,g,b) { return (0xff000000|(r<<16)|(g<<8)|(b)); }
function RGBA(r, g, b, a) { return ((a << 24) | (r << 16) | (g << 8) | (b)); }
var font = gdi.Font("Arial",7,1);
var font_2 = gdi.Font("Arial",25,1);


//var path = fb.ProfilePath + "\\maybe\\textures\\rating\\";
var path = fb.ProfilePath + "\\rating\\";

var img_bg = gdi.Image( path + "rating_bg.png");
var img_nrating = gdi.Image( path + "nrating.png");

var posx;
var posy;
var col = 20;
//var width;
var col_img;
var row = 0;
//var height;
var offset = 15;

var g_drag = false;
var on_mouse = false;

var rating;
var TAGrating;
var DBrating;
var nrating = 0;
var rating_m;
var text;

var g_metadb;

on_item_focus_change();

getNRating = function() {
    if (fb.IsPlaying) {   
        nrating = Math.ceil(( pos - col ) / offset );
        if ( nrating > 5 ) nrating = 5;
        if ( nrating < 0 ) nrating = 0;
        return nrating;
    }
}
getDBRating = function() {
    if (g_metadb) {
        DBrating = fb.TitleFormat("%rating%").EvalWithMetadb(g_metadb);
        if (DBrating == "?") DBrating = 0;
    }
    return DBrating;
}

getTAGRating = function() {
    if (g_metadb) {
        var fileinfo = g_metadb.GetFileInfo();
        var idx = fileinfo.MetaFind("rating");
        var TAGrating = fileinfo.MetaValue(idx, 0);
        if (TAGrating == "") TAGrating = 0;
    }
    return TAGrating;
}

var fading = true;

function on_paint(gr){
   
    ww = window.Width;   
   wh = window.Height;
   
//    gr.FillSolidRect (0, 0, ww, wh, bgcolor);
    gr.FillSolidRect (0, 0, ww, wh, RGB(30,30,30));

    rating_m = window.GetProperty("Rating Mode", 0);
    rating =  rating_m == 0 ? getDBRating() : getTAGRating();
       
    if (fb.IsPlaying) {   
        for (var i = 0; i < (5 * offset); i = i + offset) {   
            gr.DrawImage( img_bg , col + i, row, 16, 8, 0, 0, 16, 8, 0, 255 );
        }

        for (var i = 0; i < ((g_drag ? nrating : rating) * offset); i = i + offset) {   
            gr.DrawImage( img_nrating , col + i, row, 16, 8, 0, 0, 16, 8, 0, fader );
        }
       
        text = rating_m == 0 ? "DB" : "TAG";
        gr.DrawString( text , font, RGBA(0,0,0,fader), 1, row + 1, ww, wh, 0 );
        gr.DrawString( text , font, RGBA(140,164,179,fader), 0, row + 0, ww, wh, 0 );
    }
   
    fader = fading ? fader : 255;
    if (on_mouse && fading) {fader = Fader_on();}
    if (!on_mouse && fading) {fader = Fader_off();}
//    if (g_drag && fading) {fader = Fader_on();}
//    if (!g_drag && fading) {fader = Fader_off();}
   

}

function on_mouse_lbtn_up(x,y){
   if (nrating != rating && g_metadb) {   
        if (rating_m == 0) {
            fb.RunContextCommandWithMetadb("Playback Statistics/Rating/" + ((nrating == 0) ? "<not set>" : nrating),g_metadb) ;
        } else {
            g_metadb.UpdateFileInfoSimple("Rating", (nrating == 0) ? "" : nrating);
        }
        fb.RunMainMenuCommand('View/Columns playlist/Activate now playing');
    } else {
        g_drag = false;
    }
}

function on_mouse_lbtn_down(x,y) {
    g_drag = true;
    pos = x;
    nrating = getNRating();
    window.Repaint();   
}   

function on_mouse_move(x, y) {
    on_mouse = true;
    window.SetCursor(32649);      
    if (g_drag){   
        pos = x ;
        nrating = getNRating();   
    }   
    window.Repaint();   
}   

function on_mouse_leave() {   
    on_mouse = false;
    g_drag = false;
    window.SetCursor(32512);   
//   on_metadb_changed();
}   

function on_item_focus_change() {   
   if (g_metadb) window.UnwatchMetadb();   
   g_metadb = fb.IsPlaying ? fb.GetNowPlaying() : fb.GetFocusItem();   
   if (g_metadb) {   
        on_metadb_changed();
      window.WatchMetadb(g_metadb);
   }
}

function on_metadb_changed() {
    g_drag = false;
}

function on_playback_new_track(g_metadb) {      
   on_item_focus_change();   
    var isDB = getDBRating() > 0 ? true : false;
    var isTAG = getTAGRating() > 0 ? true : false;
    if (isDB){window.SetProperty("Rating Mode", 0);}
    if (isTAG){window.SetProperty("Rating Mode", 1);}
}

function on_mouse_wheel(delta) {         
    if (delta > 0) {window.SetProperty("Rating Mode", 0);}
    if (delta < 0) {window.SetProperty("Rating Mode", 1);}
}

function on_mouse_rbtn_up (x, y){      

    var _menu = window.CreatePopupMenu();
    var i = 1;

    _menu.AppendMenuItem(0x00000000, i++, "Store ratings in the database");
    _menu.AppendMenuItem(0x00000000, i++, "Store ratings in the file tags");
    _menu.CheckMenuRadioItem(1, i, rating_m + 1);      
   _menu.EnableMenuItem(rating_m + 1, 1);   
   
    _menu.AppendMenuItem(0x00000800, 0, 0);
    var MF_ENABLED = 0x00000000;
    var MF_GRAYED = 0x00000001;
   
    isDB = getDBRating() > 0 ? true : false;
    isTAG = getTAGRating() > 0 ? true : false;
   
    var tfrom = (isDB || isTAG) ? " from" : "";
    var tDB = isDB ? " db" : "";
    var tTAG = isTAG ? " tags" : "";
    var tand = (isDB && isTAG) ? " and" : "";
   
    MF_STRING = (!isDB && !isTAG) ? MF_GRAYED : MF_ENABLED;
    _menu.AppendMenuItem(MF_STRING, i++, "Remove Rating" + tfrom + tDB + tand + tTAG);
    _menu.AppendMenuItem(0x00000800, 0, 0);
    _menu.AppendMenuItem(0x00000000, 10, "Configure...");

    ret = _menu.TrackPopupMenu(x, y);
    if (ret == 0) return;

    switch (ret) {
    case 1:
        window.SetProperty("Rating Mode", 0);
        break;
    case 2:
        window.SetProperty("Rating Mode", 1);
        break;
    case 3:
        if (isDB) {fb.RunContextCommandWithMetadb("Playback Statistics/Rating/" + "<not set>" ,g_metadb);}
        if (isTAG) {g_metadb.UpdateFileInfoSimple("Rating", "" );}
        break;
    case 10:
        window.ShowConfigure();      
        break   
    }
    return true;
}

var fader = 0;
var fading_step = 5;
var fading_step_off = 1;
var g_timer;
var g_timer_refresh = 1;

Fader_on = function() {
    window.ClearInterval(g_timer);
    g_timer = window.SetInterval(function(){
        fader = fader + fading_step ;         
        if (fader >= 255) {fader = 255; window.ClearInterval(g_timer)}
        window.Repaint();
    }, g_timer_refresh);
    return fader;
}
   
Fader_off = function() {
    window.ClearInterval(g_timer);
    g_timer = window.SetInterval(function(){
        fader = fader - fading_step_off ;               
        if (fader <= 100) { fader = 100; window.ClearInterval(g_timer)}
        window.Repaint();
    }, g_timer_refresh);
    return fader;
}
В директорию foobar положить папку rating.
Вложения
rating.rar
(12.05 КБ) Скачиваний: 581
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 11 лет 7 месяцев

Сообщение #130 вовасбрат » 16.02.2014, 08:35

kgena_ua, а возможно сделать, чтоб рейтинг мог присваиваться не только звучащему треку, но и всему выделенному альбому (как через контекстное меню Playback Statistics)?
вовасбрат M
Аватара
Откуда: ТАМБОВ
Репутация: 52
С нами: 12 лет 2 месяца

Сообщение #131 kgena_ua » 16.02.2014, 08:57

вовасбрат:рейтинг мог присваиваться не только звучащему треку, но и всему выделенному альбому
вовасбрат, пока не могу ответить, т.к. в скриптах для WHS разбираюсь до уровня того, что сам написал. :smile: Будем искать...
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 11 лет 7 месяцев

Сообщение #132 Максим » 16.02.2014, 10:19

вовасбрат
Легко:
Код: Выделить всё
var rating = 4;
var meta = fb.GetSelections();
fb.RunContextCommandWithMetadb("Playback Statistics/Rating/" + rating, meta);
Максим M
Аватара
Репутация: 93
С нами: 17 лет 7 месяцев

Сообщение #133 kgena_ua » 16.02.2014, 10:45

Максим, Это для Вас легко с Вашим опытом. :beer:
И если будет возможность ответьте, как проверить файл на "Read only". Спасибо.
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 11 лет 7 месяцев

Сообщение #134 вовасбрат » 16.02.2014, 13:44

Максим, kgena_ua, куда это надо добавить?
вовасбрат M
Аватара
Откуда: ТАМБОВ
Репутация: 52
С нами: 12 лет 2 месяца

Сообщение #135 kgena_ua » 16.02.2014, 14:12

вовасбрат, для меня это пока еще тяжело. Понимать - вроде понимаю, а ......
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 11 лет 7 месяцев

Сообщение #136 kgena_ua » 22.05.2014, 15:01

kgena_ua:как проверить файл на "Read only"
Сам спросил сам ответил. :smile:
Скрипт для проверки атрибута файла на Read only.
В данном случае просто выводится текст: "файл такой-то read only или read-write".
Для чего. При записи рейтинга в тег файла с атрибутами read - only открывается инфори.окно с текстом о невозможности ... и т.д.
Может кому пригодиться.
Код: Выделить всё
function RGB(r,g,b) { return (0xff000000|(r<<16)|(g<<8)|(b)); }
function RGBA(r, g, b, a) { return ((a << 24) | (r << 16) | (g << 8) | (b)); }
var font = gdi.Font("Arial",11,1);

var filename, path, file_attribute, text_attribute;
var g_metadb;
on_item_focus_change();

ww = window.Width;   
wh = window.Height;

function on_paint(gr){

    gr.FillSolidRect (0, 0, ww, wh, RGB(30,30,30));

    if (file_attribute == "") {
        text_attribute = "READ - ONLY";
    } else {
        text_attribute = "READ - WRITE";
    }

    gr.DrawString( filename + "  is  " + text_attribute, font, RGBA(255,255,220,255), 10, 2, ww - 20, wh, 0 );
}   

function on_item_focus_change() {
   g_metadb = fb.IsPlaying ? fb.GetNowPlaying() : fb.GetFocusItem();
    Get_attributes();
    window.Repaint();    
}

function on_playback_new_track(g_metadb) {      
   on_item_focus_change();
    window.Repaint();    
}

function Get_attributes() {
    if (g_metadb) {   
        filename = fb.Titleformat("[%filename_ext%]").EvalWithMetadb(g_metadb);
        path = fb.Titleformat("%path%").EvalWithMetadb(g_metadb);
    }
    file_attribute = utils.Glob(path,0x00000001).toArray();
}

function on_mouse_rbtn_up (x, y){      
    var _menu = window.CreatePopupMenu();
    var i = 1;

    _menu.AppendMenuItem(0x00000000, 10, "Configure...");

    ret = _menu.TrackPopupMenu(x, y);
    if (ret == 0) return;

    switch (ret) {
    case 1:
        break;
    case 2:
        break;
    case 10:
        window.ShowConfigure();      
        break   
    }
    return true;
}


kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 11 лет 7 месяцев

Сообщение #137 kgena_ua » 28.06.2014, 10:30

Это конечно мелочь :smile: , но я обратил внимание, что ползунок длительности в WSH seek bar перемещается с кратностью равной 1 сек,
т.е. рывками. Это сильно заметно если панель имеет большую ширину да еще если длительность трека невелика. В этом случае шаг
ползунка может достигать нескольких пикселей.
Покопавшись в Инете решил для себя вопрос так:
прописал функции on_playback_new_track(info) и on_playback_stop(reason) таким образом

var seek_timer;
function on_playback_new_track(info) {
seek_timer = window.SetInterval(function() {
window.Repaint();
},10 );
}

function on_playback_stop(reason) {
if(reason == 0) {
window.ClearInterval(seek_timer);
window.Repaint();
}
}


т.о. окно перерисовывается каждые 10 мс., и движение ползунка стало более плавным.
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 11 лет 7 месяцев

Сообщение #138 iprad » 04.07.2014, 12:50

Всем доброго.
Интересует функция Resize... При её использовании (допустим изображение 1344х1008 ресайзим в те-же 1344х1008) нагрузка на процессор при отрисовке уменьшается процентов на 30-35 по сравнению с отрисовкой без Resize. Что-за функция такая?
iprad M
Аватара
Репутация: 89
С нами: 11 лет 8 месяцев

Сообщение #139 iprad » 23.07.2014, 13:15

Как можно подключиться к Panel Stack Splitter через ActiveXObject ? (интересует имя)
iprad M
Аватара
Репутация: 89
С нами: 11 лет 8 месяцев

Сообщение #140 kgena_ua » 23.07.2014, 13:28

iprad, вопрос не совсем понятен, но может Вы это имели ввиду:
http://foobar2000.ru/forum/viewtopic.php?t=4839&p=41454#p41454
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 11 лет 7 месяцев

Пред.След.

Вернуться в Секреты foobar2000