6 Commits
1.1 ... 1.2

113 changed files with 502 additions and 404 deletions

View File

@@ -2,21 +2,21 @@ default:
@echo "Please choose a platform: linux, macos, win32" @echo "Please choose a platform: linux, macos, win32"
linux: linux:
g++ main.cpp cJSON.cpp aes.cpp ncmcrypt.cpp -o ncmdump -ltag g++ main.cpp cJSON.cpp aes.cpp ncmcrypt.cpp -o ncmdump -ltag -std=c++17
strip ncmdump strip ncmdump
macos-intel: macos-intel:
clang++ main.cpp cJSON.cpp aes.cpp ncmcrypt.cpp -o ncmdump -ltag clang++ main.cpp cJSON.cpp aes.cpp ncmcrypt.cpp -o ncmdump -ltag -std=c++17
strip ncmdump strip ncmdump
macos-arm64:export CPATH=/opt/homebrew/include macos-arm64:export CPATH=/opt/homebrew/include
macos-arm64:export LIBRARY_PATH=/opt/homebrew/lib macos-arm64:export LIBRARY_PATH=/opt/homebrew/lib
macos-arm64: macos-arm64:
clang++ main.cpp cJSON.cpp aes.cpp ncmcrypt.cpp -o ncmdump -ltag clang++ main.cpp cJSON.cpp aes.cpp ncmcrypt.cpp -o ncmdump -ltag -std=c++17
strip ncmdump strip ncmdump
win32: win32:
g++ main.cpp cJSON.cpp aes.cpp ncmcrypt.cpp -o ncmdump -ltag -Ltaglib/lib -Itaglib/include -static -O g++ main.cpp cJSON.cpp aes.cpp ncmcrypt.cpp -o ncmdump -ltag -Ltaglib/lib -Itaglib/include -static -O -municode -std=c++17
strip ncmdump.exe strip ncmdump.exe
clean: clean:

View File

