-
Notifications
You must be signed in to change notification settings - Fork 0
/
Tumblr.py
140 lines (119 loc) · 3.86 KB
/
Tumblr.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
import os
import glob
import logging
import pytumblr
import arrow
import keys
import common
import settings
from bleach import clean
from pprint import pprint
class TumblrFavs(common.Favs):
def __init__(self):
super().__init__("tumblr")
self.client = pytumblr.TumblrRestClient(
keys.tumblr.get("key"),
keys.tumblr.get("secret"),
keys.tumblr.get("oauth_token"),
keys.tumblr.get("oauth_secret"),
)
@property
def feeds(self):
logging.info("Generating OPML feeds for Tumblr")
feeds = []
offset = 0
has_more = True
while has_more:
fetched = self.client.following(offset=offset)
if "_links" in fetched and "next" in fetched["_links"] and len(fetched):
offset = (
fetched.get("_links").get("next").get("query_params").get("offset")
)
else:
has_more = False
for u in fetched.get("blogs"):
feeds.append(
{
"text": u.get("name"),
"xmlUrl": "https://cloud.petermolnar.net/rss-bridge/index.php?action=display&bridge=Tumblr&searchUsername=%s&format=Atom" % u.get("name"),
#"xmlUrl": "%srss" % u.get("url"),
"htmlUrl": u.get("url"),
}
)
return feeds
def run(self):
has_more = True
after = self.since
while has_more:
logging.info("fetching for Tumblr: after %d" % after)
fetched = self.client.likes(after=after)
if "liked_posts" not in fetched:
has_more = False
elif "_links" in fetched and "prev" in fetched["_links"] and len(fetched):
after = (
fetched.get("_links").get("prev").get("query_params").get("after")
)
after = int(after)
else:
has_more = False
for like in fetched.get("liked_posts"):
fav = TumblrFav(like)
fav.run()
class TumblrFav(common.ImgFav):
def __init__(self, data):
self.data = data
def __str__(self):
return "like-of %s from blog %s" % (self.url, self.blogname)
@property
def blogname(self):
return self.data.get("blog_name")
@property
def id(self):
return self.data.get("id")
@property
def url(self):
return self.data.get("post_url")
@property
def content(self):
return "%s" % self.data.get("caption", "")
@property
def title(self):
title = self.data.get("summary", "")
if not len(title):
title = self.data.get("slug", "")
if not len(title):
title = common.url2slug(self.url)
return clean(title.strip())
@property
def targetprefix(self):
return os.path.join(
settings.paths.get("archive"),
"favorite",
"tumblr_%s_%s" % (self.blogname, self.id),
)
@property
def published(self):
maybe = self.data.get("liked_timestamp", False)
if not maybe:
maybe = self.data.get("date", False)
if not maybe:
maybe = arrow.utcnow().timestamp
return arrow.get(maybe)
@property
def tags(self):
return self.data.get("tags", [])
@property
def author(self):
return {"name": self.blogname, "url": "http://%s.tumblr.com" % self.blogname}
@property
def images(self):
r = {}
cntr = 0
for p in self.data.get("photos", []):
f = "%s_%d%s" % (self.targetprefix, cntr, common.TMPFEXT)
r.update({f: p.get("original_size").get("url")})
cntr = cntr + 1
return r
if __name__ == "__main__":
t = TumblrFavs()
t.run()