Re: gtik (stock ticker) broken because yahoo still change its page



Ok bug #123125 created for the patch
http://bugzilla.gnome.org/show_bug.cgi?id=123125

Kevin Vandersloot wrote:

Hi Remi. I've updated gtik for the changes and pushed out new 2.2.3 and
2.4.1 releases. How about putting this in bugzilla for now? This looks
interesting, although we need to find a way to avoid using yahoo. I know
NASDAQ has an xml feed so we probably ought to look into that sometime.

Regards,
Kevin


On Tue, 2003-09-23 at 20:39, Rémi Cohen-Scali wrote:
I have a patch that fix the problem.
In order to avoid having such a problem again (2nd or 3rd time) I changed data source. Instead of fetching html and parsing quotes I get a csv file (this seems to be a new yahho feature).
Parsing is easier ...
Usage/include of some other kind of data is possible and easy
May I commit in gnome-2-4 branch ? in HEAD ?

Rémi Cohen-Scali wrote:

Hy

Was on vacations, (just back).
If the problem still persist, I'll try to get a patch for the end of week

Kevin Vandersloot wrote:

OK, this is a Show-Stopper for gnome-applets. We need to get a patch in
ASAP, otherwise we have to disable gtik from the build for the time
being.
Remi: have you got a working patch yet? Do you think you can get a
working patch soon? I don't know much about the parsing code to fix it.
Anyone else feel like looking into the problem.

Kevin

On Fri, 2003-09-05 at 01:18, Rémi Cohen-Scali wrote:


Yahoo finance web still changed its look. Stock ticker is of course broken.
Here is a patch for fixing gtik.
Is it possible to commit it for 2.4?
Else gtik is not usable.
----



diff -urN gnome-applets-2.3.90/gtik.old/gtik.c gnome-applets-2.3.90/gtik/gtik.c
--- gnome-applets-2.3.90/gtik.old/gtik.c    Thu Jul 24 03:48:15 2003
+++ gnome-applets-2.3.90/gtik/gtik.c    Fri Sep  5 07:10:56 2003
@@ -271,9 +271,9 @@
       stockdata->vfshandle = NULL;
   }
