00001
00002 #include <algorithm>
00003
00004
00005 #include "eitfixup.h"
00006 #include "dvbdescriptors.h"
00007 #include "channelutil.h"
00008
00009 #include "programinfo.h"
00010 #include "dishdescriptors.h"
00011
00012
00013
00014
00015
00016 EITFixUp::EITFixUp()
00017 : m_bellYear("[\\(]{1}[0-9]{4}[\\)]{1}"),
00018 m_bellActors("\\set\\s|,"),
00019 m_bellPPVTitleAllDayHD("\\s*\\(All Day\\, HD\\)\\s*$"),
00020 m_bellPPVTitleAllDay("\\s*\\(All Day.*\\)\\s*$"),
00021 m_bellPPVTitleHD("^HD\\s?-\\s?"),
00022 m_bellPPVSubtitleAllDay("^All Day \\(.*\\sEastern\\)\\s*$"),
00023 m_bellPPVDescriptionAllDay("^\\(.*\\sEastern\\)"),
00024 m_bellPPVDescriptionAllDay2("^\\([0-9].*am-[0-9].*am\\sET\\)"),
00025 m_bellPPVDescriptionEventId("\\([0-9]{5}\\)"),
00026 m_dishPPVTitleHD("\\sHD\\s*$"),
00027 m_dishPPVTitleColon("\\:\\s*$"),
00028 m_dishPPVSpacePerenEnd("\\s\\)\\s*$"),
00029 m_dishDescriptionNew("\\s*New\\.\\s*"),
00030 m_dishDescriptionFinale("\\s*(Series|Season)\\sFinale\\.\\s*"),
00031 m_dishDescriptionFinale2("\\s*Finale\\.\\s*"),
00032 m_dishDescriptionPremiere("\\s*(Series|Season)\\s(Premier|Premiere)\\.\\s*"),
00033 m_dishDescriptionPremiere2("\\s*(Premier|Premiere)\\.\\s*"),
00034 m_dishPPVCode("\\s*\\(([A-Z]|[0-9]){5}\\)\\s*$"),
00035 m_ukThen("\\s*(Then|Followed by) 60 Seconds\\.", Qt::CaseInsensitive),
00036 m_ukNew("(New\\.|\\s*(Brand New|New)\\s*(Series|Episode)\\s*[:\\.\\-])",Qt::CaseInsensitive),
00037 m_ukCEPQ("[:\\!\\.\\?]"),
00038 m_ukColonPeriod("[:\\.]"),
00039 m_ukDotSpaceStart("^\\. "),
00040 m_ukDotEnd("\\.$"),
00041 m_ukSpaceColonStart("^[ |:]*"),
00042 m_ukSpaceStart("^ "),
00043 m_ukSeries("\\s*\\(?\\s*(?:Episode|Part|Pt)?\\s*(\\d{1,2})\\s*(?:of|/)\\s*(\\d{1,2})\\s*\\)?\\s*(?:\\.|:)?", Qt::CaseInsensitive),
00044 m_ukCC("\\[(?:(AD|SL|S|W),?)+\\]"),
00045 m_ukYear("[\\[\\(]([\\d]{4})[\\)\\]]"),
00046 m_uk24ep("^\\d{1,2}:00[ap]m to \\d{1,2}:00[ap]m: "),
00047 m_ukStarring("(?:Western\\s)?[Ss]tarring ([\\w\\s\\-']+)[Aa]nd\\s([\\w\\s\\-']+)[\\.|,](?:\\s)*(\\d{4})?(?:\\.\\s)?"),
00048 m_ukBBC7rpt("\\[Rptd?[^]]+\\d{1,2}\\.\\d{1,2}[ap]m\\]\\."),
00049 m_ukDescriptionRemove("^(?:CBBC\\s*\\.|CBeebies\\s*\\.|Class TV\\s*:|BBC Switch\\.)"),
00050 m_ukTitleRemove("^(?:[tT]4:|Schools\\s*:)"),
00051 m_ukDoubleDotEnd("\\.\\.+$"),
00052 m_ukDoubleDotStart("^\\.\\.+"),
00053 m_ukTime("\\d{1,2}[\\.:]\\d{1,2}\\s*(am|pm|)"),
00054 m_ukBBC34("BBC (?:THREE|FOUR) on BBC (?:ONE|TWO)\\.",Qt::CaseInsensitive),
00055 m_ukYearColon("^[\\d]{4}:"),
00056 m_ukExclusionFromSubtitle("(starring|stars\\s|drama|series|sitcom)",Qt::CaseInsensitive),
00057 m_ukCompleteDots("^\\.\\.+$"),
00058 m_ukQuotedSubtitle("(?:^')([\\w\\s\\-,]+)(?:\\.' )"),
00059 m_ukAllNew("All New To 4Music!\\s?"),
00060 m_comHemCountry("^(\\(.+\\))?\\s?([^ ]+)\\s([^\\.0-9]+)"
00061 "(?:\\sfrån\\s([0-9]{4}))(?:\\smed\\s([^\\.]+))?\\.?"),
00062 m_comHemDirector("[Rr]egi"),
00063 m_comHemActor("[Ss]kådespelare|[Ii] rollerna"),
00064 m_comHemHost("[Pp]rogramledare"),
00065 m_comHemSub("[.\\?\\!] "),
00066 m_comHemRerun1("[Rr]epris\\sfrån\\s([^\\.]+)(?:\\.|$)"),
00067 m_comHemRerun2("([0-9]+)/([0-9]+)(?:\\s-\\s([0-9]{4}))?"),
00068 m_comHemTT("[Tt]ext-[Tt][Vv]"),
00069 m_comHemPersSeparator("(, |\\soch\\s)"),
00070 m_comHemPersons("\\s?([Rr]egi|[Ss]kådespelare|[Pp]rogramledare|"
00071 "[Ii] rollerna):\\s([^\\.]+)\\."),
00072 m_comHemSubEnd("\\s?\\.\\s?$"),
00073 m_comHemSeries1("\\s?(?:[dD]el|[eE]pisode)\\s([0-9]+)"
00074 "(?:\\s?(?:/|:|av)\\s?([0-9]+))?\\."),
00075 m_comHemSeries2("\\s?-?\\s?([Dd]el\\s+([0-9]+))"),
00076 m_comHemTSub("\\s+-\\s+([^\\-]+)"),
00077 m_mcaIncompleteTitle("(.*).\\.\\.\\.$"),
00078 m_mcaCompleteTitlea("^'?("),
00079 m_mcaCompleteTitleb("[^\\.\\?]+[^\\'])'?[\\.\\?]\\s+(.+)"),
00080 m_mcaSubtitle("^'([^\\.]+)'\\.\\s+(.+)"),
00081 m_mcaSeries("^S?(\\d+)\\/E?(\\d+)\\s-\\s(.*)$"),
00082 m_mcaCredits("(.*)\\s\\((\\d{4})\\)\\s*([^\\.]+)\\.?\\s*$"),
00083 m_mcaAvail("\\s(Only available on [^\\.]*bouquet|Not available in RSA [^\\.]*)\\.?"),
00084 m_mcaActors("(.*\\.)\\s+([^\\.]+\\s[A-Z][^\\.]+)\\.\\s*"),
00085 m_mcaActorsSeparator("(,\\s+)"),
00086 m_mcaYear("(.*)\\s\\((\\d{4})\\)\\s*$"),
00087 m_mcaCC(",?\\s(HI|English) Subtitles\\.?"),
00088 m_mcaDD(",?\\sDD\\.?"),
00089 m_RTLrepeat("(\\(|\\s)?Wiederholung.+vo[m|n].+((?:\\d{2}\\.\\d{2}\\.\\d{4})|(?:\\d{2}[:\\.]\\d{2}\\sUhr))\\)?"),
00090 m_RTLSubtitle("^([^\\.]{3,})\\.\\s+(.+)"),
00091 m_RTLSubtitle1("^Folge\\s(\\d{1,4})\\s*:\\s+'(.*)'(?:\\.\\s*|$)"),
00092 m_RTLSubtitle2("^Folge\\s(\\d{1,4})\\s+(.{,5}[^\\.]{,120})[\\?!\\.]\\s*"),
00093 m_RTLSubtitle3("^(?:Folge\\s)?(\\d{1,4}(?:\\/[IVX]+)?)\\s+(.{,5}[^\\.]{,120})[\\?!\\.]\\s*"),
00094 m_RTLSubtitle4("^Thema.{0,5}:\\s([^\\.]+)\\.\\s*"),
00095 m_RTLSubtitle5("^'(.+)'\\.\\s*"),
00096 m_RTLEpisodeNo1("^(Folge\\s\\d{1,4})\\.*\\s*"),
00097 m_RTLEpisodeNo2("^(\\d{1,2}\\/[IVX]+)\\.*\\s*"),
00098 m_fiRerun("\\ ?Uusinta[a-zA-Z\\ ]*\\.?"),
00099 m_fiRerun2("\\([Uu]\\)"),
00100 m_dePremiereInfos("([^.]+)?\\s?([0-9]{4})\\.\\s[0-9]+\\sMin\\.(?:\\sVon"
00101 "\\s([^,]+)(?:,|\\su\\.\\sa\\.)\\smit\\s(.+)\\.)?"),
00102 m_dePremiereOTitle("\\s*\\(([^\\)]*)\\)$"),
00103 m_nlTxt("txt"),
00104 m_nlWide("breedbeeld"),
00105 m_nlRepeat("herh."),
00106 m_nlHD("\\sHD$"),
00107 m_nlSub("\\sAfl\\.:\\s([^\\.]+)\\."),
00108 m_nlActors("\\sMet:\\s.+e\\.a\\."),
00109 m_nlPres("\\sPresentatie:\\s([^\\.]+)\\."),
00110 m_nlPersSeparator("(, |\\sen\\s)"),
00111 m_nlRub("\\s?\\({1}\\W+\\){1}\\s?"),
00112 m_nlYear1("(?=\\suit\\s)([1-2]{2}[0-9]{2})"),
00113 m_nlYear2("([\\s]{1}[\\(]{1}[A-Z]{0,3}/?)([1-2]{2}[0-9]{2})([\\)]{1})"),
00114 m_nlDirector("(?=\\svan\\s)(([A-Z]{1}[a-z]+\\s)|([A-Z]{1}\\.\\s))"),
00115 m_nlCat("^(Amusement|Muziek|Informatief|Nieuws/actualiteiten|Jeugd|Animatie|Sport|Serie/soap|Kunst/Cultuur|Documentaire|Film|Natuur|Erotiek|Comedy|Misdaad|Religieus)\\.\\s"),
00116 m_nlOmroep ("\\s\\(([A-Z]+/?)+\\)$"),
00117 m_noRerun("\\(R\\)"),
00118 m_noColonSubtitle("^([^:]+): (.+)"),
00119 m_noNRKCategories("^(Superstrek[ea]r|Supersomm[ea]r|Superjul|Barne-tv|Fantorangen|Kuraffen|Supermorg[eo]n|Julemorg[eo]n|Sommermorg[eo]n|"
00120 "Kuraffen-TV|Sport i dag|NRKs sportsl.rdag|NRKs sportss.ndag|Dagens dokumentar|"
00121 "NRK2s historiekveld|Detektimen|Nattkino|Filmklassiker|Film|Kortfilm|P.skemorg[eo]n|"
00122 "Radioteatret|Opera|P2-Akademiet|Nyhetsmorg[eo]n i P2 og Alltid Nyheter:): (.+)"),
00123 m_noPremiere("\\s+-\\s+(Sesongpremiere|Premiere|premiere)!?$"),
00124 m_Stereo("\\b\\(?[sS]tereo\\)?\\b")
00125
00126 {
00127 }
00128
00129 void EITFixUp::Fix(DBEventEIT &event) const
00130 {
00131 if (event.fixup)
00132 {
00133 if (event.subtitle == event.title)
00134 event.subtitle = QString("");
00135
00136 if (event.description.isEmpty() && !event.subtitle.isEmpty())
00137 {
00138 event.description = event.subtitle;
00139 event.subtitle = QString("");
00140 }
00141 }
00142
00143 if (kFixHDTV & event.fixup)
00144 event.videoProps |= VID_HDTV;
00145
00146 if (kFixBell & event.fixup)
00147 FixBellExpressVu(event);
00148
00149 if (kFixDish & event.fixup)
00150 FixBellExpressVu(event);
00151
00152 if (kFixUK & event.fixup)
00153 FixUK(event);
00154
00155 if (kFixPBS & event.fixup)
00156 FixPBS(event);
00157
00158 if (kFixComHem & event.fixup)
00159 FixComHem(event, kFixSubtitle & event.fixup);
00160
00161 if (kFixAUStar & event.fixup)
00162 FixAUStar(event);
00163
00164 if (kFixMCA & event.fixup)
00165 FixMCA(event);
00166
00167 if (kFixRTL & event.fixup)
00168 FixRTL(event);
00169
00170 if (kFixFI & event.fixup)
00171 FixFI(event);
00172
00173 if (kFixPremiere & event.fixup)
00174 FixPremiere(event);
00175
00176 if (kFixNL & event.fixup)
00177 FixNL(event);
00178
00179 if (kFixNO & event.fixup)
00180 FixNO(event);
00181
00182 if (kFixNRK_DVBT & event.fixup)
00183 FixNRK_DVBT(event);
00184
00185 if (kFixCategory & event.fixup)
00186 FixCategory(event);
00187
00188 if (event.fixup)
00189 {
00190 if (!event.title.isEmpty())
00191 {
00192 event.title = event.title.replace(QChar('\0'), "");
00193 event.title = event.title.trimmed();
00194 }
00195
00196 if (!event.subtitle.isEmpty())
00197 {
00198 event.subtitle = event.subtitle.replace(QChar('\0'), "");
00199 event.subtitle = event.subtitle.trimmed();
00200 }
00201
00202 if (!event.description.isEmpty())
00203 {
00204 event.description = event.description.replace(QChar('\0'), "");
00205 event.description = event.description.trimmed();
00206 }
00207 }
00208
00209 if (kFixGenericDVB & event.fixup)
00210 {
00211 event.programId = AddDVBEITAuthority(event.chanid, event.programId);
00212 event.seriesId = AddDVBEITAuthority(event.chanid, event.seriesId);
00213 }
00214 }
00215
00231 QString EITFixUp::AddDVBEITAuthority(uint chanid, const QString &id)
00232 {
00233 if (id.isEmpty())
00234 return id;
00235
00236
00237 QString crid = id.toLower();
00238
00239
00240 if (crid.startsWith("crid://"))
00241 crid.remove(0,7);
00242
00243
00244 if (crid.length() >= 1 && crid[0] != '/')
00245 return crid;
00246
00247 QString authority = ChannelUtil::GetDefaultAuthority(chanid);
00248 if (authority.isEmpty())
00249 return "";
00250
00251 return authority + crid;
00252 }
00253
00259 void EITFixUp::FixBellExpressVu(DBEventEIT &event) const
00260 {
00261 QString tmp;
00262
00263
00264
00265 int position = event.description.indexOf(0x0D);
00266
00267 if (position != -1)
00268 {
00269
00270
00271 event.subtitle = event.description.left(position);
00272 event.description = event.description.right(
00273 event.description.length() - position - 2);
00274 }
00275
00276
00277
00278 position = event.description.indexOf(".");
00279
00280
00281 if (position < 10)
00282 {
00283 }
00284 else
00285 {
00286 event.category = "Unknown";
00287 }
00288
00289
00290
00291 if (event.category.isEmpty())
00292 {
00293
00294
00295 position = event.description.indexOf(".");
00296 if ((position + 1) < event.description.length())
00297 position = event.description.indexOf(". ");
00298
00299
00300 if ((position > -1) && position < 20)
00301 {
00302 const QString stmp = event.description;
00303 event.description = stmp.right(stmp.length() - position - 2);
00304 event.category = stmp.left(position);
00305
00306 int position_p = event.category.indexOf("(");
00307 if (position_p == -1)
00308 event.description = stmp.right(stmp.length() - position - 2);
00309 else
00310 event.category = "Unknown";
00311 }
00312 else
00313 {
00314 event.category = "Unknown";
00315 }
00316
00317
00318
00319 if (event.category == "-")
00320 event.category = "OffAir";
00321
00322 if (event.category.length() > 20)
00323 event.category = "Unknown";
00324 }
00325 else if (event.categoryType)
00326 {
00327 QString theme = dish_theme_type_to_string(event.categoryType);
00328 event.description = event.description.replace(theme, "");
00329 if (event.description.startsWith("."))
00330 event.description = event.description.right(event.description.length() - 1);
00331 if (event.description.startsWith(" "))
00332 event.description = event.description.right(event.description.length() - 1);
00333 }
00334
00335
00336 position = event.description.indexOf(m_bellYear);
00337 if (position != -1 && !event.category.isEmpty())
00338 {
00339 tmp = "";
00340
00341 bool ok;
00342 uint y = event.description.mid(position + 1, 4).toUInt(&ok);
00343 if (ok)
00344 {
00345 event.originalairdate = QDate(y, 1, 1);
00346 event.airdate = y;
00347 event.previouslyshown = true;
00348 }
00349
00350
00351 if (position > 3)
00352 {
00353 tmp = event.description.left(position-3);
00354 QStringList actors =
00355 tmp.split(m_bellActors, QString::SkipEmptyParts);
00356 QStringList::const_iterator it = actors.begin();
00357 for (; it != actors.end(); ++it)
00358 event.AddPerson(DBPerson::kActor, *it);
00359 }
00360
00361 event.description = event.description.right(
00362 event.description.length() - position - 7);
00363 }
00364
00365
00366
00367 position = event.description.indexOf("(CC)");
00368 if (position != -1)
00369 {
00370 event.subtitleType |= SUB_HARDHEAR;
00371 event.description = event.description.replace("(CC)", "");
00372 }
00373
00374
00375 position = event.description.indexOf(m_Stereo);
00376 if (position != -1)
00377 {
00378 event.audioProps |= AUD_STEREO;
00379 event.description = event.description.replace(m_Stereo, "");
00380 }
00381
00382
00383 position = event.title.indexOf(m_bellPPVTitleAllDayHD);
00384 if (position != -1)
00385 {
00386 event.title = event.title.replace(m_bellPPVTitleAllDayHD, "");
00387 event.videoProps |= VID_HDTV;
00388 }
00389
00390
00391 position = event.title.indexOf(m_bellPPVTitleAllDay);
00392 if (position != -1)
00393 {
00394 event.title = event.title.replace(m_bellPPVTitleAllDay, "");
00395 }
00396
00397
00398 position = event.title.indexOf(m_bellPPVTitleHD);
00399 if (position != -1)
00400 {
00401 event.title = event.title.replace(m_bellPPVTitleHD, "");
00402 event.videoProps |= VID_HDTV;
00403 }
00404
00405
00406 position = event.description.indexOf("(HD)");
00407 if (position != -1)
00408 {
00409 event.description = event.description.replace("(HD)", "");
00410 event.videoProps |= VID_HDTV;
00411 }
00412
00413
00414 position = event.title.indexOf("(HD)");
00415 if (position != -1)
00416 {
00417 event.description = event.title.replace("(HD)", "");
00418 event.videoProps |= VID_HDTV;
00419 }
00420
00421
00422 position = event.title.indexOf(m_dishPPVTitleHD);
00423 if (position != -1)
00424 {
00425 event.title = event.title.replace(m_dishPPVTitleHD, "");
00426 event.videoProps |= VID_HDTV;
00427 }
00428
00429
00430 position = event.description.indexOf("(DD)");
00431 if (position != -1)
00432 {
00433 event.description = event.description.replace("(DD)", "");
00434 event.audioProps |= AUD_DOLBY;
00435 event.audioProps |= AUD_STEREO;
00436 }
00437
00438
00439 position = event.description.indexOf("(SAP)");
00440 if (position != -1)
00441 {
00442 event.description = event.description.replace("(SAP", "");
00443 event.subtitleType |= SUB_HARDHEAR;
00444 }
00445
00446
00447 position = event.title.indexOf(m_dishPPVTitleColon);
00448 if (position != -1)
00449 {
00450 event.title = event.title.replace(m_dishPPVTitleColon, "");
00451 }
00452
00453
00454 position = event.description.indexOf(m_dishDescriptionNew);
00455 if (position != -1)
00456 {
00457 event.previouslyshown = false;
00458 event.description = event.description.replace(m_dishDescriptionNew, "");
00459 }
00460
00461
00462 position = event.description.indexOf(m_dishDescriptionFinale);
00463 if (position != -1)
00464 {
00465 event.previouslyshown = false;
00466 event.description = event.description.replace(m_dishDescriptionFinale, "");
00467 }
00468
00469
00470 position = event.description.indexOf(m_dishDescriptionFinale2);
00471 if (position != -1)
00472 {
00473 event.previouslyshown = false;
00474 event.description = event.description.replace(m_dishDescriptionFinale2, "");
00475 }
00476
00477
00478 position = event.description.indexOf(m_dishDescriptionPremiere);
00479 if (position != -1)
00480 {
00481 event.previouslyshown = false;
00482 event.description = event.description.replace(m_dishDescriptionPremiere, "");
00483 }
00484
00485
00486 position = event.description.indexOf(m_dishDescriptionPremiere2);
00487 if (position != -1)
00488 {
00489 event.previouslyshown = false;
00490 event.description = event.description.replace(m_dishDescriptionPremiere2, "");
00491 }
00492
00493
00494 QRegExp ppvcode = m_dishPPVCode;
00495 ppvcode.setCaseSensitivity(Qt::CaseInsensitive);
00496 position = event.description.indexOf(ppvcode);
00497 if (position != -1)
00498 {
00499 event.description = event.description.replace(ppvcode, "");
00500 }
00501
00502
00503 position = event.description.indexOf(m_dishPPVSpacePerenEnd);
00504 if (position != -1)
00505 {
00506 event.description = event.description.replace(m_dishPPVSpacePerenEnd, "");
00507 }
00508
00509
00510 position = event.subtitle.indexOf(m_bellPPVSubtitleAllDay);
00511 if (position != -1)
00512 {
00513 event.subtitle = event.subtitle.replace(m_bellPPVSubtitleAllDay, "");
00514 }
00515
00516
00517 position = event.description.indexOf(m_bellPPVDescriptionAllDay);
00518 if (position != -1)
00519 {
00520 event.description = event.description.replace(m_bellPPVDescriptionAllDay, "");
00521 }
00522
00523
00524 position = event.description.indexOf(m_bellPPVDescriptionAllDay2);
00525 if (position != -1)
00526 {
00527 event.description = event.description.replace(m_bellPPVDescriptionAllDay2, "");
00528 }
00529
00530
00531 position = event.description.indexOf(m_bellPPVDescriptionEventId);
00532 if (position != -1)
00533 {
00534 event.description = event.description.replace(m_bellPPVDescriptionEventId, "");
00535 }
00536
00537 }
00538
00542 void EITFixUp::SetUKSubtitle(DBEventEIT &event) const
00543 {
00544 QStringList strListColon = event.description.split(":");
00545 QStringList strListEnd;
00546
00547 bool fColon = false, fQuotedSubtitle = false;
00548 int nPosition1;
00549 QString strEnd;
00550 if (strListColon.count()>1)
00551 {
00552 bool fDoubleDot = false;
00553 bool fSingleDot = true;
00554 int nLength = strListColon[0].length();
00555
00556 nPosition1 = event.description.indexOf("..");
00557 if ((nPosition1 < nLength) && (nPosition1 >= 0))
00558 fDoubleDot = true;
00559 nPosition1 = event.description.indexOf(".");
00560 if (nPosition1==-1)
00561 fSingleDot = false;
00562 if (nPosition1 > nLength)
00563 fSingleDot = false;
00564 else
00565 {
00566 QString strTmp = event.description.mid(nPosition1+1,
00567 nLength-nPosition1);
00568
00569 QStringList tmp = strTmp.split(" ");
00570 if (((uint) tmp.size()) < kMaxDotToColon)
00571 fSingleDot = false;
00572 }
00573
00574 if (fDoubleDot)
00575 {
00576 strListEnd = strListColon;
00577 fColon = true;
00578 }
00579 else if (!fSingleDot)
00580 {
00581 QStringList strListTmp;
00582 uint nTitle=0;
00583 int nTitleMax=-1;
00584 int i;
00585 for (i =0; (i<(int)strListColon.count()) && (nTitleMax==-1);i++)
00586 {
00587 const QStringList tmp = strListColon[i].split(" ");
00588
00589 nTitle += tmp.size();
00590
00591 if (nTitle < kMaxToTitle)
00592 strListTmp.push_back(strListColon[i]);
00593 else
00594 nTitleMax=i;
00595 }
00596 QString strPartial;
00597 for (i=0;i<(nTitleMax-1);i++)
00598 strPartial+=strListTmp[i]+":";
00599 if (nTitleMax>0)
00600 {
00601 strPartial+=strListTmp[nTitleMax-1];
00602 strListEnd.push_back(strPartial);
00603 }
00604 for (i=nTitleMax+1;i<(int)strListColon.count();i++)
00605 strListEnd.push_back(strListColon[i]);
00606 fColon = true;
00607 }
00608 }
00609 QRegExp tmpQuotedSubtitle = m_ukQuotedSubtitle;
00610 if (tmpQuotedSubtitle.indexIn(event.description) != -1)
00611 {
00612 event.subtitle = tmpQuotedSubtitle.cap(1);
00613 event.description.remove(m_ukQuotedSubtitle);
00614 fQuotedSubtitle = true;
00615 }
00616 QStringList strListPeriod;
00617 QStringList strListQuestion;
00618 QStringList strListExcl;
00619 if (!(fColon || fQuotedSubtitle))
00620 {
00621 strListPeriod = event.description.split(".");
00622 if (strListPeriod.count() >1)
00623 {
00624 nPosition1 = event.description.indexOf(".");
00625 int nPosition2 = event.description.indexOf("..");
00626 if ((nPosition1 < nPosition2) || (nPosition2==-1))
00627 strListEnd = strListPeriod;
00628 }
00629
00630 strListQuestion = event.description.split("?");
00631 strListExcl = event.description.split("!");
00632 if ((strListQuestion.size() > 1) &&
00633 ((uint)strListQuestion.size() <= kMaxQuestionExclamation))
00634 {
00635 strListEnd = strListQuestion;
00636 strEnd = "?";
00637 }
00638 else if ((strListExcl.size() > 1) &&
00639 ((uint)strListExcl.size() <= kMaxQuestionExclamation))
00640 {
00641 strListEnd = strListExcl;
00642 strEnd = "!";
00643 }
00644 else
00645 strEnd = QString::null;
00646 }
00647
00648 if (!strListEnd.empty())
00649 {
00650 QStringList strListSpace = strListEnd[0].split(
00651 " ", QString::SkipEmptyParts);
00652 if (fColon && ((uint)strListSpace.size() > kMaxToTitle))
00653 return;
00654 if ((uint)strListSpace.size() > kDotToTitle)
00655 return;
00656 if (strListSpace.filter(m_ukExclusionFromSubtitle).empty())
00657 {
00658 event.subtitle = strListEnd[0]+strEnd;
00659 event.subtitle.remove(m_ukSpaceColonStart);
00660 event.description=
00661 event.description.mid(strListEnd[0].length()+1);
00662 event.description.remove(m_ukSpaceColonStart);
00663 }
00664 }
00665 }
00666
00667
00671 void EITFixUp::FixUK(DBEventEIT &event) const
00672 {
00673 int position1;
00674 int position2;
00675 QString strFull;
00676
00677 bool isMovie = event.category.startsWith("Movie",Qt::CaseInsensitive);
00678
00679 event.description = event.description.remove(m_ukThen);
00680 event.description = event.description.remove(m_ukNew);
00681
00682
00683 event.title = event.title.remove(m_ukTitleRemove);
00684 event.description = event.description.remove(m_ukDescriptionRemove);
00685
00686
00687 event.description = event.description.remove(m_ukBBC34);
00688
00689
00690 event.description = event.description.remove(m_ukBBC7rpt);
00691
00692
00693 event.description = event.description.remove(m_ukAllNew);
00694
00695
00696 QRegExp tmpCC = m_ukCC;
00697 if ((position1 = tmpCC.indexIn(event.description)) != -1)
00698 {
00699 QStringList tmpCCitems = tmpCC.cap(0).remove("[").remove("]").split(",");
00700 if (tmpCCitems.contains("AD"))
00701 event.audioProps |= AUD_VISUALIMPAIR;
00702 if (tmpCCitems.contains("S"))
00703 event.subtitleType |= SUB_NORMAL;
00704 if (tmpCCitems.contains("SL"))
00705 event.subtitleType |= SUB_SIGNED;
00706 if (tmpCCitems.contains("W"))
00707 event.videoProps |= VID_WIDESCREEN;
00708 event.description = event.description.remove(m_ukCC);
00709 }
00710
00711 event.title = event.title.trimmed();
00712 event.description = event.description.trimmed();
00713
00714
00715 bool series = false;
00716 QRegExp tmpExp1 = m_ukSeries;
00717 if ((position1 = tmpExp1.indexIn(event.title)) != -1)
00718 {
00719 if ((tmpExp1.cap(1).toUInt() <= tmpExp1.cap(2).toUInt())
00720 && tmpExp1.cap(2).toUInt()<=50)
00721 {
00722 event.partnumber = tmpExp1.cap(1).toUInt();
00723 event.parttotal = tmpExp1.cap(2).toUInt();
00724
00725 event.title = event.title.left(position1) +
00726 event.title.mid(position1 + tmpExp1.cap(0).length());
00727 series = true;
00728 }
00729 }
00730 else if ((position1 = tmpExp1.indexIn(event.description)) != -1)
00731 {
00732 if ((tmpExp1.cap(1).toUInt() <= tmpExp1.cap(2).toUInt())
00733 && tmpExp1.cap(2).toUInt()<=50)
00734 {
00735 event.partnumber = tmpExp1.cap(1).toUInt();
00736 event.parttotal = tmpExp1.cap(2).toUInt();
00737
00738 event.description = event.description.left(position1) +
00739 event.description.mid(position1+tmpExp1.cap(0).length());
00740 series = true;
00741 }
00742 }
00743 if (series)
00744 event.categoryType = kCategorySeries;
00745
00746 QRegExp tmpStarring = m_ukStarring;
00747 if (tmpStarring.indexIn(event.description) != -1)
00748 {
00749
00750 event.AddPerson(DBPerson::kActor, tmpStarring.cap(1));
00751 event.AddPerson(DBPerson::kActor, tmpStarring.cap(2));
00752 if (tmpStarring.cap(3).length() > 0)
00753 {
00754 bool ok;
00755 uint y = tmpStarring.cap(3).toUInt(&ok);
00756 if (ok)
00757 {
00758 event.airdate = y;
00759 event.originalairdate = QDate(y, 1, 1);
00760 }
00761 }
00762 }
00763
00764 QRegExp tmp24ep = m_uk24ep;
00765 if (!event.title.startsWith("CSI:") && !event.title.startsWith("CD:"))
00766 {
00767 if (((position1=event.title.indexOf(m_ukDoubleDotEnd)) != -1) &&
00768 ((position2=event.description.indexOf(m_ukDoubleDotStart)) != -1))
00769 {
00770 QString strPart=event.title.remove(m_ukDoubleDotEnd)+" ";
00771 strFull = strPart + event.description.remove(m_ukDoubleDotStart);
00772 if (isMovie &&
00773 ((position1 = strFull.indexOf(m_ukCEPQ,strPart.length())) != -1))
00774 {
00775 if (strFull[position1] == '!' || strFull[position1] == '?')
00776 position1++;
00777 event.title = strFull.left(position1);
00778 event.description = strFull.mid(position1 + 1);
00779 event.description.remove(m_ukSpaceStart);
00780 }
00781 else if ((position1 = strFull.indexOf(m_ukCEPQ)) != -1)
00782 {
00783 if (strFull[position1] == '!' || strFull[position1] == '?')
00784 position1++;
00785 event.title = strFull.left(position1);
00786 event.description = strFull.mid(position1 + 1);
00787 event.description.remove(m_ukSpaceStart);
00788 SetUKSubtitle(event);
00789 }
00790 if ((position1 = strFull.indexOf(m_ukYear)) != -1)
00791 {
00792
00793 if ((uint)position1 < SUBTITLE_MAX_LEN)
00794 {
00795 event.description = event.title.mid(position1);
00796 event.title = event.title.left(position1);
00797 }
00798 }
00799 }
00800 else if ((position1 = tmp24ep.indexIn(event.description)) != -1)
00801 {
00802
00803
00804 event.subtitle = event.description.mid(position1,
00805 tmp24ep.cap(0).length() - 2);
00806 event.description = event.description.remove(tmp24ep.cap(0));
00807 }
00808 else if ((position1 = event.description.indexOf(m_ukTime)) == -1)
00809 {
00810 if (!isMovie && (event.title.indexOf(m_ukYearColon) < 0))
00811 {
00812 if (((position1 = event.title.indexOf(":")) != -1) &&
00813 (event.description.indexOf(":") < 0 ))
00814 {
00815 if (event.title.mid(position1+1).indexOf(m_ukCompleteDots)==0)
00816 {
00817 SetUKSubtitle(event);
00818 QString strTmp = event.title.mid(position1+1);
00819 event.title.resize(position1);
00820 event.subtitle = strTmp+event.subtitle;
00821 }
00822 else if ((uint)position1 < SUBTITLE_MAX_LEN)
00823 {
00824 event.subtitle = event.title.mid(position1 + 1);
00825 event.title = event.title.left(position1);
00826 }
00827 }
00828 else
00829 SetUKSubtitle(event);
00830 }
00831 }
00832 }
00833
00834 if (!isMovie && event.subtitle.isEmpty())
00835 {
00836 if ((position1=event.description.indexOf(m_ukTime)) != -1)
00837 {
00838 position2 = event.description.indexOf(m_ukColonPeriod);
00839 if ((position2>=0) && (position2 < (position1-2)))
00840 SetUKSubtitle(event);
00841 }
00842 else if ((position1=event.title.indexOf("-")) != -1)
00843 {
00844 if ((uint)position1 < SUBTITLE_MAX_LEN)
00845 {
00846 event.subtitle = event.title.mid(position1 + 1);
00847 event.subtitle.remove(m_ukSpaceColonStart);
00848 event.title = event.title.left(position1);
00849 }
00850 }
00851 else
00852 SetUKSubtitle(event);
00853 }
00854
00855
00856 QRegExp tmpUKYear = m_ukYear;
00857 if ((position1 = tmpUKYear.indexIn(event.description)) != -1)
00858 {
00859 QString stmp = event.description;
00860 int itmp = position1 + tmpUKYear.cap(0).length();
00861 event.description = stmp.left(position1) + stmp.mid(itmp);
00862 bool ok;
00863 uint y = tmpUKYear.cap(1).toUInt(&ok);
00864 if (ok)
00865 {
00866 event.airdate = y;
00867 event.originalairdate = QDate(y, 1, 1);
00868 }
00869 }
00870
00871
00872 event.subtitle.remove(m_ukDotSpaceStart);
00873 if (event.subtitle.lastIndexOf("..") != (((int)event.subtitle.length())-2))
00874 event.subtitle.remove(m_ukDotEnd);
00875
00876
00877 if (event.description.isEmpty() && !event.subtitle.isEmpty())
00878 {
00879 event.description=event.subtitle;
00880 event.subtitle=QString::null;
00881 }
00882 }
00883
00887 void EITFixUp::FixPBS(DBEventEIT &event) const
00888 {
00889
00890 int position = event.description.indexOf(':');
00891 if (position != -1)
00892 {
00893 const QString stmp = event.description;
00894 event.subtitle = stmp.left(position);
00895 event.description = stmp.right(stmp.length() - position - 2);
00896 }
00897 }
00898
00902 void EITFixUp::FixComHem(DBEventEIT &event, bool process_subtitle) const
00903 {
00904
00905 if (event.subtitle.isEmpty() && !event.description.isEmpty())
00906 {
00907 event.subtitle = event.description;
00908 event.description = "";
00909 }
00910
00911
00912 event.subtitle = "";
00913
00914 bool isSeries = false;
00915
00916 int pos;
00917 QRegExp tmpSeries1 = m_comHemSeries1;
00918 QRegExp tmpSeries2 = m_comHemSeries2;
00919 if ((pos = tmpSeries2.indexIn(event.title)) != -1)
00920 {
00921 QStringList list = tmpSeries2.capturedTexts();
00922 event.partnumber = list[2].toUInt();
00923 event.title = event.title.replace(list[0],"");
00924 }
00925 else if ((pos = tmpSeries1.indexIn(event.description)) != -1)
00926 {
00927 QStringList list = tmpSeries1.capturedTexts();
00928 if (!list[1].isEmpty())
00929 {
00930 event.partnumber = list[1].toUInt();
00931 }
00932 if (!list[2].isEmpty())
00933 {
00934 event.parttotal = list[2].toUInt();
00935 }
00936
00937
00938
00939 if(pos > 0)
00940 event.description = event.description.replace(list[0],"");
00941 isSeries = true;
00942 }
00943
00944
00945
00946 if (event.partnumber > 0)
00947 {
00948 event.subtitle = QString("Del %1").arg(event.partnumber);
00949 if (event.parttotal > 0)
00950 {
00951 event.subtitle += QString(" av %1").arg(event.parttotal);
00952 }
00953 }
00954
00955
00956 QRegExp tmpTSub = m_comHemTSub;
00957 if (tmpTSub.indexIn(event.title) != -1)
00958 {
00959 event.subtitle = tmpTSub.cap(1);
00960 event.title = event.title.replace(tmpTSub.cap(0),"");
00961 }
00962
00963
00964 if (event.description.length() <= 0)
00965 return;
00966
00967
00968
00969 QRegExp tmpCountry = m_comHemCountry;
00970 pos = tmpCountry.indexIn(event.description);
00971 if (pos != -1)
00972 {
00973 QStringList list = tmpCountry.capturedTexts();
00974 QString replacement;
00975
00976
00977
00978 if (list[1].length() > 0)
00979 {
00980 replacement = list[1] + " ";
00981
00982 }
00983
00984
00985 if (list[2].length() > 0)
00986 {
00987 replacement += list[2] + " ";
00988
00989 }
00990
00991
00992 if (list[3].length() > 0)
00993 {
00994 replacement += list[3] + ".";
00995 if(event.category.isEmpty())
00996 {
00997 event.category = list[3];
00998 }
00999
01000 if(list[3].indexOf("serie")!=-1)
01001 {
01002 isSeries = true;
01003 }
01004 }
01005
01006
01007 if (list[4].length() > 0)
01008 {
01009 bool ok;
01010 uint y = list[4].trimmed().toUInt(&ok);
01011 if (ok)
01012 event.airdate = y;
01013 }
01014
01015
01016 if (list[5].length() > 0)
01017 {
01018 const QStringList actors =
01019 list[5].split(m_comHemPersSeparator, QString::SkipEmptyParts);
01020 QStringList::const_iterator it = actors.begin();
01021 for (; it != actors.end(); ++it)
01022 event.AddPerson(DBPerson::kActor, *it);
01023 }
01024
01025
01026
01027
01028 event.description = event.description.replace(list[0],replacement);
01029 }
01030
01031 if (isSeries)
01032 event.categoryType = kCategorySeries;
01033
01034
01035 QRegExp tmpPersons = m_comHemPersons;
01036 while(pos = tmpPersons.indexIn(event.description),pos!=-1)
01037 {
01038 DBPerson::Role role;
01039 QStringList list = tmpPersons.capturedTexts();
01040
01041 QRegExp tmpDirector = m_comHemDirector;
01042 QRegExp tmpActor = m_comHemActor;
01043 QRegExp tmpHost = m_comHemHost;
01044 if (tmpDirector.indexIn(list[1])!=-1)
01045 {
01046 role = DBPerson::kDirector;
01047 }
01048 else if(tmpActor.indexIn(list[1])!=-1)
01049 {
01050 role = DBPerson::kActor;
01051 }
01052 else if(tmpHost.indexIn(list[1])!=-1)
01053 {
01054 role = DBPerson::kHost;
01055 }
01056 else
01057 {
01058 event.description=event.description.replace(list[0],"");
01059 continue;
01060 }
01061
01062 const QStringList actors =
01063 list[2].split(m_comHemPersSeparator, QString::SkipEmptyParts);
01064 QStringList::const_iterator it = actors.begin();
01065 for (; it != actors.end(); ++it)
01066 event.AddPerson(role, *it);
01067
01068
01069 event.description=event.description.replace(list[0],"");
01070 }
01071
01072
01073
01074
01075
01076 if (process_subtitle)
01077 {
01078 int pos = event.description.indexOf(m_comHemSub);
01079 bool pvalid = pos != -1 && pos <= 55;
01080 if (pvalid && (event.description.length() - (pos + 2)) > 0)
01081 {
01082 event.subtitle = event.description.left(
01083 pos + (event.description[pos] == '?' ? 1 : 0));
01084 event.description = event.description.mid(pos + 2);
01085 }
01086 }
01087
01088
01089 int position = event.description.indexOf(m_comHemTT);
01090 if (position != -1)
01091 {
01092 event.subtitleType |= SUB_NORMAL;
01093 }
01094
01095
01096 QRegExp tmpRerun1 = m_comHemRerun1;
01097 if (tmpRerun1.indexIn(event.description) == -1)
01098 return;
01099
01100
01101 QStringList list = tmpRerun1.capturedTexts();
01102 if (list[1] == "i dag")
01103 {
01104 event.originalairdate = event.starttime.date();
01105 return;
01106 }
01107
01108
01109 if (list[1] == "eftermiddagen")
01110 {
01111 event.originalairdate = event.starttime.date().addDays(-1);
01112 return;
01113 }
01114
01115
01116 QRegExp tmpRerun2 = m_comHemRerun2;
01117 if (tmpRerun2.indexIn(list[1]) != -1)
01118 {
01119 QStringList datelist = tmpRerun2.capturedTexts();
01120 int day = datelist[1].toInt();
01121 int month = datelist[2].toInt();
01122
01123
01124
01125
01126
01127
01128
01129 if (day > 0 && month > 0)
01130 {
01131 QDate date(event.starttime.date().year(), month, day);
01132
01133 if (date > event.starttime.date())
01134 date = date.addYears(-1);
01135 event.originalairdate = date;
01136 }
01137 return;
01138 }
01139 }
01140
01144 void EITFixUp::FixAUStar(DBEventEIT &event) const
01145 {
01146 event.category = event.subtitle;
01147
01148 int position = event.description.indexOf(':');
01149 if (position != -1)
01150 {
01151 const QString stmp = event.description;
01152 event.subtitle = stmp.left(position);
01153 event.description = stmp.right(stmp.length() - position - 2);
01154 }
01155 }
01156
01160 void EITFixUp::FixMCA(DBEventEIT &event) const
01161 {
01162 const uint SUBTITLE_PCT = 60;
01163 const uint SUBTITLE_MAX_LEN = 128;
01164 int position;
01165 QRegExp tmpExp1;
01166
01167
01168 event.subtitle = QString("");
01169
01170
01171 if (event.description.length() <= 0)
01172 return;
01173
01174
01175 tmpExp1 = m_mcaIncompleteTitle;
01176 if (tmpExp1.indexIn(event.title) != -1)
01177 {
01178 tmpExp1 = QRegExp( QString(m_mcaCompleteTitlea.pattern() + tmpExp1.cap(1) +
01179 m_mcaCompleteTitleb.pattern()));
01180 tmpExp1.setCaseSensitivity(Qt::CaseInsensitive);
01181 if (tmpExp1.indexIn(event.description) != -1)
01182 {
01183 event.title = tmpExp1.cap(1).trimmed();
01184 event.description = tmpExp1.cap(2).trimmed();
01185 }
01186 tmpExp1.setCaseSensitivity(Qt::CaseSensitive);
01187 }
01188
01189
01190 tmpExp1 = m_mcaSubtitle;
01191 if ((position = tmpExp1.indexIn(event.description)) != -1)
01192 {
01193 uint tmpExp1Len = tmpExp1.cap(1).length();
01194 uint evDescLen = max(event.description.length(), 1);
01195
01196 if ((tmpExp1Len < SUBTITLE_MAX_LEN) &&
01197 ((tmpExp1Len * 100 / evDescLen) < SUBTITLE_PCT))
01198 {
01199 event.subtitle = tmpExp1.cap(1);
01200 event.description = tmpExp1.cap(2);
01201 }
01202 }
01203
01204
01205 tmpExp1 = m_mcaSeries;
01206 if ((position = tmpExp1.indexIn(event.subtitle)) != -1)
01207 {
01208 uint season = tmpExp1.cap(1).toUInt();
01209 uint episode = tmpExp1.cap(2).toUInt();
01210 event.subtitle = tmpExp1.cap(3).trimmed();
01211 event.syndicatedepisodenumber =
01212 QString("E%1S%2").arg(episode).arg(season);
01213 event.categoryType = kCategorySeries;
01214 }
01215
01216
01217 position = event.description.indexOf(m_mcaCC);
01218 if (position > 0)
01219 {
01220 event.subtitleType |= SUB_HARDHEAR;
01221 event.description.replace(m_mcaCC, "");
01222 }
01223
01224
01225 position = event.description.indexOf(m_mcaDD);
01226 if ((position > 0) && (position > (int) (event.description.length() - 7)))
01227 {
01228 event.audioProps |= AUD_DOLBY;
01229 event.description.replace(m_mcaDD, "");
01230 }
01231
01232
01233 event.description.replace(m_mcaAvail, "");
01234
01235
01236 bool isMovie = false;
01237 tmpExp1 = m_mcaCredits;
01238 position = tmpExp1.indexIn(event.description);
01239 if (position != -1)
01240 {
01241 isMovie = true;
01242 event.description = tmpExp1.cap(1).trimmed();
01243 bool ok;
01244 uint y = tmpExp1.cap(2).trimmed().toUInt(&ok);
01245 if (ok)
01246 event.airdate = y;
01247 event.AddPerson(DBPerson::kDirector, tmpExp1.cap(3).trimmed());
01248 }
01249 else
01250 {
01251
01252 tmpExp1 = m_mcaYear;
01253 position = tmpExp1.indexIn(event.description);
01254 if (position != -1)
01255 {
01256 isMovie = true;
01257 event.description = tmpExp1.cap(1).trimmed();
01258 bool ok;
01259 uint y = tmpExp1.cap(2).trimmed().toUInt(&ok);
01260 if (ok)
01261 event.airdate = y;
01262 }
01263 }
01264
01265 if (isMovie)
01266 {
01267 tmpExp1 = m_mcaActors;
01268 position = tmpExp1.indexIn(event.description);
01269 if (position != -1)
01270 {
01271 const QStringList actors = tmpExp1.cap(2).split(
01272 m_mcaActorsSeparator, QString::SkipEmptyParts);
01273 QStringList::const_iterator it = actors.begin();
01274 for (; it != actors.end(); ++it)
01275 event.AddPerson(DBPerson::kActor, (*it).trimmed());
01276 event.description = tmpExp1.cap(1).trimmed();
01277 }
01278 event.categoryType = kCategoryMovie;
01279 }
01280
01281 }
01282
01286 void EITFixUp::FixRTL(DBEventEIT &event) const
01287 {
01288 int pos;
01289
01290
01291 if (event.description.length() <= 0 || event.subtitle.length() > 0)
01292 return;
01293
01294
01295 QRegExp tmpExpRepeat = m_RTLrepeat;
01296 if ((pos = tmpExpRepeat.indexIn(event.description)) != -1)
01297 {
01298
01299 int length = tmpExpRepeat.cap(0).length() + (pos ? 0 : 1);
01300 event.description = event.description.remove(pos, length).trimmed();
01301 event.originalairdate = event.starttime.addDays(-1).date();
01302 }
01303
01304 QRegExp tmpExp1 = m_RTLSubtitle;
01305 QRegExp tmpExpSubtitle1 = m_RTLSubtitle1;
01306 tmpExpSubtitle1.setMinimal(true);
01307 QRegExp tmpExpSubtitle2 = m_RTLSubtitle2;
01308 QRegExp tmpExpSubtitle3 = m_RTLSubtitle3;
01309 QRegExp tmpExpSubtitle4 = m_RTLSubtitle4;
01310 QRegExp tmpExpSubtitle5 = m_RTLSubtitle5;
01311 tmpExpSubtitle5.setMinimal(true);
01312 QRegExp tmpExpEpisodeNo1 = m_RTLEpisodeNo1;
01313 QRegExp tmpExpEpisodeNo2 = m_RTLEpisodeNo2;
01314
01315
01316 if (tmpExpSubtitle1.indexIn(event.description) != -1)
01317 {
01318 event.syndicatedepisodenumber = tmpExpSubtitle1.cap(1);
01319 event.subtitle = tmpExpSubtitle1.cap(2);
01320 event.description =
01321 event.description.remove(0, tmpExpSubtitle1.matchedLength());
01322 }
01323
01324 else if (tmpExpSubtitle2.indexIn(event.description) != -1)
01325 {
01326 event.syndicatedepisodenumber = tmpExpSubtitle2.cap(1);
01327 event.subtitle = tmpExpSubtitle2.cap(2);
01328 event.description =
01329 event.description.remove(0, tmpExpSubtitle2.matchedLength());
01330 }
01331
01332 else if (tmpExpSubtitle3.indexIn(event.description) != -1)
01333 {
01334 event.syndicatedepisodenumber = tmpExpSubtitle3.cap(1);
01335 event.subtitle = tmpExpSubtitle3.cap(2);
01336 event.description =
01337 event.description.remove(0, tmpExpSubtitle3.matchedLength());
01338 }
01339
01340 else if (tmpExpSubtitle4.indexIn(event.description) != -1)
01341 {
01342 event.subtitle = tmpExpSubtitle4.cap(1);
01343 event.description =
01344 event.description.remove(0, tmpExpSubtitle4.matchedLength());
01345 }
01346
01347 else if (tmpExpSubtitle5.indexIn(event.description) != -1)
01348 {
01349 event.subtitle = tmpExpSubtitle5.cap(1);
01350 event.description =
01351 event.description.remove(0, tmpExpSubtitle5.matchedLength());
01352 }
01353
01354 else if (tmpExpEpisodeNo1.indexIn(event.description) != -1)
01355 {
01356 event.syndicatedepisodenumber = tmpExpEpisodeNo1.cap(2);
01357 event.subtitle = tmpExpEpisodeNo1.cap(1);
01358 event.description =
01359 event.description.remove(0, tmpExpEpisodeNo1.matchedLength());
01360 }
01361
01362 else if (tmpExpEpisodeNo2.indexIn(event.description) != -1)
01363 {
01364 event.syndicatedepisodenumber = tmpExpEpisodeNo2.cap(2);
01365 event.subtitle = tmpExpEpisodeNo2.cap(1);
01366 event.description =
01367 event.description.remove(0, tmpExpEpisodeNo2.matchedLength());
01368 }
01369
01370 int position;
01371 const uint SUBTITLE_PCT = 35;
01372 const uint SUBTITLE_MAX_LEN = 50;
01373
01374 if ((position = tmpExp1.indexIn(event.description)) != -1)
01375 {
01376 uint tmpExp1Len = tmpExp1.cap(1).length();
01377 uint evDescLen = max(event.description.length(), 1);
01378
01379 if ((tmpExp1Len < SUBTITLE_MAX_LEN) &&
01380 (tmpExp1Len * 100 / evDescLen < SUBTITLE_PCT))
01381 {
01382 event.subtitle = tmpExp1.cap(1);
01383 event.description = tmpExp1.cap(2);
01384 }
01385 }
01386 }
01387
01391 void EITFixUp::FixFI(DBEventEIT &event) const
01392 {
01393 int position = event.description.indexOf(m_fiRerun);
01394 if (position != -1)
01395 {
01396 event.previouslyshown = true;
01397 event.description = event.description.replace(m_fiRerun, "");
01398 }
01399
01400 position = event.description.indexOf(m_fiRerun2);
01401 if (position != -1)
01402 {
01403 event.previouslyshown = true;
01404 event.description = event.description.replace(m_fiRerun2, "");
01405 }
01406
01407
01408 position = event.description.indexOf(m_Stereo);
01409 if (position != -1)
01410 {
01411 event.audioProps |= AUD_STEREO;
01412 event.description = event.description.replace(m_Stereo, "");
01413 }
01414 }
01415
01420 void EITFixUp::FixPremiere(DBEventEIT &event) const
01421 {
01422 QString country = "";
01423
01424
01425 QRegExp tmpInfos = m_dePremiereInfos;
01426 if (tmpInfos.indexIn(event.description) != -1)
01427 {
01428 country = tmpInfos.cap(1).trimmed();
01429 bool ok;
01430 uint y = tmpInfos.cap(2).toUInt(&ok);
01431 if (ok)
01432 event.airdate = y;
01433 event.AddPerson(DBPerson::kDirector, tmpInfos.cap(3));
01434 const QStringList actors = tmpInfos.cap(4).split(
01435 ", ", QString::SkipEmptyParts);
01436 QStringList::const_iterator it = actors.begin();
01437 for (; it != actors.end(); ++it)
01438 event.AddPerson(DBPerson::kActor, *it);
01439 event.description = event.description.replace(tmpInfos.cap(0), "");
01440 }
01441
01442
01443 QRegExp tmpOTitle = m_dePremiereOTitle;
01444 if (tmpOTitle.indexIn(event.title) != -1)
01445 {
01446 event.subtitle = QString("%1, %2").arg(tmpOTitle.cap(1)).arg(country);
01447 event.title = event.title.replace(tmpOTitle.cap(0), "");
01448 }
01449 }
01450
01454 void EITFixUp::FixNL(DBEventEIT &event) const
01455 {
01456 QString fullinfo = "";
01457 fullinfo.append (event.subtitle);
01458 fullinfo.append (event.description);
01459 event.subtitle = "";
01460
01461
01462
01463
01464 if (event.category == "Documentary")
01465 {
01466 event.category = "Documentaire";
01467 event.categoryType = kCategoryNone;
01468 }
01469 if (event.category == "News")
01470 {
01471 event.category = "Nieuws/actualiteiten";
01472 event.categoryType = kCategoryNone;
01473 }
01474 if (event.category == "Kids")
01475 {
01476 event.category = "Jeugd";
01477 event.categoryType = kCategoryNone;
01478 }
01479 if (event.category == "Show/game Show")
01480 {
01481 event.category = "Amusement";
01482 event.categoryType = kCategoryTVShow;
01483 }
01484 if (event.category == "Music/Ballet/Dance")
01485 {
01486 event.category = "Muziek";
01487 event.categoryType = kCategoryNone;
01488 }
01489 if (event.category == "News magazine")
01490 {
01491 event.category = "Informatief";
01492 event.categoryType = kCategoryNone;
01493 }
01494 if (event.category == "Movie")
01495 {
01496 event.category = "Film";
01497 event.categoryType = kCategoryMovie;
01498 }
01499 if (event.category == "Nature/animals/Environment")
01500 {
01501 event.category = "Natuur";
01502 event.categoryType = kCategoryNone;
01503 }
01504 if (event.category == "Movie - Adult")
01505 {
01506 event.category = "Erotiek";
01507 event.categoryType = kCategoryNone;
01508 }
01509 if (event.category == "Movie - Soap/melodrama/folkloric")
01510 {
01511 event.category = "Serie/soap";
01512 event.categoryType = kCategorySeries;
01513 }
01514 if (event.category == "Arts/Culture")
01515 {
01516 event.category = "Kunst/Cultuur";
01517 event.categoryType = kCategoryNone;
01518 }
01519 if (event.category == "Sports")
01520 {
01521 event.category = "Sport";
01522 event.categoryType = kCategorySports;
01523 }
01524 if (event.category == "Cartoons/Puppets")
01525 {
01526 event.category = "Animatie";
01527 event.categoryType = kCategoryNone;
01528 }
01529 if (event.category == "Movie - Comedy")
01530 {
01531 event.category = "Comedy";
01532 event.categoryType = kCategorySeries;
01533 }
01534 if (event.category == "Movie - Detective/Thriller")
01535 {
01536 event.category = "Misdaad";
01537 event.categoryType = kCategoryNone;
01538 }
01539 if (event.category == "Social/Spiritual Sciences")
01540 {
01541 event.category = "Religieus";
01542 event.categoryType = kCategoryNone;
01543 }
01544
01545
01546 int position;
01547 if ((position = fullinfo.indexOf(m_Stereo)) != -1)
01548 {
01549 event.audioProps |= AUD_STEREO;
01550 fullinfo = fullinfo.replace(m_Stereo, ".");
01551 }
01552
01553
01554 if ((position = fullinfo.indexOf(m_nlWide)) != -1)
01555 {
01556 fullinfo = fullinfo.replace("breedbeeld", ".");
01557 }
01558
01559
01560 if ((position = fullinfo.indexOf(m_nlRepeat)) != -1)
01561 {
01562 fullinfo = fullinfo.replace("herh.", ".");
01563 }
01564
01565
01566 if ((position = fullinfo.indexOf(m_nlTxt)) != -1)
01567 {
01568 event.subtitleType |= SUB_NORMAL;
01569 fullinfo = fullinfo.replace("txt", ".");
01570 }
01571
01572
01573 if ((position = event.title.indexOf(m_nlHD)) != -1)
01574 {
01575 event.videoProps |= VID_HDTV;
01576 event.title = event.title.replace(m_nlHD, "");
01577 }
01578
01579
01580 QRegExp tmpSub = m_nlSub;
01581 QString tmpSubString;
01582 if (tmpSub.indexIn(fullinfo) != -1)
01583 {
01584 tmpSubString = tmpSub.cap(0);
01585 tmpSubString = tmpSubString.right(tmpSubString.length() - 7);
01586 event.subtitle = tmpSubString.left(tmpSubString.length() -1);
01587 fullinfo = fullinfo.replace(tmpSub.cap(0), "");
01588 }
01589
01590
01591
01592 if (((position = event.title.indexOf(":")) != -1) &&
01593 (event.title[position + 1].toUpper() == event.title[position + 1]) &&
01594 (event.subtitle.isEmpty()))
01595 {
01596 event.subtitle = event.title.mid(position + 1);
01597 event.title = event.title.left(position);
01598 }
01599
01600
01601
01602 QRegExp tmpActors = m_nlActors;
01603 if (tmpActors.indexIn(fullinfo) != -1)
01604 {
01605 QString tmpActorsString = tmpActors.cap(0);
01606 tmpActorsString = tmpActorsString.right(tmpActorsString.length() - 6);
01607 tmpActorsString = tmpActorsString.left(tmpActorsString.length() - 5);
01608 const QStringList actors =
01609 tmpActorsString.split(", ", QString::SkipEmptyParts);
01610 QStringList::const_iterator it = actors.begin();
01611 for (; it != actors.end(); ++it)
01612 event.AddPerson(DBPerson::kActor, *it);
01613 fullinfo = fullinfo.replace(tmpActors.cap(0), "");
01614 }
01615
01616
01617 QRegExp tmpPres = m_nlPres;
01618 if (tmpPres.indexIn(fullinfo) != -1)
01619 {
01620 QString tmpPresString = tmpPres.cap(0);
01621 tmpPresString = tmpPresString.right(tmpPresString.length() - 14);
01622 tmpPresString = tmpPresString.left(tmpPresString.length() -1);
01623 const QStringList host =
01624 tmpPresString.split(m_nlPersSeparator, QString::SkipEmptyParts);
01625 QStringList::const_iterator it = host.begin();
01626 for (; it != host.end(); ++it)
01627 event.AddPerson(DBPerson::kPresenter, *it);
01628 fullinfo = fullinfo.replace(tmpPres.cap(0), "");
01629 }
01630
01631
01632 QRegExp tmpYear1 = m_nlYear1;
01633 QRegExp tmpYear2 = m_nlYear2;
01634 if ((position = tmpYear1.indexIn(fullinfo)) != -1)
01635 {
01636 bool ok;
01637 uint y = tmpYear1.cap(0).toUInt(&ok);
01638 if (ok)
01639 event.originalairdate = QDate(y, 1, 1);
01640 }
01641
01642 if ((position = tmpYear2.indexIn(fullinfo)) != -1)
01643 {
01644 bool ok;
01645 uint y = tmpYear2.cap(2).toUInt(&ok);
01646 if (ok)
01647 event.originalairdate = QDate(y, 1, 1);
01648 }
01649
01650
01651 QRegExp tmpDirector = m_nlDirector;
01652 QString tmpDirectorString;
01653 if ((position = fullinfo.indexOf(m_nlDirector)) != -1)
01654 {
01655 tmpDirectorString = tmpDirector.cap(0);
01656 event.AddPerson(DBPerson::kDirector, tmpDirectorString);
01657 }
01658
01659
01660 if ((position = fullinfo.indexOf(m_nlRub)) != -1)
01661 {
01662 fullinfo = fullinfo.replace(m_nlRub, "");
01663 }
01664
01665
01666 if ((position = fullinfo.indexOf(m_nlCat)) != -1)
01667 {
01668 fullinfo = fullinfo.replace(m_nlCat, "");
01669 }
01670
01671
01672 if ((position = event.title.indexOf(m_nlOmroep)) != -1)
01673 {
01674 event.title = event.title.replace(m_nlOmroep, "");
01675 }
01676
01677
01678
01679 event.description = fullinfo;
01680 event.description = event.description.trimmed();
01681 event.title = event.title.trimmed();
01682 event.subtitle = event.subtitle.trimmed();
01683
01684 }
01685
01686 void EITFixUp::FixCategory(DBEventEIT &event) const
01687 {
01688
01689 if (event.categoryType == kCategoryMovie &&
01690 event.starttime.secsTo(event.endtime) < kMinMovieDuration)
01691 {
01692
01693 event.categoryType = kCategoryTVShow;
01694 }
01695 }
01696
01700 void EITFixUp::FixNO(DBEventEIT &event) const
01701 {
01702
01703 int position = event.title.indexOf(m_noRerun);
01704 if (position != -1)
01705 {
01706 event.previouslyshown = true;
01707 event.title = event.title.replace(m_noRerun, "");
01708 }
01709 }
01710
01714 void EITFixUp::FixNRK_DVBT(DBEventEIT &event) const
01715 {
01716 int position;
01717 QRegExp tmpExp1;
01718
01719 position = event.title.indexOf(m_noRerun);
01720 if (position != -1)
01721 {
01722 event.previouslyshown = true;
01723 event.title = event.title.replace(m_noRerun, "");
01724 }
01725
01726 position = event.description.indexOf(m_noRerun);
01727 if (position != -1)
01728 {
01729 event.previouslyshown = true;
01730 }
01731
01732
01733 tmpExp1 = m_noNRKCategories;
01734 while (((position = tmpExp1.indexIn(event.title)) != -1) &&
01735 (tmpExp1.cap(2).length() > 1))
01736 {
01737 event.title = tmpExp1.cap(2);
01738 event.description = "(" + tmpExp1.cap(1) + ") " + event.description;
01739 }
01740
01741 tmpExp1 = m_noPremiere;
01742 if ((position = tmpExp1.indexIn(event.title)) >=3)
01743 {
01744 event.title.remove(m_noPremiere);
01745 }
01746
01747 tmpExp1 = m_noColonSubtitle;
01748 if (!event.title.startsWith("CSI:") &&
01749 !event.title.startsWith("CD:") &&
01750 !event.title.startsWith("Distriktsnyheter: fra"))
01751 {
01752 if ((position = tmpExp1.indexIn(event.title)) != -1)
01753 {
01754
01755 if (event.subtitle.length() <= 0)
01756 {
01757 event.title = tmpExp1.cap(1);
01758 event.subtitle = tmpExp1.cap(2);
01759 }
01760 else if (event.subtitle == tmpExp1.cap(2))
01761 {
01762 event.title = tmpExp1.cap(1);
01763 }
01764 }
01765 }
01766 }
01767