@@ -13,6 +13,28 @@
2021年10月6日原作者已经删库 2021年10月6日原作者已经删库
## 使用
从 [Release](https://github.com/taurusxin/ncmdump/releases) 下载最新版本的对应系统的已编译好的二进制文件
使用 `-h``--help` 参数来打印帮助
```shell
ncmdump -h
```
命令行下输入一个或多个文件
```shell
ncmdump file1 file2...
```
你可以使用 `-d` 参数来指定一个文件夹,对文件夹下的所有文件批量处理
```shell
ncmdump -d folder
```
## 依赖库及不同平台编译方法 ## 依赖库及不同平台编译方法
### 依赖库 ### 依赖库
@@ -70,9 +92,6 @@ make win32
#### Visual Studio #### Visual Studio
注意**VS的源代码还未上传请先使用 MinGW 编译**
使用 git 切换到 msvc 分支,使用 Visual Studio 打开 ncmdump.sln编译即可 使用 git 切换到 msvc 分支,使用 Visual Studio 打开 ncmdump.sln编译即可
## 使用
1. 命令行下使用 `ncmdump [files]...`
2. 直接 ncm 拖拽文件到二进制文件上

View File

@@ -1,5 +1,6 @@
#ifndef _MACARON_BASE64_H_ #ifndef _MACARON_BASE64_H_
#define _MACARON_BASE64_H_ #define _MACARON_BASE64_H_
#include <cstdint>
#include <string> #include <string>

131
main.cpp
View File

@@ -1,28 +1,117 @@
#include "ncmcrypt.h" #include "ncmcrypt.h"
#include <iostream>
#include <stdexcept> #include <stdexcept>
#include <vector>
#include <filesystem>
int main(int argc, char *argv[]) { #ifdef _WIN32
#include <Windows.h>
#endif
if (argc <= 1) { namespace fs = std::filesystem;
std::cout << "Please input file path!" << std::endl;
return 1;
}
try { void displayHelp() {
int i; std::cout << "Usage: ncmdump [-d] [-h] file1 file2 ..." << std::endl;
for (i = 1; i < argc; i++) { std::cout << "Options:" << std::endl;
NeteaseCrypt crypt(argv[i]); std::cout << " -d Process files in a folder (requires folder path)" << std::endl;
crypt.Dump(); std::cout << " -h, --help Display this help message" << std::endl;
crypt.FixMetadata(); }
std::cout << crypt.dumpFilepath() << std::endl; void processFile(const fs::path& filePath) {
} if (fs::exists(filePath) == false) {
} catch (std::invalid_argument e) { std::cerr << "Error: file '" << filePath.string() << "' does not exist." << std::endl;
std::cout << "Exception: " << e.what() << std::endl; return;
} catch (...) { }
std::cout << "Unexcept exception!" << std::endl;
} try {
NeteaseCrypt crypt(filePath.string());
return 0; crypt.Dump();
crypt.FixMetadata();
std::cout << "Done: '" << crypt.dumpFilepath().string() << "'" << std::endl;
} catch (const std::invalid_argument& e) {
std::cout << "Exception: '" << filePath << "'" << e.what() << std::endl;
} catch (...) {
std::cout << "Unexpected exception while processing file: " << filePath << std::endl;
}
}
void processFilesInFolder(const fs::path& folderPath) {
for (const auto& entry : fs::directory_iterator(folderPath)) {
if (fs::is_regular_file(entry.status())) {
processFile(entry.path());
}
}
}
#ifdef _WIN32
int wmain(int argc, wchar_t* argv[])
#else
int main(int argc, char **argv)
#endif
{
#ifdef _WIN32
SetConsoleOutputCP(CP_UTF8);
#endif
if (argc <= 1) {
displayHelp();
return 1;
}
std::vector<fs::path> files;
bool processFolders = false;
bool folderProvided = false;
#ifdef _WIN32
#define COMPARE_STR(s1, s2) (wcscmp(s1, s2) == 0)
#define HELP_SHORT L"-h"
#define HELP_LONG L"--help"
#define FOLDER L"-d"
#else
#define COMPARE_STR(s1, s2) (strcmp(s1, s2) == 0)
#define HELP_SHORT "-h"
#define HELP_LONG "--help"
#define FOLDER "-d"
#endif
for (int i = 1; i < argc; ++i) {
if (COMPARE_STR(argv[i], HELP_SHORT) || COMPARE_STR(argv[i], HELP_LONG)) {
displayHelp();
return 0;
} else if (COMPARE_STR(argv[i], FOLDER)) {
processFolders = true;
if (i + 1 < argc && argv[i + 1][0] != '-') {
folderProvided = true;
processFilesInFolder(argv[i + 1]);
// Skip the folder name
++i;
} else {
std::cerr << "Error: -d option requires a folder path." << std::endl;
return 1;
}
} else {
#ifdef _WIN32
int multiByteStrSize = WideCharToMultiByte(CP_UTF8, 0, argv[1], -1, NULL, 0, NULL, NULL);
char *multiByteStr = new char[multiByteStrSize];
WideCharToMultiByte(CP_UTF8, 0, argv[i], -1, multiByteStr, multiByteStrSize, NULL, NULL);
fs::path path(multiByteStr);
#else
fs::path path(argv[i]);
#endif
files.push_back(path);
}
}
for (const auto& file : files) {
if (processFolders && fs::is_directory(file)) {
processFilesInFolder(file);
} else {
processFile(file);
}
}
return 0;
} }

View File

@@ -13,6 +13,8 @@
#include <stdexcept> #include <stdexcept>
#include <string> #include <string>
#include <filesystem>
const unsigned char NeteaseCrypt::sCoreKey[17] = {0x68, 0x7A, 0x48, 0x52, 0x41, 0x6D, 0x73, 0x6F, 0x35, 0x6B, 0x49, 0x6E, 0x62, 0x61, 0x78, 0x57, 0}; const unsigned char NeteaseCrypt::sCoreKey[17] = {0x68, 0x7A, 0x48, 0x52, 0x41, 0x6D, 0x73, 0x6F, 0x35, 0x6B, 0x49, 0x6E, 0x62, 0x61, 0x78, 0x57, 0};
const unsigned char NeteaseCrypt::sModifyKey[17] = {0x23, 0x31, 0x34, 0x6C, 0x6A, 0x6B, 0x5F, 0x21, 0x5C, 0x5D, 0x26, 0x30, 0x55, 0x3C, 0x27, 0x28, 0}; const unsigned char NeteaseCrypt::sModifyKey[17] = {0x23, 0x31, 0x34, 0x6C, 0x6A, 0x6B, 0x5F, 0x21, 0x5C, 0x5D, 0x26, 0x30, 0x55, 0x3C, 0x27, 0x28, 0};
@@ -52,14 +54,6 @@ static void replace(std::string& str, const std::string& from, const std::string
} }
} }
static std::string fileNameWithoutExt(const std::string& str)
{
size_t lastPath = str.find_last_of("/\\");
std::string path = str.substr(lastPath+1);
size_t lastExt = path.find_last_of(".");
return path.substr(0, lastExt);
}
NeteaseMusicMetadata::~NeteaseMusicMetadata() { NeteaseMusicMetadata::~NeteaseMusicMetadata() {
cJSON_Delete(mRaw); cJSON_Delete(mRaw);
} }
@@ -112,13 +106,13 @@ NeteaseMusicMetadata::NeteaseMusicMetadata(cJSON* raw) {
} }
} }
bool NeteaseCrypt::openFile(std::string const& path) { bool NeteaseCrypt::openFile(std::filesystem::path const& path) {
try { mFile.open(path, std::ios::in | std::ios::binary);
mFile.open(path, std::ios::in | std::ios::binary); if (!mFile.is_open()) {
} catch (...) { return false;
return false; } else {
} return true;
return true; }
} }
bool NeteaseCrypt::isNcmFile() { bool NeteaseCrypt::isNcmFile() {
@@ -143,7 +137,7 @@ int NeteaseCrypt::read(char *s, std::streamsize n) {
int gcount = mFile.gcount(); int gcount = mFile.gcount();
if (gcount <= 0) { if (gcount <= 0) {
throw std::invalid_argument("can't read file"); throw std::invalid_argument(" can't read file");
} }
return gcount; return gcount;
@@ -179,7 +173,7 @@ std::string NeteaseCrypt::mimeType(std::string& data) {
} }
void NeteaseCrypt::FixMetadata() { void NeteaseCrypt::FixMetadata() {
if (mDumpFilepath.length() <= 0) { if (mDumpFilepath.string().length() <= 0) {
throw std::invalid_argument("must dump before"); throw std::invalid_argument("must dump before");
} }
@@ -243,7 +237,7 @@ void NeteaseCrypt::Dump() {
// replace(mDumpFilepath, ">", ""); // replace(mDumpFilepath, ">", "");
// replace(mDumpFilepath, "|", ""); // replace(mDumpFilepath, "|", "");
// } else { // } else {
mDumpFilepath = fileNameWithoutExt(mFilepath); mDumpFilepath = mFilepath;
// } // }
n = 0x8000; n = 0x8000;
@@ -265,11 +259,11 @@ void NeteaseCrypt::Dump() {
// identify format // identify format
// ID3 format mp3 // ID3 format mp3
if (buffer[0] == 0x49 && buffer[1] == 0x44 && buffer[2] == 0x33) { if (buffer[0] == 0x49 && buffer[1] == 0x44 && buffer[2] == 0x33) {
mDumpFilepath += ".mp3"; mDumpFilepath.replace_extension(".mp3");
mFormat = NeteaseCrypt::MP3; mFormat = NeteaseCrypt::MP3;
} else { } else {
mDumpFilepath += ".flac"; mDumpFilepath.replace_extension(".flac");
mFormat = NeteaseCrypt::FLAC; mFormat = NeteaseCrypt::FLAC;
} }
output.open(mDumpFilepath, output.out | output.binary); output.open(mDumpFilepath, output.out | output.binary);
@@ -290,17 +284,17 @@ NeteaseCrypt::~NeteaseCrypt() {
mFile.close(); mFile.close();
} }
NeteaseCrypt::NeteaseCrypt(std::string const& path) { NeteaseCrypt::NeteaseCrypt(std::filesystem::path const& path) {
if (!openFile(path)) { if (!openFile(path)) {
throw std::invalid_argument("can't open file"); throw std::invalid_argument(" can't open file");
} }
if (!isNcmFile()) { if (!isNcmFile()) {
throw std::invalid_argument("not netease protected file"); throw std::invalid_argument(" not netease protected file");
} }
if (!mFile.seekg(2, mFile.cur)) { if (!mFile.seekg(2, mFile.cur)) {
throw std::invalid_argument("can't seek file"); throw std::invalid_argument(" can't seek file");
} }
mFilepath = path; mFilepath = path;

View File

@@ -6,6 +6,8 @@
#include <iostream> #include <iostream>
#include <fstream> #include <fstream>
#include <filesystem>
class NeteaseMusicMetadata { class NeteaseMusicMetadata {
private: private:
@@ -40,8 +42,8 @@ private:
enum NcmFormat { MP3, FLAC }; enum NcmFormat { MP3, FLAC };
private: private:
std::string mFilepath; std::filesystem::path mFilepath;
std::string mDumpFilepath; std::filesystem::path mDumpFilepath;
NcmFormat mFormat; NcmFormat mFormat;
std::string mImageData; std::string mImageData;
std::ifstream mFile; std::ifstream mFile;
@@ -50,17 +52,17 @@ private:
private: private:
bool isNcmFile(); bool isNcmFile();
bool openFile(std::string const&); bool openFile(std::filesystem::path const&);
int read(char *s, std::streamsize n); int read(char *s, std::streamsize n);
void buildKeyBox(unsigned char *key, int keyLen); void buildKeyBox(unsigned char *key, int keyLen);
std::string mimeType(std::string& data); std::string mimeType(std::string& data);
public: public:
const std::string& filepath() const { return mFilepath; } const std::filesystem::path& filepath() const { return mFilepath; }
const std::string& dumpFilepath() const { return mDumpFilepath; } const std::filesystem::path& dumpFilepath() const { return mDumpFilepath; }
public: public:
NeteaseCrypt(std::string const&); NeteaseCrypt(std::filesystem::path const&);
~NeteaseCrypt(); ~NeteaseCrypt();
public: public:

View File

@@ -1,3 +0,0 @@
# taglib
这是 Windows 下的 taglib 静态库,使用 [winlibs](https://winlibs.com/) 与 CMake 进行编译,编译器版本是 `GCC 11.2.0 + LLVM/Clang/LLD/LLDB 13.0.0 + MinGW-w64 9.0.0 - UCRT - release 2` 截止2021年10月的最新版本

View File

@@ -27,10 +27,10 @@ goto theend
* to allow for static, shared or debug builds. * to allow for static, shared or debug builds.
* It would be preferable if the top level CMakeLists.txt provided the library name during config. ?? * It would be preferable if the top level CMakeLists.txt provided the library name during config. ??
:doit :doit
if /i "%1#" == "--libs#" echo -LC:/taglib/lib -llibtag if /i "%1#" == "--libs#" echo -LC:/Users/TaurusXin/Downloads/ncmdump/taglib/lib -llibtag
if /i "%1#" == "--cflags#" echo -IC:/taglib/include -IC:/taglib/include/taglib if /i "%1#" == "--cflags#" echo -IC:/Users/TaurusXin/Downloads/ncmdump/taglib/include -IC:/Users/TaurusXin/Downloads/ncmdump/taglib/include/taglib
if /i "%1#" == "--version#" echo 1.12 if /i "%1#" == "--version#" echo 1.13.1
if /i "%1#" == "--prefix#" echo C:/taglib if /i "%1#" == "--prefix#" echo C:/Users/TaurusXin/Downloads/ncmdump/taglib
:theend :theend

View File

@@ -150,8 +150,8 @@ namespace TagLib {
class FilePrivate; class FilePrivate;
FilePrivate *d; FilePrivate *d;
}; };
} } // namespace AIFF
} } // namespace RIFF
} } // namespace TagLib
#endif #endif

View File

@@ -50,7 +50,7 @@ namespace TagLib {
* Create an instance of AIFF::Properties with the data read from the * Create an instance of AIFF::Properties with the data read from the
* ByteVector \a data. * ByteVector \a data.
* *
* \deprecated * \deprecated Use Properties(File *, ReadStyle).
*/ */
TAGLIB_DEPRECATED Properties(const ByteVector &data, ReadStyle style); TAGLIB_DEPRECATED Properties(const ByteVector &data, ReadStyle style);
@@ -71,7 +71,7 @@ namespace TagLib {
* *
* \note This method is just an alias of lengthInSeconds(). * \note This method is just an alias of lengthInSeconds().
* *
* \deprecated * \deprecated Use lengthInSeconds().
*/ */
TAGLIB_DEPRECATED virtual int length() const; TAGLIB_DEPRECATED virtual int length() const;
@@ -117,7 +117,7 @@ namespace TagLib {
* *
* \note This method is just an alias of bitsPerSample(). * \note This method is just an alias of bitsPerSample().
* *
* \deprecated * \deprecated Use bitsPerSample().
*/ */
TAGLIB_DEPRECATED int sampleWidth() const; TAGLIB_DEPRECATED int sampleWidth() const;
@@ -159,8 +159,8 @@ namespace TagLib {
class PropertiesPrivate; class PropertiesPrivate;
PropertiesPrivate *d; PropertiesPrivate *d;
}; };
} } // namespace AIFF
} } // namespace RIFF
} } // namespace TagLib
#endif #endif

