10 Commits
1.1 ... 1.2.1

115 changed files with 561 additions and 446 deletions

21
LICENSE.txt Normal file
View File

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

View File

@@ -1,22 +1,23 @@
default:
@echo "Please choose a platform: linux, macos, win32"
@echo "Please choose a platform: linux, macos-intel, macos-arm64, win32"
@echo "Or use 'make clean' to clean up the build files"
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-intel:
clang++ main.cpp cJSON.cpp aes.cpp ncmcrypt.cpp -o ncmdump -ltag
clang++ main.cpp cJSON.cpp aes.cpp ncmcrypt.cpp -o ncmdump -ltag -std=c++17
strip ncmdump
macos-arm64:export CPATH=/opt/homebrew/include
macos-arm64:export LIBRARY_PATH=/opt/homebrew/lib
macos-arm64:
clang++ main.cpp cJSON.cpp aes.cpp ncmcrypt.cpp -o ncmdump -ltag
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:

View File

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

View File

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

17
color.h Normal file
View File

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

131
main.cpp
View File

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

View File

@@ -13,6 +13,8 @@
#include <stdexcept>
#include <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};
@@ -43,21 +45,13 @@ static void aesEcbDecrypt(const unsigned char *key, std::string& src, std::strin
}
static void replace(std::string& str, const std::string& from, const std::string& to) {
if(from.empty())
return;
size_t start_pos = 0;
while((start_pos = str.find(from, start_pos)) != std::string::npos) {
str.replace(start_pos, from.length(), to);
start_pos += to.length(); // In case 'to' contains 'from', like replacing 'x' with 'yx'
}
}
static std::string fileNameWithoutExt(const std::string& str)
{
size_t lastPath = str.find_last_of("/\\");
std::string path = str.substr(lastPath+1);
size_t lastExt = path.find_last_of(".");
return path.substr(0, lastExt);
if(from.empty())
return;
size_t start_pos = 0;
while((start_pos = str.find(from, start_pos)) != std::string::npos) {
str.replace(start_pos, from.length(), to);
start_pos += to.length(); // In case 'to' contains 'from', like replacing 'x' with 'yx'
}
}
NeteaseMusicMetadata::~NeteaseMusicMetadata() {
@@ -112,13 +106,13 @@ NeteaseMusicMetadata::NeteaseMusicMetadata(cJSON* raw) {
}
}
bool NeteaseCrypt::openFile(std::string const& path) {
try {
mFile.open(path, std::ios::in | std::ios::binary);
} catch (...) {
bool NeteaseCrypt::openFile(std::filesystem::path const& path) {
mFile.open(path, std::ios::in | std::ios::binary);
if (!mFile.is_open()) {
return false;
} else {
return true;
}
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");
}
@@ -225,38 +219,16 @@ void NeteaseCrypt::FixMetadata() {
}
void NeteaseCrypt::Dump() {
int n, i;
mDumpFilepath = mFilepath;
// mDumpFilepath.clear();
// mDumpFilepath.resize(1024);
// if (mMetaData) {
// mDumpFilepath = mMetaData->name();
// replace(mDumpFilepath, "\\", "");
// replace(mDumpFilepath, "/", "");
// replace(mDumpFilepath, "?", "");
// replace(mDumpFilepath, ":", "");
// replace(mDumpFilepath, "*", "");
// replace(mDumpFilepath, "\"", "");
// replace(mDumpFilepath, "<", "");
// replace(mDumpFilepath, ">", "");
// replace(mDumpFilepath, "|", "");
// } else {
mDumpFilepath = fileNameWithoutExt(mFilepath);
// }
n = 0x8000;
i = 0;
unsigned char buffer[n];
std::vector<unsigned char> buffer(0x8000);
std::ofstream output;
while (!mFile.eof()) {
n = read((char*)buffer, n);
int n = read((char*)buffer.data(), buffer.size());
for (i = 0; i < n; i++) {
for (int i = 0; i < n; i++) {
int j = (i + 1) & 0xff;
buffer[i] ^= mKeyBox[(mKeyBox[j] + mKeyBox[(mKeyBox[j] + j) & 0xff]) & 0xff];
}
@@ -265,17 +237,17 @@ 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;
}
output.open(mDumpFilepath, output.out | output.binary);
}
output.write((char*)buffer, n);
output.write((char*)buffer.data(), n);
}
output.flush();
@@ -290,38 +262,36 @@ 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;
int i;
unsigned int n;
read(reinterpret_cast<char *>(&n), sizeof(n));
if (n <= 0) {
throw std::invalid_argument("broken ncm file");
throw std::invalid_argument("Broken NCM file");
}
char keydata[n];
read(keydata, n);
std::vector<char> keydata(n);
read(keydata.data(), n);
for (i = 0; i < n; i++) {
for (size_t i = 0; i < n; i++) {
keydata[i] ^= 0x64;
}
std::string rawKeyData(keydata, n);
std::string rawKeyData(keydata.begin(), keydata.end());
std::string mKeyData;
aesEcbDecrypt(sCoreKey, rawKeyData, mKeyData);
@@ -335,10 +305,10 @@ NeteaseCrypt::NeteaseCrypt(std::string const& path) {
mMetaData = NULL;
} else {
char modifyData[n];
read(modifyData, n);
std::vector<char> modifyData(n);
read(modifyData.data(), n);
for (i = 0; i < n; i++) {
for (size_t i = 0; i < n; i++) {
modifyData[i] ^= 0x63;
}
@@ -346,7 +316,7 @@ NeteaseCrypt::NeteaseCrypt(std::string const& path) {
std::string modifyOutData;
std::string modifyDecryptData;
swapModifyData = std::string(modifyData + 22, n - 22);
swapModifyData = std::string(modifyData.begin() + 22, modifyData.end());
// escape `163 key(Don't modify):`
Base64::Decode(swapModifyData, modifyOutData);

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

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