Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6c39a38af6 | |||
| bc77cffcd8 | |||
| 8f5c9a9c10 | |||
| cce512bbf3 | |||
| e08b922be3 | |||
| dfb082cdbf | |||
| 5183dfef22 | |||
| a8ba3db401 | |||
| 8b7be1aadf | |||
| b7c0a0fba8 | |||
| 37bbc82ee0 |
5
.gitignore
vendored
5
.gitignore
vendored
@@ -1,2 +1,5 @@
|
||||
ncmdump*.exe
|
||||
*.exe
|
||||
ncmdump
|
||||
|
||||
.vscode
|
||||
.idea
|
||||
20
Makefile
20
Makefile
@@ -1,11 +1,23 @@
|
||||
default:
|
||||
@echo "Please choose a platform: linux, macos, win32"
|
||||
|
||||
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
|
||||
|
||||
macos:
|
||||
clang++ main.cpp cJSON.cpp aes.cpp ncmcrypt.cpp -o ncmdump -ltag
|
||||
macos-intel:
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
clean:
|
||||
rm -f ncmdump ncmdump.exe
|
||||
57
README.md
57
README.md
@@ -1,17 +1,48 @@
|
||||
# ncmdump
|
||||
|
||||
使用本程序可将下载的网易云音乐缓存文件(ncm)转换为 mp3 或 flac 格式
|
||||
|
||||
## 简介
|
||||
|
||||
该版本为最早的 C++ 版本,也是作者开发的市面上第一个支持 ncm 转换的程序
|
||||
|
||||
源码复刻自 anonymous5l/ncmdump,感谢前辈的付出!
|
||||
做了 Windows 下的移植,修复了一些编译问题
|
||||
|
||||
## 便捷式传送门
|
||||
## 传送门
|
||||
|
||||
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
|
||||
|
||||
### Linux / macOS
|
||||
|
||||
```shell
|
||||
# CentOS
|
||||
yum install taglib-devel
|
||||
@@ -21,9 +52,13 @@ make linux
|
||||
apt install libtag1-dev
|
||||
make linux
|
||||
|
||||
# macOS
|
||||
# macOS with Intel chip
|
||||
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 原生库不支持静态链接
|
||||
@@ -32,9 +67,10 @@ make macos
|
||||
|
||||
#### MinGW
|
||||
|
||||
因为部分代码(例如常量引用等)在 msvc 下面编译不通过,本项目需要使用 MinGW 编译
|
||||
~~因为部分代码(例如常量引用等)在 msvc 下面编译不通过,本项目需要使用 MinGW 编译~~
|
||||
已经修改部分代码使得支持 msvc 编译,详见下面的 Visual Studio 部分
|
||||
|
||||
下载 [mingw-w64](https://winlibs.com/) 的 Windows 版本,这里推荐从 winlibs 这个网站下载,编译器版本始终保持最新
|
||||
下载 mingw-w64 的 Windows 版本,这里推荐从 [winlibs](https://winlibs.com/) 这个网站下载,编译器版本始终跟随上游保持最新
|
||||
|
||||
将 mingw64/bin 添加到系统环境变量
|
||||
|
||||
@@ -54,7 +90,8 @@ git clone https://github.com/taurusxin/ncmdump && cd ncmdump
|
||||
make win32
|
||||
```
|
||||
|
||||
## 使用
|
||||
1. 命令行下使用 `ncmdump [files]...`
|
||||
#### Visual Studio
|
||||
|
||||
2. 直接 ncm 拖拽文件到二进制文件上
|
||||
注意**VS的源代码还未上传,请先使用 MinGW 编译**
|
||||
|
||||
使用 git 切换到 msvc 分支,使用 Visual Studio 打开 ncmdump.sln,编译即可
|
||||
|
||||
1
base64.h
1
base64.h
@@ -1,5 +1,6 @@
|
||||
#ifndef _MACARON_BASE64_H_
|
||||
#define _MACARON_BASE64_H_
|
||||
#include <cstdint>
|
||||
|
||||
#include <string>
|
||||
|
||||
|
||||
113
main.cpp
113
main.cpp
@@ -1,27 +1,116 @@
|
||||
#include "ncmcrypt.h"
|
||||
|
||||
#include <iostream>
|
||||
#include <stdexcept>
|
||||
#include <vector>
|
||||
#include <filesystem>
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
#ifdef _WIN32
|
||||
#include <Windows.h>
|
||||
#endif
|
||||
|
||||
if (argc <= 1) {
|
||||
std::cout << "Please input file path!" << std::endl;
|
||||
return 1;
|
||||
namespace fs = std::filesystem;
|
||||
|
||||
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 {
|
||||
int i;
|
||||
for (i = 1; i < argc; i++) {
|
||||
NeteaseCrypt crypt(argv[i]);
|
||||
NeteaseCrypt crypt(filePath.string());
|
||||
crypt.Dump();
|
||||
crypt.FixMetadata();
|
||||
|
||||
std::cout << crypt.dumpFilepath() << std::endl;
|
||||
}
|
||||
} catch (std::invalid_argument e) {
|
||||
std::cout << "Exception: " << e.what() << std::endl;
|
||||
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 << "Unexcept exception!" << std::endl;
|
||||
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;
|
||||
|
||||
36
ncmcrypt.cpp
36
ncmcrypt.cpp
@@ -13,6 +13,8 @@
|
||||
#include <stdexcept>
|
||||
#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::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() {
|
||||
cJSON_Delete(mRaw);
|
||||
}
|
||||
@@ -112,13 +106,13 @@ NeteaseMusicMetadata::NeteaseMusicMetadata(cJSON* raw) {
|
||||
}
|
||||
}
|
||||
|
||||
bool NeteaseCrypt::openFile(std::string const& path) {
|
||||
try {
|
||||
bool NeteaseCrypt::openFile(std::filesystem::path const& path) {
|
||||
mFile.open(path, std::ios::in | std::ios::binary);
|
||||
} catch (...) {
|
||||
if (!mFile.is_open()) {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
bool NeteaseCrypt::isNcmFile() {
|
||||
@@ -143,7 +137,7 @@ int NeteaseCrypt::read(char *s, std::streamsize n) {
|
||||
int gcount = mFile.gcount();
|
||||
|
||||
if (gcount <= 0) {
|
||||
throw std::invalid_argument("can't read file");
|
||||
throw std::invalid_argument(" can't read file");
|
||||
}
|
||||
|
||||
return gcount;
|
||||
@@ -179,7 +173,7 @@ std::string NeteaseCrypt::mimeType(std::string& data) {
|
||||
}
|
||||
|
||||
void NeteaseCrypt::FixMetadata() {
|
||||
if (mDumpFilepath.length() <= 0) {
|
||||
if (mDumpFilepath.string().length() <= 0) {
|
||||
throw std::invalid_argument("must dump before");
|
||||
}
|
||||
|
||||
@@ -243,7 +237,7 @@ void NeteaseCrypt::Dump() {
|
||||
// replace(mDumpFilepath, ">", ">");
|
||||
// replace(mDumpFilepath, "|", "|");
|
||||
// } else {
|
||||
mDumpFilepath = fileNameWithoutExt(mFilepath);
|
||||
mDumpFilepath = mFilepath;
|
||||
// }
|
||||
|
||||
n = 0x8000;
|
||||
@@ -265,10 +259,10 @@ void NeteaseCrypt::Dump() {
|
||||
// identify format
|
||||
// ID3 format mp3
|
||||
if (buffer[0] == 0x49 && buffer[1] == 0x44 && buffer[2] == 0x33) {
|
||||
mDumpFilepath += ".mp3";
|
||||
mDumpFilepath.replace_extension(".mp3");
|
||||
mFormat = NeteaseCrypt::MP3;
|
||||
} else {
|
||||
mDumpFilepath += ".flac";
|
||||
mDumpFilepath.replace_extension(".flac");
|
||||
mFormat = NeteaseCrypt::FLAC;
|
||||
}
|
||||
|
||||
@@ -290,17 +284,17 @@ NeteaseCrypt::~NeteaseCrypt() {
|
||||
mFile.close();
|
||||
}
|
||||
|
||||
NeteaseCrypt::NeteaseCrypt(std::string const& path) {
|
||||
NeteaseCrypt::NeteaseCrypt(std::filesystem::path const& path) {
|
||||
if (!openFile(path)) {
|
||||
throw std::invalid_argument("can't open file");
|
||||
throw std::invalid_argument(" can't open file");
|
||||
}
|
||||
|
||||
if (!isNcmFile()) {
|
||||
throw std::invalid_argument("not netease protected file");
|
||||
throw std::invalid_argument(" not netease protected file");
|
||||
}
|
||||
|
||||
if (!mFile.seekg(2, mFile.cur)) {
|
||||
throw std::invalid_argument("can't seek file");
|
||||
throw std::invalid_argument(" can't seek file");
|
||||
}
|
||||
|
||||
mFilepath = path;
|
||||
|
||||
14
ncmcrypt.h
14
ncmcrypt.h
@@ -6,6 +6,8 @@
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
|
||||
#include <filesystem>
|
||||
|
||||
class NeteaseMusicMetadata {
|
||||
|
||||
private:
|
||||
@@ -40,8 +42,8 @@ private:
|
||||
enum NcmFormat { MP3, FLAC };
|
||||
|
||||
private:
|
||||
std::string mFilepath;
|
||||
std::string mDumpFilepath;
|
||||
std::filesystem::path mFilepath;
|
||||
std::filesystem::path mDumpFilepath;
|
||||
NcmFormat mFormat;
|
||||
std::string mImageData;
|
||||
std::ifstream mFile;
|
||||
@@ -50,17 +52,17 @@ private:
|
||||
|
||||
private:
|
||||
bool isNcmFile();
|
||||
bool openFile(std::string const&);
|
||||
bool openFile(std::filesystem::path const&);
|
||||
int read(char *s, std::streamsize n);
|
||||
void buildKeyBox(unsigned char *key, int keyLen);
|
||||
std::string mimeType(std::string& data);
|
||||
|
||||
public:
|
||||
const std::string& filepath() const { return mFilepath; }
|
||||
const std::string& dumpFilepath() const { return mDumpFilepath; }
|
||||
const std::filesystem::path& filepath() const { return mFilepath; }
|
||||
const std::filesystem::path& dumpFilepath() const { return mDumpFilepath; }
|
||||
|
||||
public:
|
||||
NeteaseCrypt(std::string const&);
|
||||
NeteaseCrypt(std::filesystem::path const&);
|
||||
~NeteaseCrypt();
|
||||
|
||||
public:
|
||||
|
||||
@@ -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月的最新版本)
|
||||
@@ -27,10 +27,10 @@ goto theend
|
||||
* to allow for static, shared or debug builds.
|
||||
* It would be preferable if the top level CMakeLists.txt provided the library name during config. ??
|
||||
:doit
|
||||
if /i "%1#" == "--libs#" echo -LC:/taglib/lib -llibtag
|
||||
if /i "%1#" == "--cflags#" echo -IC:/taglib/include -IC:/taglib/include/taglib
|
||||
if /i "%1#" == "--version#" echo 1.12
|
||||
if /i "%1#" == "--prefix#" echo C:/taglib
|
||||
if /i "%1#" == "--libs#" echo -LC:/Users/TaurusXin/Downloads/ncmdump/taglib/lib -llibtag
|
||||
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.13.1
|
||||
if /i "%1#" == "--prefix#" echo C:/Users/TaurusXin/Downloads/ncmdump/taglib
|
||||
|
||||
:theend
|
||||
|
||||
|
||||
@@ -150,8 +150,8 @@ namespace TagLib {
|
||||
class FilePrivate;
|
||||
FilePrivate *d;
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
} // namespace AIFF
|
||||
} // namespace RIFF
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -50,7 +50,7 @@ namespace TagLib {
|
||||
* Create an instance of AIFF::Properties with the data read from the
|
||||
* ByteVector \a data.
|
||||
*
|
||||
* \deprecated
|
||||
* \deprecated Use Properties(File *, ReadStyle).
|
||||
*/
|
||||
TAGLIB_DEPRECATED Properties(const ByteVector &data, ReadStyle style);
|
||||
|
||||
@@ -71,7 +71,7 @@ namespace TagLib {
|
||||
*
|
||||
* \note This method is just an alias of lengthInSeconds().
|
||||
*
|
||||
* \deprecated
|
||||
* \deprecated Use lengthInSeconds().
|
||||
*/
|
||||
TAGLIB_DEPRECATED virtual int length() const;
|
||||
|
||||
@@ -117,7 +117,7 @@ namespace TagLib {
|
||||
*
|
||||
* \note This method is just an alias of bitsPerSample().
|
||||
*
|
||||
* \deprecated
|
||||
* \deprecated Use bitsPerSample().
|
||||
*/
|
||||
TAGLIB_DEPRECATED int sampleWidth() const;
|
||||
|
||||
@@ -159,8 +159,8 @@ namespace TagLib {
|
||||
class PropertiesPrivate;
|
||||
PropertiesPrivate *d;
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
} // namespace AIFF
|
||||
} // namespace RIFF
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -229,7 +229,7 @@ namespace TagLib {
|
||||
class FilePrivate;
|
||||
FilePrivate *d;
|
||||
};
|
||||
}
|
||||
}
|
||||
} // namespace APE
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -167,7 +167,7 @@ namespace TagLib {
|
||||
FooterPrivate *d;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
} // namespace APE
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -31,9 +31,7 @@
|
||||
#include "tstringlist.h"
|
||||
|
||||
namespace TagLib {
|
||||
|
||||
namespace APE {
|
||||
|
||||
//! An implementation of APE-items
|
||||
|
||||
/*!
|
||||
@@ -215,10 +213,7 @@ namespace TagLib {
|
||||
class ItemPrivate;
|
||||
ItemPrivate *d;
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
} // namespace APE
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
@@ -53,7 +53,7 @@ namespace TagLib {
|
||||
* Create an instance of APE::Properties with the data read from the
|
||||
* APE::File \a file.
|
||||
*
|
||||
* \deprecated
|
||||
* \deprecated Use Properties(File *, long, ReadStyle).
|
||||
*/
|
||||
TAGLIB_DEPRECATED Properties(File *file, ReadStyle style = Average);
|
||||
|
||||
@@ -74,7 +74,7 @@ namespace TagLib {
|
||||
*
|
||||
* \note This method is just an alias of lengthInSeconds().
|
||||
*
|
||||
* \deprecated
|
||||
* \deprecated Use lengthInSeconds().
|
||||
*/
|
||||
TAGLIB_DEPRECATED virtual int length() const;
|
||||
|
||||
@@ -137,7 +137,7 @@ namespace TagLib {
|
||||
class PropertiesPrivate;
|
||||
PropertiesPrivate *d;
|
||||
};
|
||||
}
|
||||
}
|
||||
} // namespace APE
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -202,7 +202,7 @@ namespace TagLib {
|
||||
class TagPrivate;
|
||||
TagPrivate *d;
|
||||
};
|
||||
}
|
||||
}
|
||||
} // namespace APE
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -33,10 +33,8 @@
|
||||
|
||||
namespace TagLib
|
||||
{
|
||||
|
||||
namespace ASF
|
||||
{
|
||||
|
||||
class File;
|
||||
class Picture;
|
||||
|
||||
@@ -201,8 +199,7 @@ namespace TagLib
|
||||
class AttributePrivate;
|
||||
AttributePrivate *d;
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
} // namespace ASF
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -33,10 +33,8 @@
|
||||
#include "asftag.h"
|
||||
|
||||
namespace TagLib {
|
||||
|
||||
//! An implementation of ASF (WMA) metadata
|
||||
namespace ASF {
|
||||
|
||||
/*!
|
||||
* This implements and provides an interface for ASF files to the
|
||||
* TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing
|
||||
@@ -130,9 +128,7 @@ namespace TagLib {
|
||||
class FilePrivate;
|
||||
FilePrivate *d;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
} // namespace ASF
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -216,7 +216,7 @@ namespace TagLib
|
||||
class PicturePrivate;
|
||||
PicturePrivate *d;
|
||||
};
|
||||
}
|
||||
}
|
||||
} // namespace ASF
|
||||
} // namespace TagLib
|
||||
|
||||
#endif // ASFPICTURE_H
|
||||
|
||||
@@ -31,9 +31,7 @@
|
||||
#include "taglib_export.h"
|
||||
|
||||
namespace TagLib {
|
||||
|
||||
namespace ASF {
|
||||
|
||||
//! An implementation of ASF audio properties
|
||||
class TAGLIB_EXPORT Properties : public AudioProperties
|
||||
{
|
||||
@@ -86,7 +84,7 @@ namespace TagLib {
|
||||
*
|
||||
* \note This method is just an alias of lengthInSeconds().
|
||||
*
|
||||
* \deprecated
|
||||
* \deprecated Use lengthInSeconds().
|
||||
*/
|
||||
TAGLIB_DEPRECATED virtual int length() const;
|
||||
|
||||
@@ -178,9 +176,6 @@ namespace TagLib {
|
||||
class PropertiesPrivate;
|
||||
PropertiesPrivate *d;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} // namespace ASF
|
||||
} // namespace TagLib
|
||||
#endif
|
||||
|
||||
@@ -152,7 +152,8 @@ namespace TagLib {
|
||||
virtual bool isEmpty() const;
|
||||
|
||||
/*!
|
||||
* \deprecated
|
||||
* \deprecated Use attributeListMap() const, contains(), removeItem(),
|
||||
* attribute(), setAttribute(), addAttribute().
|
||||
*/
|
||||
AttributeListMap &attributeListMap();
|
||||
|
||||
@@ -205,6 +206,6 @@ namespace TagLib {
|
||||
class TagPrivate;
|
||||
TagPrivate *d;
|
||||
};
|
||||
}
|
||||
}
|
||||
} // namespace ASF
|
||||
} // namespace TagLib
|
||||
#endif
|
||||
|
||||
@@ -224,7 +224,7 @@ namespace TagLib {
|
||||
AttachedPictureFrameV22(const ByteVector &data, Header *h);
|
||||
friend class FrameFactory;
|
||||
};
|
||||
}
|
||||
}
|
||||
} // namespace ID3v2
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -122,6 +122,6 @@ namespace TagLib {
|
||||
AudioPropertiesPrivate *d;
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -243,7 +243,7 @@ namespace TagLib {
|
||||
class ChapterFramePrivate;
|
||||
ChapterFramePrivate *d;
|
||||
};
|
||||
}
|
||||
}
|
||||
} // namespace ID3v2
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -174,6 +174,6 @@ namespace TagLib {
|
||||
CommentsFramePrivate *d;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
} // namespace ID3v2
|
||||
} // namespace TagLib
|
||||
#endif
|
||||
|
||||
@@ -180,6 +180,6 @@ namespace TagLib {
|
||||
EventTimingCodesFramePrivate *d;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
} // namespace ID3v2
|
||||
} // namespace TagLib
|
||||
#endif
|
||||
|
||||
@@ -108,6 +108,16 @@ namespace TagLib {
|
||||
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.
|
||||
*/
|
||||
@@ -268,7 +278,7 @@ namespace TagLib {
|
||||
* \note You generally shouldn't use this method, but instead the constructor
|
||||
* directly.
|
||||
*
|
||||
* \deprecated
|
||||
* \deprecated Use FileRef(FileName, bool, AudioProperties::ReadStyle).
|
||||
*/
|
||||
static File *create(FileName fileName,
|
||||
bool readAudioProperties = true,
|
||||
|
||||
@@ -238,7 +238,7 @@ namespace TagLib {
|
||||
* when
|
||||
*
|
||||
* \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);
|
||||
|
||||
@@ -337,7 +337,7 @@ namespace TagLib {
|
||||
class FilePrivate;
|
||||
FilePrivate *d;
|
||||
};
|
||||
}
|
||||
}
|
||||
} // namespace FLAC
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -31,9 +31,7 @@
|
||||
#include "taglib_export.h"
|
||||
|
||||
namespace TagLib {
|
||||
|
||||
namespace FLAC {
|
||||
|
||||
class TAGLIB_EXPORT MetadataBlock
|
||||
{
|
||||
public:
|
||||
@@ -67,9 +65,6 @@ namespace TagLib {
|
||||
class MetadataBlockPrivate;
|
||||
MetadataBlockPrivate *d;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} // namespace FLAC
|
||||
} // namespace TagLib
|
||||
#endif
|
||||
|
||||
@@ -33,9 +33,7 @@
|
||||
#include "flacmetadatablock.h"
|
||||
|
||||
namespace TagLib {
|
||||
|
||||
namespace FLAC {
|
||||
|
||||
class TAGLIB_EXPORT Picture : public MetadataBlock
|
||||
{
|
||||
public:
|
||||
@@ -200,9 +198,6 @@ namespace TagLib {
|
||||
};
|
||||
|
||||
typedef List<Picture> PictureList;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} // namespace FLAC
|
||||
} // namespace TagLib
|
||||
#endif
|
||||
|
||||
@@ -70,7 +70,7 @@ namespace TagLib {
|
||||
*
|
||||
* \note This method is just an alias of lengthInSeconds().
|
||||
*
|
||||
* \deprecated
|
||||
* \deprecated Use lengthInSeconds().
|
||||
*/
|
||||
TAGLIB_DEPRECATED virtual int length() const;
|
||||
|
||||
@@ -118,7 +118,7 @@ namespace TagLib {
|
||||
*
|
||||
* \note This method is just an alias of bitsPerSample().
|
||||
*
|
||||
* \deprecated
|
||||
* \deprecated Use bitsPerSample().
|
||||
*/
|
||||
TAGLIB_DEPRECATED int sampleWidth() const;
|
||||
|
||||
@@ -142,7 +142,7 @@ namespace TagLib {
|
||||
class PropertiesPrivate;
|
||||
PropertiesPrivate *d;
|
||||
};
|
||||
}
|
||||
}
|
||||
} // namespace FLAC
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -173,7 +173,7 @@ namespace TagLib {
|
||||
class GeneralEncapsulatedObjectFramePrivate;
|
||||
GeneralEncapsulatedObjectFramePrivate *d;
|
||||
};
|
||||
}
|
||||
}
|
||||
} // namespace ID3v2
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -60,7 +60,7 @@ namespace TagLib {
|
||||
* will be returned.
|
||||
*/
|
||||
int TAGLIB_EXPORT genreIndex(const String &name);
|
||||
}
|
||||
}
|
||||
} // namespace ID3v1
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -196,7 +196,7 @@ namespace TagLib {
|
||||
class TagPrivate;
|
||||
TagPrivate *d;
|
||||
};
|
||||
}
|
||||
}
|
||||
} // namespace ID3v1
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -18,7 +18,7 @@ namespace TagLib {
|
||||
v3 = 3, //<! ID3v2.3
|
||||
v4 = 4 //<! ID3v2.4
|
||||
};
|
||||
}
|
||||
}
|
||||
} // namespace ID3v2
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -88,6 +88,6 @@ namespace TagLib {
|
||||
ExtendedHeaderPrivate *d;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
} // namespace ID3v2
|
||||
} // namespace TagLib
|
||||
#endif
|
||||
|
||||
@@ -77,6 +77,6 @@ namespace TagLib {
|
||||
FooterPrivate *d;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
} // namespace ID3v2
|
||||
} // namespace TagLib
|
||||
#endif
|
||||
|
||||
@@ -55,6 +55,8 @@ namespace TagLib {
|
||||
{
|
||||
friend class Tag;
|
||||
friend class FrameFactory;
|
||||
friend class TableOfContentsFrame;
|
||||
friend class ChapterFrame;
|
||||
|
||||
public:
|
||||
|
||||
@@ -503,7 +505,7 @@ namespace TagLib {
|
||||
ByteVector render() const;
|
||||
|
||||
/*!
|
||||
* \deprecated
|
||||
* \deprecated Use fileAlterPreservation().
|
||||
*/
|
||||
TAGLIB_DEPRECATED bool frameAlterPreservation() const;
|
||||
|
||||
@@ -515,7 +517,7 @@ namespace TagLib {
|
||||
HeaderPrivate *d;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
} // namespace ID3v2
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -87,7 +87,7 @@ namespace TagLib {
|
||||
TAGLIB_DEPRECATED Frame *createFrame(const ByteVector &data, unsigned int version = 4) const;
|
||||
|
||||
/*!
|
||||
* \deprecated
|
||||
* \deprecated Use createFrame(const ByteVector &, const Header *) const.
|
||||
*/
|
||||
// BIC: remove
|
||||
Frame *createFrame(const ByteVector &data, Header *tagHeader) const;
|
||||
@@ -163,7 +163,7 @@ namespace TagLib {
|
||||
FrameFactoryPrivate *d;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
} // namespace ID3v2
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -170,7 +170,7 @@ namespace TagLib {
|
||||
HeaderPrivate *d;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
} // namespace ID3v2
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -62,9 +62,9 @@ namespace TagLib {
|
||||
* Convert the data from unsynchronized data to its original format.
|
||||
*/
|
||||
TAGLIB_EXPORT ByteVector decode(const ByteVector &input);
|
||||
}
|
||||
} // namespace SynchData
|
||||
|
||||
}
|
||||
}
|
||||
} // namespace ID3v2
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -338,7 +338,7 @@ namespace TagLib {
|
||||
ByteVector render() const;
|
||||
|
||||
/*!
|
||||
* \deprecated
|
||||
* \deprecated Use render(Version) const.
|
||||
*/
|
||||
TAGLIB_DEPRECATED ByteVector render(int version) const;
|
||||
|
||||
@@ -405,7 +405,7 @@ namespace TagLib {
|
||||
TagPrivate *d;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
} // namespace ID3v2
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -186,7 +186,8 @@ namespace TagLib {
|
||||
class TagPrivate;
|
||||
TagPrivate *d;
|
||||
};
|
||||
}}
|
||||
}
|
||||
} // namespace Info
|
||||
} // namespace RIFF
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -103,7 +103,7 @@ namespace TagLib {
|
||||
class FilePrivate;
|
||||
FilePrivate *d;
|
||||
};
|
||||
}
|
||||
}
|
||||
} // namespace IT
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -101,7 +101,7 @@ namespace TagLib {
|
||||
class PropertiesPrivate;
|
||||
PropertiesPrivate *d;
|
||||
};
|
||||
}
|
||||
}
|
||||
} // namespace IT
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -34,9 +34,7 @@
|
||||
#include "modproperties.h"
|
||||
|
||||
namespace TagLib {
|
||||
|
||||
namespace Mod {
|
||||
|
||||
class TAGLIB_EXPORT File : public TagLib::Mod::FileBase
|
||||
{
|
||||
public:
|
||||
@@ -106,9 +104,6 @@ namespace TagLib {
|
||||
class FilePrivate;
|
||||
FilePrivate *d;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} // namespace Mod
|
||||
} // namespace TagLib
|
||||
#endif
|
||||
|
||||
@@ -35,9 +35,7 @@
|
||||
#include <algorithm>
|
||||
|
||||
namespace TagLib {
|
||||
|
||||
namespace Mod {
|
||||
|
||||
class TAGLIB_EXPORT FileBase : public TagLib::File
|
||||
{
|
||||
protected:
|
||||
@@ -58,9 +56,6 @@ namespace TagLib {
|
||||
bool readU16B(unsigned short &number);
|
||||
bool readU32B(unsigned long &number);
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} // namespace Mod
|
||||
} // namespace TagLib
|
||||
#endif
|
||||
|
||||
@@ -30,9 +30,7 @@
|
||||
#include "audioproperties.h"
|
||||
|
||||
namespace TagLib {
|
||||
|
||||
namespace Mod {
|
||||
|
||||
class TAGLIB_EXPORT Properties : public AudioProperties
|
||||
{
|
||||
public:
|
||||
@@ -63,9 +61,6 @@ namespace TagLib {
|
||||
class PropertiesPrivate;
|
||||
PropertiesPrivate *d;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} // namespace Mod
|
||||
} // namespace TagLib
|
||||
#endif
|
||||
|
||||
@@ -29,9 +29,7 @@
|
||||
#include "tag.h"
|
||||
|
||||
namespace TagLib {
|
||||
|
||||
namespace Mod {
|
||||
|
||||
/*!
|
||||
* Tags for module files (Mod, S3M, IT, XM).
|
||||
*
|
||||
@@ -186,9 +184,6 @@ namespace TagLib {
|
||||
class TagPrivate;
|
||||
TagPrivate *d;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} // namespace Mod
|
||||
} // namespace TagLib
|
||||
#endif
|
||||
|
||||
@@ -34,9 +34,7 @@
|
||||
#include "tlist.h"
|
||||
|
||||
namespace TagLib {
|
||||
|
||||
namespace MP4 {
|
||||
|
||||
class Atom;
|
||||
typedef TagLib::List<Atom *> AtomList;
|
||||
|
||||
@@ -74,7 +72,7 @@ namespace TagLib {
|
||||
|
||||
typedef TagLib::List<AtomData> AtomDataList;
|
||||
|
||||
class Atom
|
||||
class TAGLIB_EXPORT Atom
|
||||
{
|
||||
public:
|
||||
Atom(File *file);
|
||||
@@ -88,11 +86,11 @@ namespace TagLib {
|
||||
AtomList children;
|
||||
private:
|
||||
static const int numContainers = 11;
|
||||
static const char *containers[11];
|
||||
static const char *const containers[11];
|
||||
};
|
||||
|
||||
//! Root-level atoms
|
||||
class Atoms
|
||||
class TAGLIB_EXPORT Atoms
|
||||
{
|
||||
public:
|
||||
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 atoms;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
} // namespace MP4
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -32,9 +32,7 @@
|
||||
#include "mp4atom.h"
|
||||
|
||||
namespace TagLib {
|
||||
|
||||
namespace MP4 {
|
||||
|
||||
class TAGLIB_EXPORT CoverArt
|
||||
{
|
||||
public:
|
||||
@@ -76,9 +74,6 @@ namespace TagLib {
|
||||
};
|
||||
|
||||
typedef List<CoverArt> CoverArtList;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} // namespace MP4
|
||||
} // namespace TagLib
|
||||
#endif
|
||||
|
||||
@@ -33,10 +33,8 @@
|
||||
#include "mp4tag.h"
|
||||
|
||||
namespace TagLib {
|
||||
|
||||
//! An implementation of MP4 (AAC, ALAC, ...) metadata
|
||||
namespace MP4 {
|
||||
|
||||
class Atoms;
|
||||
|
||||
/*!
|
||||
@@ -48,6 +46,19 @@ namespace TagLib {
|
||||
class TAGLIB_EXPORT File : public TagLib::File
|
||||
{
|
||||
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
|
||||
* file's audio properties will also be read.
|
||||
@@ -114,6 +125,15 @@ namespace TagLib {
|
||||
*/
|
||||
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
|
||||
* file has a Metadata Item List (ilst) atom.
|
||||
@@ -135,9 +155,6 @@ namespace TagLib {
|
||||
class FilePrivate;
|
||||
FilePrivate *d;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} // namespace MP4
|
||||
} // namespace TagLib
|
||||
#endif
|
||||
|
||||
@@ -31,9 +31,7 @@
|
||||
#include "taglib_export.h"
|
||||
|
||||
namespace TagLib {
|
||||
|
||||
namespace MP4 {
|
||||
|
||||
class TAGLIB_EXPORT Item
|
||||
{
|
||||
public:
|
||||
@@ -85,9 +83,6 @@ namespace TagLib {
|
||||
class ItemPrivate;
|
||||
ItemPrivate *d;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} // namespace MP4
|
||||
} // namespace TagLib
|
||||
#endif
|
||||
|
||||
@@ -30,9 +30,7 @@
|
||||
#include "audioproperties.h"
|
||||
|
||||
namespace TagLib {
|
||||
|
||||
namespace MP4 {
|
||||
|
||||
class Atoms;
|
||||
class File;
|
||||
|
||||
@@ -55,7 +53,7 @@ namespace TagLib {
|
||||
*
|
||||
* \note This method is just an alias of lengthInSeconds().
|
||||
*
|
||||
* \deprecated
|
||||
* \deprecated Use lengthInSeconds().
|
||||
*/
|
||||
TAGLIB_DEPRECATED virtual int length() const;
|
||||
|
||||
@@ -112,9 +110,6 @@ namespace TagLib {
|
||||
class PropertiesPrivate;
|
||||
PropertiesPrivate *d;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} // namespace MP4
|
||||
} // namespace TagLib
|
||||
#endif
|
||||
|
||||
@@ -36,11 +36,9 @@
|
||||
#include "mp4item.h"
|
||||
|
||||
namespace TagLib {
|
||||
|
||||
namespace MP4 {
|
||||
|
||||
/*!
|
||||
* \deprecated
|
||||
* \deprecated Use ItemMap.
|
||||
*/
|
||||
TAGLIB_DEPRECATED typedef TagLib::Map<String, Item> ItemListMap;
|
||||
typedef TagLib::Map<String, Item> ItemMap;
|
||||
@@ -72,7 +70,7 @@ namespace TagLib {
|
||||
virtual bool isEmpty() const;
|
||||
|
||||
/*!
|
||||
* \deprecated Use the item() and setItem() API instead
|
||||
* \deprecated Use the item() and setItem() API instead.
|
||||
*/
|
||||
TAGLIB_DEPRECATED ItemMap &itemListMap();
|
||||
|
||||
@@ -102,6 +100,11 @@ namespace TagLib {
|
||||
*/
|
||||
bool contains(const String &key) const;
|
||||
|
||||
/*!
|
||||
* Saves the associated file with the tag stripped.
|
||||
*/
|
||||
bool strip();
|
||||
|
||||
PropertyMap properties() const;
|
||||
void removeUnsupportedProperties(const StringList& properties);
|
||||
PropertyMap setProperties(const PropertyMap &properties);
|
||||
@@ -156,9 +159,6 @@ namespace TagLib {
|
||||
class TagPrivate;
|
||||
TagPrivate *d;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} // namespace MP4
|
||||
} // namespace TagLib
|
||||
#endif
|
||||
|
||||
@@ -195,7 +195,7 @@ namespace TagLib {
|
||||
void strip(int tags = AllTags);
|
||||
|
||||
/*!
|
||||
* \deprecated
|
||||
* \deprecated Use strip().
|
||||
* \see strip
|
||||
*/
|
||||
TAGLIB_DEPRECATED void remove(int tags = AllTags);
|
||||
@@ -232,7 +232,7 @@ namespace TagLib {
|
||||
class FilePrivate;
|
||||
FilePrivate *d;
|
||||
};
|
||||
}
|
||||
}
|
||||
} // namespace MPC
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -72,7 +72,7 @@ namespace TagLib {
|
||||
*
|
||||
* \note This method is just an alias of lengthInSeconds().
|
||||
*
|
||||
* \deprecated
|
||||
* \deprecated Use lengthInSeconds().
|
||||
*/
|
||||
TAGLIB_DEPRECATED virtual int length() const;
|
||||
|
||||
@@ -152,7 +152,7 @@ namespace TagLib {
|
||||
class PropertiesPrivate;
|
||||
PropertiesPrivate *d;
|
||||
};
|
||||
}
|
||||
}
|
||||
} // namespace MPC
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -193,19 +193,19 @@ namespace TagLib {
|
||||
bool save(int tags);
|
||||
|
||||
/*!
|
||||
* \deprecated
|
||||
* \deprecated Use save(int, StripTags, ID3v2::Version, DuplicateTags).
|
||||
*/
|
||||
// BIC: combine with the above method
|
||||
TAGLIB_DEPRECATED bool save(int tags, bool stripOthers);
|
||||
|
||||
/*!
|
||||
* \deprecated
|
||||
* \deprecated Use save(int, StripTags, ID3v2::Version, DuplicateTags).
|
||||
*/
|
||||
// BIC: combine with the above method
|
||||
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
|
||||
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.
|
||||
*
|
||||
* \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);
|
||||
|
||||
@@ -381,7 +381,7 @@ namespace TagLib {
|
||||
class FilePrivate;
|
||||
FilePrivate *d;
|
||||
};
|
||||
}
|
||||
}
|
||||
} // namespace MPEG
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -50,7 +50,7 @@ namespace TagLib {
|
||||
/*!
|
||||
* Parses an MPEG header based on \a data.
|
||||
*
|
||||
* \deprecated
|
||||
* \deprecated Use Header(File *, long, bool).
|
||||
*/
|
||||
TAGLIB_DEPRECATED Header(const ByteVector &data);
|
||||
|
||||
@@ -172,7 +172,7 @@ namespace TagLib {
|
||||
class HeaderPrivate;
|
||||
HeaderPrivate *d;
|
||||
};
|
||||
}
|
||||
}
|
||||
} // namespace MPEG
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -65,7 +65,7 @@ namespace TagLib {
|
||||
*
|
||||
* \note This method is just an alias of lengthInSeconds().
|
||||
*
|
||||
* \deprecated
|
||||
* \deprecated Use lengthInSeconds().
|
||||
*/
|
||||
TAGLIB_DEPRECATED virtual int length() const;
|
||||
|
||||
@@ -146,7 +146,7 @@ namespace TagLib {
|
||||
class PropertiesPrivate;
|
||||
PropertiesPrivate *d;
|
||||
};
|
||||
}
|
||||
}
|
||||
} // namespace MPEG
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -121,7 +121,7 @@ namespace TagLib {
|
||||
FilePrivate *d;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
} // namespace Ogg
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -223,6 +223,6 @@ namespace TagLib {
|
||||
class PagePrivate;
|
||||
PagePrivate *d;
|
||||
};
|
||||
}
|
||||
}
|
||||
} // namespace Ogg
|
||||
} // namespace TagLib
|
||||
#endif
|
||||
|
||||
@@ -226,7 +226,7 @@ namespace TagLib {
|
||||
PageHeaderPrivate *d;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
} // namespace Ogg
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -131,8 +131,8 @@ namespace TagLib {
|
||||
class FilePrivate;
|
||||
FilePrivate *d;
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
} // namespace Opus
|
||||
} // namespace Ogg
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -67,7 +67,7 @@ namespace TagLib {
|
||||
*
|
||||
* \note This method is just an alias of lengthInSeconds().
|
||||
*
|
||||
* \deprecated
|
||||
* \deprecated Use lengthInSeconds().
|
||||
*/
|
||||
TAGLIB_DEPRECATED virtual int length() const;
|
||||
|
||||
@@ -127,8 +127,8 @@ namespace TagLib {
|
||||
class PropertiesPrivate;
|
||||
PropertiesPrivate *d;
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
} // namespace Opus
|
||||
} // namespace Ogg
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -146,6 +146,6 @@ namespace TagLib {
|
||||
OwnershipFramePrivate *d;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
} // namespace ID3v2
|
||||
} // namespace TagLib
|
||||
#endif
|
||||
|
||||
@@ -77,6 +77,6 @@ namespace TagLib {
|
||||
PodcastFramePrivate *d;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
} // namespace ID3v2
|
||||
} // namespace TagLib
|
||||
#endif
|
||||
|
||||
@@ -127,6 +127,6 @@ namespace TagLib {
|
||||
PopularimeterFramePrivate *d;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
} // namespace ID3v2
|
||||
} // namespace TagLib
|
||||
#endif
|
||||
|
||||
@@ -106,6 +106,6 @@ namespace TagLib {
|
||||
PrivateFramePrivate *d;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
} // namespace ID3v2
|
||||
} // namespace TagLib
|
||||
#endif
|
||||
|
||||
@@ -269,6 +269,6 @@ namespace TagLib {
|
||||
RelativeVolumeFramePrivate *d;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
} // namespace ID3v2
|
||||
} // namespace TagLib
|
||||
#endif
|
||||
|
||||
@@ -155,7 +155,7 @@ namespace TagLib {
|
||||
class FilePrivate;
|
||||
FilePrivate *d;
|
||||
};
|
||||
}
|
||||
}
|
||||
} // namespace RIFF
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -106,7 +106,7 @@ namespace TagLib {
|
||||
class FilePrivate;
|
||||
FilePrivate *d;
|
||||
};
|
||||
}
|
||||
}
|
||||
} // namespace S3M
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -88,7 +88,7 @@ namespace TagLib {
|
||||
class PropertiesPrivate;
|
||||
PropertiesPrivate *d;
|
||||
};
|
||||
}
|
||||
}
|
||||
} // namespace S3M
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -131,8 +131,8 @@ namespace TagLib {
|
||||
class FilePrivate;
|
||||
FilePrivate *d;
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
} // namespace Speex
|
||||
} // namespace Ogg
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -67,7 +67,7 @@ namespace TagLib {
|
||||
*
|
||||
* \note This method is just an alias of lengthInSeconds().
|
||||
*
|
||||
* \deprecated
|
||||
* \deprecated Use lengthInSeconds().
|
||||
*/
|
||||
TAGLIB_DEPRECATED virtual int length() const;
|
||||
|
||||
@@ -122,8 +122,8 @@ namespace TagLib {
|
||||
class PropertiesPrivate;
|
||||
PropertiesPrivate *d;
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
} // namespace Speex
|
||||
} // namespace Ogg
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -226,6 +226,6 @@ namespace TagLib {
|
||||
SynchronizedLyricsFramePrivate *d;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
} // namespace ID3v2
|
||||
} // namespace TagLib
|
||||
#endif
|
||||
|
||||
@@ -254,7 +254,7 @@ namespace TagLib {
|
||||
class TableOfContentsFramePrivate;
|
||||
TableOfContentsFramePrivate *d;
|
||||
};
|
||||
}
|
||||
}
|
||||
} // namespace ID3v2
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -196,6 +196,6 @@ namespace TagLib {
|
||||
class TagPrivate;
|
||||
TagPrivate *d;
|
||||
};
|
||||
}
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -29,8 +29,8 @@
|
||||
#include "taglib_config.h"
|
||||
|
||||
#define TAGLIB_MAJOR_VERSION 1
|
||||
#define TAGLIB_MINOR_VERSION 12
|
||||
#define TAGLIB_PATCH_VERSION 0
|
||||
#define TAGLIB_MINOR_VERSION 13
|
||||
#define TAGLIB_PATCH_VERSION 1
|
||||
|
||||
#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 1)) || defined(__clang__)
|
||||
#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.
|
||||
*/
|
||||
typedef std::basic_string<wchar_t> wstring;
|
||||
}
|
||||
} // namespace TagLib
|
||||
|
||||
/*!
|
||||
* \mainpage TagLib
|
||||
|
||||
@@ -278,7 +278,7 @@ namespace TagLib {
|
||||
*
|
||||
* \see isEmpty()
|
||||
*
|
||||
* \deprecated
|
||||
* \deprecated Use isEmpty(), do not differentiate between null and empty.
|
||||
*/
|
||||
// BIC: remove
|
||||
TAGLIB_DEPRECATED bool isNull() const;
|
||||
@@ -592,7 +592,7 @@ namespace TagLib {
|
||||
* \warning Do not modify this variable. It will mess up the internal state
|
||||
* of TagLib.
|
||||
*
|
||||
* \deprecated
|
||||
* \deprecated Use ByteVector().
|
||||
*/
|
||||
// BIC: remove
|
||||
TAGLIB_DEPRECATED static ByteVector null;
|
||||
@@ -624,7 +624,7 @@ namespace TagLib {
|
||||
class ByteVectorPrivate;
|
||||
ByteVectorPrivate *d;
|
||||
};
|
||||
}
|
||||
} // namespace TagLib
|
||||
|
||||
/*!
|
||||
* \relates TagLib::ByteVector
|
||||
|
||||
@@ -86,6 +86,6 @@ namespace TagLib {
|
||||
ByteVectorListPrivate *d;
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -140,6 +140,6 @@ namespace TagLib {
|
||||
ByteVectorStreamPrivate *d;
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -69,6 +69,6 @@ namespace TagLib
|
||||
* \see DebugListener
|
||||
*/
|
||||
TAGLIB_EXPORT void setDebugListener(DebugListener *listener);
|
||||
}
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -308,6 +308,6 @@ namespace TagLib {
|
||||
UserTextIdentificationFramePrivate *d;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
} // namespace ID3v2
|
||||
} // namespace TagLib
|
||||
#endif
|
||||
|
||||
@@ -261,14 +261,14 @@ namespace TagLib {
|
||||
* Returns true if \a file can be opened for reading. If the file does not
|
||||
* 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);
|
||||
|
||||
/*!
|
||||
* 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);
|
||||
|
||||
@@ -318,6 +318,6 @@ namespace TagLib {
|
||||
FilePrivate *d;
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -154,6 +154,6 @@ namespace TagLib {
|
||||
FileStreamPrivate *d;
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -165,6 +165,6 @@ namespace TagLib {
|
||||
IOStream &operator=(const IOStream &);
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -260,7 +260,7 @@ namespace TagLib {
|
||||
#endif
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace TagLib
|
||||
|
||||
// Since GCC doesn't support the "export" keyword, we have to include the
|
||||
// implementation.
|
||||
|
||||
@@ -153,6 +153,14 @@ namespace TagLib {
|
||||
*/
|
||||
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.
|
||||
*
|
||||
@@ -194,7 +202,7 @@ namespace TagLib {
|
||||
#endif
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace TagLib
|
||||
|
||||
// Since GCC doesn't support the "export" keyword, we have to include the
|
||||
// implementation.
|
||||
|
||||
@@ -155,6 +155,13 @@ unsigned int Map<Key, T>::size() const
|
||||
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>
|
||||
const T &Map<Key, T>::operator[](const Key &key) const
|
||||
{
|
||||
|
||||
@@ -29,6 +29,11 @@
|
||||
#include "tmap.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 {
|
||||
|
||||
typedef Map<String,StringList> SimplePropertyMap;
|
||||
@@ -186,6 +191,15 @@ namespace TagLib {
|
||||
*/
|
||||
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.
|
||||
*
|
||||
@@ -238,5 +252,5 @@ namespace TagLib {
|
||||
StringList unsupported;
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace TagLib
|
||||
#endif /* TAGLIB_PROPERTYMAP_H_ */
|
||||
|
||||
@@ -107,7 +107,7 @@ namespace TagLib
|
||||
#endif
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace TagLib
|
||||
|
||||
#endif // DO_NOT_DOCUMENT
|
||||
#endif
|
||||
|
||||
@@ -164,7 +164,7 @@ namespace TagLib {
|
||||
* Set the ID3v2::FrameFactory to something other than the default.
|
||||
*
|
||||
* \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);
|
||||
|
||||
@@ -253,7 +253,7 @@ namespace TagLib {
|
||||
class FilePrivate;
|
||||
FilePrivate *d;
|
||||
};
|
||||
}
|
||||
}
|
||||
} // namespace TrueAudio
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -36,8 +36,6 @@ namespace TagLib {
|
||||
|
||||
namespace TrueAudio {
|
||||
|
||||
class File;
|
||||
|
||||
static const unsigned int HeaderSize = 18;
|
||||
|
||||
//! An implementation of audio property reading for TrueAudio
|
||||
@@ -67,7 +65,7 @@ namespace TagLib {
|
||||
*
|
||||
* \note This method is just an alias of lengthInSeconds().
|
||||
*
|
||||
* \deprecated
|
||||
* \deprecated Use lengthInSeconds().
|
||||
*/
|
||||
TAGLIB_DEPRECATED virtual int length() const;
|
||||
|
||||
@@ -127,7 +125,7 @@ namespace TagLib {
|
||||
class PropertiesPrivate;
|
||||
PropertiesPrivate *d;
|
||||
};
|
||||
}
|
||||
}
|
||||
} // namespace TrueAudio
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
#if defined(QT_VERSION) && (QT_VERSION >= 0x040000)
|
||||
#define QStringToTString(s) TagLib::String(s.toUtf8().data(), TagLib::String::UTF8)
|
||||
#else
|
||||
#define QStringToTString(s) TagLib::String(s.utf8().data(), TagLib::String::UTF8)
|
||||
#define QStringToTString(s) TagLib::String((s).utf8().data(), TagLib::String::UTF8)
|
||||
#endif
|
||||
|
||||
/*!
|
||||
@@ -58,7 +58,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#define TStringToQString(s) QString::fromUtf8(s.toCString(true))
|
||||
#define TStringToQString(s) QString::fromUtf8((s).toCString(true))
|
||||
|
||||
namespace TagLib {
|
||||
|
||||
@@ -337,7 +337,7 @@ namespace TagLib {
|
||||
*
|
||||
* \see isEmpty()
|
||||
*
|
||||
* \deprecated
|
||||
* \deprecated Use isEmpty(), do not differentiate between null and empty.
|
||||
*/
|
||||
// BIC: remove
|
||||
TAGLIB_DEPRECATED bool isNull() const;
|
||||
@@ -522,7 +522,7 @@ namespace TagLib {
|
||||
* \warning Do not modify this variable. It will mess up the internal state
|
||||
* of TagLib.
|
||||
*
|
||||
* \deprecated
|
||||
* \deprecated Use String().
|
||||
*/
|
||||
// BIC: remove
|
||||
TAGLIB_DEPRECATED static String null;
|
||||
@@ -546,28 +546,28 @@ namespace TagLib {
|
||||
class StringPrivate;
|
||||
StringPrivate *d;
|
||||
};
|
||||
}
|
||||
} // namespace TagLib
|
||||
|
||||
/*!
|
||||
* \relates TagLib::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
|
||||
*
|
||||
* 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
|
||||
*
|
||||
* 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);
|
||||
|
||||
|
||||
/*!
|
||||
|
||||
@@ -104,12 +104,12 @@ namespace TagLib {
|
||||
StringListPrivate *d;
|
||||
};
|
||||
|
||||
}
|
||||
} // namespace TagLib
|
||||
|
||||
/*!
|
||||
* \related TagLib::StringList
|
||||
* 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
|
||||
|
||||
@@ -117,7 +117,7 @@ namespace TagLib {
|
||||
class UniqueFileIdentifierFramePrivate;
|
||||
UniqueFileIdentifierFramePrivate *d;
|
||||
};
|
||||
}
|
||||
}
|
||||
} // namespace ID3v2
|
||||
} // namespace TagLib
|
||||
|
||||
#endif
|
||||
|
||||
@@ -74,6 +74,6 @@ namespace TagLib {
|
||||
UnknownFramePrivate *d;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
} // namespace ID3v2
|
||||
} // namespace TagLib
|
||||
#endif
|
||||
|
||||
@@ -174,6 +174,6 @@ namespace TagLib {
|
||||
UnsynchronizedLyricsFramePrivate *d;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
} // namespace ID3v2
|
||||
} // namespace TagLib
|
||||
#endif
|
||||
|
||||
@@ -185,6 +185,6 @@ namespace TagLib {
|
||||
UserUrlLinkFramePrivate *d;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
} // namespace ID3v2
|
||||
} // namespace TagLib
|
||||
#endif
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user