17
17
18
18
from Database import Database
19
19
20
+ import Api
21
+
20
22
class Media (Database ):
21
23
class Downloader (threading .Thread ):
22
24
def __init__ (self , queue , report ):
@@ -83,7 +85,7 @@ def download(self):
83
85
return self .success
84
86
85
87
def stopDownloads (self ):
86
- c .log ('debug' , 'Stopping download threads' )
88
+ c .log ('debug' , 'Stopping download threads (%i)' % len ( self . threads ) )
87
89
for i in self .threads :
88
90
i .stop ()
89
91
@@ -125,14 +127,15 @@ def loadAttachments(self, data):
125
127
if 'attachment' in data :
126
128
attachments .append (data ['attachment' ])
127
129
if 'copy_history' in data :
128
- self .loadAttachments (data ['copy_history' ])
130
+ for subdata in data ['copy_history' ]:
131
+ self .loadAttachments (subdata )
129
132
for attach in attachments :
130
133
c .log ('debug' , 'Processing %s' % attach ['type' ])
131
134
funcname = 'process' + attach ['type' ].title ()
132
135
if funcname in dir (self ):
133
136
getattr (self , funcname )(attach [attach ['type' ]])
134
137
else :
135
- c .log ('error' , ' unable to find attachment processing function "Media.%s"' % funcname )
138
+ c .log ('error' , ' media processing function "Media.%s" is not implemented ' % funcname )
136
139
c .log ('debug' , str (attach ))
137
140
138
141
def addDownload (self , url , path = None ):
@@ -165,15 +168,59 @@ def preprocess(self, data, data_type):
165
168
path = os .path .join (data_type , str (mydata ['id' ]))
166
169
167
170
if path in self .data :
168
- return None
171
+ return path
172
+
169
173
self .data [path ] = mydata
170
174
171
175
return path
172
176
177
+ def requestComments (self , data , data_type , owner_id ):
178
+ if str (owner_id ) != Api .getUserId ():
179
+ return
180
+
181
+ c .log ('debug' , 'Requesting comments for %s %i' % (data_type , data ['id' ]))
182
+
183
+ if data_type == 'photo' :
184
+ api_method = 'photos.getComments'
185
+ api_id_name = 'photo_id'
186
+ elif data_type == 'video' :
187
+ api_method = 'video.getComments'
188
+ api_id_name = 'video_id'
189
+ elif data_type == 'wall' :
190
+ api_method = 'wall.getComments'
191
+ api_id_name = 'post_id'
192
+ else :
193
+ c .log ('warning' , 'Unable to request comments for %s %i - not implemented' % (data_type , data ['id' ]))
194
+ return
195
+
196
+ if 'comments' not in data :
197
+ data ['comments' ] = {}
198
+ if not isinstance (data ['comments' ], dict ):
199
+ data ['comments' ] = {}
200
+
201
+ req_data = {'owner_id' : int (owner_id ), api_id_name : int (data ['id' ]), 'count' : 100 , 'offset' : 0 }
202
+
203
+ while True :
204
+ subdata = Api .request (api_method , req_data )
205
+ if subdata == None :
206
+ return
207
+ count = subdata ['count' ]
208
+ subdata = subdata ['items' ]
209
+ for d in subdata :
210
+ data ['comments' ][str (d ['date' ])] = d
211
+ self .loadAttachments (data ['comments' ][str (d ['date' ])])
212
+
213
+ req_data ['offset' ] += 100
214
+ if req_data ['offset' ] >= count :
215
+ break
216
+
173
217
def processPhoto (self , data ):
218
+ c .log ('debug' , 'Processing photo media' )
174
219
path = self .preprocess (data , 'photo' )
175
- if path != None :
220
+ if 'localpath' not in self . data [ path ] :
176
221
url = None
222
+ if 'url' in self .data [path ]:
223
+ url = self .data [path ]['url' ]
177
224
size = 0
178
225
for key in self .data [path ].keys ():
179
226
if key .startswith ('photo_' ):
@@ -188,46 +235,53 @@ def processPhoto(self, data):
188
235
189
236
self .data [path ]['url' ] = url
190
237
self .data [path ]['localpath' ] = self .addDownload (self .data [path ]['url' ])
238
+ self .requestComments (self .data [path ], 'photo' , self .data [path ]['owner_id' ])
191
239
192
240
def processDoc (self , data ):
241
+ c .log ('debug' , 'Processing doc media' )
193
242
path = self .preprocess (data , 'doc' )
194
- if path != None :
243
+ if 'localpath' not in self . data [ path ] :
195
244
self .data [path ]['localpath' ] = self .addDownload (self .data [path ]['url' ])
196
245
197
246
def processAudio (self , data ):
247
+ c .log ('debug' , 'Processing audio media' )
198
248
path = self .preprocess (data , 'audio' )
199
- if path != None :
249
+ if 'localpath' not in self . data [ path ] :
200
250
self .data [path ]['localpath' ] = self .addDownload (self .data [path ]['url' ])
201
251
202
252
def processWall (self , data ):
203
- c .log ('debug' , 'Processing wall attachments' )
253
+ c .log ('debug' , 'Processing wall media' )
254
+ data ['comments' ].pop ('count' , None )
255
+ data ['comments' ].pop ('can_post' , None )
256
+ self .requestComments (data , 'wall' , data ['from_id' ])
204
257
self .loadAttachments (data )
205
258
206
259
def processGeo (self , data ):
207
260
self .preprocess (data , 'geo' )
208
- c .log ('debug' , 'Skipping geo attachment - no data to download' )
261
+ c .log ('debug' , 'Skipping geo media - no data to download' )
209
262
210
263
def processVideo (self , data ):
211
- self .preprocess (data , 'video' )
212
- c .log ('debug' , 'Skipping video attachment - size of the file is too big' )
264
+ path = self .preprocess (data , 'video' )
265
+ self .requestComments (self .data [path ], 'video' , self .data [path ]['owner_id' ])
266
+ c .log ('debug' , 'Skipping video media - size of the file is too big' )
213
267
214
268
def processSticker (self , data ):
215
269
self .preprocess (data , 'sticker' )
216
- c .log ('debug' , 'Skipping sticker attachment - idiotizm' )
270
+ c .log ('debug' , 'Skipping sticker media - idiotizm' )
217
271
218
272
def processLink (self , data ):
219
- c .log ('debug' , 'Skipping link attachment - no data to download' )
273
+ c .log ('debug' , 'Skipping link media - no data to download' )
220
274
221
275
def processPoll (self , data ):
222
276
self .preprocess (data , 'poll' )
223
- c .log ('debug' , 'Skipping poll attachment - no data to download' )
277
+ c .log ('debug' , 'Skipping poll media - no data to download' )
224
278
225
279
def processNote (self , data ):
226
280
self .preprocess (data , 'note' )
227
- c .log ('debug' , 'Skipping note attachment - no data to download' )
281
+ c .log ('debug' , 'Skipping note media - no data to download' )
228
282
229
283
def processPresent (self , data ):
230
284
self .preprocess (data , 'present' )
231
- c .log ('debug' , 'Skipping present attachment - stupid present' )
285
+ c .log ('debug' , 'Skipping present media - stupid present' )
232
286
233
287
S = Media ()
0 commit comments