View File

@@ -229,7 +229,7 @@ namespace TagLib {
class FilePrivate; class FilePrivate;
FilePrivate *d; FilePrivate *d;
}; };
} } // namespace APE
} } // namespace TagLib
#endif #endif

View File

@@ -167,7 +167,7 @@ namespace TagLib {
FooterPrivate *d; FooterPrivate *d;
}; };
} } // namespace APE
} } // namespace TagLib
#endif #endif

View File

@@ -31,9 +31,7 @@
#include "tstringlist.h" #include "tstringlist.h"
namespace TagLib { namespace TagLib {
namespace APE { namespace APE {
//! An implementation of APE-items //! An implementation of APE-items
/*! /*!
@@ -215,10 +213,7 @@ namespace TagLib {
class ItemPrivate; class ItemPrivate;
ItemPrivate *d; ItemPrivate *d;
}; };
} } // namespace APE
} // namespace TagLib
}
#endif #endif

View File

@@ -53,7 +53,7 @@ namespace TagLib {
* Create an instance of APE::Properties with the data read from the * Create an instance of APE::Properties with the data read from the
* APE::File \a file. * APE::File \a file.
* *
* \deprecated * \deprecated Use Properties(File *, long, ReadStyle).
*/ */
TAGLIB_DEPRECATED Properties(File *file, ReadStyle style = Average); TAGLIB_DEPRECATED Properties(File *file, ReadStyle style = Average);
@@ -74,7 +74,7 @@ namespace TagLib {
* *
* \note This method is just an alias of lengthInSeconds(). * \note This method is just an alias of lengthInSeconds().
* *
* \deprecated * \deprecated Use lengthInSeconds().
*/ */
TAGLIB_DEPRECATED virtual int length() const; TAGLIB_DEPRECATED virtual int length() const;
@@ -137,7 +137,7 @@ namespace TagLib {
class PropertiesPrivate; class PropertiesPrivate;
PropertiesPrivate *d; PropertiesPrivate *d;
}; };
} } // namespace APE
} } // namespace TagLib
#endif #endif

View File

@@ -202,7 +202,7 @@ namespace TagLib {
class TagPrivate; class TagPrivate;
TagPrivate *d; TagPrivate *d;
}; };
} } // namespace APE
} } // namespace TagLib
#endif #endif

View File

@@ -33,10 +33,8 @@
namespace TagLib namespace TagLib
{ {
namespace ASF namespace ASF
{ {
class File; class File;
class Picture; class Picture;
@@ -201,8 +199,7 @@ namespace TagLib
class AttributePrivate; class AttributePrivate;
AttributePrivate *d; AttributePrivate *d;
}; };
} } // namespace ASF
} // namespace TagLib
}
#endif #endif

View File

@@ -33,10 +33,8 @@
#include "asftag.h" #include "asftag.h"
namespace TagLib { namespace TagLib {
//! An implementation of ASF (WMA) metadata //! An implementation of ASF (WMA) metadata
namespace ASF { namespace ASF {
/*! /*!
* This implements and provides an interface for ASF files to the * This implements and provides an interface for ASF files to the
* TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing
@@ -130,9 +128,7 @@ namespace TagLib {
class FilePrivate; class FilePrivate;
FilePrivate *d; FilePrivate *d;
}; };
} // namespace ASF
} } // namespace TagLib
}
#endif #endif

View File

@@ -216,7 +216,7 @@ namespace TagLib
class PicturePrivate; class PicturePrivate;
PicturePrivate *d; PicturePrivate *d;
}; };
} } // namespace ASF
} } // namespace TagLib
#endif // ASFPICTURE_H #endif // ASFPICTURE_H

View File

@@ -31,9 +31,7 @@
#include "taglib_export.h" #include "taglib_export.h"
namespace TagLib { namespace TagLib {
namespace ASF { namespace ASF {
//! An implementation of ASF audio properties //! An implementation of ASF audio properties
class TAGLIB_EXPORT Properties : public AudioProperties class TAGLIB_EXPORT Properties : public AudioProperties
{ {
@@ -86,7 +84,7 @@ namespace TagLib {
* *
* \note This method is just an alias of lengthInSeconds(). * \note This method is just an alias of lengthInSeconds().
* *
* \deprecated * \deprecated Use lengthInSeconds().
*/ */
TAGLIB_DEPRECATED virtual int length() const; TAGLIB_DEPRECATED virtual int length() const;
@@ -178,9 +176,6 @@ namespace TagLib {
class PropertiesPrivate; class PropertiesPrivate;
PropertiesPrivate *d; PropertiesPrivate *d;
}; };
} // namespace ASF
} } // namespace TagLib
}
#endif #endif

View File

@@ -152,7 +152,8 @@ namespace TagLib {
virtual bool isEmpty() const; virtual bool isEmpty() const;
/*! /*!
* \deprecated * \deprecated Use attributeListMap() const, contains(), removeItem(),
* attribute(), setAttribute(), addAttribute().
*/ */
AttributeListMap &attributeListMap(); AttributeListMap &attributeListMap();
@@ -205,6 +206,6 @@ namespace TagLib {
class TagPrivate; class TagPrivate;
TagPrivate *d; TagPrivate *d;
}; };
} } // namespace ASF
} } // namespace TagLib
#endif #endif

View File

@@ -224,7 +224,7 @@ namespace TagLib {
AttachedPictureFrameV22(const ByteVector &data, Header *h); AttachedPictureFrameV22(const ByteVector &data, Header *h);
friend class FrameFactory; friend class FrameFactory;
}; };
} } // namespace ID3v2
} } // namespace TagLib
#endif #endif

View File

@@ -122,6 +122,6 @@ namespace TagLib {
AudioPropertiesPrivate *d; AudioPropertiesPrivate *d;
}; };
} } // namespace TagLib
#endif #endif

View File

@@ -243,7 +243,7 @@ namespace TagLib {
class ChapterFramePrivate; class ChapterFramePrivate;
ChapterFramePrivate *d; ChapterFramePrivate *d;
}; };
} } // namespace ID3v2
} } // namespace TagLib
#endif #endif

View File

@@ -174,6 +174,6 @@ namespace TagLib {
CommentsFramePrivate *d; CommentsFramePrivate *d;
}; };
} } // namespace ID3v2
} } // namespace TagLib
#endif #endif

View File

@@ -180,6 +180,6 @@ namespace TagLib {
EventTimingCodesFramePrivate *d; EventTimingCodesFramePrivate *d;
}; };
} } // namespace ID3v2
} } // namespace TagLib
#endif #endif

View File

@@ -108,6 +108,16 @@ namespace TagLib {
audioPropertiesStyle = AudioProperties::Average) const = 0; audioPropertiesStyle = AudioProperties::Average) const = 0;
}; };
class TAGLIB_EXPORT StreamTypeResolver : public FileTypeResolver
{
TAGLIB_IGNORE_MISSING_DESTRUCTOR
public:
virtual File *createFileFromStream(IOStream *stream,
bool readAudioProperties = true,
AudioProperties::ReadStyle
audioPropertiesStyle = AudioProperties::Average) const = 0;
};
/*! /*!
* Creates a null FileRef. * Creates a null FileRef.
*/ */
@@ -268,7 +278,7 @@ namespace TagLib {
* \note You generally shouldn't use this method, but instead the constructor * \note You generally shouldn't use this method, but instead the constructor
* directly. * directly.
* *
* \deprecated * \deprecated Use FileRef(FileName, bool, AudioProperties::ReadStyle).
*/ */
static File *create(FileName fileName, static File *create(FileName fileName,
bool readAudioProperties = true, bool readAudioProperties = true,

View File

@@ -238,7 +238,7 @@ namespace TagLib {
* when * when
* *
* \see ID3v2FrameFactory * \see ID3v2FrameFactory
* \deprecated This value should be passed in via the constructor * \deprecated This value should be passed in via the constructor.
*/ */
TAGLIB_DEPRECATED void setID3v2FrameFactory(const ID3v2::FrameFactory *factory); TAGLIB_DEPRECATED void setID3v2FrameFactory(const ID3v2::FrameFactory *factory);
@@ -337,7 +337,7 @@ namespace TagLib {
class FilePrivate; class FilePrivate;
FilePrivate *d; FilePrivate *d;
}; };
} } // namespace FLAC
} } // namespace TagLib
#endif #endif

