reddit-image-wall-getter/reddit_imgs/system/downloader/modules/imgur_com.py

111 lines
4.4 KiB
Python

#!/usr/bin/env python3
# -*- encoding: utf-8 -*-
import os
import re
import json
import shutil
import filetype
from ..downloadedData import DownloadedData
from ... import simpleDownloader
def works_on(domain):
return domain in ['i.imgur.com', 'imgur.com', 'm.imgur.com', 'www.imgur.com']
class ImgurCom(object):
def recognizes(self, link):
return True
def download(self, link):
dd = DownloadedData()
simpleDownloader.cleanCookies()
bts = b''
if '/a/' not in link and '.gifv' not in link and '.webm' not in link:
bts = simpleDownloader.getUrlBytes(link)
if bts is not None:
ext = filetype.guess_extension(bts)
if ext is None:
if '.gifv' in link or '.webm' in link:
bts=None
print(' '*50,end='')
print('\r',end='')
print(' `--> It wasn\'t a single image...',end='')
print('\r',end='')
match = re.match(
"(https?)://(www\.)?(i\.|m\.|www\.)?imgur\.com/(?:(a|gallery|r)/)?(\w*)/?(\w*)(#[0-9]+)?(\.\w*)?",
link
)
tp = match.group(4)
ky = None
if tp != 'r':
ky = match.group(5)
else:
ky = match.group(6)
if not ky:
ky = match.group(5)
link2 = 'https://imgur.com/a/'+str(ky)+'/all'
if tp is None or tp=='' or tp=='r':
link2=link2.replace('/a/','/')[:-4]
print(' '*50,end='')
print('\r',end='')
if link2.endswith('/all') or bts is None:
print(' `--> Fetching album image list...',end='')
bts = simpleDownloader.getUrlBytes(link2)
else:
print(' `--> Album image list already fetched...',end='')
print('\r',end='')
if bts is None:
print(' '*50,end='')
print('\r',end='')
print(' `--> Gallery not found')
return DownloadedData()
html = bts.decode('utf-8')
albnfo = json.loads(list(filter(lambda f: f.startswith('image'), map(str.strip, list(filter(lambda f: f.startswith("('gallery', {"), html.split('widgetFactory.mergeConfig')))[0].strip().splitlines())))[0][6:-1].strip()[1:].strip())
imgs = [albnfo]
if 'album_images' in albnfo:
imgs = albnfo['album_images']['images']
intermediarySaves = len(imgs)>=10
if intermediarySaves:
if not os.path.isdir('tmp'):
os.makedirs('tmp')
if os.path.isfile('tmp/link.url'):
with open('tmp/link.url') as f:
svdlnk = f.read()
if svdlnk == link:
dd.loadfrom('tmp')
else:
shutil.rmtree('tmp')
os.makedirs('tmp')
with open('tmp/link.url', 'w') as f:
f.write(link)
for seq, img in enumerate(imgs):
print(' '*50,end='')
print('\r',end='')
print(' `--> Album image #%03d of %03d'%(seq+1,len(imgs)),end='')
print('\r',end='')
if img['ext'] == '.gifv':
img['ext'] = '.mp4'
durl = 'http://i.imgur.com/'+img['hash']+img['ext']
if durl in dd.storedLinks():
continue
imb = simpleDownloader.getUrlBytes(durl)
if imb is None:
print()
print('Album part failed')
print()
simpleDownloader.cleanCookies()
return None
dd.put(durl, imb, img['ext'][1:])
if intermediarySaves and seq%10 == 0:
dd.into('tmp')
print('\r',end='')
if os.path.isdir('tmp'):
shutil.rmtree('tmp')
else:
dd.put(link, bts, ext)
simpleDownloader.cleanCookies()
return dd
def get_class():
return ImgurCom