Go to the documentation of this file.
22 #define LOC QString("RecordingInfo(%1): ").arg(GetBasename())
26 return str.isEmpty() ?
"" : str;
34 const QString &_title,
35 const QString &_sortTitle,
36 const QString &_subtitle,
37 const QString &_sortSubtitle,
38 const QString &_description,
42 const QString &_syndicatedepisode,
43 const QString &_category,
46 const QString &_chanstr,
47 const QString &_chansign,
48 const QString &_channame,
50 const QString &_recgroup,
51 const QString &_playgroup,
53 const QString &_hostname,
54 const QString &_storagegroup,
60 const QString &_seriesid,
61 const QString &_programid,
62 const QString &_inetref,
67 const QDateTime &_startts,
68 const QDateTime &_endts,
69 const QDateTime &_recstartts,
70 const QDateTime &_recendts,
73 QDate _originalAirDate,
93 uint _videoproperties,
94 uint _audioproperties,
99 const QString &_inputname) :
101 _title, _sortTitle, _subtitle, _sortSubtitle,
102 _description, _season, _episode, _totalepisodes,
103 _category, _chanid, _chanstr, _chansign, _channame,
104 QString(), _recgroup, _playgroup,
105 _startts, _endts, _recstartts, _recendts,
106 _seriesid, _programid, _inetref, _inputname),
107 m_oldrecstatus(_oldrecstatus),
109 m_schedOrder(_schedorder),
111 m_sgroupId(_sgroupid),
112 m_desiredRecStartTs(_startts),
113 m_desiredRecEndTs(_endts)
164 const QString &_title,
165 const QString &_sortTitle,
166 const QString &_subtitle,
167 const QString &_sortSubtitle,
168 const QString &_description,
171 const QString &_category,
174 const QString &_chanstr,
175 const QString &_chansign,
176 const QString &_channame,
178 const QString &_recgroup,
179 const QString &_playgroup,
181 const QString &_seriesid,
182 const QString &_programid,
183 const QString &_inetref,
187 const QDateTime &_startts,
188 const QDateTime &_endts,
189 const QDateTime &_recstartts,
190 const QDateTime &_recendts,
203 _title, _sortTitle, _subtitle, _sortSubtitle,
204 _description, _season, _episode, 0,
205 _category, _chanid, _chanstr, _chansign, _channame,
206 QString(), _recgroup, _playgroup,
207 _startts, _endts, _recstartts, _recendts,
208 _seriesid, _programid, _inetref,
""),
209 m_desiredRecStartTs(_startts),
210 m_desiredRecEndTs(_endts)
238 uint _chanid,
const QDateTime &desiredts,
239 bool genUnknown, std::chrono::hours maxHours,
LoadStatus *status)
245 QString querystr =
"WHERE program.chanid = :CHANID AND "
246 " program.starttime < :STARTTS1 AND "
247 " program.endtime > :STARTTS2 ";
248 bindings[
":CHANID"] = QString::number(_chanid);
249 QDateTime query_startts = desiredts.addSecs(50 - desiredts.time().second());
250 bindings[
":STARTTS1"] = query_startts;
251 bindings[
":STARTTS2"] = query_startts;
256 if (!progList.
empty())
262 auto maxSecs = duration_cast<std::chrono::seconds>(maxHours);
281 query.
prepare(
"SELECT chanid, channum, callsign, name, "
282 "commmethod, outputfilters "
284 "WHERE chanid = :CHANID");
342 querystr =
"WHERE program.chanid = :CHANID AND "
343 " program.starttime > :STARTTS "
344 "GROUP BY program.starttime ORDER BY program.starttime LIMIT 1 ";
345 bindings[
":CHANID"] = QString::number(_chanid);
346 bindings[
":STARTTS"] = desiredts.addSecs(50 - desiredts.time().second());
350 if (!progList.
empty())
367 bool ignore_non_serialized_data)
383 if (!ignore_non_serialized_data)
402 bool ignore_non_serialized_data)
538 LOG(VB_GENERAL, LOG_ERR,
539 "ProgInfo Error: ApplyRecordRecID(void) needs recordid");
544 "SET recordid = :RECID "
545 "WHERE chanid = :CHANID AND starttime = :START");
608 if (newrecgroupid == 0)
610 query.
prepare(
"INSERT INTO recgroups SET recgroup = :NAME, "
611 "displayname = :DISPLAYNAME");
618 if (newrecgroupid <= 0)
620 LOG(VB_GENERAL, LOG_ERR, QString(
"Could not create recording group (%1). "
621 "Does it already exist?").
arg(newrecgroup));
626 LOG(VB_GENERAL, LOG_NOTICE,
627 QString(
"ApplyRecordRecGroupChange: %1 to %2 (%3)").
arg(
m_recGroup)
629 .
arg(newrecgroupid));
632 " SET recgroup = :RECGROUP, "
633 " recgroupid = :RECGROUPID "
634 " WHERE chanid = :CHANID"
635 " AND starttime = :START ;");
655 if (newrecgroupid > 0)
660 " SET recgroup = :RECGROUP, "
661 " recgroupid = :RECGROUPID "
662 " WHERE chanid = :CHANID"
663 " AND starttime = :START ;");
678 LOG(VB_GENERAL, LOG_NOTICE,
679 QString(
"ApplyRecordRecGroupChange: %1 to %2 (%3)").
arg(
m_recGroup)
681 .
arg(newrecgroupid));
694 " SET playgroup = :PLAYGROUP"
695 " WHERE chanid = :CHANID"
696 " AND starttime = :START ;");
719 " SET storagegroup = :STORAGEGROUP"
720 " WHERE chanid = :CHANID"
721 " AND starttime = :START ;");
742 const QString &newSubtitle,
const QString &newDescription)
745 QString sql =
"UPDATE recorded SET title = :TITLE, subtitle = :SUBTITLE ";
746 if (!newDescription.isNull())
747 sql +=
", description = :DESCRIPTION ";
748 sql +=
" WHERE chanid = :CHANID AND starttime = :START ;";
753 if (!newDescription.isNull())
763 if (!newDescription.isNull())
778 "SET transcoder = :PROFILEID "
779 "WHERE chanid = :CHANID "
780 "AND starttime = :START");
787 "in recorded table",
query);
803 "SET transcoder = 0 "
804 "WHERE chanid = :CHANID "
805 "AND starttime = :START");
811 "in recorded table",
query);
816 pidquery.
prepare(
"SELECT r.id "
817 "FROM recordingprofiles r, profilegroups p "
818 "WHERE r.profilegroup = p.id "
819 "AND p.name = 'Transcoders' "
820 "AND r.name = :PROFILE ");
823 if (!pidquery.
exec())
826 "profile ID",
query);
828 else if (pidquery.
next())
831 "SET transcoder = :TRANSCODER "
832 "WHERE chanid = :CHANID "
833 "AND starttime = :START");
840 "in recorded table",
query);
844 LOG(VB_GENERAL, LOG_ERR,
845 "ProgramInfo: unable to query transcoder profile ID");
892 uint chanid,
const QDateTime& recstartts)
896 LOG(VB_RECORD, LOG_WARNING,
897 QString(
"QueryRecordedIdFromKey: Invalid chanid %1").
arg(chanid));
900 if (!recstartts.isValid())
902 LOG(VB_RECORD, LOG_WARNING,
903 QString(
"QueryRecordedIdFromKey: Invalid start ts %1")
904 .
arg(recstartts.toString()));
910 "SELECT recordedid FROM recorded "
911 "WHERE chanid = :CHANID AND starttime = :RECSTARTTS");
954 LOG(VB_GENERAL, LOG_ERR,
"Couldn't insert program");
960 LOG(VB_FILE, LOG_INFO,
LOC + QString(
"StartedRecording: Recording to '%1'")
966 query.
prepare(
"DELETE FROM recordedseek WHERE chanid = :CHANID"
967 " AND starttime = :START;");
974 query.
prepare(
"DELETE FROM recordedmarkup WHERE chanid = :CHANID"
975 " AND starttime = :START;");
983 " SELECT * FROM credits"
984 " WHERE chanid = :CHANID AND starttime = :START;");
991 " SELECT * from program"
992 " WHERE chanid = :CHANID AND starttime = :START"
993 " AND title = :TITLE;");
1001 " SELECT * from programrating"
1002 " WHERE chanid = :CHANID AND starttime = :START;");
1028 if (!
query.
exec(
"LOCK TABLES recorded WRITE"))
1037 " WHERE chanid = :CHANID AND "
1038 " starttime = :STARTS");
1049 LOG(VB_GENERAL, LOG_ERR,
1050 QString(
"RecordingInfo::InsertProgram(%1): ")
1051 .
arg(pg->
toString()) +
"recording already exists...");
1066 "INSERT INTO recorded "
1067 " (chanid, starttime, endtime, title, "
1068 " subtitle, description, season, episode, "
1069 " hostname, category, recgroup, autoexpire, "
1070 " recordid, seriesid, programid, inetref, "
1071 " stars, previouslyshown, originalairdate, "
1072 " findid, transcoder, playgroup, recpriority, "
1073 " basename, progstart, progend, profile, "
1074 " duplicate, storagegroup, inputname, recgroupid) "
1076 " (:CHANID, :STARTS, :ENDS, :TITLE, "
1077 " :SUBTITLE, :DESC, :SEASON, :EPISODE, "
1078 " :HOSTNAME, :CATEGORY, :RECGROUP, :AUTOEXP, "
1079 " :RECORDID, :SERIESID, :PROGRAMID, :INETREF, "
1080 " :STARS, :REPEAT, :ORIGAIRDATE, "
1081 " :FINDID, :TRANSCODER, :PLAYGROUP, :RECPRIORITY, "
1082 " :BASENAME, :PROGSTART, :PROGEND, :PROFILE, "
1083 " 0, :STORGROUP, :INPUTNAME, :RECGROUPID) "
1096 else if (pg->
m_year >= 1895)
1151 query.
prepare(
"UPDATE channel SET last_record = NOW() "
1152 "WHERE chanid = :CHANID");
1158 "WHERE recordid = :RECORDID");
1166 "WHERE recordid = :PARENTID");
1188 query.
prepare(
"UPDATE recorded SET endtime = :ENDTIME, "
1189 " duplicate = :DUPLICATE "
1190 "WHERE chanid = :CHANID AND "
1191 " starttime = :STARTTIME ");
1206 qint64 endtime =
m_recEndTs.toSecsSinceEpoch();
1209 QString msg =
"Finished recording";
1210 QString msg_subtitle =
m_subtitle.isEmpty() ?
"" :
1212 QString details = QString(
"%1%2: channel %3")
1217 LOG(VB_GENERAL, LOG_INFO, QString(
"%1 %2").
arg(msg).
arg(details));
1230 query.
prepare(
"UPDATE recorded SET endtime = :ENDTIME "
1231 "WHERE chanid = :CHANID AND "
1232 " starttime = :STARTTIME ");
1251 result.
prepare(
"UPDATE oldrecorded SET reactivate = 1 "
1252 "WHERE station = :STATION AND "
1253 " starttime = :STARTTIME AND "
1254 " title = :TITLE;");
1273 LOG(VB_SCHEDULE, LOG_INFO, QString(
"AddHistory: %1/%2, %3, %4, %5/%6")
1284 result.
prepare(
"REPLACE INTO oldrecorded (chanid,starttime,"
1285 "endtime,title,subtitle,description,season,episode,"
1286 "category,seriesid,programid,inetref,findid,recordid,"
1287 "station,rectype,recstatus,duplicate,reactivate,generic,"
1289 "VALUES(:CHANID,:START,:END,:TITLE,:SUBTITLE,:DESC,:SEASON,"
1290 ":EPISODE,:CATEGORY,:SERIESID,:PROGRAMID,:INETREF,"
1291 ":FINDID,:RECORDID,:STATION,:RECTYPE,:RECSTATUS,:DUPLICATE,"
1292 ":REACTIVATE,:GENERIC,:FUTURE);");
1320 result.
prepare(
"REPLACE INTO oldfind (recordid, findid) "
1321 "VALUES(:RECORDID,:FINDID);");
1344 result.
prepare(
"DELETE FROM oldrecorded WHERE title = :TITLE AND "
1345 "starttime = :START AND station = :STATION");
1355 result.
prepare(
"DELETE FROM oldfind WHERE "
1356 "recordid = :RECORDID AND findid = :FINDID");
1391 result.
prepare(
"UPDATE recorded SET duplicate = 0 "
1392 "WHERE chanid = :CHANID "
1393 "AND starttime = :STARTTIME "
1394 "AND title = :TITLE;");
1406 "UPDATE recorded SET duplicate = 0 "
1407 "WHERE duplicate = 1 AND "
1408 " title = :TITLE AND "
1410 " (:PROGRAMID1 <> '' AND "
1411 " :PROGRAMID2 = recorded.programid) "
1414 " (:PROGRAMID3 = '' OR recorded.programid = '' OR "
1415 " LEFT(:PROGRAMID4, LOCATE('/', :PROGRAMID5)) <> "
1416 " LEFT(recorded.programid, "
1417 " LOCATE('/', recorded.programid))) "
1419 " (((:DUPMETHOD1 & 0x02) = 0) OR (:SUBTITLE1 <> '' "
1420 " AND :SUBTITLE2 = recorded.subtitle)) "
1422 " (((:DUPMETHOD2 & 0x04) = 0) OR (:DESCRIPTION1 <> '' "
1423 " AND :DESCRIPTION2 = recorded.description)) "
1425 " (((:DUPMETHOD3 & 0x08) = 0) OR "
1426 " (:SUBTITLE3 <> '' AND "
1427 " (:SUBTITLE4 = recorded.subtitle OR "
1428 " (recorded.subtitle = '' AND "
1429 " :SUBTITLE5 = recorded.description))) OR "
1430 " (:SUBTITLE6 = '' AND :DESCRIPTION3 <> '' AND "
1431 " (:DESCRIPTION4 = recorded.subtitle OR "
1432 " (recorded.subtitle = '' AND "
1433 " :DESCRIPTION5 = recorded.description)))) "
1462 result.
prepare(
"UPDATE oldrecorded SET duplicate = 0 "
1463 "WHERE station = :STATION "
1464 "AND starttime = :STARTTIME "
1465 "AND title = :TITLE;");
1477 "UPDATE oldrecorded SET duplicate = 0 "
1478 "WHERE duplicate = 1 AND "
1479 " title = :TITLE AND "
1481 " (:PROGRAMID1 <> '' AND "
1482 " :PROGRAMID2 = oldrecorded.programid) "
1485 " (:PROGRAMID3 = '' OR oldrecorded.programid = '' OR "
1486 " LEFT(:PROGRAMID4, LOCATE('/', :PROGRAMID5)) <> "
1487 " LEFT(oldrecorded.programid, "
1488 " LOCATE('/', oldrecorded.programid))) "
1490 " (((:DUPMETHOD1 & 0x02) = 0) OR (:SUBTITLE1 <> '' "
1491 " AND :SUBTITLE2 = oldrecorded.subtitle)) "
1493 " (((:DUPMETHOD2 & 0x04) = 0) OR (:DESCRIPTION1 <> '' "
1494 " AND :DESCRIPTION2 = oldrecorded.description)) "
1496 " (((:DUPMETHOD3 & 0x08) = 0) OR "
1497 " (:SUBTITLE3 <> '' AND "
1498 " (:SUBTITLE4 = oldrecorded.subtitle OR "
1499 " (oldrecorded.subtitle = '' AND "
1500 " :SUBTITLE5 = oldrecorded.description))) OR "
1501 " (:SUBTITLE6 = '' AND :DESCRIPTION3 <> '' AND "
1502 " (:DESCRIPTION4 = oldrecorded.subtitle OR "
1503 " (oldrecorded.subtitle = '' AND "
1504 " :DESCRIPTION5 = oldrecorded.description)))) "
1533 result.
prepare(
"DELETE FROM oldrecorded "
1534 "WHERE recstatus = :NEVER AND duplicate = 0");
1543 result.
prepare(
"DELETE FROM oldfind WHERE "
1544 "recordid = :RECORDID AND findid = :FINDID");
1564 result.
prepare(
"UPDATE oldrecorded SET duplicate = 1 "
1565 "WHERE future = 0 AND duplicate = 0 "
1566 "AND title = :TITLE AND "
1567 "((programid = '' AND subtitle = :SUBTITLE"
1568 " AND description = :DESC) OR "
1569 " (programid <> '' AND programid = :PROGRAMID) OR "
1570 " (findid <> 0 AND findid = :FINDID))");
1589 str.replace(
"%RECID%", QString::number(
getRecordID()));
1590 str.replace(
"%PARENTID%", QString::number(
m_parentId));
1591 str.replace(
"%FINDID%", QString::number(
m_findId));
1592 str.replace(
"%RECSTATUS%", QString::number(
m_recStatus));
1593 str.replace(
"%RECTYPE%", QString::number(
m_recType));
1608 query.
prepare(
"SELECT recgroupid FROM recgroups WHERE recgroup = :RECGROUP");
1627 query.
prepare(
"SELECT recgroup FROM recgroups WHERE recgroupid = :RECGROUPID");
void ApplyRecordPlayGroupChange(const QString &newplaygroup)
Sets the recording group, both in this RecordingInfo and in the database.
static uint GetRecgroupID(const QString &recGroup)
Temporary helper during transition from string to ID.
QMap< QString, QVariant > MSqlBindings
typedef for a map of string -> string bindings for generic queries.
bool isActive(void) const
bool LoadByProgram(const ProgramInfo *proginfo)
bool next(void)
Wrap QSqlQuery::next() so we can display the query results.
QSqlQuery wrapper that fetches a DB connection from the connection pool.
static bool InsertProgram(RecordingInfo *pg, const RecordingRule *rule)
virtual void SaveFilesize(uint64_t fsize)
Sets recording file size in database, and sets "filesize" field.
static bool QueryRecordedIdForKey(int &recordedid, uint chanid, const QDateTime &recstartts)
void FinishedRecording(bool allowReRecord)
If not a premature stop, adds program to history of recorded programs.
virtual uint64_t GetFilesize(void) const
void ApplyNeverRecord(void)
Set this program to never be recorded by inserting 'history' for it into the database with a status o...
RecStatus::Type m_oldrecstatus
void SetRecordingStatus(RecStatus::Type status)
QString GetHostname(void) const
QString GetInputName(void) const
bool Save(bool sendSig=true)
QDateTime m_desiredRecEndTs
void ApplyRecordStateChange(RecordingType newstate, bool save=true)
Sets RecordingType of "record", creating "record" if it does not exist.
void ApplyRecordRecID(void)
Sets recordid to match RecordingRule recordid.
static QMutex s_staticDataLock
Holds information on a TV Program one might wish to record.
uint64_t GetFilesize(void) const override
void ForgetHistory(void)
Forget the recording of a program so it will be recorded again.
virtual void clone(const ProgramInfo &other, bool ignore_non_serialized_data=false)
Copies important fields from other ProgramInfo.
QString GetChanNum(void) const
This is the channel "number", in the form 1, 1_2, 1-2, 1#1, etc.
void SetFilesize(uint64_t fsize) override
QVariant lastInsertId()
Return the id of the last inserted row.
static QString null_to_empty(const QString &str)
void DeleteHistory(void)
Deletes recording history, creating "record" it if necessary.
QVariant value(int i) const
arg(title).arg(filename).arg(doDelete))
RecordingType GetProgramRecordingStatus(void)
Returns the recording type for this RecordingInfo, creating "record" field if necessary.
Internal representation of a recording rule, mirrors the record table.
bool exec(void)
Wrap QSqlQuery::exec() so we can display SQL.
Holds information on a recording file and it's video and audio streams.
void SetScheduledStartTime(const QDateTime &dt)
bool IsReactivated(void) const
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
QDateTime GetScheduledEndTime(void) const
The scheduled end time of the program.
void UpdateRecordingEnd(void)
Update information in the recorded table when the end-time of a recording is changed.
static QString s_unknownTitle
int getRecordID(void)
Returns a record id, creating "record" it if necessary.
QDateTime current(bool stripped)
Returns current Date and Time in UTC.
QDateTime GetRecordingStartTime(void) const
Approximate time the recording started.
void SendAddedEvent(void) const
Sends event out that the ProgramInfo should be added to lists.
void ApplyTranscoderProfileChange(const QString &profile) const
Sets the transcoder profile for a recording.
bool IsRepeat(void) const
void ApplyStorageGroupChange(const QString &newstoragegroup)
Sets the storage group, both in this RecordingInfo and in the database.
QString GetProgramRecordingProfile(void) const
Returns recording profile name that will be, or was used, for this program, creating "record" field i...
void SetRecordingEndTime(const QDateTime &dt)
RecordingFile * GetRecordingFile() const
QDateTime GetScheduledStartTime(void) const
The scheduled start time of program.
RecStatus::Type GetRecordingStatus(void) const
RecStatus::Type m_savedrecstatus
void SetScheduledEndTime(const QDateTime &dt)
QDateTime m_desiredRecStartTs
void SaveFilesize(uint64_t fsize) override
Sets recording file size in database, and sets "filesize" field.
static QString GetRecgroupString(uint recGroupID)
Temporary helper during transition from string to ID.
QString GetTitle(void) const
static MSqlQueryInfo InitCon(ConnectionReuse _reuse=kNormalConnection)
Only use this in combination with MSqlQuery constructor.
static void DBError(const QString &where, const MSqlQuery &query)
int GetAutoRunJobs(void) const
Returns a bitmap of which jobs are attached to this RecordingInfo.
float clamp(float val, float minimum, float maximum)
void QuickRecord(void)
Create a kSingleRecord if not already scheduled.
void SaveTotalDuration(std::chrono::milliseconds duration)
Store the Total Duration at frame 0 in the recordedmarkup table.
QString toString(Verbosity v=kLongDescription, const QString &sep=":", const QString &grp="\"") const
void insert(uint recordedid, PIAction action, uint64_t filesize=0ULL)
static void RescheduleCheck(const RecordingInfo &recinfo, const QString &why)
void ReactivateRecording(void)
Asks the scheduler to restart this recording if possible.
void StartedRecording(const QString &ext)
Inserts this RecordingInfo into the database as an existing recording.
virtual void SetFilesize(uint64_t sz)
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
static QStringList LoadFromScheduler(const QString &tmptable, int recordid)
QString GetStorageGroup(void) const
static void ReschedulePlace(const QString &why)
#define kSubtitlePropertyOffset
QString m_chanPlaybackFilters
void ApplyRecordRecPriorityChange(int newrecpriority)
Sets recording priority of "record", creating "record" if it does not exist.
uint GetChanID(void) const
This is the unique key used in the database to locate tuning information.
static ProgramInfoUpdater * s_updater
~RecordingInfo() override
Destructor deletes "record" if it exists.
void SubstituteMatches(QString &str) override
Replace MATCH% vars in the specified string.
virtual void clone(const RecordingInfo &other, bool ignore_non_serialized_data=false)
Copies important fields from other RecordingInfo.
Holds information on recordings and videos.
int m_recordID
Unique Recording Rule ID.
class RecordingRule * m_record
QString m_syndicatedEpisode
void bindValue(const QString &placeholder, const QVariant &val)
Add a single binding.
bool LoadFromProgram(ProgramList &destination, const QString &where, const QString &groupBy, const QString &orderBy, const MSqlBindings &bindings, const ProgramList &schedList)
void clear(void) override
void AddHistory(bool resched=true, bool forcedup=false, bool future=false)
Adds recording history, creating "record" it if necessary.
virtual void SubstituteMatches(QString &str)
Subsitute MATCH% type variable names in the given string.
void ApplyTranscoderProfileChangeById(int id)
static const uint kUnknownProgramLength
uint32_t m_programFlags
ProgramFlag.
void SendUpdateEvent(void) const
Sends event out that the ProgramInfo should be reloaded.
void SetRecordingID(uint _recordedid) override
bool Delete(bool sendSig=true)
int numRowsAffected() const
QString GetHostName(void)
void ApplyRecordRecTitleChange(const QString &newTitle, const QString &newSubtitle, const QString &newDescription)
Sets the recording title, subtitle, and description both in this RecordingInfo and in the database.
RecordingFile * m_recordingFile
RecordingRule * GetRecordingRule(void)
Returns the "record" field, creating it if necessary.
void ApplyRecordRecGroupChange(const QString &newrecgroup)
Sets the recording group, both in this RecordingInfo and in the database.
float m_stars
Rating, range [0..1].
QString GetBasename(void) const
#define kVideoPropertyOffset
void SetReactivated(bool reactivate)
bool IsGeneric(void) const
MSqlQuery query(MSqlQuery::InitCon())
QString CreateRecordBasename(const QString &ext) const
Returns a filename for a recording based on the recording channel and date.
uint16_t m_properties
SubtitleType,VideoProperty,AudioProperty.
bool m_autoMetadataLookup
QString m_storageDeviceID
QString GetSetting(const QString &key, const QString &defaultval="")
bool prepare(const QString &query)
QSqlQuery::prepare() is not thread safe in Qt <= 3.3.2.
void SetDupHistory(void)
Set the duplicate flag in oldrecorded.