View File

@@ -31,9 +31,7 @@
#include "taglib_export.h" #include "taglib_export.h"
namespace TagLib { namespace TagLib {
namespace FLAC { namespace FLAC {
class TAGLIB_EXPORT MetadataBlock class TAGLIB_EXPORT MetadataBlock
{ {
public: public:
@@ -67,9 +65,6 @@ namespace TagLib {
class MetadataBlockPrivate; class MetadataBlockPrivate;
MetadataBlockPrivate *d; MetadataBlockPrivate *d;
}; };
} // namespace FLAC
} } // namespace TagLib
}
#endif #endif

View File

@@ -33,9 +33,7 @@
#include "flacmetadatablock.h" #include "flacmetadatablock.h"
namespace TagLib { namespace TagLib {
namespace FLAC { namespace FLAC {
class TAGLIB_EXPORT Picture : public MetadataBlock class TAGLIB_EXPORT Picture : public MetadataBlock
{ {
public: public:
@@ -200,9 +198,6 @@ namespace TagLib {
}; };
typedef List<Picture> PictureList; typedef List<Picture> PictureList;
} // namespace FLAC
} } // namespace TagLib
}
#endif #endif

View File

@@ -70,7 +70,7 @@ namespace TagLib {
* *
* \note This method is just an alias of lengthInSeconds(). * \note This method is just an alias of lengthInSeconds().
* *
* \deprecated * \deprecated Use lengthInSeconds().
*/ */
TAGLIB_DEPRECATED virtual int length() const; TAGLIB_DEPRECATED virtual int length() const;
@@ -118,7 +118,7 @@ namespace TagLib {
* *
* \note This method is just an alias of bitsPerSample(). * \note This method is just an alias of bitsPerSample().
* *
* \deprecated * \deprecated Use bitsPerSample().
*/ */
TAGLIB_DEPRECATED int sampleWidth() const; TAGLIB_DEPRECATED int sampleWidth() const;
@@ -142,7 +142,7 @@ namespace TagLib {
class PropertiesPrivate; class PropertiesPrivate;
PropertiesPrivate *d; PropertiesPrivate *d;
}; };
} } // namespace FLAC
} } // namespace TagLib
#endif #endif

View File

@@ -173,7 +173,7 @@ namespace TagLib {
class GeneralEncapsulatedObjectFramePrivate; class GeneralEncapsulatedObjectFramePrivate;
GeneralEncapsulatedObjectFramePrivate *d; GeneralEncapsulatedObjectFramePrivate *d;
}; };
} } // namespace ID3v2
} } // namespace TagLib
#endif #endif

View File

@@ -60,7 +60,7 @@ namespace TagLib {
* will be returned. * will be returned.
*/ */
int TAGLIB_EXPORT genreIndex(const String &name); int TAGLIB_EXPORT genreIndex(const String &name);
} } // namespace ID3v1
} } // namespace TagLib
#endif #endif

View File

@@ -196,7 +196,7 @@ namespace TagLib {
class TagPrivate; class TagPrivate;
TagPrivate *d; TagPrivate *d;
}; };
} } // namespace ID3v1
} } // namespace TagLib
#endif #endif

View File

@@ -18,7 +18,7 @@ namespace TagLib {
v3 = 3, //<! ID3v2.3 v3 = 3, //<! ID3v2.3
v4 = 4 //<! ID3v2.4 v4 = 4 //<! ID3v2.4
}; };
} } // namespace ID3v2
} } // namespace TagLib
#endif #endif

View File

@@ -88,6 +88,6 @@ namespace TagLib {
ExtendedHeaderPrivate *d; ExtendedHeaderPrivate *d;
}; };
} } // namespace ID3v2
} } // namespace TagLib
#endif #endif

View File

@@ -77,6 +77,6 @@ namespace TagLib {
FooterPrivate *d; FooterPrivate *d;
}; };
} } // namespace ID3v2
} } // namespace TagLib
#endif #endif

View File

@@ -55,6 +55,8 @@ namespace TagLib {
{ {
friend class Tag; friend class Tag;
friend class FrameFactory; friend class FrameFactory;
friend class TableOfContentsFrame;
friend class ChapterFrame;
public: public:
@@ -503,7 +505,7 @@ namespace TagLib {
ByteVector render() const; ByteVector render() const;
/*! /*!
* \deprecated * \deprecated Use fileAlterPreservation().
*/ */
TAGLIB_DEPRECATED bool frameAlterPreservation() const; TAGLIB_DEPRECATED bool frameAlterPreservation() const;
@@ -515,7 +517,7 @@ namespace TagLib {
HeaderPrivate *d; HeaderPrivate *d;
}; };
} } // namespace ID3v2
} } // namespace TagLib
#endif #endif

View File

@@ -87,7 +87,7 @@ namespace TagLib {
TAGLIB_DEPRECATED Frame *createFrame(const ByteVector &data, unsigned int version = 4) const; TAGLIB_DEPRECATED Frame *createFrame(const ByteVector &data, unsigned int version = 4) const;
/*! /*!
* \deprecated * \deprecated Use createFrame(const ByteVector &, const Header *) const.
*/ */
// BIC: remove // BIC: remove
Frame *createFrame(const ByteVector &data, Header *tagHeader) const; Frame *createFrame(const ByteVector &data, Header *tagHeader) const;
@@ -163,7 +163,7 @@ namespace TagLib {
FrameFactoryPrivate *d; FrameFactoryPrivate *d;
}; };
} } // namespace ID3v2
} } // namespace TagLib
#endif #endif

View File

@@ -170,7 +170,7 @@ namespace TagLib {
HeaderPrivate *d; HeaderPrivate *d;
}; };
} } // namespace ID3v2
} } // namespace TagLib
#endif #endif

View File

@@ -62,9 +62,9 @@ namespace TagLib {
* Convert the data from unsynchronized data to its original format. * Convert the data from unsynchronized data to its original format.
*/ */
TAGLIB_EXPORT ByteVector decode(const ByteVector &input); TAGLIB_EXPORT ByteVector decode(const ByteVector &input);
} } // namespace SynchData
} } // namespace ID3v2
} } // namespace TagLib
#endif #endif

View File

@@ -338,7 +338,7 @@ namespace TagLib {
ByteVector render() const; ByteVector render() const;
/*! /*!
* \deprecated * \deprecated Use render(Version) const.
*/ */
TAGLIB_DEPRECATED ByteVector render(int version) const; TAGLIB_DEPRECATED ByteVector render(int version) const;
@@ -405,7 +405,7 @@ namespace TagLib {
TagPrivate *d; TagPrivate *d;
}; };
} } // namespace ID3v2
} } // namespace TagLib
#endif #endif

View File

@@ -186,7 +186,8 @@ namespace TagLib {
class TagPrivate; class TagPrivate;
TagPrivate *d; TagPrivate *d;
}; };
}} } // namespace Info
} } // namespace RIFF
} // namespace TagLib
#endif #endif

View File

@@ -103,7 +103,7 @@ namespace TagLib {
class FilePrivate; class FilePrivate;
FilePrivate *d; FilePrivate *d;
}; };
} } // namespace IT
} } // namespace TagLib
#endif #endif

View File

@@ -101,7 +101,7 @@ namespace TagLib {
class PropertiesPrivate; class PropertiesPrivate;
PropertiesPrivate *d; PropertiesPrivate *d;
}; };
} } // namespace IT
} } // namespace TagLib
#endif #endif

View File

