Ticket #4327: eitfixup14.patch

File eitfixup14.patch, 20.8 KB (added by john {at} pullan {dot} org, 13 years ago)
  • libs/libmythtv/eitfixup.cpp

     
    1717      m_bellPPVDescriptionAllDay("^\\(.*\\sEastern\\)"),
    1818      m_bellPPVDescriptionAllDay2("^\\([0-9].*am-[0-9].*am\\sET\\)"),
    1919      m_bellPPVDescriptionEventId("\\([0-9]{5}\\)"),
    20       m_ukSubtitle("\\[.*S\\]"),
    2120      m_ukThen("\\s*(Then|Followed by) 60 Seconds\\.", false),
    22       m_ukNew("\\s*(Brand New|New)\\s*(Series|Episode)\\s*[:\\.\\-]",false),
     21      m_ukNew("(New\\.|\\s*(Brand New|New)\\s*(Series|Episode)\\s*[:\\.\\-])",false),
    2322      m_ukT4("^[tT]4:"),
    24       m_ukEQ("[:\\!\\?]"),
    25       m_ukEPQ("[:\\!\\.\\?]"),
    26       m_ukPStart("^\\.+"),
    27       m_ukPEnd("\\.+$"),
    28       m_ukSeries1("\\s*(\\d{1,2})/(\\d{1,2})"),
    29       m_ukSeries2("\\((Part|Pt)\\s+(\\d{1,2})\\s+of\\s+(\\d{1,2})\\)", false),
    30       m_ukSeries3("\\s*Episode\\s+(\\d{1,2})\\s+of\\s+(\\d{1,2})\\.", false),
     23      m_ukCEPQ("[:\\!\\.\\?]"),
     24      m_ukDotSpaceStart("^\\. "),
     25      m_ukDotEnd("\\.$"),
     26      m_ukSpaceColonStart("^[ |:]*"),
     27      m_ukSpaceStart("^ "),
     28      m_ukSeries1("\\s*(\\d{1,2})/(\\d{1,2})\\s*[:|\\.]*\\s*"),
     29      m_ukSeries2("\\((?:Part|Pt)\\s+(\\d{1,2})\\s+of\\s+(\\d{1,2})\\)\\s*[:|\\.]*\\s*", false),
     30      m_ukSeries3("\\s*Episode\\s+(\\d{1,2})\\s+of\\s+(\\d{1,2})\\s*[:|\\.]*\\s*", false),
    3131      m_ukCC("\\[(AD)(,(S)){,1}(,SL){,1}\\]|\\[(S)(,AD){,1}(,SL){,1}\\]|"
    3232             "\\[(SL)(,AD){,1}(,(S)){,1}\\]"),
    3333      m_ukYear("[\\[\\(]([\\d]{4})[\\)\\]]"),
    3434      m_uk24ep("^\\d{1,2}:00[ap]m to \\d{1,2}:00[ap]m: "),
    35       m_ukStarring("(?:Western\\s)?[Ss]tarring ([\\w\\s\\-']+)[Aa]nd\\s([\\w\\s\\-']+)[\\.|,](?:\\s)*(\\d{4})?(?:\\.\\s)?"),
     35      m_ukStarring2("(?:Western\\s)?[Ss]tarring ([\\w\\s\\-']+)[Aa]nd\\s([\\w\\s\\-']+)[\\.|,](?:\\s)*(\\d{4})?(?:\\.\\s)?"),
    3636      m_ukBBC7rpt("\\[Rptd?[^]]+\\d{1,2}\\.\\d{1,2}[ap]m\\]\\."),
    3737      m_ukCBBC("^CBBC\\s*[\\.]"),
    3838      m_ukCBeebies("^CBeebies\\s*[\\.]"),
    39       m_ukStarring1("star(ring|s)"),
     39      m_ukClassTV("^Class TV\\s*[\\:]"),
    4040      m_ukDoubleDotEnd("\\.\\.+$"),
    4141      m_ukDoubleDotStart("^\\.\\.+"),
    42       m_ukDotSpaceStart("^\\. "),
    4342      m_ukTime("\\d{1,2}[\\.:]\\d{1,2}\\s*(am|pm|)"),
    4443      m_ukBBC34("BBC [THREE|FOUR] on BBC [ONE|TWO]\\.",false),
    4544      m_ukBBCSwitch("BBC Switch\\."),
    46       m_ukYearColon("^\\d\\d\\d\\d:"),
     45      m_ukYearColon("^[\\d]{4}:"),
     46      m_ukExclusionFromSubtitle("(starring|stars|drama|series|sitcom)",false),
    4747      m_comHemCountry("^(\\(.+\\))?\\s?([^ ]+)\\s([^\\.0-9]+)"
    4848                      "(?:\\sfrån\\s([0-9]{4}))(?:\\smed\\s([^\\.]+))?\\.?"),
    4949      m_comHemDirector("[Rr]egi"),
     
    299299
    300300void EITFixUp::SetUKSubtitle(DBEvent &event) const
    301301{
    302     QStringList strList1;
    303     int position1;
    304     int position2;
     302    QStringList strList1 = QStringList::split(".",event.description,TRUE);
     303    QStringList strList2 = QStringList::split("?",event.description,TRUE);
     304    QStringList strList3 = QStringList::split("!",event.description,TRUE);
     305    QStringList strList4 = QStringList::split(":",event.description,TRUE);
     306    QStringList strList;
    305307
    306     if ((position1 = event.description.find(m_ukEQ)) != -1)
     308    bool fColon = false;
     309    QString strEnd;
     310    if (strList4.count()>1)
    307311    {
    308         position2 = event.description.find(":",position1+1);
    309         if (position2 != -1)
    310         {
    311              strList1 = QStringList::split(" ",
    312                             event.description.mid(position1+1,
    313                             position2-position1+1));
    314              if (strList1.count() < kDotToTitle)
     312         bool fSingleDot = false;
     313         bool fDoubleDot = false;
     314         int nLength = strList4[0].length();
     315
     316         int nPosition = event.description.find("..");
     317         if ((nPosition < nLength) && (nPosition >= 0))
     318             fDoubleDot = true;
     319         if ( event.description.find(".") > nLength)
     320             fSingleDot = true;
     321   
     322         if (fDoubleDot)
     323         {
     324             strList = strList4;
     325             fColon = true;
     326         }
     327         else if (fSingleDot)
     328         {
     329             QString strPartial;
     330             QValueList<QString>::size_type i;
     331             for (i =0; i< (strList4.count()-1);i++)
    315332             {
    316                  event.subtitle = event.description.left(position2);
    317                  event.description = event.description.mid(position2 + 1);
     333                 strPartial+=strList4[i];
     334                 if (i< (strList4.count()-2))
     335                     strPartial+=":";
    318336             }
    319              else
    320              {
    321                  event.subtitle = event.description.left(position1);
    322                  event.description = event.description.mid(position1 + 1);
    323              }
     337             fColon = true;
     338             strList.push_back(strPartial);
     339             strList.push_back(*(strList4.end()--));
     340         }
     341    }
     342    if (!fColon)
     343    {
     344        if ((event.description.find("..")==-1) && (strList1.count()>1))
     345            strList = strList1;
     346
     347        if ((strList3.count()>1) && (strList3.count()<kMaxQuestionExclamation))
     348        {
     349            strList = strList3;
     350            strEnd = "!";
    324351        }
     352        else if ((strList2.count()>1) &&
     353                 (strList2.count()<kMaxQuestionExclamation))
     354        {
     355            strList = strList2;
     356            strEnd = "?";
     357        }
    325358        else
     359            strEnd = QString::null;
     360    }
     361
     362    if (strList.count())
     363    {
     364        strList1 = QStringList::split(" ",strList[0]);
     365        if (fColon && (strList1.count() > kMaxToTitle))
     366             return;
     367        if (strList1.count() > kDotToTitle)
     368             return;
     369        if (strList1.grep(m_ukExclusionFromSubtitle).count()==0)
    326370        {
    327             strList1 = QStringList::split(" ",
    328                             event.description.left(position1));
    329             if (strList1.count() < kDotToTitle)
    330             {
    331                 if ((uint)position1 < SUBTITLE_MAX_LEN)
    332                 {
    333                      event.subtitle = event.description.left(position1);
    334                      event.description = event.description.mid(position1+1);
    335                 }
    336             }
     371             event.subtitle = strList[0]+strEnd;
     372             event.subtitle.remove(m_ukSpaceColonStart);
     373             event.description=
     374                          event.description.mid(strList[0].length()+1);
     375             event.description.remove(m_ukSpaceColonStart);
    337376        }
    338377    }
    339378}
    340379
     380
    341381/** \fn EITFixUp::FixUK(DBEvent&) const
    342382 *  \brief Use this in the United Kingdom to standardize DVB-T guide.
    343383 */
     
    347387    int position2;
    348388    QString strFull;
    349389
    350     position1 = event.description.find(m_ukSubtitle);
    351     if (position1 != -1)
    352     {
    353         event.subtitleType |= SUB_NORMAL;
    354         event.description.remove(m_ukSubtitle);
    355     }
    356 
     390    bool isMovie = event.category.startsWith("Movie",false);
    357391    // BBC three case (could add another record here ?)
    358392    event.description = event.description.remove(m_ukThen);
    359393    event.description = event.description.remove(m_ukNew);
    360394    event.title  = event.title.remove(m_ukT4);
    361395
    362     // Removal of CBBC and CBeebies
     396    // Removal of Class TV, CBBC and CBeebies
    363397    event.description = event.description.remove(m_ukCBBC);
    364398    event.description = event.description.remove(m_ukCBeebies);
     399    event.description = event.description.remove(m_ukClassTV);
    365400
    366401    // Removal of BBC FOUR and BBC THREE
    367402    event.description = event.description.remove(m_ukBBC34);
     
    372407    // BBC 7 [Rpt of ...] case.
    373408    event.description = event.description.remove(m_ukBBC7rpt);
    374409
     410    // Remove [AD,S] etc.
     411    event.description = event.description.remove(m_ukCC);
     412
    375413    event.title = event.title.stripWhiteSpace();
    376414    event.description = event.description.stripWhiteSpace();
    377415
    378     QRegExp tmp24ep = m_uk24ep;
    379     if (!event.title.startsWith("CSI:") && !event.title.startsWith("CD:"))
    380     {
    381         if (((position1=event.title.find(m_ukDoubleDotEnd)) != -1) &&
    382             ((position2=event.description.find(m_ukDoubleDotStart)) != -1))
    383         {
    384             strFull = event.title.remove(m_ukDoubleDotEnd)+" "+
    385                   event.description.remove(m_ukDoubleDotStart);
    386             if ((position1 = strFull.find(m_ukEPQ)) != -1)
    387             {
    388                  if (strFull[position1] == '!' || strFull[position1] == '?' ||
    389                      strFull[position1] == '.')
    390                      position1++;
    391                  event.title = strFull.left(position1);
    392                  event.description = strFull.mid(position1 + 1);
    393                  SetUKSubtitle(event);
    394             }
    395             if ((position1 = strFull.find(m_ukYear)) != -1)
    396             {
    397                 // Looks like they are using the airdate as a delimiter
    398                 if ((uint)position1 < SUBTITLE_MAX_LEN)
    399                 {
    400                     event.description = event.title.mid(position1);
    401                     event.title = event.title.left(position1);
    402                 }
    403             }
    404         }
    405         else if ((position1 = tmp24ep.search(event.description)) != -1)
    406         {
    407             // Special case for episodes of 24.
    408             // -2 from the length cause we don't want ": " on the end
    409             event.subtitle = event.description.mid(position1,
    410                                 tmp24ep.cap(0).length() - 2);
    411             event.description = event.description.remove(tmp24ep.cap(0));
    412         }
    413         else if ((position1 = event.description.find(m_ukTime)) == -1)
    414         {
    415             if (event.title.find(m_ukYearColon) < 0)
    416             {
    417                 if (((position1 = event.title.find(":")) != -1) &&
    418                     (event.description.find(":") < 0 ))
    419                 {
    420                     if ((uint)position1 < SUBTITLE_MAX_LEN)
    421                     {
    422                         event.subtitle = event.title.mid(position1 + 1);
    423                         event.title = event.title.left(position1);
    424                     }
    425                 }
    426                 else
    427                     SetUKSubtitle(event);
    428             }
    429         }
    430     }
    431 
    432     if ((event.description.find(m_ukTime) == -1) && (event.subtitle.isEmpty()))
    433     {
    434        QStringList strList1 = QStringList::split(".",event.description,TRUE);
    435        QStringList strList2 = QStringList::split("?",event.description,TRUE);
    436        if (strList1.count()>1 || strList2.count()>1)
    437        {
    438            QString strEnd;
    439            if (strList1[0].length() > strList2[0].length())
    440            {
    441                strList1=strList2;
    442                strEnd="?";
    443            }
    444            strList2 = QStringList::split(" ",strList1[0]);
    445            if (strList2.count() < kDotToTitle)
    446            {
    447                QStringList strList3 = strList2.grep("Drama",false);
    448                QStringList strList4 = strList2.grep("sitcom",false);
    449                QStringList strList5 = strList2.grep(m_ukStarring1);
    450                QStringList strList6 = strList2.grep("Series",false);
    451                if ((strList3.count()==0) && (strList4.count()==0) &&
    452                    (strList5.count()==0) && (strList6.count()==0))
    453                {
    454                     event.subtitle = strList1[0]+strEnd;
    455                     event.description=
    456                                  event.description.mid(strList1[0].length()+1);
    457                }
    458            }
    459        }
    460     }
    461 
    462     QRegExp tmpStarring = m_ukStarring;
    463     if (tmpStarring.search(event.subtitle) != -1)
    464     {
    465         // If the "Starring..." string got promoted to subtitle move it back.
    466         event.description.prepend(". ");
    467         event.description.prepend(tmpStarring.cap(0));
    468         event.subtitle.remove(tmpStarring.cap(0));
    469     }
    470     tmpStarring = m_ukStarring;
    471     if (tmpStarring.search(event.description) != -1)
    472     {
    473         // if we match this we've captured 2 actors and an (optional) airdate
    474         event.AddPerson(DBPerson::kActor, tmpStarring.cap(1));
    475         event.AddPerson(DBPerson::kActor, tmpStarring.cap(2));
    476         if (tmpStarring.cap(3).length() > 0)
    477         {
    478             event.airdate = tmpStarring.cap(3);
    479             bool ok;
    480             uint y = tmpStarring.cap(3).toUInt(&ok);
    481             if (ok)
    482                 event.originalairdate = QDate(y, 1, 1);
    483         }
    484     }
    485 
    486416    // Work out the episode numbers (if any)
    487417    bool    series  = false;
    488418    QRegExp tmpExp1 = m_ukSeries1;
     
    501431            series = true;
    502432        }
    503433    }
    504     else if ((position1 = tmpExp1.search(event.subtitle)) != -1)
    505     {
    506         if ((tmpExp1.cap(1).toUInt() <= tmpExp1.cap(2).toUInt())
    507             && tmpExp1.cap(2).toUInt()<=50)
    508         {
    509             event.partnumber = tmpExp1.cap(1).toUInt();
    510             event.parttotal  = tmpExp1.cap(2).toUInt();
    511             // Remove from the subtitle
    512             event.subtitle = event.subtitle.left(position1) +
    513                 event.subtitle.mid(position1 + tmpExp1.cap(0).length());
    514             series = true;
    515         }
    516     }
    517434    else if ((position1 = tmpExp1.search(event.description)) != -1)
    518435    {
    519436        if ((tmpExp1.cap(1).toUInt() <= tmpExp1.cap(2).toUInt())
     
    529446    }
    530447    else if ((position1 = tmpExp2.search(event.description)) != -1)
    531448    {
    532         event.partnumber = tmpExp2.cap(2).toUInt();
    533         event.parttotal  = tmpExp2.cap(3).toUInt();
     449        event.partnumber = tmpExp2.cap(1).toUInt();
     450        event.parttotal  = tmpExp2.cap(2).toUInt();
    534451        // Remove from the description
    535452        event.description = event.description.left(position1) +
    536453            event.description.mid(position1+tmpExp2.cap(0).length());
     
    548465    if (series)
    549466        event.category_type = kCategorySeries;
    550467
    551     // Work out the closed captions and Audio descriptions  (if any)
    552     QStringList captures;
    553     QStringList::const_iterator it;
    554     QRegExp tmpUKCC = m_ukCC;
    555     if ((position1 = tmpUKCC.search(event.description)) != -1)
     468    QRegExp tmpStarring2 = m_ukStarring2;
     469    if (tmpStarring2.search(event.description) != -1)
    556470    {
    557         // Enumerate throught and see if we have subtitles, don't modify
    558         // the description as we might destroy other useful information
    559         captures = tmpUKCC.capturedTexts();
    560         for (it = captures.begin(); it != captures.end(); ++it)
     471        // if we match this we've captured 2 actors and an (optional) airdate
     472        event.AddPerson(DBPerson::kActor, tmpStarring2.cap(1));
     473        event.AddPerson(DBPerson::kActor, tmpStarring2.cap(2));
     474        if (tmpStarring2.cap(3).length() > 0)
    561475        {
    562             if (*it == "S")
    563                 event.subtitleType |= SUB_NORMAL;
     476            event.airdate = tmpStarring2.cap(3);
     477            bool ok;
     478            uint y = tmpStarring2.cap(3).toUInt(&ok);
     479            if (ok)
     480                event.originalairdate = QDate(y, 1, 1);
    564481        }
    565482    }
    566     else if ((position1 = tmpUKCC.search(event.subtitle)) != -1)
     483
     484    QRegExp tmp24ep = m_uk24ep;
     485    if (!event.title.startsWith("CSI:") && !event.title.startsWith("CD:"))
    567486    {
    568         captures = tmpUKCC.capturedTexts();
    569         for (it = captures.begin(); it != captures.end(); ++it)
     487        if (((position1=event.title.find(m_ukDoubleDotEnd)) != -1) &&
     488            ((position2=event.description.find(m_ukDoubleDotStart)) != -1))
    570489        {
    571             if (*it == "S")
    572                 event.subtitleType |= SUB_NORMAL;
     490            QString strPart=event.title.remove(m_ukDoubleDotEnd)+" ";
     491            strFull = strPart + event.description.remove(m_ukDoubleDotStart);
     492            if (isMovie &&
     493                ((position1 = strFull.find(m_ukCEPQ,strPart.length())) != -1))
     494            {
     495                 if (strFull[position1] == '!' || strFull[position1] == '?')
     496                     position1++;
     497                 event.title = strFull.left(position1);
     498                 event.description = strFull.mid(position1 + 1);
     499            }
     500            else if ((position1 = strFull.find(m_ukCEPQ)) != -1)
     501            {
     502                 if (strFull[position1] == '!' || strFull[position1] == '?')
     503                     position1++;
     504                 event.title = strFull.left(position1);
     505                 event.description = strFull.mid(position1 + 1);
     506                 SetUKSubtitle(event);
     507            }
     508            if ((position1 = strFull.find(m_ukYear)) != -1)
     509            {
     510                // Looks like they are using the airdate as a delimiter
     511                if ((uint)position1 < SUBTITLE_MAX_LEN)
     512                {
     513                    event.description = event.title.mid(position1);
     514                    event.title = event.title.left(position1);
     515                }
     516            }
    573517        }
    574 
    575         // We remove [AD,S] from the subtitle.
    576         QString stmp = event.subtitle;
    577         int     itmp = position1 + tmpUKCC.cap(0).length();
    578         event.subtitle = stmp.left(position1) + stmp.mid(itmp);
     518        else if ((position1 = tmp24ep.search(event.description)) != -1)
     519        {
     520            // Special case for episodes of 24.
     521            // -2 from the length cause we don't want ": " on the end
     522            event.subtitle = event.description.mid(position1,
     523                                tmp24ep.cap(0).length() - 2);
     524            event.description = event.description.remove(tmp24ep.cap(0));
     525        }
     526        else if ((position1 = event.description.find(m_ukTime)) == -1)
     527        {
     528            if (!isMovie && (event.title.find(m_ukYearColon) < 0))
     529            {
     530                if (((position1 = event.title.find(":")) != -1) &&
     531                    (event.description.find(":") < 0 ))
     532                {
     533                    if ((uint)position1 < SUBTITLE_MAX_LEN)
     534                    {
     535                        event.subtitle = event.title.mid(position1 + 1);
     536                        event.title = event.title.left(position1);
     537                    }
     538                }
     539                else
     540                    SetUKSubtitle(event);
     541            }
     542        }
    579543    }
    580544
     545    if (!isMovie && (event.description.find(m_ukTime) == -1) &&
     546        (event.subtitle.isEmpty()))
     547    {
     548        if ((position1=event.title.find("-")) != -1)
     549        {
     550            if ((uint)position1 < SUBTITLE_MAX_LEN)
     551            {
     552                event.subtitle = event.title.mid(position1 + 1);
     553                event.subtitle.remove(m_ukSpaceColonStart);
     554                event.title = event.title.left(position1);
     555            }
     556        }
     557        else
     558            SetUKSubtitle(event);
     559    }
     560 
    581561    // Work out the year (if any)
    582562    QRegExp tmpUKYear = m_ukYear;
    583563    if ((position1 = tmpUKYear.search(event.description)) != -1)
     
    592572            event.originalairdate = QDate(y, 1, 1);
    593573    }
    594574
    595     // Trim trailing '.'
    596     event.title.remove(m_ukPEnd);
    597     event.subtitle.remove(m_ukPEnd);
     575    // Trim leading/trailing '.'
    598576    event.subtitle.remove(m_ukDotSpaceStart);
     577    if (event.subtitle.findRev("..") != (((int)event.subtitle.length())-2))
     578        event.subtitle.remove(m_ukDotEnd);
    599579}
    600580
    601581/** \fn EITFixUp::FixPBS(DBEvent&) const
  • libs/libmythtv/eitfixup.h

     
    1717  protected:
    1818     // max length of subtitle field in db.
    1919     static const uint SUBTITLE_MAX_LEN = 128;
     20     // max number of words included in a subtitle
     21     static const uint kMaxToTitle = 14;
    2022     // max number of words up to a period, question mark
    21      static const uint kDotToTitle = 8;
     23     static const uint kDotToTitle = 9;
     24     // max number of question/exclamation marks
     25     static const uint kMaxQuestionExclamation = 2;
    2226
    2327  public:
    2428    enum FixUpType
     
    7983    const QRegExp m_bellPPVDescriptionAllDay;
    8084    const QRegExp m_bellPPVDescriptionAllDay2;
    8185    const QRegExp m_bellPPVDescriptionEventId;
    82     const QRegExp m_ukSubtitle;
    8386    const QRegExp m_ukThen;
    8487    const QRegExp m_ukNew;
    8588    const QRegExp m_ukT4;
    86     const QRegExp m_ukEQ;
    87     const QRegExp m_ukEPQ;
    88     const QRegExp m_ukPStart;
    89     const QRegExp m_ukPEnd;
     89    const QRegExp m_ukCEPQ;
     90    const QRegExp m_ukDotSpaceStart;
     91    const QRegExp m_ukDotEnd;
     92    const QRegExp m_ukSpaceColonStart;
     93    const QRegExp m_ukSpaceStart;
    9094    const QRegExp m_ukSeries1;
    9195    const QRegExp m_ukSeries2;
    9296    const QRegExp m_ukSeries3;
    9397    const QRegExp m_ukCC;
    9498    const QRegExp m_ukYear;
    9599    const QRegExp m_uk24ep;
    96     const QRegExp m_ukStarring;
     100    const QRegExp m_ukStarring2;
    97101    const QRegExp m_ukBBC7rpt;
    98102    const QRegExp m_ukCBBC;
    99103    const QRegExp m_ukCBeebies;
    100     const QRegExp m_ukStarring1;
     104    const QRegExp m_ukClassTV;
    101105    const QRegExp m_ukDoubleDotEnd;
    102106    const QRegExp m_ukDoubleDotStart;
    103     const QRegExp m_ukDotSpaceStart;
    104107    const QRegExp m_ukTime;
    105108    const QRegExp m_ukBBC34;
    106109    const QRegExp m_ukBBCSwitch;
    107110    const QRegExp m_ukYearColon;
     111    const QRegExp m_ukExclusionFromSubtitle;
    108112    const QRegExp m_comHemCountry;
    109113    const QRegExp m_comHemDirector;
    110114    const QRegExp m_comHemActor;