Ticket #8777: DishEIT.combined.fixed.diff
| File DishEIT.combined.fixed.diff, 43.9 KB (added by , 16 years ago) |
|---|
-
libs/libmythtv/eitfixup.cpp
7 7 #include "channelutil.h" // for GetDefaultAuthority() 8 8 9 9 #include "programinfo.h" // for subtitle types and audio and video properties 10 #include "dishdescriptors.h" // for dish_theme_type_to_string 10 11 11 12 /*------------------------------------------------------------------------ 12 13 * Event Fix Up Scripts - Turned on by entry in dtv_privatetype table … … 15 16 EITFixUp::EITFixUp() 16 17 : m_bellYear("[\\(]{1}[0-9]{4}[\\)]{1}"), 17 18 m_bellActors("\\set\\s|,"), 19 m_bellPPVTitleAllDayHD("\\s*\\(All Day\\, HD\\)\\s*$"), 18 20 m_bellPPVTitleAllDay("\\s*\\(All Day.*\\)\\s*$"), 19 21 m_bellPPVTitleHD("^HD\\s?-\\s?"), 20 m_bellPPVSubtitleAllDay("^All Day \\(.*\\sEastern\\) $"),22 m_bellPPVSubtitleAllDay("^All Day \\(.*\\sEastern\\)\\s*$"), 21 23 m_bellPPVDescriptionAllDay("^\\(.*\\sEastern\\)"), 22 24 m_bellPPVDescriptionAllDay2("^\\([0-9].*am-[0-9].*am\\sET\\)"), 23 25 m_bellPPVDescriptionEventId("\\([0-9]{5}\\)"), 26 m_dishPPVTitleHD("\\sHD\\s*$"), 27 m_dishPPVTitleColon("\\:\\s*$"), 28 m_dishPPVSpacePerenEnd("\\s\\)\\s*$"), 29 m_dishDescriptionNew("\\s*New\\.\\s*"), 30 m_dishDescriptionFinale("\\s*(Series|Season)\\sFinale\\.\\s*"), 31 m_dishDescriptionFinale2("\\s*Finale\\.\\s*"), 32 m_dishDescriptionPremiere("\\s*(Series|Season)\\s(Premier|Premiere)\\.\\s*"), 33 m_dishDescriptionPremiere2("\\s*(Premier|Premiere)\\.\\s*"), 34 m_dishPPVCode("\\s*\\(([A-Z]|[0-9]){5}\\)\\s*$"), 24 35 m_ukThen("\\s*(Then|Followed by) 60 Seconds\\.", Qt::CaseInsensitive), 25 36 m_ukNew("(New\\.|\\s*(Brand New|New)\\s*(Series|Episode)\\s*[:\\.\\-])",Qt::CaseInsensitive), 26 37 m_ukCEPQ("[:\\!\\.\\?]"), … … 133 144 if (kFixBell & event.fixup) 134 145 FixBellExpressVu(event); 135 146 147 if (kFixDish & event.fixup) 148 FixBellExpressVu(event); 149 150 if (kFixDish & event.fixup) 151 FixBellExpressVu(event); 152 136 153 if (kFixUK & event.fixup) 137 154 FixUK(event); 138 155 … … 251 268 position = event.description.indexOf("."); 252 269 // Make sure they didn't leave it out and 253 270 // you come up with an odd category 254 if (position < 10) 271 if (position >= 10) 272 event.category = "Unknown"; 273 274 // If the content descriptor didn't come up with anything, try parsing the category 275 // out of the description. 276 if (event.category == "") 255 277 { 256 const QString stmp = event.description; 257 event.description = stmp.right(stmp.length() - position - 2); 258 event.category = stmp.left(position); 278 // Take out the content description which is 279 // always next with a period after it 280 position = event.description.indexOf("."); 281 if ((position + 1) < event.description.length()) 282 position = event.description.indexOf(". "); 283 // Make sure they didn't leave it out and 284 // you come up with an odd category 285 if ((position > -1) && position < 20) 286 { 287 const QString stmp = event.description; 288 event.description = stmp.right(stmp.length() - position - 2); 289 event.category = stmp.left(position); 290 291 int position_p = event.category.indexOf("("); 292 if (position_p == -1) 293 event.description = stmp.right(stmp.length() - position - 2); 294 else 295 event.category = "Unknown"; 296 } 297 else 298 { 299 event.category = "Unknown"; 300 } 301 302 // When a channel is off air the category is "-" 303 // so leave the category as blank 304 if (event.category == "-") 305 event.category = "OffAir"; 306 307 if (event.category.length() > 20) 308 event.category = "Unknown"; 259 309 } 260 else 310 else if (event.categoryType) 261 311 { 262 event.category = "Unknown"; 312 QString theme = dish_theme_type_to_string(event.categoryType); 313 event.description = event.description.replace(theme, ""); 314 if (event.description.startsWith(".")) 315 event.description = event.description.right(event.description.length() - 1); 316 if (event.description.startsWith(" ")) 317 event.description = event.description.right(event.description.length() - 1); 263 318 } 264 319 265 // When a channel is off air the category is "-"266 // so leave the category as blank267 if (event.category == "-")268 event.category = "OffAir";269 270 if (event.category.length() > 10)271 event.category = "Unknown";272 273 274 320 // See if a year is present as (xxxx) 275 321 position = event.description.indexOf(m_bellYear); 276 322 if (position != -1 && event.category != "") … … 280 326 bool ok; 281 327 uint y = event.description.mid(position + 1, 4).toUInt(&ok); 282 328 if (ok) 329 { 283 330 event.originalairdate = QDate(y, 1, 1); 331 event.airdate = y; 332 event.previouslyshown = true; 333 } 284 334 285 335 // Get the actors if they exist 286 336 if (position > 3) … … 314 364 event.description = event.description.replace(m_Stereo, ""); 315 365 } 316 366 367 // Check for "title (All Day, HD)" in the title 368 position = event.title.indexOf(m_bellPPVTitleAllDayHD); 369 if (position != -1) 370 { 371 event.title = event.title.replace(m_bellPPVTitleAllDayHD, ""); 372 event.videoProps |= VID_HDTV; 373 } 374 317 375 // Check for "title (All Day)" in the title 318 376 position = event.title.indexOf(m_bellPPVTitleAllDay); 319 377 if (position != -1) … … 329 387 event.videoProps |= VID_HDTV; 330 388 } 331 389 390 // Check for (HD) in the decription 391 position = event.description.indexOf("(HD)"); 392 if (position != -1) 393 { 394 event.description = event.description.replace("(HD)", ""); 395 event.videoProps |= VID_HDTV; 396 } 397 398 // Check for (HD) in the title 399 position = event.title.indexOf("(HD)"); 400 if (position != -1) 401 { 402 event.description = event.title.replace("(HD)", ""); 403 event.videoProps |= VID_HDTV; 404 } 405 406 // Check for HD at the end of the title 407 position = event.title.indexOf(m_dishPPVTitleHD); 408 if (position != -1) 409 { 410 event.title = event.title.replace(m_dishPPVTitleHD, ""); 411 event.videoProps |= VID_HDTV; 412 } 413 414 // Check for (DD) at the end of the description 415 position = event.description.indexOf("(DD)"); 416 if (position != -1) 417 { 418 event.description = event.description.replace("(DD)", ""); 419 event.audioProps |= AUD_DOLBY; 420 event.audioProps |= AUD_STEREO; 421 } 422 423 // Remove SAP from Dish descriptions 424 position = event.description.indexOf("(SAP)"); 425 if (position != -1) 426 { 427 event.description = event.description.replace("(SAP", ""); 428 event.subtitleType |= SUB_HARDHEAR; 429 } 430 431 // Remove any trailing colon in title 432 position = event.title.indexOf(m_dishPPVTitleColon); 433 if (position != -1) 434 { 435 event.title = event.title.replace(m_dishPPVTitleColon, ""); 436 } 437 438 // Remove New at the end of the description 439 position = event.description.indexOf(m_dishDescriptionNew); 440 if (position != -1) 441 { 442 event.previouslyshown = false; 443 event.description = event.description.replace(m_dishDescriptionNew, ""); 444 } 445 446 // Remove Series Finale at the end of the desciption 447 position = event.description.indexOf(m_dishDescriptionFinale); 448 if (position != -1) 449 { 450 event.previouslyshown = false; 451 event.description = event.description.replace(m_dishDescriptionFinale, ""); 452 } 453 454 // Remove Series Finale at the end of the desciption 455 position = event.description.indexOf(m_dishDescriptionFinale2); 456 if (position != -1) 457 { 458 event.previouslyshown = false; 459 event.description = event.description.replace(m_dishDescriptionFinale2, ""); 460 } 461 462 // Remove Series Premiere at the end of the description 463 position = event.description.indexOf(m_dishDescriptionPremiere); 464 if (position != -1) 465 { 466 event.previouslyshown = false; 467 event.description = event.description.replace(m_dishDescriptionPremiere, ""); 468 } 469 470 // Remove Series Premiere at the end of the description 471 position = event.description.indexOf(m_dishDescriptionPremiere2); 472 if (position != -1) 473 { 474 event.previouslyshown = false; 475 event.description = event.description.replace(m_dishDescriptionPremiere2, ""); 476 } 477 478 // Remove Dish's PPV code at the end of the description 479 QRegExp ppvcode = m_dishPPVCode; 480 ppvcode.setCaseSensitivity(Qt::CaseInsensitive); 481 position = event.description.indexOf(ppvcode); 482 if (position != -1) 483 { 484 event.description = event.description.replace(ppvcode, ""); 485 } 486 487 // Remove trailing garbage 488 position = event.description.indexOf(m_dishPPVSpacePerenEnd); 489 if (position != -1) 490 { 491 event.description = event.description.replace(m_dishPPVSpacePerenEnd, ""); 492 } 493 332 494 // Check for subtitle "All Day (... Eastern)" in the subtitle 333 495 position = event.subtitle.indexOf(m_bellPPVSubtitleAllDay); 334 496 if (position != -1) -
libs/libmythtv/eithelper.cpp
333 333 QString subtitle = QString(""); 334 334 QString description = QString(""); 335 335 QString category = QString(""); 336 MythCategoryTypecategory_type = kCategoryNone;336 uint category_type = kCategoryNone; 337 337 unsigned char subtitle_type=0, audio_props=0, video_props=0; 338 338 339 339 // Parse descriptors … … 368 368 parse_dvb_component_descriptors(list, subtitle_type, audio_props, 369 369 video_props); 370 370 371 QString programId; 372 QString seriesId; 373 QString rating; 374 QString rating_system; 375 QString advisory; 376 float stars = 0.0; 377 378 if (EITFixUp::kFixDish & fix) 379 { 380 const unsigned char *mpaa_data = 381 MPEGDescriptor::Find(list, DescriptorID::dish_event_mpaa); 382 if (mpaa_data) 383 { 384 DishEventMPAADescriptor mpaa(mpaa_data); 385 stars = mpaa.stars(); 386 387 if (stars) // Only movies for now 388 { 389 rating = mpaa.rating(); 390 rating_system = "MPAA"; 391 advisory = mpaa.advisory(); 392 } 393 } 394 395 if (!stars) // Not MPAA rated, check VCHIP 396 { 397 const unsigned char *vchip_data = 398 MPEGDescriptor::Find(list, DescriptorID::dish_event_vchip); 399 if (vchip_data) 400 { 401 DishEventVCHIPDescriptor vchip(vchip_data); 402 rating = vchip.rating(); 403 rating_system = "VCHIP"; 404 advisory = vchip.advisory(); 405 } 406 } 407 408 if (!advisory.isEmpty() && !rating.isEmpty()) 409 rating += ", " + advisory; 410 else if (!advisory.isEmpty()) 411 { 412 rating = advisory; 413 rating_system = "advisory"; 414 } 415 416 const unsigned char *tags_data = 417 MPEGDescriptor::Find(list, DescriptorID::dish_event_tags); 418 if (tags_data) 419 { 420 DishEventTagsDescriptor tags(tags_data); 421 seriesId = tags.seriesid(); 422 programId = tags.programid(); 423 } 424 425 const unsigned char *properties_data = 426 MPEGDescriptor::Find(list, DescriptorID::dish_event_properties); 427 if (properties_data) 428 { 429 DishEventPropertiesDescriptor properties(properties_data); 430 subtitle_type |= properties.SubtitleProperties(descCompression); 431 audio_props |= properties.AudioProperties(descCompression); 432 } 433 } 434 371 435 const unsigned char *content_data = 372 436 MPEGDescriptor::Find(list, DescriptorID::content); 373 437 if (content_data) 374 438 { 375 ContentDescriptor content(content_data); 376 category = content.GetDescription(0); 377 category_type = content.GetMythCategory(0); 439 if ((EITFixUp::kFixDish & fix) || (EITFixUp::kFixBell & fix)) 440 { 441 DishContentDescriptor content(content_data); 442 category_type = content.GetTheme(); 443 if (EITFixUp::kFixDish & fix) 444 category = content.GetCategory(); 445 } 446 else 447 { 448 ContentDescriptor content(content_data); 449 category = content.GetDescription(0); 450 category_type = content.GetMythCategory(0); 451 } 378 452 } 379 453 380 454 desc_list_t contentIds = 381 455 MPEGDescriptor::FindAll(list, DescriptorID::dvb_content_identifier); 382 QString programId = QString("");383 QString seriesId = QString("");384 456 for (uint j = 0; j < contentIds.size(); j++) 385 457 { 386 458 DVBContentIdentifierDescriptor desc(contentIds[j]); … … 410 482 subtitle_type, 411 483 audio_props, 412 484 video_props, 485 stars, 413 486 seriesId, programId); 414 487 415 488 db_events.enqueue(event); … … 516 589 starttime, endtime, fix, 517 590 subtitle_type, 518 591 audio_props, 519 video_props, 592 video_props, 0.0, 520 593 "", ""); 521 594 522 595 db_events.enqueue(event); -
libs/libmythtv/mpeg/dishdescriptors.cpp
2 2 3 3 #include "dishdescriptors.h" 4 4 #include "atsc_huffman.h" 5 #include "programinfo.h" // for subtitle types and audio and video properties 5 6 6 7 QString DishEventNameDescriptor::Name(uint compression_type) const 7 8 { … … 41 42 42 43 return QString::null; 43 44 } 45 46 bool DishEventPropertiesDescriptor::decompressed = false; 47 uint DishEventPropertiesDescriptor::subtitle_props = SUB_UNKNOWN; 48 uint DishEventPropertiesDescriptor::audio_props = AUD_UNKNOWN; 49 50 uint DishEventPropertiesDescriptor::SubtitleProperties(uint compression_type) const 51 { 52 decompress_properties(compression_type); 53 54 return subtitle_props; 55 } 56 57 uint DishEventPropertiesDescriptor::AudioProperties(uint compression_type) const 58 { 59 decompress_properties(compression_type); 60 61 return audio_props; 62 } 63 64 void DishEventPropertiesDescriptor::decompress_properties(uint compression_type) const 65 { 66 subtitle_props = SUB_UNKNOWN; 67 audio_props = AUD_UNKNOWN; 68 69 if (HasProperties()) 70 { 71 QString properties_raw = atsc_huffman2_to_string( 72 _data + 4, DescriptorLength() - 2, compression_type); 73 74 if (properties_raw.contains("6|CC")) 75 subtitle_props |= SUB_HARDHEAR; 76 77 if (properties_raw.contains("7|Stereo")) 78 audio_props |= AUD_STEREO; 79 } 80 } 81 82 QString DishEventTagsDescriptor::programid(void) const 83 { 84 QString id; 85 86 if (DescriptorLength() != 8) 87 return QString::null; 88 89 id.sprintf("%02x%02x%02x%02x%02x%02x%02x", _data[3], _data[4], _data[5], 90 _data[6], _data[7], _data[8], 91 _data[9]); 92 93 return id; 94 } 95 96 QString DishEventTagsDescriptor::seriesid(void) const 97 { 98 QString id; 99 100 if (DescriptorLength() != 8) 101 return QString::null; 102 103 id.sprintf("%02x%02x%02x%01x", _data[3], _data[4], _data[5], 104 ((_data[6] & 0xf0) >> 0x04)); 105 106 return id; 107 } 108 109 QMutex DishEventMPAADescriptor::mpaaRatingsLock; 110 map<uint,QString> DishEventMPAADescriptor::mpaaRatingsDesc; 111 bool DishEventMPAADescriptor::mpaaRatingsExists = false; 112 113 float DishEventMPAADescriptor::stars(void) const 114 { 115 switch(stars_raw()) 116 { 117 case 0x01: return 1.0 / 4; 118 case 0x02: return 1.5 / 4; 119 case 0x03: return 2.0 / 4; 120 case 0x04: return 2.5 / 4; 121 case 0x05: return 3.0 / 4; 122 case 0x06: return 3.5 / 4; 123 case 0x07: return 4.0 / 4; 124 } 125 126 return 0.0; 127 } 128 129 QString DishEventMPAADescriptor::rating(void) const 130 { 131 if (!mpaaRatingsExists) 132 Init(); 133 134 QMutexLocker locker(&mpaaRatingsLock); 135 136 map<uint,QString>::const_iterator it = mpaaRatingsDesc.find(rating_raw()); 137 if (it != mpaaRatingsDesc.end()) 138 { 139 QString ret = (*it).second; 140 ret.detach(); 141 return ret; 142 } 143 144 // Found nothing? Just return empty string. 145 return ""; 146 } 147 148 QString DishEventMPAADescriptor::advisory(void) const 149 { 150 int advisory = advisory_raw(); 151 QStringList advisories; 152 153 if (advisory & 0x01) 154 advisories.append("S"); 155 if (advisory & 0x02) 156 advisories.append("L"); 157 if (advisory & 0x04) 158 advisories.append("mQ"); 159 if (advisory & 0x08) 160 advisories.append("FV"); 161 if (advisory & 0x10) 162 advisories.append("V"); 163 if (advisory & 0x20) 164 advisories.append("mK"); 165 if (advisory & 0x40) 166 advisories.append("N"); 167 168 return advisories.join(","); 169 } 170 171 void DishEventMPAADescriptor::Init(void) 172 { 173 QMutexLocker locker(&mpaaRatingsLock); 174 175 if (mpaaRatingsExists) 176 return; 177 178 mpaaRatingsDesc[0x01] = QObject::tr("G"); 179 mpaaRatingsDesc[0x02] = QObject::tr("PG"); 180 mpaaRatingsDesc[0x03] = QObject::tr("PG-13"); 181 mpaaRatingsDesc[0x04] = QObject::tr("R"); 182 mpaaRatingsDesc[0x05] = QObject::tr("NC-17"); 183 mpaaRatingsDesc[0x06] = QObject::tr("NR"); 184 185 mpaaRatingsExists = true; 186 } 187 188 QMutex DishEventVCHIPDescriptor::vchipRatingsLock; 189 map<uint,QString> DishEventVCHIPDescriptor::vchipRatingsDesc; 190 bool DishEventVCHIPDescriptor::vchipRatingsExists = false; 191 192 QString DishEventVCHIPDescriptor::rating(void) const 193 { 194 if (!vchipRatingsExists) 195 Init(); 196 197 QMutexLocker locker(&vchipRatingsLock); 198 199 map<uint,QString>::const_iterator it = vchipRatingsDesc.find(rating_raw()); 200 if (it != vchipRatingsDesc.end()) 201 { 202 QString ret = (*it).second; 203 ret.detach(); 204 return ret; 205 } 206 207 // Found nothing? Just return empty string. 208 return ""; 209 } 210 211 QString DishEventVCHIPDescriptor::advisory(void) const 212 { 213 int advisory = advisory_raw(); 214 QStringList advisories; 215 216 if (advisory & 0x01) 217 advisories.append("FV"); 218 if (advisory & 0x02) 219 advisories.append("V"); 220 if (advisory & 0x04) 221 advisories.append("S"); 222 if (advisory & 0x08) 223 advisories.append("L"); 224 if (advisory & 0x10) 225 advisories.append("D"); 226 227 return advisories.join(","); 228 } 229 230 void DishEventVCHIPDescriptor::Init(void) 231 { 232 QMutexLocker locker(&vchipRatingsLock); 233 234 if (vchipRatingsExists) 235 return; 236 237 vchipRatingsDesc[0x01] = QObject::tr("TV-Y"); 238 vchipRatingsDesc[0x02] = QObject::tr("TV-Y7"); 239 vchipRatingsDesc[0x03] = QObject::tr("TV-G"); 240 vchipRatingsDesc[0x04] = QObject::tr("TV-PG"); 241 vchipRatingsDesc[0x05] = QObject::tr("TV-14"); 242 vchipRatingsDesc[0x06] = QObject::tr("TV-MA"); 243 244 vchipRatingsExists = true; 245 } 246 247 QMutex DishContentDescriptor::categoryLock; 248 map<uint,QString> DishContentDescriptor::themeDesc; 249 map<uint,QString> DishContentDescriptor::categoryDesc; 250 bool DishContentDescriptor::categoriesExists = false; 251 252 QString dish_theme_type_to_string(uint theme_type) 253 { 254 static const char *themes[] = 255 { "", "Movie", "Sports", "News/Business", "Family/Children", "Education", 256 "Series/Special", "Music/Art", "Religious", "Off-Air" }; 257 258 if ((theme_type > kThemeNone) && (theme_type < kThemeLast)) 259 return QString(themes[theme_type]); 260 261 return ""; 262 } 263 264 DishThemeType string_to_dish_theme_type(const QString &theme_type) 265 { 266 static const char *themes[] = 267 { "", "Movie", "Sports", "News/Business", "Family/Children", "Education", 268 "Series/Special", "Music/Art", "Religious", "Off-Air" }; 269 270 for (uint i = 1; i < 10; i++) 271 if (theme_type == themes[i]) 272 return (DishThemeType) i; 273 274 return kThemeNone; 275 } 276 277 DishThemeType DishContentDescriptor::GetTheme(void) const 278 { 279 if (!categoriesExists) 280 Init(); 281 282 if (Nibble1() == 0x00) 283 return kThemeOffAir; 284 285 map<uint,QString>::const_iterator it = themeDesc.find(Nibble2()); 286 if (it != themeDesc.end()) 287 return string_to_dish_theme_type((*it).second); 288 289 // Found nothing? Just return empty string. 290 return kThemeNone; 291 } 292 293 QString DishContentDescriptor::GetCategory(void) const 294 { 295 if (!categoriesExists) 296 Init(); 297 298 QMutexLocker locker(&categoryLock); 299 300 // Try to get detailed description 301 map<uint,QString>::const_iterator it = categoryDesc.find(UserNibble()); 302 if (it != categoryDesc.end()) 303 { 304 QString ret = (*it).second; 305 ret.detach(); 306 return ret; 307 } 308 309 // Fallback to just the theme 310 QString theme = dish_theme_type_to_string(GetTheme()); 311 312 if (theme != "") 313 return theme; 314 315 // Found nothing? Just return empty string. 316 return ""; 317 } 318 319 QString DishContentDescriptor::toString() const 320 { 321 QString tmp(""); 322 tmp += GetTheme() + " : " + GetCategory(); 323 return tmp; 324 } 325 326 void DishContentDescriptor::Init(void) 327 { 328 QMutexLocker locker(&categoryLock); 329 330 if (categoriesExists) 331 return; 332 333 // Dish/BEV "Themes" 334 themeDesc[kThemeMovie] = QObject::tr("Movie"); 335 themeDesc[kThemeSports] = QObject::tr("Sports"); 336 themeDesc[kThemeNews] = QObject::tr("News/Business"); 337 themeDesc[kThemeFamily] = QObject::tr("Family/Children"); 338 themeDesc[kThemeEducation] = QObject::tr("Education"); 339 themeDesc[kThemeSeries] = QObject::tr("Series/Special"); 340 themeDesc[kThemeMusic] = QObject::tr("Music/Art"); 341 themeDesc[kThemeReligious] = QObject::tr("Religious"); 342 343 // Dish/BEV categories 344 categoryDesc[0x01] = QObject::tr("Action"); 345 categoryDesc[0x02] = QObject::tr("Adults only"); 346 categoryDesc[0x03] = QObject::tr("Adventure"); 347 categoryDesc[0x04] = QObject::tr("Animals"); 348 categoryDesc[0x05] = QObject::tr("Animated"); 349 categoryDesc[0x07] = QObject::tr("Anthology"); 350 categoryDesc[0x08] = QObject::tr("Art"); 351 categoryDesc[0x09] = QObject::tr("Auto"); 352 categoryDesc[0x0a] = QObject::tr("Awards"); 353 categoryDesc[0x0b] = QObject::tr("Ballet"); 354 categoryDesc[0x0c] = QObject::tr("Baseball"); 355 categoryDesc[0x0d] = QObject::tr("Basketball"); 356 categoryDesc[0x11] = QObject::tr("Biography"); 357 categoryDesc[0x12] = QObject::tr("Boat"); 358 categoryDesc[0x14] = QObject::tr("Bowling"); 359 categoryDesc[0x15] = QObject::tr("Boxing"); 360 categoryDesc[0x16] = QObject::tr("Bus./financial"); 361 categoryDesc[0x1a] = QObject::tr("Children"); 362 categoryDesc[0x1b] = QObject::tr("Children-special"); 363 categoryDesc[0x1c] = QObject::tr("Children-news"); 364 categoryDesc[0x1d] = QObject::tr("Children-music"); 365 categoryDesc[0x1f] = QObject::tr("Collectibles"); 366 categoryDesc[0x20] = QObject::tr("Comedy"); 367 categoryDesc[0x21] = QObject::tr("Comedy-drama"); 368 categoryDesc[0x22] = QObject::tr("Computers"); 369 categoryDesc[0x23] = QObject::tr("Cooking"); 370 categoryDesc[0x24] = QObject::tr("Crime"); 371 categoryDesc[0x25] = QObject::tr("Crime drama"); 372 categoryDesc[0x27] = QObject::tr("Dance"); 373 categoryDesc[0x29] = QObject::tr("Docudrama"); 374 categoryDesc[0x2a] = QObject::tr("Documentary"); 375 categoryDesc[0x2b] = QObject::tr("Drama"); 376 categoryDesc[0x2c] = QObject::tr("Educational"); 377 categoryDesc[0x2f] = QObject::tr("Excercise"); 378 categoryDesc[0x31] = QObject::tr("Fantasy"); 379 categoryDesc[0x32] = QObject::tr("Fasion"); 380 categoryDesc[0x34] = QObject::tr("Fishing"); 381 categoryDesc[0x35] = QObject::tr("Football"); 382 categoryDesc[0x36] = QObject::tr("French"); 383 categoryDesc[0x37] = QObject::tr("Fundraiser"); 384 categoryDesc[0x38] = QObject::tr("Game show"); 385 categoryDesc[0x39] = QObject::tr("Golf"); 386 categoryDesc[0x3a] = QObject::tr("Gymnastics"); 387 categoryDesc[0x3b] = QObject::tr("Health"); 388 categoryDesc[0x3c] = QObject::tr("History"); 389 categoryDesc[0x3d] = QObject::tr("Historical drama"); 390 categoryDesc[0x3e] = QObject::tr("Hockey"); 391 categoryDesc[0x3f] = QObject::tr("Holiday"); 392 categoryDesc[0x40] = QObject::tr("Holiday-children"); 393 categoryDesc[0x41] = QObject::tr("Holiday-children special"); 394 categoryDesc[0x44] = QObject::tr("Holiday special"); 395 categoryDesc[0x45] = QObject::tr("Horror"); 396 categoryDesc[0x46] = QObject::tr("Horse racing"); 397 categoryDesc[0x47] = QObject::tr("House/garden"); 398 categoryDesc[0x49] = QObject::tr("How-to"); 399 categoryDesc[0x4b] = QObject::tr("Interview"); 400 categoryDesc[0x4d] = QObject::tr("Lacrosse"); 401 categoryDesc[0x4f] = QObject::tr("Martial Arts"); 402 categoryDesc[0x50] = QObject::tr("Medical"); 403 categoryDesc[0x51] = QObject::tr("Miniseries"); 404 categoryDesc[0x52] = QObject::tr("Motorsports"); 405 categoryDesc[0x53] = QObject::tr("Motorcycle"); 406 categoryDesc[0x54] = QObject::tr("Music"); 407 categoryDesc[0x55] = QObject::tr("Music special"); 408 categoryDesc[0x56] = QObject::tr("Music talk"); 409 categoryDesc[0x57] = QObject::tr("Musical"); 410 categoryDesc[0x58] = QObject::tr("Musical comedy"); 411 categoryDesc[0x5a] = QObject::tr("Mystery"); 412 categoryDesc[0x5b] = QObject::tr("Nature"); 413 categoryDesc[0x5c] = QObject::tr("News"); 414 categoryDesc[0x5f] = QObject::tr("Opera"); 415 categoryDesc[0x60] = QObject::tr("Outdoors"); 416 categoryDesc[0x63] = QObject::tr("Public affairs"); 417 categoryDesc[0x66] = QObject::tr("Reality"); 418 categoryDesc[0x67] = QObject::tr("Religious"); 419 categoryDesc[0x68] = QObject::tr("Rodeo"); 420 categoryDesc[0x69] = QObject::tr("Romance"); 421 categoryDesc[0x6a] = QObject::tr("Romance-comedy"); 422 categoryDesc[0x6b] = QObject::tr("Rugby"); 423 categoryDesc[0x6c] = QObject::tr("Running"); 424 categoryDesc[0x6e] = QObject::tr("Science"); 425 categoryDesc[0x6f] = QObject::tr("Science fiction"); 426 categoryDesc[0x70] = QObject::tr("Self improvement"); 427 categoryDesc[0x71] = QObject::tr("Shopping"); 428 categoryDesc[0x74] = QObject::tr("Skiing"); 429 categoryDesc[0x77] = QObject::tr("Soap"); 430 categoryDesc[0x7b] = QObject::tr("Soccor"); 431 categoryDesc[0x7c] = QObject::tr("Softball"); 432 categoryDesc[0x7d] = QObject::tr("Spanish"); 433 categoryDesc[0x7e] = QObject::tr("Special"); 434 categoryDesc[0x81] = QObject::tr("Sports non-event"); 435 categoryDesc[0x82] = QObject::tr("Sports talk"); 436 categoryDesc[0x83] = QObject::tr("Suspense"); 437 categoryDesc[0x85] = QObject::tr("Swimming"); 438 categoryDesc[0x86] = QObject::tr("Talk"); 439 categoryDesc[0x87] = QObject::tr("Tennis"); 440 categoryDesc[0x89] = QObject::tr("Track/field"); 441 categoryDesc[0x8a] = QObject::tr("Travel"); 442 categoryDesc[0x8b] = QObject::tr("Variety"); 443 categoryDesc[0x8c] = QObject::tr("Volleyball"); 444 categoryDesc[0x8d] = QObject::tr("War"); 445 categoryDesc[0x8e] = QObject::tr("Watersports"); 446 categoryDesc[0x8f] = QObject::tr("Weather"); 447 categoryDesc[0x90] = QObject::tr("Western"); 448 categoryDesc[0x92] = QObject::tr("Wrestling"); 449 categoryDesc[0x93] = QObject::tr("Yoga"); 450 categoryDesc[0x94] = QObject::tr("Agriculture"); 451 categoryDesc[0x95] = QObject::tr("Anime"); 452 categoryDesc[0x97] = QObject::tr("Arm Wrestling"); 453 categoryDesc[0x98] = QObject::tr("Arts/crafts"); 454 categoryDesc[0x99] = QObject::tr("Auction"); 455 categoryDesc[0x9a] = QObject::tr("Auto racing"); 456 categoryDesc[0x9b] = QObject::tr("Air racing"); 457 categoryDesc[0x9c] = QObject::tr("Badminton"); 458 categoryDesc[0xa0] = QObject::tr("Bicycle racing"); 459 categoryDesc[0xa1] = QObject::tr("Boat Racing"); 460 categoryDesc[0xa6] = QObject::tr("Community"); 461 categoryDesc[0xa7] = QObject::tr("Consumer"); 462 categoryDesc[0xaa] = QObject::tr("Debate"); 463 categoryDesc[0xac] = QObject::tr("Dog show"); 464 categoryDesc[0xad] = QObject::tr("Drag racing"); 465 categoryDesc[0xae] = QObject::tr("Entertainment"); 466 categoryDesc[0xaf] = QObject::tr("Environment"); 467 categoryDesc[0xb0] = QObject::tr("Equestrian"); 468 categoryDesc[0xb3] = QObject::tr("Field hockey"); 469 categoryDesc[0xb5] = QObject::tr("Football"); 470 categoryDesc[0xb6] = QObject::tr("Gay/lesbian"); 471 categoryDesc[0xb7] = QObject::tr("Handball"); 472 categoryDesc[0xb8] = QObject::tr("Home improvement"); 473 categoryDesc[0xb9] = QObject::tr("Hunting"); 474 categoryDesc[0xbb] = QObject::tr("Hydroplane racing"); 475 categoryDesc[0xc1] = QObject::tr("Law"); 476 categoryDesc[0xc3] = QObject::tr("Motorcycle racing"); 477 categoryDesc[0xc5] = QObject::tr("Newsmagazine"); 478 categoryDesc[0xc7] = QObject::tr("Paranormal"); 479 categoryDesc[0xc8] = QObject::tr("Parenting"); 480 categoryDesc[0xca] = QObject::tr("Performing arts"); 481 categoryDesc[0xcc] = QObject::tr("Politics"); 482 categoryDesc[0xcf] = QObject::tr("Pro wrestling"); 483 categoryDesc[0xd3] = QObject::tr("Sailing"); 484 categoryDesc[0xd4] = QObject::tr("Shooting"); 485 categoryDesc[0xd5] = QObject::tr("Sitcom"); 486 categoryDesc[0xd6] = QObject::tr("Skateboarding"); 487 categoryDesc[0xd9] = QObject::tr("Snowboarding"); 488 categoryDesc[0xdd] = QObject::tr("Standup"); 489 categoryDesc[0xdf] = QObject::tr("Surfing"); 490 categoryDesc[0xe0] = QObject::tr("Tennis"); 491 categoryDesc[0xe1] = QObject::tr("Triathlon"); 492 categoryDesc[0xe6] = QObject::tr("Card games"); 493 categoryDesc[0xe7] = QObject::tr("Poker"); 494 categoryDesc[0xea] = QObject::tr("Military"); 495 categoryDesc[0xeb] = QObject::tr("Technology"); 496 categoryDesc[0xec] = QObject::tr("Mixed martial arts"); 497 categoryDesc[0xed] = QObject::tr("Action sports"); 498 categoryDesc[0xff] = QObject::tr("Dish Network"); 499 500 categoriesExists = true; 501 } 502 503 -
libs/libmythtv/mpeg/dishdescriptors.h
4 4 #define _DISH_DESCRIPTORS_H_ 5 5 6 6 #include <cassert> 7 #include <map> 7 8 9 #include <QMutex> 8 10 #include <QString> 9 11 10 12 #include "atscdescriptors.h" 11 13 14 class DishEventMPAADescriptor : public MPEGDescriptor 15 { 16 public: 17 DishEventMPAADescriptor(const unsigned char* data) 18 : MPEGDescriptor(data) 19 { 20 // Name bits loc expected value 21 // descriptor_tag 8 0.0 0x89 22 assert(DescriptorID::dish_event_mpaa == DescriptorTag()); 23 // descriptor_length 8 1.0 24 } 25 // stars 3 2.0 26 uint stars_raw(void) const { return (_data[2] & 0xe0) >> 0x05; } 27 float stars(void) const; 28 29 // rating 3 2.3 30 uint rating_raw(void) const { return (_data[2] & 0x1c) >> 0x02; } 31 QString rating(void) const; 32 33 // advisories 8 3.0 34 uint advisory_raw(void) const { return _data[3]; } 35 QString advisory(void) const; 36 37 private: 38 static void Init(void); 39 40 private: 41 static QMutex mpaaRatingsLock; 42 static map<uint,QString> mpaaRatingsDesc; 43 static bool mpaaRatingsExists; 44 }; 45 46 class DishEventVCHIPDescriptor : public MPEGDescriptor 47 { 48 public: 49 DishEventVCHIPDescriptor(const unsigned char* data) 50 : MPEGDescriptor(data) 51 { 52 // Name bits loc expected value 53 // descriptor_tag 8 0.0 0x95 54 assert(DescriptorID::dish_event_vchip == DescriptorTag()); 55 // descriptor_length 8 1.0 56 } 57 // rating 8 2.0 58 uint rating_raw(void) const { return _data[2]; } 59 QString rating(void) const; 60 61 // advisory 8 3.0 62 uint advisory_raw(void) const { return _data[3]; } 63 QString advisory(void) const; 64 65 private: 66 static void Init(void); 67 68 private: 69 static QMutex vchipRatingsLock; 70 static map<uint,QString> vchipRatingsDesc; 71 static bool vchipRatingsExists; 72 }; 73 12 74 class DishEventNameDescriptor : public MPEGDescriptor 13 75 { 14 76 public: … … 45 107 QString Description(uint) const; 46 108 }; 47 109 110 class DishEventPropertiesDescriptor : public MPEGDescriptor 111 { 112 public: 113 DishEventPropertiesDescriptor(const unsigned char* data) 114 : MPEGDescriptor(data) 115 { 116 // Name bits loc expected value 117 // descriptor_tag 8 0.0 0x94 118 assert(DescriptorID::dish_event_properties == DescriptorTag()); 119 // descriptor_length 8 1.0 120 } 121 // unknown 8 2.0 122 // event_name dlen-1 3.0 123 bool HasProperties(void) const { return DescriptorLength() > 1; } 124 uint SubtitleProperties(uint compression_type) const; 125 uint AudioProperties(uint compression_type) const; 126 127 private: 128 void decompress_properties(uint compression_type) const; 129 130 private: 131 static uint subtitle_props; 132 static uint audio_props; 133 static bool decompressed; 134 }; 135 136 class DishEventTagsDescriptor : public MPEGDescriptor 137 { 138 public: 139 DishEventTagsDescriptor(const unsigned char* data) 140 : MPEGDescriptor(data) 141 { 142 // Name bits loc expected value 143 // descriptor_tag 8 0.0 0x96 144 assert(DescriptorID::dish_event_tags == DescriptorTag()); 145 // descriptor_length 8 1.0 146 } 147 // unknown 8 2.0 148 // seriesid 28 3.0 149 QString seriesid(void) const; 150 151 // programid 42 3.0 152 QString programid(void) const; 153 }; 154 155 typedef enum 156 { 157 kThemeNone = 0, 158 kThemeMovie, 159 kThemeSports, 160 kThemeNews, 161 kThemeFamily, 162 kThemeEducation, 163 kThemeSeries, 164 kThemeMusic, 165 kThemeReligious, 166 kThemeOffAir, 167 kThemeLast, 168 } DishThemeType; 169 170 QString dish_theme_type_to_string(uint category_type); 171 DishThemeType string_to_dish_theme_type(const QString &type); 172 173 class DishContentDescriptor : public MPEGDescriptor 174 { 175 public: 176 DishContentDescriptor(const unsigned char* data) : MPEGDescriptor(data) 177 { 178 // Name bits loc expected value 179 // descriptor_tag 8 0.0 0x54 180 assert(DescriptorID::content == DescriptorTag()); 181 // descriptor_length 8 1.0 182 } 183 184 // content_nibble_level_1 4 0.0 185 uint Nibble1(void) const { return _data[2] >> 4; } 186 // content_nibble_level_2 4 0.4 187 uint Nibble2(void) const { return _data[2] & 0xf; } 188 189 uint Nibble(void) const { return _data[2]; } 190 191 // user_nibble 4 1.0 192 uint UserNibble1(void) const { return _data[3] >> 4; } 193 // user_nibble 4 1.4 194 uint UserNibble2(void) const { return _data[3] & 0xf; } 195 uint UserNibble(void) const { return _data[3]; } 196 // } 2.0 197 198 DishThemeType GetTheme(void) const; 199 QString GetCategory(void) const; 200 QString toString() const; 201 202 private: 203 static void Init(void); 204 205 private: 206 static QMutex categoryLock; 207 static map<uint,QString> themeDesc; 208 static map<uint,QString> categoryDesc; 209 static bool categoriesExists; 210 }; 211 48 212 #endif // _DISH_DESCRIPTORS_H_ -
libs/libmythtv/mpeg/mpegdescriptors.h
128 128 content_advisory = 0x87, 129 129 130 130 // Dish Network 131 dish_event_rights = 0x87, 132 dish_event_mpaa = 0x89, 131 133 dish_event_name = 0x91, 132 134 dish_event_description = 0x92, 135 dish_event_properties = 0x94, 136 dish_event_vchip = 0x95, 137 dish_event_tags = 0x96, 133 138 134 139 // ATSC 135 140 extended_channel_name = 0xA0, -
libs/libmythtv/programdata.cpp
162 162 seriesId = other.seriesId; 163 163 programId = other.programId; 164 164 previouslyshown = other.previouslyshown; 165 ratings = other.ratings; 165 166 166 167 Squeeze(); 167 168 … … 257 258 " partnumber, parttotal, " 258 259 " syndicatedepisodenumber, " 259 260 " airdate, originalairdate, " 260 " previouslyshown,listingsource " 261 " previouslyshown,listingsource, " 262 " stars+0 " 261 263 "FROM program " 262 264 "WHERE chanid = :CHANID AND " 263 265 " manualid = 0 AND " … … 290 292 query.value(7).toUInt(), 291 293 query.value(8).toUInt(), 292 294 query.value(9).toUInt(), 295 query.value(19).toDouble(), 293 296 query.value(10).toString(), 294 297 query.value(11).toString(), 295 298 query.value(18).toUInt()); … … 690 693 " starttime, endtime, " 691 694 " closecaptioned, stereo, hdtv, subtitled, " 692 695 " subtitletypes, audioprop, videoprop, " 693 " partnumber, parttotal, "696 " stars, partnumber, parttotal, " 694 697 " syndicatedepisodenumber, " 695 698 " airdate, originalairdate,listingsource, " 696 699 " seriesid, programid, previouslyshown ) " … … 700 703 " :STARTTIME, :ENDTIME, " 701 704 " :CC, :STEREO, :HDTV, :HASSUBTITLES, " 702 705 " :SUBTYPES, :AUDIOPROP, :VIDEOPROP, " 703 " : PARTNUMBER, :PARTTOTAL, "706 " :STARS, :PARTNUMBER, :PARTTOTAL, " 704 707 " :SYNDICATENO, " 705 708 " :AIRDATE, :ORIGAIRDATE, :LSOURCE, " 706 709 " :SERIESID, :PROGRAMID, :PREVSHOWN) "); … … 722 725 query.bindValue(":SUBTYPES", subtitleType); 723 726 query.bindValue(":AUDIOPROP", audioProps); 724 727 query.bindValue(":VIDEOPROP", videoProps); 728 query.bindValue(":STARS", stars); 725 729 query.bindValue(":PARTNUMBER", partnumber); 726 730 query.bindValue(":PARTTOTAL", parttotal); 727 731 query.bindValue(":SYNDICATENO", syndicatedepisodenumber); … … 769 773 colorcode = other.colorcode; 770 774 clumpidx = other.clumpidx; 771 775 clumpmax = other.clumpmax; 772 ratings = other.ratings;773 776 774 777 squeeze_str(channel); 775 778 squeeze_str(startts); … … 873 876 return 0; 874 877 } 875 878 876 QList< ProgRating>::const_iterator j = ratings.begin();879 QList<EventRating>::const_iterator j = ratings.begin(); 877 880 for (; j != ratings.end(); ++j) 878 881 { 879 882 query.prepare( -
libs/libmythtv/programdata.h
60 60 }; 61 61 typedef vector<DBPerson> DBCredits; 62 62 63 class MPUBLIC EventRating 64 { 65 public: 66 QString system; 67 QString rating; 68 }; 69 63 70 class MPUBLIC DBEvent 64 71 { 65 72 public: … … 77 84 subtitleType(0), 78 85 audioProps(0), 79 86 videoProps(0), 87 stars(0.0), 80 88 categoryType(0/*kCategoryNone*/), 81 89 seriesId(QString::null), 82 90 programId(QString::null), … … 90 98 unsigned char _subtitleType, 91 99 unsigned char _audioProps, 92 100 unsigned char _videoProps, 101 float _stars, 93 102 const QString &_seriesId, const QString &_programId, 94 103 uint32_t _listingsource) : 95 104 title(_title), subtitle(_subtitle), … … 102 111 syndicatedepisodenumber(QString("")), 103 112 subtitleType(_subtitleType), 104 113 audioProps(_audioProps), videoProps(_videoProps), 114 stars(_stars), 105 115 categoryType(_category_type), 106 116 seriesId(_seriesId), 107 117 programId(_programId), … … 152 162 unsigned char subtitleType; 153 163 unsigned char audioProps; 154 164 unsigned char videoProps; 165 float stars; 155 166 unsigned char categoryType; 156 167 QString seriesId; 157 168 QString programId; 158 169 bool previouslyshown; 159 170 uint32_t listingsource; 171 QList<EventRating> ratings; 160 172 }; 161 173 162 174 class MPUBLIC DBEventEIT : public DBEvent … … 171 183 unsigned char _subtitleType, 172 184 unsigned char _audioProps, 173 185 unsigned char _videoProps, 186 float _stars, 174 187 const QString &_seriesId, const QString &_programId) : 175 188 DBEvent(_title, _subtitle, _desc, _category, _category_type, 176 189 _start, _end, _subtitleType, _audioProps, _videoProps, 177 _s eriesId, _programId, kListingSourceEIT),190 _stars, _seriesId, _programId, kListingSourceEIT), 178 191 chanid(_chanid), fixup(_fixup) 179 192 { 180 193 } … … 188 201 unsigned char _videoProps) : 189 202 DBEvent(_title, QString(""), _desc, QString(""), 0/*kCategoryNone*/, 190 203 _start, _end, _subtitleType, _audioProps, _videoProps, 191 QString(""), QString(""), kListingSourceEIT),204 0.0, QString(""), QString(""), kListingSourceEIT), 192 205 chanid(_chanid), fixup(_fixup) 193 206 { 194 207 } … … 203 216 uint32_t fixup; 204 217 }; 205 218 206 class MPUBLIC ProgRating207 {208 public:209 QString system;210 QString rating;211 };212 213 219 class MPUBLIC ProgInfo : public DBEvent 214 220 { 215 221 public: … … 245 251 QString colorcode; 246 252 QString clumpidx; 247 253 QString clumpmax; 248 QList<ProgRating> ratings;249 254 }; 250 255 251 256 class MPUBLIC ProgramData -
libs/libmythtv/eitfixup.h
50 50 kFixCategory = 0x8000, 51 51 kFixNO = 0x10000, 52 52 kFixNRK_DVBT = 0x20000, 53 kFixDish = 0x40000, 53 54 54 55 // Early fixups 55 56 kEFixForceISO8859_1 = 0x2000, … … 94 95 95 96 const QRegExp m_bellYear; 96 97 const QRegExp m_bellActors; 98 const QRegExp m_bellPPVTitleAllDayHD; 97 99 const QRegExp m_bellPPVTitleAllDay; 98 100 const QRegExp m_bellPPVTitleHD; 99 101 const QRegExp m_bellPPVSubtitleAllDay; 100 102 const QRegExp m_bellPPVDescriptionAllDay; 101 103 const QRegExp m_bellPPVDescriptionAllDay2; 102 104 const QRegExp m_bellPPVDescriptionEventId; 105 const QRegExp m_dishPPVTitleHD; 106 const QRegExp m_dishPPVTitleColon; 107 const QRegExp m_dishPPVSpacePerenEnd; 108 const QRegExp m_dishDescriptionNew; 109 const QRegExp m_dishDescriptionFinale; 110 const QRegExp m_dishDescriptionFinale2; 111 const QRegExp m_dishDescriptionPremiere; 112 const QRegExp m_dishDescriptionPremiere2; 113 const QRegExp m_dishPPVCode; 103 114 const QRegExp m_ukThen; 104 115 const QRegExp m_ukNew; 105 116 const QRegExp m_ukCEPQ; -
programs/mythfilldatabase/xmltvparser.cpp
403 403 QDomElement item = values.item(0).toElement(); 404 404 if (item.isNull()) 405 405 continue; 406 ProgRating rating;406 EventRating rating; 407 407 rating.system = info.attribute("system", ""); 408 408 rating.rating = getFirstText(item); 409 409 pginfo->ratings.append(rating);