@@ -34,9 +34,7 @@
#include "modproperties.h" #include "modproperties.h"
namespace TagLib { namespace TagLib {
namespace Mod { namespace Mod {
class TAGLIB_EXPORT File : public TagLib::Mod::FileBase class TAGLIB_EXPORT File : public TagLib::Mod::FileBase
{ {
public: public:
@@ -106,9 +104,6 @@ namespace TagLib {
class FilePrivate; class FilePrivate;
FilePrivate *d; FilePrivate *d;
}; };
} // namespace Mod
} } // namespace TagLib
}
#endif #endif

View File

@@ -35,9 +35,7 @@
#include <algorithm> #include <algorithm>
namespace TagLib { namespace TagLib {
namespace Mod { namespace Mod {
class TAGLIB_EXPORT FileBase : public TagLib::File class TAGLIB_EXPORT FileBase : public TagLib::File
{ {
protected: protected:
@@ -58,9 +56,6 @@ namespace TagLib {
bool readU16B(unsigned short &number); bool readU16B(unsigned short &number);
bool readU32B(unsigned long &number); bool readU32B(unsigned long &number);
}; };
} // namespace Mod
} } // namespace TagLib
}
#endif #endif

View File

@@ -30,9 +30,7 @@
#include "audioproperties.h" #include "audioproperties.h"
namespace TagLib { namespace TagLib {
namespace Mod { namespace Mod {
class TAGLIB_EXPORT Properties : public AudioProperties class TAGLIB_EXPORT Properties : public AudioProperties
{ {
public: public:
@@ -63,9 +61,6 @@ namespace TagLib {
class PropertiesPrivate; class PropertiesPrivate;
PropertiesPrivate *d; PropertiesPrivate *d;
}; };
} // namespace Mod
} } // namespace TagLib
}
#endif #endif

View File

@@ -29,9 +29,7 @@
#include "tag.h" #include "tag.h"
namespace TagLib { namespace TagLib {
namespace Mod { namespace Mod {
/*! /*!
* Tags for module files (Mod, S3M, IT, XM). * Tags for module files (Mod, S3M, IT, XM).
* *
@@ -186,9 +184,6 @@ namespace TagLib {
class TagPrivate; class TagPrivate;
TagPrivate *d; TagPrivate *d;
}; };
} // namespace Mod
} } // namespace TagLib
}
#endif #endif

View File

@@ -34,9 +34,7 @@
#include "tlist.h" #include "tlist.h"
namespace TagLib { namespace TagLib {
namespace MP4 { namespace MP4 {
class Atom; class Atom;
typedef TagLib::List<Atom *> AtomList; typedef TagLib::List<Atom *> AtomList;
@@ -74,7 +72,7 @@ namespace TagLib {
typedef TagLib::List<AtomData> AtomDataList; typedef TagLib::List<AtomData> AtomDataList;
class Atom class TAGLIB_EXPORT Atom
{ {
public: public:
Atom(File *file); Atom(File *file);
@@ -88,11 +86,11 @@ namespace TagLib {
AtomList children; AtomList children;
private: private:
static const int numContainers = 11; static const int numContainers = 11;
static const char *containers[11]; static const char *const containers[11];
}; };
//! Root-level atoms //! Root-level atoms
class Atoms class TAGLIB_EXPORT Atoms
{ {
public: public:
Atoms(File *file); Atoms(File *file);
@@ -101,10 +99,8 @@ namespace TagLib {
AtomList path(const char *name1, const char *name2 = 0, const char *name3 = 0, const char *name4 = 0); AtomList path(const char *name1, const char *name2 = 0, const char *name3 = 0, const char *name4 = 0);
AtomList atoms; AtomList atoms;
}; };
} // namespace MP4
} } // namespace TagLib
}
#endif #endif

View File

@@ -32,9 +32,7 @@
#include "mp4atom.h" #include "mp4atom.h"
namespace TagLib { namespace TagLib {
namespace MP4 { namespace MP4 {
class TAGLIB_EXPORT CoverArt class TAGLIB_EXPORT CoverArt
{ {
public: public:
@@ -76,9 +74,6 @@ namespace TagLib {
}; };
typedef List<CoverArt> CoverArtList; typedef List<CoverArt> CoverArtList;
} // namespace MP4
} } // namespace TagLib
}
#endif #endif

View File

@@ -33,10 +33,8 @@
#include "mp4tag.h" #include "mp4tag.h"
namespace TagLib { namespace TagLib {
//! An implementation of MP4 (AAC, ALAC, ...) metadata //! An implementation of MP4 (AAC, ALAC, ...) metadata
namespace MP4 { namespace MP4 {
class Atoms; class Atoms;
/*! /*!
@@ -48,6 +46,19 @@ namespace TagLib {
class TAGLIB_EXPORT File : public TagLib::File class TAGLIB_EXPORT File : public TagLib::File
{ {
public: public:
/*!
* This set of flags is used for strip() and is suitable for
* being OR-ed together.
*/
enum TagTypes {
//! Empty set. Matches no tag types.
NoTags = 0x0000,
//! Matches MP4 tags.
MP4 = 0x0001,
//! Matches all tag types.
AllTags = 0xffff
};
/*! /*!
* Constructs an MP4 file from \a file. If \a readProperties is true the * Constructs an MP4 file from \a file. If \a readProperties is true the
* file's audio properties will also be read. * file's audio properties will also be read.
@@ -114,6 +125,15 @@ namespace TagLib {
*/ */
bool save(); bool save();
/*!
* This will strip the tags that match the OR-ed together TagTypes from the
* file. By default it strips all tags. It returns true if the tags are
* successfully stripped.
*
* \note This will update the file immediately.
*/
bool strip(int tags = AllTags);
/*! /*!
* Returns whether or not the file on disk actually has an MP4 tag, or the * Returns whether or not the file on disk actually has an MP4 tag, or the
* file has a Metadata Item List (ilst) atom. * file has a Metadata Item List (ilst) atom.
@@ -135,9 +155,6 @@ namespace TagLib {
class FilePrivate; class FilePrivate;
FilePrivate *d; FilePrivate *d;
}; };
} // namespace MP4
} } // namespace TagLib
}
#endif #endif

View File

@@ -31,9 +31,7 @@
#include "taglib_export.h" #include "taglib_export.h"
namespace TagLib { namespace TagLib {
namespace MP4 { namespace MP4 {
class TAGLIB_EXPORT Item class TAGLIB_EXPORT Item
{ {
public: public:
@@ -85,9 +83,6 @@ namespace TagLib {
class ItemPrivate; class ItemPrivate;
ItemPrivate *d; ItemPrivate *d;
}; };
} // namespace MP4
} } // namespace TagLib
}
#endif #endif

View File

@@ -30,9 +30,7 @@
#include "audioproperties.h" #include "audioproperties.h"
namespace TagLib { namespace TagLib {
namespace MP4 { namespace MP4 {
class Atoms; class Atoms;
class File; class File;
@@ -55,7 +53,7 @@ namespace TagLib {
* *
* \note This method is just an alias of lengthInSeconds(). * \note This method is just an alias of lengthInSeconds().
* *
* \deprecated * \deprecated Use lengthInSeconds().
*/ */
TAGLIB_DEPRECATED virtual int length() const; TAGLIB_DEPRECATED virtual int length() const;
@@ -112,9 +110,6 @@ namespace TagLib {
class PropertiesPrivate; class PropertiesPrivate;
PropertiesPrivate *d; PropertiesPrivate *d;
}; };
} // namespace MP4
} } // namespace TagLib
}
#endif #endif

View File

@@ -36,11 +36,9 @@
#include "mp4item.h" #include "mp4item.h"
namespace TagLib { namespace TagLib {
namespace MP4 { namespace MP4 {
/*! /*!
* \deprecated * \deprecated Use ItemMap.
*/ */
TAGLIB_DEPRECATED typedef TagLib::Map<String, Item> ItemListMap; TAGLIB_DEPRECATED typedef TagLib::Map<String, Item> ItemListMap;
typedef TagLib::Map<String, Item> ItemMap; typedef TagLib::Map<String, Item> ItemMap;
@@ -72,7 +70,7 @@ namespace TagLib {
virtual bool isEmpty() const; virtual bool isEmpty() const;
/*! /*!
* \deprecated Use the item() and setItem() API instead * \deprecated Use the item() and setItem() API instead.
*/ */
TAGLIB_DEPRECATED ItemMap &itemListMap(); TAGLIB_DEPRECATED ItemMap &itemListMap();
@@ -102,6 +100,11 @@ namespace TagLib {
*/ */
bool contains(const String &key) const; bool contains(const String &key) const;
/*!
* Saves the associated file with the tag stripped.
*/
bool strip();
PropertyMap properties() const; PropertyMap properties() const;
void removeUnsupportedProperties(const StringList& properties); void removeUnsupportedProperties(const StringList& properties);
PropertyMap setProperties(const PropertyMap &properties); PropertyMap setProperties(const PropertyMap &properties);
@@ -156,9 +159,6 @@ namespace TagLib {
class TagPrivate; class TagPrivate;
TagPrivate *d; TagPrivate *d;
}; };
} // namespace MP4
} } // namespace TagLib
}
#endif #endif

View File

@@ -195,7 +195,7 @@ namespace TagLib {
void strip(int tags = AllTags); void strip(int tags = AllTags);
/*! /*!
* \deprecated * \deprecated Use strip().
* \see strip * \see strip
*/ */
TAGLIB_DEPRECATED void remove(int tags = AllTags); TAGLIB_DEPRECATED void remove(int tags = AllTags);
@@ -232,7 +232,7 @@ namespace TagLib {
class FilePrivate; class FilePrivate;
FilePrivate *d; FilePrivate *d;
}; };
} } // namespace MPC
} } // namespace TagLib
#endif #endif

