Added an EPG bugfix for broadcasters who put literal "\n" strings in their EPG

This commit is contained in:
Klaus Schmidinger 2024-06-21 06:27:20 +02:00
parent db81c07b27
commit 32b11e1a53
3 changed files with 41 additions and 18 deletions

View File

@ -9919,10 +9919,13 @@ Video Disk Recorder Revision History
- A device is now always kept occupied if a timer is in VPS margin or needs the - A device is now always kept occupied if a timer is in VPS margin or needs the
transponder (thanks to Markus Ehrnsperger). transponder (thanks to Markus Ehrnsperger).
2024-06-13: 2024-06-21:
- Updated the Italian OSD texts (thanks to Diego Pierotto). - Updated the Italian OSD texts (thanks to Diego Pierotto).
- Fixed a possible access of a deleted object in the EIT scanner. - Fixed a possible access of a deleted object in the EIT scanner.
- Fixed setting T2 system ID from NIT (thanks to Stefan Herdler). - Fixed setting T2 system ID from NIT (thanks to Stefan Herdler).
- When starting an editing process, VDR now first checks whether there is enough - When starting an editing process, VDR now first checks whether there is enough
free disk space to take up the edited version of the recording. free disk space to take up the edited version of the recording.
- Added an EPG bugfix for broadcasters who put literal "\n" strings in their EPG.
Note that the string version of strreplace() has been modified, so that it
replaces all occurrences of the search string, not just the first one.

19
epg.c
View File

@ -7,7 +7,7 @@
* Original version (as used in VDR before 1.3.0) written by * Original version (as used in VDR before 1.3.0) written by
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>. * Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
* *
* $Id: epg.c 5.8 2024/03/06 20:16:51 kls Exp $ * $Id: epg.c 5.9 2024/06/21 06:27:20 kls Exp $
*/ */
#include "epg.h" #include "epg.h"
@ -885,6 +885,23 @@ void cEvent::FixEpgBugs(void)
Final: Final:
// And then there are the specially gifted people who put a literal "\n" string where there should be
// a '\n' character:
if (shortText) {
if (char *p = strstr(shortText, "\\n")) {
*p = 0;
p += 2;
char *s = strdup(shortText);
char *d = strdup(cString::sprintf("%s\n\n%s", p, description));
free(shortText);
free(description);
shortText = s;
description = d;
EpgBugFixStat(12, ChannelID());
}
}
description = strreplace(description, "\\n", " \n");
// VDR can't usefully handle newline characters in the title, shortText or component description of EPG // VDR can't usefully handle newline characters in the title, shortText or component description of EPG
// data, so let's always convert them to blanks (independent of the setting of EPGBugfixLevel): // data, so let's always convert them to blanks (independent of the setting of EPGBugfixLevel):
strreplace(title, '\n', ' '); strreplace(title, '\n', ' ');

13
tools.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: tools.c 5.10 2024/02/15 14:57:56 kls Exp $ * $Id: tools.c 5.11 2024/06/21 06:27:20 kls Exp $
*/ */
#include "tools.h" #include "tools.h"
@ -151,14 +151,15 @@ char *strreplace(char *s, char c1, char c2)
char *strreplace(char *s, const char *s1, const char *s2) char *strreplace(char *s, const char *s1, const char *s2)
{ {
if (!s || !s1 || !s2) if (!s || !s1 || !s2 || strcmp(s1, s2) == 0)
return s; return s;
char *p = strstr(s, s1); char *q = s;
if (p) { if (char *p = strstr(s, s1)) {
int of = p - s;
int l = strlen(s); int l = strlen(s);
int l1 = strlen(s1); int l1 = strlen(s1);
int l2 = strlen(s2); int l2 = strlen(s2);
do {
int of = p - s;
if (l2 > l1) { if (l2 > l1) {
if (char *NewBuffer = (char *)realloc(s, l + l2 - l1 + 1)) if (char *NewBuffer = (char *)realloc(s, l + l2 - l1 + 1))
s = NewBuffer; s = NewBuffer;
@ -171,6 +172,8 @@ char *strreplace(char *s, const char *s1, const char *s2)
if (l2 != l1) if (l2 != l1)
memmove(sof + l2, sof + l1, l - of - l1 + 1); memmove(sof + l2, sof + l1, l - of - l1 + 1);
memcpy(sof, s2, l2); memcpy(sof, s2, l2);
q = sof + l2;
} while (p = strstr(q, s1));
} }
return s; return s;
} }