Скрипты для foo_uie_wsh_panel_mod

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

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

Сообщение #2261 Cerberus » 07.03.2018, 01:00

Aliado_71 писал(а):Cerberus, Может просто название правильно указать, cover, front, folder
Спасибо.
Cerberus
Бывалый
Репутация: 9
С нами: 1 год 11 месяцев

Сообщение #2262 Marakobes » 07.03.2018, 20:49

ура! графика сохраняется не в общий хлам, попробовал вставить часть кода, НО... скачивание идет в папку альбома, и только 6 фоток, а даунлоад лимит 20
kgena_ua писал(а):И вот тут появляются нюансы. В папку с артистом или в папку с альбомом - будут разные мнения.
как правило у пользователей в папке "Исполнитель" несколько альбомов, в альбомах самих бывают еще подпапки "CD1" не говоря уже о фанатах собирать полные дискографии. Так вот, не в каждой же папке альбома дублировать фото исполнителя? Скрипт должен подниматься наверх, сколько бы не было вложенных папок и создавать папку Images в корне, было бы здорово, если бы Вы покрутили код, жду теперь захожу почаще)))

еще бы описание сохранять не в папку с графикой, а опять же в "Артист"
Marakobes
Новичок
Репутация: 0
С нами: 6 лет 1 месяц

Сообщение #2263 kgena_ua » 14.03.2018, 11:33

Cerberus писал(а):Можно приоритет задать? при отображении обложек из папки
Занялся опять "Get Covers (Artwork) && radio logos".
По приоритету. Не понравился старый вариант. Ниже пример новой сортировки (наглядно видно)

Безымянный.png
Безымянный.png (11.09 КБ) Просмотров: 1644


Marakobes писал(а):Скрипт должен подниматься наверх, сколько бы не было вложенных папок и создавать папку Images в корне
т.е. в папку %artist%, а как ее "найти". Надо пробовать.
I.m.UR5EQF.
квартет на миллион долларов
kgena_ua M
Гуру
Аватара
Возраст: 54
Откуда: Украина, Днепр
Репутация: 424
С нами: 5 лет 6 месяцев

Сообщение #2264 vladj » 14.03.2018, 12:54

Marakobes писал(а):не в каждой же папке альбома дублировать фото исполнителя? Скрипт должен подниматься наверх, сколько бы не было вложенных папок и создавать папку Images в корне
Раньше так и делал...например более 20 альбомов любимого мной артиста и в каждом альбоме фоты штук 30 одинаковые. Легче стало с появлением скрипта от максима, где читались сканы из альбома и остальные из корня с папки с имиджем. Я Геннадию давно просьбу высказывал. Запускаем альбом и сначала читаются сканы по порядку, фронт, задняя, СД из папки с альбомом и только затем остальные из корневой папки с имиджем. Картинки у меня собраны давно и сейчас нет проблем вручную сбросить в папку скачавшиеся фоты из темпоральной.
HTPC Termaltake, eGlobal i5-7200, Asrock Beebox J3160, Onkyo 525E, цап SMSL, фронт Yamaha 8900.
vladj M
Гуру
Аватара
Откуда: Пермский край
Репутация: 353
С нами: 8 лет 8 месяцев

Сообщение #2265 kgena_ua » 14.03.2018, 16:31

vladj,
vladj писал(а):фронт
у меня cover.*, front.*, folder.* или album.* (это есть)
vladj писал(а):задняя
back.*
vladj писал(а):СД
cd.*
такие имена файлов ? Если нет, то какие.

Marakobes писал(а):Скрипт должен подниматься наверх, сколько бы не было вложенных папок и создавать папку Images в корне
"Biography, Albums, Similar and title artist info. www.last.fm"
fix


заменить одноименную функцию на
Код: Выделить всё
function artist_folder_path(n) {
    if (!n) return;
   
    if (complete_path.indexOf('http://') >= 0 ||complete_path.indexOf('youtube') >= 0 || complete_path.indexOf('cdda') >= 0) {
        return work_path + n;
    } else {
        var tmp_arr = [], p_arr = [], p;
        tmp_arr = directory_path.split("\\");
       
        for (var i = 0; i < tmp_arr.length; i += 1) {
            if (tmp_arr[i].match(meta_artist)){
                p_arr = tmp_arr.slice(0, i + 1);
                break;
            }
        }

        p = p_arr.join("\\");
        return p + "\\" + "Images" + "\\";               
    }     
}

Добавлено спустя 24 минуты 53 секунды:
seriousstas,
фризов не вижу, я к тому, что нельзя исправить ошибку, если она есть, если она не наблюдатся
I.m.UR5EQF.
квартет на миллион долларов
kgena_ua M
Гуру
Аватара
Возраст: 54
Откуда: Украина, Днепр
Репутация: 424
С нами: 5 лет 6 месяцев

Сообщение #2266 seriousstas » 14.03.2018, 18:33

kgena_ua
фризов не вижу, я к тому, что нельзя исправить ошибку, если она есть, если она не наблюдатся
Это понимаю , но я не одинок , выше пост MC Web :
/viewtopic.php?p=68788#p68788
Предидущая версия - все "гладко" (кроме вызова из MPS) ..
А Вы тесты на радиостанциях пробовали ?
seriousstas
Мастер
Откуда: Украина , Ивано-Франковск
Репутация: 97
С нами: 3 года 8 месяцев

Сообщение #2267 MC Web » 14.03.2018, 19:09

kgena_ua, привет!

Как я понял Marakobes, хочет что то похожее на данную структуру вложений папок или похожую:

Изображение

и что бы еще отображались Фото исполнителя из папки Images (Фото исполнителя) при воспроизведении треков из вложенных папок.
MC Web
Мастер
Аватара
Репутация: 144
С нами: 5 лет 1 месяц

Сообщение #2268 kutuzof » 14.03.2018, 19:20

kgena_ua
фризов не вижу, я к тому, что нельзя исправить ошибку, если она есть, если она не наблюдатся

У меня тоже есть фризы, только при включении автоцикла, а при листании колесом нормально.

