Re: gtik (stock ticker) broken because yahoo still change its page
- From: Rémi Cohen-Scali <Remi Cohen-Scali com>
- To: GNOME Desktop Devel <desktop-devel-list gnome org>, GNOME Release team <release-team gnome org>
- Cc: Kevin Vandersloot <kfv101 psu edu>
- Subject: Re: gtik (stock ticker) broken because yahoo still change its page
- Date: Wed, 24 Sep 2003 02:39:57 +0200
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]