diff options
| author | Comment <tim@gray.(none)> | 2014-03-11 09:47:04 +0000 |
|---|---|---|
| committer | Comment <tim@gray.(none)> | 2014-03-11 09:47:04 +0000 |
| commit | ac1e8968254cf7810e84c0d90c80c94bc9dcd827 (patch) | |
| tree | 8cd3c833c4e960290233667f66cf4f3d24d46151 /json-instagram/src/exampleApp.h | |
| parent | 2a6b5328dec0ef2200bdbb94b16e8531c7c071b2 (diff) | |
instagram loader
Diffstat (limited to 'json-instagram/src/exampleApp.h')
| -rw-r--r-- | json-instagram/src/exampleApp.h | 118 |
1 files changed, 116 insertions, 2 deletions
diff --git a/json-instagram/src/exampleApp.h b/json-instagram/src/exampleApp.h index 1dcb032..021e241 100644 --- a/json-instagram/src/exampleApp.h +++ b/json-instagram/src/exampleApp.h @@ -4,12 +4,126 @@ #include "ofMain.h" #include "ofxJSONElement.h" +long ofToLong(const string& intString); + +class instagramLoader : public ofThread{ + + public: + + float interval; //time between refreshes in seconds + + int count; // threaded fucntions that share data need to use lock (mutex) + // and unlock in order to write to that data + // otherwise it's possible to get crashes. + // + // also no opengl specific stuff will work in a thread... + // threads can't create textures, or draw stuff on the screen + // since opengl is single thread safe + + //-------------------------- + std::string url; + ofxJSONElement response; + std::map<std::string,ofImage> images; + deque<std::string> to_update; + + instagramLoader(){ + count = 0; + url = "https://api.instagram.com/v1/tags/tycleeson/media/recent?client_id=c1d74d701fdf4ddd9f8d30ee9e8f944b"; + } + + void set_interval(float _interval){ + interval=_interval; + } + + void start(){ + startThread(true, false); // blocking, verbose + } + + void stop(){ + stopThread(); + } + + //-------------------------- + void threadedFunction(){ + + cout << "Api: " << url<<endl; + + while( isThreadRunning() != 0 ){ + + cout<<"."<<std::flush; + + if (!response.open(url)) { + cout << "Failed to parse JSON\n" << endl; + } + else { //int numImages = MIN(5,response["data"].size()); + + + for(int i=0; i< response["data"].size(); i++) { + //cout << "response " <<response["data"][i]["caption"]["id"].asString()<< endl; + + if (images.find(response["data"][i]["caption"]["id"].asString())==images.end()){ + std::string url = response["data"][i]["images"]["standard_resolution"]["url"].asString(); + std::string id = response["data"][i]["caption"]["id"].asString(); + cout<<"fetching "<<id<<":"<<url<<endl; + + ofImage img; + img.setUseTexture(false); + img.loadImage(url); + if( lock() ){ + images[id]=img; + to_update.push_back(id); + unlock(); + } + } + } + } + ofSleepMillis(interval * 1000); + } + } + + //-------------------------- + void draw(){ + if( lock() ){ + if (to_update.size()){ + std::string im = to_update.front(); + + const ofPixels& pix = images[im].getPixelsRef(); + images[im].getTextureReference().allocate( + pix.getWidth() + ,pix.getHeight() + ,ofGetGlInternalFormat(pix) + ); + + images[im].setUseTexture(true); + images[im].update(); + + to_update.pop_front(); + + int drawcount=0; + for (map<string,ofImage>::iterator i=images.begin();i!=images.end();++i){ + if(i->second.isUsingTexture()){ + drawcount++; + } + } + cout<<"loaded "<<im<<" "<<ofToLong(im)%(long)(ofGetWidth()-images[im].getWidth()+1)<<","<<ofToLong(im)%(long)(ofGetHeight()-images[im].getHeight()+1)<<endl; + } + for (map<string,ofImage>::iterator i=images.begin();i!=images.end();++i){ + if(i->second.isUsingTexture()){ + i->second.draw(ofToLong(i->first)%(long)(ofGetWidth()-i->second.getWidth()+1),ofToLong(i->first)%(long)(ofGetHeight()-i->second.getHeight()+1)); + } + } + unlock(); + } + } + + +}; class exampleApp : public ofBaseApp { public: void setup(); + void update(); void draw(); + instagramLoader loader; - ofxJSONElement response; - std::vector<ofImage> images; }; |
