15 Commits
1.0 ... 1.2.1

116 changed files with 601 additions and 453 deletions

7
.gitignore vendored
View File

@@ -1,2 +1,5 @@
ncmdump*.exe *.exe
ncmdump ncmdump
.vscode
.idea

21
LICENSE.txt Normal file
View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) [year] [fullname]
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -1,11 +1,24 @@
default:
@echo "Please choose a platform: linux, macos-intel, macos-arm64, win32"
@echo "Or use 'make clean' to clean up the build files"
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: 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
macos-arm64:export CPATH=/opt/homebrew/include
macos-arm64:export LIBRARY_PATH=/opt/homebrew/lib
macos-arm64:
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:
rm -f ncmdump ncmdump.exe

View File

@@ -1,17 +1,48 @@
# ncmdump
使用本程序可将下载的网易云音乐缓存文件ncm转换为 mp3 或 flac 格式
## 简介 ## 简介
该版本为最早的 C++ 版本,也是作者开发的市面上第一个支持 ncm 转换的程序 该版本为最早的 C++ 版本,也是作者开发的市面上第一个支持 ncm 转换的程序
源码复刻自 anonymous5l/ncmdump感谢前辈的付出 源码复刻自 anonymous5l/ncmdump感谢前辈的付出
做了 Windows 下的移植,修复了一些编译问题 做了 Windows 下的移植,修复了一些编译问题
## 便捷式传送门 ## 传送门
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
```
## 依赖库及不同平台编译方法
### 依赖库
* taglib * taglib
### Linux / macOS ### Linux / macOS
```shell ```shell
# CentOS # CentOS
yum install taglib-devel yum install taglib-devel
@@ -21,9 +52,13 @@ make linux
apt install libtag1-dev apt install libtag1-dev
make linux make linux
# macOS # macOS with Intel chip
brew install taglib brew install taglib
make macos make macos-intel
# macOS with Apple Silicon (M1 / M2)
brew install taglib
make macos-arm64
``` ```
注意Linux / macOS 为动态库支持Linux 下静态编译需要手动编译 taglib 静态库macOS 原生库不支持静态链接 注意Linux / macOS 为动态库支持Linux 下静态编译需要手动编译 taglib 静态库macOS 原生库不支持静态链接
@@ -32,9 +67,10 @@ make macos
#### MinGW #### MinGW
因为部分代码(例如常量引用等)在 msvc 下面编译不通过,本项目需要使用 MinGW 编译 ~~因为部分代码(例如常量引用等)在 msvc 下面编译不通过,本项目需要使用 MinGW 编译~~
已经修改部分代码使得支持 msvc 编译,详见下面的 Visual Studio 部分
下载 [mingw-w64](https://winlibs.com/) 的 Windows 版本,这里推荐从 winlibs 这个网站下载,编译器版本始终保持最新 下载 mingw-w64 的 Windows 版本,这里推荐从 [winlibs](https://winlibs.com/) 这个网站下载,编译器版本始终跟随上游保持最新
将 mingw64/bin 添加到系统环境变量 将 mingw64/bin 添加到系统环境变量
@@ -54,7 +90,8 @@ git clone https://github.com/taurusxin/ncmdump && cd ncmdump
make win32 make win32
``` ```
## 使用 #### Visual Studio
1. 命令行下使用 `ncmdump [files]...`
2. 直接 ncm 拖拽文件到二进制文件上 注意**VS的源代码还未上传请先使用 MinGW 编译**
使用 git 切换到 msvc 分支,使用 Visual Studio 打开 ncmdump.sln编译即可

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>

17
color.h Normal file
View File

@@ -0,0 +1,17 @@
#define RESET "\033[0m"
#define BLACK "\033[30m" /* Black */
#define RED "\033[31m" /* Red */
#define GREEN "\033[32m" /* Green */
#define YELLOW "\033[33m" /* Yellow */
#define BLUE "\033[34m" /* Blue */
#define MAGENTA "\033[35m" /* Magenta */
#define CYAN "\033[36m" /* Cyan */
#define WHITE "\033[37m" /* White */
#define BOLDBLACK "\033[1m\033[30m" /* Bold Black */
#define BOLDRED "\033[1m\033[31m" /* Bold Red */
#define BOLDGREEN "\033[1m\033[32m" /* Bold Green */
#define BOLDYELLOW "\033[1m\033[33m" /* Bold Yellow */
#define BOLDBLUE "\033[1m\033[34m" /* Bold Blue */
#define BOLDMAGENTA "\033[1m\033[35m" /* Bold Magenta */
#define BOLDCYAN "\033[1m\033[36m" /* Bold Cyan */
#define BOLDWHITE "\033[1m\033[37m" /* Bold White */

133
main.cpp
View File

@@ -1,28 +1,119 @@
#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) { #include "color.h"
std::cout << "Please input file path!" << std::endl;
return 1;
}
try { namespace fs = std::filesystem;
int i;
for (i = 1; i < argc; i++) {
NeteaseCrypt crypt(argv[i]);
crypt.Dump();
crypt.FixMetadata();
std::cout << crypt.dumpFilepath() << std::endl;
}
} catch (std::invalid_argument e) {
std::cout << "Exception: " << e.what() << std::endl;
} catch (...) {
std::cout << "Unexcept exception!" << std::endl;
}
return 0; void displayHelp() {
} std::cout << "Usage: ncmdump [-d] [-h] file1 file2 ..." << std::endl;
std::cout << "Options:" << std::endl;
std::cout << " -d Process files in a folder (requires folder path)" << std::endl;
std::cout << " -h, --help Display this help message" << std::endl;
}
void processFile(const fs::path& filePath) {
if (fs::exists(filePath) == false) {
std::cerr << "Error: file '" << filePath.string() << "' does not exist." << std::endl;
return;
}
try {
NeteaseCrypt crypt(filePath.string());
crypt.Dump();
crypt.FixMetadata();
std::cout << BOLDGREEN << "Done: '" << RESET << crypt.dumpFilepath().string() << "'" << std::endl;
} catch (const std::invalid_argument& e) {
std::cerr << BOLDRED << "Exception: " << RESET << RED << e.what() << RESET << " '" << filePath.string() << "'" << std::endl;
} catch (...) {
std::cerr << BOLDRED << "Unexpected exception while processing file: " << RESET << filePath.string() << 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};
@@ -43,21 +45,13 @@ static void aesEcbDecrypt(const unsigned char *key, std::string& src, std::strin
} }
static void replace(std::string& str, const std::string& from, const std::string& to) { static void replace(std::string& str, const std::string& from, const std::string& to) {
if(from.empty()) if(from.empty())
return; return;
size_t start_pos = 0; size_t start_pos = 0;
while((start_pos = str.find(from, start_pos)) != std::string::npos) { while((start_pos = str.find(from, start_pos)) != std::string::npos) {
str.replace(start_pos, from.length(), to); str.replace(start_pos, from.length(), to);
start_pos += to.length(); // In case 'to' contains 'from', like replacing 'x' with 'yx' start_pos += to.length(); // In case 'to' contains 'from', like replacing 'x' with 'yx'
} }
}
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() {
@@ -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");
} }
@@ -225,38 +219,16 @@ void NeteaseCrypt::FixMetadata() {
} }
void NeteaseCrypt::Dump() { void NeteaseCrypt::Dump() {
int n, i; mDumpFilepath = mFilepath;
// mDumpFilepath.clear(); std::vector<unsigned char> buffer(0x8000);
// mDumpFilepath.resize(1024);
// if (mMetaData) {
// mDumpFilepath = mMetaData->name();
// replace(mDumpFilepath, "\\", "");
// replace(mDumpFilepath, "/", "");
// replace(mDumpFilepath, "?", "");
// replace(mDumpFilepath, ":", "");
// replace(mDumpFilepath, "*", "");
// replace(mDumpFilepath, "\"", "");
// replace(mDumpFilepath, "<", "");
// replace(mDumpFilepath, ">", "");
// replace(mDumpFilepath, "|", "");
// } else {
mDumpFilepath = fileNameWithoutExt(mFilepath);
// }
n = 0x8000;
i = 0;
unsigned char buffer[n];
std::ofstream output; std::ofstream output;
while (!mFile.eof()) { while (!mFile.eof()) {
n = read((char*)buffer, n); int n = read((char*)buffer.data(), buffer.size());
for (i = 0; i < n; i++) { for (int i = 0; i < n; i++) {
int j = (i + 1) & 0xff; int j = (i + 1) & 0xff;
buffer[i] ^= mKeyBox[(mKeyBox[j] + mKeyBox[(mKeyBox[j] + j) & 0xff]) & 0xff]; buffer[i] ^= mKeyBox[(mKeyBox[j] + mKeyBox[(mKeyBox[j] + j) & 0xff]) & 0xff];
} }
@@ -265,17 +237,17 @@ 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);
} }
output.write((char*)buffer, n); output.write((char*)buffer.data(), n);
} }
output.flush(); output.flush();
@@ -290,38 +262,36 @@ 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;
int i;
unsigned int n; unsigned int n;
read(reinterpret_cast<char *>(&n), sizeof(n)); read(reinterpret_cast<char *>(&n), sizeof(n));
if (n <= 0) { if (n <= 0) {
throw std::invalid_argument("broken ncm file"); throw std::invalid_argument("Broken NCM file");
} }
char keydata[n]; std::vector<char> keydata(n);
read(keydata, n); read(keydata.data(), n);
for (i = 0; i < n; i++) { for (size_t i = 0; i < n; i++) {
keydata[i] ^= 0x64; keydata[i] ^= 0x64;
} }
std::string rawKeyData(keydata, n); std::string rawKeyData(keydata.begin(), keydata.end());
std::string mKeyData; std::string mKeyData;
aesEcbDecrypt(sCoreKey, rawKeyData, mKeyData); aesEcbDecrypt(sCoreKey, rawKeyData, mKeyData);
@@ -335,10 +305,10 @@ NeteaseCrypt::NeteaseCrypt(std::string const& path) {
mMetaData = NULL; mMetaData = NULL;
} else { } else {
char modifyData[n]; std::vector<char> modifyData(n);
read(modifyData, n); read(modifyData.data(), n);
for (i = 0; i < n; i++) { for (size_t i = 0; i < n; i++) {
modifyData[i] ^= 0x63; modifyData[i] ^= 0x63;
} }
@@ -346,7 +316,7 @@ NeteaseCrypt::NeteaseCrypt(std::string const& path) {
std::string modifyOutData; std::string modifyOutData;
std::string modifyDecryptData; std::string modifyDecryptData;
swapModifyData = std::string(modifyData + 22, n - 22); swapModifyData = std::string(modifyData.begin() + 22, modifyData.end());
// escape `163 key(Don't modify):` // escape `163 key(Don't modify):`
Base64::Decode(swapModifyData, modifyOutData); Base64::Decode(swapModifyData, modifyOutData);

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

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