diff options
Diffstat (limited to 'gallery_dl/extractor/flickr.py')
| -rw-r--r-- | gallery_dl/extractor/flickr.py | 43 |
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) |