phpBB [media]
kutuzof M
Бывалый
Возраст: 31
Откуда: Орёл
Репутация: 82
С нами: 2 года 1 месяц

Сообщение #2269 MC Web » 14.03.2018, 19:22

seriousstas, привет!

Откатился на версию 15122017 - без тормозов.
MC Web
Мастер
Аватара
Репутация: 144
С нами: 5 лет 1 месяц

Сообщение #2270 vladj » 14.03.2018, 19:46

kgena_ua писал(а):такие имена файлов ? Если нет, то какие.
Ну да...это типа общепринятый стандарт в папке с альбомом у меня cover/back/cd. При запуске любого альбома у меня сразу вначале cover, а вот back и cd показываются где-то уже в середине остальных, которые в корне папки лежат в папке artwork. Вообще-то не так и критично в принципе :smile:
У меня вопрос по одному из скриптов стареньких по выводу инфы, который недавно нашел в какой-то из скачанных сборок. Меня просто завораживает смена инфы на каждом треке когда окно очищается и плавно скольжением инфа выводится снизу. Плюс там-же в панели день число, время текущее.
Так она зараза показывает инфу из треков с харда и при прослушивании инет радио только с zaycev.online и с tunnel.ru. При прослушивании станций со всех остальных плейлистов вместо имени артиста и названия трека выводится только название станции. В первом случае название станции не выводится, только артист и трек. Инфа о формате выводится в обоих случаях. И как видно из скрипта там ещё должны быть функции некоторые при работе мышью, но они не в работе. У меня из-за того, что шрифт увеличил, оставлено в строке пять пунктов из 10, которые могут быть выведены (C03.Lines.Number", 5)
Код: Выделить всё
/// fooClock 1.0 // Coded by Hunter
// "Damask Track Info Panel", version "1.1", @author "so_kindly"
// Edition by San_dr http://forum.oszone.net
// Variables {{
// Text flags
var align_top = 0;
var align_middle = 1;
var align_bottom = 2;

var align_left = 0;
var align_center = 1;
var align_right = 2;

var trim_no = 0;
var trim_chara = 1;
var trim_word = 2;
var trim_elips_chara = 3;
var trim_elips_word = 4;
var trim_elips_path = 5;

var flag_rtl = 0x0001;
var flag_vert = 0x0002;
var flag_nofit = 0x0004;
var flag_dispctrl = 0x0020;
var flag_nofallback = 0x0400;
var flag_trailspace = 0x0800;
var flag_nowrap = 0x1000;
var flag_linelimit = 0x2000;
var flag_noclip = 0x4000;

// Flags of Menu
var DT_VCENTER = 0x00000004;
var MF_SEPARATOR = 0x00000800;
var MF_GRAYED = 0x00000001;
var MF_UNCHECKED = 0x00000000;
var MF_CHECKED = 0x00000008;
var MF_STRING = 0x00000000;
var MF_POPUP = 0x00000010;
DT_CALCRECT = 0x00000400;

var MK_SHIFT = 0x0004;

var CursorFollowMode = {
   Auto: 1,
   OnlyStopped: 2,
   Always: 3,
   Never: 4
}
// globals
var ww = 0;
var wh = 0;
var whtip = 0;
var w2 = 0; // line width
var MetaDB;
var Properties = new GetProperties();

//margins
var hm = 18; // Horizontal margins. (left and right)
var tm = 5;

// text vars
FontStyles = {
   Regular: 0,
   Bold: 1,
   Italic: 2,
   BoldItalic: 3,
   Underline: 4,
   Strikeout: 8
}
var TextFont = Properties.Lines.Font;
var LineStrFmt = StrFmt(align_center, align_middle, trim_no, flag_linelimit);

// Animation vars
var RollingDistance;
var num = 0;
var WaitingForDefaultAnim;
var CompareResult = true;
var NeedCursorFollowAutoTimer;
var TotalFrames;
var RefreshInterval;
var LineDelay;
var TotalFrames2;
var Text_tops;
var Opacitys;

var Oldlines = new Array();
var Newlines = new Array();
var HoverLine;
var DownLine;
var Tooltip = window.CreateTooltip();

var MetaDBNowPlaying;
var MetaDB2NowPlaying;

var NormalColor = RGB(0, 0, 0);
var HoverColor = RGB(245, 255, 230);
var DownColor = RGB( 255, 255, 255);

var ContextMenuShowing;
var MetadbBackup;
var FOCUSFLAG;
var SkipFocusChange;
   
//timers
var CursorFollowAutoTimerID;
var WaitTimerID;
var AnimationTimerID;

window.MinHeight = 180;

//===================================================================================================================================================
// Tools {{

function StrFmt(alignH, alignV, trim, flag) {
   return ((alignH << 28) | (alignV << 24) | (trim << 20) | (StringTrimmingEllipsisWord = 4 << 20) | flag);
}
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 ApplyAlpha(color, alpha) {
   return (color & 0x00ffffff) | (((color >> 24) & 0xff) * alpha / 255 << 24)
}
 function StringFormat(name, TitleformatString, fontname, size, style, format, MinHeight, linespace) {
   this.name = name;
   this.tfString = TitleformatString; // tf string
   this.font = gdi.Font(fontname, size, style);
   this.MinHeight = MinHeight;
   this.format = format;
   this.linespace = linespace; // space AFTER the line. 
}
// Tools }}
//===================================================================================================================================================
// Properties {{

function GetProperties() {
   //A
   this.Panel = {
      CursorFollowMode: window.GetProperty("A01.Panel.CursorFollowMode", CursorFollowMode.Auto),
      AutoBackInterval: window.GetProperty("A02.Panel.AutoBackInterval", 5000),
      EnableTooltip: window.GetProperty("A03.Panel.EnableTooltip", true)
   }
   this.Panel.CursorFollowMode = Math.max(this.Panel.CursorFollowMode, CursorFollowMode.Auto);
   this.Panel.CursorFollowMode = Math.min(this.Panel.CursorFollowMode, CursorFollowMode.Never);
   window.SetProperty("A04.Panel.CursorFollowMode", this.Panel.CursorFollowMode);

   if (this.Panel.AutoBackInterval < 1000) {
      this.Panel.AutoBackInterval = 1000;
      window.SetProperty("A02.Panel.AutoBackInterval", 1000);
   }
   //B
   this.Animation = {
      RefreshInterval: window.GetProperty("B01.Animation.RefreshInterval", 4),
      Duration: window.GetProperty("B02.Animation.Duration", 1200),
      LineDelay: window.GetProperty("B03.Animation.LineDelay", 5) //Delay before each next line
   }
   if (this.Animation.Duration / this.Animation.RefreshInterva1l < this.Animation.LineDelay * 11 * 10) {
      this.Animation.Duration = this.Animation.LineDelay * 11 * 10;
      window.SetProperty("B02.Animation.Duration", this.Animation.Duration);
   }
   TotalFrames = Math.ceil(this.Animation.Duration / this.Animation.RefreshInterval);
   RefreshInterval = this.Animation.RefreshInterval; // In ms.
   LineDelay = this.Animation.LineDelay; // Frames delayed between lines.

   this.Lines = {
      Font: window.GetProperty("C01.Lines.Font", "Calibri"),
      LeftClickFunc: window.GetProperty("C02.Lines.LeftClickFunction", 1), //does nothing for now
      Number: window.GetProperty("C03.Lines.Number", 5),
      Size: window.GetProperty("C04.Lines.Size", 10)
   }
   this.Lines.Number = Math.max(this.Lines.Number, 1);
   this.Lines.Number = Math.min(this.Lines.Number, 11);
   window.SetProperty("C03.Lines.Number", this.Lines.Number);

   this.Lines.Size = Math.max(this.Lines.Size, 1);
   this.Lines.Size = Math.min(this.Lines.Size, 40);
   window.SetProperty("C04.Lines.Size", this.Lines.Size);
}
// Properties }}
//===================================================================================================================================================
// Line tools {{

function Line(StringFormat) { // Class for each line.
   this.top = 0;
   this.opacity = 255;
   this.state = 0;
   this.name = StringFormat.name;
   this.MinHeight = StringFormat.MinHeight;
   this.linespace = StringFormat.linespace;

   this.OnClick = function () {
      if (MetaDBNowPlaying) {
         if (fb.ActivePlaylist != fb.PlayingPlaylist) fb.ActivePlaylist = fb.PlayingPlaylist;
         fb.RunMainMenuCommand("Activate now playing");
      } else {
         fb.RunMainMenuCommand("Show focused item");
      }
   }
   this.Reset = function () { // Reset and renew line.
      if (MetaDB) this.text = fb.TitleFormat(StringFormat.tfString).EvalWithMetadb(MetaDB);
      else this.text = "";

      this.yOffset = 40;
      this.display = 1;
      this.Height = 40;
      this.Width = w2;
      this.textImg = null;
      if (this.text && ww && wh) {
         this.textImg = gdi.CreateImage(ww, whtip);
         this.g = this.textImg.GetGraphics();
         this.Height = Math.ceil(this.g.MeasureString(this.text, StringFormat.font, 0, 0, this.Width, this.textImg.Height, StringFormat.format).Height); // Measure text height of no clipping.
      }
   }
   this.Draw = function (gr, top) {
      if (this.text) {
         gr.SetTextRenderingHint(5);
         switch (this.state) {
            case 0:
               gr.DrawString(this.text, StringFormat.font, ApplyAlpha(NormalColor, this.opacity), hm, top + this.yOffset, this.Width, this.Height, StringFormat.format); // Draw text in gr, the quality will be much better.
               //gr.DrawRect(hm, top+this.yOffset, this.Width, this.Height, 1, RGBA(90,240,20,255));         // Show the range of text, for debuging.
               break;
            case 1:
               gr.DrawString(this.text, StringFormat.font, ApplyAlpha(HoverColor, this.opacity), hm, top + this.yOffset, this.Width, this.Height, StringFormat.format);
               break;
            case 2:
               gr.DrawString(this.text, StringFormat.font, ApplyAlpha(DownColor, this.opacity), hm, top + this.yOffset, this.Width, this.Height, StringFormat.format);
               break;
         }
      }
   }
   this.isXYok = function (x, y) {
      var result;
      if (Oldlines && Oldlines[0].display) {
         if (x >= hm && x <= window.Width - hm && y > tm + this.yOffset && y < tm + this.yOffset + this.Height) {
            result = true;
         }
      }
      return result;
   }
   this.ChangeState = function (s) { // Change to state "s".
      if (s != this.state) this.oldstate = this.state;
      this.state = s;
      window.RepaintRect(hm, this.top + this.yOffset, this.Width, this.Height + 5);
      if (s == 1 && this.text != "Track Info Panel") {
         Tooltip.Text = this.name;
         if (Properties.Panel.EnableTooltip) Tooltip.Activate();
      } else {
         Tooltip.Deactivate();
      }
   }
}
function ResetLines(lines) { // Reset and renew and rearrange all lines, and recalculate all line's height, generate new image for each line.
   var H = whtip - tm;
   var MinH = 40;
   for (var i = 0; i < lines.length; i++) {
      lines[i].Reset();
      if (lines[i].Height != 0) MinH += lines[i].MinHeight + lines[i].linespace;
   }
   for (var i = 0; i < lines.length; i++) {
      MinH -= lines[i].MinHeight;
      if (lines[i].Height == 0) {
         if (i + 1 != lines.length) lines[i + 1].yOffset = lines[i].yOffset;
      } else {
         lines[i].Height = Math.max(lines[i].MinHeight, Math.min(lines[i].Height, H - lines[i].yOffset - MinH));
         if (i + 1 != lines.length) {
            lines[i + 1].yOffset = lines[i].yOffset + lines[i].Height + lines[i].linespace;
            MinH -= lines[i].linespace;
         }
      }
   }
}
function CopyNewlinesToOldlines() {
   var i = 0;
   for (i; i < Oldlines.length; i++) {
      Oldlines[i].text = Newlines[i].text;
      Oldlines[i].textImg = Newlines[i].textImg;
      Oldlines[i].yOffset = Newlines[i].yOffset;
      Oldlines[i].Height = Newlines[i].Height;
      Oldlines[i].display = Newlines[i].display;
      Newlines[i].text = null;
      Newlines[i].textImg = null;
   }
}
// Line tools }}
//===================================================================================================================================================
// timers {{

function c_CursorFollowAutoTimer() {
   this.Stop = function () {
      if (CursorFollowAutoTimerID) {
         window.ClearTimeout(CursorFollowAutoTimerID);
         CursorFollowAutoTimerID = null;
         window.RepaintRect(0,wh-40,ww,40);///
      }
   }
   this.Start = function () {
      CursorFollowAutoTimerID = window.SetTimeout(function () {
         CursorFollowAutoTimerID = null;
         if (fb.IsPlaying) {
            MetaDB = fb.GetNowPlaying();
            MetaDBNowPlaying = true;
            StartAnimationCycle();
         }
      }, Properties.Panel.AutoBackInterval);
   }
}
function c_WaitTimer() {
   this.Stop = function () {
      if (WaitTimerID) {
         window.ClearTimeout(WaitTimerID);
         WaitTimerID = null;
         window.RepaintRect(5,40,ww-10,wh-70);
      }
   }
   this.Start = function () {
      WaitTimerID = window.SetTimeout(function () {
         WaitTimerID = null;
         StartAnimationCycle();
         if (MetaDB) {
            window.WatchMetadb(MetaDB);
         }
      }, 250);
   }
}
function c_AnimationTimer() {
   this.Stop = function () {
      if (AnimationTimerID) {
         window.ClearInterval(AnimationTimerID);
         AnimationTimerID = null;
         window.RepaintRect(5,40,ww-10,wh-70);
      }
   }
   this.Start = function () {
      AnimationTimerID = window.SetInterval(function () {
         if (num < TotalFrames) {
            for (var i = 0; i < Oldlines.length; i++) {
               if (num < TotalFrames2) {
                  Oldlines[i].top = Text_tops[num];
                  Oldlines[i].opacity = 255 - Opacitys[num];
               }
               if (num >= i * LineDelay && num < TotalFrames2 + i * LineDelay) {
                  Newlines[i].top = Text_tops[num - i * LineDelay];
                  Newlines[i].opacity = Opacitys[num - i * LineDelay];
               }
            }
            window.RepaintRect(5,40,ww-10,wh-70);
            num++;
         } else {
            num = 0;
            CopyNewlinesToOldlines();
            for (var i = 0; i < Oldlines.length; i++) {
               Oldlines[i].top = 0;
               Oldlines[i].opacity = 255;
               Newlines[i].top = 0;
            }
            AnimationTimer.Stop();
            AnimationTimerID = null;
            if (WaitingForDefaultAnim) {
               WaitingForDefaultAnim = false;
               StartAnimationCycleDefaultText();
            }
            window.RepaintRect(5,40,ww-10,wh-70);
         }
      }, RefreshInterval);
   }
}
// timers }}
//===================================================================================================================================================
// Cursor follow tools {{

function SetCursorFollowMode(FollowMode) {
   if (FollowMode != Properties.Panel.CursorFollowMode) {
      Properties.Panel.CursorFollowMode = FollowMode;
      window.SetProperty("A01.Panel.CursorFollowMode", FollowMode);
      CursorFollow(FollowMode);
   }
}
function CursorFollow(FollowMode) {
   CursorFollowAutoTimer.Stop();
   switch (FollowMode) {
      case CursorFollowMode.Auto:
         if (fb.IsPlaying) on_playback_new_track();
         else on_item_focus_change();
         break;
      case CursorFollowMode.OnlyStopped:
         if (fb.IsPlaying) on_playback_new_track();
         else on_item_focus_change();
         break;
      case CursorFollowMode.Always:
         on_item_focus_change();
         break;
      case CursorFollowMode.Never:
         if (fb.IsPlaying) on_playback_new_track();
         else on_playback_stop();
   }
}
// Cursor follow tools }}
//===================================================================================================================================================
// Context menu {{

function ShowContextMenu(x, y) {
   var menu = window.CreatePopupMenu();
   var FollowModeChild = window.CreatePopupMenu();
   var ret;

   if (CursorFollowAutoTimerID) {
      CursorFollowAutoTimer.Stop();
      NeedCursorFollowAutoTimer = true;
   }
   FollowModeChild.AppendMenuItem(MF_STRING, 1, "Auto");
   FollowModeChild.AppendMenuItem(MF_STRING, 2, "Only Stopped");
   FollowModeChild.AppendMenuItem(MF_STRING, 3, "Always");
   FollowModeChild.AppendMenuItem(MF_STRING, 4, "Never");
   FollowModeChild.CheckMenuRadioItem(1, 4, Properties.Panel.CursorFollowMode);
   FollowModeChild.AppendTo(menu, MF_STRING, "Cursor follow mode");
   menu.AppendMenuItem(MF_SEPARATOR, 0, "");
   menu.AppendMenuItem(MF_STRING, 5, "Properties");

   ret = menu.TrackPopupMenu(x, y);
   switch (ret) {
      case 1:
         SetCursorFollowMode(CursorFollowMode.Auto);
         break;
      case 2:
         SetCursorFollowMode(CursorFollowMode.OnlyStopped);
         break;
      case 3:
         SetCursorFollowMode(CursorFollowMode.Always);
         break;
      case 4:
         SetCursorFollowMode(CursorFollowMode.Never);
         break;
      case 5:
         window.ShowProperties();
         break;
   }
   menu.Dispose();
   ContextMenuShowing = null;
   // Resume CursorFollowAutoTimer, if necessary.
   if (Properties.Panel.CursorFollowMode == CursorFollowMode.Auto && !CursorFollowAutoTimerID) CursorFollowAutoTimer.Start();
   // if waiting for on_focus_change or on_playback_new_track event, launch it now
   if (MetadbBackup) {
      if (FOCUSFLAG == true) {
         on_focus_resume(MetadbBackup);
      } else {
         on_playback_new_track(MetadbBackup);
      }
   }
   MetadbBackup = null;
}
function on_focus_resume(metadb) {
   switch (Properties.Panel.CursorFollowMode) {
      case CursorFollowMode.Auto:
         if (fb.IsPlaying) {
            CursorFollowAutoTimer.Stop();
            //NeedCursorFollowAutoTimer = true;
            CursorFollowAutoTimer.Start();
         }
         MetaDB = metadb;
         MetaDBNowPlaying = false;
         WaitTimer.Stop();
         WaitTimer.Start();
         break;
      case CursorFollowMode.OnlyStopped:
         if (!fb.IsPlaying) {
            MetaDB = metadb;
            MetaDBNowPlaying = false;
            WaitTimer.Stop();
            WaitTimer.Start();
         }
         break;
      case CursorFollowMode.Always:
         MetaDB = metadb;
         MetaDBNowPlaying = false;
         WaitTimer.Stop();
         WaitTimer.Start();
         break;
      case CursorFollowMode.Never:
         break;
   }
}
// Context menu }}
//===================================================================================================================================================
// Animation tools {{

function StartAnimationCycle() {
   if (!MetaDB) { //no MetaDB - start default text anim.
      if (AnimationTimerID) {
         WaitingForDefaultAnim = true;
         return;
      } else {
         StartAnimationCycleDefaultText();
         return;
      }
   }
   if (AnimationTimerID) { //Refresh new lines if animation already running
      CopyNewlinesToOldlines();
      ResetLines(Newlines);
      return;
   }
   ResetLines(Newlines);

   for (var i = 0; i < Oldlines.length; i++) {
      if (Newlines[i].text != Oldlines[i].text) CompareResult = false;
   }
   if (!CompareResult) {
      AnimationTimer.Start();
      CompareResult = true;
   }
}
function StartAnimationCycleDefaultText() {

   if (Oldlines[0].text == "Trackinfo Panel" && !AnimationTimerID) {
      return;
   }
   if (AnimationTimerID) {
      WaitingForDefaultAnim = true;
      return;
   }
   if (HoverLine) { // Disable and reset buttons first.
      HoverLine.state = 0;
      HoverLine = undefined;
   }
   if (DownLine) {
      DownLine.state = 0;
      DownLine = undefined;
   }
   Tooltip.Deactivate();
   MetaDB = false;
   ResetLines(Newlines);
   Newlines[0].text = "Trackinfo Panel";
   Newlines[0].Height = 100;
   Tooltip.Text = "";
   AnimationTimer.Start();
}
// Animation tools }}
//===================================================================================================================================================

function on_init() {
   CursorFollowAutoTimer = new c_CursorFollowAutoTimer();
   WaitTimer = new c_WaitTimer();
   AnimationTimer = new c_AnimationTimer();

   Tooltip.SetMaxWidth(300);

   LineFormats = new Array(
   new StringFormat(
      "Название",
      "[%title%]",
   TextFont, 18 + Properties.Lines.Size, FontStyles.Regular, LineStrFmt, 19, 2),
   new StringFormat(
      "Исполнитель",
      "[%artist%]",
   TextFont, Math.round(0.8 * (22 + Properties.Lines.Size)), FontStyles.Regular, LineStrFmt, 17, 2),
   new StringFormat(
      "Альбом",
      "$if($and(%album%,%date%),%album%' - '%date%,$if(%album%,%album%,[%date%]))",
   TextFont, Math.round(0.72 * (22 + Properties.Lines.Size)), FontStyles.Regular, LineStrFmt, 17, 2),
   new StringFormat(
/*   "Дополнение",
      "[%AINFO%]",
   TextFont, Math.round(0.72 * (18 + Properties.Lines.Size)), FontStyles.Regular, LineStrFmt, 17, 2),
   new StringFormat(
 */      "Жанр",
      "[%genre%]",
   TextFont, Math.round(0.72 * (22 + Properties.Lines.Size)), FontStyles.Regular, LineStrFmt, 15, 2),
   new StringFormat(
      "Кодек",
      "[%codec%][  %codec_profile%][  $info(bitrate) кб/сек]",
   TextFont, Math.round(0.72 * (20 + Properties.Lines.Size)), FontStyles.Regular, LineStrFmt, 15, 2),
   new StringFormat(
      "Размер",
      "$if($strstr([$upper($ext(%path%))],CUE),CUE,$div(%filesize%,1048576)','$substr($muldiv(%filesize%,100,1048576),2,3)$get(t2)' Mб')",
   TextFont, Math.round(0.72 * (20 + Properties.Lines.Size)), FontStyles.Regular, LineStrFmt, 15, 2),
   new StringFormat(
      "Проиграно:",
      "$ifgreater(%play_count%,0,Played %play_count% Times, )",
   TextFont, Math.round(0.72 * (15 + Properties.Lines.Size)), FontStyles.Regular, LineStrFmt, 15, 2),
   new StringFormat(
      "Последнее проигрывание",
      "$if(%last_played%,'Last Played '$cut(%last_played%,10),)",
   TextFont, Math.round(0.72 * (15 + Properties.Lines.Size)), FontStyles.Regular, LineStrFmt, 15, 2),
   new StringFormat(
      "Нормализация уровня Трека",
      "$if(%__replaygain_track_gain%,'TG:  '$if3($replace(%__replaygain_track_gain%,' ',$get(t2)' '),'0'$get(t2)' дБ'),)",
   TextFont, Math.round(0.72 * (15 + Properties.Lines.Size)), FontStyles.Regular, LineStrFmt, 15, 2),
   new StringFormat(
      "Нормализация уровня Альбома",
      "$if(%__replaygain_album_gain%,'AG:  '$if3($replace(%__replaygain_album_gain%,' ',$get(t2)' '),'0'$get(t2)' дБ'),)",
   TextFont, Math.round(0.72 * (15 + Properties.Lines.Size)), FontStyles.Regular, LineStrFmt, 15, 2));

   TotalFrames2 = Math.ceil(TotalFrames - LineDelay * LineFormats.length);
   Text_tops = new Array(TotalFrames2);
   Opacitys = new Array(TotalFrames2);

   for (var i = 0; i < Properties.Lines.Number; i++) {
      Oldlines.push(new Line(LineFormats[i]));
      Newlines.push(new Line(LineFormats[i]));
   }
}
on_init();

function on_size() {
   if (!window.Width || !window.Height) return;
   ww = window.Width;
   wh = window.Height;
   whtip = wh-20;
   w2 = ww - 2 * hm;
   RollingDistance = Math.round(whtip * 5 / 4);
   ResetLines(Oldlines);
   CursorFollow(Properties.Panel.CursorFollowMode);
   for (var i = 0; i < TotalFrames2; i++) { // Write animation data in arrays
      Text_tops[i] = -Math.ceil((Math.cos(3.14 * ((i + 1) / TotalFrames2 + 1)) + 1) * RollingDistance / 2);
      Opacitys[i] = Math.ceil((i + 1) * 255 / TotalFrames2);
   }
}
//===================================================================================================================================================
// mouse callbacks {{

function on_mouse_move(x, y) {
   if (window.Width < 185 || window.Height < 100) return;
   
   if (DownLine) {
      if (DownLine.isXYok(x, y)) {
         if (DownLine.state != 2) DownLine.ChangeState(2);
      } else if (DownLine.state != 1) DownLine.ChangeState(1);
   } else {
      for (var i = 0; i < Oldlines.length; i++)
      if (Oldlines[i].isXYok(x, y)) {
         if (HoverLine != Oldlines[i]) {
            if (HoverLine) HoverLine.ChangeState(0);
            HoverLine = Oldlines[i];
            HoverLine.ChangeState(1);
         }
         break;
      }
      if (i == Oldlines.length) {
         if (HoverLine) {
            HoverLine.ChangeState(0);
            HoverLine = undefined;
         }
      }
   }
}
function on_mouse_lbtn_down(x, y) {
   if (window.Width < 185 || window.Height < 100) return;
   if (HoverLine) {
      DownLine = HoverLine;
      DownLine.ChangeState(2);
   }
}
function on_mouse_lbtn_up(x, y) {
   if (window.Width < 185 || window.Height < 100) return;
   if (DownLine) {
      if (DownLine.state == 2) {
         DownLine.OnClick();
         DownLine.ChangeState(1);
      }
      DownLine = undefined;
      on_mouse_move(x, y);
   }
}
function on_mouse_leave() {
   if (window.Width < 185 || window.Height < 100) return false;
   if (HoverLine) {
      HoverLine.ChangeState(0);
      HoverLine = undefined;
   }
}
function on_mouse_rbtn_down(x, y, vkey) {
   rbtnDown = true;
}
function on_mouse_rbtn_up(x, y, vkey) {
   if (window.Width < 185 || window.Height < 100) return false;
   if (rbtnDown) {
      rbtnDown = false;
      if (vkey == MK_SHIFT) {
         return false; // if shift button pressed, show default context menu.
      } else {
         ContextMenuShowing = true;
         ShowContextMenu(x, y);
         return true;
      }
   }
}
// mouse callbacks }}
//===================================================================================================================================================
// playback Callbacks {{

function on_playback_new_track() {
   if (MetaDB) {
      window.UnwatchMetadb();
   }
   if (Properties.Panel.CursorFollowMode == CursorFollowMode.Auto || Properties.Panel.CursorFollowMode == CursorFollowMode.OnlyStopped || Properties.Panel.CursorFollowMode == CursorFollowMode.Never) {
      // If PopupMenu showing, pause this procedure and backup new metadb, this process will continue after exit the menu.
      if (ContextMenuShowing) {
         if (CursorFollowAutoTimerID) CursorFollowAutoTimer.Stop();
         MetadbBackup = fb.GetNowPlaying();
         FOCUSFLAG = false;
         return;
      }
      if (WaitTimerID) {
         WaitTimer.Stop();
      }
      if (Properties.Panel.CursorFollowMode == CursorFollowMode.Auto) {
         if (fb.CursorFollowPlayback && fb.PlayingPlaylist != fb.ActivePlaylist) SkipFocusChange = true;
      }
      MetaDB = fb.GetNowPlaying();
      MetaDBNowPlaying = true;
      StartAnimationCycle();
      if (MetaDB) {
         window.WatchMetadb(MetaDB);
      }
   }
}
// reason: user, eof, starting_another, shutting_down:0123
function on_playback_stop(reason) {
   if (!reason || reason == 1) {
      switch (Properties.Panel.CursorFollowMode) {
         case CursorFollowMode.Auto:
            MetaDB = fb.GetFocusItem();
            MetaDBNowPlaying = false;
            if (CursorFollowAutoTimerID) {
               CursorFollowAutoTimer.Stop();
            } else {
               StartAnimationCycle();
            }
            break;
         case CursorFollowMode.OnlyStopped:
            MetaDB = fb.GetFocusItem();
            MetaDBNowPlaying = false;
            StartAnimationCycle();
            break;
         case CursorFollowMode.Always:
            break;
         case CursorFollowMode.Never:
            StartAnimationCycleDefaultText();
            break;
      }
   }
}
// playback callbacks }}
//===================================================================================================================================================
// other events

function on_item_focus_change() {
   if (MetaDB) {
      window.UnwatchMetadb();
   }
   if (SkipFocusChange) {
      SkipFocusChange = false;
      return;
   }
   switch (Properties.Panel.CursorFollowMode) {
      case CursorFollowMode.Auto:
         if (ContextMenuShowing) {
            if (CursorFollowAutoTimerID) CursorFollowAutoTimer.Stop();
            MetadbBackup = fb.GetFocusItem();
            FOCUSFLAG = true;
            return;
         }
         if (fb.IsPlaying) {
            CursorFollowAutoTimer.Stop();
            //NeedCursorFollowAutoTimer = true;
            CursorFollowAutoTimer.Start();
         }
         MetaDB = fb.GetFocusItem();
         MetaDBNowPlaying = false;
         WaitTimer.Stop();
         WaitTimer.Start();
         break;
      case CursorFollowMode.OnlyStopped:
         if (!fb.IsPlaying) {
            if (ContextMenuShowing) {
               if (CursorFollowAutoTimerID) CursorFollowAutoTimer.Stop();
               MetadbBackup = fb.GetFocusItem();
               FOCUSFLAG = true;
               return;
            }
            MetaDB = fb.GetFocusItem();
            MetaDBNowPlaying = false;
            WaitTimer.Stop();
            WaitTimer.Start();
         }
         break;
      case CursorFollowMode.Always:
         // If PopupMenu showing, pause this procedure and backup new metadb, this process will continue after exit the menu.
         if (ContextMenuShowing) {
            if (CursorFollowAutoTimerID) CursorFollowAutoTimer.Stop();
            MetadbBackup = fb.GetFocusItem();
            FOCUSFLAG = true;
            return;
         }
         MetaDB = fb.GetFocusItem();
         MetaDBNowPlaying = false;
         WaitTimer.Stop();
         WaitTimer.Start();
         break;
      case CursorFollowMode.Never:
         break;
   }
}
function on_metadb_changed() {
   ResetLines(Oldlines);
   window.RepaintRect(5,40,ww-10,wh-70);
}
function on_playlist_items_removed(playlist, new_count) {
   on_playlists_changed();
}
function on_playlist_switch() {
   on_playlists_changed();
}
function on_playlists_changed() {

   if (fb.PlaylistItemCount(fb.ActivePlaylist) == 0) {
      if (Properties.Panel.CursorFollowMode == CursorFollowMode.Auto || ((Properties.Panel.CursorFollowMode == CursorFollowMode.OnlyStopped) && !fb.IsPlaying) || Properties.Panel.CursorFollowMode == CursorFollowMode.Always) {
         if (Properties.Panel.CursorFollowMode == CursorFollowMode.Auto && fb.IsPlaying) {
            CursorFollowAutoTimer.Stop();
            //NeedCursorFollowAutoTimer = true;
            CursorFollowAutoTimer.Start();
         }
         StartAnimationCycleDefaultText();
      }
   } else on_item_focus_change();
}
var c3=1;
var clock_timer = window.CreateTimerInterval(1000);
var d = new Date();
var datefont3 = gdi.Font("calibri", 26);

// =============================================== //
    on_size();
function on_paint(gr) {
        var color = RGB(100, 110, 110);
    var color4 = RGB(000, 200, 250);
        gr.SetTextRenderingHint(5);
        gr.SetSmoothingMode( 4 );
        gr.SetInterpolationMode( 1 );
   var yOffset = tm;

    gr.FillGradRect(0,0,ww, wh,200,RGBA(255,255,255,255),color); 
    gr.FillEllipse(ww>>4, wh/3, 2*ww, 3/2*wh, RGBA(100, 110, 110,110));
   
    for (var i = 0; i < Oldlines.length; i++) {
      var temp = yOffset + Oldlines[i].top + Oldlines[i].yOffset + Oldlines[i].Height;
      if (Oldlines[i].display != 0 && Oldlines[i].Height && temp > 0 && temp <= whtip) { // Lines out of panel will not be drawn.
         Oldlines[i].Draw(gr, yOffset + Oldlines[i].top);
      } else Oldlines[i].display = 0;
   }
   yOffset += RollingDistance;

   for (var i = 0; i < Newlines.length; i++) {
      if (Newlines[i].Height && yOffset + Oldlines[i].top + Newlines[i].yOffset + Newlines[i].Height <= whtip) {
         Newlines[i].display = 1;
         Newlines[i].Draw(gr, yOffset + Newlines[i].top);
      } else Newlines[i].display = 0;
   }
//=============================== clock
    gr.FillSolidRect(0, 0, ww, 40,RGBA(20,20,20,250));
    var S = 0;
    while (S < 40)  {
        gr.FillSolidRect(0,S,ww,3,RGBA(215,215,215,95));
        S = S+6;
    }     
    gr.DrawString(d.toLocaleDateString(), gdi.Font("calibri", 28, 0), color4, 0, 16, ww, 0,0x11005000 );
 
    gr.FillGradRect(0,wh-40,ww, wh-48,-90,RGBA(60,60,50,220),RGBA(30, 30, 30,250)); 
    gr.DrawRoundRect(9,35, ww-14, wh-78, 4, 4, 9, RGBA(000,95,155,190));   
    var B = wh-42;
    while (B < wh) {
    gr.FillSolidRect(3,B,ww-6,3,RGBA(155,155,155,150));
    B = B+6;
    } 
   gr.DrawRoundRect(10,38, ww-20, wh-76,4,4, 3.0, RGBA(000, 180, 250,50))
   gr.DrawRoundRect(1,30, ww-6, wh-68, 10, 10, 2.0, RGB(100,110,120)); 
 var weekday=new Array(7);
 weekday[0]="Воскресенье";
 weekday[1]="Понедельник";
 weekday[2]="В т о р н и к";
 weekday[3]="С р е д а";
 weekday[4]="Ч е т в е р г";
 weekday[5]="П я т н и ц а";
 weekday[6]="С у б б о т а";
    if ( c3 > 0 ){  var n = weekday[d.getDay()]+"         "+ d.getHours() % 24+":"+d.getMinutes(); }
    else {  var n = weekday[d.getDay()]+"         "+ d.getHours() % 24+" "+d.getMinutes();}

   gr.DrawString(n , gdi.Font("calibri", 28),color4, -1, wh-18, ww, 0, 0x11005000);
     } 
// =============================================== //

function on_timer(id) {
    d = new Date();
    window.RepaintRect(0,0,ww,40);
    window.RepaintRect(0,wh-40,ww,40);
    c3 = -c3;
}
HTPC Termaltake, eGlobal i5-7200, Asrock Beebox J3160, Onkyo 525E, цап SMSL, фронт Yamaha 8900.
vladj M
Гуру
Аватара
Откуда: Пермский край
Репутация: 353
С нами: 8 лет 8 месяцев

Сообщение #2271 Cerberus » 17.03.2018, 00:16

kgena_ua писал(а):Занялся опять "Get Covers (Artwork) && radio logos".
Ждем скрипта)
Cerberus
Бывалый
Репутация: 9
С нами: 1 год 11 месяцев

