aboutsummaryrefslogtreecommitdiffstats
path: root/gallery_dl/extractor/flickr.py
diff options
context:
space:
mode:
Diffstat (limited to 'gallery_dl/extractor/flickr.py')
-rw-r--r--gallery_dl/extractor/flickr.py43
1 files changed, 29 insertions, 14 deletions
diff --git a/gallery_dl/extractor/flickr.py b/gallery_dl/extractor/flickr.py
index 35263a3..1446eb8 100644
--- a/gallery_dl/extractor/flickr.py
+++ b/gallery_dl/extractor/flickr.py
@@ -10,6 +10,7 @@
from .common import Extractor, Message
from .. import text, oauth, util, exception
+from ..cache import memcache
BASE_PATTERN = r"(?:https?://)?(?:www\.|secure\.|m\.)?flickr\.com"
@@ -17,6 +18,7 @@ BASE_PATTERN = r"(?:https?://)?(?:www\.|secure\.|m\.)?flickr\.com"
class FlickrExtractor(Extractor):
"""Base class for flickr extractors"""
category = "flickr"
+ root = "https://www.flickr.com"
filename_fmt = "{category}_{id}.{extension}"
directory_fmt = ("{category}", "{user[username]}")
archive_fmt = "{id}"
@@ -24,11 +26,12 @@ class FlickrExtractor(Extractor):
request_interval_min = 0.5
def _init(self):
- self.api = FlickrAPI(self)
self.user = None
self.item_id = self.groups[0]
def items(self):
+ self.api = FlickrAPI(self)
+
data = self.metadata()
extract = self.api._extract_format
for photo in self.photos():
@@ -38,11 +41,11 @@ class FlickrExtractor(Extractor):
self.log.warning(
"Skipping photo %s (%s: %s)",
photo["id"], exc.__class__.__name__, exc)
- self.log.debug("", exc_info=exc)
+ self.log.traceback(exc)
else:
photo.update(data)
url = self._file_url(photo)
- yield Message.Directory, photo
+ yield Message.Directory, "", photo
yield Message.Url, url, text.nameext_from_url(url, photo)
def metadata(self):
@@ -75,6 +78,8 @@ class FlickrImageExtractor(FlickrExtractor):
example = "https://www.flickr.com/photos/USER/12345"
def items(self):
+ self.api = FlickrAPI(self)
+
item_id, enc_id = self.groups
if enc_id is not None:
alphabet = ("123456789abcdefghijkmnopqrstu"
@@ -98,7 +103,7 @@ class FlickrImageExtractor(FlickrExtractor):
photo["comments"] = text.parse_int(photo["comments"]["_content"])
photo["description"] = photo["description"]["_content"]
photo["tags"] = [t["raw"] for t in photo["tags"]["tag"]]
- photo["date"] = text.parse_timestamp(photo["dateuploaded"])
+ photo["date"] = self.parse_timestamp(photo["dateuploaded"])
photo["views"] = text.parse_int(photo["views"])
photo["id"] = text.parse_int(photo["id"])
@@ -109,7 +114,7 @@ class FlickrImageExtractor(FlickrExtractor):
location[key] = value["_content"]
url = self._file_url(photo)
- yield Message.Directory, photo
+ yield Message.Directory, "", photo
yield Message.Url, url, text.nameext_from_url(url, photo)
@@ -119,7 +124,7 @@ class FlickrAlbumExtractor(FlickrExtractor):
directory_fmt = ("{category}", "{user[username]}",
"Albums", "{album[id]} {album[title]}")
archive_fmt = "a_{album[id]}_{id}"
- pattern = BASE_PATTERN + r"/photos/([^/?#]+)/(?:album|set)s(?:/(\d+))?"
+ pattern = rf"{BASE_PATTERN}/photos/([^/?#]+)/(?:album|set)s(?:/(\d+))?"
example = "https://www.flickr.com/photos/USER/albums/12345"
def items(self):
@@ -129,6 +134,8 @@ class FlickrAlbumExtractor(FlickrExtractor):
return self._album_items()
def _album_items(self):
+ self.api = FlickrAPI(self)
+
data = FlickrExtractor.metadata(self)
data["_extractor"] = FlickrAlbumExtractor
@@ -159,7 +166,7 @@ class FlickrGalleryExtractor(FlickrExtractor):
directory_fmt = ("{category}", "{user[username]}",
"Galleries", "{gallery[gallery_id]} {gallery[title]}")
archive_fmt = "g_{gallery[id]}_{id}"
- pattern = BASE_PATTERN + r"/photos/([^/?#]+)/galleries/(\d+)"
+ pattern = rf"{BASE_PATTERN}/photos/([^/?#]+)/galleries/(\d+)"
example = "https://www.flickr.com/photos/USER/galleries/12345/"
def metadata(self):
@@ -177,7 +184,7 @@ class FlickrGroupExtractor(FlickrExtractor):
subcategory = "group"
directory_fmt = ("{category}", "Groups", "{group[groupname]}")
archive_fmt = "G_{group[nsid]}_{id}"
- pattern = BASE_PATTERN + r"/groups/([^/?#]+)"
+ pattern = rf"{BASE_PATTERN}/groups/([^/?#]+)"
example = "https://www.flickr.com/groups/NAME/"
def metadata(self):
@@ -192,7 +199,7 @@ class FlickrUserExtractor(FlickrExtractor):
"""Extractor for the photostream of a flickr user"""
subcategory = "user"
archive_fmt = "u_{user[nsid]}_{id}"
- pattern = BASE_PATTERN + r"/photos/([^/?#]+)/?$"
+ pattern = rf"{BASE_PATTERN}/photos/([^/?#]+)/?$"
example = "https://www.flickr.com/photos/USER/"
def photos(self):
@@ -204,7 +211,7 @@ class FlickrFavoriteExtractor(FlickrExtractor):
subcategory = "favorite"
directory_fmt = ("{category}", "{user[username]}", "Favorites")
archive_fmt = "f_{user[nsid]}_{id}"
- pattern = BASE_PATTERN + r"/photos/([^/?#]+)/favorites"
+ pattern = rf"{BASE_PATTERN}/photos/([^/?#]+)/favorites"
example = "https://www.flickr.com/photos/USER/favorites"
def photos(self):
@@ -216,7 +223,7 @@ class FlickrSearchExtractor(FlickrExtractor):
subcategory = "search"
directory_fmt = ("{category}", "Search", "{search[text]}")
archive_fmt = "s_{search}_{id}"
- pattern = BASE_PATTERN + r"/search/?\?([^#]+)"
+ pattern = rf"{BASE_PATTERN}/search/?\?([^#]+)"
example = "https://flickr.com/search/?text=QUERY"
def metadata(self):
@@ -236,8 +243,8 @@ class FlickrAPI(oauth.OAuth1API):
"""
API_URL = "https://api.flickr.com/services/rest/"
- API_KEY = "90c368449018a0cb880ea4889cbb8681"
- API_SECRET = "e4b83e319c11e9e1"
+ # API_KEY = ""
+ API_SECRET = ""
FORMATS = [
("o" , "Original" , None),
("6k", "X-Large 6K" , 6144),
@@ -282,6 +289,14 @@ class FlickrAPI(oauth.OAuth1API):
"10": "Public Domain Mark",
}
+ @property
+ @memcache(maxage=3600)
+ def API_KEY(self):
+ extr = self.extractor
+ extr.log.info("Retrieving public API key")
+ page = extr.request(extr.root + "/prints").text
+ return text.extr(page, '.flickr.api.site_key = "', '"')
+
def __init__(self, extractor):
oauth.OAuth1API.__init__(self, extractor)
@@ -489,7 +504,7 @@ class FlickrAPI(oauth.OAuth1API):
def _extract_format(self, photo):
photo["description"] = photo["description"]["_content"].strip()
photo["views"] = text.parse_int(photo["views"])
- photo["date"] = text.parse_timestamp(photo["dateupload"])
+ photo["date"] = self.extractor.parse_timestamp(photo["dateupload"])
photo["tags"] = photo["tags"].split()
self._extract_metadata(photo)