- source_text_uri = g_strconcat("http://finance.yahoo.com/q?s=";,
+    source_text_uri = g_strconcat("http://finance.yahoo.com/q/cq?s=";,
                     stockdata->props.tik_syms,
-                      "&d=v2",
+ "&d=v1", NULL);

   source_uri = gnome_vfs_uri_new(source_text_uri);
@@ -411,7 +411,7 @@

       int  i=0;
       int  j=0;
-        static char Text[256]="";
+        static char Text[1024]="";

       if (line == NULL) {
           Text[0] = '\0';
@@ -441,10 +441,10 @@
   }

/*-----------------------------------------------------------------*/
-    static char *parseQuote(FILE *CONFIG, char line[512]) {
+    static char *parseQuote(FILE *CONFIG, char line[1024]) {
- char symbol[512];
-        char buff[512];
+        char symbol[1024];
+        char buff[1024];
       char price[16];
       char change[16];
       char percent[16];
@@ -473,16 +473,16 @@
       linenum++;

       /* Skip the time... */
-        if (!AllOneLine) fgets(line,255,CONFIG);
+        if (!AllOneLine) fgets(line,1023,CONFIG);
       else section = strtok(NULL,"|");
       linenum++;

       while (linenum < 8 ) {
           if (!AllOneLine) {
-                fgets(line,255,CONFIG);
+                fgets(line,1023,CONFIG);
if (strstr(line,
-                   "<td align=center nowrap colspan=2>")) {
+ "<td class=\"yfnc_tabledata1\" nowrap=\"nowrap\" align=\"center\">")) {
                   strcpy(change,"");
                   strcpy(percent,"");
                   linenum=100;
@@ -491,26 +491,26 @@
           else {
               section = strtok(NULL,"|");
               if (strstr(section,
-                   "<td align=center nowrap colspan=2>")) {
+ "<td class=\"yfnc_tabledata1\" nowrap=\"nowrap\" align=\"center\">")) {
                   strcpy(change,"");
                   strcpy(percent,"");
                   linenum=100;
               }
           }

- if (linenum == 2) { + if (linenum == 3) { if (!AllOneLine) strcpy(price,extractText(line));
               else
                   strcpy(price,extractText(section));
           }
-            else if (linenum == 3) {
+            else if (linenum == 4) {
               if (!AllOneLine)
                   strcpy(change,extractText(line));
               else
                   strcpy(change,extractText(section));
           }
-            else if (linenum == 4) {
+            else if (linenum == 5) {
if (!AllOneLine) strcpy(percent,extractText(line));
               else
@@ -530,7 +530,7 @@
   int configured(StockData *stockdata) {
       int retVar;

-        char  buffer[512];
+        char  buffer[2048];
       static FILE *CONFIG;

       CONFIG = fopen((const char *)stockdata->configFileName,"r");
@@ -545,7 +545,7 @@
               fgets(buffer, sizeof(buffer)-1, CONFIG);

               if (strstr(buffer,
- "<td nowrap align=left><font face=arial size=-1><a href=\"/q\?s=")) { + "<td class=\"yfnc_tabledata1\" nowrap=\"nowrap\" align=\"center\"><b><a href=\"/q?s=")) {

setOutputArray(stockdata, parseQuote(CONFIG,buffer));
                     retVar = 1;

_______________________________________________
desktop-devel-list mailing list
desktop-devel-list gnome org
http://mail.gnome.org/mailman/listinfo/desktop-devel-list


_______________________________________________
desktop-devel-list mailing list
desktop-devel-list gnome org
http://mail.gnome.org/mailman/listinfo/desktop-devel-list
______________________________________________________________________

Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/gnome-applets/ChangeLog,v
retrieving revision 1.589.2.1
diff -u -r1.589.2.1 ChangeLog
--- ChangeLog	23 Sep 2003 01:28:17 -0000	1.589.2.1
+++ ChangeLog	24 Sep 2003 00:38:21 -0000
@@ -1,3 +1,17 @@
+2003-09-24  Remi Cohen-Scali  <rcoscali cvs gnome org>
+
+	* gtik/gtik.c: Fixed quote parsing in gtik. Now use
+	a csv file fetched from yahoo finance site. This
+	should avoid bugs because of html layout modifications.
+	This seems to be a new recent but stable feature.
+	(updateOutput): Use CSV export URL.
+	(parseQuote): Implement a far simpler parser for CSV.
+	(configured): One and only one line per ticker. No more
+	need to find a magic string. Only get necessary data.
+	(create_hig_category): type catagory -> category
+	(splitChange): Use of bzero. Removed rise for minus
+	change.
+
2003-09-22  Kevin Vandersloot

	* configure.in: release 2.4.1 for Stock Ticker fix.
Index: gtik/gtik.c
===================================================================
RCS file: /cvs/gnome/gnome-applets/gtik/gtik.c,v
retrieving revision 1.90.2.1
diff -u -r1.90.2.1 gtik.c
--- gtik/gtik.c	19 Sep 2003 00:22:29 -0000	1.90.2.1
+++ gtik/gtik.c	24 Sep 2003 00:38:22 -0000
@@ -270,10 +270,25 @@
		gnome_vfs_async_cancel (stockdata->vfshandle);
		stockdata->vfshandle = NULL;
	}
-		
-	source_text_uri = g_strconcat("http://finance.yahoo.com/q/cq?s=";,
+
+        /*
+         * Now using a CSV file to get quotes. Specification of CSV format
+         * is in URL f=sl1c1.
+         * Availables data columns are:
+         * s: ticker symbol
+         * l: last price
+ * d: date + * t: time
+         * c: change
+         * o: open price
+         * h: daily high
+         * g: daily low
+         * v: volume
+         * The digit following some data specifiers change data formating (html/raw)
+         */
+	source_text_uri = g_strconcat("http://finance.yahoo.com/d/quotes.csv?s=";,
				      stockdata->props.tik_syms,
-				      "&d=v1",
+				      "&f=sl1c1&e=.csv",
				      NULL);

	source_uri = gnome_vfs_uri_new(source_text_uri);
@@ -407,121 +422,46 @@


	/*-----------------------------------------------------------------*/
-	static char *extractText(const char *line) {
-
-		int  i=0;
-		int  j=0;
-		static char Text[1024]="";
-
-		if (line == NULL) {
-			Text[0] = '\0';
-			return Text;
-		}
-
-		while (i < (strlen(line) -1)) {
-			if (line[i] != '>')
-				i++;
-			else {
-				i++;
-				while (line[i] != '<') {
-					Text[j] = line[i];
-					i++;j++;
-				}
-			}
-		}
-		Text[j] = '\0';
-		i = 0;
-		while (i < (strlen(Text)) ) {
-			if (Text[i] < 32)
-				Text[i] = '\0';
-			i++;
-		}
-		return(Text);
-				
-	}
-
-	/*-----------------------------------------------------------------*/
-	static char *parseQuote(FILE *CONFIG, char line[1024]) {
+	static char *parseQuote(char line[1024]) {
		
-		char symbol[1024];
-		char buff[1024];
-		char price[16];
-		char change[16];
-		char percent[16];
-		static char result[1024]="";
-		int  linenum=0;
-		int AllOneLine=0;
-		int flag=0;
-		char *section = NULL;
-		char *ptr;
-
-		if (strlen(line) > 64) AllOneLine=1;
-
-		if (AllOneLine) {
-			strcpy(buff,line);
-			while (!flag) {
-				if ((ptr=strstr(buff,"</td>"))!=NULL) {
-					ptr[0] = '|';
-				}	
-				else flag=1;
-			}
-			section = strtok(buff,"|");
-		}
-		/* Get the stock symbol */
-		if (!AllOneLine) strcpy(symbol,extractText(line));
-		else strcpy(symbol,extractText(section));
-		linenum++;
-
-		/* Skip the time... */
-		if (!AllOneLine) fgets(line,1023,CONFIG);
-		else section = strtok(NULL,"|");
-		linenum++;
-
-		while (linenum < 8 ) {
-			if (!AllOneLine) {
-				fgets(line,1023,CONFIG);
-			
-				if (strstr(line,
-			  	 "td class=\"yfnc_tabledata1\" nowrap=\"nowrap\" align=\"center\">")) {
-					strcpy(change,"");
-					strcpy(percent,"");
-					linenum=100;
-				}
-			}
-			else {
-				section = strtok(NULL,"|");
-				if (section && strstr(section,
-			  	 "td class=\"yfnc_tabledata1\" nowrap=\"nowrap\" align=\"center\">")) {
-					strcpy(change,"");
-					strcpy(percent,"");
-					linenum=100;
-				}
-			}
-			
- if (linenum == 2) { - if (!AllOneLine) - strcpy(price,extractText(line));
-				else
-					strcpy(price,extractText(section));
-			}
-			else if (linenum == 3) {
-				if (!AllOneLine)
-					strcpy(change,extractText(line));
-				else
-					strcpy(change,extractText(section));
-			}
-			else if (linenum == 4) {
- if (!AllOneLine) - strcpy(percent,extractText(line));
-				else
-					strcpy(percent,extractText(section));
-				linenum = 100;
-			}
-			linenum++;
-		}
-		sprintf(result,"%s:%s:%s:%s",
-				symbol,price,change,percent);		
-		return(result);
+                char *symbol;
+                char *price;
+                char *change;
+ double price_val; + double change_val; + double percent;
+                static char result[512]="";
+
+                /* Yahoo file comme in C format */
+                setlocale(LC_NUMERIC, "C");
+ + symbol = strtok(line, ",");
+                symbol++;
+                symbol[strlen(symbol) -1] = 0;
+ g_message ("symbol: %s", symbol); + + price = strtok(NULL, ","); + price_val = strtod(price, NULL); +
+                change = strtok(NULL, ",");
+                /* file in DOS format: remove \r\n */
+                change[strlen(change) -1] = 0;
+                change[strlen(change) -1] = 0;
+ change_val = strtod(change, NULL); + + percent = (change_val/price_val)*1E+02; +
+                /* Restore numeric format for displaying */
+                setlocale(LC_NUMERIC, getenv("LANG"));
+ + if (change_val == 0.0)
+                        sprintf(result,"%s:%1.2f:%1.2f:%1.2f%%",
+                                symbol,price_val,change_val,percent);
+                else
+                        sprintf(result,"%s:%1.2f:%1.2f:%+1.2f%%",
+                                symbol,price_val,change_val,percent);
+ + return result;

	}

@@ -545,10 +485,9 @@
			while ( !feof(CONFIG) ) {
				fgets(buffer, sizeof(buffer)-1, CONFIG);

-				if (strstr(buffer,
-				    "<td class=\"yfnc_tabledata1\" nowrap=\"nowrap\" align=\"center\"><b><a href=\"/q?s=")) {
+				if (!feof(CONFIG)) {

-				      setOutputArray(stockdata, parseQuote(CONFIG,buffer));
+				      setOutputArray(stockdata, parseQuote(buffer));
				      retVar = 1;
				}
				else {
@@ -1356,7 +1295,7 @@
	}
	
	static GtkWidget *
-	create_hig_catagory (GtkWidget *main_box, gchar *title)
+	create_hig_category (GtkWidget *main_box, gchar *title)
	{
		GtkWidget *vbox, *vbox2, *hbox;
		GtkWidget *label;
@@ -1440,7 +1379,7 @@
		label = gtk_label_new (_("Behavior"));
		gtk_notebook_append_page (GTK_NOTEBOOK (notebook), behav_vbox, label);
		
-		vbox = create_hig_catagory (behav_vbox, _("Update"));
+		vbox = create_hig_category (behav_vbox, _("Update"));
		
		hbox2 = gtk_hbox_new (FALSE, 12);
		gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, FALSE, 0);
@@ -1462,7 +1401,7 @@
		if ( ! key_writable (PANEL_APPLET (stockdata->applet), "timeout"))
			hard_set_sensitive (hbox2, FALSE);
		
-		vbox = create_hig_catagory (behav_vbox, _("Scrolling"));
+		vbox = create_hig_category (behav_vbox, _("Scrolling"));
		
		hbox2 = gtk_hbox_new (FALSE, 12);
		gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, FALSE, 0);
@@ -1527,7 +1466,7 @@
		
		size = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
		
-		vbox = create_hig_catagory (appear_vbox, _("Display"));
+		vbox = create_hig_category (appear_vbox, _("Display"));
		gtk_widget_show_all (vbox);
		
		hbox2 = gtk_hbox_new (FALSE, 6);
@@ -1568,7 +1507,7 @@
		if ( ! key_writable (PANEL_APPLET (stockdata->applet), "width"))
			hard_set_sensitive (hbox2, FALSE);
		
-		vbox = create_hig_catagory (appear_vbox, _("Font and Colors"));
+		vbox = create_hig_category (appear_vbox, _("Font and Colors"));
		size = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
		size2= gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
				
@@ -1973,11 +1912,15 @@

	/*-----------------------------------------------------------------*/
	char *splitChange(StockData *stockdata,char *data, StockQuote *quote) {
-		char buff[128]="";
-		static char buff2[128]="";
+ char buff[128]; + static char buff2[128];
		char *var1, *var2, *var3, *var4;
-		char rise[1]="";
+ char rise[2]; + bzero(buff, 128); + bzero(buff2, 128); + bzero(rise, 2); + strcpy(buff,data);
		var1 = strtok(buff,":");
		var2 = strtok(NULL,":");
@@ -2003,7 +1946,6 @@
#endif
			var4[0] = '(';
			quote->color = RED;
-			sprintf (rise, "-");
		}
		else {
			var3 = g_strdup(_("(No"));




[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]