Сообщение #2272 kgena_ua » 17.03.2018, 09:10

kutuzof писал(а):есть фризы, только при включении автоцикла
Да есть.
В function get_img_from_dir(path, t_artist, t_album, t_title) (стр.примерно 720)
перенести images = [];
Код: Выделить всё
 //images = [];   // заремил               

    if (files.length > images.length){
       
        images = [];   // добавил

        var i = 0;
        do {
            var tmp;
            try {   
                tmp = resize_image(gdi.Image(files[i]))
                if (typeof tmp == 'object' ) {
                    images.push(tmp);
                }
            } catch(e) {}
            i++;
        } while (i < files.length);
    }
I.m.UR5EQF.
квартет на миллион долларов
kgena_ua M
Гуру
Аватара
Возраст: 54
Откуда: Украина, Днепр
Репутация: 424
С нами: 5 лет 6 месяцев

Сообщение #2273 kutuzof » 17.03.2018, 13:27

kgena_ua, вроде работает. Спасибо!
kutuzof M
Бывалый
Возраст: 31
Откуда: Орёл
Репутация: 82
С нами: 2 года 1 месяц

Сообщение #2274 Marakobes » 17.03.2018, 13:30

MC Web писал(а):Как я понял Marakobes, хочет что то похожее на данную структуру вложений папок или похожую:
ну да, так примерно

