Skip to content

Commit

Permalink
[PlaylistLoader] Fix KODIPROP parsing
Browse files Browse the repository at this point in the history
kodi props must be read in full without use delimiters
that break the string at first space or double accents "
otherwise lead to broken properties values
  • Loading branch information
CastagnaIT committed Sep 3, 2024
1 parent a6d9e91 commit fcff1a5
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 15 deletions.
38 changes: 24 additions & 14 deletions src/iptvsimple/PlaylistLoader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -552,7 +552,7 @@ void PlaylistLoader::ParseAndAddChannelGroups(const std::string& groupNamesListS

void PlaylistLoader::ParseSinglePropertyIntoChannel(const std::string& line, Channel& channel, const std::string& markerName)
{
const std::string value = ReadMarkerValue(line, markerName);
const std::string value = ReadMarkerValue(line, markerName, markerName != KODIPROP_MARKER);
auto pos = value.find('=');
if (pos != std::string::npos)
{
Expand Down Expand Up @@ -604,7 +604,9 @@ void PlaylistLoader::ReloadPlayList()
}
}

std::string PlaylistLoader::ReadMarkerValue(const std::string& line, const std::string& markerName)
std::string PlaylistLoader::ReadMarkerValue(const std::string& line,
const std::string& markerName,
bool isCheckDelimiters /* = true */)
{
size_t markerStart = line.find(markerName);
if (markerStart != std::string::npos)
Expand All @@ -613,21 +615,29 @@ std::string PlaylistLoader::ReadMarkerValue(const std::string& line, const std::
markerStart += marker.length();
if (markerStart < line.length())
{
if (marker == M3U_GROUP_MARKER && line[markerStart] != '"')
size_t markerEnd;
if (isCheckDelimiters)
{
//For this case we just want to return the full string without splitting it
//This is because groups use semi-colons and not spaces as a delimiter
return line.substr(markerStart, line.length());
}
if (marker == M3U_GROUP_MARKER && line[markerStart] != '"')
{
//For this case we just want to return the full string without splitting it
//This is because groups use semi-colons and not spaces as a delimiter
return line.substr(markerStart, line.length());
}

char find = ' ';
if (line[markerStart] == '"')
{
find = '"';
markerStart++;
char find = ' ';
if (line[markerStart] == '"')
{
find = '"';
markerStart++;
}
markerEnd = line.find(find, markerStart);
if (markerEnd == std::string::npos)
{
markerEnd = line.length();
}
}
size_t markerEnd = line.find(find, markerStart);
if (markerEnd == std::string::npos)
else
{
markerEnd = line.length();
}
Expand Down
2 changes: 1 addition & 1 deletion src/iptvsimple/PlaylistLoader.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ namespace iptvsimple
void ReloadPlayList();

private:
static std::string ReadMarkerValue(const std::string& line, const std::string& markerName);
static std::string ReadMarkerValue(const std::string& line, const std::string& markerName, bool isCheckDelimiters = true);
static void ParseSinglePropertyIntoChannel(const std::string& line, iptvsimple::data::Channel& channel, const std::string& markerName);

std::string ParseIntoChannel(const std::string& line, iptvsimple::data::Channel& channel, data::MediaEntry& mediaEntry, int epgTimeShift, int catchupCorrectionSecs, bool xeevCatchup);
Expand Down

0 comments on commit fcff1a5

Please sign in to comment.