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を指定してからご利用下さい。
main.cpp
- Committer:
- togayan
- Date:
- 2012-08-22
- Revision:
- 0:dfd5cfea7112
- Child:
- 2:531722036c0a
File content as of revision 0:dfd5cfea7112:
#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; }