From 9f2e4ac312ef28d4294670d3dfc7c3a4c81ab729 Mon Sep 17 00:00:00 2001 From: Jonas Kvinge Date: Sun, 19 May 2024 01:49:37 +0200 Subject: [PATCH] CueParser: Detect and handle different text encodings Fixes #1429 --- src/playlistparsers/cueparser.cpp | 23 +++++++++++++++++++++-- src/playlistparsers/cueparser.h | 2 +- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/playlistparsers/cueparser.cpp b/src/playlistparsers/cueparser.cpp index d0a6d14e5..f624ce2a4 100644 --- a/src/playlistparsers/cueparser.cpp +++ b/src/playlistparsers/cueparser.cpp @@ -2,7 +2,7 @@ * Strawberry Music Player * This file was part of Clementine. * Copyright 2010, David Sansome - * Copyright 2019-2021, Jonas Kvinge + * Copyright 2019-2024, 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 @@ -32,11 +32,14 @@ #include #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) # include +#else +# include #endif #include "core/shared_ptr.h" #include "core/logging.h" #include "utilities/timeconstants.h" +#include "utilities/textencodingutils.h" #include "settings/playlistsettingspage.h" #include "parserbase.h" #include "cueparser.h" @@ -71,11 +74,27 @@ SongList CueParser::Load(QIODevice *device, const QString &playlist_path, const QTextStream text_stream(device); + const QByteArray data_chunk = device->peek(1024); + #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) - const std::optional encoding = QStringConverter::encodingForData(device->peek(1024)); + std::optional encoding = QStringConverter::encodingForData(data_chunk); if (encoding.has_value()) { text_stream.setEncoding(encoding.value()); } + else { + const QByteArray encoding_name = Utilities::TextEncodingFromData(data_chunk); + if (!encoding_name.isEmpty()) { + encoding = QStringConverter::encodingForName(encoding_name.constData()); + if (encoding.has_value()) { + text_stream.setEncoding(encoding.value()); + } + } + } +#else + const QByteArray encoding_name = Utilities::TextEncodingFromData(data_chunk); + if (!encoding_name.isEmpty()) { + text_stream.setCodec(encoding_name.constData()); + } #endif QString dir_path = dir.absolutePath(); diff --git a/src/playlistparsers/cueparser.h b/src/playlistparsers/cueparser.h index 0b4222663..acfde8f0a 100644 --- a/src/playlistparsers/cueparser.h +++ b/src/playlistparsers/cueparser.h @@ -2,7 +2,7 @@ * Strawberry Music Player * This file was part of Clementine. * Copyright 2010, David Sansome - * Copyright 2019-2021, Jonas Kvinge + * Copyright 2019-2024, 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