summaryrefslogtreecommitdiff
path: root/json-instagram
diff options
context:
space:
mode:
authorComment <tim@gray.(none)>2014-03-11 09:47:04 +0000
committerComment <tim@gray.(none)>2014-03-11 09:47:04 +0000
commitac1e8968254cf7810e84c0d90c80c94bc9dcd827 (patch)
tree8cd3c833c4e960290233667f66cf4f3d24d46151 /json-instagram
parent2a6b5328dec0ef2200bdbb94b16e8531c7c071b2 (diff)
instagram loader
Diffstat (limited to 'json-instagram')
-rw-r--r--json-instagram/config.make4
-rw-r--r--json-instagram/src/exampleApp.cpp47
-rw-r--r--json-instagram/src/exampleApp.h118
3 files changed, 141 insertions, 28 deletions
diff --git a/json-instagram/config.make b/json-instagram/config.make
index 93c489d..d5a6b93 100644
--- a/json-instagram/config.make
+++ b/json-instagram/config.make
@@ -78,6 +78,8 @@
################################################################################
# PROJECT_LDFLAGS=-Wl,-rpath=./libs
+PROJECT_LDFLAGS= -ljsoncpp
+
################################################################################
# PROJECT DEFINES
# Create a space-delimited list of DEFINES. The list will be converted into
@@ -104,7 +106,7 @@
#
# Note: Leave a leading space when adding list items with the += operator
################################################################################
-# PROJECT_CFLAGS =
+ PROJECT_CFLAGS = `pkg-config --cflags jsoncpp`
################################################################################
# PROJECT OPTIMIZATION CFLAGS
diff --git a/json-instagram/src/exampleApp.cpp b/json-instagram/src/exampleApp.cpp
index 0559dce..deb4f35 100644
--- a/json-instagram/src/exampleApp.cpp
+++ b/json-instagram/src/exampleApp.cpp
@@ -14,34 +14,30 @@ could save with the tag id as the name of file, simpler
how exactly do we parse or mipmap the images
do we worry about memory - I guess not
+identify the images
+
*/
+long ofToLong(const string& intString) {
+ long x = 0;
+ istringstream cur(intString);
+ cur >> x;
+ return x;
+}
+
//------------------------------------------------------------------------------
void exampleApp::setup()
{
ofSetFrameRate(24);
-
- std::string url = "https://api.instagram.com/v1/tags/tycleeson/media/recent?client_id=c1d74d701fdf4ddd9f8d30ee9e8f944b";
-
- if (!response.open(url)) {
- cout << "Failed to parse JSON\n" << endl;
- }
- //else cout<<response.getRawString()<<endl;
-
-
- int numImages = MIN(5,response["data"].size());
- for(int i=0; i< numImages; i++) {
- 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.loadImage(url);
- images.push_back( img );
- }
-
-
+ loader.set_interval(5.00f);
+ cout << "starting" << endl;
+ loader.start();
+ cout << "started" << endl;
+}
+
+void exampleApp::update (){
+
+ ofSetWindowTitle(ofToString(ofGetFrameRate()));
}
//------------------------------------------------------------------------------
@@ -49,7 +45,8 @@ void exampleApp::draw()
{
ofBackground(0);
- for(int i=0; i<images.size(); i++) {
- images[i].draw(i*30, i*30);
- }
+ //for(int i=0; i<images.size(); i++) {
+ // images[i].draw(i*30, i*30);
+ //}
+ loader.draw();
}
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;
};