кусок скрипта вставил, работает в большинстве групп, один раз не сохранил, один вариант был Images создалось и в папке альбома и исполнителя. Потестирую еще и разберусь что влияет на это

а как сделать чтобы текстовый файл "артист_biography_ru" сохранялся не в картинки а в корень исполнителя, т.е. ложился рядом с папкой Images

ой, сохраняет в корень диска C, хотя музыка на другом диске, еще создал пустую папку в корне музыкального, вообщем рандом пока какой то))) и сохраняет то 6 то 12 не пойму где покрутить, лимит в пропертис 100
Marakobes
Новичок
Репутация: 0
С нами: 6 лет 1 месяц

Сообщение #2275 MC Web » 17.03.2018, 15:03

kgena_ua, данное исправление помогает.
СПАСИБО !!!
MC Web
Мастер
Аватара
Репутация: 144
С нами: 5 лет 1 месяц

Сообщение #2276 kgena_ua » 17.03.2018, 21:23

MC Web писал(а):данное исправление помогает
Подождем, посмотрим.

Marakobes писал(а):ой, сохраняет
Marakobes, я сильно не занимался этим, так писал что в голову приходило (на скорую). У самого сейчас сохранилось на диск, в корень, где лежит Фубар. Оказалось, что название папки с исполнителем не совсем соответствует имени исполнителя.
У меня
if (tmp_arr[i].match(meta_artist)){
Это если имя папки полностью соответствует имени артиста, тут много нюансов...

Marakobes писал(а):сохраняет то 6 то 12 не пойму где покрутить, лимит в пропертис 100
Тут не понятно, подробнее.
I.m.UR5EQF.
квартет на миллион долларов
kgena_ua M
Гуру
Аватара
Возраст: 54
Откуда: Украина, Днепр
Репутация: 424
С нами: 5 лет 6 месяцев

Сообщение #2277 seriousstas » 18.03.2018, 02:01

kgena_ua
Часто пользуюсь поиском Вашим :
/viewtopic.php?p=54697#p54697
Пробую на foobar2000 v1.4.0 beta - ищет только первую букву .
Посмотрите почему так ?
Пробовал на разных сборках - после обновления - скрипт перестает искать ( :help:
seriousstas
Мастер
Откуда: Украина , Ивано-Франковск
Репутация: 97
С нами: 3 года 8 месяцев

Сообщение #2278 AHAPXICT » 18.03.2018, 10:18

seriousstas, приветствую. Это точно, что-то в новой версии не то))) Какие-то изменения в форматировании произошли, сам с подобным столкнулся. Уже начинаю терять интерес к этой теме, пропал энтузиазм и к JS панели(так и не заработала)
Media Library it's bad - explorer it's good!
AHAPXICT M
Мастер
Аватара
Возраст: 47
Откуда: Киев
Репутация: 164
С нами: 4 года 11 месяцев

