├── birdhouse.lxf ├── app ├── audio │ ├── chirp.mp3 │ └── shutter.mp3 ├── img │ ├── avatar.png │ ├── icon128.png │ ├── icon16.png │ ├── icon48.png │ ├── timer.png │ ├── takephoto.png │ ├── glyphicons-halflings.png │ └── glyphicons-halflings-white.png ├── manifest.json ├── js │ ├── canvasimage.js │ ├── camera.js │ ├── twitter.js │ ├── options.js │ ├── app.js │ └── lib │ │ ├── oauthsimple.js │ │ └── bootstrap.min.js ├── _locales │ └── en │ │ └── messages.json ├── index.html ├── css │ └── app.css └── options.html ├── test ├── tests.js ├── main.html ├── qunit-1.11.0.css └── qunit-1.11.0.js ├── images ├── legobirdhouse.jpg ├── oauthsettings.png ├── shuttertimer.png ├── tweetlocation.png ├── twisitorapp.png ├── launchtwisitor.png └── prepopulatedtweets.png ├── .gitignore ├── .travis.yml ├── CHANGELOG.md ├── package.json ├── Gruntfile.js ├── CONTRIBUTING.md ├── README.md ├── README-BIRDHOUSE.md └── LICENSE /birdhouse.lxf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twitter-archive/twisitor/HEAD/birdhouse.lxf -------------------------------------------------------------------------------- /app/audio/chirp.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twitter-archive/twisitor/HEAD/app/audio/chirp.mp3 -------------------------------------------------------------------------------- /app/img/avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twitter-archive/twisitor/HEAD/app/img/avatar.png -------------------------------------------------------------------------------- /app/img/icon128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twitter-archive/twisitor/HEAD/app/img/icon128.png -------------------------------------------------------------------------------- /app/img/icon16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twitter-archive/twisitor/HEAD/app/img/icon16.png -------------------------------------------------------------------------------- /app/img/icon48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twitter-archive/twisitor/HEAD/app/img/icon48.png -------------------------------------------------------------------------------- /app/img/timer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twitter-archive/twisitor/HEAD/app/img/timer.png -------------------------------------------------------------------------------- /test/tests.js: -------------------------------------------------------------------------------- 1 | test( "TODO write tests", function() { 2 | ok( 1 == "1", "Passed!" ); 3 | }); 4 | -------------------------------------------------------------------------------- /app/audio/shutter.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twitter-archive/twisitor/HEAD/app/audio/shutter.mp3 -------------------------------------------------------------------------------- /app/img/takephoto.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twitter-archive/twisitor/HEAD/app/img/takephoto.png -------------------------------------------------------------------------------- /images/legobirdhouse.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twitter-archive/twisitor/HEAD/images/legobirdhouse.jpg -------------------------------------------------------------------------------- /images/oauthsettings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twitter-archive/twisitor/HEAD/images/oauthsettings.png -------------------------------------------------------------------------------- /images/shuttertimer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twitter-archive/twisitor/HEAD/images/shuttertimer.png -------------------------------------------------------------------------------- /images/tweetlocation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twitter-archive/twisitor/HEAD/images/tweetlocation.png -------------------------------------------------------------------------------- /images/twisitorapp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twitter-archive/twisitor/HEAD/images/twisitorapp.png -------------------------------------------------------------------------------- /images/launchtwisitor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twitter-archive/twisitor/HEAD/images/launchtwisitor.png -------------------------------------------------------------------------------- /images/prepopulatedtweets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twitter-archive/twisitor/HEAD/images/prepopulatedtweets.png -------------------------------------------------------------------------------- /app/img/glyphicons-halflings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twitter-archive/twisitor/HEAD/app/img/glyphicons-halflings.png -------------------------------------------------------------------------------- /app/img/glyphicons-halflings-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twitter-archive/twisitor/HEAD/app/img/glyphicons-halflings-white.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.log 2 | *.pem 3 | *.crx 4 | *.swp 5 | *.swo 6 | *.swn 7 | .*.sw[a-z] 8 | *~ 9 | .*~ 10 | *# 11 | .*# 12 | node_modules 13 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | 3 | node_js: 4 | - "0.10" 5 | - "0.8" 6 | 7 | before_script: 8 | - npm install -g grunt-cli 9 | 10 | script: grunt --verbose 11 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## v1.1.0 (07/12/2013) 2 | 3 | * Added Lego Birdhouse design by @dgr 4 | 5 | ## v1.0.1 (04/08/2013) 6 | 7 | ###bug fixes and tweaks 8 | * fix twitter.js 'use strict' issue 9 | 10 | ## v1.0.0 (04/05/2013) 11 | 12 | * Initial public release. 13 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "twisitor", 3 | "version": "1.1.0", 4 | "devDependencies": { 5 | "grunt": "~0.4.1", 6 | "grunt-crx": "0.2.0", 7 | "grunt-contrib-jasmine": "~0.4.0", 8 | "phantomjs": "1.8.1-1", 9 | "grunt-contrib-qunit": "~0.2.0", 10 | "grunt-contrib-jshint": "~0.3.0" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /test/main.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | QUnit 6 | 7 | 8 | 9 |
10 |
11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Twisitor", 3 | "manifest_version": 2, 4 | "version": "1.0.1", 5 | "description": "Your own Twitter Photobooth", 6 | "default_locale": "en", 7 | 8 | "icons": { 9 | "16": "img/icon16.png", 10 | "48": "img/icon48.png", 11 | "128": "img/icon128.png" 12 | }, 13 | 14 | "app": { 15 | "launch": { 16 | "local_path": "index.html" 17 | } 18 | }, 19 | 20 | "permissions": [ 21 | "http://twitter.com/*", 22 | "https://twitter.com/*", 23 | "http://*.twitter.com/*", 24 | "https://*.twitter.com/*", 25 | "unlimitedStorage" 26 | ], 27 | 28 | "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'; connect-src https://api.twitter.com http://api.twitter.com", 29 | 30 | "options_page": "options.html" 31 | } 32 | -------------------------------------------------------------------------------- /app/js/canvasimage.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | function CanvasImage(canvas, width, height) { 4 | this.canvas = canvas[0]; 5 | this.context = canvas[0].getContext('2d'); 6 | this.width = this.canvas.width = width; 7 | this.height = this.canvas.height = height; 8 | canvas.width(width); 9 | canvas.height(height); 10 | } 11 | 12 | $.extend(CanvasImage.prototype, { 13 | getData: function() { 14 | return this.context.getImageData(0, 0, this.width, this.height); 15 | }, 16 | 17 | setData: function(data) { 18 | this.context.putImageData(data, 0, 0); 19 | }, 20 | 21 | newData: function() { 22 | return this.context.createImageData(0, 0); 23 | }, 24 | 25 | fillText: function(text, x, y) { 26 | this.context.fillText(text, x, y); 27 | }, 28 | 29 | setImage: function(img) { 30 | this.context.drawImage(img, 0, 0, this.width, this.height); 31 | } 32 | }); 33 | -------------------------------------------------------------------------------- /app/js/camera.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | function Camera() { 4 | this.stream = null; 5 | this.streamURL = null; 6 | this.video = null; 7 | } 8 | 9 | $.extend(Camera.prototype, { 10 | getCamera: function (onSuccess, onError) { 11 | if (navigator.getUserMedia) { 12 | navigator.getUserMedia('video', onSuccess, onError); 13 | } else if (navigator.webkitGetUserMedia) { 14 | navigator.webkitGetUserMedia({video: true}, onSuccess, onError); 15 | } 16 | }, 17 | 18 | startCapture: function(onSuccess, onError) { 19 | this.onSuccess = onSuccess || $.noop; 20 | this.onError = onError || $.noop; 21 | this.getCamera(this.gotStream.bind(this), this.onError.bind(this)); 22 | }, 23 | 24 | gotStream: function(stream) { 25 | this.stream = stream; 26 | this.video = $('