├── .gitignore ├── LICENSE ├── LICENSES ├── CEFSHARP ├── LGPL-2.1 ├── LGPL-3 ├── MIT └── UNLICENSE ├── NOTICE ├── README.md ├── ServicePlugins ├── ServicePlugins.sln ├── Web │ ├── wsrv_soundcloud.html │ ├── wsrv_spotify.html │ └── wsrv_youtube.html ├── archiveskins_helper │ ├── Program.cs │ └── archiveskins_helper.csproj ├── esrv_bandcamp │ ├── Form1.Designer.cs │ ├── Form1.cs │ ├── Form1.resx │ ├── Program.cs │ └── esrv_bandcamp.csproj ├── esrv_localsearch │ ├── Form1.Designer.cs │ ├── Form1.cs │ ├── Form1.resx │ ├── Program.cs │ ├── Properties │ │ ├── Resources.Designer.cs │ │ └── Resources.resx │ └── esrv_localsearch.csproj ├── esrv_soundcloud │ ├── Form1.Designer.cs │ ├── Form1.cs │ ├── Form1.resx │ ├── Program.cs │ └── esrv_soundcloud.csproj ├── esrv_spotify │ ├── Form1.Designer.cs │ ├── Form1.cs │ ├── Form1.resx │ ├── Program.cs │ └── esrv_spotify.csproj ├── esrv_youtube │ ├── Form1.Designer.cs │ ├── Form1.cs │ ├── Form1.resx │ ├── Program.cs │ └── esrv_youtube.csproj ├── heritageskins_helper │ ├── Program.cs │ └── heritageskins_helper.csproj ├── msrv_skinner │ ├── EasyService.cs │ ├── SkinnerControl.Designer.cs │ ├── SkinnerControl.cs │ ├── SkinnerControl.resx │ └── msrv_skinner.csproj ├── msrv_soundcloud_plus │ ├── EasyService.cs │ ├── SoundCloudControl.Designer.cs │ ├── SoundCloudControl.cs │ ├── SoundCloudControl.resx │ └── msrv_soundcloud_plus.csproj ├── skinbrowser2_helper │ ├── Program.cs │ └── skinbrowser2_helper.csproj ├── skinmuseum_helper │ ├── Program.cs │ ├── Properties │ │ └── launchSettings.json │ └── skinmuseum_helper.csproj ├── skinner_helper │ ├── Form1.Designer.cs │ ├── Form1.cs │ ├── Form1.resx │ ├── Program.cs │ └── skinner_helper.csproj ├── srv_archiveskins │ ├── resource.h │ ├── srv_archiveskins.cpp │ ├── srv_archiveskins.rc │ ├── srv_archiveskins.vcxproj │ └── srv_archiveskins.vcxproj.filters ├── srv_heritageskins │ ├── resource.h │ ├── srv_heritageskins.cpp │ ├── srv_heritageskins.rc │ ├── srv_heritageskins.vcxproj │ └── srv_heritageskins.vcxproj.filters ├── srv_screensavers │ ├── resource.h │ ├── srv_screensavers.cpp │ ├── srv_screensavers.rc │ ├── srv_screensavers.vcxproj │ └── srv_screensavers.vcxproj.filters ├── srv_skinbrowser │ ├── resource.h │ ├── srv_skinbrowser.cpp │ ├── srv_skinbrowser.rc │ ├── srv_skinbrowser.vcxproj │ └── srv_skinbrowser.vcxproj.filters ├── srv_skinbrowser2 │ ├── resource.h │ ├── srv_skinbrowser2.cpp │ ├── srv_skinbrowser2.rc │ ├── srv_skinbrowser2.vcxproj │ └── srv_skinbrowser2.vcxproj.filters ├── srv_skinmuseum │ ├── resource.h │ ├── srv_skinmuseum.cpp │ ├── srv_skinmuseum.rc │ ├── srv_skinmuseum.vcxproj │ └── srv_skinmuseum.vcxproj.filters └── srv_steamimport │ ├── resource.h │ ├── srv_steamimport.cpp │ ├── srv_steamimport.rc │ ├── srv_steamimport.vcxproj │ └── srv_steamimport.vcxproj.filters ├── WinampEasyService ├── WebExamples │ └── wsrv_example.html ├── WinampEasyService.sln ├── esrv_cdlexampleexe │ ├── Form1.Designer.cs │ ├── Form1.cs │ ├── Form1.resx │ ├── Program.cs │ └── esrv_cdlexampleexe.csproj ├── esrv_exampleexe │ ├── Program.cs │ └── esrv_exampleexe.csproj ├── esrv_examplemulti │ ├── Program.cs │ └── esrv_examplemulti.csproj ├── in_easyfngetter │ ├── in_easyfngetter.cpp │ ├── in_easyfngetter.vcxproj │ └── in_easyfngetter.vcxproj.filters ├── isrv_mainpage │ ├── isrv_mainpage.cpp │ ├── isrv_mainpage.rc │ ├── isrv_mainpage.vcxproj │ ├── isrv_mainpage.vcxproj.filters │ └── resource.h ├── isrv_managed │ ├── Form1.Designer.cs │ ├── Form1.cs │ ├── Form1.resx │ ├── Program.cs │ └── isrv_managed.csproj ├── isrv_web │ ├── Form1.Designer.cs │ ├── Form1.cs │ ├── Form1.resx │ ├── Program.cs │ ├── Properties │ │ └── launchSettings.json │ ├── WinampJSObject.cs │ └── isrv_web.csproj ├── ml_easysrv │ ├── DLLService.cpp │ ├── EXEService.cpp │ ├── easysrv.h │ ├── easysrv_internal.h │ ├── img_util.cpp │ ├── img_util.h │ ├── ml_easysrv.cpp │ ├── ml_easysrv.rc │ ├── ml_easysrv.vcxproj │ ├── ml_easysrv.vcxproj.filters │ └── resource.h ├── msrv_cdlexampledll │ ├── EasyService.cs │ ├── ExampleUserControl.Designer.cs │ ├── ExampleUserControl.cs │ ├── ExampleUserControl.resx │ └── msrv_cdlexampledll.csproj ├── msrv_exampledll │ ├── EasyService.cs │ └── msrv_exampledll.csproj ├── msrv_examplemulti │ ├── EasyService.cs │ └── msrv_examplemulti.csproj ├── srv_cdlexampledll │ ├── ml_easysrv.rc │ ├── resource.h │ ├── srv_cdlexampledll.cpp │ ├── srv_cdlexampledll.vcxproj │ └── srv_cdlexampledll.vcxproj.filters ├── srv_exampledll │ ├── srv_exampledll.cpp │ ├── srv_exampledll.vcxproj │ └── srv_exampledll.vcxproj.filters ├── srv_examplemulti │ ├── srv_examplemulti.cpp │ ├── srv_examplemulti.vcxproj │ └── srv_examplemulti.vcxproj.filters └── srv_refidexample │ ├── srv_refidexample.cpp │ ├── srv_refidexample.vcxproj │ └── srv_refidexample.vcxproj.filters └── screenshot.png /LICENSE: -------------------------------------------------------------------------------- 1 | This is free and unencumbered software released into the public domain. 2 | 3 | Anyone is free to copy, modify, publish, use, compile, sell, or 4 | distribute this software, either in source code form or as a compiled 5 | binary, for any purpose, commercial or non-commercial, and by any 6 | means. 7 | 8 | In jurisdictions that recognize copyright laws, the author or authors 9 | of this software dedicate any and all copyright interest in the 10 | software to the public domain. We make this dedication for the benefit 11 | of the public at large and to the detriment of our heirs and 12 | successors. We intend this dedication to be an overt act of 13 | relinquishment in perpetuity of all present and future rights to this 14 | software under copyright law. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | 24 | For more information, please refer to 25 | -------------------------------------------------------------------------------- /LICENSES/CEFSHARP: -------------------------------------------------------------------------------- 1 | // Copyright © The CefSharp Authors. All rights reserved. 2 | // 3 | // Redistribution and use in source and binary forms, with or without 4 | // modification, are permitted provided that the following conditions are 5 | // met: 6 | // 7 | // * Redistributions of source code must retain the above copyright 8 | // notice, this list of conditions and the following disclaimer. 9 | // 10 | // * Redistributions in binary form must reproduce the above 11 | // copyright notice, this list of conditions and the following disclaimer 12 | // in the documentation and/or other materials provided with the 13 | // distribution. 14 | // 15 | // * Neither the name of Google Inc. nor the name Chromium Embedded 16 | // Framework nor the name CefSharp nor the names of its contributors 17 | // may be used to endorse or promote products derived from this software 18 | // without specific prior written permission. 19 | // 20 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23 | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 24 | // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 25 | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 26 | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 | // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 | // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30 | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- /LICENSES/MIT: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /LICENSES/UNLICENSE: -------------------------------------------------------------------------------- 1 | This is free and unencumbered software released into the public domain. 2 | 3 | Anyone is free to copy, modify, publish, use, compile, sell, or 4 | distribute this software, either in source code form or as a compiled 5 | binary, for any purpose, commercial or non-commercial, and by any 6 | means. 7 | 8 | In jurisdictions that recognize copyright laws, the author or authors 9 | of this software dedicate any and all copyright interest in the 10 | software to the public domain. We make this dedication for the benefit 11 | of the public at large and to the detriment of our heirs and 12 | successors. We intend this dedication to be an overt act of 13 | relinquishment in perpetuity of all present and future rights to this 14 | software under copyright law. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | 24 | For more information, please refer to 25 | -------------------------------------------------------------------------------- /NOTICE: -------------------------------------------------------------------------------- 1 | NOTICE AND ATTRIBUTION 2 | ---------------------- 3 | 4 | WinampEasyService: 5 | - Code in this repository 6 | - License: The Unlicense 7 | - License File: LICENSE, LICENSES/UNLICENSE 8 | - CefSharp.WinForms.NETCore 9 | - License: Custom (see file) 10 | - License file: LICENSES/CEFSHARP 11 | - Obtained from: https://www.nuget.org/packages/CefSharp.WinForms.NETCore/120.2.70 12 | - Copyright: (c) The CefSharp Authors. All rights reserved. 13 | 14 | ServicePlugins: 15 | - Code in this repository 16 | - License: The Unlicense 17 | - License File: LICENSE, LICENSES/UNLICENSE 18 | - SoundCloudExplode 19 | - License: LGPL-3.0-only 20 | - License File: LICENSES/LGPL-3 21 | - Obtained from: https://www.nuget.org/packages/SoundCloudExplode/1.5.0 22 | - Copyright: (c) Jerry Berry 23 | - SpotifyExplode 24 | - License: LGPL-3.0-only 25 | - License File: LICENSES/LGPL-3 26 | - Obtained from: https://www.nuget.org/packages/SpotifyExplode/1.0.7 27 | - Copyright: (c) Jerry Berry 28 | - YoutubeExplode 29 | - License: LGPL-3.0-only 30 | - License File: LICENSES/LGPL-3 31 | - Obtained from: https://www.nuget.org/packages/YoutubeExplode/6.3.1 32 | - Copyright: (c) Oleksii Holub 33 | - TagLibSharp 34 | - License: LGPL-2.1-only 35 | - License File: LICENSES/LGPL-2.1 36 | - Obtained from: https://www.nuget.org/packages/TagLibSharp/2.3.0 37 | - Copyright: (c) 2006-2007 Brian Nickel. (c) 2009-2020 Other contributors 38 | - Newtonsoft.Json 39 | - License: MIT 40 | - License File: LICENSES/MIT 41 | - Copyright: (c) James Newton-King 2008 42 | - System.Drawing.Common 43 | - License: MIT 44 | - License File: LICENSES/MIT 45 | - Copyright: (c) Microsoft Corporation. All rights reserved. -------------------------------------------------------------------------------- /ServicePlugins/Web/wsrv_soundcloud.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 14 | 15 | -------------------------------------------------------------------------------- /ServicePlugins/Web/wsrv_spotify.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 14 | 15 | -------------------------------------------------------------------------------- /ServicePlugins/Web/wsrv_youtube.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 13 | 14 | -------------------------------------------------------------------------------- /ServicePlugins/archiveskins_helper/Program.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json.Linq; 2 | using System; 3 | using System.Drawing; 4 | using System.Drawing.Imaging; 5 | using System.Security.Cryptography; 6 | 7 | namespace archiveskins_helper 8 | { 9 | internal class Program 10 | { 11 | static async Task Main(string[] args) 12 | { 13 | if (args[0] == "page") 14 | { 15 | // page 16 | await CreatePageCache(int.Parse(args[1]), int.Parse(args[2]), args[3]); 17 | } 18 | else if (args[0] == "download") 19 | { 20 | // download 21 | await DownloadFileAsync(args[1], args[2], args[3]); 22 | } 23 | else 24 | { 25 | Console.WriteLine("Oops..."); 26 | } 27 | } 28 | 29 | static async Task CreatePageCache(int pageNum, int pageLength, string cacheDir) 30 | { 31 | Directory.CreateDirectory(cacheDir); 32 | 33 | using (var client = new HttpClient()) 34 | { 35 | string pageURL = $"https://archive.org/advancedsearch.php?q=collection%3A(winampskins)&fl[]=identifier&fl[]=name&fl[]=source&fl[]=title&rows={pageLength}&page={pageNum}&output=json"; 36 | string resultString = await client.GetStringAsync(pageURL); 37 | JObject resultJSON = JObject.Parse(resultString); 38 | 39 | using (StreamWriter writer = new StreamWriter($"{cacheDir}\\page.txt")) 40 | { 41 | foreach (var node in resultJSON["response"]["docs"]) 42 | { 43 | string objectID = node["identifier"].ToString(); 44 | string title = node["title"].ToString(); 45 | 46 | // Get metadata for this specific object 47 | string metaURL = $"https://archive.org/metadata/{objectID}"; 48 | string metaResultString = await client.GetStringAsync(metaURL); 49 | JObject metaResultJSON = JObject.Parse(metaResultString); 50 | 51 | string[] validExts = { ".wsz", ".wal", ".zip" }; 52 | bool found = false; 53 | string filename = "NOT FOUND"; 54 | foreach (var fileDesc in metaResultJSON["files"]) 55 | { 56 | string currentFilename = fileDesc["name"].ToString(); 57 | if (validExts.Contains(currentFilename.Substring(currentFilename.Length - 4))) 58 | { 59 | found = true; 60 | filename = currentFilename; 61 | break; 62 | } 63 | } 64 | 65 | if (found) 66 | { 67 | writer.WriteLine(objectID); 68 | writer.WriteLine(title); 69 | writer.WriteLine(filename); 70 | 71 | await DownloadThumbnailAsync(objectID, cacheDir + "\\" + objectID + ".bmp"); 72 | } 73 | } 74 | 75 | writer.WriteLine(""); 76 | } 77 | } 78 | } 79 | 80 | static async Task DownloadThumbnailAsync(string objectID, string outputFile) 81 | { 82 | if (!File.Exists(outputFile)) 83 | { 84 | using (var client = new HttpClient()) 85 | { 86 | var response = await client.GetAsync($"https://archive.org/download/{objectID}/__ia_thumb.jpg"); 87 | Image imageData = Image.FromStream(response.Content.ReadAsStream()); 88 | imageData.Save(outputFile, ImageFormat.Bmp); 89 | } 90 | } 91 | } 92 | 93 | static async Task DownloadFileAsync(string objectID, string filename, string outputFile) 94 | { 95 | if (!File.Exists(outputFile)) 96 | { 97 | using (var client = new HttpClient()) 98 | { 99 | var response = await client.GetAsync($"https://archive.org/download/{objectID}/{filename}"); 100 | using (var fs = new FileStream(outputFile, FileMode.Create)) 101 | { 102 | await response.Content.CopyToAsync(fs); 103 | } 104 | } 105 | } 106 | } 107 | } 108 | } 109 | -------------------------------------------------------------------------------- /ServicePlugins/archiveskins_helper/archiveskins_helper.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Exe 5 | net6.0 6 | enable 7 | enable 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /ServicePlugins/esrv_bandcamp/Form1.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace esrv_bandcamp 2 | { 3 | partial class Form1 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | label1 = new Label(); 32 | usernameBox = new TextBox(); 33 | label2 = new Label(); 34 | identityBox = new TextBox(); 35 | saveCheckBox = new CheckBox(); 36 | button1 = new Button(); 37 | SuspendLayout(); 38 | // 39 | // label1 40 | // 41 | label1.AutoSize = true; 42 | label1.Location = new Point(12, 9); 43 | label1.Name = "label1"; 44 | label1.Size = new Size(63, 15); 45 | label1.TabIndex = 0; 46 | label1.Text = "Username:"; 47 | // 48 | // usernameBox 49 | // 50 | usernameBox.Location = new Point(81, 6); 51 | usernameBox.Name = "usernameBox"; 52 | usernameBox.Size = new Size(613, 23); 53 | usernameBox.TabIndex = 1; 54 | // 55 | // label2 56 | // 57 | label2.AutoSize = true; 58 | label2.Location = new Point(12, 37); 59 | label2.Name = "label2"; 60 | label2.Size = new Size(50, 15); 61 | label2.TabIndex = 2; 62 | label2.Text = "Identity:"; 63 | // 64 | // identityBox 65 | // 66 | identityBox.Location = new Point(81, 34); 67 | identityBox.Name = "identityBox"; 68 | identityBox.Size = new Size(613, 23); 69 | identityBox.TabIndex = 3; 70 | // 71 | // saveCheckBox 72 | // 73 | saveCheckBox.AutoSize = true; 74 | saveCheckBox.Location = new Point(12, 66); 75 | saveCheckBox.Name = "saveCheckBox"; 76 | saveCheckBox.Size = new Size(50, 19); 77 | saveCheckBox.TabIndex = 4; 78 | saveCheckBox.Text = "Save"; 79 | saveCheckBox.UseVisualStyleBackColor = true; 80 | // 81 | // button1 82 | // 83 | button1.Location = new Point(81, 63); 84 | button1.Name = "button1"; 85 | button1.Size = new Size(613, 23); 86 | button1.TabIndex = 5; 87 | button1.Text = "Load Purchases"; 88 | button1.UseVisualStyleBackColor = true; 89 | button1.Click += button1_Click; 90 | // 91 | // Form1 92 | // 93 | AcceptButton = button1; 94 | AutoScaleDimensions = new SizeF(7F, 15F); 95 | AutoScaleMode = AutoScaleMode.Font; 96 | ClientSize = new Size(706, 97); 97 | Controls.Add(button1); 98 | Controls.Add(saveCheckBox); 99 | Controls.Add(identityBox); 100 | Controls.Add(label2); 101 | Controls.Add(usernameBox); 102 | Controls.Add(label1); 103 | MaximizeBox = false; 104 | MinimizeBox = false; 105 | Name = "Form1"; 106 | StartPosition = FormStartPosition.CenterScreen; 107 | Text = "Bandcamp Authentication"; 108 | Load += Form1_Load; 109 | ResumeLayout(false); 110 | PerformLayout(); 111 | } 112 | 113 | #endregion 114 | 115 | private Label label1; 116 | private TextBox usernameBox; 117 | private Label label2; 118 | private TextBox identityBox; 119 | private CheckBox saveCheckBox; 120 | private Button button1; 121 | } 122 | } -------------------------------------------------------------------------------- /ServicePlugins/esrv_bandcamp/Form1.cs: -------------------------------------------------------------------------------- 1 | using System.Net; 2 | using System.Runtime.InteropServices; 3 | using System.Text.RegularExpressions; 4 | using System.Web; 5 | 6 | namespace esrv_bandcamp 7 | { 8 | public partial class Form1 : Form 9 | { 10 | [DllImport("user32.dll")] 11 | static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 12 | 13 | const int SW_HIDE = 0; 14 | const int SW_SHOW = 5; 15 | 16 | string saveFileName; 17 | 18 | public Form1(string _saveFileName) 19 | { 20 | saveFileName = _saveFileName; 21 | InitializeComponent(); 22 | } 23 | 24 | private void Form1_Load(object sender, EventArgs e) 25 | { 26 | ShowWindow(this.Handle, SW_SHOW); 27 | 28 | if (File.Exists(saveFileName)) 29 | { 30 | string[] lines = File.ReadAllLines(saveFileName); 31 | usernameBox.Text = lines[0]; 32 | identityBox.Text = lines[1]; 33 | saveCheckBox.Checked = true; 34 | } 35 | } 36 | 37 | private async void button1_Click(object sender, EventArgs e) 38 | { 39 | usernameBox.Enabled = false; 40 | identityBox.Enabled = false; 41 | saveCheckBox.Enabled = false; 42 | button1.Enabled = false; 43 | button1.Text = "Please wait..."; 44 | 45 | if (saveCheckBox.Checked) 46 | { 47 | File.WriteAllLines(saveFileName, new string[] { usernameBox.Text, identityBox.Text }); 48 | } 49 | 50 | using (var client = new HttpClient()) 51 | { 52 | client.DefaultRequestHeaders.Add("Cookie", "identity=" + identityBox.Text); 53 | string purchasesPageURL = @"https://bandcamp.com/" + usernameBox.Text + @"/purchases"; 54 | string purchasesPage = await client.GetStringAsync(purchasesPageURL); 55 | 56 | List artists = new List(); 57 | List titles = new List(); 58 | 59 | var titleRegex = new Regex(@""item_title":".*?""); 60 | var titleMatches = titleRegex.Matches(purchasesPage); 61 | foreach (Match match in titleMatches) 62 | { 63 | string matchValue = match.Value; 64 | string title = match.Value.Substring(29, matchValue.Length - 35); 65 | titles.Add(title); 66 | } 67 | 68 | var artistRegex = new Regex(@""artist_name":".*?""); 69 | var artistMatches = artistRegex.Matches(purchasesPage); 70 | foreach (Match match in artistMatches) 71 | { 72 | string matchValue = match.Value; 73 | string artist = match.Value.Substring(30, matchValue.Length - 36); 74 | artists.Add(artist); 75 | } 76 | 77 | for (int i = 0; i < titles.Count; i++) 78 | { 79 | Console.WriteLine($"{artists[i]}\t{titles[i]}\tPurchased by {usernameBox.Text}"); 80 | Console.WriteLine($"{artists[i]} - {titles[i]}"); 81 | Console.WriteLine($"ref_{i}_{usernameBox.Text}_{identityBox.Text}"); 82 | } 83 | 84 | Application.Exit(); 85 | } 86 | } 87 | } 88 | } -------------------------------------------------------------------------------- /ServicePlugins/esrv_bandcamp/Program.cs: -------------------------------------------------------------------------------- 1 | using System.Runtime.InteropServices; 2 | using System.Text; 3 | using System.Text.RegularExpressions; 4 | 5 | namespace esrv_bandcamp 6 | { 7 | internal static class Program 8 | { 9 | /// 10 | /// The main entry point for the application. 11 | /// 12 | [STAThread] 13 | static async Task Main(string[] args) 14 | { 15 | const uint CAP_DEFAULT = 0; 16 | const uint CAP_CUSTOMDIALOG = 1; 17 | 18 | if (args[0] == "GetNodeDesc") 19 | { 20 | Console.WriteLine("Media"); 21 | Console.WriteLine("Bandcamp"); 22 | Console.WriteLine("Author\tTitle\tPurchase status"); 23 | Console.WriteLine(CAP_DEFAULT); 24 | } 25 | else if (args[0] == "InvokeService") 26 | { 27 | string cachePath = System.IO.Path.GetTempPath(); 28 | string saveFileName = System.IO.Path.Join(cachePath, "spotify_saved_login"); 29 | 30 | ApplicationConfiguration.Initialize(); 31 | Application.Run(new Form1(saveFileName)); 32 | } 33 | else if (args[0] == "GetFileName") 34 | { 35 | // args[1]: ref_{i}_{username}_{identity} 36 | string[] parts = args[1].Split('_'); 37 | 38 | int index = int.Parse(parts[1]); 39 | string username = parts[2]; 40 | string identity = parts[3]; 41 | string cachePath = System.IO.Path.GetTempPath(); 42 | 43 | using (var client = new HttpClient()) 44 | { 45 | client.DefaultRequestHeaders.Add("Cookie", "identity=" + identity); 46 | string purchasesPageURL = @"https://bandcamp.com/" + username + @"/purchases"; 47 | string purchasesPage = await client.GetStringAsync(purchasesPageURL); 48 | 49 | var linkRegex = new Regex(@""https://bandcamp.com/download\?.*?""); 50 | var matches = linkRegex.Matches(purchasesPage); 51 | string matchValue = matches[index].Value; 52 | string downloadPageURL = matchValue.Substring(6, matchValue.Length - 12).Replace(@"&", "&"); 53 | string downloadPage = await client.GetStringAsync(downloadPageURL); 54 | 55 | var downloadRegex = new Regex(@""https://.{1,20}\.bandcamp.com/download/.*?""); 56 | var downloadMatchValue = downloadRegex.Match(downloadPage).Value; 57 | string downloadURL = downloadMatchValue.Substring(6, matchValue.Length - 11).Replace(@"&", "&"); 58 | 59 | string fileType = "mp3"; 60 | if (downloadURL.Contains("/album")) 61 | fileType = "zip"; 62 | string outputFile = System.IO.Path.Join(cachePath, $"bandcamp_{index}.{fileType}"); 63 | 64 | if (File.Exists(outputFile)) 65 | { 66 | Console.WriteLine(outputFile); 67 | } 68 | else 69 | { 70 | var response = await client.GetAsync(downloadURL); 71 | using (var fs = new FileStream(outputFile, FileMode.Create)) 72 | { 73 | await response.Content.CopyToAsync(fs); 74 | } 75 | Console.WriteLine(outputFile); 76 | } 77 | } 78 | } 79 | } 80 | } 81 | } -------------------------------------------------------------------------------- /ServicePlugins/esrv_bandcamp/esrv_bandcamp.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Exe 5 | net6.0-windows 6 | enable 7 | true 8 | enable 9 | 10 | 11 | -------------------------------------------------------------------------------- /ServicePlugins/esrv_localsearch/Form1.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace esrv_localsearch 2 | { 3 | partial class Form1 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | label1 = new Label(); 32 | directoryBox = new TextBox(); 33 | selectButton = new Button(); 34 | label2 = new Label(); 35 | patternBox = new TextBox(); 36 | recursiveBox = new CheckBox(); 37 | searchButton = new Button(); 38 | folderBrowserDialog1 = new FolderBrowserDialog(); 39 | SuspendLayout(); 40 | // 41 | // label1 42 | // 43 | label1.AutoSize = true; 44 | label1.Location = new Point(12, 9); 45 | label1.Name = "label1"; 46 | label1.Size = new Size(58, 15); 47 | label1.TabIndex = 0; 48 | label1.Text = "Directory:"; 49 | // 50 | // directoryBox 51 | // 52 | directoryBox.Location = new Point(76, 6); 53 | directoryBox.Name = "directoryBox"; 54 | directoryBox.Size = new Size(354, 23); 55 | directoryBox.TabIndex = 1; 56 | // 57 | // selectButton 58 | // 59 | selectButton.Location = new Point(436, 6); 60 | selectButton.Name = "selectButton"; 61 | selectButton.Size = new Size(75, 23); 62 | selectButton.TabIndex = 2; 63 | selectButton.Text = "Select..."; 64 | selectButton.UseVisualStyleBackColor = true; 65 | selectButton.Click += selectButton_Click; 66 | // 67 | // label2 68 | // 69 | label2.AutoSize = true; 70 | label2.Location = new Point(12, 38); 71 | label2.Name = "label2"; 72 | label2.Size = new Size(48, 15); 73 | label2.TabIndex = 3; 74 | label2.Text = "Pattern:"; 75 | // 76 | // patternBox 77 | // 78 | patternBox.Location = new Point(76, 35); 79 | patternBox.Name = "patternBox"; 80 | patternBox.Size = new Size(354, 23); 81 | patternBox.TabIndex = 4; 82 | // 83 | // recursiveBox 84 | // 85 | recursiveBox.AutoSize = true; 86 | recursiveBox.Checked = true; 87 | recursiveBox.CheckState = CheckState.Checked; 88 | recursiveBox.Location = new Point(436, 38); 89 | recursiveBox.Name = "recursiveBox"; 90 | recursiveBox.Size = new Size(76, 19); 91 | recursiveBox.TabIndex = 5; 92 | recursiveBox.Text = "Recursive"; 93 | recursiveBox.UseVisualStyleBackColor = true; 94 | // 95 | // searchButton 96 | // 97 | searchButton.Location = new Point(12, 64); 98 | searchButton.Name = "searchButton"; 99 | searchButton.Size = new Size(499, 23); 100 | searchButton.TabIndex = 6; 101 | searchButton.Text = "Search"; 102 | searchButton.UseVisualStyleBackColor = true; 103 | searchButton.Click += searchButton_Click; 104 | // 105 | // Form1 106 | // 107 | AcceptButton = searchButton; 108 | AutoScaleDimensions = new SizeF(7F, 15F); 109 | AutoScaleMode = AutoScaleMode.Font; 110 | ClientSize = new Size(521, 98); 111 | Controls.Add(searchButton); 112 | Controls.Add(recursiveBox); 113 | Controls.Add(patternBox); 114 | Controls.Add(label2); 115 | Controls.Add(selectButton); 116 | Controls.Add(directoryBox); 117 | Controls.Add(label1); 118 | MaximizeBox = false; 119 | MinimizeBox = false; 120 | Name = "Form1"; 121 | StartPosition = FormStartPosition.CenterScreen; 122 | Text = "Local File Search"; 123 | Load += Form1_Load; 124 | ResumeLayout(false); 125 | PerformLayout(); 126 | } 127 | 128 | #endregion 129 | 130 | private Label label1; 131 | private TextBox directoryBox; 132 | private Button selectButton; 133 | private Label label2; 134 | private TextBox patternBox; 135 | private CheckBox recursiveBox; 136 | private Button searchButton; 137 | private FolderBrowserDialog folderBrowserDialog1; 138 | } 139 | } -------------------------------------------------------------------------------- /ServicePlugins/esrv_localsearch/Form1.cs: -------------------------------------------------------------------------------- 1 | using System.Runtime.InteropServices; 2 | 3 | namespace esrv_localsearch 4 | { 5 | public partial class Form1 : Form 6 | { 7 | [DllImport("user32.dll")] 8 | static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 9 | 10 | const int SW_HIDE = 0; 11 | const int SW_SHOW = 5; 12 | 13 | public Form1() 14 | { 15 | InitializeComponent(); 16 | } 17 | 18 | private void Form1_Load(object sender, EventArgs e) 19 | { 20 | ShowWindow(this.Handle, SW_SHOW); 21 | } 22 | 23 | private void selectButton_Click(object sender, EventArgs e) 24 | { 25 | if (folderBrowserDialog1.ShowDialog() == DialogResult.OK) 26 | directoryBox.Text = folderBrowserDialog1.SelectedPath; 27 | } 28 | 29 | private void searchButton_Click(object sender, EventArgs e) 30 | { 31 | directoryBox.Enabled = false; 32 | patternBox.Enabled = false; 33 | recursiveBox.Enabled = false; 34 | selectButton.Enabled = false; 35 | searchButton.Enabled = false; 36 | searchButton.Text = "Please wait..."; 37 | 38 | foreach (string fileName in Directory.EnumerateFiles(directoryBox.Text, patternBox.Text, recursiveBox.Checked ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly)) 39 | { 40 | Console.WriteLine(System.IO.Path.GetFileName(fileName) + "\t" + fileName); 41 | Console.WriteLine(System.IO.Path.GetFileName(fileName)); 42 | Console.WriteLine(fileName); 43 | } 44 | 45 | Application.Exit(); 46 | } 47 | } 48 | } -------------------------------------------------------------------------------- /ServicePlugins/esrv_localsearch/Program.cs: -------------------------------------------------------------------------------- 1 | namespace esrv_localsearch 2 | { 3 | internal static class Program 4 | { 5 | /// 6 | /// The main entry point for the application. 7 | /// 8 | [STAThread] 9 | static void Main(string[] args) 10 | { 11 | const uint CAP_DEFAULT = 0; 12 | const uint CAP_CUSTOMDIALOG = 1; 13 | 14 | if (args[0] == "GetNodeDesc") 15 | { 16 | Console.WriteLine("Media"); 17 | Console.WriteLine("Local Search"); 18 | Console.WriteLine("Filename\tFull path"); 19 | Console.WriteLine(CAP_DEFAULT); 20 | } 21 | else if (args[0] == "InvokeService") 22 | { 23 | ApplicationConfiguration.Initialize(); 24 | Application.Run(new Form1()); 25 | } 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /ServicePlugins/esrv_localsearch/Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace esrv_localsearch.Properties { 12 | using System; 13 | 14 | 15 | /// 16 | /// A strongly-typed resource class, for looking up localized strings, etc. 17 | /// 18 | // This class was auto-generated by the StronglyTypedResourceBuilder 19 | // class via a tool like ResGen or Visual Studio. 20 | // To add or remove a member, edit your .ResX file then rerun ResGen 21 | // with the /str option, or rebuild your VS project. 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class Resources { 26 | 27 | private static global::System.Resources.ResourceManager resourceMan; 28 | 29 | private static global::System.Globalization.CultureInfo resourceCulture; 30 | 31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 32 | internal Resources() { 33 | } 34 | 35 | /// 36 | /// Returns the cached ResourceManager instance used by this class. 37 | /// 38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 39 | internal static global::System.Resources.ResourceManager ResourceManager { 40 | get { 41 | if (object.ReferenceEquals(resourceMan, null)) { 42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("esrv_localsearch.Properties.Resources", typeof(Resources).Assembly); 43 | resourceMan = temp; 44 | } 45 | return resourceMan; 46 | } 47 | } 48 | 49 | /// 50 | /// Overrides the current thread's CurrentUICulture property for all 51 | /// resource lookups using this strongly typed resource class. 52 | /// 53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 54 | internal static global::System.Globalization.CultureInfo Culture { 55 | get { 56 | return resourceCulture; 57 | } 58 | set { 59 | resourceCulture = value; 60 | } 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /ServicePlugins/esrv_localsearch/esrv_localsearch.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | WinExe 5 | net6.0-windows 6 | enable 7 | true 8 | enable 9 | 10 | 11 | 12 | 13 | True 14 | True 15 | Resources.resx 16 | 17 | 18 | 19 | 20 | 21 | ResXFileCodeGenerator 22 | Resources.Designer.cs 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /ServicePlugins/esrv_soundcloud/Form1.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace esrv_soundcloud 2 | { 3 | partial class Form1 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | label1 = new Label(); 32 | textBox1 = new TextBox(); 33 | button1 = new Button(); 34 | SuspendLayout(); 35 | // 36 | // label1 37 | // 38 | label1.AutoSize = true; 39 | label1.Location = new Point(12, 9); 40 | label1.Name = "label1"; 41 | label1.Size = new Size(45, 15); 42 | label1.TabIndex = 0; 43 | label1.Text = "Search:"; 44 | // 45 | // textBox1 46 | // 47 | textBox1.Location = new Point(63, 6); 48 | textBox1.Name = "textBox1"; 49 | textBox1.Size = new Size(283, 23); 50 | textBox1.TabIndex = 1; 51 | // 52 | // button1 53 | // 54 | button1.Location = new Point(12, 35); 55 | button1.Name = "button1"; 56 | button1.Size = new Size(334, 23); 57 | button1.TabIndex = 2; 58 | button1.Text = "Search"; 59 | button1.UseVisualStyleBackColor = true; 60 | button1.Click += button1_Click; 61 | // 62 | // Form1 63 | // 64 | AcceptButton = button1; 65 | AutoScaleDimensions = new SizeF(7F, 15F); 66 | AutoScaleMode = AutoScaleMode.Font; 67 | ClientSize = new Size(356, 66); 68 | Controls.Add(button1); 69 | Controls.Add(textBox1); 70 | Controls.Add(label1); 71 | MaximizeBox = false; 72 | MinimizeBox = false; 73 | Name = "Form1"; 74 | StartPosition = FormStartPosition.CenterScreen; 75 | Text = "SoundCloud Search"; 76 | Load += Form1_Load; 77 | ResumeLayout(false); 78 | PerformLayout(); 79 | } 80 | 81 | #endregion 82 | 83 | private Label label1; 84 | private TextBox textBox1; 85 | private Button button1; 86 | } 87 | } -------------------------------------------------------------------------------- /ServicePlugins/esrv_soundcloud/Form1.cs: -------------------------------------------------------------------------------- 1 | using SoundCloudExplode; 2 | using SoundCloudExplode.Search; 3 | using System.Runtime.InteropServices; 4 | 5 | namespace esrv_soundcloud 6 | { 7 | public partial class Form1 : Form 8 | { 9 | [DllImport("user32.dll")] 10 | static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 11 | 12 | const int SW_HIDE = 0; 13 | const int SW_SHOW = 5; 14 | 15 | bool _directLink; 16 | 17 | public Form1(bool directLink) 18 | { 19 | _directLink = directLink; 20 | InitializeComponent(); 21 | } 22 | 23 | private void Form1_Load(object sender, EventArgs e) 24 | { 25 | ShowWindow(this.Handle, SW_SHOW); 26 | } 27 | 28 | private async void button1_Click(object sender, EventArgs e) 29 | { 30 | textBox1.Enabled = false; 31 | button1.Enabled = false; 32 | button1.Text = "Please wait..."; 33 | 34 | var soundcloud = new SoundCloudClient(); 35 | var results = await soundcloud.Search.GetResultsAsync(textBox1.Text); 36 | foreach (var result in results) 37 | { 38 | switch (result) 39 | { 40 | case TrackSearchResult track: 41 | { 42 | string author = track?.User?.FullName; 43 | if (string.IsNullOrEmpty(author)) 44 | author = "Unknown"; 45 | 46 | Console.WriteLine($"{author}\t{track.Title}\t{track.Url}"); 47 | Console.WriteLine($"{author} - {track.Title}"); 48 | if (_directLink) 49 | { 50 | var downloadURL = await soundcloud.Tracks.GetDownloadUrlAsync(track); 51 | Console.WriteLine(downloadURL); 52 | } 53 | else 54 | { 55 | Console.WriteLine("ref_" + track.Id); 56 | } 57 | break; 58 | } 59 | } 60 | } 61 | 62 | Application.Exit(); 63 | } 64 | } 65 | } -------------------------------------------------------------------------------- /ServicePlugins/esrv_soundcloud/Program.cs: -------------------------------------------------------------------------------- 1 | using SoundCloudExplode; 2 | using SoundCloudExplode.Search; 3 | using System.Runtime.InteropServices; 4 | using System.Text; 5 | 6 | namespace esrv_soundcloud 7 | { 8 | internal static class Program 9 | { 10 | /// 11 | /// The main entry point for the application. 12 | /// 13 | [STAThread] 14 | static async Task Main(string[] args) 15 | { 16 | const uint CAP_DEFAULT = 0; 17 | const uint CAP_CUSTOMDIALOG = 1; 18 | 19 | if (args[0] == "GetNodeDesc") 20 | { 21 | Console.WriteLine("Media"); 22 | Console.WriteLine("SoundCloud"); 23 | Console.WriteLine("Author\tTitle\tPage URL"); 24 | Console.WriteLine(CAP_DEFAULT); 25 | } 26 | else if (args[0] == "InvokeService") 27 | { 28 | ApplicationConfiguration.Initialize(); 29 | Application.Run(new Form1(true)); 30 | } 31 | else if (args[0] == "GetFileName") 32 | { 33 | string trackID = args[1].Substring(4); 34 | string cachePath = System.IO.Path.GetTempPath(); 35 | 36 | var soundcloud = new SoundCloudClient(); 37 | var track = await soundcloud.Tracks.GetByIdAsync(long.Parse(trackID)); 38 | var downloadURL = await soundcloud.Tracks.GetDownloadUrlAsync(track); 39 | Console.WriteLine(downloadURL); 40 | } 41 | else if (args[0] == "internal") 42 | { 43 | // Extra functionality to support the SoundCloud+ plugin 44 | string pageCacheName = System.IO.Path.Join(System.IO.Path.GetTempPath(), "sc_plus_page.txt"); 45 | using (StreamWriter writer = new StreamWriter(pageCacheName)) 46 | { 47 | if (args[1] == "search") 48 | { 49 | var soundcloud = new SoundCloudClient(); 50 | var results = await soundcloud.Search.GetResultsAsync(args[3]); 51 | foreach (var result in results) 52 | { 53 | switch (result) 54 | { 55 | case TrackSearchResult track: 56 | { 57 | if (args[2] == "media") 58 | { 59 | string author = track?.User?.FullName; 60 | if (string.IsNullOrEmpty(author)) 61 | author = "Unknown"; 62 | 63 | var downloadURL = await soundcloud.Tracks.GetDownloadUrlAsync(track); 64 | writer.WriteLine($"{author}\t{track.Title}\tMedia\t{track.Url}\t{downloadURL}"); 65 | } 66 | break; 67 | } 68 | case PlaylistSearchResult playlist: 69 | { 70 | if (args[2] == "list") 71 | { 72 | string creator = playlist?.User?.FullName; 73 | if (string.IsNullOrEmpty(creator)) 74 | creator = "Unknown"; 75 | 76 | writer.WriteLine($"{creator}\t{playlist.Title}\tList\t{playlist.Url}\t{playlist.Url}"); 77 | } 78 | break; 79 | } 80 | } 81 | } 82 | } 83 | else if (args[1] == "openlist") 84 | { 85 | var soundcloud = new SoundCloudClient(); 86 | var tracks = await soundcloud.Playlists.GetTracksAsync(args[2]); 87 | 88 | foreach (var track in tracks) 89 | { 90 | string author = track?.User?.FullName; 91 | if (string.IsNullOrEmpty(author)) 92 | author = "Unknown"; 93 | 94 | var downloadURL = await soundcloud.Tracks.GetDownloadUrlAsync(track); 95 | writer.WriteLine($"{author}\t{track.Title}\tMedia\t{track.Uri}\t{downloadURL}"); 96 | } 97 | } 98 | } 99 | } 100 | } 101 | } 102 | } -------------------------------------------------------------------------------- /ServicePlugins/esrv_soundcloud/esrv_soundcloud.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Exe 5 | net6.0-windows 6 | enable 7 | true 8 | enable 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /ServicePlugins/esrv_spotify/Form1.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace esrv_spotify 2 | { 3 | partial class Form1 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | label1 = new Label(); 32 | textBox1 = new TextBox(); 33 | button1 = new Button(); 34 | SuspendLayout(); 35 | // 36 | // label1 37 | // 38 | label1.AutoSize = true; 39 | label1.Location = new Point(12, 9); 40 | label1.Name = "label1"; 41 | label1.Size = new Size(45, 15); 42 | label1.TabIndex = 0; 43 | label1.Text = "Search:"; 44 | // 45 | // textBox1 46 | // 47 | textBox1.Location = new Point(63, 6); 48 | textBox1.Name = "textBox1"; 49 | textBox1.Size = new Size(281, 23); 50 | textBox1.TabIndex = 1; 51 | // 52 | // button1 53 | // 54 | button1.Location = new Point(12, 35); 55 | button1.Name = "button1"; 56 | button1.Size = new Size(332, 23); 57 | button1.TabIndex = 2; 58 | button1.Text = "Search"; 59 | button1.UseVisualStyleBackColor = true; 60 | button1.Click += button1_Click; 61 | // 62 | // Form1 63 | // 64 | AcceptButton = button1; 65 | AutoScaleDimensions = new SizeF(7F, 15F); 66 | AutoScaleMode = AutoScaleMode.Font; 67 | ClientSize = new Size(355, 66); 68 | Controls.Add(button1); 69 | Controls.Add(textBox1); 70 | Controls.Add(label1); 71 | MaximizeBox = false; 72 | MinimizeBox = false; 73 | Name = "Form1"; 74 | StartPosition = FormStartPosition.CenterScreen; 75 | Text = "Spotify Search"; 76 | Load += Form1_Load; 77 | ResumeLayout(false); 78 | PerformLayout(); 79 | } 80 | 81 | #endregion 82 | 83 | private Label label1; 84 | private TextBox textBox1; 85 | private Button button1; 86 | } 87 | } -------------------------------------------------------------------------------- /ServicePlugins/esrv_spotify/Form1.cs: -------------------------------------------------------------------------------- 1 | using SpotifyExplode; 2 | using SpotifyExplode.Search; 3 | using System.Runtime.InteropServices; 4 | using YoutubeExplode; 5 | using YoutubeExplode.Common; 6 | using YoutubeExplode.Videos; 7 | using YoutubeExplode.Videos.Streams; 8 | 9 | namespace esrv_spotify 10 | { 11 | public partial class Form1 : Form 12 | { 13 | [DllImport("user32.dll")] 14 | static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 15 | 16 | const int SW_HIDE = 0; 17 | const int SW_SHOW = 5; 18 | 19 | bool _directLink; 20 | 21 | public Form1(bool directLink) 22 | { 23 | _directLink = directLink; 24 | 25 | InitializeComponent(); 26 | } 27 | 28 | private void Form1_Load(object sender, EventArgs e) 29 | { 30 | ShowWindow(this.Handle, SW_SHOW); 31 | } 32 | 33 | private async void button1_Click(object sender, EventArgs e) 34 | { 35 | textBox1.Enabled = false; 36 | button1.Enabled = false; 37 | button1.Text = "Please wait..."; 38 | 39 | var spotify = new SpotifyClient(); 40 | var results = await spotify.Search.GetResultsAsync(textBox1.Text); 41 | 42 | foreach (var item in results) 43 | { 44 | switch (item) 45 | { 46 | case TrackSearchResult track: 47 | { 48 | Console.WriteLine(track.Title + "\t" + track.Url); 49 | Console.WriteLine(track.Title); 50 | 51 | if (_directLink) 52 | { 53 | var downloadUrl = await spotify.Tracks.GetDownloadUrlAsync(track.Url); 54 | if (!string.IsNullOrEmpty(downloadUrl)) 55 | { 56 | Console.WriteLine(downloadUrl); 57 | } 58 | else 59 | { 60 | string videoID = await spotify.Tracks.GetYoutubeIdAsync(track.Url); 61 | var youtube = new YoutubeClient(); 62 | var streamManifest = await youtube.Videos.Streams.GetManifestAsync("https://www.youtube.com/watch?v=" + videoID); 63 | var streamInfo = streamManifest.GetAudioOnlyStreams().GetWithHighestBitrate(); 64 | Console.WriteLine(streamInfo.Url); 65 | } 66 | } 67 | else 68 | { 69 | Console.WriteLine("ref_" + track.Id); 70 | } 71 | 72 | break; 73 | } 74 | } 75 | } 76 | 77 | Application.Exit(); 78 | } 79 | } 80 | } -------------------------------------------------------------------------------- /ServicePlugins/esrv_spotify/Program.cs: -------------------------------------------------------------------------------- 1 | using SpotifyExplode; 2 | using System.Net; 3 | using System.Runtime.InteropServices; 4 | using System.Text; 5 | using YoutubeExplode; 6 | using YoutubeExplode.Common; 7 | using YoutubeExplode.Videos; 8 | using YoutubeExplode.Videos.Streams; 9 | 10 | namespace esrv_spotify 11 | { 12 | internal static class Program 13 | { 14 | /// 15 | /// The main entry point for the application. 16 | /// 17 | [STAThread] 18 | static async Task Main(string[] args) 19 | { 20 | const uint CAP_DEFAULT = 0; 21 | const uint CAP_CUSTOMDIALOG = 1; 22 | const uint CAP_MULTISERVICE = 2; 23 | const uint CAP_CUSTOMREFID = 4; 24 | const uint CAP_URLHANDLER = 8; 25 | 26 | if (args[0] == "GetNodeDesc") 27 | { 28 | Console.WriteLine("Media"); 29 | Console.WriteLine("Spotify"); 30 | Console.WriteLine("Title\tLink"); 31 | Console.WriteLine(CAP_CUSTOMREFID | CAP_URLHANDLER); 32 | } 33 | else if (args[0] == "GetCustomRefId") 34 | { 35 | Console.WriteLine("spotify"); 36 | } 37 | else if (args[0] == "GetUrlPrefix") 38 | { 39 | Console.WriteLine("https://open.spotify.com/track/"); 40 | } 41 | else if (args[0] == "InvokeService") 42 | { 43 | ApplicationConfiguration.Initialize(); 44 | Application.Run(new Form1(false)); 45 | } 46 | else if (args[0] == "GetFileName") 47 | { 48 | string trackURL; 49 | if (args[1].StartsWith("ref_")) 50 | { 51 | string trackID = args[1].Substring(4); 52 | trackURL = "https://open.spotify.com/track/" + trackID; 53 | } 54 | else 55 | { 56 | trackURL = args[1]; 57 | } 58 | 59 | var spotify = new SpotifyClient(); 60 | var downloadUrl = await spotify.Tracks.GetDownloadUrlAsync(trackURL); 61 | 62 | if (!string.IsNullOrEmpty(downloadUrl)) 63 | { 64 | Console.WriteLine(downloadUrl); 65 | } 66 | else 67 | { 68 | string videoID = await spotify.Tracks.GetYoutubeIdAsync(trackURL); 69 | Console.WriteLine("https://www.youtube.com/watch?v=" + videoID); 70 | } 71 | } 72 | } 73 | } 74 | } -------------------------------------------------------------------------------- /ServicePlugins/esrv_spotify/esrv_spotify.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Exe 5 | net6.0-windows 6 | enable 7 | true 8 | enable 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /ServicePlugins/esrv_youtube/Form1.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace esrv_youtube 2 | { 3 | partial class Form1 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | label1 = new Label(); 32 | textBox1 = new TextBox(); 33 | button1 = new Button(); 34 | SuspendLayout(); 35 | // 36 | // label1 37 | // 38 | label1.AutoSize = true; 39 | label1.Location = new Point(12, 9); 40 | label1.Name = "label1"; 41 | label1.Size = new Size(45, 15); 42 | label1.TabIndex = 0; 43 | label1.Text = "Search:"; 44 | // 45 | // textBox1 46 | // 47 | textBox1.Location = new Point(63, 6); 48 | textBox1.Name = "textBox1"; 49 | textBox1.Size = new Size(278, 23); 50 | textBox1.TabIndex = 1; 51 | // 52 | // button1 53 | // 54 | button1.Location = new Point(12, 35); 55 | button1.Name = "button1"; 56 | button1.Size = new Size(329, 23); 57 | button1.TabIndex = 2; 58 | button1.Text = "Search"; 59 | button1.UseVisualStyleBackColor = true; 60 | button1.Click += button1_ClickAsync; 61 | // 62 | // Form1 63 | // 64 | AcceptButton = button1; 65 | AutoScaleDimensions = new SizeF(7F, 15F); 66 | AutoScaleMode = AutoScaleMode.Font; 67 | ClientSize = new Size(355, 65); 68 | Controls.Add(button1); 69 | Controls.Add(textBox1); 70 | Controls.Add(label1); 71 | MaximizeBox = false; 72 | MinimizeBox = false; 73 | Name = "Form1"; 74 | StartPosition = FormStartPosition.CenterScreen; 75 | Text = "YouTube Search"; 76 | Load += Form1_Load; 77 | ResumeLayout(false); 78 | PerformLayout(); 79 | } 80 | 81 | #endregion 82 | 83 | private Label label1; 84 | private TextBox textBox1; 85 | private Button button1; 86 | } 87 | } -------------------------------------------------------------------------------- /ServicePlugins/esrv_youtube/Form1.cs: -------------------------------------------------------------------------------- 1 | using System.Runtime.InteropServices; 2 | using YoutubeExplode; 3 | using YoutubeExplode.Common; 4 | 5 | namespace esrv_youtube 6 | { 7 | public partial class Form1 : Form 8 | { 9 | [DllImport("user32.dll")] 10 | static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 11 | 12 | const int SW_HIDE = 0; 13 | const int SW_SHOW = 5; 14 | 15 | public Form1() 16 | { 17 | InitializeComponent(); 18 | } 19 | 20 | private void Form1_Load(object sender, EventArgs e) 21 | { 22 | ShowWindow(this.Handle, SW_SHOW); 23 | } 24 | 25 | private async void button1_ClickAsync(object sender, EventArgs e) 26 | { 27 | textBox1.Enabled = false; 28 | button1.Enabled = false; 29 | button1.Text = "Please wait..."; 30 | 31 | var youtube = new YoutubeClient(); 32 | var videos = await youtube.Search.GetVideosAsync(textBox1.Text); 33 | 34 | foreach (var item in videos) 35 | { 36 | Console.WriteLine($"{item.Author}\t{item.Title}\t{item.Url}"); 37 | Console.WriteLine($"{item.Author} - {item.Title}"); 38 | Console.WriteLine(item.Url); 39 | } 40 | 41 | Application.Exit(); 42 | } 43 | } 44 | } -------------------------------------------------------------------------------- /ServicePlugins/esrv_youtube/Program.cs: -------------------------------------------------------------------------------- 1 | using System.Runtime.InteropServices; 2 | using System.Text; 3 | using YoutubeExplode; 4 | using YoutubeExplode.Common; 5 | using YoutubeExplode.Videos; 6 | using YoutubeExplode.Videos.Streams; 7 | 8 | namespace esrv_youtube 9 | { 10 | internal static class Program 11 | { 12 | /// 13 | /// The main entry point for the application. 14 | /// 15 | [STAThread] 16 | static async Task Main(string[] args) 17 | { 18 | const uint CAP_DEFAULT = 0; 19 | const uint CAP_CUSTOMDIALOG = 1; 20 | 21 | if (args[0] == "GetNodeDesc") 22 | { 23 | Console.WriteLine("Media"); 24 | Console.WriteLine("YouTube"); 25 | Console.WriteLine("Author\tTitle\tPage URL"); 26 | Console.WriteLine(CAP_DEFAULT); 27 | } 28 | else if (args[0] == "InvokeService") 29 | { 30 | ApplicationConfiguration.Initialize(); 31 | Application.Run(new Form1()); 32 | } 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /ServicePlugins/esrv_youtube/esrv_youtube.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Exe 5 | net6.0-windows 6 | enable 7 | true 8 | enable 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /ServicePlugins/heritageskins_helper/heritageskins_helper.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Exe 5 | net6.0 6 | enable 7 | enable 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /ServicePlugins/msrv_skinner/EasyService.cs: -------------------------------------------------------------------------------- 1 | namespace msrv 2 | { 3 | public class EasyService 4 | { 5 | const uint CAP_DEFAULT = 0; 6 | const uint CAP_CUSTOMDIALOG = 1; 7 | 8 | Dictionary functions = new Dictionary(); 9 | string myDirectory; 10 | uint myServiceID; 11 | 12 | public void InitService(Dictionary functionDict, string pluginDir, uint serviceID) 13 | { 14 | functions = functionDict; 15 | myDirectory = pluginDir; 16 | myServiceID = serviceID; 17 | } 18 | 19 | public Tuple GetNodeDesc() 20 | { 21 | return new Tuple("Misc", "Window Skinner", "NONE", CAP_CUSTOMDIALOG); 22 | } 23 | 24 | public UserControl GetCustomDialog(IntPtr hwndWinampParent, IntPtr hwndLibraryParent, IntPtr hwndParentControl, string skinPath) 25 | { 26 | return new msrv_skinner.SkinnerControl(myDirectory, skinPath); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /ServicePlugins/msrv_skinner/SkinnerControl.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace msrv_skinner 2 | { 3 | partial class SkinnerControl 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Component Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | processComboBox = new ComboBox(); 32 | spawnButton = new Button(); 33 | SuspendLayout(); 34 | // 35 | // processComboBox 36 | // 37 | processComboBox.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; 38 | processComboBox.DropDownStyle = ComboBoxStyle.DropDownList; 39 | processComboBox.FormattingEnabled = true; 40 | processComboBox.Location = new Point(3, 3); 41 | processComboBox.Name = "processComboBox"; 42 | processComboBox.Size = new Size(475, 23); 43 | processComboBox.TabIndex = 0; 44 | // 45 | // spawnButton 46 | // 47 | spawnButton.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; 48 | spawnButton.Location = new Point(3, 32); 49 | spawnButton.Name = "spawnButton"; 50 | spawnButton.Size = new Size(475, 23); 51 | spawnButton.TabIndex = 1; 52 | spawnButton.Text = "Spawn overlay"; 53 | spawnButton.UseVisualStyleBackColor = true; 54 | spawnButton.Click += spawnButton_Click; 55 | // 56 | // SkinnerControl 57 | // 58 | AutoScaleDimensions = new SizeF(7F, 15F); 59 | AutoScaleMode = AutoScaleMode.Font; 60 | Controls.Add(spawnButton); 61 | Controls.Add(processComboBox); 62 | Name = "SkinnerControl"; 63 | Size = new Size(481, 150); 64 | Load += SkinnerControl_Load; 65 | ResumeLayout(false); 66 | } 67 | 68 | #endregion 69 | 70 | private ComboBox processComboBox; 71 | private Button spawnButton; 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /ServicePlugins/msrv_skinner/SkinnerControl.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel; 4 | using System.Data; 5 | using System.Diagnostics; 6 | using System.Drawing; 7 | using System.Linq; 8 | using System.Text; 9 | using System.Threading.Tasks; 10 | using System.Windows.Forms; 11 | 12 | namespace msrv_skinner 13 | { 14 | public partial class SkinnerControl : UserControl 15 | { 16 | string myDirectory; 17 | string skinPath; 18 | List hwndList = new List(); 19 | 20 | public SkinnerControl(string _myDirectory, string _skinPath) 21 | { 22 | myDirectory = _myDirectory; 23 | skinPath = _skinPath; 24 | InitializeComponent(); 25 | } 26 | 27 | private void SkinnerControl_Load(object sender, EventArgs e) 28 | { 29 | // https://stackoverflow.com/a/7268375 30 | Process[] processlist = Process.GetProcesses(); 31 | 32 | foreach (Process process in processlist) 33 | { 34 | if (!String.IsNullOrEmpty(process.MainWindowTitle)) 35 | { 36 | processComboBox.Items.Add(process.MainWindowTitle); 37 | hwndList.Add(process.MainWindowHandle); 38 | } 39 | } 40 | } 41 | 42 | private void spawnButton_Click(object sender, EventArgs e) 43 | { 44 | string selectedTitle = processComboBox.Text; 45 | IntPtr selectedHWND = hwndList[processComboBox.SelectedIndex]; 46 | 47 | Process.Start(System.IO.Path.Combine(myDirectory, "skinner_helper.exe"), $"{selectedHWND.ToString()} \"{selectedTitle}\" \"{skinPath}\""); 48 | } 49 | } 50 | } 51 | 52 | -------------------------------------------------------------------------------- /ServicePlugins/msrv_skinner/msrv_skinner.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | net6.0-windows 5 | enable 6 | true 7 | enable 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ServicePlugins/msrv_soundcloud_plus/EasyService.cs: -------------------------------------------------------------------------------- 1 | namespace msrv 2 | { 3 | public class EasyService 4 | { 5 | const uint CAP_DEFAULT = 0; 6 | const uint CAP_CUSTOMDIALOG = 1; 7 | 8 | Dictionary functions = new Dictionary(); 9 | string myDirectory; 10 | uint myServiceID; 11 | 12 | public void InitService(Dictionary functionDict, string pluginDir, uint serviceID) 13 | { 14 | functions = functionDict; 15 | myDirectory = pluginDir; 16 | myServiceID = serviceID; 17 | } 18 | 19 | public Tuple GetNodeDesc() 20 | { 21 | return new Tuple("Media", "SoundCloud +", "NONE", CAP_CUSTOMDIALOG); 22 | } 23 | 24 | public UserControl GetCustomDialog(IntPtr hwndWinampParent, IntPtr hwndLibraryParent, IntPtr hwndParentControl, string skinPath) 25 | { 26 | return new msrv_soundcloud_plus.SoundCloudControl(hwndWinampParent, functions, myDirectory); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /ServicePlugins/msrv_soundcloud_plus/SoundCloudControl.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace msrv_soundcloud_plus 2 | { 3 | partial class SoundCloudControl 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Component Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | searchBox = new TextBox(); 32 | searchMediaBtn = new Button(); 33 | searchListsBtn = new Button(); 34 | resultListView = new ListView(); 35 | authorHeader = new ColumnHeader(); 36 | titleHeader = new ColumnHeader(); 37 | typeHeader = new ColumnHeader(); 38 | urlHeader = new ColumnHeader(); 39 | SuspendLayout(); 40 | // 41 | // searchBox 42 | // 43 | searchBox.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; 44 | searchBox.Location = new Point(13, 12); 45 | searchBox.Name = "searchBox"; 46 | searchBox.PlaceholderText = "Search..."; 47 | searchBox.Size = new Size(368, 23); 48 | searchBox.TabIndex = 0; 49 | searchBox.KeyPress += searchBox_KeyPress; 50 | // 51 | // searchMediaBtn 52 | // 53 | searchMediaBtn.Anchor = AnchorStyles.Top | AnchorStyles.Right; 54 | searchMediaBtn.Location = new Point(387, 11); 55 | searchMediaBtn.Name = "searchMediaBtn"; 56 | searchMediaBtn.Size = new Size(104, 23); 57 | searchMediaBtn.TabIndex = 1; 58 | searchMediaBtn.Text = "Search Media"; 59 | searchMediaBtn.UseVisualStyleBackColor = true; 60 | searchMediaBtn.Click += searchMediaBtn_Click; 61 | // 62 | // searchListsBtn 63 | // 64 | searchListsBtn.Anchor = AnchorStyles.Top | AnchorStyles.Right; 65 | searchListsBtn.Location = new Point(497, 11); 66 | searchListsBtn.Name = "searchListsBtn"; 67 | searchListsBtn.Size = new Size(104, 23); 68 | searchListsBtn.TabIndex = 2; 69 | searchListsBtn.Text = "Search Lists"; 70 | searchListsBtn.UseVisualStyleBackColor = true; 71 | searchListsBtn.Click += searchListsBtn_Click; 72 | // 73 | // resultListView 74 | // 75 | resultListView.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; 76 | resultListView.Columns.AddRange(new ColumnHeader[] { authorHeader, titleHeader, typeHeader, urlHeader }); 77 | resultListView.FullRowSelect = true; 78 | resultListView.HeaderStyle = ColumnHeaderStyle.Nonclickable; 79 | resultListView.Location = new Point(13, 41); 80 | resultListView.MultiSelect = false; 81 | resultListView.Name = "resultListView"; 82 | resultListView.Size = new Size(588, 352); 83 | resultListView.TabIndex = 3; 84 | resultListView.UseCompatibleStateImageBehavior = false; 85 | resultListView.View = View.Details; 86 | resultListView.ItemActivate += resultListView_ItemActivate; 87 | // 88 | // authorHeader 89 | // 90 | authorHeader.Text = "Author"; 91 | authorHeader.Width = 150; 92 | // 93 | // titleHeader 94 | // 95 | titleHeader.Text = "Title"; 96 | titleHeader.Width = 150; 97 | // 98 | // typeHeader 99 | // 100 | typeHeader.Text = "Type"; 101 | // 102 | // urlHeader 103 | // 104 | urlHeader.Text = "Page URL"; 105 | urlHeader.Width = 150; 106 | // 107 | // SoundCloudControl 108 | // 109 | AutoScaleDimensions = new SizeF(7F, 15F); 110 | AutoScaleMode = AutoScaleMode.Font; 111 | Controls.Add(resultListView); 112 | Controls.Add(searchListsBtn); 113 | Controls.Add(searchMediaBtn); 114 | Controls.Add(searchBox); 115 | Name = "SoundCloudControl"; 116 | Size = new Size(612, 405); 117 | Load += SoundCloudControl_Load; 118 | ResumeLayout(false); 119 | PerformLayout(); 120 | } 121 | 122 | #endregion 123 | 124 | private TextBox searchBox; 125 | private Button searchMediaBtn; 126 | private Button searchListsBtn; 127 | private ListView resultListView; 128 | private ColumnHeader authorHeader; 129 | private ColumnHeader titleHeader; 130 | private ColumnHeader typeHeader; 131 | private ColumnHeader urlHeader; 132 | } 133 | } 134 | -------------------------------------------------------------------------------- /ServicePlugins/msrv_soundcloud_plus/SoundCloudControl.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel; 4 | using System.Data; 5 | using System.Diagnostics; 6 | using System.Drawing; 7 | using System.Linq; 8 | using System.Text; 9 | using System.Threading.Tasks; 10 | using System.Windows.Forms; 11 | 12 | namespace msrv_soundcloud_plus 13 | { 14 | public partial class SoundCloudControl : UserControl 15 | { 16 | Action addItem; 17 | 18 | IntPtr hwndWinampParent; 19 | Dictionary functions; 20 | string myDirectory; 21 | 22 | public SoundCloudControl(IntPtr _hwndWinampParent, Dictionary _functions, string _myDirectory) 23 | { 24 | hwndWinampParent = _hwndWinampParent; 25 | functions = _functions; 26 | myDirectory = _myDirectory; 27 | 28 | addItem = (Action)functions["AddItem"]; 29 | 30 | InitializeComponent(); 31 | } 32 | 33 | private void SoundCloudControl_Load(object sender, EventArgs e) 34 | { 35 | FillResultList(); 36 | } 37 | 38 | private void FillResultList() 39 | { 40 | resultListView.Items.Clear(); 41 | 42 | string pageCacheName = System.IO.Path.Join(System.IO.Path.GetTempPath(), "sc_plus_page.txt"); 43 | if (System.IO.File.Exists(pageCacheName)) 44 | { 45 | foreach (var line in System.IO.File.ReadLines(pageCacheName)) 46 | { 47 | if (!string.IsNullOrEmpty(line)) 48 | { 49 | string[] strings = line.Split('\t'); 50 | ListViewItem lvi = new ListViewItem(new string[] { strings[0], strings[1], strings[2], strings[3], strings[4] }); 51 | resultListView.Items.Add(lvi); 52 | } 53 | } 54 | } 55 | } 56 | 57 | private void InternalRunAndWait(string args) 58 | { 59 | ListViewItem lvi = new ListViewItem(new string[] { "Loading..." }); 60 | resultListView.Items.Clear(); 61 | resultListView.Items.Add(lvi); 62 | 63 | ProcessStartInfo processStartInfo = new ProcessStartInfo("esrv_soundcloud.exe"); 64 | processStartInfo.UseShellExecute = false; 65 | processStartInfo.CreateNoWindow = true; 66 | processStartInfo.WindowStyle = ProcessWindowStyle.Hidden; 67 | processStartInfo.WorkingDirectory = myDirectory; 68 | processStartInfo.Arguments = args; 69 | Process.Start(processStartInfo).WaitForExit(); 70 | } 71 | 72 | private void searchMediaBtn_Click(object sender, EventArgs e) 73 | { 74 | InternalRunAndWait($"internal search media \"{searchBox.Text}\""); 75 | FillResultList(); 76 | } 77 | 78 | private void searchListsBtn_Click(object sender, EventArgs e) 79 | { 80 | InternalRunAndWait($"internal search list \"{searchBox.Text}\""); 81 | FillResultList(); 82 | } 83 | 84 | private void searchBox_KeyPress(object sender, KeyPressEventArgs e) 85 | { 86 | if (e.KeyChar == (char)Keys.Enter) 87 | { 88 | searchMediaBtn_Click(null, null); 89 | } 90 | } 91 | 92 | private void resultListView_ItemActivate(object sender, EventArgs e) 93 | { 94 | if (resultListView.SelectedItems[0].SubItems[2].Text == "Media") 95 | { 96 | addItem(resultListView.SelectedItems[0].SubItems[4].Text, Control.ModifierKeys == Keys.Alt); 97 | } 98 | else 99 | { 100 | InternalRunAndWait($"internal openlist \"{resultListView.SelectedItems[0].SubItems[4].Text}\""); 101 | FillResultList(); 102 | } 103 | } 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /ServicePlugins/msrv_soundcloud_plus/msrv_soundcloud_plus.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | net6.0-windows 5 | enable 6 | true 7 | enable 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ServicePlugins/skinbrowser2_helper/Program.cs: -------------------------------------------------------------------------------- 1 | using System.Drawing; 2 | using System.Drawing.Imaging; 3 | using System.IO.Compression; 4 | 5 | namespace skinbrowser2_helper 6 | { 7 | internal class Program 8 | { 9 | static void Main(string[] args) 10 | { 11 | if (args.Length != 3) 12 | { 13 | Console.WriteLine("Oops..."); 14 | } 15 | else if (args[0] == "all") 16 | { 17 | // all 18 | ExtractAllThumbnails(args[1], args[2]); 19 | } 20 | else if (args[0] == "single") 21 | { 22 | // single 23 | ExtractThumbnail(args[1], args[2]); 24 | } 25 | } 26 | 27 | static void ExtractAllThumbnails(string skinsDir, string thumbsDir) 28 | { 29 | Directory.CreateDirectory(thumbsDir); 30 | 31 | foreach (string fsName in Directory.EnumerateFileSystemEntries(skinsDir)) 32 | { 33 | ExtractThumbnail(fsName, thumbsDir); 34 | } 35 | } 36 | 37 | static void ExtractThumbnail(string skinFilename, string thumbsDir) 38 | { 39 | string[] validThumbnails = { "main.png", "main.bmp", "mainframe.png", "mainframe.bmp", "screenshot.png", "screenshot.bmp", "wacupscreenshot.png", "wacupscreenshot.bmp" }; 40 | 41 | if (Directory.Exists(skinFilename)) 42 | { 43 | foreach (string checkName in validThumbnails) 44 | { 45 | string checkNameFull = $"{skinFilename}\\{checkName}"; 46 | if (File.Exists(checkNameFull)) 47 | { 48 | Image imageFile = Image.FromFile(checkNameFull); 49 | imageFile.Save($"{thumbsDir}\\{System.IO.Path.GetFileName(skinFilename)}.bmp", ImageFormat.Bmp); 50 | return; 51 | } 52 | } 53 | } 54 | else if (File.Exists(skinFilename)) 55 | { 56 | // This is ugly, but it keeps the order of validThumbnails 57 | ZipArchive archive = ZipFile.OpenRead(skinFilename); 58 | foreach (string checkName in validThumbnails) 59 | { 60 | foreach (ZipArchiveEntry entry in archive.Entries) 61 | { 62 | if (entry.Name.ToLower() == checkName) 63 | { 64 | Image imageFile = Image.FromStream(entry.Open()); 65 | imageFile.Save($"{thumbsDir}\\{System.IO.Path.GetFileName(skinFilename)}.bmp", ImageFormat.Bmp); 66 | return; 67 | } 68 | } 69 | } 70 | } 71 | 72 | // Default image to prevent the desync of the list 73 | Image dummyImage = new Bitmap(275, 116, PixelFormat.Format24bppRgb); 74 | using (Graphics grp = Graphics.FromImage(dummyImage)) 75 | { 76 | grp.FillRectangle(Brushes.DarkGray, 0, 0, 275, 116); 77 | } 78 | dummyImage.Save($"{thumbsDir}\\{System.IO.Path.GetFileName(skinFilename)}.bmp", ImageFormat.Bmp); 79 | } 80 | } 81 | } -------------------------------------------------------------------------------- /ServicePlugins/skinbrowser2_helper/skinbrowser2_helper.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Exe 5 | net6.0 6 | enable 7 | enable 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /ServicePlugins/skinmuseum_helper/Program.cs: -------------------------------------------------------------------------------- 1 | using Newtonsoft.Json.Linq; 2 | using System; 3 | using System.Drawing; 4 | using System.Drawing.Imaging; 5 | using System.IO.Compression; 6 | using System.Reflection; 7 | using System.Runtime.InteropServices; 8 | 9 | namespace skinmuseum_helper 10 | { 11 | internal class Program 12 | { 13 | static async Task Main(string[] args) 14 | { 15 | if (args[0] == "page") 16 | { 17 | // page 18 | await CreatePageCache(int.Parse(args[1]), int.Parse(args[2]), args[3]); 19 | } 20 | else if (args[0] == "download") 21 | { 22 | // download 23 | await DownloadFileAsync(args[1], args[2]); 24 | } 25 | else 26 | { 27 | Console.WriteLine("Oops..."); 28 | } 29 | } 30 | 31 | static async Task CreatePageCache(int pageNum, int pageLength, string cacheDir) 32 | { 33 | Directory.CreateDirectory(cacheDir); 34 | 35 | using (var client = new HttpClient()) 36 | { 37 | string pageURL = "https://api.webampskins.org/graphql"; 38 | client.DefaultRequestHeaders.Add("Accept", "application/json"); 39 | 40 | StringContent jsonContent = new StringContent("{\"query\":\"\\n query MuseumPage($offset: Int, $first: Int) {\\n skins(offset: $offset, first: $first, sort: MUSEUM) {\\n count\\n nodes {\\n md5\\n filename\\n nsfw\\n }\\n }\\n }\\n \",\"variables\":{\"offset\":" + ((pageNum - 1) * pageLength).ToString() + ",\"first\":" + pageLength.ToString() + "}}", 41 | System.Text.Encoding.UTF8, 42 | "application/json"); 43 | var result = await client.PostAsync(pageURL, jsonContent); 44 | string resultString = await result.Content.ReadAsStringAsync(); 45 | JObject resultJSON = JObject.Parse(resultString); 46 | 47 | using (StreamWriter writer = new StreamWriter($"{cacheDir}\\page.txt")) 48 | { 49 | foreach (var node in resultJSON["data"]["skins"]["nodes"]) 50 | { 51 | await DownloadThumbnailAsync(node["md5"].ToString(), cacheDir + "\\" + node["filename"].ToString() + ".bmp"); 52 | writer.WriteLine($"{node["md5"]} {node["filename"]}"); 53 | } 54 | 55 | writer.WriteLine(""); 56 | } 57 | } 58 | } 59 | 60 | static async Task DownloadThumbnailAsync(string md5, string outputFile) 61 | { 62 | if (!File.Exists(outputFile)) 63 | { 64 | using (var client = new HttpClient()) 65 | { 66 | var response = await client.GetAsync($"https://r2.webampskins.org/screenshots/{md5}.png"); 67 | Image imageData = Image.FromStream(response.Content.ReadAsStream()); 68 | imageData.Save(outputFile, ImageFormat.Bmp); 69 | } 70 | } 71 | } 72 | 73 | static async Task DownloadFileAsync(string md5, string outputFile) 74 | { 75 | if (!File.Exists(outputFile)) 76 | { 77 | using (var client = new HttpClient()) 78 | { 79 | var response = await client.GetAsync($"https://r2.webampskins.org/skins/{md5}{outputFile.Substring(outputFile.Length - 4)}"); 80 | if (!response.IsSuccessStatusCode) 81 | { 82 | string[] validExts = { ".wsz", ".wal", ".zip" }; 83 | foreach (string ext in validExts) 84 | { 85 | response = await client.GetAsync($"https://r2.webampskins.org/skins/{md5}{ext}"); 86 | if (response.IsSuccessStatusCode) 87 | break; 88 | } 89 | } 90 | using (var fs = new FileStream(outputFile, FileMode.Create)) 91 | { 92 | await response.Content.CopyToAsync(fs); 93 | } 94 | } 95 | } 96 | } 97 | } 98 | } -------------------------------------------------------------------------------- /ServicePlugins/skinmuseum_helper/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "profiles": { 3 | "skinmuseum_helper": { 4 | "commandName": "Project", 5 | "commandLineArgs": "download cd251187a5e6ff54ce938d26f1f2de02 e:\\Zsolt\\Winamp3_Classified_v5.5.wsz" 6 | } 7 | } 8 | } -------------------------------------------------------------------------------- /ServicePlugins/skinmuseum_helper/skinmuseum_helper.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Exe 5 | net6.0 6 | enable 7 | enable 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /ServicePlugins/skinner_helper/Form1.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace skinner_helper 2 | { 3 | partial class Form1 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | leftPicture = new PictureBox(); 32 | midPicture = new PictureBox(); 33 | rightPicture = new PictureBox(); 34 | ((System.ComponentModel.ISupportInitialize)leftPicture).BeginInit(); 35 | ((System.ComponentModel.ISupportInitialize)midPicture).BeginInit(); 36 | ((System.ComponentModel.ISupportInitialize)rightPicture).BeginInit(); 37 | SuspendLayout(); 38 | // 39 | // leftPicture 40 | // 41 | leftPicture.Location = new Point(0, 0); 42 | leftPicture.Name = "leftPicture"; 43 | leftPicture.Size = new Size(25, 20); 44 | leftPicture.TabIndex = 0; 45 | leftPicture.TabStop = false; 46 | // 47 | // midPicture 48 | // 49 | midPicture.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; 50 | midPicture.Location = new Point(25, 0); 51 | midPicture.Name = "midPicture"; 52 | midPicture.Size = new Size(590, 20); 53 | midPicture.TabIndex = 1; 54 | midPicture.TabStop = false; 55 | // 56 | // rightPicture 57 | // 58 | rightPicture.Anchor = AnchorStyles.Top | AnchorStyles.Right; 59 | rightPicture.Location = new Point(615, 0); 60 | rightPicture.Name = "rightPicture"; 61 | rightPicture.Size = new Size(25, 20); 62 | rightPicture.TabIndex = 2; 63 | rightPicture.TabStop = false; 64 | // 65 | // Form1 66 | // 67 | AutoScaleDimensions = new SizeF(7F, 15F); 68 | AutoScaleMode = AutoScaleMode.Font; 69 | ClientSize = new Size(640, 240); 70 | Controls.Add(rightPicture); 71 | Controls.Add(midPicture); 72 | Controls.Add(leftPicture); 73 | FormBorderStyle = FormBorderStyle.None; 74 | Name = "Form1"; 75 | ShowInTaskbar = false; 76 | Text = "Form1"; 77 | TransparencyKey = SystemColors.Control; 78 | FormClosing += Form1_FormClosing; 79 | Load += Form1_Load; 80 | ((System.ComponentModel.ISupportInitialize)leftPicture).EndInit(); 81 | ((System.ComponentModel.ISupportInitialize)midPicture).EndInit(); 82 | ((System.ComponentModel.ISupportInitialize)rightPicture).EndInit(); 83 | ResumeLayout(false); 84 | } 85 | 86 | #endregion 87 | 88 | private PictureBox leftPicture; 89 | private PictureBox midPicture; 90 | private PictureBox rightPicture; 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /ServicePlugins/skinner_helper/Program.cs: -------------------------------------------------------------------------------- 1 | namespace skinner_helper 2 | { 3 | internal static class Program 4 | { 5 | [STAThread] 6 | static void Main(string[] args) 7 | { 8 | ApplicationConfiguration.Initialize(); 9 | Application.Run(new Form1(IntPtr.Parse(args[0]), args[1], args[2])); 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /ServicePlugins/skinner_helper/skinner_helper.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | WinExe 5 | net6.0-windows 6 | enable 7 | true 8 | enable 9 | 10 | 11 | -------------------------------------------------------------------------------- /ServicePlugins/srv_archiveskins/resource.h: -------------------------------------------------------------------------------- 1 | //{{NO_DEPENDENCIES}} 2 | // Microsoft Visual C++ generated include file. 3 | // Used by ml_easysrv.rc 4 | // 5 | #define IDD_VIEW_CUSTOM 101 6 | #define IDC_LIST 1001 7 | #define IDC_KEEP 1002 8 | #define IDC_KEEPALL 1003 9 | #define IDC_PREV 1004 10 | #define IDC_PAGENUM 1005 11 | #define IDC_NEXT 1006 12 | #define IDC_PREVSKIP 1007 13 | #define IDC_NEXTSKIP 1008 14 | 15 | // Next default values for new objects 16 | // 17 | #ifdef APSTUDIO_INVOKED 18 | #ifndef APSTUDIO_READONLY_SYMBOLS 19 | #define _APS_NEXT_RESOURCE_VALUE 102 20 | #define _APS_NEXT_COMMAND_VALUE 40001 21 | #define _APS_NEXT_CONTROL_VALUE 1009 22 | #define _APS_NEXT_SYMED_VALUE 101 23 | #endif 24 | #endif 25 | -------------------------------------------------------------------------------- /ServicePlugins/srv_archiveskins/srv_archiveskins.rc: -------------------------------------------------------------------------------- 1 | // Microsoft Visual C++ generated resource script. 2 | // 3 | #include "resource.h" 4 | 5 | #define APSTUDIO_READONLY_SYMBOLS 6 | ///////////////////////////////////////////////////////////////////////////// 7 | // 8 | // Generated from the TEXTINCLUDE 2 resource. 9 | // 10 | //#include "afxres.h" 11 | #include 12 | 13 | ///////////////////////////////////////////////////////////////////////////// 14 | #undef APSTUDIO_READONLY_SYMBOLS 15 | 16 | ///////////////////////////////////////////////////////////////////////////// 17 | // English (U.S.) resources 18 | 19 | #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) 20 | #ifdef _WIN32 21 | LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US 22 | #pragma code_page(1252) 23 | #endif //_WIN32 24 | 25 | #ifdef APSTUDIO_INVOKED 26 | ///////////////////////////////////////////////////////////////////////////// 27 | // 28 | // TEXTINCLUDE 29 | // 30 | 31 | 1 TEXTINCLUDE 32 | BEGIN 33 | "resource.h\0" 34 | END 35 | 36 | 2 TEXTINCLUDE 37 | BEGIN 38 | "#include ""afxres.h""\r\n" 39 | "\0" 40 | END 41 | 42 | 3 TEXTINCLUDE 43 | BEGIN 44 | "\r\n" 45 | "\0" 46 | END 47 | 48 | #endif // APSTUDIO_INVOKED 49 | 50 | 51 | ///////////////////////////////////////////////////////////////////////////// 52 | // 53 | // Dialog 54 | // 55 | 56 | IDD_VIEW_CUSTOM DIALOGEX 0, 0, 215, 120 57 | STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_CLIPSIBLINGS | 58 | WS_CLIPCHILDREN 59 | FONT 8, "MS Shell Dlg", 400, 0, 0x1 60 | BEGIN 61 | CONTROL "",IDC_LIST,"SysListView32",LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | WS_TABSTOP,0,0,214,103 62 | CONTROL "Keep current skin",IDC_KEEP,"Button",BS_OWNERDRAW | WS_TABSTOP,0,106,150,11 63 | CONTROL "Keep all skins",IDC_KEEPALL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,153,106,150,11 64 | CONTROL "<",IDC_PREVSKIP,"Button",BS_OWNERDRAW | WS_TABSTOP,0,120,5,11 65 | CONTROL "Previous page",IDC_PREV,"Button",BS_OWNERDRAW | WS_TABSTOP,5,120,70,11 66 | LTEXT "Page 1",IDC_PAGENUM,78,120,45,11,SS_NOPREFIX 67 | CONTROL "Next page",IDC_NEXT,"Button",BS_OWNERDRAW | WS_TABSTOP,126,120,70,11 68 | CONTROL ">",IDC_NEXTSKIP,"Button",BS_OWNERDRAW | WS_TABSTOP,196,120,5,11 69 | END 70 | 71 | 72 | ///////////////////////////////////////////////////////////////////////////// 73 | // 74 | // DESIGNINFO 75 | // 76 | 77 | #ifdef APSTUDIO_INVOKED 78 | GUIDELINES DESIGNINFO 79 | BEGIN 80 | IDD_VIEW_CUSTOM, DIALOG 81 | BEGIN 82 | RIGHTMARGIN, 214 83 | END 84 | END 85 | #endif // APSTUDIO_INVOKED 86 | 87 | #endif // English (U.S.) resources 88 | ///////////////////////////////////////////////////////////////////////////// 89 | 90 | 91 | 92 | #ifndef APSTUDIO_INVOKED 93 | ///////////////////////////////////////////////////////////////////////////// 94 | // 95 | // Generated from the TEXTINCLUDE 3 resource. 96 | // 97 | 98 | 99 | ///////////////////////////////////////////////////////////////////////////// 100 | #endif // not APSTUDIO_INVOKED 101 | 102 | -------------------------------------------------------------------------------- /ServicePlugins/srv_archiveskins/srv_archiveskins.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | Source Files 20 | 21 | 22 | 23 | 24 | Header Files 25 | 26 | 27 | 28 | 29 | Resource Files 30 | 31 | 32 | -------------------------------------------------------------------------------- /ServicePlugins/srv_heritageskins/resource.h: -------------------------------------------------------------------------------- 1 | //{{NO_DEPENDENCIES}} 2 | // Microsoft Visual C++ generated include file. 3 | // Used by ml_easysrv.rc 4 | // 5 | #define IDD_VIEW_CUSTOM 101 6 | #define IDC_LIST 1001 7 | #define IDC_KEEP 1002 8 | #define IDC_KEEPALL 1003 9 | #define IDC_PREV 1004 10 | #define IDC_PAGENUM 1005 11 | #define IDC_NEXT 1006 12 | #define IDC_CATCOMBO 1007 13 | 14 | // Next default values for new objects 15 | // 16 | #ifdef APSTUDIO_INVOKED 17 | #ifndef APSTUDIO_READONLY_SYMBOLS 18 | #define _APS_NEXT_RESOURCE_VALUE 102 19 | #define _APS_NEXT_COMMAND_VALUE 40001 20 | #define _APS_NEXT_CONTROL_VALUE 1008 21 | #define _APS_NEXT_SYMED_VALUE 101 22 | #endif 23 | #endif 24 | -------------------------------------------------------------------------------- /ServicePlugins/srv_heritageskins/srv_heritageskins.rc: -------------------------------------------------------------------------------- 1 | // Microsoft Visual C++ generated resource script. 2 | // 3 | #include "resource.h" 4 | 5 | #define APSTUDIO_READONLY_SYMBOLS 6 | ///////////////////////////////////////////////////////////////////////////// 7 | // 8 | // Generated from the TEXTINCLUDE 2 resource. 9 | // 10 | //#include "afxres.h" 11 | #include 12 | 13 | ///////////////////////////////////////////////////////////////////////////// 14 | #undef APSTUDIO_READONLY_SYMBOLS 15 | 16 | ///////////////////////////////////////////////////////////////////////////// 17 | // English (U.S.) resources 18 | 19 | #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) 20 | #ifdef _WIN32 21 | LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US 22 | #pragma code_page(1252) 23 | #endif //_WIN32 24 | 25 | #ifdef APSTUDIO_INVOKED 26 | ///////////////////////////////////////////////////////////////////////////// 27 | // 28 | // TEXTINCLUDE 29 | // 30 | 31 | 1 TEXTINCLUDE 32 | BEGIN 33 | "resource.h\0" 34 | END 35 | 36 | 2 TEXTINCLUDE 37 | BEGIN 38 | "#include ""afxres.h""\r\n" 39 | "\0" 40 | END 41 | 42 | 3 TEXTINCLUDE 43 | BEGIN 44 | "\r\n" 45 | "\0" 46 | END 47 | 48 | #endif // APSTUDIO_INVOKED 49 | 50 | 51 | ///////////////////////////////////////////////////////////////////////////// 52 | // 53 | // Dialog 54 | // 55 | 56 | IDD_VIEW_CUSTOM DIALOGEX 0, 0, 215, 120 57 | STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_CLIPSIBLINGS | 58 | WS_CLIPCHILDREN 59 | FONT 8, "MS Shell Dlg", 400, 0, 0x1 60 | BEGIN 61 | CONTROL "",IDC_LIST,"SysListView32",LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | WS_TABSTOP,0,0,214,89 62 | COMBOBOX IDC_CATCOMBO,0,92,150,11,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP 63 | CONTROL "Keep current skin",IDC_KEEP,"Button",BS_OWNERDRAW | WS_TABSTOP,0,106,150,11 64 | CONTROL "Keep all skins",IDC_KEEPALL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,153,106,150,11 65 | CONTROL "Previous page",IDC_PREV,"Button",BS_OWNERDRAW | WS_TABSTOP,0,120,75,11 66 | LTEXT "Page 1",IDC_PAGENUM,78,120,45,11,SS_NOPREFIX 67 | CONTROL "Next page",IDC_NEXT,"Button",BS_OWNERDRAW | WS_TABSTOP,126,120,75,11 68 | END 69 | 70 | 71 | ///////////////////////////////////////////////////////////////////////////// 72 | // 73 | // DESIGNINFO 74 | // 75 | 76 | #ifdef APSTUDIO_INVOKED 77 | GUIDELINES DESIGNINFO 78 | BEGIN 79 | IDD_VIEW_CUSTOM, DIALOG 80 | BEGIN 81 | RIGHTMARGIN, 214 82 | END 83 | END 84 | #endif // APSTUDIO_INVOKED 85 | 86 | #endif // English (U.S.) resources 87 | ///////////////////////////////////////////////////////////////////////////// 88 | 89 | 90 | 91 | #ifndef APSTUDIO_INVOKED 92 | ///////////////////////////////////////////////////////////////////////////// 93 | // 94 | // Generated from the TEXTINCLUDE 3 resource. 95 | // 96 | 97 | 98 | ///////////////////////////////////////////////////////////////////////////// 99 | #endif // not APSTUDIO_INVOKED 100 | 101 | -------------------------------------------------------------------------------- /ServicePlugins/srv_heritageskins/srv_heritageskins.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | Source Files 20 | 21 | 22 | 23 | 24 | Header Files 25 | 26 | 27 | 28 | 29 | Resource Files 30 | 31 | 32 | -------------------------------------------------------------------------------- /ServicePlugins/srv_screensavers/resource.h: -------------------------------------------------------------------------------- 1 | //{{NO_DEPENDENCIES}} 2 | // Microsoft Visual C++ generated include file. 3 | // Used by ml_easysrv.rc 4 | // 5 | #define IDD_VIEW_CUSTOM 101 6 | #define IDC_DISPLAY 1001 7 | #define IDC_FILECOMBO 1002 8 | 9 | // Next default values for new objects 10 | // 11 | #ifdef APSTUDIO_INVOKED 12 | #ifndef APSTUDIO_READONLY_SYMBOLS 13 | #define _APS_NEXT_RESOURCE_VALUE 102 14 | #define _APS_NEXT_COMMAND_VALUE 40001 15 | #define _APS_NEXT_CONTROL_VALUE 1003 16 | #define _APS_NEXT_SYMED_VALUE 101 17 | #endif 18 | #endif 19 | -------------------------------------------------------------------------------- /ServicePlugins/srv_screensavers/srv_screensavers.rc: -------------------------------------------------------------------------------- 1 | // Microsoft Visual C++ generated resource script. 2 | // 3 | #include "resource.h" 4 | 5 | #define APSTUDIO_READONLY_SYMBOLS 6 | ///////////////////////////////////////////////////////////////////////////// 7 | // 8 | // Generated from the TEXTINCLUDE 2 resource. 9 | // 10 | //#include "afxres.h" 11 | #include 12 | 13 | ///////////////////////////////////////////////////////////////////////////// 14 | #undef APSTUDIO_READONLY_SYMBOLS 15 | 16 | ///////////////////////////////////////////////////////////////////////////// 17 | // English (U.S.) resources 18 | 19 | #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) 20 | #ifdef _WIN32 21 | LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US 22 | #pragma code_page(1252) 23 | #endif //_WIN32 24 | 25 | #ifdef APSTUDIO_INVOKED 26 | ///////////////////////////////////////////////////////////////////////////// 27 | // 28 | // TEXTINCLUDE 29 | // 30 | 31 | 1 TEXTINCLUDE 32 | BEGIN 33 | "resource.h\0" 34 | END 35 | 36 | 2 TEXTINCLUDE 37 | BEGIN 38 | "#include ""afxres.h""\r\n" 39 | "\0" 40 | END 41 | 42 | 3 TEXTINCLUDE 43 | BEGIN 44 | "\r\n" 45 | "\0" 46 | END 47 | 48 | #endif // APSTUDIO_INVOKED 49 | 50 | 51 | ///////////////////////////////////////////////////////////////////////////// 52 | // 53 | // Dialog 54 | // 55 | 56 | IDD_VIEW_CUSTOM DIALOGEX 0, 0, 215, 120 57 | STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_CLIPSIBLINGS | 58 | WS_CLIPCHILDREN 59 | FONT 8, "MS Shell Dlg", 400, 0, 0x1 60 | BEGIN 61 | LTEXT "",IDC_DISPLAY,0,0,214,89,SS_NOPREFIX 62 | COMBOBOX IDC_FILECOMBO,0,92,150,11,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP 63 | END 64 | 65 | 66 | ///////////////////////////////////////////////////////////////////////////// 67 | // 68 | // DESIGNINFO 69 | // 70 | 71 | #ifdef APSTUDIO_INVOKED 72 | GUIDELINES DESIGNINFO 73 | BEGIN 74 | IDD_VIEW_CUSTOM, DIALOG 75 | BEGIN 76 | RIGHTMARGIN, 214 77 | END 78 | END 79 | #endif // APSTUDIO_INVOKED 80 | 81 | #endif // English (U.S.) resources 82 | ///////////////////////////////////////////////////////////////////////////// 83 | 84 | 85 | 86 | #ifndef APSTUDIO_INVOKED 87 | ///////////////////////////////////////////////////////////////////////////// 88 | // 89 | // Generated from the TEXTINCLUDE 3 resource. 90 | // 91 | 92 | 93 | ///////////////////////////////////////////////////////////////////////////// 94 | #endif // not APSTUDIO_INVOKED 95 | 96 | -------------------------------------------------------------------------------- /ServicePlugins/srv_screensavers/srv_screensavers.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | Source Files 20 | 21 | 22 | 23 | 24 | Header Files 25 | 26 | 27 | 28 | 29 | Resource Files 30 | 31 | 32 | -------------------------------------------------------------------------------- /ServicePlugins/srv_skinbrowser/resource.h: -------------------------------------------------------------------------------- 1 | //{{NO_DEPENDENCIES}} 2 | // Microsoft Visual C++ generated include file. 3 | // Used by ml_easysrv.rc 4 | // 5 | #define IDD_VIEW_CUSTOM 101 6 | #define IDC_LIST 1001 7 | #define IDC_CHECK 1002 8 | #define IDC_RESCAN 1003 9 | 10 | // Next default values for new objects 11 | // 12 | #ifdef APSTUDIO_INVOKED 13 | #ifndef APSTUDIO_READONLY_SYMBOLS 14 | #define _APS_NEXT_RESOURCE_VALUE 102 15 | #define _APS_NEXT_COMMAND_VALUE 40001 16 | #define _APS_NEXT_CONTROL_VALUE 1004 17 | #define _APS_NEXT_SYMED_VALUE 101 18 | #endif 19 | #endif 20 | -------------------------------------------------------------------------------- /ServicePlugins/srv_skinbrowser/srv_skinbrowser.rc: -------------------------------------------------------------------------------- 1 | // Microsoft Visual C++ generated resource script. 2 | // 3 | #include "resource.h" 4 | 5 | #define APSTUDIO_READONLY_SYMBOLS 6 | ///////////////////////////////////////////////////////////////////////////// 7 | // 8 | // Generated from the TEXTINCLUDE 2 resource. 9 | // 10 | //#include "afxres.h" 11 | #include 12 | 13 | ///////////////////////////////////////////////////////////////////////////// 14 | #undef APSTUDIO_READONLY_SYMBOLS 15 | 16 | ///////////////////////////////////////////////////////////////////////////// 17 | // English (U.S.) resources 18 | 19 | #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) 20 | #ifdef _WIN32 21 | LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US 22 | #pragma code_page(1252) 23 | #endif //_WIN32 24 | 25 | #ifdef APSTUDIO_INVOKED 26 | ///////////////////////////////////////////////////////////////////////////// 27 | // 28 | // TEXTINCLUDE 29 | // 30 | 31 | 1 TEXTINCLUDE 32 | BEGIN 33 | "resource.h\0" 34 | END 35 | 36 | 2 TEXTINCLUDE 37 | BEGIN 38 | "#include ""afxres.h""\r\n" 39 | "\0" 40 | END 41 | 42 | 3 TEXTINCLUDE 43 | BEGIN 44 | "\r\n" 45 | "\0" 46 | END 47 | 48 | #endif // APSTUDIO_INVOKED 49 | 50 | 51 | ///////////////////////////////////////////////////////////////////////////// 52 | // 53 | // Dialog 54 | // 55 | 56 | IDD_VIEW_CUSTOM DIALOGEX 0, 0, 215, 120 57 | STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_CLIPSIBLINGS | 58 | WS_CLIPCHILDREN 59 | FONT 8, "MS Shell Dlg", 400, 0, 0x1 60 | BEGIN 61 | CONTROL "",IDC_LIST,"SysListView32",LVS_REPORT | 62 | LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | WS_TABSTOP,0,0, 63 | 214,103 64 | CONTROL "Apply skins as they are found",IDC_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,0,106,150,10 65 | CONTROL "Rescan skin directory",IDC_RESCAN,"Button",BS_OWNERDRAW | 66 | WS_TABSTOP,0,119,150,11 67 | END 68 | 69 | 70 | ///////////////////////////////////////////////////////////////////////////// 71 | // 72 | // DESIGNINFO 73 | // 74 | 75 | #ifdef APSTUDIO_INVOKED 76 | GUIDELINES DESIGNINFO 77 | BEGIN 78 | IDD_VIEW_CUSTOM, DIALOG 79 | BEGIN 80 | RIGHTMARGIN, 214 81 | END 82 | END 83 | #endif // APSTUDIO_INVOKED 84 | 85 | #endif // English (U.S.) resources 86 | ///////////////////////////////////////////////////////////////////////////// 87 | 88 | 89 | 90 | #ifndef APSTUDIO_INVOKED 91 | ///////////////////////////////////////////////////////////////////////////// 92 | // 93 | // Generated from the TEXTINCLUDE 3 resource. 94 | // 95 | 96 | 97 | ///////////////////////////////////////////////////////////////////////////// 98 | #endif // not APSTUDIO_INVOKED 99 | 100 | -------------------------------------------------------------------------------- /ServicePlugins/srv_skinbrowser/srv_skinbrowser.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | Source Files 20 | 21 | 22 | 23 | 24 | Header Files 25 | 26 | 27 | 28 | 29 | Resource Files 30 | 31 | 32 | -------------------------------------------------------------------------------- /ServicePlugins/srv_skinbrowser2/resource.h: -------------------------------------------------------------------------------- 1 | //{{NO_DEPENDENCIES}} 2 | // Microsoft Visual C++ generated include file. 3 | // Used by ml_easysrv.rc 4 | // 5 | #define IDD_VIEW_CUSTOM 101 6 | #define IDC_LIST 1001 7 | #define IDC_CHECK 1002 8 | #define IDC_RESCAN 1003 9 | 10 | // Next default values for new objects 11 | // 12 | #ifdef APSTUDIO_INVOKED 13 | #ifndef APSTUDIO_READONLY_SYMBOLS 14 | #define _APS_NEXT_RESOURCE_VALUE 102 15 | #define _APS_NEXT_COMMAND_VALUE 40001 16 | #define _APS_NEXT_CONTROL_VALUE 1004 17 | #define _APS_NEXT_SYMED_VALUE 101 18 | #endif 19 | #endif 20 | -------------------------------------------------------------------------------- /ServicePlugins/srv_skinbrowser2/srv_skinbrowser2.rc: -------------------------------------------------------------------------------- 1 | // Microsoft Visual C++ generated resource script. 2 | // 3 | #include "resource.h" 4 | 5 | #define APSTUDIO_READONLY_SYMBOLS 6 | ///////////////////////////////////////////////////////////////////////////// 7 | // 8 | // Generated from the TEXTINCLUDE 2 resource. 9 | // 10 | //#include "afxres.h" 11 | #include 12 | 13 | ///////////////////////////////////////////////////////////////////////////// 14 | #undef APSTUDIO_READONLY_SYMBOLS 15 | 16 | ///////////////////////////////////////////////////////////////////////////// 17 | // English (U.S.) resources 18 | 19 | #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) 20 | #ifdef _WIN32 21 | LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US 22 | #pragma code_page(1252) 23 | #endif //_WIN32 24 | 25 | #ifdef APSTUDIO_INVOKED 26 | ///////////////////////////////////////////////////////////////////////////// 27 | // 28 | // TEXTINCLUDE 29 | // 30 | 31 | 1 TEXTINCLUDE 32 | BEGIN 33 | "resource.h\0" 34 | END 35 | 36 | 2 TEXTINCLUDE 37 | BEGIN 38 | "#include ""afxres.h""\r\n" 39 | "\0" 40 | END 41 | 42 | 3 TEXTINCLUDE 43 | BEGIN 44 | "\r\n" 45 | "\0" 46 | END 47 | 48 | #endif // APSTUDIO_INVOKED 49 | 50 | 51 | ///////////////////////////////////////////////////////////////////////////// 52 | // 53 | // Dialog 54 | // 55 | 56 | IDD_VIEW_CUSTOM DIALOGEX 0, 0, 215, 120 57 | STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_CLIPSIBLINGS | 58 | WS_CLIPCHILDREN 59 | FONT 8, "MS Shell Dlg", 400, 0, 0x1 60 | BEGIN 61 | CONTROL "",IDC_LIST,"SysListView32",LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | WS_TABSTOP,0,0,214,103 62 | CONTROL "Apply skins as they are found",IDC_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,0,106,150,10 63 | CONTROL "Rescan skin directory",IDC_RESCAN,"Button",BS_OWNERDRAW | 64 | WS_TABSTOP,0,119,150,11 65 | END 66 | 67 | 68 | ///////////////////////////////////////////////////////////////////////////// 69 | // 70 | // DESIGNINFO 71 | // 72 | 73 | #ifdef APSTUDIO_INVOKED 74 | GUIDELINES DESIGNINFO 75 | BEGIN 76 | IDD_VIEW_CUSTOM, DIALOG 77 | BEGIN 78 | RIGHTMARGIN, 214 79 | END 80 | END 81 | #endif // APSTUDIO_INVOKED 82 | 83 | #endif // English (U.S.) resources 84 | ///////////////////////////////////////////////////////////////////////////// 85 | 86 | 87 | 88 | #ifndef APSTUDIO_INVOKED 89 | ///////////////////////////////////////////////////////////////////////////// 90 | // 91 | // Generated from the TEXTINCLUDE 3 resource. 92 | // 93 | 94 | 95 | ///////////////////////////////////////////////////////////////////////////// 96 | #endif // not APSTUDIO_INVOKED 97 | 98 | -------------------------------------------------------------------------------- /ServicePlugins/srv_skinbrowser2/srv_skinbrowser2.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | Source Files 20 | 21 | 22 | 23 | 24 | Header Files 25 | 26 | 27 | 28 | 29 | Resource Files 30 | 31 | 32 | -------------------------------------------------------------------------------- /ServicePlugins/srv_skinmuseum/resource.h: -------------------------------------------------------------------------------- 1 | //{{NO_DEPENDENCIES}} 2 | // Microsoft Visual C++ generated include file. 3 | // Used by ml_easysrv.rc 4 | // 5 | #define IDD_VIEW_CUSTOM 101 6 | #define IDC_LIST 1001 7 | #define IDC_KEEP 1002 8 | #define IDC_KEEPALL 1003 9 | #define IDC_PREV 1004 10 | #define IDC_PAGENUM 1005 11 | #define IDC_NEXT 1006 12 | #define IDC_PREVSKIP 1007 13 | #define IDC_NEXTSKIP 1008 14 | 15 | // Next default values for new objects 16 | // 17 | #ifdef APSTUDIO_INVOKED 18 | #ifndef APSTUDIO_READONLY_SYMBOLS 19 | #define _APS_NEXT_RESOURCE_VALUE 102 20 | #define _APS_NEXT_COMMAND_VALUE 40001 21 | #define _APS_NEXT_CONTROL_VALUE 1009 22 | #define _APS_NEXT_SYMED_VALUE 101 23 | #endif 24 | #endif 25 | -------------------------------------------------------------------------------- /ServicePlugins/srv_skinmuseum/srv_skinmuseum.rc: -------------------------------------------------------------------------------- 1 | // Microsoft Visual C++ generated resource script. 2 | // 3 | #include "resource.h" 4 | 5 | #define APSTUDIO_READONLY_SYMBOLS 6 | ///////////////////////////////////////////////////////////////////////////// 7 | // 8 | // Generated from the TEXTINCLUDE 2 resource. 9 | // 10 | //#include "afxres.h" 11 | #include 12 | 13 | ///////////////////////////////////////////////////////////////////////////// 14 | #undef APSTUDIO_READONLY_SYMBOLS 15 | 16 | ///////////////////////////////////////////////////////////////////////////// 17 | // English (U.S.) resources 18 | 19 | #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) 20 | #ifdef _WIN32 21 | LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US 22 | #pragma code_page(1252) 23 | #endif //_WIN32 24 | 25 | #ifdef APSTUDIO_INVOKED 26 | ///////////////////////////////////////////////////////////////////////////// 27 | // 28 | // TEXTINCLUDE 29 | // 30 | 31 | 1 TEXTINCLUDE 32 | BEGIN 33 | "resource.h\0" 34 | END 35 | 36 | 2 TEXTINCLUDE 37 | BEGIN 38 | "#include ""afxres.h""\r\n" 39 | "\0" 40 | END 41 | 42 | 3 TEXTINCLUDE 43 | BEGIN 44 | "\r\n" 45 | "\0" 46 | END 47 | 48 | #endif // APSTUDIO_INVOKED 49 | 50 | 51 | ///////////////////////////////////////////////////////////////////////////// 52 | // 53 | // Dialog 54 | // 55 | 56 | IDD_VIEW_CUSTOM DIALOGEX 0, 0, 215, 120 57 | STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_CLIPSIBLINGS | 58 | WS_CLIPCHILDREN 59 | FONT 8, "MS Shell Dlg", 400, 0, 0x1 60 | BEGIN 61 | CONTROL "",IDC_LIST,"SysListView32",LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | WS_TABSTOP,0,0,214,103 62 | CONTROL "Keep current skin",IDC_KEEP,"Button",BS_OWNERDRAW | WS_TABSTOP,0,106,150,11 63 | CONTROL "Keep all skins",IDC_KEEPALL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,153,106,150,11 64 | CONTROL "<",IDC_PREVSKIP,"Button",BS_OWNERDRAW | WS_TABSTOP,0,120,5,11 65 | CONTROL "Previous page",IDC_PREV,"Button",BS_OWNERDRAW | WS_TABSTOP,5,120,70,11 66 | LTEXT "Page 1",IDC_PAGENUM,78,120,45,11,SS_NOPREFIX 67 | CONTROL "Next page",IDC_NEXT,"Button",BS_OWNERDRAW | WS_TABSTOP,126,120,70,11 68 | CONTROL ">",IDC_NEXTSKIP,"Button",BS_OWNERDRAW | WS_TABSTOP,196,120,5,11 69 | END 70 | 71 | 72 | ///////////////////////////////////////////////////////////////////////////// 73 | // 74 | // DESIGNINFO 75 | // 76 | 77 | #ifdef APSTUDIO_INVOKED 78 | GUIDELINES DESIGNINFO 79 | BEGIN 80 | IDD_VIEW_CUSTOM, DIALOG 81 | BEGIN 82 | RIGHTMARGIN, 214 83 | END 84 | END 85 | #endif // APSTUDIO_INVOKED 86 | 87 | #endif // English (U.S.) resources 88 | ///////////////////////////////////////////////////////////////////////////// 89 | 90 | 91 | 92 | #ifndef APSTUDIO_INVOKED 93 | ///////////////////////////////////////////////////////////////////////////// 94 | // 95 | // Generated from the TEXTINCLUDE 3 resource. 96 | // 97 | 98 | 99 | ///////////////////////////////////////////////////////////////////////////// 100 | #endif // not APSTUDIO_INVOKED 101 | 102 | -------------------------------------------------------------------------------- /ServicePlugins/srv_skinmuseum/srv_skinmuseum.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | Source Files 20 | 21 | 22 | 23 | 24 | Header Files 25 | 26 | 27 | 28 | 29 | Resource Files 30 | 31 | 32 | -------------------------------------------------------------------------------- /ServicePlugins/srv_steamimport/resource.h: -------------------------------------------------------------------------------- 1 | //{{NO_DEPENDENCIES}} 2 | // Microsoft Visual C++ generated include file. 3 | // Used by ml_easysrv.rc 4 | // 5 | #define IDD_VIEW_CUSTOM 101 6 | #define IDC_RESCANLIB 1001 7 | #define IDC_RESCANPL 1002 8 | 9 | // Next default values for new objects 10 | // 11 | #ifdef APSTUDIO_INVOKED 12 | #ifndef APSTUDIO_READONLY_SYMBOLS 13 | #define _APS_NEXT_RESOURCE_VALUE 102 14 | #define _APS_NEXT_COMMAND_VALUE 40001 15 | #define _APS_NEXT_CONTROL_VALUE 1003 16 | #define _APS_NEXT_SYMED_VALUE 101 17 | #endif 18 | #endif 19 | -------------------------------------------------------------------------------- /ServicePlugins/srv_steamimport/srv_steamimport.rc: -------------------------------------------------------------------------------- 1 | // Microsoft Visual C++ generated resource script. 2 | // 3 | #include "resource.h" 4 | 5 | #define APSTUDIO_READONLY_SYMBOLS 6 | ///////////////////////////////////////////////////////////////////////////// 7 | // 8 | // Generated from the TEXTINCLUDE 2 resource. 9 | // 10 | //#include "afxres.h" 11 | #include 12 | 13 | ///////////////////////////////////////////////////////////////////////////// 14 | #undef APSTUDIO_READONLY_SYMBOLS 15 | 16 | ///////////////////////////////////////////////////////////////////////////// 17 | // English (U.S.) resources 18 | 19 | #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) 20 | #ifdef _WIN32 21 | LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US 22 | #pragma code_page(1252) 23 | #endif //_WIN32 24 | 25 | #ifdef APSTUDIO_INVOKED 26 | ///////////////////////////////////////////////////////////////////////////// 27 | // 28 | // TEXTINCLUDE 29 | // 30 | 31 | 1 TEXTINCLUDE 32 | BEGIN 33 | "resource.h\0" 34 | END 35 | 36 | 2 TEXTINCLUDE 37 | BEGIN 38 | "#include ""afxres.h""\r\n" 39 | "\0" 40 | END 41 | 42 | 3 TEXTINCLUDE 43 | BEGIN 44 | "\r\n" 45 | "\0" 46 | END 47 | 48 | #endif // APSTUDIO_INVOKED 49 | 50 | 51 | ///////////////////////////////////////////////////////////////////////////// 52 | // 53 | // Dialog 54 | // 55 | 56 | IDD_VIEW_CUSTOM DIALOGEX 0, 0, 215, 120 57 | STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_CLIPSIBLINGS | 58 | WS_CLIPCHILDREN 59 | FONT 8, "MS Shell Dlg", 400, 0, 0x1 60 | BEGIN 61 | CONTROL "Import / update Local Library",IDC_RESCANLIB,"Button",BS_OWNERDRAW | WS_TABSTOP,1,1,150,14 62 | CONTROL "Generate / update playlists",IDC_RESCANPL,"Button",BS_OWNERDRAW | WS_TABSTOP,1,18,150,14 63 | END 64 | 65 | 66 | ///////////////////////////////////////////////////////////////////////////// 67 | // 68 | // DESIGNINFO 69 | // 70 | 71 | #ifdef APSTUDIO_INVOKED 72 | GUIDELINES DESIGNINFO 73 | BEGIN 74 | IDD_VIEW_CUSTOM, DIALOG 75 | BEGIN 76 | RIGHTMARGIN, 214 77 | END 78 | END 79 | #endif // APSTUDIO_INVOKED 80 | 81 | #endif // English (U.S.) resources 82 | ///////////////////////////////////////////////////////////////////////////// 83 | 84 | 85 | 86 | #ifndef APSTUDIO_INVOKED 87 | ///////////////////////////////////////////////////////////////////////////// 88 | // 89 | // Generated from the TEXTINCLUDE 3 resource. 90 | // 91 | 92 | 93 | ///////////////////////////////////////////////////////////////////////////// 94 | #endif // not APSTUDIO_INVOKED 95 | 96 | -------------------------------------------------------------------------------- /ServicePlugins/srv_steamimport/srv_steamimport.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | Source Files 20 | 21 | 22 | 23 | 24 | Header Files 25 | 26 | 27 | 28 | 29 | Resource Files 30 | 31 | 32 | -------------------------------------------------------------------------------- /WinampEasyService/WebExamples/wsrv_example.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Hello World!
5 | 6 | 7 | 8 | 21 | 22 | -------------------------------------------------------------------------------- /WinampEasyService/esrv_cdlexampleexe/Form1.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace esrv_cdlexampleexe 2 | { 3 | partial class Form1 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | label1 = new Label(); 32 | button1 = new Button(); 33 | SuspendLayout(); 34 | // 35 | // label1 36 | // 37 | label1.AutoSize = true; 38 | label1.Font = new Font("Segoe UI", 20F, FontStyle.Regular, GraphicsUnit.Point); 39 | label1.Location = new Point(52, 36); 40 | label1.Name = "label1"; 41 | label1.Size = new Size(161, 37); 42 | label1.TabIndex = 0; 43 | label1.Text = "Hello There!"; 44 | // 45 | // button1 46 | // 47 | button1.BackgroundImageLayout = ImageLayout.Stretch; 48 | button1.Location = new Point(52, 87); 49 | button1.Name = "button1"; 50 | button1.Size = new Size(161, 30); 51 | button1.TabIndex = 1; 52 | button1.Text = "Button time!"; 53 | button1.UseVisualStyleBackColor = true; 54 | button1.Click += button1_Click; 55 | button1.MouseDown += button1_MouseDown; 56 | button1.MouseUp += button1_MouseUp; 57 | // 58 | // Form1 59 | // 60 | AutoScaleDimensions = new SizeF(7F, 15F); 61 | AutoScaleMode = AutoScaleMode.Font; 62 | ClientSize = new Size(299, 164); 63 | Controls.Add(button1); 64 | Controls.Add(label1); 65 | FormBorderStyle = FormBorderStyle.None; 66 | Name = "Form1"; 67 | ShowInTaskbar = false; 68 | Text = "Form1"; 69 | FormClosing += Form1_FormClosing; 70 | Load += Form1_Load; 71 | ResumeLayout(false); 72 | PerformLayout(); 73 | } 74 | 75 | #endregion 76 | 77 | private Label label1; 78 | private Button button1; 79 | } 80 | } -------------------------------------------------------------------------------- /WinampEasyService/esrv_cdlexampleexe/Program.cs: -------------------------------------------------------------------------------- 1 | namespace esrv_cdlexampleexe 2 | { 3 | internal static class Program 4 | { 5 | /// 6 | /// The main entry point for the application. 7 | /// 8 | [STAThread] 9 | static void Main(string[] args) 10 | { 11 | const uint CAP_DEFAULT = 0; 12 | const uint CAP_CUSTOMDIALOG = 1; 13 | 14 | if (args[0] == "GetNodeDesc") 15 | { 16 | Console.WriteLine("UI Examples"); 17 | Console.WriteLine("Example UI EXE Plugin"); 18 | Console.WriteLine("NONE"); 19 | Console.WriteLine(CAP_CUSTOMDIALOG); 20 | } 21 | else if (args[0] == "GetCustomDialog") 22 | { 23 | ApplicationConfiguration.Initialize(); 24 | Application.Run(new Form1(IntPtr.Parse(args[1]), IntPtr.Parse(args[2]), IntPtr.Parse(args[3]), args[4], args[5], args[6], args[7], IntPtr.Parse(args[8]))); 25 | } 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /WinampEasyService/esrv_cdlexampleexe/esrv_cdlexampleexe.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | WinExe 5 | net6.0-windows 6 | enable 7 | true 8 | enable 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /WinampEasyService/esrv_exampleexe/Program.cs: -------------------------------------------------------------------------------- 1 | namespace srv_exampleexe 2 | { 3 | internal class Program 4 | { 5 | static void Main(string[] args) 6 | { 7 | const uint CAP_DEFAULT = 0; 8 | const uint CAP_CUSTOMDIALOG = 1; 9 | 10 | if (args[0] == "GetNodeDesc") 11 | { 12 | Console.WriteLine("Examples"); 13 | Console.WriteLine("Example EXE Plugin"); 14 | Console.WriteLine("Title\tType of item"); 15 | Console.WriteLine(CAP_DEFAULT); 16 | } 17 | else if (args[0] == "InvokeService") 18 | { 19 | Console.WriteLine("Example Title\tHello from CS EXE - This is a direct filename"); 20 | Console.WriteLine("Example Playlist Title"); 21 | Console.WriteLine("e:\\example.mp3"); 22 | 23 | Console.WriteLine("Example Title 2\tHello from CS EXE - This will use a reference"); 24 | Console.WriteLine("Example Playlist Title 2"); 25 | Console.WriteLine("ref_examplefile"); 26 | } 27 | else if (args[0] == "GetFileName") 28 | { 29 | if (args[1] == "ref_examplefile") 30 | Console.WriteLine("e:\\example.mp3"); 31 | else 32 | Console.WriteLine("This really shouldn't happen..."); 33 | } 34 | } 35 | } 36 | } -------------------------------------------------------------------------------- /WinampEasyService/esrv_exampleexe/esrv_exampleexe.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Exe 5 | net6.0 6 | enable 7 | enable 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /WinampEasyService/esrv_examplemulti/Program.cs: -------------------------------------------------------------------------------- 1 | namespace esrv_examplemulti 2 | { 3 | internal class Program 4 | { 5 | static void Main(string[] args) 6 | { 7 | const uint CAP_DEFAULT = 0; 8 | const uint CAP_CUSTOMDIALOG = 1; 9 | const uint CAP_MULTISERVICE = 2; 10 | 11 | int currentMultiID = 0; 12 | int cmdIndex = 0; 13 | if (args[0] == "select") 14 | { 15 | currentMultiID = int.Parse(args[1]); 16 | cmdIndex = 2; 17 | } 18 | 19 | if (args[cmdIndex] == "GetNodeNum") 20 | { 21 | Console.WriteLine(2); 22 | } 23 | else if (args[cmdIndex] == "GetNodeDesc") 24 | { 25 | switch (currentMultiID) 26 | { 27 | case 0: 28 | Console.WriteLine("Examples"); 29 | Console.WriteLine("Example EXE Multi Plugin 1"); 30 | Console.WriteLine("Title\tType of item"); 31 | Console.WriteLine(CAP_MULTISERVICE); 32 | break; 33 | case 1: 34 | Console.WriteLine("Examples"); 35 | Console.WriteLine("Example EXE Multi Plugin 2"); 36 | Console.WriteLine("Title\tType of item"); 37 | Console.WriteLine(CAP_MULTISERVICE); 38 | break; 39 | } 40 | } 41 | else if (args[cmdIndex] == "InvokeService") 42 | { 43 | switch (currentMultiID) 44 | { 45 | case 0: 46 | Console.WriteLine("Example Title\tHello from CS EXE Subservice 1!"); 47 | Console.WriteLine("Example Playlist Title"); 48 | Console.WriteLine("e:\\example.mp3"); 49 | 50 | Console.WriteLine("Example Title 2\tHello from CS EXE Subservice 1!"); 51 | Console.WriteLine("Example Playlist Title 2"); 52 | Console.WriteLine("e:\\example.mp3"); 53 | 54 | break; 55 | case 1: 56 | Console.WriteLine("Example Title\tHello from CS EXE Subservice 2!"); 57 | Console.WriteLine("Example Playlist Title"); 58 | Console.WriteLine("e:\\example.mp3"); 59 | 60 | Console.WriteLine("Example Title 2\tHello from CS EXE Subservice 2!"); 61 | Console.WriteLine("Example Playlist Title 2"); 62 | Console.WriteLine("e:\\example.mp3"); 63 | 64 | break; 65 | } 66 | } 67 | } 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /WinampEasyService/esrv_examplemulti/esrv_examplemulti.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Exe 5 | net6.0 6 | enable 7 | enable 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /WinampEasyService/in_easyfngetter/in_easyfngetter.cpp: -------------------------------------------------------------------------------- 1 | #define UNICODE_INPUT_PLUGIN 2 | 3 | #include 4 | #include "Winamp/in2.h" 5 | #include 6 | 7 | #include "Winamp/wa_ipc.h" 8 | 9 | #pragma comment(lib, "Shlwapi.lib") 10 | 11 | extern In_Module plugin; // our plugin's definition and data struct 12 | 13 | void SetInfoHook(int bitrate, int srate, int stereo, int synched) 14 | { 15 | plugin.SetInfo(bitrate, srate, stereo, synched); 16 | } 17 | 18 | 19 | void Config(HWND hwndParent) 20 | { 21 | 22 | } 23 | 24 | void About(HWND hwndParent) 25 | { 26 | 27 | } 28 | 29 | void Init() 30 | { 31 | 32 | } 33 | 34 | void Quit() 35 | { 36 | 37 | } 38 | 39 | // Note: Use last known file if file is NULL 40 | void GetFileInfo(const wchar_t* file, wchar_t* title, int* length_in_ms) 41 | { 42 | auto easysrvdll = GetModuleHandle(L"ml_easysrv.dll"); 43 | auto getPluginFileName = reinterpret_cast(GetProcAddress(easysrvdll, "GetPluginFileName")); 44 | 45 | int plPos = SendMessage(plugin.hMainWindow, WM_WA_IPC, 0, IPC_GETLISTPOS); 46 | wchar_t* refFileName = (wchar_t*)SendMessage(plugin.hMainWindow, WM_WA_IPC, plPos, IPC_GETPLAYLISTFILEW); 47 | if (wcsncmp(refFileName + (wcslen(refFileName) - 4), L".ref", 4) && getPluginFileName(refFileName, true) == NULL) 48 | return; 49 | 50 | const wchar_t* realFileName = getPluginFileName(refFileName, false); 51 | 52 | if (realFileName != NULL) 53 | { 54 | SendMessage(plugin.hMainWindow, WM_WA_IPC, (WPARAM)realFileName, IPC_CHANGECURRENTFILEW); 55 | SendMessage(plugin.hMainWindow, WM_WA_IPC, 0, IPC_UPDTITLE); 56 | } 57 | } 58 | 59 | int InfoBox(const wchar_t* file, HWND hwndParent) 60 | { 61 | return INFOBOX_UNCHANGED; 62 | } 63 | 64 | int IsOurFile(const wchar_t* file) 65 | { 66 | auto easysrvdll = GetModuleHandle(L"ml_easysrv.dll"); 67 | auto getPluginFileName = reinterpret_cast(GetProcAddress(easysrvdll, "GetPluginFileName")); 68 | 69 | if (file != NULL && !wcsncmp(file + (wcslen(file) - 4), L".ref", 4)) 70 | return 1; 71 | else if (file != NULL && getPluginFileName(file, true) != NULL) 72 | return 1; 73 | else 74 | return 0; 75 | } 76 | 77 | int Play(const wchar_t* file) 78 | { 79 | return 0; 80 | } 81 | 82 | void Pause() 83 | { 84 | 85 | } 86 | 87 | void UnPause() 88 | { 89 | 90 | } 91 | 92 | int IsPaused() 93 | { 94 | return 0; 95 | } 96 | 97 | void Stop() 98 | { 99 | 100 | } 101 | 102 | int GetLength() 103 | { 104 | return -1; 105 | } 106 | 107 | int GetOutputTime() 108 | { 109 | return 0; 110 | } 111 | 112 | void SetOutputTime(int time_in_ms) 113 | { 114 | 115 | } 116 | 117 | void SetVolume(int volume) 118 | { 119 | 120 | } 121 | 122 | void SetPan(int pan) 123 | { 124 | 125 | } 126 | 127 | void EQSet(int on, char data[10], int preamp) 128 | { 129 | 130 | } 131 | 132 | In_Module plugin = 133 | { 134 | IN_VER_OLD/*/IN_VER/**/, // defined in IN2.H 135 | const_cast("Reference Handler for WinampEasyService"), 136 | 0, // hMainWindow (filled in by winamp) 137 | 0, // hDllInstance (filled in by winamp) 138 | const_cast("ref\0Reference\0"), // this is a double-null limited list. "EXT\0Description\0EXT\0Description\0" etc. 139 | 0, // is_seekable 140 | 0, // uses output plug-in system 141 | Config, 142 | About, 143 | (int(__cdecl*)(void))Init, 144 | Quit, 145 | GetFileInfo, 146 | InfoBox, 147 | IsOurFile, 148 | Play, 149 | Pause, 150 | UnPause, 151 | IsPaused, 152 | Stop, 153 | 154 | GetLength, 155 | GetOutputTime, 156 | SetOutputTime, 157 | 158 | SetVolume, 159 | SetPan, 160 | 161 | 0,0,0,0,0,0,0,0,0, // visualization calls filled in by winamp 162 | 163 | 0,0, // dsp calls filled in by winamp 164 | 165 | EQSet, 166 | 167 | NULL, // setinfo call filled in by winamp 168 | 169 | 0, // out_mod filled in by winamp 170 | }; 171 | 172 | extern "C" __declspec(dllexport) In_Module * winampGetInModule2() 173 | { 174 | return &plugin; 175 | } -------------------------------------------------------------------------------- /WinampEasyService/in_easyfngetter/in_easyfngetter.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | Source Files 20 | 21 | 22 | -------------------------------------------------------------------------------- /WinampEasyService/isrv_mainpage/isrv_mainpage.cpp: -------------------------------------------------------------------------------- 1 | #include "..\ml_easysrv\easysrv.h" 2 | 3 | #include 4 | #include "Winamp/wa_ipc.h" 5 | #include "gen_ml/ml.h" 6 | 7 | #include 8 | #include "shlobj.h" 9 | #include "gen_ml/ml_ipc_0313.h" 10 | #include "gen_ml/childwnd.h" 11 | #include "Winamp/wa_dlg.h" 12 | #include "resource.h" 13 | 14 | #include 15 | 16 | #include "resource.h" 17 | 18 | GetOptionFunc GetOption; 19 | SetOptionFunc SetOption; 20 | const wchar_t* myDirectory; 21 | UINT_PTR myServiceID; 22 | 23 | HINSTANCE myself = NULL; 24 | HWND hwndWinampParent = NULL; 25 | HWND hwndLibraryParent = NULL; 26 | 27 | wchar_t configFileName[MAX_PATH] = L""; 28 | 29 | BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) 30 | { 31 | myself = (HINSTANCE)hModule; 32 | return TRUE; 33 | } 34 | 35 | void InitService(AddItemFunc addItemFunc, GetOptionFunc getOptionFunc, SetOptionFunc setOptionFunc, const wchar_t* pluginDir, UINT_PTR serviceID) 36 | { 37 | GetOption = getOptionFunc; 38 | SetOption = setOptionFunc; 39 | myDirectory = pluginDir; 40 | myServiceID = serviceID; 41 | } 42 | 43 | NodeDescriptor GetNodeDesc() 44 | { 45 | NodeDescriptor desc = { NULL, L"Services", NULL, CAP_CUSTOMDIALOG }; 46 | return desc; 47 | } 48 | 49 | typedef int (*HookDialogFunc)(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); 50 | static HookDialogFunc ml_hook_dialog_msg = 0; 51 | 52 | static BOOL view_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam) 53 | { 54 | /* gen_ml has some helper functions to deal with skinned dialogs, 55 | we're going to grab their function pointers. 56 | for definition of magic numbers, see gen_ml/ml.h */ 57 | if (!ml_hook_dialog_msg) 58 | { 59 | /* skinning helper functions */ 60 | ml_hook_dialog_msg = (HookDialogFunc)SendMessage(hwndLibraryParent, WM_ML_IPC, (WPARAM)2, ML_IPC_SKIN_WADLG_GETFUNC); 61 | } 62 | 63 | /* skin dialog */ 64 | MLSKINWINDOW sw; 65 | sw.skinType = SKINNEDWND_TYPE_DIALOG; 66 | sw.style = SWS_USESKINCOLORS | SWS_USESKINCURSORS | SWS_USESKINFONT; 67 | sw.hwndToSkin = hwnd; 68 | MLSkinWindow(hwndLibraryParent, &sw); 69 | 70 | /* skin button */ 71 | sw.skinType = SKINNEDWND_TYPE_BUTTON; 72 | sw.style = SWS_USESKINCOLORS | SWS_USESKINCURSORS | SWS_USESKINFONT; 73 | sw.hwndToSkin = GetDlgItem(hwnd, IDC_CONFIGBUTTON); 74 | MLSkinWindow(hwndLibraryParent, &sw); 75 | 76 | /* skin text */ 77 | sw.skinType = SKINNEDWND_TYPE_STATIC; 78 | sw.style = SWS_USESKINCOLORS | SWS_USESKINCURSORS | SWS_USESKINFONT; 79 | sw.hwndToSkin = GetDlgItem(hwnd, IDC_INFOTEXT); 80 | MLSkinWindow(hwndLibraryParent, &sw); 81 | 82 | return FALSE; 83 | } 84 | 85 | static BOOL view_OnSize(HWND hwnd, UINT state, int cx, int cy) 86 | { 87 | if (state != SIZE_MINIMIZED) 88 | { 89 | HWND infoWnd = GetDlgItem(hwnd, IDC_INFOTEXT); 90 | HWND buttonWnd = GetDlgItem(hwnd, IDC_CONFIGBUTTON); 91 | 92 | MoveWindow(infoWnd, 1, 1, cx, 150, TRUE); 93 | MoveWindow(buttonWnd, 1, 152, 150, 25, TRUE); 94 | 95 | RedrawWindow(infoWnd, NULL, NULL, RDW_INVALIDATE); 96 | } 97 | 98 | return FALSE; 99 | } 100 | 101 | static BOOL view_OnDestroy(HWND hwnd) 102 | { 103 | return FALSE; 104 | } 105 | 106 | static BOOL view_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) 107 | { 108 | switch (id) { 109 | case IDC_CONFIGBUTTON: 110 | { 111 | ShellExecute(0, 0, configFileName, 0, 0, SW_SHOW); 112 | } 113 | break; 114 | } 115 | return 0; 116 | } 117 | 118 | LRESULT CALLBACK customDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) 119 | { 120 | /* first, ask the dialog skinning system if it wants to do anything with the message 121 | the function pointer gets set during WM_INITDIALOG so might be NULL for the first few messages 122 | in theory we could grab it right here if we don't have it, but it's not necessary 123 | and I wanted to put all the function pointer gathering code in the same place for this example */ 124 | if (ml_hook_dialog_msg) 125 | { 126 | INT_PTR a = ml_hook_dialog_msg(hwndDlg, uMsg, wParam, lParam); 127 | if (a) 128 | return a; 129 | } 130 | 131 | switch (uMsg) { 132 | HANDLE_MSG(hwndDlg, WM_INITDIALOG, view_OnInitDialog); 133 | HANDLE_MSG(hwndDlg, WM_COMMAND, view_OnCommand); 134 | HANDLE_MSG(hwndDlg, WM_SIZE, view_OnSize); 135 | return 0; 136 | HANDLE_MSG(hwndDlg, WM_DESTROY, view_OnDestroy); 137 | 138 | } 139 | return FALSE; 140 | } 141 | 142 | HWND GetCustomDialog(HWND _hwndWinampParent, HWND _hwndLibraryParent, HWND hwndParentControl, wchar_t* skinPath) 143 | { 144 | hwndWinampParent = _hwndWinampParent; 145 | hwndLibraryParent = _hwndLibraryParent; 146 | 147 | HWND dialogWnd = CreateDialog(myself, MAKEINTRESOURCE(IDD_VIEW_CUSTOM), hwndParentControl, (DLGPROC)customDialogProc); 148 | 149 | wchar_t tracePath[MAX_PATH]; 150 | GetOption(myServiceID, L"trace", L"", tracePath, MAX_PATH); 151 | 152 | if (wcslen(configFileName) == 0) 153 | { 154 | char* iniDir = (char*)SendMessage(hwndWinampParent, WM_WA_IPC, 0, IPC_GETINIDIRECTORY); 155 | wsprintf(configFileName, L"%S\\easysrv.ini", iniDir); 156 | } 157 | 158 | wchar_t infoText[1024]; 159 | wsprintf(infoText, L"Hi! Thanks for checking out WinampEasyService!\r\nIf you need help, I usually lurk in the WACUP Discord.\r\n\r\n"); 160 | wsprintf(infoText + wcslen(infoText), L"Current config file: %s\r\nCurrent trace file: %s\r\n\r\n", configFileName, tracePath); 161 | wsprintf(infoText + wcslen(infoText), L"After editing the config file, restart the application."); 162 | HWND infoWnd = GetDlgItem(dialogWnd, IDC_INFOTEXT); 163 | SetWindowText(infoWnd, infoText); 164 | RedrawWindow(infoWnd, NULL, NULL, RDW_INVALIDATE); 165 | 166 | return dialogWnd; 167 | } 168 | -------------------------------------------------------------------------------- /WinampEasyService/isrv_mainpage/isrv_mainpage.rc: -------------------------------------------------------------------------------- 1 | // Microsoft Visual C++ generated resource script. 2 | // 3 | #include "resource.h" 4 | 5 | #define APSTUDIO_READONLY_SYMBOLS 6 | ///////////////////////////////////////////////////////////////////////////// 7 | // 8 | // Generated from the TEXTINCLUDE 2 resource. 9 | // 10 | //#include "afxres.h" 11 | #include 12 | 13 | ///////////////////////////////////////////////////////////////////////////// 14 | #undef APSTUDIO_READONLY_SYMBOLS 15 | 16 | ///////////////////////////////////////////////////////////////////////////// 17 | // English (U.S.) resources 18 | 19 | #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) 20 | #ifdef _WIN32 21 | LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US 22 | #pragma code_page(1252) 23 | #endif //_WIN32 24 | 25 | #ifdef APSTUDIO_INVOKED 26 | ///////////////////////////////////////////////////////////////////////////// 27 | // 28 | // TEXTINCLUDE 29 | // 30 | 31 | 1 TEXTINCLUDE 32 | BEGIN 33 | "resource.h\0" 34 | END 35 | 36 | 2 TEXTINCLUDE 37 | BEGIN 38 | "#include ""afxres.h""\r\n" 39 | "\0" 40 | END 41 | 42 | 3 TEXTINCLUDE 43 | BEGIN 44 | "\r\n" 45 | "\0" 46 | END 47 | 48 | #endif // APSTUDIO_INVOKED 49 | 50 | 51 | ///////////////////////////////////////////////////////////////////////////// 52 | // 53 | // Dialog 54 | // 55 | 56 | IDD_VIEW_CUSTOM DIALOGEX 0, 0, 215, 120 57 | STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_CLIPSIBLINGS | 58 | WS_CLIPCHILDREN 59 | FONT 8, "MS Shell Dlg", 400, 0, 0x1 60 | BEGIN 61 | LTEXT "Info",IDC_INFOTEXT,0,0,300,300,SS_NOPREFIX 62 | CONTROL "Open config file",IDC_CONFIGBUTTON,"Button",BS_OWNERDRAW | WS_TABSTOP,0,300,50,11 63 | END 64 | 65 | 66 | ///////////////////////////////////////////////////////////////////////////// 67 | // 68 | // DESIGNINFO 69 | // 70 | 71 | #ifdef APSTUDIO_INVOKED 72 | GUIDELINES DESIGNINFO 73 | BEGIN 74 | IDD_VIEW_CUSTOM, DIALOG 75 | BEGIN 76 | RIGHTMARGIN, 214 77 | END 78 | END 79 | #endif // APSTUDIO_INVOKED 80 | 81 | #endif // English (U.S.) resources 82 | ///////////////////////////////////////////////////////////////////////////// 83 | 84 | 85 | 86 | #ifndef APSTUDIO_INVOKED 87 | ///////////////////////////////////////////////////////////////////////////// 88 | // 89 | // Generated from the TEXTINCLUDE 3 resource. 90 | // 91 | 92 | 93 | ///////////////////////////////////////////////////////////////////////////// 94 | #endif // not APSTUDIO_INVOKED 95 | 96 | -------------------------------------------------------------------------------- /WinampEasyService/isrv_mainpage/isrv_mainpage.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | Source Files 20 | 21 | 22 | 23 | 24 | Resource Files 25 | 26 | 27 | 28 | 29 | Header Files 30 | 31 | 32 | -------------------------------------------------------------------------------- /WinampEasyService/isrv_mainpage/resource.h: -------------------------------------------------------------------------------- 1 | //{{NO_DEPENDENCIES}} 2 | // Microsoft Visual C++ generated include file. 3 | // Used by ml_easysrv.rc 4 | // 5 | #define IDD_VIEW_CUSTOM 101 6 | #define IDC_INFOTEXT 1001 7 | #define IDC_CONFIGBUTTON 1002 8 | 9 | // Next default values for new objects 10 | // 11 | #ifdef APSTUDIO_INVOKED 12 | #ifndef APSTUDIO_READONLY_SYMBOLS 13 | #define _APS_NEXT_RESOURCE_VALUE 102 14 | #define _APS_NEXT_COMMAND_VALUE 40001 15 | #define _APS_NEXT_CONTROL_VALUE 1003 16 | #define _APS_NEXT_SYMED_VALUE 101 17 | #endif 18 | #endif 19 | -------------------------------------------------------------------------------- /WinampEasyService/isrv_managed/Form1.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace isrv_managed 2 | { 3 | partial class Form1 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | SuspendLayout(); 32 | // 33 | // Form1 34 | // 35 | AutoScaleDimensions = new SizeF(7F, 15F); 36 | AutoScaleMode = AutoScaleMode.Font; 37 | ClientSize = new Size(800, 450); 38 | FormBorderStyle = FormBorderStyle.None; 39 | Name = "Form1"; 40 | ShowInTaskbar = false; 41 | Text = "Form1"; 42 | Load += Form1_Load; 43 | ResumeLayout(false); 44 | } 45 | 46 | #endregion 47 | } 48 | } -------------------------------------------------------------------------------- /WinampEasyService/isrv_managed/isrv_managed.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | WinExe 5 | net6.0-windows 6 | enable 7 | true 8 | enable 9 | 10 | 11 | -------------------------------------------------------------------------------- /WinampEasyService/isrv_web/Form1.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace isrv_web 2 | { 3 | partial class Form1 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | SuspendLayout(); 32 | // 33 | // Form1 34 | // 35 | AutoScaleDimensions = new SizeF(7F, 15F); 36 | AutoScaleMode = AutoScaleMode.Font; 37 | ClientSize = new Size(1, 1); 38 | FormBorderStyle = FormBorderStyle.None; 39 | Name = "Form1"; 40 | ShowInTaskbar = false; 41 | Text = "Form1"; 42 | FormClosing += Form1_FormClosing; 43 | Load += Form1_Load; 44 | ResumeLayout(false); 45 | } 46 | 47 | #endregion 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /WinampEasyService/isrv_web/Program.cs: -------------------------------------------------------------------------------- 1 | using CefSharp; 2 | using CefSharp.WinForms; 3 | using System.Security.AccessControl; 4 | using System.Windows.Forms; 5 | 6 | namespace isrv_web 7 | { 8 | internal static class Program 9 | { 10 | [STAThread] 11 | static void Main(string[] args) 12 | { 13 | ApplicationConfiguration.Initialize(); 14 | Application.Run(new Form1(args)); 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /WinampEasyService/isrv_web/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "profiles": { 3 | "isrv_web": { 4 | "commandName": "Project", 5 | "commandLineArgs": "\"C:\\Program Files (x86)\\WACUP\\Plugins\\wsrv_example.html\"\r\nGetNodeDesc" 6 | } 7 | } 8 | } -------------------------------------------------------------------------------- /WinampEasyService/isrv_web/WinampJSObject.cs: -------------------------------------------------------------------------------- 1 | using CefSharp.WinForms; 2 | using CefSharp; 3 | using System; 4 | using System.Collections.Generic; 5 | using System.Linq; 6 | using System.Runtime.InteropServices; 7 | using System.Security.Cryptography.X509Certificates; 8 | using System.Text; 9 | using System.Threading.Tasks; 10 | 11 | namespace isrv_web 12 | { 13 | public class WinampJSObject 14 | { 15 | #region P/Invoke 16 | [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] 17 | static extern uint GetPrivateProfileString( 18 | string lpAppName, 19 | string lpKeyName, 20 | string lpDefault, 21 | StringBuilder lpReturnedString, 22 | uint nSize, 23 | string lpFileName); 24 | 25 | [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] 26 | static extern uint WritePrivateProfileString( 27 | string lpAppName, 28 | string lpKeyName, 29 | string lpString, 30 | string lpFileName); 31 | 32 | [DllImport("user32.dll", CharSet = CharSet.Unicode)] 33 | static extern IntPtr SendMessage( 34 | IntPtr hWnd, 35 | uint Msg, 36 | IntPtr wParam, 37 | IntPtr lParam); 38 | 39 | [StructLayout(LayoutKind.Sequential)] 40 | struct COPYDATASTRUCT 41 | { 42 | public IntPtr dwData; 43 | public int cbData; 44 | public IntPtr lpData; 45 | } 46 | 47 | const uint WM_COMMAND = 0x0111; 48 | const uint WM_USER = 0x0400; 49 | const uint WM_WA_IPC = WM_USER; 50 | const uint WM_COPYDATA = 0x004A; 51 | const uint WINAMP_BUTTON2 = 40045; 52 | const uint IPC_DELETE = 101; 53 | const uint IPC_SETPLAYLISTPOS = 121; 54 | const uint IPC_ENQUEUEFILE = 100; 55 | const uint IPC_ENQUEUEFILEW = 1100; 56 | #endregion 57 | 58 | string shortName; 59 | string configFile; 60 | IntPtr hwndWinampParent; 61 | ChromiumWebBrowser browser; 62 | 63 | public WinampJSObject(string _shortName, string _configFile, IntPtr _hwndWinampParent, ChromiumWebBrowser _browser) 64 | { 65 | shortName = _shortName; 66 | configFile = _configFile; 67 | hwndWinampParent = _hwndWinampParent; 68 | browser = _browser; 69 | } 70 | 71 | public string getoption(string optionName, string defaultValue) 72 | { 73 | StringBuilder sb = new StringBuilder(1024); 74 | GetPrivateProfileString(shortName, optionName, defaultValue, sb, (uint)sb.Capacity, configFile); 75 | return sb.ToString(); 76 | } 77 | 78 | public void setoption(string optionName, string optionValue) 79 | { 80 | WritePrivateProfileString(shortName, optionName, optionValue, configFile); 81 | } 82 | 83 | public void additem(string filename, bool enqueue) 84 | { 85 | COPYDATASTRUCT copyData = new COPYDATASTRUCT(); 86 | copyData.dwData = new IntPtr(IPC_ENQUEUEFILEW); 87 | copyData.cbData = (filename.Length + 1) * 2; 88 | copyData.lpData = Marshal.StringToHGlobalUni(filename); 89 | 90 | IntPtr ptrCopyData = Marshal.AllocCoTaskMem(Marshal.SizeOf(copyData)); 91 | Marshal.StructureToPtr(copyData, ptrCopyData, false); 92 | 93 | if (enqueue) 94 | { 95 | SendMessage(hwndWinampParent, WM_COPYDATA, new IntPtr(0), ptrCopyData); 96 | } 97 | else 98 | { 99 | SendMessage(hwndWinampParent, WM_WA_IPC, new IntPtr(0), new IntPtr(IPC_DELETE)); 100 | SendMessage(hwndWinampParent, WM_COPYDATA, new IntPtr(0), ptrCopyData); 101 | SendMessage(hwndWinampParent, WM_WA_IPC, new IntPtr(1), new IntPtr(IPC_SETPLAYLISTPOS)); 102 | SendMessage(hwndWinampParent, WM_COMMAND, new IntPtr(WINAMP_BUTTON2), new IntPtr(0)); 103 | } 104 | 105 | Marshal.FreeCoTaskMem(ptrCopyData); 106 | } 107 | 108 | public void inject(string url, string js) 109 | { 110 | browser.LoadUrlAsync(url); 111 | browser.ExecuteScriptAsyncWhenPageLoaded(js, false); 112 | } 113 | } 114 | } 115 | -------------------------------------------------------------------------------- /WinampEasyService/isrv_web/isrv_web.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | WinExe 5 | net6.0-windows 6 | enable 7 | true 8 | enable 9 | AnyCPU 10 | isrv_web.Program 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /WinampEasyService/ml_easysrv/DLLService.cpp: -------------------------------------------------------------------------------- 1 | #include "easysrv_internal.h" 2 | 3 | #include 4 | #include "Winamp/wa_ipc.h" 5 | 6 | DLLService::DLLService(const wchar_t* dllFullPath, const wchar_t* _shortName, int _multiID) 7 | { 8 | HMODULE dllModule = LoadLibraryW(dllFullPath); 9 | _initService = reinterpret_cast(GetProcAddress(dllModule, "InitService")); 10 | _getNodeDesc = reinterpret_cast(GetProcAddress(dllModule, "GetNodeDesc")); 11 | _invokeService = reinterpret_cast(GetProcAddress(dllModule, "InvokeService")); 12 | _getFileName = reinterpret_cast(GetProcAddress(dllModule, "GetFileName")); 13 | _getCustomDialog = reinterpret_cast(GetProcAddress(dllModule, "GetCustomDialog")); 14 | _getNodeNum = reinterpret_cast(GetProcAddress(dllModule, "GetNodeNum")); 15 | _selectService = reinterpret_cast(GetProcAddress(dllModule, "SelectService")); 16 | _getCustomRefId = reinterpret_cast(GetProcAddress(dllModule, "GetCustomRefId")); 17 | _getUrlPrefix = reinterpret_cast(GetProcAddress(dllModule, "GetUrlPrefix")); 18 | 19 | if (_selectService) 20 | { 21 | _selectService(_multiID); 22 | } 23 | 24 | if (_initService && _getNodeDesc) 25 | { 26 | isValid = true; 27 | 28 | nodeDescCache = _getNodeDesc(); 29 | if (nodeDescCache.ColumnNames == NULL) 30 | nodeDescCache.ColumnNames = L"Author\tTitle\tInformation"; 31 | 32 | if ((nodeDescCache.Capabilities & CAP_CUSTOMREFID) && _getCustomRefId) 33 | customRefIdCache = _getCustomRefId(); 34 | 35 | if ((nodeDescCache.Capabilities & CAP_URLHANDLER) && _getUrlPrefix) 36 | urlPrefixCache = _getUrlPrefix(); 37 | } 38 | else 39 | { 40 | isValid = false; 41 | } 42 | 43 | multiID = _multiID; 44 | shortName = _wcsdup(_shortName); 45 | } 46 | 47 | void DLLService::InitService(UINT_PTR serviceID) 48 | { 49 | if (_selectService) 50 | { 51 | _selectService(multiID); 52 | } 53 | 54 | _serviceID = serviceID; 55 | _initService( 56 | [](const wchar_t* displayInfo, const wchar_t* playlistInfo, const wchar_t* filename, UINT_PTR serviceID) -> void { 57 | ItemInfo currentItem = { displayInfo, playlistInfo, filename }; 58 | serviceListItemMap[serviceID].push_back(currentItem); 59 | }, 60 | [](UINT_PTR serviceID, const wchar_t* optionName, const wchar_t* defaultValue, wchar_t* output, DWORD outputSize) -> void { 61 | GetPrivateProfileString(serviceMap[serviceID]->GetShortName(), optionName, defaultValue, output, outputSize, configFileName); 62 | }, 63 | [](UINT_PTR serviceID, const wchar_t* optionName, const wchar_t* optionValue) -> void { 64 | WritePrivateProfileString(serviceMap[serviceID]->GetShortName(), optionName, optionValue, configFileName); 65 | }, 66 | pluginDir, 67 | serviceID 68 | ); 69 | } 70 | 71 | NodeDescriptor& DLLService::GetNodeDesc() 72 | { 73 | return nodeDescCache; 74 | } 75 | 76 | int DLLService::GetNodeNum() 77 | { 78 | return _getNodeNum(); 79 | } 80 | 81 | void DLLService::InvokeService(HWND hwndWinampParent, HWND hwndLibraryParent, HWND hwndParentControl) 82 | { 83 | if (_selectService) 84 | { 85 | _selectService(multiID); 86 | } 87 | 88 | std::lock_guard guard(serviceListItemMapMutex); 89 | serviceListItemMap[_serviceID].clear(); 90 | 91 | wchar_t skinPath[MAX_PATH]; 92 | SendMessage(hwndWinampParent, WM_WA_IPC, (WPARAM)skinPath, IPC_GETSKINW); 93 | 94 | _invokeService(hwndWinampParent, hwndLibraryParent, hwndParentControl, skinPath); 95 | } 96 | 97 | const wchar_t* DLLService::GetFileName(const wchar_t* fileID) 98 | { 99 | if (_selectService) 100 | { 101 | _selectService(multiID); 102 | } 103 | 104 | return _getFileName(fileID); 105 | } 106 | 107 | HWND DLLService::GetCustomDialog(HWND _hwndWinampParent, HWND _hwndLibraryParent, HWND hwndParentControl) 108 | { 109 | if (_selectService) 110 | { 111 | _selectService(multiID); 112 | } 113 | 114 | wchar_t skinPath[MAX_PATH]; 115 | SendMessage(_hwndWinampParent, WM_WA_IPC, (WPARAM)skinPath, IPC_GETSKINW); 116 | 117 | return _getCustomDialog(_hwndWinampParent, _hwndLibraryParent, hwndParentControl, skinPath); 118 | } 119 | 120 | void DLLService::DestroyingCustomDialog() {} 121 | 122 | bool DLLService::IsValid() 123 | { 124 | return isValid; 125 | } 126 | 127 | const wchar_t* DLLService::GetShortName() 128 | { 129 | return shortName; 130 | } 131 | 132 | const wchar_t* DLLService::GetCustomRefId() 133 | { 134 | return customRefIdCache; 135 | } 136 | 137 | const wchar_t* DLLService::GetUrlPrefix() 138 | { 139 | return urlPrefixCache; 140 | } 141 | -------------------------------------------------------------------------------- /WinampEasyService/ml_easysrv/easysrv.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | #ifdef EASYSRV_IMPORTING 6 | #define EASY_API __declspec(dllimport) 7 | #else 8 | #define EASY_API __declspec(dllexport) 9 | #endif 10 | 11 | // Functions passed to InitService() 12 | typedef void (*AddItemFunc)(const wchar_t* displayInfo, const wchar_t* playlistInfo, const wchar_t* filename, UINT_PTR serviceID); 13 | typedef void (*GetOptionFunc)(UINT_PTR serviceID, const wchar_t* optionName, const wchar_t* defaultValue, wchar_t* output, DWORD outputSize); 14 | typedef void (*SetOptionFunc)(UINT_PTR serviceID, const wchar_t* optionName, const wchar_t* optionValue); 15 | 16 | // Values for NodeDescriptor.Capabilities 17 | #define CAP_DEFAULT 0u 18 | #define CAP_CUSTOMDIALOG 1u 19 | #define CAP_MULTISERVICE 2u 20 | #define CAP_CUSTOMREFID 4u 21 | #define CAP_URLHANDLER 8u 22 | 23 | struct NodeDescriptor 24 | { 25 | const wchar_t* Category; 26 | const wchar_t* NodeName; 27 | const wchar_t* ColumnNames; 28 | unsigned int Capabilities; 29 | }; 30 | 31 | #ifdef __cplusplus 32 | extern "C" { 33 | #endif 34 | 35 | EASY_API void InitService(AddItemFunc addItemFunc, GetOptionFunc getOptionFunc, SetOptionFunc setOptionFunc, const wchar_t* pluginDir, UINT_PTR serviceID); 36 | EASY_API NodeDescriptor GetNodeDesc(); 37 | EASY_API void InvokeService(HWND hwndWinampParent, HWND hwndLibraryParent, HWND hwndParentControl, wchar_t* skinPath); 38 | EASY_API const wchar_t* GetFileName(const wchar_t* fileID); 39 | EASY_API HWND GetCustomDialog(HWND hwndWinampParent, HWND hwndLibraryParent, HWND hwndParentControl, wchar_t* skinPath); 40 | EASY_API int GetNodeNum(); 41 | EASY_API void SelectService(int multiID); 42 | EASY_API const wchar_t* GetCustomRefId(); 43 | EASY_API const wchar_t* GetUrlPrefix(); 44 | 45 | #ifdef __cplusplus 46 | } 47 | #endif 48 | -------------------------------------------------------------------------------- /WinampEasyService/ml_easysrv/easysrv_internal.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #define _DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR 4 | 5 | #include "easysrv.h" 6 | 7 | #include 8 | #include 9 | #include 10 | #include 11 | 12 | struct ItemInfo 13 | { 14 | const wchar_t* info; 15 | const wchar_t* plTitle; 16 | const wchar_t* filename; 17 | }; 18 | 19 | typedef void (*InitServiceFunc)(AddItemFunc addItemFunc, GetOptionFunc getOptionFunc, SetOptionFunc setOptionFunc, const wchar_t* pluginDir, UINT_PTR serviceID); 20 | typedef NodeDescriptor (*GetNodeDescFunc)(); 21 | typedef void (*InvokeServiceFunc)(HWND hwndWinampParent, HWND hwndLibraryParent, HWND hwndParentControl, wchar_t* skinPath); 22 | typedef const wchar_t* (*GetFileNameFunc)(const wchar_t* fileID); 23 | typedef HWND (*GetCustomDialogFunc)(HWND hwndWinampParent, HWND hwndLibraryParent, HWND hwndParentControl, wchar_t* skinPath); 24 | typedef int (*GetNodeNumFunc)(); 25 | typedef void (*SelectServiceFunc)(int multiNum); 26 | typedef const wchar_t* (*GetCustomRefIdFunc)(); 27 | typedef const wchar_t* (*GetUrlPrefixFunc)(); 28 | 29 | class EasyService 30 | { 31 | public: 32 | virtual void InitService(UINT_PTR serviceID) = 0; 33 | virtual NodeDescriptor& GetNodeDesc() = 0; 34 | virtual int GetNodeNum() = 0; 35 | virtual void InvokeService(HWND hwndWinampParent, HWND hwndLibraryParent, HWND hwndParentControl) = 0; 36 | virtual const wchar_t* GetFileName(const wchar_t* fileID) = 0; 37 | virtual HWND GetCustomDialog(HWND hwndWinampParent, HWND hwndLibraryParent, HWND hwndParentControl) = 0; 38 | virtual void DestroyingCustomDialog() = 0; 39 | virtual const wchar_t* GetCustomRefId() = 0; 40 | virtual const wchar_t* GetUrlPrefix() = 0; 41 | 42 | virtual bool IsValid() = 0; 43 | virtual const wchar_t* GetShortName() = 0; 44 | 45 | virtual ~EasyService() {} 46 | }; 47 | 48 | class DLLService : public EasyService 49 | { 50 | public: 51 | DLLService(const wchar_t* dllFullPath, const wchar_t* _shortName, int _multiID = 0); 52 | 53 | virtual void InitService(UINT_PTR serviceID); 54 | virtual NodeDescriptor& GetNodeDesc(); 55 | virtual int GetNodeNum(); 56 | virtual void InvokeService(HWND hwndWinampParent, HWND hwndLibraryParent, HWND hwndParentControl); 57 | virtual const wchar_t* GetFileName(const wchar_t* fileID); 58 | virtual HWND GetCustomDialog(HWND hwndWinampParent, HWND hwndLibraryParent, HWND hwndParentControl); 59 | virtual void DestroyingCustomDialog(); 60 | virtual const wchar_t* GetCustomRefId(); 61 | virtual const wchar_t* GetUrlPrefix(); 62 | 63 | virtual bool IsValid(); 64 | virtual const wchar_t* GetShortName(); 65 | 66 | private: 67 | InitServiceFunc _initService; 68 | GetNodeDescFunc _getNodeDesc; 69 | InvokeServiceFunc _invokeService; 70 | GetFileNameFunc _getFileName; 71 | GetCustomDialogFunc _getCustomDialog; 72 | GetNodeNumFunc _getNodeNum; 73 | SelectServiceFunc _selectService; 74 | GetCustomRefIdFunc _getCustomRefId; 75 | GetUrlPrefixFunc _getUrlPrefix; 76 | 77 | const wchar_t* shortName; 78 | NodeDescriptor nodeDescCache; 79 | const wchar_t* customRefIdCache; 80 | const wchar_t* urlPrefixCache; 81 | UINT_PTR _serviceID; 82 | bool isValid; 83 | int multiID; 84 | }; 85 | 86 | class EXEService : public EasyService 87 | { 88 | public: 89 | EXEService(const wchar_t* exeName, const wchar_t* _shortName, int _multiID = 0); 90 | 91 | virtual void InitService(UINT_PTR serviceID); 92 | virtual NodeDescriptor& GetNodeDesc(); 93 | virtual int GetNodeNum(); 94 | virtual void InvokeService(HWND hwndWinampParent, HWND hwndLibraryParent, HWND hwndParentControl); 95 | virtual const wchar_t* GetFileName(const wchar_t* fileID); 96 | virtual HWND GetCustomDialog(HWND hwndWinampParent, HWND hwndLibraryParent, HWND hwndParentControl); 97 | virtual void DestroyingCustomDialog(); 98 | virtual const wchar_t* GetCustomRefId(); 99 | virtual const wchar_t* GetUrlPrefix(); 100 | 101 | virtual bool IsValid(); 102 | virtual const wchar_t* GetShortName(); 103 | 104 | private: 105 | wchar_t* _exeName; 106 | const wchar_t* shortName; 107 | bool isValid; 108 | int multiID; 109 | 110 | NodeDescriptor nodeDescCache; 111 | const wchar_t* customRefIdCache; 112 | const wchar_t* urlPrefixCache; 113 | UINT_PTR _serviceID; 114 | 115 | DWORD customDialogPID = -1; 116 | }; 117 | 118 | // Interoperability between code in different files 119 | extern std::map serviceMap; 120 | extern std::map serviceHwndMap; 121 | extern std::map> serviceListItemMap; 122 | extern std::mutex serviceListItemMapMutex; 123 | 124 | extern wchar_t configFileName[MAX_PATH]; 125 | extern wchar_t* pluginDir; 126 | -------------------------------------------------------------------------------- /WinampEasyService/ml_easysrv/img_util.cpp: -------------------------------------------------------------------------------- 1 | #include "img_util.h" 2 | 3 | #include 4 | #include 5 | using namespace Gdiplus; 6 | 7 | #pragma comment(lib, "Gdiplus.lib") 8 | 9 | // Almost exact copy of https://stackoverflow.com/a/24645420 10 | 11 | int GetEncoderClsid(const WCHAR* format, CLSID* pClsid) 12 | { 13 | UINT num = 0; // number of image encoders 14 | UINT size = 0; // size of the image encoder array in bytes 15 | 16 | ImageCodecInfo* pImageCodecInfo = NULL; 17 | 18 | GetImageEncodersSize(&num, &size); 19 | if (size == 0) 20 | return -1; // Failure 21 | 22 | pImageCodecInfo = (ImageCodecInfo*)(malloc(size)); 23 | if (pImageCodecInfo == NULL) 24 | return -1; // Failure 25 | 26 | GetImageEncoders(num, size, pImageCodecInfo); 27 | 28 | for (UINT j = 0; j < num; ++j) 29 | { 30 | if (wcscmp(pImageCodecInfo[j].MimeType, format) == 0) 31 | { 32 | *pClsid = pImageCodecInfo[j].Clsid; 33 | free(pImageCodecInfo); 34 | return j; // Success 35 | } 36 | } 37 | free(pImageCodecInfo); 38 | return -1; // Failure 39 | } 40 | 41 | void WriteBitmap(HBITMAP bitmapData, const wchar_t* fileName) 42 | { 43 | GdiplusStartupInput gdiplusStartupInput; 44 | ULONG_PTR gdiplusToken; 45 | GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); 46 | 47 | Bitmap* image = new Bitmap(bitmapData, NULL); 48 | 49 | CLSID myClsId; 50 | int retVal = GetEncoderClsid(L"image/bmp", &myClsId); 51 | 52 | image->Save(fileName, &myClsId, NULL); 53 | delete image; 54 | 55 | GdiplusShutdown(gdiplusToken); 56 | } 57 | -------------------------------------------------------------------------------- /WinampEasyService/ml_easysrv/img_util.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | void WriteBitmap(HBITMAP bitmapData, const wchar_t* fileName); 6 | -------------------------------------------------------------------------------- /WinampEasyService/ml_easysrv/ml_easysrv.rc: -------------------------------------------------------------------------------- 1 | // Microsoft Visual C++ generated resource script. 2 | // 3 | #include "resource.h" 4 | 5 | #define APSTUDIO_READONLY_SYMBOLS 6 | ///////////////////////////////////////////////////////////////////////////// 7 | // 8 | // Generated from the TEXTINCLUDE 2 resource. 9 | // 10 | //#include "afxres.h" 11 | #include 12 | 13 | ///////////////////////////////////////////////////////////////////////////// 14 | #undef APSTUDIO_READONLY_SYMBOLS 15 | 16 | ///////////////////////////////////////////////////////////////////////////// 17 | // English (U.S.) resources 18 | 19 | #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) 20 | #ifdef _WIN32 21 | LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US 22 | #pragma code_page(1252) 23 | #endif //_WIN32 24 | 25 | #ifdef APSTUDIO_INVOKED 26 | ///////////////////////////////////////////////////////////////////////////// 27 | // 28 | // TEXTINCLUDE 29 | // 30 | 31 | 1 TEXTINCLUDE 32 | BEGIN 33 | "resource.h\0" 34 | END 35 | 36 | 2 TEXTINCLUDE 37 | BEGIN 38 | "#include ""afxres.h""\r\n" 39 | "\0" 40 | END 41 | 42 | 3 TEXTINCLUDE 43 | BEGIN 44 | "\r\n" 45 | "\0" 46 | END 47 | 48 | #endif // APSTUDIO_INVOKED 49 | 50 | 51 | ///////////////////////////////////////////////////////////////////////////// 52 | // 53 | // Dialogs 54 | // 55 | 56 | IDD_VIEW_EASYSRV DIALOGEX 0, 0, 215, 120 57 | STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_CLIPSIBLINGS | 58 | WS_CLIPCHILDREN 59 | FONT 8, "MS Shell Dlg", 400, 0, 0x1 60 | BEGIN 61 | CONTROL "",IDC_LIST,"SysListView32",LVS_REPORT | 62 | LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | WS_TABSTOP,0,0, 63 | 214,103 64 | CONTROL "Invoke plugin dialog",IDC_INVOKE,"Button",BS_OWNERDRAW | 65 | WS_TABSTOP,0,106,50,11 66 | END 67 | 68 | IDD_VIEW_EMPTY DIALOGEX 0, 0, 215, 120 69 | STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_CLIPSIBLINGS | 70 | WS_CLIPCHILDREN 71 | FONT 8, "MS Shell Dlg", 400, 0, 0x1 72 | BEGIN 73 | LTEXT "",IDC_EMPTY,0,0,1,1,SS_NOPREFIX 74 | END 75 | 76 | ///////////////////////////////////////////////////////////////////////////// 77 | // 78 | // DESIGNINFO 79 | // 80 | 81 | #ifdef APSTUDIO_INVOKED 82 | GUIDELINES DESIGNINFO 83 | BEGIN 84 | IDD_VIEW_EASYSRV, DIALOG 85 | BEGIN 86 | RIGHTMARGIN, 214 87 | END 88 | END 89 | #endif // APSTUDIO_INVOKED 90 | 91 | #endif // English (U.S.) resources 92 | ///////////////////////////////////////////////////////////////////////////// 93 | 94 | 95 | 96 | #ifndef APSTUDIO_INVOKED 97 | ///////////////////////////////////////////////////////////////////////////// 98 | // 99 | // Generated from the TEXTINCLUDE 3 resource. 100 | // 101 | 102 | 103 | ///////////////////////////////////////////////////////////////////////////// 104 | #endif // not APSTUDIO_INVOKED 105 | 106 | -------------------------------------------------------------------------------- /WinampEasyService/ml_easysrv/ml_easysrv.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | Source Files 20 | 21 | 22 | Source Files 23 | 24 | 25 | Source Files 26 | 27 | 28 | Source Files 29 | 30 | 31 | 32 | 33 | Header Files 34 | 35 | 36 | Header Files 37 | 38 | 39 | Header Files 40 | 41 | 42 | Header Files 43 | 44 | 45 | 46 | 47 | Resource Files 48 | 49 | 50 | -------------------------------------------------------------------------------- /WinampEasyService/ml_easysrv/resource.h: -------------------------------------------------------------------------------- 1 | //{{NO_DEPENDENCIES}} 2 | // Microsoft Visual C++ generated include file. 3 | // Used by ml_easysrv.rc 4 | // 5 | #define IDD_VIEW_EASYSRV 101 6 | #define IDC_LIST 1001 7 | #define IDC_INVOKE 1002 8 | #define IDD_VIEW_EMPTY 102 9 | #define IDC_EMPTY 1003 10 | 11 | // Next default values for new objects 12 | // 13 | #ifdef APSTUDIO_INVOKED 14 | #ifndef APSTUDIO_READONLY_SYMBOLS 15 | #define _APS_NEXT_RESOURCE_VALUE 103 16 | #define _APS_NEXT_COMMAND_VALUE 40001 17 | #define _APS_NEXT_CONTROL_VALUE 1004 18 | #define _APS_NEXT_SYMED_VALUE 101 19 | #endif 20 | #endif 21 | -------------------------------------------------------------------------------- /WinampEasyService/msrv_cdlexampledll/EasyService.cs: -------------------------------------------------------------------------------- 1 | namespace msrv 2 | { 3 | public class EasyService 4 | { 5 | const uint CAP_DEFAULT = 0; 6 | const uint CAP_CUSTOMDIALOG = 1; 7 | 8 | Dictionary functions = new Dictionary(); 9 | string myDirectory; 10 | uint myServiceID; 11 | 12 | public void InitService(Dictionary functionDict, string pluginDir, uint serviceID) 13 | { 14 | functions = functionDict; 15 | myDirectory = pluginDir; 16 | myServiceID = serviceID; 17 | } 18 | 19 | public Tuple GetNodeDesc() 20 | { 21 | return new Tuple("UI Examples", "Example UI CS DLL Plugin", "NONE", CAP_CUSTOMDIALOG); 22 | } 23 | 24 | public UserControl GetCustomDialog(IntPtr hwndWinampParent, IntPtr hwndLibraryParent, IntPtr hwndParentControl, string skinPath) 25 | { 26 | return new msrv_cdlexampledll.ExampleUserControl(); 27 | } 28 | } 29 | } -------------------------------------------------------------------------------- /WinampEasyService/msrv_cdlexampledll/ExampleUserControl.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace msrv_cdlexampledll 2 | { 3 | partial class ExampleUserControl 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Component Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | label1 = new Label(); 32 | button1 = new Button(); 33 | SuspendLayout(); 34 | // 35 | // label1 36 | // 37 | label1.AutoSize = true; 38 | label1.Font = new Font("Segoe UI", 18F, FontStyle.Regular, GraphicsUnit.Point); 39 | label1.Location = new Point(78, 44); 40 | label1.Name = "label1"; 41 | label1.Size = new Size(200, 32); 42 | label1.TabIndex = 0; 43 | label1.Text = "Hello from a DLL!"; 44 | // 45 | // button1 46 | // 47 | button1.Location = new Point(68, 100); 48 | button1.Name = "button1"; 49 | button1.Size = new Size(210, 36); 50 | button1.TabIndex = 1; 51 | button1.Text = "Button!"; 52 | button1.UseVisualStyleBackColor = true; 53 | button1.Click += button1_Click; 54 | // 55 | // ExampleUserControl 56 | // 57 | AutoScaleDimensions = new SizeF(7F, 15F); 58 | AutoScaleMode = AutoScaleMode.Font; 59 | Controls.Add(button1); 60 | Controls.Add(label1); 61 | Name = "ExampleUserControl"; 62 | Size = new Size(349, 187); 63 | Load += ExampleUserControl_Load; 64 | ResumeLayout(false); 65 | PerformLayout(); 66 | } 67 | 68 | #endregion 69 | 70 | private Label label1; 71 | private Button button1; 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /WinampEasyService/msrv_cdlexampledll/ExampleUserControl.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel; 4 | using System.Data; 5 | using System.Drawing; 6 | using System.Linq; 7 | using System.Text; 8 | using System.Threading.Tasks; 9 | using System.Windows.Forms; 10 | 11 | namespace msrv_cdlexampledll 12 | { 13 | public partial class ExampleUserControl : UserControl 14 | { 15 | public ExampleUserControl() 16 | { 17 | InitializeComponent(); 18 | } 19 | 20 | private void ExampleUserControl_Load(object sender, EventArgs e) 21 | { 22 | 23 | } 24 | 25 | private void button1_Click(object sender, EventArgs e) 26 | { 27 | MessageBox.Show("Button Pressed!", "Example UI CS DLL Plugin"); 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /WinampEasyService/msrv_cdlexampledll/msrv_cdlexampledll.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | net6.0-windows 5 | enable 6 | true 7 | enable 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /WinampEasyService/msrv_exampledll/EasyService.cs: -------------------------------------------------------------------------------- 1 | namespace msrv 2 | { 3 | public class EasyService 4 | { 5 | const uint CAP_DEFAULT = 0; 6 | const uint CAP_CUSTOMDIALOG = 1; 7 | 8 | Dictionary functions = new Dictionary(); 9 | string myDirectory; 10 | uint myServiceID; 11 | 12 | public void InitService(Dictionary functionDict, string pluginDir, uint serviceID) 13 | { 14 | functions = functionDict; 15 | myDirectory = pluginDir; 16 | myServiceID = serviceID; 17 | } 18 | 19 | public Tuple GetNodeDesc() 20 | { 21 | return new Tuple("Examples", "Example CS DLL Plugin", "Title\tType of item", CAP_DEFAULT); 22 | } 23 | 24 | public List> InvokeService(IntPtr hwndWinampParent, IntPtr hwndLibraryParent, IntPtr hwndParentControl, string skinPath) 25 | { 26 | List> retItems = new List>(); 27 | 28 | retItems.Add(new List { "Example Title\tHello from CS DLL - This is a direct filename", "Example Playlist Title", "e:\\example.mp3" }); 29 | retItems.Add(new List { "Example Title 2\tHello from CS DLL - This will use a reference", "Example Playlist Title 2", "ref_examplefile" }); 30 | 31 | return retItems; 32 | } 33 | 34 | public string GetFileName(string fileID) 35 | { 36 | if (fileID == "ref_examplefile") 37 | return "e:\\example.mp3"; 38 | else 39 | return "This really shouldn't happen..."; 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /WinampEasyService/msrv_exampledll/msrv_exampledll.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net6.0 5 | enable 6 | enable 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /WinampEasyService/msrv_examplemulti/EasyService.cs: -------------------------------------------------------------------------------- 1 | namespace msrv 2 | { 3 | public class EasyService 4 | { 5 | const uint CAP_DEFAULT = 0; 6 | const uint CAP_CUSTOMDIALOG = 1; 7 | const uint CAP_MULTISERVICE = 2; 8 | 9 | Dictionary functions = new Dictionary(); 10 | string myDirectory; 11 | uint myServiceID; 12 | int currentMultiID = 0; 13 | 14 | public void InitService(Dictionary functionDict, string pluginDir, uint serviceID) 15 | { 16 | functions = functionDict; 17 | myDirectory = pluginDir; 18 | myServiceID = serviceID; 19 | } 20 | 21 | public int GetNodeNum() 22 | { 23 | return 2; 24 | } 25 | 26 | public void SelectService(int multiID) 27 | { 28 | currentMultiID = multiID; 29 | } 30 | 31 | public Tuple GetNodeDesc() 32 | { 33 | switch (currentMultiID) 34 | { 35 | default: 36 | case 0: 37 | return new Tuple("Examples", "Example CS DLL Multi Plugin 1", "Title\tType of item", CAP_MULTISERVICE); 38 | case 1: 39 | return new Tuple("Examples", "Example CS DLL Multi Plugin 2", "Title\tType of item", CAP_MULTISERVICE); 40 | } 41 | } 42 | 43 | public List> InvokeService(IntPtr hwndWinampParent, IntPtr hwndLibraryParent, IntPtr hwndParentControl, string skinPath) 44 | { 45 | List> retItems = new List>(); 46 | 47 | switch (currentMultiID) 48 | { 49 | case 0: 50 | retItems.Add(new List { "Example Title\tHello from CS DLL Subservice 1!", "Example Playlist Title", "e:\\example.mp3" }); 51 | retItems.Add(new List { "Example Title 2\ttHello from CS DLL Subservice 1!", "Example Playlist Title 2", "e:\\example.mp3" }); 52 | break; 53 | case 1: 54 | retItems.Add(new List { "Example Title\tHello from CS DLL Subservice 2!", "Example Playlist Title", "e:\\example.mp3" }); 55 | retItems.Add(new List { "Example Title 2\ttHello from CS DLL Subservice 2!", "Example Playlist Title 2", "e:\\example.mp3" }); 56 | break; 57 | } 58 | 59 | return retItems; 60 | } 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /WinampEasyService/msrv_examplemulti/msrv_examplemulti.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net6.0 5 | enable 6 | enable 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /WinampEasyService/srv_cdlexampledll/ml_easysrv.rc: -------------------------------------------------------------------------------- 1 | // Microsoft Visual C++ generated resource script. 2 | // 3 | #include "resource.h" 4 | 5 | #define APSTUDIO_READONLY_SYMBOLS 6 | ///////////////////////////////////////////////////////////////////////////// 7 | // 8 | // Generated from the TEXTINCLUDE 2 resource. 9 | // 10 | //#include "afxres.h" 11 | #include 12 | 13 | ///////////////////////////////////////////////////////////////////////////// 14 | #undef APSTUDIO_READONLY_SYMBOLS 15 | 16 | ///////////////////////////////////////////////////////////////////////////// 17 | // English (U.S.) resources 18 | 19 | #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) 20 | #ifdef _WIN32 21 | LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US 22 | #pragma code_page(1252) 23 | #endif //_WIN32 24 | 25 | #ifdef APSTUDIO_INVOKED 26 | ///////////////////////////////////////////////////////////////////////////// 27 | // 28 | // TEXTINCLUDE 29 | // 30 | 31 | 1 TEXTINCLUDE 32 | BEGIN 33 | "resource.h\0" 34 | END 35 | 36 | 2 TEXTINCLUDE 37 | BEGIN 38 | "#include ""afxres.h""\r\n" 39 | "\0" 40 | END 41 | 42 | 3 TEXTINCLUDE 43 | BEGIN 44 | "\r\n" 45 | "\0" 46 | END 47 | 48 | #endif // APSTUDIO_INVOKED 49 | 50 | 51 | ///////////////////////////////////////////////////////////////////////////// 52 | // 53 | // Dialog 54 | // 55 | 56 | IDD_VIEW_CUSTOM DIALOGEX 0, 0, 215, 120 57 | STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_CLIPSIBLINGS | 58 | WS_CLIPCHILDREN 59 | FONT 8, "MS Shell Dlg", 400, 0, 0x1 60 | BEGIN 61 | CONTROL "My Button!",IDC_MYBUTTON,"Button",BS_OWNERDRAW | 62 | WS_TABSTOP,0,0,50,11 63 | END 64 | 65 | 66 | ///////////////////////////////////////////////////////////////////////////// 67 | // 68 | // DESIGNINFO 69 | // 70 | 71 | #ifdef APSTUDIO_INVOKED 72 | GUIDELINES DESIGNINFO 73 | BEGIN 74 | IDD_VIEW_CUSTOM, DIALOG 75 | BEGIN 76 | RIGHTMARGIN, 214 77 | END 78 | END 79 | #endif // APSTUDIO_INVOKED 80 | 81 | #endif // English (U.S.) resources 82 | ///////////////////////////////////////////////////////////////////////////// 83 | 84 | 85 | 86 | #ifndef APSTUDIO_INVOKED 87 | ///////////////////////////////////////////////////////////////////////////// 88 | // 89 | // Generated from the TEXTINCLUDE 3 resource. 90 | // 91 | 92 | 93 | ///////////////////////////////////////////////////////////////////////////// 94 | #endif // not APSTUDIO_INVOKED 95 | 96 | -------------------------------------------------------------------------------- /WinampEasyService/srv_cdlexampledll/resource.h: -------------------------------------------------------------------------------- 1 | //{{NO_DEPENDENCIES}} 2 | // Microsoft Visual C++ generated include file. 3 | // Used by ml_easysrv.rc 4 | // 5 | #define IDD_VIEW_CUSTOM 101 6 | #define IDC_MYBUTTON 1001 7 | 8 | // Next default values for new objects 9 | // 10 | #ifdef APSTUDIO_INVOKED 11 | #ifndef APSTUDIO_READONLY_SYMBOLS 12 | #define _APS_NEXT_RESOURCE_VALUE 102 13 | #define _APS_NEXT_COMMAND_VALUE 40001 14 | #define _APS_NEXT_CONTROL_VALUE 1003 15 | #define _APS_NEXT_SYMED_VALUE 101 16 | #endif 17 | #endif 18 | -------------------------------------------------------------------------------- /WinampEasyService/srv_cdlexampledll/srv_cdlexampledll.cpp: -------------------------------------------------------------------------------- 1 | #include "..\ml_easysrv\easysrv.h" 2 | 3 | #include 4 | #include "Winamp/wa_ipc.h" 5 | #include "gen_ml/ml.h" 6 | 7 | #include 8 | #include "shlobj.h" 9 | #include "gen_ml/ml_ipc_0313.h" 10 | #include "gen_ml/childwnd.h" 11 | #include "Winamp/wa_dlg.h" 12 | #include "resource.h" 13 | 14 | #include 15 | 16 | #include "resource.h" 17 | 18 | GetOptionFunc GetOption; 19 | SetOptionFunc SetOption; 20 | const wchar_t* myDirectory; 21 | UINT_PTR myServiceID; 22 | 23 | HINSTANCE myself = NULL; 24 | HWND hwndWinampParent = NULL; 25 | HWND hwndLibraryParent = NULL; 26 | 27 | BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) 28 | { 29 | myself = (HINSTANCE)hModule; 30 | return TRUE; 31 | } 32 | 33 | void InitService(AddItemFunc addItemFunc, GetOptionFunc getOptionFunc, SetOptionFunc setOptionFunc, const wchar_t* pluginDir, UINT_PTR serviceID) 34 | { 35 | GetOption = getOptionFunc; 36 | SetOption = setOptionFunc; 37 | myDirectory = pluginDir; 38 | myServiceID = serviceID; 39 | } 40 | 41 | NodeDescriptor GetNodeDesc() 42 | { 43 | NodeDescriptor desc = { L"UI Examples", L"Example UI CPP Plugin", NULL, CAP_CUSTOMDIALOG }; 44 | return desc; 45 | } 46 | 47 | typedef int (*HookDialogFunc)(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); 48 | static HookDialogFunc ml_hook_dialog_msg = 0; 49 | 50 | static BOOL view_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam) 51 | { 52 | /* gen_ml has some helper functions to deal with skinned dialogs, 53 | we're going to grab their function pointers. 54 | for definition of magic numbers, see gen_ml/ml.h */ 55 | if (!ml_hook_dialog_msg) 56 | { 57 | /* skinning helper functions */ 58 | ml_hook_dialog_msg = (HookDialogFunc)SendMessage(hwndLibraryParent, WM_ML_IPC, (WPARAM)2, ML_IPC_SKIN_WADLG_GETFUNC); 59 | } 60 | 61 | /* skin dialog */ 62 | MLSKINWINDOW sw; 63 | sw.skinType = SKINNEDWND_TYPE_DIALOG; 64 | sw.style = SWS_USESKINCOLORS | SWS_USESKINCURSORS | SWS_USESKINFONT; 65 | sw.hwndToSkin = hwnd; 66 | MLSkinWindow(hwndLibraryParent, &sw); 67 | 68 | /* skin button */ 69 | sw.skinType = SKINNEDWND_TYPE_BUTTON; 70 | sw.style = SWS_USESKINCOLORS | SWS_USESKINCURSORS | SWS_USESKINFONT; 71 | sw.hwndToSkin = GetDlgItem(hwnd, IDC_MYBUTTON); 72 | MLSkinWindow(hwndLibraryParent, &sw); 73 | 74 | return FALSE; 75 | } 76 | 77 | static BOOL view_OnSize(HWND hwnd, UINT state, int cx, int cy) 78 | { 79 | if (state != SIZE_MINIMIZED) 80 | { 81 | HWND buttonWnd = GetDlgItem(hwnd, IDC_MYBUTTON); 82 | 83 | MoveWindow(buttonWnd, 1, 1, cx - 2, cy - 2, TRUE); 84 | } 85 | 86 | return FALSE; 87 | } 88 | 89 | static BOOL view_OnDestroy(HWND hwnd) 90 | { 91 | return FALSE; 92 | } 93 | 94 | static BOOL view_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) 95 | { 96 | switch (id) { 97 | case IDC_MYBUTTON: 98 | { 99 | MessageBox(0, L"Button pressed!", L"", MB_OK); 100 | } 101 | break; 102 | } 103 | return 0; 104 | } 105 | 106 | LRESULT CALLBACK customDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) 107 | { 108 | /* first, ask the dialog skinning system if it wants to do anything with the message 109 | the function pointer gets set during WM_INITDIALOG so might be NULL for the first few messages 110 | in theory we could grab it right here if we don't have it, but it's not necessary 111 | and I wanted to put all the function pointer gathering code in the same place for this example */ 112 | if (ml_hook_dialog_msg) 113 | { 114 | INT_PTR a = ml_hook_dialog_msg(hwndDlg, uMsg, wParam, lParam); 115 | if (a) 116 | return a; 117 | } 118 | 119 | switch (uMsg) { 120 | HANDLE_MSG(hwndDlg, WM_INITDIALOG, view_OnInitDialog); 121 | HANDLE_MSG(hwndDlg, WM_COMMAND, view_OnCommand); 122 | HANDLE_MSG(hwndDlg, WM_SIZE, view_OnSize); 123 | return 0; 124 | HANDLE_MSG(hwndDlg, WM_DESTROY, view_OnDestroy); 125 | 126 | } 127 | return FALSE; 128 | } 129 | 130 | HWND GetCustomDialog(HWND _hwndWinampParent, HWND _hwndLibraryParent, HWND hwndParentControl, wchar_t* skinPath) 131 | { 132 | hwndWinampParent = _hwndWinampParent; 133 | hwndLibraryParent = _hwndLibraryParent; 134 | 135 | HWND dialogWnd = CreateDialog(myself, MAKEINTRESOURCE(IDD_VIEW_CUSTOM), hwndParentControl, (DLGPROC)customDialogProc); 136 | return dialogWnd; 137 | } 138 | -------------------------------------------------------------------------------- /WinampEasyService/srv_cdlexampledll/srv_cdlexampledll.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | Source Files 20 | 21 | 22 | 23 | 24 | Resource Files 25 | 26 | 27 | 28 | 29 | Header Files 30 | 31 | 32 | -------------------------------------------------------------------------------- /WinampEasyService/srv_exampledll/srv_exampledll.cpp: -------------------------------------------------------------------------------- 1 | #include "..\ml_easysrv\easysrv.h" 2 | #include 3 | 4 | AddItemFunc AddItem; 5 | GetOptionFunc GetOption; 6 | SetOptionFunc SetOption; 7 | const wchar_t* myDirectory; 8 | UINT_PTR myServiceID; 9 | 10 | void InitService(AddItemFunc addItemFunc, GetOptionFunc getOptionFunc, SetOptionFunc setOptionFunc, const wchar_t* pluginDir, UINT_PTR serviceID) 11 | { 12 | AddItem = addItemFunc; 13 | GetOption = getOptionFunc; 14 | SetOption = setOptionFunc; 15 | myDirectory = pluginDir; 16 | myServiceID = serviceID; 17 | } 18 | 19 | NodeDescriptor GetNodeDesc() 20 | { 21 | NodeDescriptor desc = { L"Examples", L"Example CPP Plugin", L"Title\tType of item", CAP_DEFAULT }; 22 | return desc; 23 | } 24 | 25 | void InvokeService(HWND hwndWinampParent, HWND hwndLibraryParent, HWND hwndParentControl, wchar_t* skinPath) 26 | { 27 | AddItem(L"Example Title\tThis is a direct filename", L"Example PLaylist Title", L"e:\\example.mp3", myServiceID); 28 | AddItem(L"Example Title 2\tThis will use a reference", L"Example PLaylist Title 2", L"ref_examplefile", myServiceID); 29 | } 30 | 31 | const wchar_t* GetFileName(const wchar_t* fileID) 32 | { 33 | if (!wcscmp(fileID, L"ref_examplefile")) { 34 | return L"e:\\example.mp3"; 35 | } 36 | else { 37 | return L"This really shouldn't happen..."; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /WinampEasyService/srv_exampledll/srv_exampledll.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | Source Files 20 | 21 | 22 | 23 | 24 | Header Files 25 | 26 | 27 | -------------------------------------------------------------------------------- /WinampEasyService/srv_examplemulti/srv_examplemulti.cpp: -------------------------------------------------------------------------------- 1 | #include "..\ml_easysrv\easysrv.h" 2 | #include 3 | 4 | AddItemFunc AddItem; 5 | GetOptionFunc GetOption; 6 | SetOptionFunc SetOption; 7 | const wchar_t* myDirectory; 8 | 9 | UINT_PTR serviceIDs[3]; 10 | int currentMultiID = 0; 11 | 12 | void InitService(AddItemFunc addItemFunc, GetOptionFunc getOptionFunc, SetOptionFunc setOptionFunc, const wchar_t* pluginDir, UINT_PTR serviceID) 13 | { 14 | AddItem = addItemFunc; 15 | GetOption = getOptionFunc; 16 | SetOption = setOptionFunc; 17 | myDirectory = pluginDir; 18 | serviceIDs[currentMultiID] = serviceID; 19 | } 20 | 21 | int GetNodeNum() 22 | { 23 | return 3; 24 | } 25 | 26 | void SelectService(int multiID) 27 | { 28 | currentMultiID = multiID; 29 | } 30 | 31 | NodeDescriptor GetNodeDesc() 32 | { 33 | NodeDescriptor desc; 34 | 35 | switch (currentMultiID) 36 | { 37 | default: 38 | case 0: desc = { L"Examples", L"Example CPP Multi Plugin 1", L"Title\tType of item", CAP_MULTISERVICE }; 39 | break; 40 | case 1: desc = { L"Examples", L"Example CPP Multi Plugin 2", L"Title\tType of item", CAP_MULTISERVICE }; 41 | break; 42 | case 2: desc = { L"Examples", L"Example CPP Multi Plugin 3", L"Title\tType of item", CAP_MULTISERVICE }; 43 | break; 44 | } 45 | 46 | return desc; 47 | } 48 | 49 | void InvokeService(HWND hwndWinampParent, HWND hwndLibraryParent, HWND hwndParentControl, wchar_t* skinPath) 50 | { 51 | switch (currentMultiID) 52 | { 53 | default: 54 | case 0: AddItem(L"Example Title\tHello from Subservice 1!", L"Example PLaylist Title", L"e:\\example.mp3", serviceIDs[currentMultiID]); 55 | AddItem(L"Example Title 2\tHello from Subservice 1!", L"Example PLaylist Title 2", L"e:\\example.mp3", serviceIDs[currentMultiID]); 56 | break; 57 | case 1: AddItem(L"Example Title\tHello from Subservice 2!", L"Example PLaylist Title", L"e:\\example.mp3", serviceIDs[currentMultiID]); 58 | AddItem(L"Example Title 2\tHello from Subservice 2!", L"Example PLaylist Title 2", L"e:\\example.mp3", serviceIDs[currentMultiID]); 59 | break; 60 | case 2: AddItem(L"Example Title\tHello from Subservice 3!", L"Example PLaylist Title", L"e:\\example.mp3", serviceIDs[currentMultiID]); 61 | AddItem(L"Example Title 2\tHello from Subservice 3!", L"Example PLaylist Title 2", L"e:\\example.mp3", serviceIDs[currentMultiID]); 62 | break; 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /WinampEasyService/srv_examplemulti/srv_examplemulti.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | Source Files 20 | 21 | 22 | -------------------------------------------------------------------------------- /WinampEasyService/srv_refidexample/srv_refidexample.cpp: -------------------------------------------------------------------------------- 1 | #include "..\ml_easysrv\easysrv.h" 2 | #include 3 | 4 | AddItemFunc AddItem; 5 | GetOptionFunc GetOption; 6 | SetOptionFunc SetOption; 7 | const wchar_t* myDirectory; 8 | UINT_PTR myServiceID; 9 | 10 | void InitService(AddItemFunc addItemFunc, GetOptionFunc getOptionFunc, SetOptionFunc setOptionFunc, const wchar_t* pluginDir, UINT_PTR serviceID) 11 | { 12 | AddItem = addItemFunc; 13 | GetOption = getOptionFunc; 14 | SetOption = setOptionFunc; 15 | myDirectory = pluginDir; 16 | myServiceID = serviceID; 17 | } 18 | 19 | NodeDescriptor GetNodeDesc() 20 | { 21 | NodeDescriptor desc = { L"Examples", L"Custom RefId Example", L"Title\tType of item", CAP_CUSTOMREFID }; 22 | return desc; 23 | } 24 | 25 | const wchar_t* GetCustomRefId() 26 | { 27 | return L"refidexample"; 28 | } 29 | 30 | void InvokeService(HWND hwndWinampParent, HWND hwndLibraryParent, HWND hwndParentControl, wchar_t* skinPath) 31 | { 32 | AddItem(L"Example Title\tThis is a direct filename", L"Example PLaylist Title", L"e:\\example.mp3", myServiceID); 33 | AddItem(L"Example Title 2\tThis will use a default reference", L"Example PLaylist Title 2", L"ref_examplefile", myServiceID); 34 | AddItem(L"Example Title 3\tThis will use a custom reference", L"Example PLaylist Title 3", L"refidexample_ref_examplefile.ref", myServiceID); 35 | } 36 | 37 | const wchar_t* GetFileName(const wchar_t* fileID) 38 | { 39 | if (!wcscmp(fileID, L"ref_examplefile")) { 40 | return L"e:\\example.mp3"; 41 | } 42 | else { 43 | return L"This really shouldn't happen..."; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /WinampEasyService/srv_refidexample/srv_refidexample.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | Source Files 20 | 21 | 22 | -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luthor112/WinampEasyService/a1f8a92cd3a83c0d14d205b8c0ab6e07e402d924/screenshot.png --------------------------------------------------------------------------------