| 822 | if (deleteMap == NULL) |
| 823 | return oldBookmark; |
| 824 | long long subtraction = 0; |
| 825 | long long startOfCutRegion = 0; |
| 826 | QMap<long long, int> delMap = *deleteMap; |
| 827 | bool withinCut = false; |
| 828 | while (delMap.count() && delMap.begin().key() <= oldBookmark) |
| 829 | { |
| 830 | if (delMap.begin().data() == MARK_CUT_START && !withinCut) |
| 831 | { |
| 832 | withinCut = true; |
| 833 | startOfCutRegion = delMap.begin().key(); |
| 834 | } |
| 835 | else if (delMap.begin().data() == MARK_CUT_END && withinCut) |
| 836 | { |
| 837 | withinCut = false; |
| 838 | subtraction += (delMap.begin().key() - startOfCutRegion); |
| 839 | } |
| 840 | delMap.remove(delMap.begin()); |
| 841 | } |
| 842 | if (withinCut) |
| 843 | subtraction += (oldBookmark - startOfCutRegion); |
| 844 | return oldBookmark - subtraction; |
| 845 | } |
| 846 | |
| 847 | long long ReloadBookmark(ProgramInfo *pginfo) |
| 848 | { |
| 849 | MSqlQuery query(MSqlQuery::InitCon()); |
| 850 | long long currentBookmark = 0; |
| 851 | query.prepare("SELECT DISTINCT mark FROM recordedmarkup " |
| 852 | "WHERE chanid = :CHANID " |
| 853 | "AND starttime = :STARTIME " |
| 854 | "AND type = :MARKTYPE ;"); |
| 855 | query.bindValue(":CHANID", pginfo->chanid); |
| 856 | query.bindValue(":STARTTIME", pginfo->recstartts); |
| 857 | query.bindValue(":MARKTYPE", MARK_BOOKMARK); |
| 858 | if (query.exec() && query.next()) |
| 859 | { |
| 860 | currentBookmark = query.value(0).toLongLong(); |
| 861 | } |
| 862 | return currentBookmark; |
| 863 | } |
| 864 | |
| 865 | void WaitToDelete(ProgramInfo *pginfo, QMap<long long, int> *deleteMap) |
| 866 | { |
| 867 | // Reload the latest bookmark, translate it, and write it back so |
| 868 | // that new playback instances get the correct bookmark. |
| 869 | long long previousBookmark = ComputeNewBookmark(ReloadBookmark(pginfo), deleteMap); |
| 870 | pginfo->SetBookmark(previousBookmark); |
| 871 | QDateTime startOfWaiting = mythCurrentDateTime(); |
| 872 | |
| 873 | VERBOSE(VB_GENERAL, |
| 874 | "Transcode: delete old file: " |
| 875 | "waiting while program is in use."); |
| 876 | bool inUse = true; |
| 877 | MSqlQuery query(MSqlQuery::InitCon()); |
| 878 | while (inUse) |
| 879 | { |
| 880 | query.prepare("SELECT count(*) FROM inuseprograms " |
| 881 | "WHERE chanid = :CHANID " |
| 882 | "AND starttime = :STARTTIME " |
| 883 | "AND lastupdatetime < :LASTUPDATETIME " |
| 884 | "AND recusage = 'player' ;"); |
| 885 | query.bindValue(":CHANID", pginfo->chanid); |
| 886 | query.bindValue(":STARTTIME", pginfo->recstartts); |
| 887 | query.bindValue(":LASTUPDATETIME", startOfWaiting); |
| 888 | if (!query.exec() || !query.next()) |
| 889 | { |
| 890 | VERBOSE(VB_GENERAL, |
| 891 | "Transcode: delete old file: in-use query failed;"); |
| 892 | inUse = false; |
| 893 | } |
| 894 | else |
| 895 | { |
| 896 | inUse = (query.value(0).toUInt() != 0); |
| 897 | } |
| 898 | |
| 899 | if (inUse) |
| 900 | { |
| 901 | unsigned secondsToWait = 10; |
| 902 | VERBOSE(VB_GENERAL, |
| 903 | QString("Transcode: program in use, " |
| 904 | "rechecking in %1 seconds.").arg(secondsToWait)); |
| 905 | sleep(secondsToWait); |
| 906 | } |
| 907 | } |
| 908 | long long currentBookmark = ReloadBookmark(pginfo); |
| 909 | if (currentBookmark != previousBookmark) |
| 910 | { |
| 911 | pginfo->SetBookmark(ComputeNewBookmark(currentBookmark, deleteMap)); |
| 912 | } |
| 913 | VERBOSE(VB_GENERAL, "Transcode: program is no longer in use."); |
| 914 | } |
| 915 | |
| 916 | void CompleteJob(int jobID, ProgramInfo *pginfo, bool useCutlist, |
| 917 | QMap<long long, int> *deleteMap, int &resultCode) |
| 918 | { |
| 970 | MSqlQuery query(MSqlQuery::InitCon()); |
| 971 | |
| 972 | if (useCutlist) |
| 973 | { |
| 974 | query.prepare("DELETE FROM recordedmarkup " |
| 975 | "WHERE chanid = :CHANID " |
| 976 | "AND starttime = :STARTTIME " |
| 977 | "AND type != :BOOKMARK "); |
| 978 | query.bindValue(":CHANID", pginfo->chanid); |
| 979 | query.bindValue(":STARTTIME", pginfo->recstartts); |
| 980 | query.bindValue(":BOOKMARK", MARK_BOOKMARK); |
| 981 | |
| 982 | if (!query.exec()) |
| 983 | MythDB::DBError("Error in mythtranscode", query); |
| 984 | |
| 985 | query.prepare("UPDATE recorded " |
| 986 | "SET cutlist = :CUTLIST, " |
| 987 | "watched = :WATCHED WHERE chanid = :CHANID " |
| 988 | "AND starttime = :STARTTIME ;"); |
| 989 | query.bindValue(":CUTLIST", "0"); |
| 990 | query.bindValue(":WATCHED", "0"); |
| 991 | query.bindValue(":CHANID", pginfo->chanid); |
| 992 | query.bindValue(":STARTTIME", pginfo->recstartts); |
| 993 | |
| 994 | if (!query.exec()) |
| 995 | MythDB::DBError("Error in mythtranscode", query); |
| 996 | |
| 997 | pginfo->SetCommFlagged(COMM_FLAG_NOT_FLAGGED); |
| 998 | } |
| 999 | else |
| 1000 | { |
| 1001 | query.prepare("DELETE FROM recordedmarkup " |
| 1002 | "WHERE chanid = :CHANID " |
| 1003 | "AND starttime = :STARTTIME " |
| 1004 | "AND type not in ( :COMM_START, " |
| 1005 | " :COMM_END, :BOOKMARK, " |
| 1006 | " :CUTLIST_START, :CUTLIST_END) ;"); |
| 1007 | query.bindValue(":CHANID", pginfo->chanid); |
| 1008 | query.bindValue(":STARTTIME", pginfo->recstartts); |
| 1009 | query.bindValue(":COMM_START", MARK_COMM_START); |
| 1010 | query.bindValue(":COMM_END", MARK_COMM_END); |
| 1011 | query.bindValue(":BOOKMARK", MARK_BOOKMARK); |
| 1012 | query.bindValue(":CUTLIST_START", MARK_CUT_START); |
| 1013 | query.bindValue(":CUTLIST_END", MARK_CUT_END); |
| 1014 | |
| 1015 | if (!query.exec()) |
| 1016 | MythDB::DBError("Error in mythtranscode", query); |
| 1017 | } |
| 1018 | |
974 | | MSqlQuery query(MSqlQuery::InitCon()); |
975 | | |
976 | | if (useCutlist) |
977 | | { |
978 | | query.prepare("DELETE FROM recordedmarkup " |
979 | | "WHERE chanid = :CHANID " |
980 | | "AND starttime = :STARTTIME "); |
981 | | query.bindValue(":CHANID", pginfo->chanid); |
982 | | query.bindValue(":STARTTIME", pginfo->recstartts); |
983 | | |
984 | | if (!query.exec()) |
985 | | MythDB::DBError("Error in mythtranscode", query); |
986 | | |
987 | | query.prepare("UPDATE recorded " |
988 | | "SET cutlist = :CUTLIST, bookmark = :BOOKMARK, " |
989 | | "watched = :WATCHED WHERE chanid = :CHANID " |
990 | | "AND starttime = :STARTTIME ;"); |
991 | | query.bindValue(":CUTLIST", "0"); |
992 | | query.bindValue(":BOOKMARK", "0"); |
993 | | query.bindValue(":WATCHED", "0"); |
994 | | query.bindValue(":CHANID", pginfo->chanid); |
995 | | query.bindValue(":STARTTIME", pginfo->recstartts); |
996 | | |
997 | | if (!query.exec()) |
998 | | MythDB::DBError("Error in mythtranscode", query); |
999 | | |
1000 | | pginfo->SetCommFlagged(COMM_FLAG_NOT_FLAGGED); |
1001 | | } |
1002 | | else |
1003 | | { |
1004 | | query.prepare("DELETE FROM recordedmarkup " |
1005 | | "WHERE chanid = :CHANID " |
1006 | | "AND starttime = :STARTTIME " |
1007 | | "AND type not in ( :COMM_START, " |
1008 | | " :COMM_END, :BOOKMARK, " |
1009 | | " :CUTLIST_START, :CUTLIST_END) ;"); |
1010 | | query.bindValue(":CHANID", pginfo->chanid); |
1011 | | query.bindValue(":STARTTIME", pginfo->recstartts); |
1012 | | query.bindValue(":COMM_START", MARK_COMM_START); |
1013 | | query.bindValue(":COMM_END", MARK_COMM_END); |
1014 | | query.bindValue(":BOOKMARK", MARK_BOOKMARK); |
1015 | | query.bindValue(":CUTLIST_START", MARK_CUT_START); |
1016 | | query.bindValue(":CUTLIST_END", MARK_CUT_END); |
1017 | | |
1018 | | if (!query.exec()) |
1019 | | MythDB::DBError("Error in mythtranscode", query); |
1020 | | } |
1021 | | |