
---
commit a1e897b974e1a49019a13ac26835b047d4bed04b
tree d2a4d07d42972e7a5e1c126a308dda6b4cfd7155
parent 517a2f23cc412c38240cc1f0d11c8711531ac0b6
author Mike Drons <mdrons@yahoo.com> Sun, 31 Aug 2008 21:26:43 -0400
committer Mike Drons <mdrons@yahoo.com> Sun, 31 Aug 2008 21:26:43 -0400

 include/cmyth.h              |    3 ++
 libs/libcmyth/mythtv_mysql.c |   55 +++++++++++++++++++++++++++++++++++++-----
 src/mythtv.c                 |   46 ++++++++++++++++++++++++++++-------
 src/video.c                  |   14 +++++++++++
 4 files changed, 102 insertions(+), 16 deletions(-)

diff --git a/include/cmyth.h b/include/cmyth.h
index b8c0afd..f107698 100644
--- a/include/cmyth.h
+++ b/include/cmyth.h
@@ -917,7 +917,8 @@ extern cmyth_freespace_t cmyth_freespace_create(void);
  * -------
  */
 extern long long cmyth_get_bookmark(cmyth_conn_t conn, cmyth_proginfo_t prog);
-extern int cmyth_get_bookmark_offset(cmyth_database_t db, long chanid, long long mark);
+extern int cmyth_get_bookmark_offset(cmyth_database_t db, long chanid, long long mark, char *starttime);
+extern int cmyth_update_bookmark_setting(cmyth_database_t, cmyth_proginfo_t);
 extern int cmyth_get_bookmark_mark(cmyth_database_t, cmyth_proginfo_t, long long);
 extern int cmyth_set_bookmark(cmyth_conn_t conn, cmyth_proginfo_t prog,
 	long long bookmark);
diff --git a/libs/libcmyth/mythtv_mysql.c b/libs/libcmyth/mythtv_mysql.c
index fbd7df0..d5ae1c0 100644
--- a/libs/libcmyth/mythtv_mysql.c
+++ b/libs/libcmyth/mythtv_mysql.c
@@ -648,21 +648,52 @@ fill_program_recording_status(cmyth_conn_t conn, char * msg)
 	}
 	return err;
 }