View File

@@ -72,7 +72,7 @@ namespace TagLib {
* *
* \note This method is just an alias of lengthInSeconds(). * \note This method is just an alias of lengthInSeconds().
* *
* \deprecated * \deprecated Use lengthInSeconds().
*/ */
TAGLIB_DEPRECATED virtual int length() const; TAGLIB_DEPRECATED virtual int length() const;
@@ -152,7 +152,7 @@ namespace TagLib {
class PropertiesPrivate; class PropertiesPrivate;
PropertiesPrivate *d; PropertiesPrivate *d;
}; };
} } // namespace MPC
} } // namespace TagLib
#endif #endif

View File

@@ -193,19 +193,19 @@ namespace TagLib {
bool save(int tags); bool save(int tags);
/*! /*!
* \deprecated * \deprecated Use save(int, StripTags, ID3v2::Version, DuplicateTags).
*/ */
// BIC: combine with the above method // BIC: combine with the above method
TAGLIB_DEPRECATED bool save(int tags, bool stripOthers); TAGLIB_DEPRECATED bool save(int tags, bool stripOthers);
/*! /*!
* \deprecated * \deprecated Use save(int, StripTags, ID3v2::Version, DuplicateTags).
*/ */
// BIC: combine with the above method // BIC: combine with the above method
TAGLIB_DEPRECATED bool save(int tags, bool stripOthers, int id3v2Version); TAGLIB_DEPRECATED bool save(int tags, bool stripOthers, int id3v2Version);
/*! /*!
* \deprecated * \deprecated Use save(int, StripTags, ID3v2::Version, DuplicateTags).
*/ */
// BIC: combine with the above method // BIC: combine with the above method
TAGLIB_DEPRECATED bool save(int tags, bool stripOthers, int id3v2Version, bool duplicateTags); TAGLIB_DEPRECATED bool save(int tags, bool stripOthers, int id3v2Version, bool duplicateTags);
@@ -315,7 +315,7 @@ namespace TagLib {
* Set the ID3v2::FrameFactory to something other than the default. * Set the ID3v2::FrameFactory to something other than the default.
* *
* \see ID3v2FrameFactory * \see ID3v2FrameFactory
* \deprecated This value should be passed in via the constructor * \deprecated This value should be passed in via the constructor.
*/ */
TAGLIB_DEPRECATED void setID3v2FrameFactory(const ID3v2::FrameFactory *factory); TAGLIB_DEPRECATED void setID3v2FrameFactory(const ID3v2::FrameFactory *factory);
@@ -381,7 +381,7 @@ namespace TagLib {
class FilePrivate; class FilePrivate;
FilePrivate *d; FilePrivate *d;
}; };
} } // namespace MPEG
} } // namespace TagLib
#endif #endif

View File

@@ -50,7 +50,7 @@ namespace TagLib {
/*! /*!
* Parses an MPEG header based on \a data. * Parses an MPEG header based on \a data.
* *
* \deprecated * \deprecated Use Header(File *, long, bool).
*/ */
TAGLIB_DEPRECATED Header(const ByteVector &data); TAGLIB_DEPRECATED Header(const ByteVector &data);
@@ -172,7 +172,7 @@ namespace TagLib {
class HeaderPrivate; class HeaderPrivate;
HeaderPrivate *d; HeaderPrivate *d;
}; };
} } // namespace MPEG
} } // namespace TagLib
#endif #endif

View File

@@ -65,7 +65,7 @@ namespace TagLib {
* *
* \note This method is just an alias of lengthInSeconds(). * \note This method is just an alias of lengthInSeconds().
* *
* \deprecated * \deprecated Use lengthInSeconds().
*/ */
TAGLIB_DEPRECATED virtual int length() const; TAGLIB_DEPRECATED virtual int length() const;
@@ -146,7 +146,7 @@ namespace TagLib {
class PropertiesPrivate; class PropertiesPrivate;
PropertiesPrivate *d; PropertiesPrivate *d;
}; };
} } // namespace MPEG
} } // namespace TagLib
#endif #endif

View File

@@ -121,7 +121,7 @@ namespace TagLib {
FilePrivate *d; FilePrivate *d;
}; };
} } // namespace Ogg
} } // namespace TagLib
#endif #endif

View File

@@ -223,6 +223,6 @@ namespace TagLib {
class PagePrivate; class PagePrivate;
PagePrivate *d; PagePrivate *d;
}; };
} } // namespace Ogg
} } // namespace TagLib
#endif #endif

View File

@@ -226,7 +226,7 @@ namespace TagLib {
PageHeaderPrivate *d; PageHeaderPrivate *d;
}; };
} } // namespace Ogg
} } // namespace TagLib
#endif #endif

View File

@@ -131,8 +131,8 @@ namespace TagLib {
class FilePrivate; class FilePrivate;
FilePrivate *d; FilePrivate *d;
}; };
} } // namespace Opus
} } // namespace Ogg
} } // namespace TagLib
#endif #endif

View File

@@ -67,7 +67,7 @@ namespace TagLib {
* *
* \note This method is just an alias of lengthInSeconds(). * \note This method is just an alias of lengthInSeconds().
* *
* \deprecated * \deprecated Use lengthInSeconds().
*/ */
TAGLIB_DEPRECATED virtual int length() const; TAGLIB_DEPRECATED virtual int length() const;
@@ -127,8 +127,8 @@ namespace TagLib {
class PropertiesPrivate; class PropertiesPrivate;
PropertiesPrivate *d; PropertiesPrivate *d;
}; };
} } // namespace Opus
} } // namespace Ogg
} } // namespace TagLib
#endif #endif

View File

@@ -146,6 +146,6 @@ namespace TagLib {
OwnershipFramePrivate *d; OwnershipFramePrivate *d;
}; };
} } // namespace ID3v2
} } // namespace TagLib
#endif #endif

View File

@@ -77,6 +77,6 @@ namespace TagLib {
PodcastFramePrivate *d; PodcastFramePrivate *d;
}; };
} } // namespace ID3v2
} } // namespace TagLib
#endif #endif

View File

@@ -127,6 +127,6 @@ namespace TagLib {
PopularimeterFramePrivate *d; PopularimeterFramePrivate *d;
}; };
} } // namespace ID3v2
} } // namespace TagLib
#endif #endif

View File

@@ -106,6 +106,6 @@ namespace TagLib {
PrivateFramePrivate *d; PrivateFramePrivate *d;
}; };
} } // namespace ID3v2
} } // namespace TagLib
#endif #endif

View File

@@ -269,6 +269,6 @@ namespace TagLib {
RelativeVolumeFramePrivate *d; RelativeVolumeFramePrivate *d;
}; };
} } // namespace ID3v2
} } // namespace TagLib
#endif #endif

View File

@@ -155,7 +155,7 @@ namespace TagLib {
class FilePrivate; class FilePrivate;
FilePrivate *d; FilePrivate *d;
}; };
} } // namespace RIFF
} } // namespace TagLib
#endif #endif

View File

@@ -106,7 +106,7 @@ namespace TagLib {
class FilePrivate; class FilePrivate;
FilePrivate *d; FilePrivate *d;
}; };
} } // namespace S3M
} } // namespace TagLib
#endif #endif

View File

@@ -88,7 +88,7 @@ namespace TagLib {
class PropertiesPrivate; class PropertiesPrivate;
PropertiesPrivate *d; PropertiesPrivate *d;
}; };
} } // namespace S3M
} } // namespace TagLib
#endif #endif

