Download picasa web albums photos automatically. This application requires mpod mother board. See also http://mbed.org/users/geodenx/notebook/mpod/
Dependencies: BlinkLed HTTPClient EthernetInterface FatFileSystemCpp MSCFileSystem mbed-rtos mbed
Download picasa web albums photos automatically.
This application requires mpod mother board.
Picasaウェブアルバムから、自動的に写真をダウンロードして、ディジタルフォトフレームに表示します。
動作させるには mpod マザーボード が必要です。
プログラムの中で、ご自分のアルバムのRSSファイルへのURLを指定してからご利用下さい。
Diff: main.cpp
- Revision:
- 0:dfd5cfea7112
- Child:
- 2:531722036c0a
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Wed Aug 22 16:00:38 2012 +0000
@@ -0,0 +1,237 @@
+#include "mbed.h"
+#include "MSCFileSystem.h"
+#include "EthernetInterface.h"
+#include "HTTPClient.h"
+#include "HTTPFile.h"
+#include "BlinkLed.h"
+#include "tinyxml2.h"
+
+using namespace tinyxml2;
+
+int GetFile(const char *path, const char *url);
+int addNewLine(const char* dstPath, const char* srcPath);
+int summarizeRss(const char* dstPath, const char* srcPath);
+
+EthernetInterface eth;
+HTTPClient http;
+MSCFileSystem usb("usb");
+BlinkLed led1(LED1, 0.02);
+BlinkLed led2(LED2, 0.2);
+BlinkLed ethGreen(p26, 0.02);
+BlinkLed ethYellow(p25, 0.2);
+DigitalOut fsusb30s(p9);
+Timer timer;
+
+/***** Please specify "albumRssUrl" *****/
+const char* albumRssUrl = "http://picasaweb.google.com/data/feed/base/user/*****/albumid/*****?alt=rss&kind=photo&authkey=*****&hl=ja";
+
+const char* albumRssPath = "/usb/album.xml";
+const char* tempPath = "/usb/temp.xml";
+const char* summaryPath = "/usb/summary.xml";
+
+int main()
+{
+ printf("\n\n================================\n");
+ printf("mpod Picasa Photo frame\n");
+ printf("================================\n\n");
+
+ // FSUSB30 switches to HSD1 (mbed)
+ printf("USB host was switched to HSD1(mbed).\n\n");
+ fsusb30s = 0; // HSD1
+
+ // Network setup
+ printf("Setup EtherNet with DHCP.\n");
+ eth.init(); //Use DHCP
+ eth.connect();
+
+ // Obtain original lastBuildDate
+ char lastBuildDateOriginal[32] = {0};
+ {
+ XMLDocument docOriginal;
+ if(XML_SUCCESS != docOriginal.LoadFile(summaryPath))
+ {
+ strcpy(lastBuildDateOriginal, "No original summary.xml in USB memory");
+ }
+ else
+ {
+ XMLElement* lastBuildDateOriginalElement = docOriginal.FirstChildElement("rss")->FirstChildElement("channel")->FirstChildElement("lastBuildDate");
+ if(NULL == lastBuildDateOriginalElement)
+ {
+ strcpy(lastBuildDateOriginal, "No \"lastBuildDate\" element in original RSS");
+ }
+ else
+ {
+ strcpy(lastBuildDateOriginal, lastBuildDateOriginalElement->GetText());
+ }
+ }
+ }
+ printf("\nlastBuildDate (original): %s\n", lastBuildDateOriginal);
+
+ // Download Album
+ GetFile(albumRssPath, albumRssUrl);
+
+ // Summarize RSS
+ addNewLine(tempPath, albumRssPath);
+ summarizeRss(summaryPath, tempPath);
+
+ // Obtain current lastBuildDate
+ char lastBuildDateCurrent[32] = {0};
+
+ XMLDocument docCurrent;
+ if(XML_SUCCESS != docCurrent.LoadFile(summaryPath))
+ {
+ fsusb30s = 1; // HSD2
+ error("No current summary.xml in USB memory.\n");
+ }
+
+ XMLElement* lastBuildDateCurrentElement = docCurrent.FirstChildElement("rss")->FirstChildElement("channel")->FirstChildElement("lastBuildDate");
+ if(NULL == lastBuildDateCurrentElement)
+ {
+ fsusb30s = 1; // HSD2
+ error("No \"lastBuildDate\" element in current RSS.\n");
+ }
+ strcpy(lastBuildDateCurrent, lastBuildDateCurrentElement->GetText());
+ printf("\nlastBuildDate (current) : %s\n", lastBuildDateCurrent);
+
+
+ char photoUrl[256] = {0};
+ char photoPath[32] = {0};
+ int photoNo = 1;
+ XMLElement* itemElement = docCurrent.FirstChildElement("rss")->FirstChildElement("channel")->FirstChildElement("item");
+ if(NULL == itemElement)
+ {
+ fsusb30s = 1; // HSD2
+ error("No \"enclosure\" element in current RSS.\n");
+ }
+ strcpy(photoUrl, itemElement->FirstChildElement("enclosure")->Attribute("url"));
+ sprintf(photoPath, "/usb/DCIM/%08d.jpg", photoNo);
+ GetFile(photoPath, photoUrl);
+ ++photoNo;
+
+ while( (itemElement = itemElement->NextSiblingElement( "item" ) ) != NULL )
+ {
+ strcpy(photoUrl, itemElement->FirstChildElement("enclosure")->Attribute("url"));
+ sprintf(photoPath, "/usb/DCIM/%08d.jpg", photoNo);
+ GetFile(photoPath, photoUrl);
+ ++photoNo;
+ }
+
+ // Wait for the completion of writing to USB Mass Storage Device.
+ wait(1);
+
+ // FSUSB30 switches to HSD2 (External Device)
+ printf("\nUSB host was switched to HSD2(External Device).\n");
+ fsusb30s = 1; // HSD2
+
+ // blink LED
+ led1.startBlink();
+ ethGreen.startBlink();
+
+ while(true){}
+}
+
+int GetFile(const char *path, const char *url)
+{
+ led2.startBlink();
+ ethYellow.startBlink();
+ printf("\nGetting %s\n", url);
+
+ timer.stop();
+ timer.reset();
+ timer.start();
+
+ HTTPFile file(path);
+ HTTPResult retGet = http.get(url, &file);
+ if (retGet != HTTP_OK)
+ {
+ fsusb30s = 1; // HSD2
+ error("Error in http.get in GetFile(): %d\n", retGet);
+ }
+ file.clear();
+
+ timer.stop();
+ printf("timer.read_ms(): %d\n", timer.read_ms());
+
+ led2.finishBlink();
+ ethYellow.finishBlink();
+ return (0);
+}
+
+int addNewLine(const char* dstPath, const char* srcPath)
+{
+ FILE* fpSrc = fopen(srcPath, "r");
+ if (fpSrc == NULL)
+ {
+ return -1;
+ }
+
+ FILE* fpDst = fopen(dstPath, "w");
+ if (fpDst == NULL)
+ {
+ return -1;
+ }
+
+ int src;
+ int previous = '\0';
+ while( (src = fgetc(fpSrc)) != EOF )
+ {
+ if(previous == '>' && src == '<')
+ {
+ fputc('\n', fpDst);
+ }
+ fputc(src, fpDst);
+ previous = src;
+ }
+
+ fclose(fpDst);
+ fclose(fpSrc);
+
+ return 0;
+}
+
+int summarizeRss(const char* dstPath, const char* srcPath)
+{
+ FILE* fpSrc = fopen(srcPath, "r");
+ if (fpSrc == NULL)
+ {
+ return -1;
+ }
+
+ FILE* fpDst = fopen(dstPath, "w");
+ if (fpDst == NULL)
+ {
+ return -1;
+ }
+
+ char* ptn[] =
+ {
+ "<?xml",
+ "<rss",
+ "<channel",
+ "<lastBuildDate",
+ "<item",
+ "<enclosure",
+ "</item",
+ "</channel",
+ "</rss"
+ };
+ int ptnSize = sizeof(ptn) / sizeof(char*);
+
+ char buff[1024] = {0};
+ while( fgets(buff, 1024, fpSrc) != NULL )
+ {
+ for(int i = 0; i < ptnSize; ++i)
+ {
+ if( strncmp(buff, ptn[i], strlen(ptn[i])) == 0 )
+ {
+ fputs(buff, fpDst);
+ break;
+ }
+ }
+ }
+
+ fclose(fpDst);
+ fclose(fpSrc);
+
+ return 0;
+}
Satoshi Togawa