Giter Club home page Giter Club logo

winampnowplayingtofile's Introduction

Winamp Now Playing to File

Build status Test status Coverage status

This is a plugin for Winamp that saves text information and album art for the currently playing song to files on your computer. You can customize where the files are saved, as well as the format of the text.

Problem

I was broadcasting video game streams on my Twitch.tv channel, in which I also play music in the background. I wanted viewers to be able to tell which song I was playing at any given time in case they liked it and wanted to find it for themselves. I started using the Advanced mIRC Integration Plug-In (AMIP), which is generally used for showing your Now Playing status in IRC using mIRC. It also lets you save the status to a text file, which I added as a Text Source in OBS.

Unfortunately, AMIP only supports encoding the text using ANSI, OEM (DOS), FIDO, or KOI8 character encodings, none of which are UTF-8, which OBS requires. For example, Jävla Sladdar was being shown in the video stream as J�vla Sladdar, because even though AMIP was saving ä using ANSI (0xe4), OBS was decoding the file with UTF-8, so the character was not properly decoded. In UTF-8, ä is supposed to be encoded as 0xc3 0xa4 because 0xe4 is greater than 0x7f (i.e. 0x34 requires more than 7 bits to represent), so it spills over into a second code unit (it's a multibyte character).

Solution

I wrote my own Winamp plugin to save information about the currently playing song to a UTF-8 text file, and the song's album art to an image file.

Installation

  1. Ensure you have Microsoft .NET Framework 4.7.2 Runtime or later installed. This is included in Windows 10 version 1803 and later.
  2. Exit Winamp if it's already running.
  3. Download WinampNowPlayingToFile.zip from the latest release (not the source code ZIP file).
  4. Extract the archive to your Winamp installation directory.
    📁 C:\Program Files (x86)\Winamp
    ├── 📁 plugins
    │   └── 📄 gen_WinampNowPlayingToFile.dll
    ├── 📄 WinampNowPlayingToFile.dll
    ├── 📄 Daniel15.Sharpamp.dll
    ├── 📄 mustache-sharp.dll
    └── 📄 taglib-sharp.dll
    

Configuration

Configuration of this plugin is performed in Winamp.

  1. Start Winamp.
  2. Go to Options › Preferences › Plug-ins › General Purpose.
  3. Configure the Now Playing to File plugin.

configuration

Changes are saved to the registry in HKCU\Software\WinampNowPlayingToFile.

Text

By default, this plugin saves textual information about the currently playing song to winamp_now_playing.txt in your user's temporary directory (%TEMP%). The file contains the track's Artist, Title, and Album (if applicable), for example

U2 – Exit – The Joshua Tree

To customize the text file location and contents, go to the plugin preferences in Winamp.

  1. You can change the file contents by editing the Text template and inserting placeholders inside {{ }}, either with the Insert button or by typing them manually. See Placeholder fields below for all the fields you can use in a placeholder. For example, a simple template that could render the above example text is
    {{Artist}}{{Title}}{{Album}}
  2. As you fill in the template, the Text preview will be updated to show how the currently playing song would be rendered, or an example song if no song is available.
  3. You can change where the file is written in your filesystem by selecting a different path for Save text as.

When Winamp is not playing a song, this text file will be truncated to 0 bytes.

Placeholder fields

Placeholder values that are missing or empty will be rendered as the empty string.

Field name Type Examples Notes
Album string The Joshua Tree
AlbumArtist string U2
Artist string U2
Bitrate int 320
BPM int 123 Beats per minute
Category string Rock
Comment string
Composer string U2
Conductor string
Director string Most commonly used for video files
Disc int 1 If it can't be parsed as an int (like 1/2) it will be a string
Elapsed TimeSpan 00:00:28.5080000 Updated 1hz, millisecond resolution. See formatting for m:ss and other formats.
Family string MPEG Layer 3 Audio File Codec or container format
FileBasename string Exit.mp3 Filename without path
FileBasenameWithoutExtension string Exit Filename without path or extension
Filename string C:\Users\Ben\Music\Exit.mp3 Absolute path to file, or a stream URL
Gain string +0.92 dB
Genre string Rock
ISRC string GBUM70709782 12-character International Standard Recording Code for the track
Key string E minor
Length TimeSpan 00:04:11.4220000 See formatting for m:ss and other formats
Lossless bool false true for lossless compression, false for lossy
Lyricist string Bono
Media string LP
Producer string Brian Eno, Daniel Lanois
Publisher string Island Records
Rating int 2 In the range [1, 5]
ReplayGain_Album_Gain string -3.03 dB
ReplayGain_Album_Peak double 1.022630334
ReplayGain_Track_Gain string -0.77 dB
ReplayGain_Track_Peak double 1.006227493
Stereo bool true true for stereo, false for mono
Subtitle string
Title string Exit
Tool string iTunes 10.5.1 From the ENCODEDBY ID3v2 tag
Track int 1 If it can't be parsed as an int (like 1/5) it will be a string
Type string audio audio or video
VBR bool false true for variable bitrate, false for constant bitrate
Year int 1987 If it can't be parsed as an int (like 1987-01-01) it will be a string

Any other values you use in a placeholder will be requested directly from Winamp as file metadata, and the response will be output as-is. If you can find other fields that Winamp handles for audio files, please file an enhancement issue so it can be added to this program and documentation.

Helpers

Template logic can be added using Handlebars expressions, including the built-in helpers like {{#if expr}}, {{#elif expr}}, {{#else}}, and {{/if}}. To output a line break (CRLF), use {{#newline}}.

For example, you can conditionally include artist and album only if those fields exist on your song and are nonempty.

{{#if Artist}}{{Artist}}{{/if}}{{Title}}{{#if Album}}{{Album}}{{/if}}

You can also render strings depending on a boolean value.

{{#if Lossless}}lossless{{#else}}lossy{{/if}}

Formatting

Metadata values may optionally be formatted using the .NET string formatting syntax.

Topic Example Input Output Notes
Timespan
{{Length:m\:ss}}
4:33 See standard and custom TimeSpan format strings
Timespan
{{Length:hh\:mm\:ss}}
00:04:33 See standard and custom TimeSpan format strings
Digit grouping
{{Bitrate:N0}}kbps
1,226kbps See standard numeric format strings
Floating point precision
{{ReplayGain_Album_Peak:F6}}
0.986115 See standard numeric format strings
Zero padding
#{{Track:00}}
#06 See custom numeric format strings
Space padding
{{Track,3}}.
  1. See spacing

Album art

This plugin also copies the currently playing song's album art from the song metadata or from an image in the song's folder. By default, it is copied to %TEMP%\winamp_now_playing.png.

Note that the file extension is always the one you specify in the preferences, even if the album art has a different file type, to make it easier to refer to this file from other programs like OBS without having to deal with multiple possible file extensions. This means that this file may be created as a JPEG with the .png file extension, for example. Most programs, including OBS, can handle this case just fine, but the mismatch is a little silly. Feel free to change the file extension using the preferences.

You can customize the album art filename and path using Save album art as in the same plugin configuration dialog as the text file above.

Fallback artwork

When there is no album art, the copied files will be deleted. However, this may be undesirable because it can leave dependent interfaces in a weird-looking state (like an OBS layout with a big transparent gap where the album art would normally be), and it will also trigger the Missing Files warning dialog box each time you launch OBS.

To resolve this, you can specify custom image files that will be copied instead when there is no album art. Here are some sample black and transparent images to get started, or you can use your own. There are no requirements for the format or dimensions of these images besides what your downstream consumer like OBS accepts.

Missing artwork

When Winamp is playing a song with no album art, the image file will be deleted. To override this, save your desired image file as emptyAlbumArt.png in the Winamp installation directory.

Playback stopped

When Winamp is paused, stopped, or closed, the image file will be deleted. To override this, save your desired image file as stoppedAlbumArt.png in the Winamp installation directory.

Integration

OBS

  1. Start playing a song in Winamp.
  2. Create a new Text (GDI+) source in your OBS scene.
  3. In the Properties for your text source, enable Read From File.
  4. Select the text file created by this plugin (by default, %TEMP%\winamp_now_playing.txt).
  5. Create a new Image source in your scene.
  6. In the Properties for your image source, select the image file created by this plugin (by default, %TEMP%\winamp_now_playing.png).

Uninstallation

  1. In Winamp's Preferences, go to Plug-ins › General Purpose.
  2. Select the Now Playing to File plugin, then click the Uninstall Selected Plug-In button.
  3. Exit Winamp.
  4. Delete all the files you extracted to the Winamp installation directory when installing this plugin.
    📁 C:\Program Files (x86)\Winamp
    ├── 📁 plugins
    │   └── 📄 gen_WinampNowPlayingToFile.dll
    ├── 📄 WinampNowPlayingToFile.dll
    ├── 📄 Daniel15.Sharpamp.dll
    ├── 📄 mustache-sharp.dll
    └── 📄 taglib-sharp.dll
    
  5. Delete the song information files (by default, winamp_now_playing.txt and winamp_now_playing.png in %TEMP%).
  6. Delete the plugin settings registry key HKCU\Software\WinampNowPlayingToFile.

winampnowplayingtofile's People

Contributors

aldaviva avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

Forkers

execthts

winampnowplayingtofile's Issues

AIMP support?

Since AIMP pretty much can run Winamp plugins, is there going to be an easily installable AIMP version ("easily installable" as in "using the "install" button inside the Plugins window)?

Get tests and maybe coverage working in CI

The test project was failing to compile when I was working on #6 due to the following error, so I skipped that project by explicitly building the C++ plugin project instead of the entire solution.

3>D:\a\WinampNowPlayingToFile\WinampNowPlayingToFile\Test\Test.csproj(155,5): error : This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is ..\packages\xunit.core.2.4.1\build\xunit.core.props.

I have since updated the Test project to xUnit 2.4.2, the latest stable version available, and tests do compile and pass on my development computer.

It may be worth trying once again to get the tests running in CI, and maybe add coverage reporting too.

Plugin doesn't delete cover file in custom folder

The plugin doesn't delete the cover art file when playback is stopped, and doesn't replace it with the mentioned square if no cover art is found.

I changed the files in the settings and tested the plugin. While everything else works, the placeholder feature and the removal from the files after playback doesn't work.

Add current time to the variables

Hey!

Amazing plugin, thanks for this! I often play mixes and it would be incredibly useful to be able to show the current time in the given track. Could this be added?

Plugin didnt write anything at file except text i write myself in settings

Hello,
I want to use this plugin for my stream, but i stuck at text part.
I installed the plugin, it make text file at folder i choice but dont write anything in file.
I tryed to change template and it write only thing i write in settings by myself like "-" between artist and song name.
Can you give me any tips where is a problem?
I use winamp 2.95 and windows 7 x64
1
2
3

Album Art displaying back box after updating

When I try to update album art for the now playing PNG to load them instead of showing the art it just displays a black box and i update the art in Winamp. how do i fix this so it will show all my album art after i update it?

Unhandled exception, Album Art

Plugin has problems when playing songs from SOME Web Stations online (not all).
Errors will popup infinitely from the station while it's playing.

`Unhandled exception while updating song info on song change:
System.ArgumentException: URI formats are not supported.

at TagLib.File.Create(IFileAbstraction abstraction, String mimetype, ReadStyle propertiesStyle)

at WinampNowPlayingToFile.Business.NowPlayingToFileManager.extractAlbumArt()

at WinampNowPlayingToFile.Business.NowPlayingToFileManager.update()`

Fix CI build by committing difficult-to-install dependencies into the repository

I don't like checking dependencies into repos, but I think it's the best option here because

  • Daniel15.Sharpamp.dll does not exist in NuGet
  • It also does not exist in the releases or repo files of Daniel15/Sharpamp
  • It's not hosted on any web server as far as I can tell
  • We can't run the installer on the build machine because it crashes on a policy lookup in the registry if .NET Framework 2.0 is not installed, and it's definitely not installed on the GitHub Windows Server 2022 runners. Faking out the registry seems very difficult because it uses the found frameworks to install DLLs into the GAC. There isn't even a way to click the Ignore button on this error, because Inno Setup's /SUPPRESSMSGBOXES flag always picks the Abort option.

Uncaught exception while manually typing placeholder names

Steps

  1. Use the insertion menu to insert the If pattern into the template text.
  2. Replace the Artist variable with a different variable, like Year. Do this by manually typing Year one character at a time.

Expected

The live preview should just use some dummy value such as Y or null when rendering that placeholder, or maybe replace the rendered text with a helpful message like invalid template. This can apply to both the preview as well as the contents of the text file.

Actual

A KeyNotFoundException is actually thrown:

System.Collections.Generic.KeyNotFoundException: The key Y could not be found.
   at Mustache.Scope.Find(String name, Boolean isExtension)
   at Mustache.PlaceholderArgument.GetValue(Scope keyScope, Scope contextScope)
   at Mustache.ArgumentCollection.GetArguments(Scope keyScope, Scope contextScope)
   at Mustache.CompoundGenerator.Mustache.IGenerator.GetText(TextWriter writer, Scope keyScope, Scope contextScope, Action`1 postProcessor)
   at Mustache.CompoundGenerator.Mustache.IGenerator.GetText(TextWriter writer, Scope keyScope, Scope contextScope, Action`1 postProcessor)
   at Mustache.Generator.render(IFormatProvider provider, Object source)
   at WinampNowPlayingToFile.Presentation.SettingsDialog.renderPreview()
   at WinampNowPlayingToFile.Presentation.SettingsDialog.TemplateEditor_TextChanged(Object sender, EventArgs e)
   at System.Windows.Forms.Control.OnTextChanged(EventArgs e)
   at System.Windows.Forms.TextBoxBase.OnTextChanged(EventArgs e)
   at System.Windows.Forms.TextBoxBase.WmReflectCommand(Message& m)
   at System.Windows.Forms.TextBoxBase.WndProc(Message& m)
   at System.Windows.Forms.TextBox.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Add track number to available placeholders.

NowPlayingToFile is great and works really well, but it would be nice to also be able to include the track number of the currently playing track (the contents of the "tracknumber" tag) on the album in the generated text file?

Thanks. :)

Blank files instead of delete files due to OBS's missing files behaviour

Hello,

I've since a few days been playing your your plugin and it's the best one I can find for this job. So great job!

However that said if Winamp isn't running when I launch OBS it'll give me the missing files pop up they implemented for missing resource files. Is it possible for the plugin to wipe the content of the txt and save a blank/transparent png if no track is playing and when you exit Winamp?

For the time being I've added "--disable-missing-files-check" at the launch paremeters for OBS but then it'll disable the feature as a whole. Maybe there's also another solution as well I'm unaware of.

Thanks in advance!

Allow separate images when song has no album art vs. when no song is playing

In #11, I made the plugin output the empty album art file (PNG in installation directory, falling back to 1x1px black PNG) when Winamp was stopped/paused/exit, not just when playing a song with no album art, so that OBS would stop complaining.

Users may want different images when the song has no album art compared to when Winamp is stopped. Currently, it is always the same emptyAlbumArt.png or 1×1 black PNG in both cases.

Version Playing with art Playing without art Stopped
≤ 1.1.0 Song art emptyAlbumArt.png, or black 1×1px Delete file
#11 Song art emptyAlbumArt.png, or black 1×1px emptyAlbumArt.png, or black 1×1px
Proposed #13 A Song art emptyAlbumArt.png, or black 1×1px stoppedAlbumArt.png or black 1×1px
Proposed #13 B Song art emptyAlbumArt.png, or black 1×1px stoppedAlbumArt.png or delete file
Proposed #13 C Song art emptyAlbumArt.png, or delete file stoppedAlbumArt.png or delete file

Another possibility not covered by this issue is restoring the ability to delete the output file when Winamp was stopped, as it did in 1.1.0. I'm not sure if this would be useful or desired. If so, it would probably be a boolean setting with a checkbox in the plugin settings UI backed by a registry value, similar to the other settings. It could also be opt-in by creating stopped.png, and if it's not there, fall back to the old behavior of deleting the file.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.