View File

@@ -131,8 +131,8 @@ namespace TagLib {
class FilePrivate; class FilePrivate;
FilePrivate *d; FilePrivate *d;
}; };
} } // namespace Speex
} } // namespace Ogg
} } // namespace TagLib
#endif #endif

View File

@@ -67,7 +67,7 @@ namespace TagLib {
* *
* \note This method is just an alias of lengthInSeconds(). * \note This method is just an alias of lengthInSeconds().
* *
* \deprecated * \deprecated Use lengthInSeconds().
*/ */
TAGLIB_DEPRECATED virtual int length() const; TAGLIB_DEPRECATED virtual int length() const;
@@ -122,8 +122,8 @@ namespace TagLib {
class PropertiesPrivate; class PropertiesPrivate;
PropertiesPrivate *d; PropertiesPrivate *d;
}; };
} } // namespace Speex
} } // namespace Ogg
} } // namespace TagLib
#endif #endif

View File

@@ -226,6 +226,6 @@ namespace TagLib {
SynchronizedLyricsFramePrivate *d; SynchronizedLyricsFramePrivate *d;
}; };
} } // namespace ID3v2
} } // namespace TagLib
#endif #endif

View File

@@ -254,7 +254,7 @@ namespace TagLib {
class TableOfContentsFramePrivate; class TableOfContentsFramePrivate;
TableOfContentsFramePrivate *d; TableOfContentsFramePrivate *d;
}; };
} } // namespace ID3v2
} } // namespace TagLib
#endif #endif

View File

@@ -196,6 +196,6 @@ namespace TagLib {
class TagPrivate; class TagPrivate;
TagPrivate *d; TagPrivate *d;
}; };
} } // namespace TagLib
#endif #endif

View File

@@ -29,8 +29,8 @@
#include "taglib_config.h" #include "taglib_config.h"
#define TAGLIB_MAJOR_VERSION 1 #define TAGLIB_MAJOR_VERSION 1
#define TAGLIB_MINOR_VERSION 12 #define TAGLIB_MINOR_VERSION 13
#define TAGLIB_PATCH_VERSION 0 #define TAGLIB_PATCH_VERSION 1
#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 1)) || defined(__clang__) #if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 1)) || defined(__clang__)
#define TAGLIB_IGNORE_MISSING_DESTRUCTOR _Pragma("GCC diagnostic ignored \"-Wnon-virtual-dtor\"") #define TAGLIB_IGNORE_MISSING_DESTRUCTOR _Pragma("GCC diagnostic ignored \"-Wnon-virtual-dtor\"")
@@ -84,7 +84,7 @@ namespace TagLib {
* so I'm providing something here that should be constant. * so I'm providing something here that should be constant.
*/ */
typedef std::basic_string<wchar_t> wstring; typedef std::basic_string<wchar_t> wstring;
} } // namespace TagLib
/*! /*!
* \mainpage TagLib * \mainpage TagLib

View File

@@ -278,7 +278,7 @@ namespace TagLib {
* *
* \see isEmpty() * \see isEmpty()
* *
* \deprecated * \deprecated Use isEmpty(), do not differentiate between null and empty.
*/ */
// BIC: remove // BIC: remove
TAGLIB_DEPRECATED bool isNull() const; TAGLIB_DEPRECATED bool isNull() const;
@@ -592,7 +592,7 @@ namespace TagLib {
* \warning Do not modify this variable. It will mess up the internal state * \warning Do not modify this variable. It will mess up the internal state
* of TagLib. * of TagLib.
* *
* \deprecated * \deprecated Use ByteVector().
*/ */
// BIC: remove // BIC: remove
TAGLIB_DEPRECATED static ByteVector null; TAGLIB_DEPRECATED static ByteVector null;
@@ -624,7 +624,7 @@ namespace TagLib {
class ByteVectorPrivate; class ByteVectorPrivate;
ByteVectorPrivate *d; ByteVectorPrivate *d;
}; };
} } // namespace TagLib
/*! /*!
* \relates TagLib::ByteVector * \relates TagLib::ByteVector

View File

@@ -86,6 +86,6 @@ namespace TagLib {
ByteVectorListPrivate *d; ByteVectorListPrivate *d;
}; };
} } // namespace TagLib
#endif #endif

View File

@@ -140,6 +140,6 @@ namespace TagLib {
ByteVectorStreamPrivate *d; ByteVectorStreamPrivate *d;
}; };
} } // namespace TagLib
#endif #endif

View File

@@ -69,6 +69,6 @@ namespace TagLib
* \see DebugListener * \see DebugListener
*/ */
TAGLIB_EXPORT void setDebugListener(DebugListener *listener); TAGLIB_EXPORT void setDebugListener(DebugListener *listener);
} } // namespace TagLib
#endif #endif

View File

@@ -308,6 +308,6 @@ namespace TagLib {
UserTextIdentificationFramePrivate *d; UserTextIdentificationFramePrivate *d;
}; };
} } // namespace ID3v2
} } // namespace TagLib
#endif #endif

View File

@@ -261,14 +261,14 @@ namespace TagLib {
* Returns true if \a file can be opened for reading. If the file does not * Returns true if \a file can be opened for reading. If the file does not
* exist, this will return false. * exist, this will return false.
* *
* \deprecated * \deprecated Use system functions, e.g. access() (_access_s() on Windows).
*/ */
TAGLIB_DEPRECATED static bool isReadable(const char *file); TAGLIB_DEPRECATED static bool isReadable(const char *file);
/*! /*!
* Returns true if \a file can be opened for writing. * Returns true if \a file can be opened for writing.
* *
* \deprecated * \deprecated Use system functions, e.g. access() (_access_s() on Windows).
*/ */
TAGLIB_DEPRECATED static bool isWritable(const char *name); TAGLIB_DEPRECATED static bool isWritable(const char *name);
@@ -318,6 +318,6 @@ namespace TagLib {
FilePrivate *d; FilePrivate *d;
}; };
} } // namespace TagLib
#endif #endif

View File

@@ -154,6 +154,6 @@ namespace TagLib {
FileStreamPrivate *d; FileStreamPrivate *d;
}; };
} } // namespace TagLib
#endif #endif

View File

@@ -165,6 +165,6 @@ namespace TagLib {
IOStream &operator=(const IOStream &); IOStream &operator=(const IOStream &);
}; };
} } // namespace TagLib
#endif #endif

View File

@@ -260,7 +260,7 @@ namespace TagLib {
#endif #endif
}; };
} } // namespace TagLib
// Since GCC doesn't support the "export" keyword, we have to include the // Since GCC doesn't support the "export" keyword, we have to include the
// implementation. // implementation.

View File

@@ -153,6 +153,14 @@ namespace TagLib {
*/ */
Map<Key, T> &erase(const Key &key); Map<Key, T> &erase(const Key &key);
/*!
* Returns the value associated with \a key.
*
* If the map does not contain \a key, it returns defaultValue.
* If no defaultValue is specified, it returns a default-constructed value.
*/
T value(const Key &key, const T &defaultValue = T()) const;
/*! /*!
* Returns a reference to the value associated with \a key. * Returns a reference to the value associated with \a key.
* *
@@ -194,7 +202,7 @@ namespace TagLib {
#endif #endif
}; };
} } // namespace TagLib
// Since GCC doesn't support the "export" keyword, we have to include the // Since GCC doesn't support the "export" keyword, we have to include the
// implementation. // implementation.

View File

@@ -155,6 +155,13 @@ unsigned int Map<Key, T>::size() const
return static_cast<unsigned int>(d->map.size()); return static_cast<unsigned int>(d->map.size());
} }
template <class Key, class T>
T Map<Key, T>::value(const Key &key, const T &defaultValue) const
{
ConstIterator it = d->map.find(key);
return it != d->map.end() ? it->second : defaultValue;
}
template <class Key, class T> template <class Key, class T>
const T &Map<Key, T>::operator[](const Key &key) const const T &Map<Key, T>::operator[](const Key &key) const
{ {

View File

@@ -29,6 +29,11 @@
#include "tmap.h" #include "tmap.h"
#include "tstringlist.h" #include "tstringlist.h"
#ifdef _MSC_VER
// Explained at end of tpropertymap.cpp
extern template class TAGLIB_EXPORT TagLib::Map<TagLib::String, TagLib::StringList>;
#endif
namespace TagLib { namespace TagLib {
typedef Map<String,StringList> SimplePropertyMap; typedef Map<String,StringList> SimplePropertyMap;
@@ -186,6 +191,15 @@ namespace TagLib {
*/ */
PropertyMap &merge(const PropertyMap &other); PropertyMap &merge(const PropertyMap &other);
/*!
* Returns the value associated with \a key.
*
* If the map does not contain \a key, it returns defaultValue.
* If no defaultValue is specified, it returns an empty string list.
*/
StringList value(const String &key,
const StringList &defaultValue = StringList()) const;
/*! /*!
* Returns a reference to the value associated with \a key. * Returns a reference to the value associated with \a key.
* *
@@ -238,5 +252,5 @@ namespace TagLib {
StringList unsupported; StringList unsupported;
}; };
} } // namespace TagLib
#endif /* TAGLIB_PROPERTYMAP_H_ */ #endif /* TAGLIB_PROPERTYMAP_H_ */

View File

@@ -107,7 +107,7 @@ namespace TagLib
#endif #endif
}; };
} } // namespace TagLib
#endif // DO_NOT_DOCUMENT #endif // DO_NOT_DOCUMENT
#endif #endif

