Closed hugovk closed 4 years ago
For example, see PR https://github.com/sybrenstuvel/flickrapi/pull/124 which only edits the README.
Looks like some photos and albums no longer exist on Flickr.
I expect it's because Flickr have restricted free accounts to 1,000 photos and deleted the rest.
$ pytest ===================================================== test session starts ===================================================== platform darwin -- Python 3.7.4, pytest-5.1.2, py-1.5.4, pluggy-0.12.0 Test order randomisation NOT enabled. Enable with --random-order or --random-order-bucket=<bucket_type> rootdir: /private/tmp/flickrapi plugins: xdist-1.29.0, parallel-0.0.9, random-order-1.0.4, flaky-3.5.3, black-0.3.5, timeout-1.3.3, rerunfailures-6.0, cov-2.7.1, forked-1.0.1, requests-mock-1.6.0 collected 42 items tests/test_cache.py .... [ 9%] tests/test_call_builder.py ... [ 16%] tests/test_core.py . [ 19%] tests/test_flickrapi.py ..........FF.F..FFF.F.. [ 73%] tests/test_shorturl.py ... [ 80%] tests/test_tokencache.py .... [ 90%] tests/test_xmlnode.py .... [100%] ========================================================== FAILURES =========================================================== _______________________________________________ FormatsTest.test_default_format _______________________________________________ self = <test_flickrapi.FormatsTest testMethod=test_default_format> def test_default_format(self): '''Test that the default format is etree''' f = self.clasz(key, secret) > etree = f.photos.getInfo(photo_id=u'2333478006') tests/test_flickrapi.py:336: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ flickrapi/call_builder.py:38: in __call__ return self.flickrapi_object.do_flickr_call(self.method_name, **kwargs) flickrapi/core.py:337: in do_flickr_call **params) flickrapi/core.py:407: in _wrap_in_parser return parser(self, data) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = [FlickrAPI for key "ecd01ab8f00faf13e1f8801586e126fd"] rest_xml = b'<?xml version="1.0" encoding="utf-8" ?>\n<rsp stat="fail">\n\t<err code="1" msg="Photo "2333478006" not found (invalid ID)" />\n</rsp>\n' @rest_parser('etree') def parse_etree(self, rest_xml): """Parses a REST XML response from Flickr into an ElementTree object.""" try: from lxml import etree as ElementTree LOG.info('REST Parser: using lxml.etree') except ImportError: try: import xml.etree.cElementTree as ElementTree LOG.info('REST Parser: using xml.etree.cElementTree') except ImportError: try: import xml.etree.ElementTree as ElementTree LOG.info('REST Parser: using xml.etree.ElementTree') except ImportError: try: import elementtree.cElementTree as ElementTree LOG.info('REST Parser: elementtree.cElementTree') except ImportError: try: import elementtree.ElementTree as ElementTree except ImportError: raise ImportError("You need to install " "ElementTree to use the etree format") rsp = ElementTree.fromstring(rest_xml) if rsp.attrib['stat'] == 'ok': return rsp err = rsp.find('err') code = err.attrib.get('code', None) > raise FlickrError(six.u('Error: %(code)s: %(msg)s') % err.attrib, code=code) E flickrapi.exceptions.FlickrError: Error: 1: Photo "2333478006" not found (invalid ID) flickrapi/core.py:297: FlickrError ---------------------------------------------------- Captured stderr call ----------------------------------------------------- INFO:flickrapi.core:Calling {'method': 'flickr.photos.getInfo', 'format': 'etree', 'nojsoncallback': 1} DEBUG:flickrapi.core:Wrapping call <bound method FlickrAPI._flickr_call of [FlickrAPI for key "ecd01ab8f00faf13e1f8801586e126fd"]>(self, (), {'timeout': None, 'photo_id': '2333478006', 'method': 'flickr.photos.getInfo', 'format': 'rest', 'nojsoncallback': 1}) DEBUG:flickrapi.core:Calling {'photo_id': '2333478006', 'method': 'flickr.photos.getInfo', 'format': 'rest', 'nojsoncallback': 1} INFO:flickrapi.core:REST Parser: using lxml.etree ------------------------------------------------------ Captured log call ------------------------------------------------------ INFO flickrapi.core:core.py:332 Calling {'method': 'flickr.photos.getInfo', 'format': 'etree', 'nojsoncallback': 1} DEBUG flickrapi.core:core.py:398 Wrapping call <bound method FlickrAPI._flickr_call of [FlickrAPI for key "ecd01ab8f00faf13e1f8801586e126fd"]>(self, (), {'timeout': None, 'photo_id': '2333478006', 'method': 'flickr.photos.getInfo', 'format': 'rest', 'nojsoncallback': 1}) DEBUG flickrapi.core:core.py:371 Calling {'photo_id': '2333478006', 'method': 'flickr.photos.getInfo', 'format': 'rest', 'nojsoncallback': 1} INFO flickrapi.core:core.py:271 REST Parser: using lxml.etree ____________________________________________ FormatsTest.test_etree_default_format ____________________________________________ self = <test_flickrapi.FormatsTest testMethod=test_etree_default_format> def test_etree_default_format(self): '''Test setting the default format to etree''' f = self.clasz(key, secret, format='etree') > etree = f.photos_getInfo(photo_id=u'2333478006') tests/test_flickrapi.py:356: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ flickrapi/call_builder.py:38: in __call__ return self.flickrapi_object.do_flickr_call(self.method_name, **kwargs) flickrapi/core.py:337: in do_flickr_call **params) flickrapi/core.py:407: in _wrap_in_parser return parser(self, data) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = [FlickrAPI for key "ecd01ab8f00faf13e1f8801586e126fd"] rest_xml = b'<?xml version="1.0" encoding="utf-8" ?>\n<rsp stat="fail">\n\t<err code="1" msg="Photo "2333478006" not found (invalid ID)" />\n</rsp>\n' @rest_parser('etree') def parse_etree(self, rest_xml): """Parses a REST XML response from Flickr into an ElementTree object.""" try: from lxml import etree as ElementTree LOG.info('REST Parser: using lxml.etree') except ImportError: try: import xml.etree.cElementTree as ElementTree LOG.info('REST Parser: using xml.etree.cElementTree') except ImportError: try: import xml.etree.ElementTree as ElementTree LOG.info('REST Parser: using xml.etree.ElementTree') except ImportError: try: import elementtree.cElementTree as ElementTree LOG.info('REST Parser: elementtree.cElementTree') except ImportError: try: import elementtree.ElementTree as ElementTree except ImportError: raise ImportError("You need to install " "ElementTree to use the etree format") rsp = ElementTree.fromstring(rest_xml) if rsp.attrib['stat'] == 'ok': return rsp err = rsp.find('err') code = err.attrib.get('code', None) > raise FlickrError(six.u('Error: %(code)s: %(msg)s') % err.attrib, code=code) E flickrapi.exceptions.FlickrError: Error: 1: Photo "2333478006" not found (invalid ID) flickrapi/core.py:297: FlickrError ---------------------------------------------------- Captured stderr call ----------------------------------------------------- INFO:flickrapi.core:Calling {'method': 'flickr.photos.getInfo', 'format': 'etree', 'nojsoncallback': 1} DEBUG:flickrapi.core:Wrapping call <bound method FlickrAPI._flickr_call of [FlickrAPI for key "ecd01ab8f00faf13e1f8801586e126fd"]>(self, (), {'timeout': None, 'photo_id': '2333478006', 'method': 'flickr.photos.getInfo', 'format': 'rest', 'nojsoncallback': 1}) DEBUG:flickrapi.core:Calling {'photo_id': '2333478006', 'method': 'flickr.photos.getInfo', 'format': 'rest', 'nojsoncallback': 1} INFO:flickrapi.core:REST Parser: using lxml.etree ------------------------------------------------------ Captured log call ------------------------------------------------------ INFO flickrapi.core:core.py:332 Calling {'method': 'flickr.photos.getInfo', 'format': 'etree', 'nojsoncallback': 1} DEBUG flickrapi.core:core.py:398 Wrapping call <bound method FlickrAPI._flickr_call of [FlickrAPI for key "ecd01ab8f00faf13e1f8801586e126fd"]>(self, (), {'timeout': None, 'photo_id': '2333478006', 'method': 'flickr.photos.getInfo', 'format': 'rest', 'nojsoncallback': 1}) DEBUG flickrapi.core:core.py:371 Calling {'photo_id': '2333478006', 'method': 'flickr.photos.getInfo', 'format': 'rest', 'nojsoncallback': 1} INFO flickrapi.core:core.py:271 REST Parser: using lxml.etree _____________________________________________ FormatsTest.test_etree_format_happy _____________________________________________ self = <test_flickrapi.FormatsTest testMethod=test_etree_format_happy> def test_etree_format_happy(self): '''Test ETree format''' etree = self.f_noauth.photos.getInfo(photo_id=u'2333478006', > format='etree') tests/test_flickrapi.py:343: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ flickrapi/call_builder.py:38: in __call__ return self.flickrapi_object.do_flickr_call(self.method_name, **kwargs) flickrapi/core.py:337: in do_flickr_call **params) flickrapi/core.py:407: in _wrap_in_parser return parser(self, data) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = [FlickrAPI for key "ecd01ab8f00faf13e1f8801586e126fd"] rest_xml = b'<?xml version="1.0" encoding="utf-8" ?>\n<rsp stat="fail">\n\t<err code="1" msg="Photo "2333478006" not found (invalid ID)" />\n</rsp>\n' @rest_parser('etree') def parse_etree(self, rest_xml): """Parses a REST XML response from Flickr into an ElementTree object.""" try: from lxml import etree as ElementTree LOG.info('REST Parser: using lxml.etree') except ImportError: try: import xml.etree.cElementTree as ElementTree LOG.info('REST Parser: using xml.etree.cElementTree') except ImportError: try: import xml.etree.ElementTree as ElementTree LOG.info('REST Parser: using xml.etree.ElementTree') except ImportError: try: import elementtree.cElementTree as ElementTree LOG.info('REST Parser: elementtree.cElementTree') except ImportError: try: import elementtree.ElementTree as ElementTree except ImportError: raise ImportError("You need to install " "ElementTree to use the etree format") rsp = ElementTree.fromstring(rest_xml) if rsp.attrib['stat'] == 'ok': return rsp err = rsp.find('err') code = err.attrib.get('code', None) > raise FlickrError(six.u('Error: %(code)s: %(msg)s') % err.attrib, code=code) E flickrapi.exceptions.FlickrError: Error: 1: Photo "2333478006" not found (invalid ID) flickrapi/core.py:297: FlickrError ---------------------------------------------------- Captured stderr call ----------------------------------------------------- INFO:flickrapi.core:Calling {'method': 'flickr.photos.getInfo', 'format': 'etree', 'nojsoncallback': 1} DEBUG:flickrapi.core:Wrapping call <bound method FlickrAPI._flickr_call of [FlickrAPI for key "ecd01ab8f00faf13e1f8801586e126fd"]>(self, (), {'timeout': None, 'photo_id': '2333478006', 'format': 'rest', 'method': 'flickr.photos.getInfo', 'nojsoncallback': 1}) DEBUG:flickrapi.core:Calling {'photo_id': '2333478006', 'format': 'rest', 'method': 'flickr.photos.getInfo', 'nojsoncallback': 1} INFO:flickrapi.core:REST Parser: using lxml.etree ------------------------------------------------------ Captured log call ------------------------------------------------------ INFO flickrapi.core:core.py:332 Calling {'method': 'flickr.photos.getInfo', 'format': 'etree', 'nojsoncallback': 1} DEBUG flickrapi.core:core.py:398 Wrapping call <bound method FlickrAPI._flickr_call of [FlickrAPI for key "ecd01ab8f00faf13e1f8801586e126fd"]>(self, (), {'timeout': None, 'photo_id': '2333478006', 'format': 'rest', 'method': 'flickr.photos.getInfo', 'nojsoncallback': 1}) DEBUG flickrapi.core:core.py:371 Calling {'photo_id': '2333478006', 'format': 'rest', 'method': 'flickr.photos.getInfo', 'nojsoncallback': 1} INFO flickrapi.core:core.py:271 REST Parser: using lxml.etree ________________________________________________ FormatsTest.test_json_format _________________________________________________ self = <test_flickrapi.FormatsTest testMethod=test_json_format> def test_json_format(self): '''Test json format (no callback)''' data = self.f_noauth.photos.getInfo(photo_id='2333478006', format='json') photo = json.loads(data.decode('utf-8')) > location = photo['photo']['location'] E KeyError: 'photo' tests/test_flickrapi.py:389: KeyError ---------------------------------------------------- Captured stderr call ----------------------------------------------------- INFO:flickrapi.core:Calling {'method': 'flickr.photos.getInfo', 'format': 'etree', 'nojsoncallback': 1} DEBUG:flickrapi.core:Wrapping call <bound method FlickrAPI._flickr_call of [FlickrAPI for key "ecd01ab8f00faf13e1f8801586e126fd"]>(self, (), {'timeout': None, 'photo_id': '2333478006', 'format': 'json', 'method': 'flickr.photos.getInfo', 'nojsoncallback': 1}) DEBUG:flickrapi.core:Calling {'photo_id': '2333478006', 'format': 'json', 'method': 'flickr.photos.getInfo', 'nojsoncallback': 1} ------------------------------------------------------ Captured log call ------------------------------------------------------ INFO flickrapi.core:core.py:332 Calling {'method': 'flickr.photos.getInfo', 'format': 'etree', 'nojsoncallback': 1} DEBUG flickrapi.core:core.py:398 Wrapping call <bound method FlickrAPI._flickr_call of [FlickrAPI for key "ecd01ab8f00faf13e1f8801586e126fd"]>(self, (), {'timeout': None, 'photo_id': '2333478006', 'format': 'json', 'method': 'flickr.photos.getInfo', 'nojsoncallback': 1}) DEBUG flickrapi.core:core.py:371 Calling {'photo_id': '2333478006', 'format': 'json', 'method': 'flickr.photos.getInfo', 'nojsoncallback': 1} _____________________________________________ FormatsTest.test_parsed_json_format _____________________________________________ self = <test_flickrapi.FormatsTest testMethod=test_parsed_json_format> def test_parsed_json_format(self): '''Test parsed json format''' photo = self.f_noauth.photos.getInfo(photo_id='2333478006', > format='parsed-json') tests/test_flickrapi.py:401: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ flickrapi/call_builder.py:38: in __call__ return self.flickrapi_object.do_flickr_call(self.method_name, **kwargs) flickrapi/core.py:337: in do_flickr_call **params) flickrapi/core.py:407: in _wrap_in_parser return parser(self, data) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = [FlickrAPI for key "ecd01ab8f00faf13e1f8801586e126fd"] json_string = '{"stat":"fail","code":1,"message":"Photo \\"2333478006\\" not found (invalid ID)"}' @rest_parser('parsed-json', 'json') def parse_json(self, json_string): """Parses a JSON response from Flickr.""" if isinstance(json_string, six.binary_type): json_string = json_string.decode('utf-8') import json parsed = json.loads(json_string) if parsed.get('stat', '') == 'fail': raise FlickrError(six.u('Error: %(code)s: %(message)s') % parsed, > code=parsed['code']) E flickrapi.exceptions.FlickrError: Error: 1: Photo "2333478006" not found (invalid ID) flickrapi/core.py:262: FlickrError ---------------------------------------------------- Captured stderr call ----------------------------------------------------- INFO:flickrapi.core:Calling {'method': 'flickr.photos.getInfo', 'format': 'etree', 'nojsoncallback': 1} DEBUG:flickrapi.core:Wrapping call <bound method FlickrAPI._flickr_call of [FlickrAPI for key "ecd01ab8f00faf13e1f8801586e126fd"]>(self, (), {'timeout': None, 'photo_id': '2333478006', 'format': 'json', 'method': 'flickr.photos.getInfo', 'nojsoncallback': 1}) DEBUG:flickrapi.core:Calling {'photo_id': '2333478006', 'format': 'json', 'method': 'flickr.photos.getInfo', 'nojsoncallback': 1} ------------------------------------------------------ Captured log call ------------------------------------------------------ INFO flickrapi.core:core.py:332 Calling {'method': 'flickr.photos.getInfo', 'format': 'etree', 'nojsoncallback': 1} DEBUG flickrapi.core:core.py:398 Wrapping call <bound method FlickrAPI._flickr_call of [FlickrAPI for key "ecd01ab8f00faf13e1f8801586e126fd"]>(self, (), {'timeout': None, 'photo_id': '2333478006', 'format': 'json', 'method': 'flickr.photos.getInfo', 'nojsoncallback': 1}) DEBUG flickrapi.core:core.py:371 Calling {'photo_id': '2333478006', 'format': 'json', 'method': 'flickr.photos.getInfo', 'nojsoncallback': 1} _______________________________________________ FormatsTest.test_xmlnode_format _______________________________________________ self = <test_flickrapi.FormatsTest testMethod=test_xmlnode_format> def test_xmlnode_format(self): '''Test XMLNode format''' node = self.f_noauth.photos_getInfo(photo_id=u'2333478006', > format='xmlnode') tests/test_flickrapi.py:363: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ flickrapi/call_builder.py:38: in __call__ return self.flickrapi_object.do_flickr_call(self.method_name, **kwargs) flickrapi/core.py:337: in do_flickr_call **params) flickrapi/core.py:407: in _wrap_in_parser return parser(self, data) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = [FlickrAPI for key "ecd01ab8f00faf13e1f8801586e126fd"] rest_xml = b'<?xml version="1.0" encoding="utf-8" ?>\n<rsp stat="fail">\n\t<err code="1" msg="Photo "2333478006" not found (invalid ID)" />\n</rsp>\n' @rest_parser('xmlnode') def parse_xmlnode(self, rest_xml): """Parses a REST XML response from Flickr into an XMLNode object.""" rsp = XMLNode.parse(rest_xml, store_xml=True) if rsp['stat'] == 'ok': return rsp err = rsp.err[0] > raise FlickrError(six.u('Error: %(code)s: %(msg)s') % err, code=err['code']) E flickrapi.exceptions.FlickrError: Error: 1: Photo "2333478006" not found (invalid ID) flickrapi/core.py:249: FlickrError ---------------------------------------------------- Captured stderr call ----------------------------------------------------- INFO:flickrapi.core:Calling {'method': 'flickr.photos.getInfo', 'format': 'etree', 'nojsoncallback': 1} DEBUG:flickrapi.core:Wrapping call <bound method FlickrAPI._flickr_call of [FlickrAPI for key "ecd01ab8f00faf13e1f8801586e126fd"]>(self, (), {'timeout': None, 'photo_id': '2333478006', 'format': 'rest', 'method': 'flickr.photos.getInfo', 'nojsoncallback': 1}) DEBUG:flickrapi.core:Calling {'photo_id': '2333478006', 'format': 'rest', 'method': 'flickr.photos.getInfo', 'nojsoncallback': 1} ------------------------------------------------------ Captured log call ------------------------------------------------------ INFO flickrapi.core:core.py:332 Calling {'method': 'flickr.photos.getInfo', 'format': 'etree', 'nojsoncallback': 1} DEBUG flickrapi.core:core.py:398 Wrapping call <bound method FlickrAPI._flickr_call of [FlickrAPI for key "ecd01ab8f00faf13e1f8801586e126fd"]>(self, (), {'timeout': None, 'photo_id': '2333478006', 'format': 'rest', 'method': 'flickr.photos.getInfo', 'nojsoncallback': 1}) DEBUG flickrapi.core:core.py:371 Calling {'photo_id': '2333478006', 'format': 'rest', 'method': 'flickr.photos.getInfo', 'nojsoncallback': 1} ________________________________________________ RealWalkerTest.test_walk_set _________________________________________________ self = <test_flickrapi.RealWalkerTest testMethod=test_walk_set> def test_walk_set(self): # Check that we get a generator, and not a list of results. gen = self.f.walk_set('72157611690250298', per_page=8) self.assertEqual(types.GeneratorType, type(gen)) # I happen to know that that set contains 24 photos, and it is # very unlikely that this will ever change (photos of a past # event) > self.assertEqual(24, len(list(gen))) tests/test_flickrapi.py:432: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ flickrapi/core.py:688: in data_walker rsp = method(page=page, **params) flickrapi/call_builder.py:38: in __call__ return self.flickrapi_object.do_flickr_call(self.method_name, **kwargs) flickrapi/core.py:337: in do_flickr_call **params) flickrapi/core.py:407: in _wrap_in_parser return parser(self, data) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = [FlickrAPI for key "ecd01ab8f00faf13e1f8801586e126fd"] rest_xml = b'<?xml version="1.0" encoding="utf-8" ?>\n<rsp stat="fail">\n\t<err code="1" msg="Photoset not found" />\n</rsp>\n' @rest_parser('etree') def parse_etree(self, rest_xml): """Parses a REST XML response from Flickr into an ElementTree object.""" try: from lxml import etree as ElementTree LOG.info('REST Parser: using lxml.etree') except ImportError: try: import xml.etree.cElementTree as ElementTree LOG.info('REST Parser: using xml.etree.cElementTree') except ImportError: try: import xml.etree.ElementTree as ElementTree LOG.info('REST Parser: using xml.etree.ElementTree') except ImportError: try: import elementtree.cElementTree as ElementTree LOG.info('REST Parser: elementtree.cElementTree') except ImportError: try: import elementtree.ElementTree as ElementTree except ImportError: raise ImportError("You need to install " "ElementTree to use the etree format") rsp = ElementTree.fromstring(rest_xml) if rsp.attrib['stat'] == 'ok': return rsp err = rsp.find('err') code = err.attrib.get('code', None) > raise FlickrError(six.u('Error: %(code)s: %(msg)s') % err.attrib, code=code) E flickrapi.exceptions.FlickrError: Error: 1: Photoset not found flickrapi/core.py:297: FlickrError ---------------------------------------------------- Captured stderr call ----------------------------------------------------- DEBUG:flickrapi.core:Calling getPhotos(page=1 of 1, {'photoset_id': '72157611690250298', 'per_page': 8}) INFO:flickrapi.core:Calling {'method': 'flickr.photosets.getPhotos', 'format': 'etree', 'nojsoncallback': 1} DEBUG:flickrapi.core:Wrapping call <bound method FlickrAPI._flickr_call of [FlickrAPI for key "ecd01ab8f00faf13e1f8801586e126fd"]>(self, (), {'timeout': None, 'page': 1, 'photoset_id': '72157611690250298', 'per_page': 8, 'method': 'flickr.photosets.getPhotos', 'format': 'rest', 'nojsoncallback': 1}) DEBUG:flickrapi.core:Calling {'page': 1, 'photoset_id': '72157611690250298', 'per_page': 8, 'method': 'flickr.photosets.getPhotos', 'format': 'rest', 'nojsoncallback': 1} INFO:flickrapi.core:REST Parser: using lxml.etree ------------------------------------------------------ Captured log call ------------------------------------------------------ DEBUG flickrapi.core:core.py:687 Calling getPhotos(page=1 of 1, {'photoset_id': '72157611690250298', 'per_page': 8}) INFO flickrapi.core:core.py:332 Calling {'method': 'flickr.photosets.getPhotos', 'format': 'etree', 'nojsoncallback': 1} DEBUG flickrapi.core:core.py:398 Wrapping call <bound method FlickrAPI._flickr_call of [FlickrAPI for key "ecd01ab8f00faf13e1f8801586e126fd"]>(self, (), {'timeout': None, 'page': 1, 'photoset_id': '72157611690250298', 'per_page': 8, 'method': 'flickr.photosets.getPhotos', 'format': 'rest', 'nojsoncallback': 1}) DEBUG flickrapi.core:core.py:371 Calling {'page': 1, 'photoset_id': '72157611690250298', 'per_page': 8, 'method': 'flickr.photosets.getPhotos', 'format': 'rest', 'nojsoncallback': 1} INFO flickrapi.core:core.py:271 REST Parser: using lxml.etree ====================================================== warnings summary ======================================================= /usr/local/lib/python3.7/site-packages/requests_toolbelt/_compat.py:11 /usr/local/lib/python3.7/site-packages/requests_toolbelt/_compat.py:11 /usr/local/lib/python3.7/site-packages/requests_toolbelt/_compat.py:11: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working from collections import Mapping, MutableMapping tests/test_tokencache.py::SimpleTokenCacheTest::test_get_set_del /private/tmp/flickrapi/tests/test_tokencache.py:14: DeprecationWarning: Please use assertEqual instead. self.assertEquals(self.tc.token, 'nümbér') tests/test_tokencache.py::TokenCacheTest::test_get_set_del /private/tmp/flickrapi/tests/test_tokencache.py:44: DeprecationWarning: Please use assertEqual instead. self.assertEquals(self.tc.token, u'nümbér') tests/test_tokencache.py::TokenCacheTest::test_get_set_del /private/tmp/flickrapi/tests/test_tokencache.py:46: DeprecationWarning: Please use assertEqual instead. self.assertEquals(on_disk.decode('utf8'), u'nümbér') tests/test_tokencache.py::TokenCacheTest::test_get_set_del /private/tmp/flickrapi/tests/test_tokencache.py:50: DeprecationWarning: Please use assertEqual instead. self.assertEquals(self.tc.token, u'nümbér') tests/test_tokencache.py::TokenCacheTest::test_username /private/tmp/flickrapi/tests/test_tokencache.py:69: DeprecationWarning: Please use assertNotEqual instead. self.assertNotEquals(tc_path, user_path) tests/test_tokencache.py::OAuthTokenCache::test_get_set_del /private/tmp/flickrapi/tests/test_tokencache.py:99: DeprecationWarning: Please use assertEqual instead. self.assertEquals(self.tc.token.token, u'nümbér') tests/test_tokencache.py::OAuthTokenCache::test_get_set_del /private/tmp/flickrapi/tests/test_tokencache.py:103: DeprecationWarning: Please use assertEqual instead. self.assertEquals(self.tc.token.token, u'nümbér') tests/test_tokencache.py::OAuthTokenCache::test_get_set_del /private/tmp/flickrapi/tests/test_tokencache.py:104: DeprecationWarning: Please use assertEqual instead. self.assertEquals(self.tc.token.token_secret, u'səcret-tøken') tests/test_tokencache.py::OAuthTokenCache::test_get_set_del /private/tmp/flickrapi/tests/test_tokencache.py:105: DeprecationWarning: Please use assertEqual instead. self.assertEquals(self.tc.token.access_level, u'read') tests/test_tokencache.py::OAuthTokenCache::test_get_set_del /private/tmp/flickrapi/tests/test_tokencache.py:106: DeprecationWarning: Please use assertEqual instead. self.assertEquals(self.tc.token.fullname, u'My Full Name™') tests/test_tokencache.py::OAuthTokenCache::test_get_set_del /private/tmp/flickrapi/tests/test_tokencache.py:107: DeprecationWarning: Please use assertEqual instead. self.assertEquals(self.tc.token.username, u'üsernåme') tests/test_tokencache.py::OAuthTokenCache::test_get_set_del /private/tmp/flickrapi/tests/test_tokencache.py:108: DeprecationWarning: Please use assertEqual instead. self.assertEquals(self.tc.token.user_nsid, u'user—nsid') -- Docs: https://docs.pytest.org/en/latest/warnings.html ===Flaky Test Report=== ===End Flaky Test Report=== ========================================== 7 failed, 35 passed, 14 warnings in 5.79s ==========================================
For example, see PR https://github.com/sybrenstuvel/flickrapi/pull/124 which only edits the README.
Looks like some photos and albums no longer exist on Flickr.
I expect it's because Flickr have restricted free accounts to 1,000 photos and deleted the rest.