+int
+cmyth_update_bookmark_setting(cmyth_database_t db, cmyth_proginfo_t prog)
+{
+	MYSQL_RES *res = NULL;
+	const char *query_str = "UPDATE recorded SET bookmark = 1 WHERE chanid = ? AND starttime = ?";
+	cmyth_mysql_query_t * query;
+	char starttime[CMYTH_TIMESTAMP_LEN + 1];
+
+	cmyth_timestamp_to_string(starttime, prog->proginfo_rec_start_ts);
+	query = cmyth_mysql_query_create(db,query_str);
+	if (cmyth_mysql_query_param_long(query, prog->proginfo_chanId) < 0
+		|| cmyth_mysql_query_param_str(query, starttime) < 0 ) {
+		cmyth_dbg(CMYTH_DBG_ERROR,"%s, binding of query parameters failed! Maybe we're out of memory?\n", __FUNCTION__);
+		ref_release(query);
+		return -1;
+	}
+	res = cmyth_mysql_query_result(query);
+	ref_release(query);
+	if (res == NULL) {
+		cmyth_dbg(CMYTH_DBG_ERROR, "%s, finalisation/execution of query failed!\n", __FUNCTION__);
+		return -1;
+	}
+	mysql_free_result(res);
+	return (1);
+}
 
 int 
 cmyth_get_bookmark_mark(cmyth_database_t db, cmyth_proginfo_t prog, long long bk)
 {
 	MYSQL_RES *res = NULL;
 	MYSQL_ROW row;
-	const char *query_str = "SELECT mark FROM recordedseek WHERE chanid = ? AND offset>= ? AND type = 6 ORDER by MARK ASC LIMIT 0,1;";
+	const char *query_str = "SELECT mark FROM recordedseek WHERE chanid = ? AND offset>= ? AND type = 6 AND starttime = ? ORDER by MARK ASC LIMIT 0,1;";
 	int rows = 0;
 	int mark=0;
 	char start_ts_dt[CMYTH_TIMESTAMP_LEN + 1];
 	cmyth_mysql_query_t * query;
-	cmyth_datetime_to_string(start_ts_dt, prog->proginfo_rec_start_ts);
+	cmyth_timestamp_to_string(start_ts_dt, prog->proginfo_rec_start_ts);
 	query = cmyth_mysql_query_create(db,query_str);
+
+fprintf (stderr, "MIKE -- SELECT mark FROM recordedseek WHERE chanid = %ld ", (long)prog->proginfo_chanId);
+fprintf (stderr, " AND offset>= %lli AND type = 6 AND ", bk );
+fprintf (stderr, "starttime = %s ORDER by MARK\n",start_ts_dt );
+
 	if (cmyth_mysql_query_param_long(query, prog->proginfo_chanId) < 0
 		|| cmyth_mysql_query_param_long(query, bk) < 0
+		|| cmyth_mysql_query_param_str(query, start_ts_dt) < 0
 		) {
 		cmyth_dbg(CMYTH_DBG_ERROR,"%s, binding of query parameters failed! Maybe we're out of memory?\n", __FUNCTION__);
 		ref_release(query);
@@ -675,25 +706,33 @@ cmyth_get_bookmark_mark(cmyth_database_t db, cmyth_proginfo_t prog, long long bk
 		return -1;
 	}
 	while ((row = mysql_fetch_row(res))) {
+fprintf(stderr, "MIKE -- LOOP\n");
 		mark = safe_atoi(row[0]);
 		rows++;
 	}
 	mysql_free_result(res);
-	return mark;
+
+fprintf(stderr, "MIKE -- mark = %d\n",mark);
+
+	return (mark-1);
 }
 
 int 
-cmyth_get_bookmark_offset(cmyth_database_t db, long chanid, long long mark) 
+cmyth_get_bookmark_offset(cmyth_database_t db, long chanid, long long mark, char *starttime) 
 {
 	MYSQL_RES *res = NULL;
 	MYSQL_ROW row;
-	const char *query_str = "SELECT * FROM recordedseek WHERE chanid = ? AND mark= ?;";
+	const char *query_str = "SELECT * FROM recordedseek WHERE chanid = ? AND mark= ? AND starttime = ?;";
 	int offset=0;
 	int rows = 0;
 	cmyth_mysql_query_t * query;
+
+fprintf(stderr,"MIKE -- starttime = %s\n",starttime);
+
 	query = cmyth_mysql_query_create(db,query_str);
 	if (cmyth_mysql_query_param_long(query, chanid) < 0
 		|| cmyth_mysql_query_param_long(query, mark) < 0
+		|| cmyth_mysql_query_param_str(query, starttime) < 0
 		) {
 		cmyth_dbg(CMYTH_DBG_ERROR,"%s, binding of query parameters failed! Maybe we're out of memory?\n", __FUNCTION__);
 		ref_release(query);
@@ -718,7 +757,11 @@ cmyth_mysql_get_commbreak_list(cmyth_database_t db, int chanid, char * start_ts_
 {
 	MYSQL_RES *res = NULL;
 	MYSQL_ROW row;
-	const char *query_str = "SELECT m.type AS type, m.mark AS mark, s.offset AS offset FROM recordedmarkup m INNER JOIN recordedseek AS s ON (m.chanid = s.chanid AND m.starttime = s.starttime AND (FLOOR(m.mark / 15) + 1) = s.mark) WHERE m.chanid = ? AND m.starttime = ? AND m.type IN (?, ?) ORDER BY mark;";
+	/*if (av_get_mode()== 1) {
+		const char *query_str = "SELECT m.type AS type, m.mark AS mark, s.offset AS offset FROM recordedmarkup m INNER JOIN recordedseek AS s ON (m.chanid = s.chanid AND m.starttime = s.starttime AND (FLOOR(m.mark / 12) + 1) = s.mark) WHERE m.chanid = ? AND m.starttime = ? AND m.type IN (?, ?) ORDER BY mark;";
+	}
+	else { */
+		const char *query_str = "SELECT m.type AS type, m.mark AS mark, s.offset AS offset FROM recordedmarkup m INNER JOIN recordedseek AS s ON (m.chanid = s.chanid AND m.starttime = s.starttime AND (FLOOR(m.mark / 15) + 1) = s.mark) WHERE m.chanid = ? AND m.starttime = ? AND m.type IN (?, ?) ORDER BY mark;";
 	int rows = 0;
 	cmyth_mysql_query_t * query;
 	query = cmyth_mysql_query_create(db,query_str);
diff --git a/src/mythtv.c b/src/mythtv.c
index 641f29c..3f4f09c 100644
--- a/src/mythtv.c
+++ b/src/mythtv.c
@@ -250,6 +250,10 @@ mythtv_video_key(char key)
 	long long offset=0;
 	long long dbmark=0;
 	cmyth_conn_t ctrl=ref_hold(control);
+	char starttime[24];
+	int mode=0;
+	mode=av_get_mode();
+	fprintf(stderr, "VIDEO MODE = %d\n",mode);
 
 	switch (key) {
 		case MVPW_KEY_SKIP:
@@ -272,11 +276,21 @@ mythtv_video_key(char key)
 				fprintf(stderr, "Not in commbreak.  Reverting to standard replay.\n");
 			}
 			break;
-		case MVPW_KEY_BLUE:
+		case MVPW_KEY_BLUE: //get bookmark
 			if ((mark=cmyth_get_bookmark(ctrl,current_prog)) >0) {
-				mark=(mark/15)+1;
+				fprintf(stderr, "MIKE --  MARK = %lli\n",mark);
+				fprintf(stderr, "MIKE --  MODE = %d\n",mode);
+				if (mode == 0) {
+					mark=(mark/15)+1;
+				}
+				else if (mode == 1) {
+					mark=(mark/12)+1;
+				}
+				fprintf(stderr, "MIKE --  MARK = %lli\n",mark);
 				chanid=cmyth_proginfo_chan_id(current_prog);
-				if ((offset = cmyth_get_bookmark_offset(mythtv_database,chanid,mark)) <0) {
+				cmyth_timestamp_to_string(starttime,cmyth_proginfo_rec_start(current_prog));
+				fprintf (stderr, "MIKE starttime = %s\n",starttime);
+				if ((offset = cmyth_get_bookmark_offset(mythtv_database,chanid,mark,starttime)) <0) {
 					fprintf(stderr,"No offset found in recordedseek chanid=%ld mark=%qd\n",chanid,mark);
 				}
 				else {
@@ -290,19 +304,33 @@ mythtv_video_key(char key)
 				fprintf (stderr,"No bookmark found\n");
 			}
 			break;
-		case MVPW_KEY_YELLOW:
+		case MVPW_KEY_YELLOW: //set bookmark
 			bookmark = video_functions->seek(0, SEEK_CUR);
 			bk= bookmark;
 			if ((dbmark=cmyth_get_bookmark_mark(mythtv_database,current_prog,bk)) < 0) {
 				fprintf(stderr, "Bookmark not set\n");
 			}
 			else {
-				dbmark = (dbmark-1)*15;
+			fprintf(stderr, "MIKE -- MODE = %d   dbmark = %lld\n",mode,dbmark);
+				if (mode == 0) {
+					dbmark = (dbmark-1)*15;
+				}
+				else if (mode == 1) {
+					dbmark = (dbmark-1)*12;
+				}
 				fprintf (stderr,"keyframe mark = %lld\n",dbmark);
-				cmyth_set_bookmark(ctrl, current_prog, dbmark );
-				cmyth_dbg(CMYTH_DBG_DEBUG, "bookmark saved, value: %qd \n",bookmark);
-				display_bookmark_status_osd(1);
-				rc=1;
+				if ( cmyth_set_bookmark(ctrl, current_prog, dbmark ) < 0 ) {
+					display_bookmark_status_osd(4);
+					cmyth_dbg(CMYTH_DBG_DEBUG, "ERROR bookmark FAILED, value: %qd \n",bookmark);
+				}
+				else {
+					cmyth_dbg(CMYTH_DBG_DEBUG, "bookmark saved, value: %qd \n",bookmark);
+					display_bookmark_status_osd(1);
+					if (cmyth_update_bookmark_setting(mythtv_database, current_prog) <0) {
+						cmyth_dbg(CMYTH_DBG_DEBUG, "ERROR cmyth_update_bookmark_setting failed\n");
+					}
+					rc=1;
+				}
 			}
 			break;
 	}
diff --git a/src/video.c b/src/video.c
index c4d7f02..3eb9c76 100644
--- a/src/video.c
+++ b/src/video.c
@@ -661,6 +661,16 @@ seek_disable_osd(mvp_widget_t *widget)
 }
 
 void
+set_bookmark_status_fail(mvp_widget_t *widget)
+{
+	char buf[32];
+	display_on=!display_on;
+	snprintf(buf, sizeof(buf),"Bookmark Failed");
+	mvpw_set_text_str(mythtv_osd_description, buf);
+	mvpw_expose(mythtv_osd_description);
+}
+
+void
 set_bookmark_status(mvp_widget_t *widget)
 {
 	char buf[32];
@@ -725,6 +735,10 @@ display_bookmark_status_osd(int function)
 		case 3:
 			// doing a normal seek
 			set_osd_callback(OSD_PROGRAM, set_seek_status);
+		case 4:
+			// set bookmark failed
+			set_osd_callback(OSD_PROGRAM, set_bookmark_status_fail);
+			break;
 	}
 	mvpw_set_timer(root, seek_disable_osd, 5000);
 }
