Список разделов › foobar2000 › Секреты foobar2000
// ==PREPROCESSOR==
// @name "Rating & File attributes (JScript Panel)"
// @author "kgena_ua"
// @version "12112017"
// @feature "v1.4"
// @feature "watch-metadb"
// ==/PREPROCESSOR==
// foo_playcount.dll required
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)); }
function getRed(color) {return ((color >> 16) & 0xff);}
function getGreen(color) {return ((color >> 8) & 0xff);}
function getBlue(color) {return (color & 0xff);}
function RGBA_color(c) {
return RGBA(getRed(c), getGreen(c), getBlue(c), b_hover_alpha);
}
var font_name = window.GetProperty(" text: font name", "Arial");
var font_size = window.GetProperty(" text: font size", 10);
var font_style = window.GetProperty(" text: font style", 0);
var font;
get_font();
function get_font(){
font = gdi.Font(font_name, font_size, font_style);
}
var ww, wh;
var fso = new ActiveXObject("Scripting.FileSystemObject");
DT_LEFT = 0x00000000;
DT_CENTER = 0x00000001;
DT_VCENTER = 0x00000004;
DT_SINGLELINE = 0x00000020;
DT_WORD_ELLIPSIS = 0x00040000;
MF_ENABLED = 0x00000000;
MF_GRAYED = 0x00000001;
MF_SEPARATOR = 0x00000800;
IDC_HAND = 32649;
IDC_ARROW = 32512;
ColorTypeCUI = {
text: 0,
selection_text: 1,
inactive_selection_text: 2,
background: 3,
selection_background: 4,
inactive_selection_background: 5,
active_item_frame: 6
}
ColorTypeDUI = {
text: 0,
background: 1,
highlight: 2,
selection: 3
}
function get_color(){
if (window.InstanceType == 0){
bgcolor = window.GetColorCUI(ColorTypeCUI.background);
color1 = window.GetColorCUI(ColorTypeCUI.text);
color2 = window.GetColorCUI(ColorTypeCUI.selection_text);
color_error = RGB(255,100,0);
} else if (window.InstanceType == 1) {
bgcolor = window.GetColorDUI(ColorTypeDUI.background);
color1 = window.GetColorDUI(ColorTypeDUI.text);
color2 = window.GetColorDUI(ColorTypeDUI.highlight);
color_error = RGB(255,100,0);
}
window.Repaint();
}
get_color();
function on_colors_changed(){
get_color();
}
String.prototype.repeat = function(n) {
return new Array(n + 1).join(this);
}
window.SetProperty(" - user", "");
if (window.GetProperty(" - user") != "" ) window.SetProperty(" - user", "");
window.SetProperty("-".repeat(50), "");
if (window.GetProperty("-".repeat(50)) != "" ) window.SetProperty("-".repeat(50), "");
var rating = 0, TAGrating, DBrating, nrating = 0;
var rating_mode = window.GetProperty("rating_mode", 0);
var set_rating_5 = window.GetProperty("set rating 5", false);
var x_text = window.GetProperty(" text: x", 0);
var y_text = window.GetProperty(" text: y", 0);
var text = window.GetProperty(" text", true);
var x_star = window.GetProperty(" star: x (0 - HCENTER)", 0);
var y_star = window.GetProperty(" star: y (0 - VCENTER)", 0);
var x_s, y_s;
var star_size = window.GetProperty(" star: size", 20);
var offset = window.GetProperty(" star: offset (percent of star size)", 20) / 100 * star_size;
var shadow = window.GetProperty(" shadow", true);
var fade_effect = window.GetProperty("fade effect", true);
var no_rating_transparent = window.GetProperty(" no rating img transparent (0-255)", 120);
var file, file_attr, readwrite;
var lbtn_down = false;
var on_mouse = false;
var tooltip = window.GetProperty(" tooltip", true);
var tooltip_on = false;
var tooltip_text;
var tooltip_timer;
var selection_mode = window.GetProperty("selection mode", 0);
var t_type;
var metadb;
var count;
on_item_focus_change();
function on_paint(gr){
!window.IsTransparent && gr.FillSolidRect(0, 0, ww, wh, bgcolor);
x_s = x_star > 0 ? x_star + star_size / 2: (ww - (star_size + offset) * 4) / 2;
y_s = y_star > 0 ? y_star + star_size / 2 : wh / 2;
if (!lbtn_down) r_color = fb.IsPlaying ? color2 : color1;
if (lbtn_down) r_color = readwrite ? fb.IsPlaying ? color2 : color1 : color_error;
for (var i = 0; i < 5; i++) {
x_d = x_s + (i * (star_size + offset));
!tooltip_on && star(gr, x_d, y_s, star_size, true, 0, color1, false, bgcolor, no_rating_transparent);
!tooltip_on && star(gr, x_d, y_s, star_size, true, 0, r_color, shadow, bgcolor, star_alpha[i]);
}
h_t = gr.CalcTextHeight("000", font);
w_t = gr.CalcTextWidth("000", font);
y_t = y_text > 0 ? y_text : y_s - h_t * 0.5;
x_t = x_text > 0 ? x_text : x_s - star_size / 2 - w_t;
text && gr.DrawString( rating_mode == 0 ? "db" : "tag" , font, RGBA_color(color1), x_t, y_t, ww, wh);
tooltip_on && draw_tooltip(gr);
gr.GdiDrawText( "", font, RGB(255,255,200), 20, 10, ww, wh );
}
function getNRating(posx) {
nrating = Math.ceil(( posx + star_size / 2 - x_s ) / (star_size + offset ));
if (nrating > 5) nrating = 5;
if (nrating < 0) nrating = 0;
if (nrating != 0) nrating = set_rating_5 ? 5 : nrating;
}
function getRating(){
if ( count > 1 ) {
TAGrating = 0;
DBrating = 0;
for (var i = 0; i < count; i++) {
item = plman.GetPlaylistSelectedItems(plman.ActivePlaylist).Item(i);
DBrating += parseInt(fb.TitleFormat("$if2(%rating%, 0)").EvalWithMetadb(item));
TAGrating += parseInt(fb.TitleFormat("$if2($meta(rating), 0)").EvalWithMetadb(item));
}
rating = rating_mode == 0 ? DBrating : TAGrating;
rating = Math.round(rating / count);
} else {
DBrating = fb.TitleFormat("$if2(%rating%,0)").EvalWithMetadb(metadb);
TAGrating = fb.TitleFormat("$if2($meta(rating),0)").EvalWithMetadb(metadb);
rating = rating_mode == 0 ? DBrating : TAGrating;
}
}
function setRating(){
if ((nrating != rating) && metadb) {
if (rating_mode == 0) {
if (count > 1) {
for (var i = 0; i < count; i++) {
item = plman.GetPlaylistSelectedItems(plman.ActivePlaylist).Item(i);
fb.RunContextCommandWithMetadb("Playback Statistics/Rating/" + (nrating == 0 ? "<not set>" : nrating), item);
}
} else{
fb.RunContextCommandWithMetadb("Playback Statistics/Rating/" + (nrating == 0 ? "<not set>" : nrating), metadb);
}
rating = nrating;
}
if (rating_mode == 1) {
if (count > 1) {
for (var i = 0; i < count; i++) {
item = plman.GetPlaylistSelectedItems(plman.ActivePlaylist).Item(i);
item_path = fb.Titleformat("%path%").EvalWithMetadb(item);//
try {
file = fso.GetFile(item_path);
var file_attr = parseInt(file.Attributes);
} catch(e) {};
var item_rw = file_attr == 32 ? true : false;
if (item_rw) {
var handle = item;
var handles = fb.CreateHandleList();
handles.Add(handle);
handles.UpdateFileInfoFromJSON(JSON.stringify({ "Rating" : nrating == 0 ? "" : nrating }));
handles.Dispose();
rating = nrating
}
}
} else {
if (readwrite){
var handle = metadb;
var handles = fb.CreateHandleList();
handles.Add(handle);
handles.UpdateFileInfoFromJSON(JSON.stringify({ "Rating" : nrating == 0 ? "" : nrating }));
handles.Dispose();
rating = nrating
}
}
}
}
if (!readwrite && rating_mode == 1) {
tooltip && info_tooltip();
}
}
function on_mouse_lbtn_up(x,y){
lbtn_down = false;
setRating();
check_star_state();
}
function on_mouse_lbtn_down(x,y) {
lbtn_down = true;
tooltip && clear_tooltip_timer();
getNRating(x);
check_star_state();
window.Repaint();
}
function on_mouse_mbtn_up(){
nrating = 0;
setRating();
}
function on_mouse_move(x, y) {
on_mouse = true;
window.SetCursor(IDC_HAND);
if (lbtn_down){
getNRating(x);
}
button_change_state();
check_star_state();
window.Repaint();
}
function on_mouse_leave() {
on_mouse = false;
button_leave_change_state();
window.SetCursor(IDC_ARROW);
window.Repaint();
}
function on_mouse_wheel(delta) {
tooltip && clear_tooltip_timer();
if (delta > 0) {rating_mode = 0};
if (delta < 0) {rating_mode = 1};
window.SetProperty("rating_mode", rating_mode);
on_item_focus_change();
window.Repaint();
}
function on_playlist_switch() {
on_item_focus_change();
}
function on_playback_new_track() {
on_item_focus_change();
}
function on_playback_stop() {
on_item_focus_change();
}
function on_selection_changed(metadb) {
on_item_focus_change();
}
function on_item_focus_change() {
switch (selection_mode) {
case 0:
metadb = fb.IsPlaying ? fb.GetNowPlaying() : fb.GetFocusItem();
break;
case 1:
metadb = fb.GetFocusItem();
break;
}
if (metadb) on_metadb_changed();
}
function on_metadb_changed() {
count = plman.GetPlaylistSelectedItems(plman.ActivePlaylist).Count;
if (metadb) {
rating_mode = window.GetProperty("rating_mode") == 0 ? 0 : 1;
getRating();
check_star_state();
get_file_attr();
}
window.Repaint();
}
function on_size(){
ww = window.Width;
wh = window.Height;
}
function on_mouse_rbtn_up (x, y){
var _menu = window.CreatePopupMenu();
_menu.AppendMenuItem(MF_ENABLED, 10, "Prefer now playing");
_menu.AppendMenuItem(MF_ENABLED, 11, "Follow selected track");
_menu.CheckMenuRadioItem(10, 11 , selection_mode + 10);
_menu.EnableMenuItem(selection_mode + 10, 1);
_menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
_menu.AppendMenuItem(MF_ENABLED, 20, "Store Ratings in the database");
_menu.AppendMenuItem(MF_ENABLED, 21, "Store Ratings in the file tags");
_menu.CheckMenuRadioItem(20, 21, rating_mode + 20);
_menu.EnableMenuItem(rating_mode + 20, 1);
_menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
_menu.AppendMenuItem(MF_ENABLED, 30, "Set Rating 5");
_menu.CheckMenuItem(30, set_rating_5);
switch (file_attr) {
case 32:
txt = "to read - only";
break;
case 33:
txt = "to read - write";
break;
default:
txt = "";
}
MF_STRING = txt ? MF_ENABLED : MF_GRAYED;
_menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
_menu.AppendMenuItem(MF_STRING, 40, "Change file attributes " + txt);
_menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
_menu.AppendMenuItem(MF_ENABLED, 50, "Fade effect");
_menu.CheckMenuItem(50, fade_effect);
_menu.AppendMenuItem(MF_SEPARATOR, 0, 0);
_menu.AppendMenuItem(MF_ENABLED, 100, "Properties");
_menu.AppendMenuItem(MF_ENABLED, 200, "Configure...");
ret = _menu.TrackPopupMenu(x + 20, y - 20);
if (ret == 0) return;
switch (ret) {
case 10:
case 11:
selection_mode = ret - 10;
window.SetProperty("selection mode", selection_mode);
on_item_focus_change();
break;
case 20:
case 21:
rating_mode = ret - 20;
window.SetProperty("rating_mode", rating_mode);
on_item_focus_change();
break;
case 30:
window.SetProperty("set rating 5", !set_rating_5);
set_rating_5 = window.GetProperty("set rating 5");
break;
case 40:
switch (file_attr) {
case 32:
if (metadb) change_file_attr(33); //read only
on_item_focus_change();
break;
case 33:
if (metadb) change_file_attr(32); //read write
on_item_focus_change();
break;
}
break;
case 50:
window.SetProperty("fade effect", !fade_effect);
fade_effect = window.GetProperty("fade effect");
break;
case 100:
window.ShowProperties();
break;
case 200:
window.ShowConfigure();
break;
}
_menu.Dispose();
return true;
}
function get_file_attr() {
t_type = track_type(metadb.RawPath);
file_attr = 0;
if (t_type == "file") {
for (var i = 0; i < count; i++) {
item = plman.GetPlaylistSelectedItems(plman.ActivePlaylist).Item(i);
item_path = fb.Titleformat("%path%").EvalWithMetadb(item);
try {
file = fso.GetFile(item_path);
file_attr += parseInt(file.Attributes);
} catch(e) {};
}
file_attr = Math.round(file_attr / count);
}
var file_read_only = file_attr == 32 ? false : true;
var file_cue = t_type == "cue" ? true : false;
var stream = t_type == "stream" ? true : false;
tooltip_text = file_cue ? " cue file " : file_read_only && t_type == "file" ? " file" + (count > 1 ? "s are " : " is ") + "read only " : stream ? " stream " : "";
if ((file_cue || file_read_only || stream) && rating_mode == 1 ) {
readwrite = false;
} else {
readwrite = true;
}
}
function change_file_attr(k) {
t_type = track_type(metadb.RawPath);
if (t_type == "file") {
for (var i = 0; i < count; i++) {
item = plman.GetPlaylistSelectedItems(plman.ActivePlaylist).Item(i);
item_path = fb.Titleformat("%path%").EvalWithMetadb(item);
try {
file = fso.GetFile(item_path);
file.Attributes = k;
} catch(e) {};
}
}
}
function star(gr, x, y, img_size, fill, line_thickness, color, sh, sh_color, alpha){
var radius = img_size / 2;
var radius_2 = radius / 2.61803;
line_thickness = line_thickness >= radius_2 ? radius_2 : line_thickness;
var delta = line_thickness / 2 * Math.tan(72 / 180 * Math.PI);
var points = [], sh_points = [];
var x_points_1 = [], y_points_1 = [], x_points_2 = [], y_points_2 = [];
for (var i = 0; i < 10; i++) {
if (i % 2 == 0) {
x_points_1.push((radius - delta) * Math.cos(Math.PI * i / 10 * 2 - Math.PI / 2));
y_points_1.push((radius - delta) * Math.sin(Math.PI * i / 10 * 2 - Math.PI / 2));
} else {
x_points_2.push((radius - delta) / 2.61803 * Math.cos(Math.PI * i / 10 * 2 - Math.PI / 2));
y_points_2.push((radius - delta) / 2.61803 * Math.sin(Math.PI * i / 10 * 2 - Math.PI / 2));
}
}
for (var i = 0; i < 5; i++) {
points.push(x_points_1[i] + radius, y_points_1[i] + radius, x_points_2[i] + radius, y_points_2[i] + radius);
sh_points.push(x_points_1[i] + radius + 1, y_points_1[i] + radius + 1, x_points_2[i] + radius + 1, y_points_2[i] + radius + 1);
}
var img = gdi.CreateImage(img_size, img_size);
var temp_gr = img.GetGraphics();
temp_gr.SetSmoothingMode(2);
if (line_thickness > 0) {
sh && temp_gr.DrawPolygon(sh_color, line_thickness, sh_points);
temp_gr.DrawPolygon(color, line_thickness, points);
}
if (fill && line_thickness == 0) {
sh && temp_gr.FillPolygon(sh_color, 1, sh_points);
temp_gr.FillPolygon(color, 1, points)
}
gr.DrawImage(img, x - radius, y - radius, img_size, img_size, 0, 0, img_size, img_size, 0, alpha);
img.ReleaseGraphics(temp_gr);
img.Dispose();
temp_gr = null;
img = null;
}
function track_type(p) {
var type;
if (p.indexOf("file") >= 0 && p.indexOf("cue") >= 0){
type = "cue";
} else if (p.indexOf("file") >= 0){
type = "file";
} else if (p.indexOf("cdda") >= 0){
type = "cdda";
} else if (p.indexOf('://') >= 0 || p.indexOf('www') >= 0 || p.indexOf("youtube") >= 0 || p.indexOf("video") >= 0 || p.indexOf("vimeo") >= 0){
type = "stream";
} else {
type = "";
}
return type;
}
var b_hover_state, b_hover_alpha = 0;
var star_state = [];
var star_alpha = [];
check_star_state();
var b_timer_started = false;
function check_star_state() {
star_state = [];
for (var i = 0; i < 5; i++) {
r = lbtn_down ? nrating : rating;
if (i < r) {star_state[i] = 1} else (star_state[i] = 0);
}
if (!b_timer_started) button_alpha_timer();
}
function button_change_state() {
if (!b_timer_started) button_alpha_timer();
b_hover_state = 1;
}
function button_leave_change_state() {
if (b_hover_state != 0) {
b_hover_state = 0;
}
}
function button_alpha_timer() {
b_timer_started = true;
var on_step = 51;
var off_step = 20;
b_timer = window.SetInterval(function() {
switch (b_hover_state) {
case 0:
b_hover_alpha = fade_effect ? Math.max(0, b_hover_alpha -= off_step) : 0;
break;
case 1:
b_hover_alpha = fade_effect ? Math.min(255, b_hover_alpha += on_step) : 255;
break;
}
for (var i = 0; i < 5; i++) {
if (!star_alpha[i]) star_alpha[i] = 0;
switch (star_state[i]) {
case 0:
star_alpha[i] = fade_effect ? Math.max(0, star_alpha[i] -= off_step) : 0;
break;
case 1:
star_alpha[i] = fade_effect ? Math.min(255, star_alpha[i] += on_step) : 255;
break;
}
}
window.Repaint();
if (!on_mouse){
var tmp_off = [];
var tmp_on = [];
for(var i = 0; i < star_alpha.length; i++) {
if (star_state[i] != 1) tmp_off.push(star_alpha[i]);
if (star_state[i] == 1) tmp_on.push(star_alpha[i]);
}
if (b_hover_alpha <= 0 && Math.max.apply(null, tmp_off) <= 0 && Math.min.apply(null, tmp_on) >= 255){
window.ClearInterval(b_timer);
b_timer_started = false;
}
}
}, 30);
}
function info_tooltip() {
tooltip_on = true;
window.Repaint();
tooltip_timer && window.ClearTimeout(tooltip_timer);
tooltip_timer = window.SetTimeout(function() {
tooltip_on = false;
window.Repaint();
tooltip_timer && window.ClearTimeout(tooltip_timer);
}, 1000);
}
function clear_tooltip_timer(){
if (tooltip_timer){
tooltip_on = false;
window.ClearInterval(tooltip_timer);
}
}
function draw_tooltip(gr){
w_tt = 4 * (star_size + offset) + star_size;
x_tt = x_s - star_size / 2;
h_tt = gr.CalcTextHeight("0", font) + 2;
y_tt = y_s - h_tt * 0.5;
gr.GdiDrawText( tooltip_text, font, color1, x_tt, y_tt, w_tt, h_tt, DT_SINGLELINE | DT_CENTER | DT_VCENTER | DT_WORD_ELLIPSIS);
}
function print(msg) {
fb.trace(msg);
}
Работает, сохраняет и в базу и в теги нормально,kgena_ua:Надо тестировать.
Вот и славно. Осталось сделать поддержку одновременно WSH Panel и JScript PanelAliado_71:сохраняет и в базу и в теги нормально
Я вчера проверял на ХР, на радио в БД пишет без проблем. А что есть несовместимость? Или ограничение по IE9?kgena_ua:Осталось сделать поддержку одновременно WSH Panel и JScript Panel
на JS v1.2.4 при записи в тег выдало ошибку:
Объект не поддерживает свойство или метод "CreateHandleList
MC Web:Похоже этот компонент скоро только на WIN10 будет работать.
Правильно назвал кнопки кнопками....что-бы ответить нужно иметь такую-же сборку, а так навскидку....это очень просто меняется в скрипте, где прописаны эти кнопки, там у них только поменять значения по горизонтали, а не нужную кнопку сначала закомментировать (двойным слэшем), затем удалить строки которые к ней относятся. Правой по кнопкам, Splitter Settings > Script. В окне скрипта ищешь строчки, которые относятся к кнопкам, типаdrobovik:У меня получилось только "выключить" отображение ненужной панели, но пустое место осталось - я его показал стрелочкой.
Ну и чтоб два раза не вставать - как можно поменять местами эти панели-кнопки?
- Спойлер
Терминологию я подтяну. Сегодня впервые занимаюсь "фубаростроительством". Хотя скорее это "фубаронастройка".vladj:Правильно назвал кнопки кнопками....
Это сборка catrox_1_april_2014__by_extremehuntervladj:что-бы ответить нужно иметь такую-же сборку
AHAPXICT:Правильно MC Web сказалMC Web:Похоже этот компонент скоро только на WIN10 будет работать.
Делал стресс тесты недавно для с JScript Panel v1.3.X успешно пройдены в отличии от с JScript Panel v1.2.X , с которой были ранее описанные проблены ,пока не планирую переходить на последнюю версию панели JS
Посмотрел, только не понял, а в чем разница от такого же скрипта для DarkOne 3.0 - 4.0?AHAPXICT:ты смотрел этот скрипт(DarkOne4Mod v1)? Оцени проделанную работу, запустить можно и на v4 на панели WSH, достаточно строку // @import заменить на свою.
Я сжато писал и толком не объяснил. Разницы не какой, tedgo тут не причём, Марк удалил из последней версии JS панели рендер текста, ну и естественно удалил его из скрипта исправленного под последнюю версию панели, теперь при переключении вообще не отображается название типа обложки. Ну ты понял о чём я)))MC Web:Посмотрел, только не понял, а в чем разница от такого же скрипта для DarkOne 3.0 - 4.0?
AHAPXICTs, у тебя есть желание каждую неделю скрипты переделывать, которые между собой тупо не совместимы не в какой последовательности?
Вернуться в Секреты foobar2000