- NowPlaying.dll/iTunesPlugin.dll: Fixed incompatibility with iTunes controllers

- NowPlaying.dll: Removed support for caching cover art
This commit is contained in:
Birunthan Mohanathas 2011-11-05 17:52:53 +00:00
parent 2a166b520f
commit c8e4608b41
11 changed files with 109 additions and 156 deletions

View File

@ -70,7 +70,7 @@ bool CCover::GetLocal(std::wstring filename, const std::wstring& folder, std::ws
** Attempts to extract cover art from audio files. ** Attempts to extract cover art from audio files.
** **
*/ */
bool CCover::GetEmbedded(const TagLib::FileRef& fr, std::wstring& target) bool CCover::GetEmbedded(const TagLib::FileRef& fr, const std::wstring& target)
{ {
bool found = false; bool found = false;

View File

@ -44,7 +44,7 @@ class CCover
public: public:
static bool GetCached(std::wstring& path); static bool GetCached(std::wstring& path);
static bool GetLocal(std::wstring filename, const std::wstring& folder, std::wstring& target); static bool GetLocal(std::wstring filename, const std::wstring& folder, std::wstring& target);
static bool GetEmbedded(const TagLib::FileRef& fr, std::wstring& target); static bool GetEmbedded(const TagLib::FileRef& fr, const std::wstring& target);
static std::wstring GetFileFolder(const std::wstring& file); static std::wstring GetFileFolder(const std::wstring& file);
private: private:

View File

@ -30,7 +30,6 @@
#include "PlayerWMP.h" #include "PlayerWMP.h"
static std::map<UINT, ChildMeasure*> g_Measures; static std::map<UINT, ChildMeasure*> g_Measures;
std::wstring g_CachePath;
std::wstring g_SettingsFile; std::wstring g_SettingsFile;
HINSTANCE g_Instance = NULL; HINSTANCE g_Instance = NULL;
@ -42,15 +41,8 @@ HINSTANCE g_Instance = NULL;
*/ */
UINT Initialize(HMODULE instance, LPCTSTR iniFile, LPCTSTR section, UINT id) UINT Initialize(HMODULE instance, LPCTSTR iniFile, LPCTSTR section, UINT id)
{ {
if (g_Measures.empty()) if (!g_Instance)
{ {
// Get path to temporary folder (for cover art cache)
WCHAR buffer[MAX_PATH];
GetTempPath(MAX_PATH, buffer);
wcscat(buffer, L"Rainmeter-Cache\\");
CreateDirectory(buffer, NULL);
g_CachePath = buffer;
// Get path to Plugins.ini (usually %APPDATA%\Rainmeter\Plugins.ini) // Get path to Plugins.ini (usually %APPDATA%\Rainmeter\Plugins.ini)
std::wstring str = PluginBridge(L"getconfig", iniFile); std::wstring str = PluginBridge(L"getconfig", iniFile);
if (!str.empty()) if (!str.empty())
@ -59,10 +51,6 @@ UINT Initialize(HMODULE instance, LPCTSTR iniFile, LPCTSTR section, UINT id)
g_SettingsFile = PluginBridge(L"getvariable", str.c_str()); g_SettingsFile = PluginBridge(L"getvariable", str.c_str());
g_SettingsFile += L"Plugins.ini"; g_SettingsFile += L"Plugins.ini";
} }
else
{
LSLog(LOG_ERROR, NULL, L"NowPlaying.dll: PluginBridge error");
}
g_Instance = instance; g_Instance = instance;
CInternet::Initialize(); CInternet::Initialize();
@ -168,7 +156,6 @@ UINT Initialize(HMODULE instance, LPCTSTR iniFile, LPCTSTR section, UINT id)
} }
parent->id = id; parent->id = id;
parent->childCount = 1;
parent->player->AddInstance(); parent->player->AddInstance();
parent->playerPath = ReadConfigString(section, L"PlayerPath", L""); parent->playerPath = ReadConfigString(section, L"PlayerPath", L"");
parent->trackChangeAction = ReadConfigString(section, L"TrackChangeAction", L""); parent->trackChangeAction = ReadConfigString(section, L"TrackChangeAction", L"");
@ -300,6 +287,7 @@ void Finalize(HMODULE instance, UINT id)
if (g_Measures.empty()) if (g_Measures.empty())
{ {
g_Instance = NULL;
CInternet::Finalize(); CInternet::Finalize();
} }
} }

View File

@ -23,6 +23,13 @@
struct ParentMeasure struct ParentMeasure
{ {
ParentMeasure() :
player(NULL),
childCount(1),
trackCount(0),
disableLeadingZero(false)
{}
UINT id; UINT id;
UINT childCount; UINT childCount;
UINT trackCount; UINT trackCount;
@ -33,16 +40,17 @@ struct ParentMeasure
std::wstring trackChangeAction; std::wstring trackChangeAction;
std::wstring playerPath; std::wstring playerPath;
bool disableLeadingZero; bool disableLeadingZero;
ParentMeasure() : player(NULL) {}
}; };
struct ChildMeasure struct ChildMeasure
{ {
ChildMeasure() :
type(MEASURE_NONE),
parent(NULL)
{}
MEASURETYPE type; MEASURETYPE type;
ParentMeasure* parent; ParentMeasure* parent;
ChildMeasure() : parent(NULL) {}
}; };
void SecondsToTime(UINT seconds, bool leadingZero, WCHAR* buffer); void SecondsToTime(UINT seconds, bool leadingZero, WCHAR* buffer);

View File

@ -19,8 +19,6 @@
#include "StdAfx.h" #include "StdAfx.h"
#include "Player.h" #include "Player.h"
extern std::wstring g_CachePath;
/* /*
** CPlayer ** CPlayer
** **
@ -42,6 +40,11 @@ CPlayer::CPlayer() :
m_Volume(), m_Volume(),
m_InternetThread() m_InternetThread()
{ {
// Get temporary file for cover art
WCHAR buffer[MAX_PATH];
GetTempPath(MAX_PATH, buffer);
GetTempFileName(buffer, L"cvr", 0, buffer);
m_TempCoverPath = buffer;
} }
/* /*
@ -111,35 +114,6 @@ void CPlayer::UpdateMeasure()
} }
} }
/*
** GetCacheFile
**
** Creates escaped path to cache file (without extension)
**
*/
std::wstring CPlayer::GetCacheFile()
{
std::wstring path = g_CachePath;
if (m_Artist.empty() || m_Title.empty())
{
path += L"temp";
}
else
{
std::wstring name = m_Artist + L" - ";
name += m_Title;
// Replace reserved chars with _
std::wstring::size_type pos = 0;
while ((pos = name.find_first_of(L"\\/:*?\"<>|", pos)) != std::wstring::npos) name[pos] = L'_';
path += name;
}
return path;
}
/* /*
** FindCover ** FindCover
** **
@ -148,12 +122,12 @@ std::wstring CPlayer::GetCacheFile()
*/ */
void CPlayer::FindCover() void CPlayer::FindCover()
{ {
m_CoverPath = GetCacheFile();
if (!CCover::GetCached(m_CoverPath))
{
TagLib::FileRef fr(m_FilePath.c_str()); TagLib::FileRef fr(m_FilePath.c_str());
if (fr.isNull() || !CCover::GetEmbedded(fr, m_CoverPath)) if (!fr.isNull() && CCover::GetEmbedded(fr, m_TempCoverPath))
{
m_CoverPath = m_TempCoverPath;
}
else
{ {
std::wstring trackFolder = CCover::GetFileFolder(m_FilePath); std::wstring trackFolder = CCover::GetFileFolder(m_FilePath);
@ -164,7 +138,6 @@ void CPlayer::FindCover()
m_CoverPath.clear(); m_CoverPath.clear();
} }
} }
}
} }
/* /*

View File

@ -34,6 +34,7 @@ enum PLAYSTATE
enum MEASURETYPE enum MEASURETYPE
{ {
MEASURE_NONE = 0x00000000,
MEASURE_ARTIST = 0x00000001, MEASURE_ARTIST = 0x00000001,
MEASURE_TITLE = 0x00000002, MEASURE_TITLE = 0x00000002,
MEASURE_ALBUM = 0x00000004, MEASURE_ALBUM = 0x00000004,
@ -66,7 +67,6 @@ public:
bool IsInitialized() { return m_Initialized; } bool IsInitialized() { return m_Initialized; }
UINT GetTrackCount() { return m_TrackCount; } UINT GetTrackCount() { return m_TrackCount; }
std::wstring GetCacheFile();
void FindCover(); void FindCover();
void FindLyrics(); void FindLyrics();
@ -104,6 +104,7 @@ protected:
UINT m_InstanceCount; UINT m_InstanceCount;
UINT m_UpdateCount; UINT m_UpdateCount;
UINT m_TrackCount; UINT m_TrackCount;
std::wstring m_TempCoverPath;
INT m_Measures; INT m_Measures;
PLAYSTATE m_State; PLAYSTATE m_State;

View File

@ -287,7 +287,7 @@ LRESULT CALLBACK CPlayerITunes::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPAR
case WM_TIMER: case WM_TIMER:
if (wParam == TIMER_CHECKACTIVE) if (wParam == TIMER_CHECKACTIVE)
{ {
if (!FindWindow(L"iTunes", L"iTunes")) if (!FindWindow(L"iTunesApp", L"iTunes") && !FindWindow(L"iTunes", L"iTunes"))
{ {
player->m_iTunesActive = false; player->m_iTunesActive = false;
KillTimer(hwnd, TIMER_CHECKACTIVE); KillTimer(hwnd, TIMER_CHECKACTIVE);
@ -313,8 +313,7 @@ bool CPlayerITunes::CheckWindow()
{ {
m_LastCheckTime = time; m_LastCheckTime = time;
HWND wnd = FindWindow(L"ITWindow", L"iTunes"); if ((FindWindow(L"iTunesApp", L"iTunes") || FindWindow(L"iTunes", L"iTunes")) && !m_iTunesActive)
if (wnd && !m_iTunesActive)
{ {
m_iTunesActive = true; m_iTunesActive = true;
Initialize(); Initialize();
@ -387,10 +386,9 @@ void CPlayerITunes::OnTrackChange()
if (m_Measures & MEASURE_COVER) if (m_Measures & MEASURE_COVER)
{ {
m_CoverPath = GetCacheFile(); m_CoverPath.clear();
if (!CCover::GetCached(m_CoverPath))
{ // Check for embedded art through iTunes interface
// Art not in cache, check for embedded art through iTunes interface
IITArtworkCollection* artworkCollection; IITArtworkCollection* artworkCollection;
hr = track->get_Artwork(&artworkCollection); hr = track->get_Artwork(&artworkCollection);
@ -406,28 +404,19 @@ void CPlayerITunes::OnTrackChange()
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
{ {
tmpStr = m_CoverPath.c_str(); tmpStr = m_TempCoverPath.c_str();
hr = artwork->SaveArtworkToFile(tmpStr); hr = artwork->SaveArtworkToFile(tmpStr);
if (FAILED(hr)) if (SUCCEEDED(hr))
{ {
m_CoverPath.clear(); m_CoverPath = m_TempCoverPath;
} }
artwork->Release(); artwork->Release();
} }
} }
else
{
m_CoverPath.clear();
}
artworkCollection->Release(); artworkCollection->Release();
} }
else
{
m_CoverPath.clear();
}
}
} }
if (m_Measures & MEASURE_LYRICS) if (m_Measures & MEASURE_LYRICS)

View File

@ -373,8 +373,6 @@ void CPlayerWMP::Uninitialize()
*/ */
void CPlayerWMP::UpdateData() void CPlayerWMP::UpdateData()
{ {
static bool clear = false;
if (m_Initialized) if (m_Initialized)
{ {
// Get the volume // Get the volume

View File

@ -33,6 +33,7 @@ CPlayer* CPlayerWinamp::c_Player = NULL;
*/ */
CPlayerWinamp::CPlayerWinamp(WINAMPTYPE type) : CPlayer(), CPlayerWinamp::CPlayerWinamp(WINAMPTYPE type) : CPlayer(),
m_Window(), m_Window(),
m_LastCheckTime(0),
m_UseUnicodeAPI(false), m_UseUnicodeAPI(false),
m_PlayingStream(false), m_PlayingStream(false),
m_WinampType(type), m_WinampType(type),
@ -123,7 +124,7 @@ void CPlayerWinamp::UpdateData()
if (m_WinampHandle) CloseHandle(m_WinampHandle); if (m_WinampHandle) CloseHandle(m_WinampHandle);
} }
if (!m_FilePath.empty()) if (m_State != PLAYER_STOPPED)
{ {
ClearData(); ClearData();
} }
@ -198,12 +199,14 @@ void CPlayerWinamp::UpdateData()
// Find cover if needed // Find cover if needed
if (m_Measures & MEASURE_COVER) if (m_Measures & MEASURE_COVER)
{ {
m_CoverPath = GetCacheFile(); if (tag && CCover::GetEmbedded(fr, m_TempCoverPath))
if (!CCover::GetCached(m_CoverPath) &&
(tag && !CCover::GetEmbedded(fr, m_CoverPath)))
{ {
std::wstring trackFolder = CCover::GetFileFolder(m_FilePath); // Got everything, return
m_CoverPath = m_TempCoverPath;
return;
}
std::wstring trackFolder = CCover::GetFileFolder(m_FilePath);
if (!m_Album.empty()) if (!m_Album.empty())
{ {
// Winamp stores covers usually as %album%.jpg // Winamp stores covers usually as %album%.jpg
@ -254,11 +257,8 @@ void CPlayerWinamp::UpdateData()
m_CoverPath.clear(); m_CoverPath.clear();
} }
} }
} else if (tag)
if (tag)
{ {
// Got metadata, return
return; return;
} }
} }
@ -266,13 +266,9 @@ void CPlayerWinamp::UpdateData()
{ {
m_Rating = 0; m_Rating = 0;
m_Duration = 0; m_Duration = 0;
if (m_Measures & MEASURE_COVER)
{
m_CoverPath.clear(); m_CoverPath.clear();
} }
} }
}
else if (!m_PlayingStream) else if (!m_PlayingStream)
{ {
return; return;

View File

@ -12,7 +12,7 @@
// //
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,1,3,5 FILEVERSION 1,1,3,6
PRODUCTVERSION PRODUCTVER PRODUCTVERSION PRODUCTVER
FILEFLAGSMASK 0x17L FILEFLAGSMASK 0x17L
#ifdef _DEBUG #ifdef _DEBUG
@ -29,7 +29,7 @@ BEGIN
BLOCK "040904E4" BLOCK "040904E4"
BEGIN BEGIN
VALUE "FileDescription", "NowPlaying Plugin for Rainmeter" VALUE "FileDescription", "NowPlaying Plugin for Rainmeter"
VALUE "FileVersion", "1.1.3.5" VALUE "FileVersion", "1.1.3.6"
VALUE "InternalName", "NowPlaying" VALUE "InternalName", "NowPlaying"
VALUE "LegalCopyright", "Copyright (C) 2011 - Birunthan Mohanathas" VALUE "LegalCopyright", "Copyright (C) 2011 - Birunthan Mohanathas"
VALUE "OriginalFilename", "NowPlaying.dll" VALUE "OriginalFilename", "NowPlaying.dll"

View File

@ -450,7 +450,7 @@ UINT Initialize(HMODULE instance, LPCTSTR iniFile, LPCTSTR section, UINT id)
CoInitialized = true; CoInitialized = true;
} }
if (CoInitialized && !InstanceCreated && ::FindWindow(L"ITWindow", L"iTunes")) if (CoInitialized && !InstanceCreated && (FindWindow(L"iTunesApp", L"iTunes") || FindWindow(L"iTunes", L"iTunes")))
{ {
if (SUCCEEDED(iTunes.CreateInstance(CLSID_iTunesApp, NULL, CLSCTX_LOCAL_SERVER))) if (SUCCEEDED(iTunes.CreateInstance(CLSID_iTunesApp, NULL, CLSCTX_LOCAL_SERVER)))
{ {
@ -490,7 +490,7 @@ UINT Update(UINT id)
if (!CoInitialized || !InstanceCreated) if (!CoInitialized || !InstanceCreated)
{ {
// Check if the iTunes window has appeared // Check if the iTunes window has appeared
if (::FindWindow(L"ITWindow", L"iTunes")) if (FindWindow(L"iTunesApp", L"iTunes") || FindWindow(L"iTunes", L"iTunes"))
{ {
if (!iTunesAboutToPromptUserToQuit && SUCCEEDED(iTunes.CreateInstance(CLSID_iTunesApp, NULL, CLSCTX_LOCAL_SERVER))) if (!iTunesAboutToPromptUserToQuit && SUCCEEDED(iTunes.CreateInstance(CLSID_iTunesApp, NULL, CLSCTX_LOCAL_SERVER)))
{ {