mirror of https://gitlab.com/bashrc2/epicyon
Save newswire favicons
parent
ea422f0ead
commit
64c41279b4
|
@ -1016,7 +1016,7 @@ if args.domain:
|
||||||
if args.rss:
|
if args.rss:
|
||||||
session = createSession(None)
|
session = createSession(None)
|
||||||
testRSS = getRSS(baseDir, domain, session, args.rss,
|
testRSS = getRSS(baseDir, domain, session, args.rss,
|
||||||
False, False, 1000, 1000, 1000, 1000)
|
False, False, 1000, 1000, 1000, 1000, debug)
|
||||||
pprint(testRSS)
|
pprint(testRSS)
|
||||||
sys.exit()
|
sys.exit()
|
||||||
|
|
||||||
|
|
|
@ -801,7 +801,8 @@ def runNewswireDaemon(baseDir: str, httpd,
|
||||||
httpd.maxFeedItemSizeKb,
|
httpd.maxFeedItemSizeKb,
|
||||||
httpd.maxNewswirePosts,
|
httpd.maxNewswirePosts,
|
||||||
httpd.maxCategoriesFeedItemSizeKb,
|
httpd.maxCategoriesFeedItemSizeKb,
|
||||||
httpd.systemLanguage)
|
httpd.systemLanguage,
|
||||||
|
httpd.debug)
|
||||||
|
|
||||||
if not httpd.newswire:
|
if not httpd.newswire:
|
||||||
print('Newswire feeds not updated')
|
print('Newswire feeds not updated')
|
||||||
|
|
111
newswire.py
111
newswire.py
|
@ -34,6 +34,7 @@ from utils import localActorUrl
|
||||||
from blocking import isBlockedDomain
|
from blocking import isBlockedDomain
|
||||||
from blocking import isBlockedHashtag
|
from blocking import isBlockedHashtag
|
||||||
from filters import isFiltered
|
from filters import isFiltered
|
||||||
|
from session import getImageBinaryFromUrl
|
||||||
|
|
||||||
|
|
||||||
def _removeCDATA(text: str) -> str:
|
def _removeCDATA(text: str) -> str:
|
||||||
|
@ -126,6 +127,46 @@ def limitWordLengths(text: str, maxWordLength: int) -> str:
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
def _getNewswireFaviconUrl(url: str) -> str:
|
||||||
|
"""Returns a favicon url from the given article link
|
||||||
|
"""
|
||||||
|
if '://' not in url:
|
||||||
|
return '/newswire_favicon.ico'
|
||||||
|
if url.startswith('http://'):
|
||||||
|
if not (url.endswith('.onion') or url.endswith('.i2p')):
|
||||||
|
return '/newswire_favicon.ico'
|
||||||
|
domain = url.split('://')[1]
|
||||||
|
if '/' not in domain:
|
||||||
|
return url + '/favicon.ico'
|
||||||
|
else:
|
||||||
|
domain = domain.split('/')[0]
|
||||||
|
return url.split('://')[0] + '://' + domain + '/favicon.ico'
|
||||||
|
|
||||||
|
|
||||||
|
def _downloadNewswireFeedFavicon(session, baseDir: str,
|
||||||
|
link: str, debug: bool) -> bool:
|
||||||
|
"""Downloads the favicon for the given feed link
|
||||||
|
"""
|
||||||
|
url = _getNewswireFaviconUrl(link)
|
||||||
|
if '://' not in link:
|
||||||
|
return False
|
||||||
|
timeoutSec = 10
|
||||||
|
imageData = getImageBinaryFromUrl(session, url, timeoutSec, debug)
|
||||||
|
if not imageData:
|
||||||
|
return False
|
||||||
|
if not os.path.isdir(baseDir + '/favicons'):
|
||||||
|
os.mkdir(baseDir + '/favicons')
|
||||||
|
linkFilename = url.replace('/', '#')
|
||||||
|
imageFilename = baseDir + '/favicons/' + linkFilename
|
||||||
|
try:
|
||||||
|
with open(imageFilename, 'wb+') as fp:
|
||||||
|
fp.write(imageData)
|
||||||
|
except OSError:
|
||||||
|
print('EX: failed writing favicon ' + url)
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
def _addNewswireDictEntry(baseDir: str, domain: str,
|
def _addNewswireDictEntry(baseDir: str, domain: str,
|
||||||
newswire: {}, dateStr: str,
|
newswire: {}, dateStr: str,
|
||||||
title: str, link: str,
|
title: str, link: str,
|
||||||
|
@ -133,7 +174,7 @@ def _addNewswireDictEntry(baseDir: str, domain: str,
|
||||||
description: str, moderated: bool,
|
description: str, moderated: bool,
|
||||||
mirrored: bool,
|
mirrored: bool,
|
||||||
tags: [],
|
tags: [],
|
||||||
maxTags: int) -> None:
|
maxTags: int, session, debug: bool) -> None:
|
||||||
"""Update the newswire dictionary
|
"""Update the newswire dictionary
|
||||||
"""
|
"""
|
||||||
# remove any markup
|
# remove any markup
|
||||||
|
@ -166,6 +207,8 @@ def _addNewswireDictEntry(baseDir: str, domain: str,
|
||||||
if isBlockedHashtag(baseDir, tag):
|
if isBlockedHashtag(baseDir, tag):
|
||||||
return
|
return
|
||||||
|
|
||||||
|
_downloadNewswireFeedFavicon(session, baseDir, link, debug)
|
||||||
|
|
||||||
newswire[dateStr] = [
|
newswire[dateStr] = [
|
||||||
title,
|
title,
|
||||||
link,
|
link,
|
||||||
|
@ -309,7 +352,8 @@ def _xml2StrToDict(baseDir: str, domain: str, xmlStr: str,
|
||||||
moderated: bool, mirrored: bool,
|
moderated: bool, mirrored: bool,
|
||||||
maxPostsPerSource: int,
|
maxPostsPerSource: int,
|
||||||
maxFeedItemSizeKb: int,
|
maxFeedItemSizeKb: int,
|
||||||
maxCategoriesFeedItemSizeKb: int) -> {}:
|
maxCategoriesFeedItemSizeKb: int,
|
||||||
|
session, debug: bool) -> {}:
|
||||||
"""Converts an xml RSS 2.0 string to a dictionary
|
"""Converts an xml RSS 2.0 string to a dictionary
|
||||||
"""
|
"""
|
||||||
if '<item>' not in xmlStr:
|
if '<item>' not in xmlStr:
|
||||||
|
@ -378,7 +422,7 @@ def _xml2StrToDict(baseDir: str, domain: str, xmlStr: str,
|
||||||
title, link,
|
title, link,
|
||||||
votesStatus, postFilename,
|
votesStatus, postFilename,
|
||||||
description, moderated,
|
description, moderated,
|
||||||
mirrored, [], 32)
|
mirrored, [], 32, session, debug)
|
||||||
postCtr += 1
|
postCtr += 1
|
||||||
if postCtr >= maxPostsPerSource:
|
if postCtr >= maxPostsPerSource:
|
||||||
break
|
break
|
||||||
|
@ -392,7 +436,8 @@ def _xml1StrToDict(baseDir: str, domain: str, xmlStr: str,
|
||||||
moderated: bool, mirrored: bool,
|
moderated: bool, mirrored: bool,
|
||||||
maxPostsPerSource: int,
|
maxPostsPerSource: int,
|
||||||
maxFeedItemSizeKb: int,
|
maxFeedItemSizeKb: int,
|
||||||
maxCategoriesFeedItemSizeKb: int) -> {}:
|
maxCategoriesFeedItemSizeKb: int,
|
||||||
|
session, debug: bool) -> {}:
|
||||||
"""Converts an xml RSS 1.0 string to a dictionary
|
"""Converts an xml RSS 1.0 string to a dictionary
|
||||||
https://validator.w3.org/feed/docs/rss1.html
|
https://validator.w3.org/feed/docs/rss1.html
|
||||||
"""
|
"""
|
||||||
|
@ -465,7 +510,7 @@ def _xml1StrToDict(baseDir: str, domain: str, xmlStr: str,
|
||||||
title, link,
|
title, link,
|
||||||
votesStatus, postFilename,
|
votesStatus, postFilename,
|
||||||
description, moderated,
|
description, moderated,
|
||||||
mirrored, [], 32)
|
mirrored, [], 32, session, debug)
|
||||||
postCtr += 1
|
postCtr += 1
|
||||||
if postCtr >= maxPostsPerSource:
|
if postCtr >= maxPostsPerSource:
|
||||||
break
|
break
|
||||||
|
@ -478,7 +523,8 @@ def _xml1StrToDict(baseDir: str, domain: str, xmlStr: str,
|
||||||
def _atomFeedToDict(baseDir: str, domain: str, xmlStr: str,
|
def _atomFeedToDict(baseDir: str, domain: str, xmlStr: str,
|
||||||
moderated: bool, mirrored: bool,
|
moderated: bool, mirrored: bool,
|
||||||
maxPostsPerSource: int,
|
maxPostsPerSource: int,
|
||||||
maxFeedItemSizeKb: int) -> {}:
|
maxFeedItemSizeKb: int,
|
||||||
|
session, debug: bool) -> {}:
|
||||||
"""Converts an atom feed string to a dictionary
|
"""Converts an atom feed string to a dictionary
|
||||||
"""
|
"""
|
||||||
if '<entry>' not in xmlStr:
|
if '<entry>' not in xmlStr:
|
||||||
|
@ -540,7 +586,7 @@ def _atomFeedToDict(baseDir: str, domain: str, xmlStr: str,
|
||||||
title, link,
|
title, link,
|
||||||
votesStatus, postFilename,
|
votesStatus, postFilename,
|
||||||
description, moderated,
|
description, moderated,
|
||||||
mirrored, [], 32)
|
mirrored, [], 32, session, debug)
|
||||||
postCtr += 1
|
postCtr += 1
|
||||||
if postCtr >= maxPostsPerSource:
|
if postCtr >= maxPostsPerSource:
|
||||||
break
|
break
|
||||||
|
@ -553,7 +599,8 @@ def _atomFeedToDict(baseDir: str, domain: str, xmlStr: str,
|
||||||
def _jsonFeedV1ToDict(baseDir: str, domain: str, xmlStr: str,
|
def _jsonFeedV1ToDict(baseDir: str, domain: str, xmlStr: str,
|
||||||
moderated: bool, mirrored: bool,
|
moderated: bool, mirrored: bool,
|
||||||
maxPostsPerSource: int,
|
maxPostsPerSource: int,
|
||||||
maxFeedItemSizeKb: int) -> {}:
|
maxFeedItemSizeKb: int,
|
||||||
|
session, debug: bool) -> {}:
|
||||||
"""Converts a json feed string to a dictionary
|
"""Converts a json feed string to a dictionary
|
||||||
See https://jsonfeed.org/version/1.1
|
See https://jsonfeed.org/version/1.1
|
||||||
"""
|
"""
|
||||||
|
@ -651,7 +698,7 @@ def _jsonFeedV1ToDict(baseDir: str, domain: str, xmlStr: str,
|
||||||
title, link,
|
title, link,
|
||||||
votesStatus, postFilename,
|
votesStatus, postFilename,
|
||||||
description, moderated,
|
description, moderated,
|
||||||
mirrored, [], 32)
|
mirrored, [], 32, session, debug)
|
||||||
postCtr += 1
|
postCtr += 1
|
||||||
if postCtr >= maxPostsPerSource:
|
if postCtr >= maxPostsPerSource:
|
||||||
break
|
break
|
||||||
|
@ -664,7 +711,8 @@ def _jsonFeedV1ToDict(baseDir: str, domain: str, xmlStr: str,
|
||||||
def _atomFeedYTToDict(baseDir: str, domain: str, xmlStr: str,
|
def _atomFeedYTToDict(baseDir: str, domain: str, xmlStr: str,
|
||||||
moderated: bool, mirrored: bool,
|
moderated: bool, mirrored: bool,
|
||||||
maxPostsPerSource: int,
|
maxPostsPerSource: int,
|
||||||
maxFeedItemSizeKb: int) -> {}:
|
maxFeedItemSizeKb: int,
|
||||||
|
session, debug: bool) -> {}:
|
||||||
"""Converts an atom-style YouTube feed string to a dictionary
|
"""Converts an atom-style YouTube feed string to a dictionary
|
||||||
"""
|
"""
|
||||||
if '<entry>' not in xmlStr:
|
if '<entry>' not in xmlStr:
|
||||||
|
@ -723,7 +771,7 @@ def _atomFeedYTToDict(baseDir: str, domain: str, xmlStr: str,
|
||||||
title, link,
|
title, link,
|
||||||
votesStatus, postFilename,
|
votesStatus, postFilename,
|
||||||
description, moderated, mirrored,
|
description, moderated, mirrored,
|
||||||
[], 32)
|
[], 32, session, debug)
|
||||||
postCtr += 1
|
postCtr += 1
|
||||||
if postCtr >= maxPostsPerSource:
|
if postCtr >= maxPostsPerSource:
|
||||||
break
|
break
|
||||||
|
@ -736,32 +784,38 @@ def _xmlStrToDict(baseDir: str, domain: str, xmlStr: str,
|
||||||
moderated: bool, mirrored: bool,
|
moderated: bool, mirrored: bool,
|
||||||
maxPostsPerSource: int,
|
maxPostsPerSource: int,
|
||||||
maxFeedItemSizeKb: int,
|
maxFeedItemSizeKb: int,
|
||||||
maxCategoriesFeedItemSizeKb: int) -> {}:
|
maxCategoriesFeedItemSizeKb: int,
|
||||||
|
session, debug: bool) -> {}:
|
||||||
"""Converts an xml string to a dictionary
|
"""Converts an xml string to a dictionary
|
||||||
"""
|
"""
|
||||||
if '<yt:videoId>' in xmlStr and '<yt:channelId>' in xmlStr:
|
if '<yt:videoId>' in xmlStr and '<yt:channelId>' in xmlStr:
|
||||||
print('YouTube feed: reading')
|
print('YouTube feed: reading')
|
||||||
return _atomFeedYTToDict(baseDir, domain,
|
return _atomFeedYTToDict(baseDir, domain,
|
||||||
xmlStr, moderated, mirrored,
|
xmlStr, moderated, mirrored,
|
||||||
maxPostsPerSource, maxFeedItemSizeKb)
|
maxPostsPerSource, maxFeedItemSizeKb,
|
||||||
|
session, debug)
|
||||||
elif 'rss version="2.0"' in xmlStr:
|
elif 'rss version="2.0"' in xmlStr:
|
||||||
return _xml2StrToDict(baseDir, domain,
|
return _xml2StrToDict(baseDir, domain,
|
||||||
xmlStr, moderated, mirrored,
|
xmlStr, moderated, mirrored,
|
||||||
maxPostsPerSource, maxFeedItemSizeKb,
|
maxPostsPerSource, maxFeedItemSizeKb,
|
||||||
maxCategoriesFeedItemSizeKb)
|
maxCategoriesFeedItemSizeKb,
|
||||||
|
session, debug)
|
||||||
elif '<?xml version="1.0"' in xmlStr:
|
elif '<?xml version="1.0"' in xmlStr:
|
||||||
return _xml1StrToDict(baseDir, domain,
|
return _xml1StrToDict(baseDir, domain,
|
||||||
xmlStr, moderated, mirrored,
|
xmlStr, moderated, mirrored,
|
||||||
maxPostsPerSource, maxFeedItemSizeKb,
|
maxPostsPerSource, maxFeedItemSizeKb,
|
||||||
maxCategoriesFeedItemSizeKb)
|
maxCategoriesFeedItemSizeKb,
|
||||||
|
session, debug)
|
||||||
elif 'xmlns="http://www.w3.org/2005/Atom"' in xmlStr:
|
elif 'xmlns="http://www.w3.org/2005/Atom"' in xmlStr:
|
||||||
return _atomFeedToDict(baseDir, domain,
|
return _atomFeedToDict(baseDir, domain,
|
||||||
xmlStr, moderated, mirrored,
|
xmlStr, moderated, mirrored,
|
||||||
maxPostsPerSource, maxFeedItemSizeKb)
|
maxPostsPerSource, maxFeedItemSizeKb,
|
||||||
|
session, debug)
|
||||||
elif 'https://jsonfeed.org/version/1' in xmlStr:
|
elif 'https://jsonfeed.org/version/1' in xmlStr:
|
||||||
return _jsonFeedV1ToDict(baseDir, domain,
|
return _jsonFeedV1ToDict(baseDir, domain,
|
||||||
xmlStr, moderated, mirrored,
|
xmlStr, moderated, mirrored,
|
||||||
maxPostsPerSource, maxFeedItemSizeKb)
|
maxPostsPerSource, maxFeedItemSizeKb,
|
||||||
|
session, debug)
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
|
|
||||||
|
@ -781,7 +835,7 @@ def getRSS(baseDir: str, domain: str, session, url: str,
|
||||||
moderated: bool, mirrored: bool,
|
moderated: bool, mirrored: bool,
|
||||||
maxPostsPerSource: int, maxFeedSizeKb: int,
|
maxPostsPerSource: int, maxFeedSizeKb: int,
|
||||||
maxFeedItemSizeKb: int,
|
maxFeedItemSizeKb: int,
|
||||||
maxCategoriesFeedItemSizeKb: int) -> {}:
|
maxCategoriesFeedItemSizeKb: int, debug: bool) -> {}:
|
||||||
"""Returns an RSS url as a dict
|
"""Returns an RSS url as a dict
|
||||||
"""
|
"""
|
||||||
if not isinstance(url, str):
|
if not isinstance(url, str):
|
||||||
|
@ -812,7 +866,8 @@ def getRSS(baseDir: str, domain: str, session, url: str,
|
||||||
moderated, mirrored,
|
moderated, mirrored,
|
||||||
maxPostsPerSource,
|
maxPostsPerSource,
|
||||||
maxFeedItemSizeKb,
|
maxFeedItemSizeKb,
|
||||||
maxCategoriesFeedItemSizeKb)
|
maxCategoriesFeedItemSizeKb,
|
||||||
|
session, debug)
|
||||||
else:
|
else:
|
||||||
print('WARN: feed is too large, ' +
|
print('WARN: feed is too large, ' +
|
||||||
'or contains invalid characters: ' + url)
|
'or contains invalid characters: ' + url)
|
||||||
|
@ -923,7 +978,8 @@ def _addAccountBlogsToNewswire(baseDir: str, nickname: str, domain: str,
|
||||||
newswire: {},
|
newswire: {},
|
||||||
maxBlogsPerAccount: int,
|
maxBlogsPerAccount: int,
|
||||||
indexFilename: str,
|
indexFilename: str,
|
||||||
maxTags: int, systemLanguage: str) -> None:
|
maxTags: int, systemLanguage: str,
|
||||||
|
session, debug: bool) -> None:
|
||||||
"""Adds blogs for the given account to the newswire
|
"""Adds blogs for the given account to the newswire
|
||||||
"""
|
"""
|
||||||
if not os.path.isfile(indexFilename):
|
if not os.path.isfile(indexFilename):
|
||||||
|
@ -987,7 +1043,7 @@ def _addAccountBlogsToNewswire(baseDir: str, nickname: str, domain: str,
|
||||||
votes, fullPostFilename,
|
votes, fullPostFilename,
|
||||||
description, moderated, False,
|
description, moderated, False,
|
||||||
tagsFromPost,
|
tagsFromPost,
|
||||||
maxTags)
|
maxTags, session, debug)
|
||||||
|
|
||||||
ctr += 1
|
ctr += 1
|
||||||
if ctr >= maxBlogsPerAccount:
|
if ctr >= maxBlogsPerAccount:
|
||||||
|
@ -996,7 +1052,8 @@ def _addAccountBlogsToNewswire(baseDir: str, nickname: str, domain: str,
|
||||||
|
|
||||||
def _addBlogsToNewswire(baseDir: str, domain: str, newswire: {},
|
def _addBlogsToNewswire(baseDir: str, domain: str, newswire: {},
|
||||||
maxBlogsPerAccount: int,
|
maxBlogsPerAccount: int,
|
||||||
maxTags: int, systemLanguage: str) -> None:
|
maxTags: int, systemLanguage: str,
|
||||||
|
session, debug: bool) -> None:
|
||||||
"""Adds blogs from each user account into the newswire
|
"""Adds blogs from each user account into the newswire
|
||||||
"""
|
"""
|
||||||
moderationDict = {}
|
moderationDict = {}
|
||||||
|
@ -1025,7 +1082,8 @@ def _addBlogsToNewswire(baseDir: str, domain: str, newswire: {},
|
||||||
_addAccountBlogsToNewswire(baseDir, nickname, domain,
|
_addAccountBlogsToNewswire(baseDir, nickname, domain,
|
||||||
newswire, maxBlogsPerAccount,
|
newswire, maxBlogsPerAccount,
|
||||||
blogsIndex, maxTags,
|
blogsIndex, maxTags,
|
||||||
systemLanguage)
|
systemLanguage, session,
|
||||||
|
debug)
|
||||||
break
|
break
|
||||||
|
|
||||||
# sort the moderation dict into chronological order, latest first
|
# sort the moderation dict into chronological order, latest first
|
||||||
|
@ -1050,7 +1108,7 @@ def getDictFromNewswire(session, baseDir: str, domain: str,
|
||||||
maxTags: int, maxFeedItemSizeKb: int,
|
maxTags: int, maxFeedItemSizeKb: int,
|
||||||
maxNewswirePosts: int,
|
maxNewswirePosts: int,
|
||||||
maxCategoriesFeedItemSizeKb: int,
|
maxCategoriesFeedItemSizeKb: int,
|
||||||
systemLanguage: str) -> {}:
|
systemLanguage: str, debug: bool) -> {}:
|
||||||
"""Gets rss feeds as a dictionary from newswire file
|
"""Gets rss feeds as a dictionary from newswire file
|
||||||
"""
|
"""
|
||||||
subscriptionsFilename = baseDir + '/accounts/newswire.txt'
|
subscriptionsFilename = baseDir + '/accounts/newswire.txt'
|
||||||
|
@ -1091,14 +1149,15 @@ def getDictFromNewswire(session, baseDir: str, domain: str,
|
||||||
moderated, mirrored,
|
moderated, mirrored,
|
||||||
maxPostsPerSource, maxFeedSizeKb,
|
maxPostsPerSource, maxFeedSizeKb,
|
||||||
maxFeedItemSizeKb,
|
maxFeedItemSizeKb,
|
||||||
maxCategoriesFeedItemSizeKb)
|
maxCategoriesFeedItemSizeKb, debug)
|
||||||
if itemsList:
|
if itemsList:
|
||||||
for dateStr, item in itemsList.items():
|
for dateStr, item in itemsList.items():
|
||||||
result[dateStr] = item
|
result[dateStr] = item
|
||||||
|
|
||||||
# add blogs from each user account
|
# add blogs from each user account
|
||||||
_addBlogsToNewswire(baseDir, domain, result,
|
_addBlogsToNewswire(baseDir, domain, result,
|
||||||
maxPostsPerSource, maxTags, systemLanguage)
|
maxPostsPerSource, maxTags, systemLanguage,
|
||||||
|
session, debug)
|
||||||
|
|
||||||
# sort into chronological order, latest first
|
# sort into chronological order, latest first
|
||||||
sortedResult = OrderedDict(sorted(result.items(), reverse=True))
|
sortedResult = OrderedDict(sorted(result.items(), reverse=True))
|
||||||
|
|
24
session.py
24
session.py
|
@ -452,3 +452,27 @@ def downloadImage(session, baseDir: str, url: str,
|
||||||
print('EX: Failed to download image: ' +
|
print('EX: Failed to download image: ' +
|
||||||
str(url) + ' ' + str(e))
|
str(url) + ' ' + str(e))
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def getImageBinaryFromUrl(session, url: str, timeoutSec: int, debug: bool):
|
||||||
|
"""http GET for an image
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
result = session.get(url, timeout=timeoutSec)
|
||||||
|
if result.status_code != 200:
|
||||||
|
print('WARN: getImageFromUrl: ' + url +
|
||||||
|
' failed with error code ' + str(result.status_code))
|
||||||
|
return result.content
|
||||||
|
except requests.exceptions.RequestException as e:
|
||||||
|
if debug:
|
||||||
|
print('ERROR: getImageFromUrl failed: ' + str(url) + ', ' +
|
||||||
|
str(e))
|
||||||
|
except ValueError as e:
|
||||||
|
if debug:
|
||||||
|
print('ERROR: getImageFromUrl failed: ' + str(url) + ', ' +
|
||||||
|
str(e))
|
||||||
|
except SocketError as e:
|
||||||
|
if e.errno == errno.ECONNRESET:
|
||||||
|
print('WARN: getImageFromUrl failed, ' +
|
||||||
|
'connection was reset ' + str(e))
|
||||||
|
return None
|
||||||
|
|
Loading…
Reference in New Issue