View File

@@ -164,7 +164,7 @@ namespace TagLib {
* Set the ID3v2::FrameFactory to something other than the default. * Set the ID3v2::FrameFactory to something other than the default.
* *
* \see ID3v2FrameFactory * \see ID3v2FrameFactory
* \deprecated This value should be passed in via the constructor * \deprecated This value should be passed in via the constructor.
*/ */
TAGLIB_DEPRECATED void setID3v2FrameFactory(const ID3v2::FrameFactory *factory); TAGLIB_DEPRECATED void setID3v2FrameFactory(const ID3v2::FrameFactory *factory);
@@ -253,7 +253,7 @@ namespace TagLib {
class FilePrivate; class FilePrivate;
FilePrivate *d; FilePrivate *d;
}; };
} } // namespace TrueAudio
} } // namespace TagLib
#endif #endif

View File

@@ -36,8 +36,6 @@ namespace TagLib {
namespace TrueAudio { namespace TrueAudio {
class File;
static const unsigned int HeaderSize = 18; static const unsigned int HeaderSize = 18;
//! An implementation of audio property reading for TrueAudio //! An implementation of audio property reading for TrueAudio
@@ -67,7 +65,7 @@ namespace TagLib {
* *
* \note This method is just an alias of lengthInSeconds(). * \note This method is just an alias of lengthInSeconds().
* *
* \deprecated * \deprecated Use lengthInSeconds().
*/ */
TAGLIB_DEPRECATED virtual int length() const; TAGLIB_DEPRECATED virtual int length() const;
@@ -127,7 +125,7 @@ namespace TagLib {
class PropertiesPrivate; class PropertiesPrivate;
PropertiesPrivate *d; PropertiesPrivate *d;
}; };
} } // namespace TrueAudio
} } // namespace TagLib
#endif #endif

View File

@@ -45,7 +45,7 @@
#if defined(QT_VERSION) && (QT_VERSION >= 0x040000) #if defined(QT_VERSION) && (QT_VERSION >= 0x040000)
#define QStringToTString(s) TagLib::String(s.toUtf8().data(), TagLib::String::UTF8) #define QStringToTString(s) TagLib::String(s.toUtf8().data(), TagLib::String::UTF8)
#else #else
#define QStringToTString(s) TagLib::String(s.utf8().data(), TagLib::String::UTF8) #define QStringToTString(s) TagLib::String((s).utf8().data(), TagLib::String::UTF8)
#endif #endif
/*! /*!
@@ -58,7 +58,7 @@
* *
*/ */
#define TStringToQString(s) QString::fromUtf8(s.toCString(true)) #define TStringToQString(s) QString::fromUtf8((s).toCString(true))
namespace TagLib { namespace TagLib {
@@ -337,7 +337,7 @@ namespace TagLib {
* *
* \see isEmpty() * \see isEmpty()
* *
* \deprecated * \deprecated Use isEmpty(), do not differentiate between null and empty.
*/ */
// BIC: remove // BIC: remove
TAGLIB_DEPRECATED bool isNull() const; TAGLIB_DEPRECATED bool isNull() const;
@@ -522,7 +522,7 @@ namespace TagLib {
* \warning Do not modify this variable. It will mess up the internal state * \warning Do not modify this variable. It will mess up the internal state
* of TagLib. * of TagLib.
* *
* \deprecated * \deprecated Use String().
*/ */
// BIC: remove // BIC: remove
TAGLIB_DEPRECATED static String null; TAGLIB_DEPRECATED static String null;
@@ -546,28 +546,28 @@ namespace TagLib {
class StringPrivate; class StringPrivate;
StringPrivate *d; StringPrivate *d;
}; };
} } // namespace TagLib
/*! /*!
* \relates TagLib::String * \relates TagLib::String
* *
* Concatenates \a s1 and \a s2 and returns the result as a string. * Concatenates \a s1 and \a s2 and returns the result as a string.
*/ */
TAGLIB_EXPORT const TagLib::String operator+(const TagLib::String &s1, const TagLib::String &s2); TAGLIB_EXPORT TagLib::String operator+(const TagLib::String &s1, const TagLib::String &s2);
/*! /*!
* \relates TagLib::String * \relates TagLib::String
* *
* Concatenates \a s1 and \a s2 and returns the result as a string. * Concatenates \a s1 and \a s2 and returns the result as a string.
*/ */
TAGLIB_EXPORT const TagLib::String operator+(const char *s1, const TagLib::String &s2); TAGLIB_EXPORT TagLib::String operator+(const char *s1, const TagLib::String &s2);
/*! /*!
* \relates TagLib::String * \relates TagLib::String
* *
* Concatenates \a s1 and \a s2 and returns the result as a string. * Concatenates \a s1 and \a s2 and returns the result as a string.
*/ */
TAGLIB_EXPORT const TagLib::String operator+(const TagLib::String &s1, const char *s2); TAGLIB_EXPORT TagLib::String operator+(const TagLib::String &s1, const char *s2);
/*! /*!

View File

@@ -104,12 +104,12 @@ namespace TagLib {
StringListPrivate *d; StringListPrivate *d;
}; };
} } // namespace TagLib
/*! /*!
* \related TagLib::StringList * \related TagLib::StringList
* Send the StringList to an output stream. * Send the StringList to an output stream.
*/ */
std::ostream &operator<<(std::ostream &s, const TagLib::StringList &l); std::ostream TAGLIB_EXPORT &operator<<(std::ostream &s, const TagLib::StringList &l);
#endif #endif

View File

@@ -117,7 +117,7 @@ namespace TagLib {
class UniqueFileIdentifierFramePrivate; class UniqueFileIdentifierFramePrivate;
UniqueFileIdentifierFramePrivate *d; UniqueFileIdentifierFramePrivate *d;
}; };
} } // namespace ID3v2
} } // namespace TagLib
#endif #endif

View File

@@ -74,6 +74,6 @@ namespace TagLib {
UnknownFramePrivate *d; UnknownFramePrivate *d;
}; };
} } // namespace ID3v2
} } // namespace TagLib
#endif #endif

View File

@@ -174,6 +174,6 @@ namespace TagLib {
UnsynchronizedLyricsFramePrivate *d; UnsynchronizedLyricsFramePrivate *d;
}; };
} } // namespace ID3v2
} } // namespace TagLib
#endif #endif

View File

@@ -185,6 +185,6 @@ namespace TagLib {
UserUrlLinkFramePrivate *d; UserUrlLinkFramePrivate *d;
}; };
} } // namespace ID3v2
} } // namespace TagLib
#endif #endif

View File

@@ -138,7 +138,7 @@ namespace TagLib {
class FilePrivate; class FilePrivate;
FilePrivate *d; FilePrivate *d;
}; };
} } // namespace Vorbis
/* /*
* To keep compatibility with the current version put Vorbis in the Ogg namespace * To keep compatibility with the current version put Vorbis in the Ogg namespace
@@ -152,6 +152,6 @@ namespace TagLib {
namespace Ogg { namespace Vorbis { typedef TagLib::Vorbis::File File; } } namespace Ogg { namespace Vorbis { typedef TagLib::Vorbis::File File; } }
#endif #endif
} } // namespace TagLib
#endif #endif

Some files were not shown because too many files have changed in this diff Show More