matenia-tumblr-api 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
@@ -0,0 +1,7 @@
1
+ *.sw?
2
+ .DS_Store
3
+ coverage
4
+ rdoc
5
+ pkg
6
+ website
7
+ tumblr_example
data/History ADDED
@@ -0,0 +1,14 @@
1
+ 0.1.5 - Modified Files - Readme and lib to get writing working
2
+ -- previously hosted at http://github.com/jeffkreeftmeijer/tumblr
3
+ 0.1.3 - The gem now only supports HTTParty <= 4.3 (since newer versions break everything ;) )
4
+ 0.1.0 - Re-wrote the Post class (the read methods)
5
+ 0.0.10 - Fixed dependencies
6
+ 0.0.9 - Removed the version number from the HTTParty dependency
7
+ 0.0.8 - The example app slipped in. Removed it.
8
+ 0.0.7 - Somethig went wrong, pushing again...
9
+ 0.0.6 - Fixed a bug in Post::find_from_id (the post-id wasn't being passed to the api)
10
+ 0.0.5 - Finished README.rdoc!
11
+ 0.0.4 - Updated README.rdoc, removed the docs folder (http://rdoc.info/projects/jeffkreeftmeijer/tumblr)
12
+ 0.0.3 - Forgot to update the gemspec. Here it goes! :)
13
+ 0.0.2 - Added the docs
14
+ 0.0.1 - Initial Release
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Jeff Kreeftmeijer
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,102 @@
1
+ = Tumblr
2
+
3
+ Tumblr is a rails gem that allows you to use the Tumblr API. The idea is that you don't have to worry about HTTP requests, you just want to fetch your posts right? But there's more; you can also create, update and destroy Tumblr posts and do so as railsy as possible.
4
+
5
+ == This Version
6
+
7
+ I have updated a few bug fixes from the original gem located at http://github.com/jeffkreeftmeijer/tumblr as there were a few functions that didn't work properly, and updated the installation path for the environment file.
8
+
9
+ == Installation
10
+
11
+ To install the gem, put this in your environment file;
12
+
13
+ config.gem "tumblr-api", :lib => 'tumblr', :source => 'http://gemcutter.org'
14
+
15
+ And install the gem;
16
+
17
+ rake gems:install
18
+
19
+ == Authentication
20
+
21
+ To create, update or delete a post (or fetch private posts), you should be authenticated. The only thing you have to do is call initialize the User class by doing this:
22
+
23
+ user = Tumblr::User.new('your@email.com', 'yourpassword')
24
+
25
+ The +user+ object holds your +email+ and +password+. If also calls to the API to get the user's data. If you don't want to call to the API and just get a user object, call it like this:
26
+
27
+ user = Tumblr::User.new('your@email.com', 'yourpassword', false)
28
+
29
+ == Fetching Posts
30
+
31
+ Fetching posts is easy. The first thing you have to do is tell the Tumblr gem which blog we're talking about. So, If your blog is located on http://myblog.tumblr.com you do this:
32
+
33
+ Tumblr.blog = 'myblog'
34
+
35
+ When just fetching posts, you don't have to worry about authentication, so let's go and get your posts now, shall we?
36
+
37
+ @posts = Tumblr::Post.all
38
+
39
+ Congratulations! Now you've got all - with a maximum of 50 - of your posts!
40
+
41
+ Want the first/last post? No problem:
42
+
43
+ @posts = Tumblr::Post.first # gets the first post it can find
44
+ @posts = Tumblr::Post.last # gets the last post it can find
45
+
46
+ And when you want a specific post, you can always just do this:
47
+
48
+ @posts = Tumblr::Post.find(12345) # gets the post with ID = 12345
49
+
50
+ == Parameters
51
+
52
+ Tumblr allows you to pass some parameters to you requests. In the functions described above, the Tumblr gem automatically sets the +start+, +num+ and/or +id+ parameters. But you can add more!
53
+
54
+ @posts = Tumblr::Post.all(:type => 'photo') # gets all posts with type = 'photo'
55
+ @posts = Tumblr::Post.all(:filter => 'text') # gets all posts in plain text
56
+
57
+ Please check out http://www.tumblr.com/docs/api for Tumblr's full documentation about their API and the parameters.
58
+
59
+ == Authenticated read
60
+
61
+ To be able to fetch private posts, you have to be authenticated. Just include the User object (see Authentication above) like so:
62
+
63
+ @posts = Tumblr::Post.all(user)
64
+
65
+ == Creating posts
66
+
67
+ To create a post, you should include the authentication object. More information about the parameters you have to include to create posts can be found in the Tumblr API Docs -> http://www.tumblr.com/docs/api.
68
+
69
+ This is an example of a "regular" text post:
70
+
71
+ post = Tumblr::Post.create(user, :type => 'regular', :title => 'Tumblr', :body => 'Tumblr is a rails gem that allows you to use the Tumblr API.')
72
+
73
+ After a post is successfully created, Tumblr will return the newly created post's id.
74
+
75
+ == Updating posts
76
+
77
+ Updating posts is a lot like creating posts. The only thing you have to do is provide the id of the post you wish to edit (the parameters +type+, +private+ and +format+ are ignored and can be omitted.):
78
+
79
+ post = Tumblr::Post.create(user, :post_id => '12345', :title => 'Tumblr', :body => 'Tumblr is a super awesome rails gem that allows you to use the Tumblr API.')
80
+
81
+ After a post is successfully updated, the object post is the Tumblr post's id.
82
+
83
+ == Destroying posts
84
+
85
+ Just provide the user object and the +post_id+ of the post you'd like to destroy:
86
+
87
+ Tumblr::Post.destroy(user, :post_id => 12345)
88
+
89
+ == Docs
90
+
91
+ http://rdoc.info/projects/jeffkreeftmeijer/tumblr
92
+
93
+ == Copyright
94
+
95
+ Copyright (c) 2009 Jeff Kreeftmeijer. See LICENSE for details.
96
+
97
+ == About Me
98
+
99
+ I am a sydney based rails enthusiast who enjoys everything ruby. At the moment I would consider myself to be a rails-novice but I'm getting there. Feel free to email me regarding this gem at matenia@gmail.com
100
+
101
+ Cheers,
102
+ Matenia
@@ -0,0 +1,51 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "matenia-tumblr-api"
8
+ gem.summary = %q{Tumblr API wrapper - maintained by matenia}
9
+ gem.email = "matenia@gmail.com"
10
+ gem.homepage = "http://github.com/matenia/tumblr"
11
+ gem.authors = ["Jeff Kreeftmeijer, Matenia Rossides"]
12
+ gem.add_dependency('httparty')
13
+ gem.add_dependency('activesupport')
14
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
15
+ end
16
+
17
+ rescue LoadError
18
+ puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
19
+ end
20
+
21
+ require 'spec/rake/spectask'
22
+ Spec::Rake::SpecTask.new(:spec) do |spec|
23
+ spec.libs << 'lib' << 'spec'
24
+ spec.spec_files = FileList['spec/**/*_spec.rb']
25
+ end
26
+
27
+ Spec::Rake::SpecTask.new(:rcov) do |spec|
28
+ spec.libs << 'lib' << 'spec'
29
+ spec.pattern = 'spec/**/*_spec.rb'
30
+ spec.rcov = true
31
+ end
32
+
33
+
34
+ task :default => :spec
35
+
36
+ require 'rake/rdoctask'
37
+ Rake::RDocTask.new do |rdoc|
38
+ if File.exist?('VERSION.yml')
39
+ config = YAML.load(File.read('VERSION.yml'))
40
+ version = "#{config[:major]}.#{config[:minor]}.#{config[:patch]}"
41
+ else
42
+ version = ""
43
+ end
44
+
45
+ rdoc.rdoc_dir = 'rdoc'
46
+ rdoc.title = "tumblr #{version}"
47
+ rdoc.rdoc_files.include('README*')
48
+ rdoc.rdoc_files.include('lib/**/*.rb')
49
+ end
50
+
51
+ Jeweler::GemcutterTasks.new
@@ -0,0 +1,5 @@
1
+ ---
2
+ :minor: 1
3
+ :patch: 6
4
+ :build:
5
+ :major: 0
@@ -0,0 +1,26 @@
1
+ require 'rubygems'
2
+ gem 'httparty', "<= 4.3"
3
+ require 'httparty'
4
+ require 'tumblr/user'
5
+ require 'tumblr/request'
6
+ require 'tumblr/post'
7
+
8
+ class Tumblr
9
+ class << self
10
+ attr_reader :blog
11
+
12
+ def blog=(_blog)
13
+ @blog = (_blog =~ /\./) ? _blog : "#{_blog}.tumblr.com"
14
+ end
15
+ end
16
+
17
+ # tumblr errors
18
+ class TumblrError < StandardError; end
19
+ # tumblr 403 errors
20
+ class Forbidden < TumblrError; end
21
+ # tumblr 400 errors
22
+ class BadRequest < TumblrError; end
23
+ # tumblr 404 errors
24
+ class NotFound < TumblrError; end
25
+
26
+ end
@@ -0,0 +1,125 @@
1
+ class Tumblr
2
+ class Post
3
+
4
+ # works just like ActiveRecord's find. (:all, :first, :last or id)
5
+ def self.find(*args)
6
+ extra_options = args.last.is_a?(Hash) ? args.pop : {}
7
+
8
+ case args.first
9
+ when :all then return self.find_every(extra_options)
10
+ when :first then return self.find_initial(extra_options)
11
+ when :last then return self.find_last(extra_options)
12
+ else return self.find_from_id(args.first)
13
+ end
14
+ end
15
+
16
+ # count the posts
17
+ def self.count(options = {})
18
+
19
+ #puts balh = {:num => 1}.merge(options).to_yaml
20
+ response = Tumblr::Request.read({:num => 1}.merge(options))
21
+ if(options.empty?)
22
+ #puts response['tumblr']['posts'].to_yaml
23
+ #puts "*****"
24
+ end
25
+ response['tumblr']['posts']['total'].to_i
26
+
27
+ end
28
+
29
+ # find the first post
30
+ def self.find_initial(options)
31
+ total = self.count
32
+ options = {:start => (total - 1), :num => 1} if(options.empty?)
33
+ response = Tumblr::Request.read(options)
34
+
35
+ return response['tumblr']['posts']['post'].first unless(options == {:start => (total - 1), :num => 1})
36
+ response['tumblr']['posts']['post']
37
+ end
38
+
39
+ # find the last post
40
+ def self.find_last(options)
41
+ response = Tumblr::Request.read({:num => 1}.merge(options))
42
+ response['tumblr']['posts']['post']
43
+ end
44
+
45
+ # find all posts
46
+ def self.find_every(options)
47
+ amount = (Tumblr::Post.count(options).to_f / 50).ceil
48
+ options = {:num => 50}.merge(options)
49
+
50
+ responses = []
51
+ amount.times do |count|
52
+ responses << Tumblr::Request.read(options.merge({:start => (count.to_i * 50)}))
53
+ #puts options.merge({:start => (count.to_i * 50)}).to_yaml
54
+ end
55
+
56
+ response = {'tumblr' => {'posts' => {'post' => []}}}
57
+ responses.each do |r|
58
+ r['tumblr']['posts']['post'].each { | p | response['tumblr']['posts']['post'] << p }
59
+ end
60
+
61
+ #puts response['tumblr']['posts']['post'].length.to_yaml
62
+
63
+ return [response['tumblr']['posts']['post']] unless(response['tumblr']['posts']['post'].is_a?(Array))
64
+ response['tumblr']['posts']['post']
65
+ end
66
+
67
+ # find a post by id
68
+ def self.find_from_id(id)
69
+ response = Tumblr::Request.read(:id => id)
70
+ response['tumblr']['posts']['post']
71
+ end
72
+
73
+ # alias of find(:all)
74
+ def self.all(options = {})
75
+ self.find(:all, options)
76
+ end
77
+
78
+ # alias of find(:first)
79
+ def self.first(options = {})
80
+ self.find(:first, options)
81
+ end
82
+
83
+ # alias of find(:last)
84
+ def self.last(options = {})
85
+ self.find(:last, options)
86
+ end
87
+
88
+ # create a new post
89
+ def self.create(*args)
90
+ options = process_options(*args)
91
+ Tumblr::Request.write(options)
92
+ end
93
+
94
+ # update a post
95
+ def self.update(*args)
96
+ options = process_options(*args)
97
+ Tumblr::Request.write(options)
98
+ end
99
+
100
+ # destroy a post
101
+ def self.destroy(*args)
102
+ options = process_options(*args)
103
+ Tumblr::Request.delete(options)
104
+ end
105
+
106
+ # extracts options from the arguments, converts a user object to :email and :password params and fixes the :post_id/'post-id' issue.
107
+ def self.process_options(*args)
108
+ options = args.last.is_a?(Hash) ? args.pop : {}
109
+
110
+ if((user = args.first).is_a?(Tumblr::User))
111
+ options = options.merge(
112
+ :email => user.email,
113
+ :password => user.password
114
+ )
115
+ end
116
+
117
+ if(options[:post_id])
118
+ options['post-id'] = options[:post_id]
119
+ options[:post_id] = nil
120
+ end
121
+
122
+ return options
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,50 @@
1
+ class Tumblr
2
+ class Request
3
+
4
+ # a GET request to http://[YOURUSERNAME].tumblr.com/api/read
5
+ def self.read(options = {})
6
+ response = HTTParty.get("http://#{Tumblr::blog}/api/read", options)
7
+ return response unless raise_errors(response)
8
+ end
9
+
10
+ # a POST request to http://www.tumblr.com/api/write
11
+ def self.write(options = {})
12
+ response = HTTParty.post('http://www.tumblr.com/api/write', :body => options)
13
+ return(response) unless raise_errors(response)
14
+ end
15
+
16
+ # a POST request to http://www.tumblr.com/api/delete
17
+ def self.delete(options = {})
18
+ response = HTTParty.post('http://www.tumblr.com/api/delete', :body => options)
19
+ return(response) unless raise_errors(response)
20
+ end
21
+
22
+ # a POST request to http://www.tumblr.com/api/authenticate
23
+ def self.authenticate(email, password)
24
+ HTTParty.post('http://www.tumblr.com/api/authenticate', :body => {:email => email, :password => password})
25
+ end
26
+
27
+ # raise tumblr response errors.
28
+ def self.raise_errors(response)
29
+ if(response.is_a?(Hash))
30
+ message = "#{response[:code]}: #{response[:body]}"
31
+ code = response[:code].to_i
32
+ else
33
+ message = "#{response.code}: #{response.body}"
34
+ code = response.code.to_i
35
+ end
36
+
37
+ case code
38
+ when 403
39
+ raise(Forbidden.new, message)
40
+ when 400
41
+ raise(BadRequest.new, message)
42
+ when 404
43
+ raise(NotFound.new, message)
44
+ when 201
45
+ return false
46
+ end
47
+ end
48
+
49
+ end
50
+ end
@@ -0,0 +1,14 @@
1
+ class Tumblr
2
+ class User
3
+ attr_accessor :email, :password, :tumblr
4
+
5
+ # creates a User object and authenticates the user through the Tumblr API to get user data.
6
+ def initialize(email, password, authenticate = true)
7
+ self.email = email
8
+ self.password = password
9
+ if(authenticate)
10
+ self.tumblr = Tumblr::Request.authenticate(email,password)['tumblr']
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,82 @@
1
+ <tumblr version='1.0'>
2
+ <tumblelog name='jeffkreeftmeijer' timezone='US/Eastern' title='Jeff Kreeftmeijer'>
3
+ <feeds>
4
+ <feed id='590943' url='http://twitter.com/statuses/user_timeline/8284992.rss' import-type='regular-no-title' next-update-in-seconds='2206' title='Twitter / jkreeftmeijer'/>
5
+ </feeds>
6
+ </tumblelog>
7
+ <posts start='0' total='120'>
8
+ <post id='142005160' url='http://jeffkreeftmeijer.tumblr.com/post/142005160' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/142005160/the-post-title' type='regular' date-gmt='2009-07-15 08:50:11 GMT' date='Wed, 15 Jul 2009 04:50:11' unix-timestamp='1247647811' format='html'>
9
+ <regular-title>The post title</regular-title>
10
+ <regular-body>This is the body of the post.</regular-body>
11
+ </post>
12
+ <post id='142003723' url='http://jeffkreeftmeijer.tumblr.com/post/142003723' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/142003723/the-post-title' type='regular' date-gmt='2009-07-15 08:45:47 GMT' date='Wed, 15 Jul 2009 04:45:47' unix-timestamp='1247647547' format='html'>
13
+ <regular-title>The post title</regular-title>
14
+ <regular-body>This is the body of the post.</regular-body>
15
+ </post>
16
+ <post id='142001746' url='http://jeffkreeftmeijer.tumblr.com/post/142001746' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/142001746/the-post-title' type='regular' date-gmt='2009-07-15 08:39:21 GMT' date='Wed, 15 Jul 2009 04:39:21' unix-timestamp='1247647161' format='html'>
17
+ <regular-title>The post title</regular-title>
18
+ <regular-body>This is the body of the post.</regular-body>
19
+ </post>
20
+ <post id='141806543' url='http://jeffkreeftmeijer.tumblr.com/post/141806543' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/141806543/going-to-bed-way-too-late-again-will-work-on-the' type='regular' date-gmt='2009-07-15 01:49:16 GMT' date='Tue, 14 Jul 2009 21:49:16' unix-timestamp='1247622556' format='html' feed-item='http://twitter.com/jkreeftmeijer/statuses/2642193839' from-feed-id='590943'>
21
+ <regular-body>going to bed. Way too late again. Will work on the #tumblr #gem some more tomorrow! :)</regular-body>
22
+ </post>
23
+ <post id='141753615' url='http://jeffkreeftmeijer.tumblr.com/post/141753615' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/141753615/listening-to-the-approaching-curve-by-rise' type='regular' date-gmt='2009-07-14 23:55:36 GMT' date='Tue, 14 Jul 2009 19:55:36' unix-timestamp='1247615736' format='html' feed-item='http://twitter.com/jkreeftmeijer/statuses/2640603176' from-feed-id='590943'>
24
+ <regular-body>listening to &amp;#8220;The Approaching Curve by Rise Against - &amp;#8221; ♫ &lt;a href="http://blip.fm/~9xm4q">http://blip.fm/~9xm4q&lt;/a></regular-body>
25
+ </post>
26
+ <post id='141753620' url='http://jeffkreeftmeijer.tumblr.com/post/141753620' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/141753620/just-re-wrote-the-whole-fetch-part-of-the-tumblr' type='regular' date-gmt='2009-07-14 23:55:36 GMT' date='Tue, 14 Jul 2009 19:55:36' unix-timestamp='1247615736' format='html' feed-item='http://twitter.com/jkreeftmeijer/statuses/2640274520' from-feed-id='590943'>
27
+ <regular-body>just re-wrote the whole fetch-part of the #tumblr #gem. (has tests now ;) ) Doing some more work on the rest (create, update, destroy) now.</regular-body>
28
+ </post>
29
+ <post id='141753608' url='http://jeffkreeftmeijer.tumblr.com/post/141753608' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/141753608/listening-to-reuben-fall-of-the-bastille' type='regular' date-gmt='2009-07-14 23:55:36 GMT' date='Tue, 14 Jul 2009 19:55:36' unix-timestamp='1247615736' format='html' feed-item='http://twitter.com/jkreeftmeijer/statuses/2640636903' from-feed-id='590943'>
30
+ <regular-body>listening to &amp;#8220;reuben- fall of the bastille - &amp;#8221; ♫ &lt;a href="http://blip.fm/~9xma2">http://blip.fm/~9xma2&lt;/a></regular-body>
31
+ </post>
32
+ <post id='141753612' url='http://jeffkreeftmeijer.tumblr.com/post/141753612' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/141753612/listening-to-a-fault-line-a-fault-of-mine' type='regular' date-gmt='2009-07-14 23:55:36 GMT' date='Tue, 14 Jul 2009 19:55:36' unix-timestamp='1247615736' format='html' feed-item='http://twitter.com/jkreeftmeijer/statuses/2640627661' from-feed-id='590943'>
33
+ <regular-body>listening to &amp;#8220;A Fault Line, A Fault Of Mine - UNDEROATH&amp;#8221; ♫ &lt;a href="http://blip.fm/~9xm8m">http://blip.fm/~9xm8m&lt;/a></regular-body>
34
+ </post>
35
+ <post id='141753603' url='http://jeffkreeftmeijer.tumblr.com/post/141753603' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/141753603/simplified-the-error-handling-in-the-tumblr-gem' type='regular' date-gmt='2009-07-14 23:55:35 GMT' date='Tue, 14 Jul 2009 19:55:35' unix-timestamp='1247615735' format='html' feed-item='http://twitter.com/jkreeftmeijer/statuses/2640670460' from-feed-id='590943'>
36
+ <regular-body>simplified the error handling in the #tumblr #gem. It was just weird&amp;#8230;</regular-body>
37
+ </post>
38
+ <post id='141657577' url='http://jeffkreeftmeijer.tumblr.com/post/141657577' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/141657577/son-have-you-seen-the-world-what-would-you-say' type='regular' date-gmt='2009-07-14 20:43:37 GMT' date='Tue, 14 Jul 2009 16:43:37' unix-timestamp='1247604217' format='html' feed-item='http://twitter.com/jkreeftmeijer/statuses/2637587336' from-feed-id='590943'>
39
+ <regular-body>Son, have you seen the world? What would you say if I said that you could? ♫ &lt;a href="http://blip.fm/~9x8cy">http://blip.fm/~9x8cy&lt;/a></regular-body>
40
+ </post>
41
+ <post id='141657573' url='http://jeffkreeftmeijer.tumblr.com/post/141657573' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/141657573/listening-to-re-education-through-labor-rise' type='regular' date-gmt='2009-07-14 20:43:36 GMT' date='Tue, 14 Jul 2009 16:43:36' unix-timestamp='1247604216' format='html' feed-item='http://twitter.com/jkreeftmeijer/statuses/2638490362' from-feed-id='590943'>
42
+ <regular-body>listening to &amp;#8220;Re-Education (Through Labor) - Rise Against&amp;#8221; ♫ &lt;a href="http://blip.fm/~9xcjv">http://blip.fm/~9xcjv&lt;/a></regular-body>
43
+ </post>
44
+ <post id='141657574' url='http://jeffkreeftmeijer.tumblr.com/post/141657574' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/141657574/listening-to-in-flames-the-chosen-pessimist' type='regular' date-gmt='2009-07-14 20:43:36 GMT' date='Tue, 14 Jul 2009 16:43:36' unix-timestamp='1247604216' format='html' feed-item='http://twitter.com/jkreeftmeijer/statuses/2638019433' from-feed-id='590943'>
45
+ <regular-body>listening to &amp;#8220;In Flames-The Chosen Pessimist - &amp;#8221; ♫ &lt;a href="http://blip.fm/~9xad5">http://blip.fm/~9xad5&lt;/a></regular-body>
46
+ </post>
47
+ <post id='141609907' url='http://jeffkreeftmeijer.tumblr.com/post/141609907' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/141609907/listening-to-reuben-our-song' type='regular' date-gmt='2009-07-14 19:09:35 GMT' date='Tue, 14 Jul 2009 15:09:35' unix-timestamp='1247598575' format='html' feed-item='http://twitter.com/jkreeftmeijer/statuses/2636190290' from-feed-id='590943'>
48
+ <regular-body>listening to &amp;#8220;reuben- our song - &amp;#8221; ♫ &lt;a href="http://blip.fm/~9x1aa">http://blip.fm/~9x1aa&lt;/a></regular-body>
49
+ </post>
50
+ <post id='141609913' url='http://jeffkreeftmeijer.tumblr.com/post/141609913' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/141609913/working-on-the-tumblr-ror-gem' type='regular' date-gmt='2009-07-14 19:09:35 GMT' date='Tue, 14 Jul 2009 15:09:35' unix-timestamp='1247598575' format='html' feed-item='http://twitter.com/jkreeftmeijer/statuses/2635407571' from-feed-id='590943'>
51
+ <regular-body>working on the #tumblr #ror #gem (&lt;a href="http://bit.ly/19G5uu">http://bit.ly/19G5uu&lt;/a>) To make possible to use it without rails :)</regular-body>
52
+ </post>
53
+ <post id='141609900' url='http://jeffkreeftmeijer.tumblr.com/post/141609900' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/141609900/listening-to-this-could-be-anywhere-in-the-world' type='regular' date-gmt='2009-07-14 19:09:34 GMT' date='Tue, 14 Jul 2009 15:09:34' unix-timestamp='1247598574' format='html' feed-item='http://twitter.com/jkreeftmeijer/statuses/2636824003' from-feed-id='590943'>
54
+ <regular-body>listening to &amp;#8220;This could be anywhere in the world - Alexisonfire&amp;#8221; ♫ &lt;a href="http://blip.fm/~9x4hn">http://blip.fm/~9x4hn&lt;/a></regular-body>
55
+ </post>
56
+ <post id='141569188' url='http://jeffkreeftmeijer.tumblr.com/post/141569188' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/141569188/wallpaper-o' type='photo' date-gmt='2009-07-14 17:48:12 GMT' date='Tue, 14 Jul 2009 13:48:12' unix-timestamp='1247593692' format='html'>
57
+ <photo-caption>Wallpaper :o</photo-caption>
58
+ <photo-url max-width='500'>http://16.media.tumblr.com/mAbQXA6nQpwgohimAuaIaeYQo1_500.jpg</photo-url>
59
+ <photo-url max-width='400'>http://7.media.tumblr.com/mAbQXA6nQpwgohimAuaIaeYQo1_400.jpg</photo-url>
60
+ <photo-url max-width='250'>http://11.media.tumblr.com/mAbQXA6nQpwgohimAuaIaeYQo1_250.jpg</photo-url>
61
+ <photo-url max-width='100'>http://18.media.tumblr.com/mAbQXA6nQpwgohimAuaIaeYQo1_100.jpg</photo-url>
62
+ <photo-url max-width='75'>http://22.media.tumblr.com/mAbQXA6nQpwgohimAuaIaeYQo1_75sq.jpg</photo-url>
63
+ </post>
64
+ <post id='141551858' url='http://jeffkreeftmeijer.tumblr.com/post/141551858' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/141551858/nom' type='photo' date-gmt='2009-07-14 17:14:52 GMT' date='Tue, 14 Jul 2009 13:14:52' unix-timestamp='1247591692' format='html'>
65
+ <photo-caption>Nom!</photo-caption>
66
+ <photo-url max-width='500'>http://15.media.tumblr.com/mAbQXA6nQpwfhmcjLsQYcYSIo1_500.jpg</photo-url>
67
+ <photo-url max-width='400'>http://6.media.tumblr.com/mAbQXA6nQpwfhmcjLsQYcYSIo1_400.jpg</photo-url>
68
+ <photo-url max-width='250'>http://12.media.tumblr.com/mAbQXA6nQpwfhmcjLsQYcYSIo1_250.jpg</photo-url>
69
+ <photo-url max-width='100'>http://16.media.tumblr.com/mAbQXA6nQpwfhmcjLsQYcYSIo1_100.jpg</photo-url>
70
+ <photo-url max-width='75'>http://22.media.tumblr.com/mAbQXA6nQpwfhmcjLsQYcYSIo1_75sq.jpg</photo-url>
71
+ </post>
72
+ <post id='141059423' url='http://jeffkreeftmeijer.tumblr.com/post/141059423' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/141059423/watching-episode-16-of-delekkersteshow-making' type='regular' date-gmt='2009-07-13 23:19:38 GMT' date='Mon, 13 Jul 2009 19:19:38' unix-timestamp='1247527178' format='html' feed-item='http://twitter.com/jkreeftmeijer/statuses/2621029518' from-feed-id='508097'>
73
+ <regular-body>watching episode 16 of @&lt;a href="http://twitter.com/delekkersteshow">delekkersteshow&lt;/a> -&amp;gt; making a Tequila Sunrise :)</regular-body>
74
+ </post>
75
+ <post id='141059422' url='http://jeffkreeftmeijer.tumblr.com/post/141059422' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/141059422/imac-has-begun-running-slow-time-for-its-monthly' type='regular' date-gmt='2009-07-13 23:19:38 GMT' date='Mon, 13 Jul 2009 19:19:38' unix-timestamp='1247527178' format='html' feed-item='http://twitter.com/jkreeftmeijer/statuses/2622179198' from-feed-id='508097'>
76
+ <regular-body>iMac has begun running slow. Time for it&amp;#8217;s monthly reboot then :)</regular-body>
77
+ </post>
78
+ <post id='141004856' url='http://jeffkreeftmeijer.tumblr.com/post/141004856' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/141004856/wha-http-yfrog-com-5e1frtj' type='regular' date-gmt='2009-07-13 21:25:03 GMT' date='Mon, 13 Jul 2009 17:25:03' unix-timestamp='1247520303' format='html' feed-item='http://twitter.com/jkreeftmeijer/statuses/2619376276' from-feed-id='508097'>
79
+ <regular-body>Wha? &lt;a href="http://yfrog.com/5e1frtj">http://yfrog.com/5e1frtj&lt;/a></regular-body>
80
+ </post>
81
+ </posts>
82
+ </tumblr>