11 Commits
1.0 ... 1.2

114 changed files with 543 additions and 412 deletions

5
.gitignore vendored
View File

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

View File

@@ -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

View File

@@ -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编译即可

View File

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

113
main.cpp
View File

@@ -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;

View File

@@ -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,14 +106,14 @@ 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() {
unsigned int header;
@@ -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,7 +284,7 @@ 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");
}

View File

@@ -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:

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.
* 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

View File

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

View File

@@ -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

View File

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

View File

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

View File

@@ -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

View File

@@ -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

View File

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

View File

@@ -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

View File

@@ -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

View File

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

View File

@@ -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

View File

@@ -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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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,

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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

View File

@@ -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

View File

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

View File

@@ -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

View File

@@ -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

View File

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

View File

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

View File

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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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

View File

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

View File

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

View File

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

View File

@@ -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

View File

@@ -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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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

View File

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

View File

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

View File

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

View File

@@ -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.

View File

@@ -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
{

View File

@@ -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_ */

View File

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

View File

@@ -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

View File

@@ -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

View File

@@ -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);
/*!

View File

@@ -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

View File

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

View File

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

View File

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

View File

@@ -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