foobar2000 0.8.3 custom by Draikin

Discussion in 'Nguồn phát từ máy tính' started by tml3nr, 3/8/17.

  1. viking

    viking Advanced Member

    Joined:
    31/7/09
    Messages:
    337
    Likes Received:
    308
    Cảm ơn bác @thienphuc74 đã khích lệ.
    Mình cũng rất vui khi cảm thấy làm được điều gì đó - dù rất nhỏ - có ích cho cộng động anh em yêu nhạc trên vnav.vn.
    Ít bữa siêng lại mình sẽ gom các ý góp để cập nhật lại bản 64bit này, chủ yếu là phần duyệt nhạc local bằng artwork và web radio (dạo này các Bác cũng quan tâm nhiều về radio).
    Chúc Bác vui.
    thân, viking
     
    thienphuc74 likes this.
  2. thienphuc74

    thienphuc74 Advanced Member

    Joined:
    4/9/15
    Messages:
    179
    Likes Received:
    24
    CẢM ƠN BÁC VIKING NHIỀU! BÁC CẬP NHẬT SỚM NHÉ.
     
    viking likes this.
  3. viking

    viking Advanced Member

    Joined:
    31/7/09
    Messages:
    337
    Likes Received:
    308
    Thân gửi anh em 4rum vnav,
    Post trước có đề cập bản dựng DarkOne của tedGo và tech của Br33t nên có yêu cầu gần xa liên quan, mình xin tóm ý như sau:
    - tedGo đã gác kiếm từ khoảng 10/2019, không rõ có đăng ký nick khác nhưng bản DO thì hình như dừng ở version 4 mod 1. Tuy vậy, những dị bản thì rất nhiều nhưng vẫn 32bit.
    trên fb2k tiếng Nga, kutuzof vẫn duy trì cập nhật https://foobar2000.ru/forum/viewtopic.php?t=6549. link download https://www.dropbox.com/s/lql4hfz9u9r3re9/DarkOne4Mod v1.0 (SMP) - fb2k v2.24.3 [x86].exe?st=gr1acf1f&dl=0.
    các bác download, đổi đuôi file EXE thành RAR rồi giải nén file.
    mình đã dùng thử rồi upload 1 bản ở link này: https://www.mediafire.com/file/jltu...t_DarkOne4Mod+v1.0+(kutuzof+edition).rar/file (365,79MB).

    Kutuzof có lưu nhiều phiên bản DO và hướng dẫn sử dụng rất chi tiết, cập nhật thường xuyên ở trang https://foobar2000.ru/forum/viewtopic.php?t=6549.

    - tương tự, Br33t cũng ngừng cập nhật skin mới nên những dạng skin tương tự (dùng tab đẹp như TECH) hầu như chưa thấy. khi tìm playlist radio, mình có thấy 1 bản dựng skin foobox https://github.com/dream7180/foobox-en của dreamawake. dreamawake đã phát triển skin này từ trước 2019 và giờ đã có phiên bản 64bit dùng JSplitter thay cho PSS nên xem như rất 'mượt'.
    dreamawake cũng cập nhật thường xuyên, nhưng bản dựng ở dạng exe nên phải cài đặt.
    mình đã download, cài đặt và chạy thử, chuyển sang dạng file nén: https://www.mediafire.com/file/s35bihd4hqmemz8/fb2k_64bit_foobox_v7.42+(dreamawake).rar/file (30,85 MB)

    chúc các Bác vui.
    viking
     

    Attached Files:

    Last edited: 14/4/25
    phuongdx likes this.
  4. viking

    viking Advanced Member

    Joined:
    31/7/09
    Messages:
    337
    Likes Received:
    308
    Thân gửi anh em 4rum vnav,

    bản dựng 64-bit /x64 foobar2000 - fb2k_x64_DUI_HA_VNAV_07Apr25_HKF đã có tại đây: ( 608,57 MB)
    link MediaFire :
    https://www.mediafire.com/file/c1ggsu3kzhm16da/fb2k_x64_DUI_HA_VNAV_07Apr25_HKF.rar/file

    lý do thay đổi :
    • cập nhật 1 số plugin 64bit mới nhất.
    • refactoring 1 số scripts.
    • cập nhật yt-dlp.exe để xem/download youtube video.
    • hỗ trợ nhiều nhà đài web radio.
    • thêm VU_meter dạng đối xứng.
    • xử lý những tracks mồ côi (do 'sắp xếp' lại files)
    1. về hình thức/tính năng:
    • kiểm tra phiên bản, cập nhật yt-dlp.exe từ context menu.
    • tab bookmark chuyên biệt (dùng theme EOLE của bác @Ottodix https://github.com/Ottodix/Eole-foobar-theme), lưu lịch sử bookmark:
      • JSON : để các bác restore nếu cần (phần này mình không coding). ('theo sáng kiến/yêu cầu của người dùng')
      • plain text: xem nhanh bằng trình notepad,
      • playlist : load playlist cho nhanh và chính thống theo chuẩn của fb2k.
    • revive dead items: ('theo sáng kiến của người dùng') khi bookmark 1 track nhạc (là file theo OS) rồi lỡ move file đi nơi khác thì track nhạc được bookmark bị mồ côi. tính năng này cho phép khôi phục lại đường dẫn đến file nhạc hay remove luôn track nhạc khỏi bookmark list. (sẽ chi tiết ở phần kỹ thuật)
    • load radio playlist : ('theo sáng kiến của người dùng'), phiên bản 8Mar25-IWD load sẵn các radio playlist nhưng nếu các bác vô tình delete mất, hay thêm bớt rồi mất các radio list. tính năng này cho phép load 1 file FPL playlist từ hard disk khi cần (sẽ chi tiết ở phần kỹ thuật).
    • hoàn tất/thêm 1 loại VU_meter cho JSP3_VU_Meter script: ('theo sáng kiến của người dùng'), tính năng này (định hình và yêu cầu trước Tết mà làm biếng quá) cho phép thể hiện 2 kênh Left/Right VU Meter ở tư thế ngược chiều nhau.
    • rating track: thêm rating track vào menu bar.
    • history:
      • radio history: tính năng có sẵn của fb2k. có tương tác
      • library history: Bác @mjm716 vừa trình làng hôm 30/03/2025 (https://hydrogenaud.io/index.php/topic,127666.msg1061480/topicseen.html#new), tuy còn vài điểm có thể cải thiện nhưng rất trực quan. hy vọng sau này thêm khả năng tương tác (tạo autoplaylist để play lại các track/youtube clips/radios) thì sẽ rất tuyệt. mình thêm vài đoạn script để tinh chỉnh chút xíu (color, cỡ chữ cho phù hợp layout chung, last 100 tracks để tương tác).
    2. cách dùng:
    • load web radio:
    • rating track: có thể truy cập từ ngay menu bar (icon), hay context menu của tab/panel [Now Playing] hay [Zen arT]. Đặc biệt, ở tab/panel [Now Playing] , ta có thể tùy chỉnh vị trí/ẩn hiện rating bar (5 ngôi sao). khi rating được set, fb2k window title cũng sẽ hiển thị số ngôi sao tương ứng (để ta dễ quan sát khi fb2k window thu nhỏ ở Windows OS Taskbar)
    • JSP3 VU_Meter dạng bar: thể hiện ở tab/panel [Now playing] và [Zen VU], có thể chọn loại LED (chữ nhật, elip), ẩn hiện nền, ẩn hiện VU Meter.
    • add bookmark: thêm track nhạc/youtube clip/radio từ context menu của tab/panel [Now playing] hay tab/panel [Library playlist].
    • play bookmark list: chọn lệnh /Play all/ từ context menu tab/panel [Bookmark]
    • revive dead items (xử lý track nhạc mồ côi khỏi playlist): chọn lệnh /Rivive dead items/ từ tab/panel [Library playlist]. fb2k sẽ xử lý các track nhạc mồ côi của playlist hiện hành. vì vậy, nếu muốn xử lý track mồ côi của bookmark thì phải play (load) bookmark list trước.
    • thay đổi milkdrop set: dùng chương trình robocopy.exe của window OS khi copy các file của milkdrop set (data, preset, texture . . .) để đảm bảo các file tên dài và hoàn tất 100%. robocopy.exe có vẻ 'chậm' so với xcopy nhưng được dùng để backup files nên khả năng copy đúng, đủ là cao. các bác đảm bảo copy file hoàn tất trước khi exit foobar2000 vì milkdrop component có thể crash foobar2000 nếu quá trình này có trục trặc (vui lòng tham khảo gợi ý xử lý ở file [fb2k]\profile\skin.troubleshooting.readme.txt). các milkdrop sets này do các bác gửi là chính, ngoài ra có thể tham khảo https://forums.winamp.com/forum/visualizations/milkdrop/milkdrop-presets?forumid=84
    3. kỹ thuật:
    như thường lệ, mình sẽ đề cập chi tiết vài điểm để các bác DIY rõ thêm:

    - revive dead items: về tính năng, chúng ta đều thấy chuyện này thường như huyện, và thực tế là đã có component làm tốt (foo_playlist_revive 32bit trước đây) và nay foo_playlist_fix 64bit (https://marc2k3.github.io/component/playlist-fix/) của bác @marc2k3. ngay cả bác @regor (aka Regorxxx) cũng có những scripts (Spider Monkey) rất mạnh trên JS Engine tân thời, quản lý fb2k playlist, trong đó có cả tính năng revive dead items (https://github.com/regorxxx/Playlist-Tools-SMP/blob/main/main/playlists/playlist_revive.js), chỉ cần lấy dùng.
    tuy vậy, do bản dựng này chủ yếu xây trên JS Panel 3 và để đảm bảo tính tương thích cao, chúng ta sẽ code 1 đoạn script làm việc này.
    + định nghĩa dead items: file nhạc local trên HDD/NAS (network attached storage) devices (không xử lý online streaming như youtube clips, radio) đã bị remove ra khỏi playlist cụ thể (nhưng vẫn còn thuộc Library quản lý bởi fb2k).
    + xử lý: duyệt qua tất cả file trong library, tìm và so khớp Tên file + dung lượng + thời gian phát nhạc. chúng ta không xem xét các metadata, chữ ký MD5 (vì thực tế các metadata cũng khá rời rạc và có khi rơi rớt từa lưa).

    do bác @rego đã làm phần khó, nên cơ bản chỉ cần chuyển script từ SPM sang JScript 3 là xong.
    Code:
    /*/ Mar25: viking
                    remove , revive, dead items from a given playlist
                    inspired by and credit goes to @rego https://github.com/regorxxx/Playlist-Tools-SMP/blob/main/main/playlists/playlist_revive.js
                    dead items: 'simple way' -> {FILEs do(es) not exist anymore on the local storage deive as indicated by its own path,  neither recognised by fb2k.}
                                IGNORE stream item cause we can not verify dute to time-consuming
           
                    how: just filter out dead items from a given playlist.
                        then, attemp to revive these dead items.
                /*/
           
                // (A) recognise dead items
                // ------------------------
           
                if (g_active_playlist < 0 || g_active_playlist >= plman.PlaylistCount) break;
           
                // step 1 : clipboard /cached active playlist handles
                var handle_list = plman.GetPlaylistItems(g_active_playlist);
                if (handle_list.Count <= 0) {
                    handle_list.Dispose();
                    break;
                }
           
                // step 2: create an empty holder handles to cache all live items from active playlist handles
                var filter_items = fb.CreateHandleList(); //new FbMetadbHandleList();
                var handle = null, dead_items = [];
                var isLocalFile = /file:\/\//i; // 'file://'  -> NOT a streaming item
                var current_list_count = handle_list.Count;
           
                // step 3: go/run through the current list to filter out dead items
               
                for (var i = 0; i< current_list_count; i++) {
                    handle = handle_list.GetItem(i);
               
                    if (isLocalFile.test(handle.RawPath)) { // local file
                        if (utils.IsFile(handle.Path)) {
                            filter_items.AddItem(handle);
                            //filter_items.InsertItem(filter_items.Count, handle);
                            //handle_list.RemoveByIdx(i);
                        } else {
                            dead_items.push({path: handle.Path, idx: i, filesize:handle.FileSize, length: handle.Length });
                            //dead_items.push('idx='+i+ ':' + handle.Path);
                        }
                    } else filter_items.AddItem(handle);
               
                    handle.Dispose();
                };
           
           
                var dead_list = '\n\ndead list:\n'; base_idx =[];
                for (var i =0; i< dead_items.length; i++) {
                    dead_list = dead_list+ 'idx ='+dead_items[i].idx + ': '+ dead_items[i].path + '\n' ;
                    base_idx.push(dead_items[i].idx);
                    }; dead_list = i > 0 ? dead_list : '';
           
           
                if (!dead_items.length) {
                    filter_items.Dispose();
                    handle_list.Dispose();
               
                    utils.ShowPopupMessage('Found ' + dead_items.length + ' dead item(s) on '
                                        + (plman.ActivePlaylist === g_active_playlist ? 'active' : '')
                                        + ' playlist: ' + plman.GetPlaylistName(g_active_playlist)
                                        +  dead_list
                                        + '\n\n'
                                        +  (dead_items.length >0 ? window.Name + ' will remove dead item(s).\n' : '')
                                        + "dead items: 'simple way' -> {FILEs do(es) not exist anymore on the local storage deive as indicated by its own path,  neither recognised by fb2k.}"
                                        , window.Name
                                        );
                                   
                    break;
                };
           
                /*/ (B) try to revive dead items
                    ---------------------------
                  context:     some albums (audio files) may be moved to another storage devices while those favorite tracks from these
                            albums are re-located to a 'bookmark' folder for convinient maintenance.
                            => these items were once belonged to a playlist then become orphaned as their path are un-recognised by fb2k.
                            as such, we have to seek for their current path and update metadata thereafter.
                  how :
                    + config Media Library (ML) to include those files that we may find dead items
                        we do not find the whole local storage devices for dead items (files)
                        why: it is time-consuming to locate those file and less accurate cause we can determine based on
                            genaral criteria as file name and fise size. otherwise, we have to add these file to fb2k to
                            extend criteria base to include other tags as album, title, artist, disknumber, . . . properties of a Handle type.
                    + query ML for file_name ONLY.
                        why: we ignore other tags and MD5 as well, as these tags could be altered or erased ny other tag editors.
                        then, we compare fileSize and length (up to at least 14 decimal numbers)
                   
                        simple query:
                            we get all items that contain all words from specified string in metadata or file path.
                            any latin characters are matched regardless of their accents, e.g. “foobar” will match “foobar” as well as “fööbar” or “fóobar”.
                            fb2k will auto weighted words from string query to get result.
                    + compare:
                        FileName     : Yes , must be the same as pre- relocation among Media Libray folders
                        FileSize    : Yes
                        Length        : Yes
                        SubSong        : No
                        MD5            : No (this checksum must be calculated based on some variables and these maybe changed.)
                        Tags (GetFileInfo) : No
                /*/
               
                var fileName ='', revine_list='\n\nrevive list: update path\n';
                var MLItems = null; MLitem = null;
                var ML = fb.IsLibraryEnabled() && fb.IsLibraryInitialised();
                if (ML) {
                    for (var i =0; i< dead_items.length; i++) {
                        fileName = dead_items[i].path.split('\\').slice(-1)[0];
                        try {
                            MLItems = fb.GetLibraryItems(fileName); //IMetadbHandleList
                        } catch (e) {console.log(window.Name, 'Error query :',e);};
                   
                        if (MLItems.Count) {
                            for (var j = 0; j < MLItems.Count; j++){
                                MLitem = MLItems.GetItem(j);
                           
                                console.log('query='+ fileName +'>> result : size= ' , MLitem.FileSize +', length= ' + MLitem.Length + ', path='+ MLitem.Path);
                                if ( dead_items[i].filesize == MLitem.FileSize
                                    &&  dead_items[i].length ==   MLitem.Length)
                                    {
                                        console.log(window.Name, ' retrieved a track :', MLitem.Path);
                                        revine_list = revine_list + 'idx ='+dead_items[i].idx + ': new path > '+  MLitem.Path + '\n' ;
                                        //update Handle path
                                        filter_items.AddItem(MLitem); // welcome back
                                        //filter_items.InsertItem(dead_items[i].idx,MLitem);
                                    }                                   
                                MLitem.Dispose();
                            };                           
                        };
                        MLItems.Dispose();
                   
                    };
                }; dead_list = dead_list + revine_list;
               
                utils.ShowPopupMessage('Found ' + dead_items.length + ' dead item(s) on '
                                    + (plman.ActivePlaylist === g_active_playlist ? 'active' : '')
                                    + ' playlist: ' + plman.GetPlaylistName(g_active_playlist)
                                    +  dead_list
                                    + '\n\n'
                                    +  (dead_items.length >0 ? window.Name + ' will remove dead item(s) if not revived.\n' : '')
                                    + "dead items: 'simple way' -> {FILEs do(es) not exist anymore on the local storage deive as indicated by its own path,  neither recognised by fb2k.}"
                                    , window.Name
                                    );
           
                // (C) update Playlist
                // ------------------
           
                var playlistIsLocked= false;
                if (plman.IsPlaylistLocked(g_active_playlist) ){
                    remove_playlist_lock(g_active_playlist);
                    playlistIsLocked = true;
                }
           
                if (playlist_can_remove_items(g_active_playlist) && playlist_can_add_items(g_active_playlist)){ //locked by other componet other than JSP3
                    plman.UndoBackup(g_active_playlist);
                    // Just replace entire playlist
                    plman.ClearPlaylist(g_active_playlist);
                    plman.InsertPlaylistItems(g_active_playlist, 0, filter_items);
               
                    plman.SortByFormatV2(g_active_playlist, "$directory_path(%path%)",1); //direction. default 1 (ascending), -1 (descending).
                    if (playlistIsLocked) add_playlist_lock(g_active_playlist, maskPlaylist);
                } else {
                    utils.MessageBox('Playlist '+ plman.GetPlaylistName(g_active_playlist) + ' is locked {RemoveItems, AddItems} \n\nReviving failed!',window.Name,16);
                    // highlight the dead items
                    plman.ClearPlaylistSelection(g_active_playlist);
                    if (dead_items.length) {
                        plman.ActivePlaylist = g_active_playlist;
                        plman.SetPlaylistSelection(g_active_playlist, base_idx, true);
                        plman.SetPlaylistFocusItem(g_active_playlist, dead_items[0].idx);
                    }
                }
           
                // focus 1st item
                if (g_active_playlist.Count > 0) {
                    plman.ClearPlaylistSelection(g_active_playlist);
                    plman.SetPlaylistSelectionSingle(g_active_playlist, 0, true);
                    plman.SetPlaylistFocusItem(g_active_playlist, 0);
                };
           
                filter_items.Dispose();
                handle_list.Dispose();
    
    còn phần nữa, khá ngắn và đơn giản:
    - load file playlist FPL foobar2000:

    FPL là playlist theo format của foobar2000 và không phải plain text. về nguyên tắc, nếu không xử lý được binary file thì phải dụng đến foobar2000 để load [file/load playlist . . .] -> không tự động. và ngạc nhiên là các script objects của SMP hay JScript cũng không hỗ trợ.

    vậy thì đi vòng:
    + bước 1: install foo_run_main của @marc2k3 (https://marc2k3.github.io/component/run-main/), component này cho phép truy cập menu của fb2k từ dòng lệnh // tuyệt vời.
    + bước 2: dùng script để load playlist từ menu fb2k (qua dòng lệnh). chỉ lưu ý : không có dấu [...] khi truy cập menu [file/load playlist . . .]

    Code:
    //foobar2000 load FPL playlist automatically , Mar2025 viking @vnav.vn aka lovefb2k @HA
    var radio_playlist_tmp =  'radio_playlist.fpl' ;
    var radio_playlist_fullpath_tmp =  radioPrePlaylist.path_set + radio_playlist_tmp ;
                
                    if (utils.IsFile(radio_playlist_fullpath_tmp)) {
                     
                     //i.e. foobar2000.exe /run_main:"File/Load playlist" "D:\radio\radio_playlist.fpl"
                        var command =  '"'+fb.FoobarPath + 'foobar2000.exe' + '"' ;
                    
                        var option =  ' /run_main:"File/Load playlist" '  // NOT "File/Load playlist..." <- NO 3 dots (...)
                                + (' "' +radio_playlist_fullpath_tmp + '"') ;
                    
                    
                        console.log(window.Name, ': loads radio playlist FPL >>',    command +     option);
                        try {
                            if ( !radioPrePlaylist.playlist_radio_default) radioPrePlaylist.playlist_radio_default = 'Internet Radio';
                            var plid = plman.FindOrCreatePlaylist(radioPrePlaylist.playlist_radio_default,true)
                            
                            plman.ActivePlaylist = plid;
                            plman.ClearPlaylist(plid);
                            //plman.ExecutePlaylistDefaultAction(plid,0);                   
                        
                            // either will work:
                            // _runCmd(command + option, false, 0); //=> {true: show command window, 1: wait}
                             utils.Run(command,option); //=> {show window, does not await till task finished};
                        } catch(e) {
                                MessageBox("Error loading radio playlist: "+ (radio_playlist_fullpath_tmp)
                                + '\n\n' + e,window.Name + " >> Loading error");
                                break;
                        };
    
                    } else utils.MessageBox('No such radio playlist file exist:\n\n'+radio_playlist_fullpath_tmp,window.Name,16);
                    
    
    vậy thôi,

    Đã thử trên máy cấu hình tương đương:
    • Windows 11,
    • CPU: AMD 7, RAM 12 GB
    • Direct X: 12
    • Màn hình 15.6 inch, 1920 x 1080, scale 150%.
    chúc các Bác vui.

    /*/
    Foobar2000 và các plugin, chương trình đình kèm thuộc bản quyền của các nhà phát triển tương ứng. mình đã cẩn thận quét virus và xem xét nguồn nhưng mình và mạng nghe nhìn Việt nam (vnan.vn) không chịu trách nhiệm với các rủi ro liên quan (nếu có).
     

    Attached Files:

    Last edited: 15/4/25
    phuongdx and thienphuc74 like this.
  5. thienphuc74

    thienphuc74 Advanced Member

    Joined:
    4/9/15
    Messages:
    179
    Likes Received:
    24
    cảm ơn bác Vilking rất nhiêif
     
    bwav and viking like this.
  6. thienphuc74

    thienphuc74 Advanced Member

    Joined:
    4/9/15
    Messages:
    179
    Likes Received:
    24
    CÓ AI BỊ LỖI NHƯ NÀY KO?
    upload_2025-5-4_17-8-13.png
     
  7. thienphuc74

    thienphuc74 Advanced Member

    Joined:
    4/9/15
    Messages:
    179
    Likes Received:
    24
    viking likes this.
  8. viking

    viking Advanced Member

    Joined:
    31/7/09
    Messages:
    337
    Likes Received:
    308
    Chào bác @thienphuc74 ,
    rất vui khi Bác đã tìm ra nguyên nhân.
    Bác @thienphuc74 có thể chia sẻ thêm về lỗi và cách khắc phục không ? để mọi người cùng tham khảo.

    P/S. bữa trước có đề cập về chủ đề 'chia sẻ thông tin giữa các Script engine, ví như JSPanel 3, SMP, WSH' mà quên chưa chi tiết thêm.
    Mình sẽ có ví dụ cụ thể minh họa để chúng ta dễ hình dung.
    cảm ơn bác phương xa đã nhắc và sorry vì quên mất.

    chúc các Bác nghe nhạc vui,
    @viking
     
  9. thienphuc74

    thienphuc74 Advanced Member

    Joined:
    4/9/15
    Messages:
    179
    Likes Received:
    24
    Là do mình cài thêm RamDics gây ra lỗi này và còn gây ra lỗi Shutdown máy tính rất lâu.
     
    viking likes this.
Tags:

Share This Page

Loading...