aboutsummaryrefslogtreecommitdiff
path: root/Src/Winamp/Pls.cpp
diff options
context:
space:
mode:
authorJean-Francois Mauguit <jfmauguit@mac.com>2024-09-24 09:03:25 -0400
committerGitHub <noreply@github.com>2024-09-24 09:03:25 -0400
commitbab614c421ed7ae329d26bf028c4a3b1d2450f5a (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Winamp/Pls.cpp
parent4bde6044fddf053f31795b9eaccdd2a5a527d21f (diff)
parent20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (diff)
downloadwinamp-bab614c421ed7ae329d26bf028c4a3b1d2450f5a.tar.gz
Merge pull request #5 from WinampDesktop/community
Merge to main
Diffstat (limited to 'Src/Winamp/Pls.cpp')
-rw-r--r--Src/Winamp/Pls.cpp170
1 files changed, 170 insertions, 0 deletions
diff --git a/Src/Winamp/Pls.cpp b/Src/Winamp/Pls.cpp
new file mode 100644
index 00000000..13a3177d
--- /dev/null
+++ b/Src/Winamp/Pls.cpp
@@ -0,0 +1,170 @@
+/** (c) Nullsoft, Inc. C O N F I D E N T I A L
+ ** Filename:
+ ** Project:
+ ** Description:
+ ** Author:
+ ** Created:
+ **/
+#include "Main.h"
+#include <io.h>
+#include <sys/stat.h>
+#include "api.h"
+#include "WinampPlaylist.h"
+#include "../nu/AutoChar.h"
+#include <strsafe.h>
+
+void saveplsfn(const wchar_t *_fn)
+{
+ int pos = PlayList_getPosition();
+ PlayList_setposition(0);
+ FILE *plsFile = _wfopen(_fn, L"wt");
+ if(plsFile)
+ {
+ int x = 0;
+ fprintf(plsFile, "[playlist]\r\n");
+ for (;;)
+ {
+ int plspos = PlayList_getPosition();
+ if (!PlayList_gethidden(plspos) && !PlayList_hasanycurtain(plspos))
+ {
+ wchar_t fnbuf[FILENAME_SIZE] = {0}, ftbuf[FILETITLE_SIZE] = {0};
+ PlayList_getitem2W(plspos, fnbuf, ftbuf);
+ PlayList_makerelative(_fn, fnbuf, 0);
+ fprintf(plsFile, "File%d=%s\r\n", ++x, (char *)AutoChar(fnbuf));
+ /*
+ const char *sBrowser = PlayList_getbrowser(plspos);
+ if (sBrowser)
+ fprintf(plsFile, "Browser%d=%s\r\n", x, sBrowser);
+ */
+
+ if (PlayList_getcached(plspos))
+ {
+ fprintf(plsFile, "Title%d=%s\r\n", x, (char *)AutoChar(ftbuf));
+ fprintf(plsFile, "Length%d=%d\r\n", x, PlayList_getcurrentlength());
+ }
+ int repeat = PlayList_getrepeatcount(plspos);
+ if (repeat > 0)
+ fprintf(plsFile, "Repeat%d=%d\r\n", x, repeat);
+ }
+ if (PlayList_advance(1) < 0) break;
+ }
+ fprintf(plsFile, "NumberOfEntries=%d\r\n", x);
+ fprintf(plsFile, "Version=2\r\n");
+
+ PlayList_setposition(pos);
+ fclose(plsFile);
+ }
+ return ;
+}
+
+int loadpls(HWND hwnd, int whattodo)
+{
+ if (!playlistManager)
+ {
+ LPMessageBox(hwnd, IDS_PLAYLIST_SUPPORT_NOT_INSTALLED,IDS_PLAYLIST_LOAD_ERROR, MB_OK);
+ return 0;
+ }
+ wchar_t filter[1024] = {0};
+ playlistManager->GetFilterList(filter, 1024);
+ wchar_t temp[FILENAME_SIZE] = {0}, oldCurPath[MAX_PATH] = {0}, titleStr[128] = {0};
+
+ GetCurrentDirectoryW(MAX_PATH, oldCurPath);
+
+ OPENFILENAMEW l = {sizeof(OPENFILENAMEW),0};
+ static int q;
+ int retv = 0;
+ if (q) return 0;
+ q = 1;
+ l.hwndOwner = DIALOG_PARENT(hMainWindow); //hwnd;
+ l.hInstance = hMainInstance;
+ l.lpstrFilter = filter;
+ l.lpstrFile = temp;
+ temp[0] = 0;
+ l.nMaxFile = FILENAME_SIZE;
+ l.lpstrInitialDir = WASABI_API_APP->path_getWorkingPath();
+
+ if (whattodo == 0) l.lpstrTitle = getStringW(IDS_OPEN_PLAYLIST,titleStr,128);
+ else if (whattodo == 1) l.lpstrTitle = getStringW(IDS_ADD_PLAYLIST,titleStr,128);
+ else l.lpstrTitle = getStringW(IDS_OPEN_PLAYLIST,titleStr,128);
+ l.lpstrDefExt = L"pls";
+
+ l.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_EXPLORER;
+
+ UninitDragDrops();
+ if (GetOpenFileNameW(&l))
+ {
+ wchar_t newCurPath[MAX_PATH] = {0};
+ GetCurrentDirectoryW(MAX_PATH, newCurPath);
+ WASABI_API_APP->path_setWorkingPath(newCurPath);
+
+ q = 0;
+ if (LoadPlaylist(temp, whattodo, 0) != 0)
+ retv = 0;
+ //else // TODO: this wasn't there in the old code, so we'll leave it out for now
+ retv = 1;
+ }
+ SetCurrentDirectoryW(oldCurPath);
+ q = 0;
+ InitDragDrops();
+ return retv;
+}
+
+static void checkplswritable(wchar_t *filename)
+{
+ if (!_waccess(filename, 0))
+ {
+ if (_waccess(filename, 2))
+ {
+ _wchmod(filename, _S_IREAD | _S_IWRITE);
+ }
+ }
+}
+
+int savepls(HWND hwnd)
+{
+ wchar_t oldCurPath[MAX_PATH] = {0};
+ GetCurrentDirectoryW(MAX_PATH, oldCurPath);
+
+ static wchar_t temp[MAX_PATH] = {0};
+ OPENFILENAMEW l = {sizeof(OPENFILENAMEW),0};
+ static int q;
+ if (q) return 0;
+ int ret = 0;
+ q = 1;
+ l.hwndOwner = hwnd;
+ l.hInstance = hMainInstance;
+ l.lpstrFilter = (LPCWSTR)SendMessageW(hMainWindow, WM_WA_IPC, 3, IPC_GET_PLAYLIST_EXTLISTW);
+ l.nFilterIndex = _r_i("plsflt", 3);
+ l.lpstrFile = temp;
+ l.nMaxFile = MAX_PATH - 1;
+ l.lpstrTitle = getStringW(IDS_SAVE_PLAYLIST,NULL,0);
+ l.lpstrDefExt = L"m3u";
+
+ l.Flags = OFN_HIDEREADONLY | OFN_EXPLORER | OFN_OVERWRITEPROMPT;
+
+ if (GetSaveFileNameW(&l))
+ {
+ wchar_t newCurPath[MAX_PATH] = {0};
+ GetCurrentDirectoryW(MAX_PATH, newCurPath);
+ WASABI_API_APP->path_setWorkingPath(newCurPath);
+ SetCurrentDirectoryW(oldCurPath);
+
+ checkplswritable(temp);
+ q = 0;
+ ret = 1;
+ if (!_wcsicmp(extensionW(temp), L"pls"))
+ {
+ DeleteFileW(temp);
+ saveplsfn(temp);
+ }
+ else // if it's not PLS, then it's m3u or m3u8, both of which are handled by the same function
+ {
+ savem3ufn(temp, 0, 0);
+ }
+ }
+
+ _w_i("plsflt", l.nFilterIndex);
+ SetCurrentDirectoryW(oldCurPath);
+ q = 0;
+ return ret;
+} \ No newline at end of file