/* * Strawberry Music Player * Copyright 2010, David Sansome * Copyright 2018-2021, Jonas Kvinge * * Strawberry is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Strawberry is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Strawberry. If not, see . * */ #include #include #include #include #include #include "strutils.h" #include "core/song.h" namespace Utilities { QString PrettySize(const quint64 bytes) { QString ret; if (bytes > 0) { if (bytes <= 1000) { ret = QString::number(bytes) + QStringLiteral(" bytes"); } else if (bytes <= 1000 * 1000) { ret = QString::asprintf("%.1f KB", static_cast(bytes) / 1000.0F); } else if (bytes <= 1000 * 1000 * 1000) { ret = QString::asprintf("%.1f MB", static_cast(bytes) / (1000.0F * 1000.0F)); } else { ret = QString::asprintf("%.1f GB", static_cast(bytes) / (1000.0F * 1000.0F * 1000.0F)); } } return ret; } QString PrettySize(const QSize size) { return QString::number(size.width()) + QLatin1Char('x') + QString::number(size.height()); } QString PathWithoutFilenameExtension(const QString &filename) { if (filename.section(QLatin1Char('/'), -1, -1).contains(QLatin1Char('.'))) return filename.section(QLatin1Char('.'), 0, -2); return filename; } QString FiddleFileExtension(const QString &filename, const QString &new_extension) { return PathWithoutFilenameExtension(filename) + QLatin1Char('.') + new_extension; } const char *EnumToString(const QMetaObject &meta, const char *name, const int value) { int index = meta.indexOfEnumerator(name); if (index == -1) return "[UnknownEnum]"; QMetaEnum metaenum = meta.enumerator(index); const char *result = metaenum.valueToKey(value); if (!result) return "[UnknownEnumValue]"; return result; } QStringList Prepend(const QString &text, const QStringList &list) { QStringList ret(list); for (int i = 0; i < ret.count(); ++i) ret[i].prepend(text); return ret; } QStringList Updateify(const QStringList &list) { QStringList ret(list); for (int i = 0; i < ret.count(); ++i) ret[i].prepend(ret[i] + QStringLiteral(" = :")); return ret; } QString DecodeHtmlEntities(const QString &text) { QString copy(text); copy.replace(QLatin1String("&"), QLatin1String("&")) .replace(QLatin1String("&"), QLatin1String("&")) .replace(QLatin1String("""), QLatin1String("\"")) .replace(QLatin1String("""), QLatin1String("\"")) .replace(QLatin1String("'"), QLatin1String("'")) .replace(QLatin1String("'"), QLatin1String("'")) .replace(QLatin1String("<"), QLatin1String("<")) .replace(QLatin1String("<"), QLatin1String("<")) .replace(QLatin1String(">"), QLatin1String(">")) .replace(QLatin1String(">"), QLatin1String(">")) .replace(QLatin1String("'"), QLatin1String("'")); return copy; } QString ReplaceMessage(const QString &message, const Song &song, const QString &newline, const bool html_escaped) { QRegularExpression variable_replacer(QStringLiteral("[%][a-z]+[%]")); QString copy(message); // Replace the first line qint64 pos = 0; QRegularExpressionMatch match; for (match = variable_replacer.match(message, pos); match.hasMatch(); match = variable_replacer.match(message, pos)) { pos = match.capturedStart(); QStringList captured = match.capturedTexts(); copy.replace(captured[0], ReplaceVariable(captured[0], song, newline, html_escaped)); pos += match.capturedLength(); } qint64 index_of = copy.indexOf(QRegularExpression(QStringLiteral(" - (>|$)"))); if (index_of >= 0) copy = copy.remove(index_of, 3); return copy; } QString ReplaceVariable(const QString &variable, const Song &song, const QString &newline, const bool html_escaped) { QString value = variable; if (variable == QStringLiteral("%title%")) { value = song.PrettyTitle(); } else if (variable == QStringLiteral("%album%")) { value = song.album(); } else if (variable == QStringLiteral("%artist%")) { value = song.artist(); } else if (variable == QStringLiteral("%albumartist%")) { value = song.effective_albumartist(); } else if (variable == QStringLiteral("%track%")) { value.setNum(song.track()); } else if (variable == QStringLiteral("%disc%")) { value.setNum(song.disc()); } else if (variable == QStringLiteral("%year%")) { value = song.PrettyYear(); } else if (variable == QStringLiteral("%originalyear%")) { value = song.PrettyOriginalYear(); } else if (variable == QStringLiteral("%genre%")) { value = song.genre(); } else if (variable == QStringLiteral("%composer%")) { value = song.composer(); } else if (variable == QStringLiteral("%performer%")) { value = song.performer(); } else if (variable == QStringLiteral("%grouping%")) { value = song.grouping(); } else if (variable == QStringLiteral("%length%")) { value = song.PrettyLength(); } else if (variable == QStringLiteral("%filename%")) { value = song.basefilename(); } else if (variable == QStringLiteral("%url%")) { value = song.url().toString(); } else if (variable == QStringLiteral("%playcount%")) { value.setNum(song.playcount()); } else if (variable == QStringLiteral("%skipcount%")) { value.setNum(song.skipcount()); } else if (variable == QStringLiteral("%rating%")) { value = song.PrettyRating(); } else if (variable == QStringLiteral("%newline%")) { return QString(newline); // No HTML escaping, return immediately. } if (html_escaped) { value = value.toHtmlEscaped(); } return value; } } // namespace Utilities