Скрипты для foo_uie_wsh_panel_mod

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

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

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

Aliado_71:Cerberus, Может просто название правильно указать, cover, front, folder
Спасибо.
Cerberus
Репутация: 10
С нами: 8 лет 1 месяц

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

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

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

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

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

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


Marakobes:Скрипт должен подниматься наверх, сколько бы не было вложенных папок и создавать папку Images в корне
т.е. в папку %artist%, а как ее "найти". Надо пробовать.
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 11 лет 7 месяцев

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

Marakobes:не в каждой же папке альбома дублировать фото исполнителя? Скрипт должен подниматься наверх, сколько бы не было вложенных папок и создавать папку Images в корне
Раньше так и делал...например более 20 альбомов любимого мной артиста и в каждом альбоме фоты штук 30 одинаковые. Легче стало с появлением скрипта от максима, где читались сканы из альбома и остальные из корня с папки с имиджем. Я Геннадию давно просьбу высказывал. Запускаем альбом и сначала читаются сканы по порядку, фронт, задняя, СД из папки с альбомом и только затем остальные из корневой папки с имиджем. Картинки у меня собраны давно и сейчас нет проблем вручную сбросить в папку скачавшиеся фоты из темпоральной.
vladj M
Аватара
Откуда: Пермский край
Репутация: 427
С нами: 14 лет 10 месяцев

Сообщение #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,
фризов не вижу, я к тому, что нельзя исправить ошибку, если она есть, если она не наблюдатся
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 11 лет 7 месяцев

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

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

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

kgena_ua, привет!

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

Изображение

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

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

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

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

phpBB [media]
kutuzof M
Аватара
Откуда: г. Орёл, Россия
Репутация: 258
С нами: 8 лет 2 месяца

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

seriousstas, привет!

Откатился на версию 15122017 - без тормозов.
MC Web
Репутация: 248
С нами: 11 лет 3 месяца

Сообщение #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;
}
vladj M
Аватара
Откуда: Пермский край
Репутация: 427
С нами: 14 лет 10 месяцев

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

kgena_ua:Занялся опять "Get Covers (Artwork) && radio logos".
Ждем скрипта)
Cerberus
Репутация: 10
С нами: 8 лет 1 месяц

Сообщение #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);
    }
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 11 лет 7 месяцев

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

kgena_ua, вроде работает. Спасибо!
kutuzof M
Аватара
Откуда: г. Орёл, Россия
Репутация: 258
С нами: 8 лет 2 месяца

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

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

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

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

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

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

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

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

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

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

Marakobes:сохраняет то 6 то 12 не пойму где покрутить, лимит в пропертис 100
Тут не понятно, подробнее.
kgena_ua M
Аватара
Откуда: Украина, Днепр
Репутация: 504
С нами: 11 лет 7 месяцев

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

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

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

seriousstas, приветствую. Это точно, что-то в новой версии не то))) Какие-то изменения в форматировании произошли, сам с подобным столкнулся. Уже начинаю терять интерес к этой теме, пропал энтузиазм и к JS панели(так и не заработала)
AHAPXICT M
Аватара
Откуда: Киев
Репутация: 252
С нами: 11 лет

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

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

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

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

Пред.След.

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