Сообщение #2279 MC Web » 18.03.2018, 12:43

Привет всем.
AHAPXICT писал(а):Уже начинаю терять интерес к этой теме, пропал энтузиазм и к JS панели(так и не заработала)
Мне давно стало понятно, что из всего этого ничего путного не получится.
Если все работает прекрасно, зачем менять шило на мыло...
MC Web
Мастер
Аватара
Репутация: 144
С нами: 5 лет 1 месяц

Сообщение #2280 AHAPXICT » 18.03.2018, 14:49

MC Web писал(а):Мне давно стало понятно, что из всего этого ничего путного не получится.
Во как. А мне не понятно. И писал не только про JS панель, но про новую бету плеера. И почему ты решил что из всего этого нечего не получится? Уже почти как пол года перевёл одну из сборок на JS панель(+бонусы), вторая так и осталась на WSH, как говорится в ассортименте. А если последняя JS начнёт работать без глюков на разных системах, то это будет вообще шикарно. Мне эта идея нравится. Так что если всё будет работать как полагается, то менять однозначно!
Media Library it's bad - explorer it's good!
AHAPXICT M
Мастер
Аватара
Возраст: 47
Откуда: Киев
Репутация: 164
С нами: 4 года 11 месяцев

Пред.След.

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

Кто сейчас на форуме (по активности за 10 минут)

Сейчас этот раздел просматривают: 1 гость