CINXE.COM
The surprising utility of a Flickr URL parser - Flickr Foundation
<!DOCTYPE html> <html lang="en-US"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="profile" href="http://gmpg.org/xfn/11"> <link rel="stylesheet" href="https://use.typekit.net/phk3iud.css"> <meta name='robots' content='index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1' /> <style>img:is([sizes="auto" i], [sizes^="auto," i]) { contain-intrinsic-size: 3000px 1500px }</style> <!-- This site is optimized with the Yoast SEO plugin v19.0 - https://yoast.com/wordpress/plugins/seo/ --> <title>The surprising utility of a Flickr URL parser - Flickr Foundation</title> <link rel="canonical" href="https://www.flickr.org/the-surprising-utility-of-a-flickr-url-parser/" /> <meta property="og:locale" content="en_US" /> <meta property="og:type" content="article" /> <meta property="og:title" content="The surprising utility of a Flickr URL parser - Flickr Foundation" /> <meta property="og:description" content="We’ve made a library that knows how to read lots of different forms of Flickr.com URL." /> <meta property="og:url" content="https://www.flickr.org/the-surprising-utility-of-a-flickr-url-parser/" /> <meta property="og:site_name" content="Flickr Foundation" /> <meta property="article:published_time" content="2024-06-06T09:49:47+00:00" /> <meta property="article:modified_time" content="2024-06-11T09:29:10+00:00" /> <meta property="og:image" content="https://www.flickr.org/wp-content/uploads/sites/4/2024/06/4727552068_598d44f352_k.jpg" /> <meta property="og:image:width" content="2047" /> <meta property="og:image:height" content="1367" /> <meta property="og:image:type" content="image/jpeg" /> <meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:creator" content="@flickrfdn" /> <meta name="twitter:site" content="@flickrfdn" /> <meta name="twitter:label1" content="Written by" /> <meta name="twitter:data1" content="alex" /> <meta name="twitter:label2" content="Est. reading time" /> <meta name="twitter:data2" content="3 minutes" /> <script type="application/ld+json" class="yoast-schema-graph">{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://www.flickr.org/#organization","name":"Flickr Foundation","url":"https://www.flickr.org/","sameAs":["https://twitter.com/flickrfdn"],"logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https://www.flickr.org/#/schema/logo/image/","url":"https://www.flickr.org/wp-content/uploads/sites/4/2022/10/flickr_og.jpg","contentUrl":"https://www.flickr.org/wp-content/uploads/sites/4/2022/10/flickr_og.jpg","width":1200,"height":627,"caption":"Flickr Foundation"},"image":{"@id":"https://www.flickr.org/#/schema/logo/image/"}},{"@type":"WebSite","@id":"https://www.flickr.org/#website","url":"https://www.flickr.org/","name":"Flickr Foundation","description":"flickr.org","publisher":{"@id":"https://www.flickr.org/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://www.flickr.org/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"ImageObject","inLanguage":"en-US","@id":"https://www.flickr.org/the-surprising-utility-of-a-flickr-url-parser/#primaryimage","url":"https://www.flickr.org/wp-content/uploads/sites/4/2024/06/4727552068_598d44f352_k.jpg","contentUrl":"https://www.flickr.org/wp-content/uploads/sites/4/2024/06/4727552068_598d44f352_k.jpg","width":2047,"height":1367},{"@type":"WebPage","@id":"https://www.flickr.org/the-surprising-utility-of-a-flickr-url-parser/#webpage","url":"https://www.flickr.org/the-surprising-utility-of-a-flickr-url-parser/","name":"The surprising utility of a Flickr URL parser - Flickr Foundation","isPartOf":{"@id":"https://www.flickr.org/#website"},"primaryImageOfPage":{"@id":"https://www.flickr.org/the-surprising-utility-of-a-flickr-url-parser/#primaryimage"},"datePublished":"2024-06-06T09:49:47+00:00","dateModified":"2024-06-11T09:29:10+00:00","breadcrumb":{"@id":"https://www.flickr.org/the-surprising-utility-of-a-flickr-url-parser/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https://www.flickr.org/the-surprising-utility-of-a-flickr-url-parser/"]}]},{"@type":"BreadcrumbList","@id":"https://www.flickr.org/the-surprising-utility-of-a-flickr-url-parser/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://www.flickr.org/"},{"@type":"ListItem","position":2,"name":"The surprising utility of a Flickr URL parser"}]},{"@type":"Article","@id":"https://www.flickr.org/the-surprising-utility-of-a-flickr-url-parser/#article","isPartOf":{"@id":"https://www.flickr.org/the-surprising-utility-of-a-flickr-url-parser/#webpage"},"author":{"@id":"https://www.flickr.org/#/schema/person/e611399ef72c9530701bff3e7a887c2d"},"headline":"The surprising utility of a Flickr URL parser","datePublished":"2024-06-06T09:49:47+00:00","dateModified":"2024-06-11T09:29:10+00:00","mainEntityOfPage":{"@id":"https://www.flickr.org/the-surprising-utility-of-a-flickr-url-parser/#webpage"},"wordCount":609,"publisher":{"@id":"https://www.flickr.org/#organization"},"image":{"@id":"https://www.flickr.org/the-surprising-utility-of-a-flickr-url-parser/#primaryimage"},"thumbnailUrl":"https://www.flickr.org/wp-content/uploads/sites/4/2024/06/4727552068_598d44f352_k.jpg","keywords":["code","open source","tool"],"articleSection":["Content Mobility"],"inLanguage":"en-US"},{"@type":"Person","@id":"https://www.flickr.org/#/schema/person/e611399ef72c9530701bff3e7a887c2d","name":"alex","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https://www.flickr.org/#/schema/person/image/","url":"https://secure.gravatar.com/avatar/9bab642b4b0aa246ca47feac60aad17d?s=96&d=mm&r=g","contentUrl":"https://secure.gravatar.com/avatar/9bab642b4b0aa246ca47feac60aad17d?s=96&d=mm&r=g","caption":"alex"},"description":"Tech Lead at the Flickr Foundation.","sameAs":["https://alexwlchan.net"],"url":"https://www.flickr.org/author/alex/"}]}</script> <!-- / Yoast SEO plugin. --> <link rel='dns-prefetch' href='//stats.wp.com' /> <link rel='stylesheet' id='all-css-0' href='https://www.flickr.org/wp-includes/css/dist/block-library/style.min.css?m=1732206022g' type='text/css' media='all' /> <link rel='stylesheet' id='all-css-2' href='https://www.flickr.org/_static/??-eJzTLy/QzcxLzilNSS3WzyrWz01NyUxMzUnNTc0rQeEU5CRWphbp5qSmJyZX6uVm5uklFxfr6OPTDpRD5sM02efaGpobGxkZmBkYGQMARIMu1Q==' type='text/css' media='all' /> <style id='jetpack-sharing-buttons-style-inline-css'> .jetpack-sharing-buttons__services-list{display:flex;flex-direction:row;flex-wrap:wrap;gap:0;list-style-type:none;margin:5px;padding:0}.jetpack-sharing-buttons__services-list.has-small-icon-size{font-size:12px}.jetpack-sharing-buttons__services-list.has-normal-icon-size{font-size:16px}.jetpack-sharing-buttons__services-list.has-large-icon-size{font-size:24px}.jetpack-sharing-buttons__services-list.has-huge-icon-size{font-size:36px}@media print{.jetpack-sharing-buttons__services-list{display:none!important}}.editor-styles-wrapper .wp-block-jetpack-sharing-buttons{gap:0;padding-inline-start:0}ul.jetpack-sharing-buttons__services-list.has-background{padding:1.25em 2.375em} </style> <style id='classic-theme-styles-inline-css'> /*! This file is auto-generated */ .wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none} </style> <style id='global-styles-inline-css'> :root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);}:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;} :where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;} :where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;} :root :where(.wp-block-pullquote){font-size: 1.5em;line-height: 1.6;} </style> <link rel='stylesheet' id='all-css-8' href='https://www.flickr.org/_static/??-eJytzMENgCAMQNGFxFqj8WScRbAQIhYiGNYX1BE8v58POQjlOREnCO4yliNkkslrTSTMFs7CfrdUq/hUl3RWgYoRPnFrFpa1Fy+1hRr481vzel2OGaceEYduxBvZsUSt' type='text/css' media='all' /> <style id='cookie-law-info-gdpr-inline-css'> .cli-modal-content, .cli-tab-content { background-color: #ffffff; }.cli-privacy-content-text, .cli-modal .cli-modal-dialog, .cli-tab-container p, a.cli-privacy-readmore { color: #000000; }.cli-tab-header { background-color: #f2f2f2; }.cli-tab-header, .cli-tab-header a.cli-nav-link,span.cli-necessary-caption,.cli-switch .cli-slider:after { color: #000000; }.cli-switch .cli-slider:before { background-color: #ffffff; }.cli-switch input:checked + .cli-slider:before { background-color: #ffffff; }.cli-switch .cli-slider { background-color: #e3e1e8; }.cli-switch input:checked + .cli-slider { background-color: #28a745; }.cli-modal-close svg { fill: #000000; }.cli-tab-footer .wt-cli-privacy-accept-all-btn { background-color: #00acad; color: #ffffff}.cli-tab-footer .wt-cli-privacy-accept-btn { background-color: #00acad; color: #ffffff}.cli-tab-header a:before{ border-right: 1px solid #000000; border-bottom: 1px solid #000000; } </style> <script type="text/javascript" id="cookie-law-info-js-extra"> /* <![CDATA[ */ var Cli_Data = {"nn_cookie_ids":[],"non_necessary_cookies":[],"cookielist":{"necessary":{"id":1219,"status":true,"priority":0,"title":"Necessary","strict":true,"default_state":false,"ccpa_optout":false,"loadonstart":false},"functional":{"id":1220,"status":true,"priority":5,"title":"Functional","strict":false,"default_state":false,"ccpa_optout":false,"loadonstart":false},"performance":{"id":1221,"status":true,"priority":4,"title":"Performance","strict":false,"default_state":false,"ccpa_optout":false,"loadonstart":false},"analytics":{"id":1222,"status":true,"priority":3,"title":"Analytics","strict":false,"default_state":false,"ccpa_optout":false,"loadonstart":false},"advertisement":{"id":1223,"status":true,"priority":2,"title":"Advertisement","strict":false,"default_state":false,"ccpa_optout":false,"loadonstart":false},"others":{"id":1224,"status":true,"priority":1,"title":"Others","strict":false,"default_state":false,"ccpa_optout":false,"loadonstart":false}},"ajax_url":"https:\/\/www.flickr.org\/wp-admin\/admin-ajax.php","current_lang":"en","security":"7c526388b6","eu_countries":["GB"],"geoIP":"disabled","use_custom_geolocation_api":"","custom_geolocation_api":"https:\/\/geoip.cookieyes.com\/geoip\/checker\/result.php","consentVersion":"1","strictlyEnabled":["necessary","obligatoire"],"cookieDomain":"","privacy_length":"250","ccpaEnabled":"","ccpaRegionBased":"","ccpaBarEnabled":"","ccpaType":"gdpr","triggerDomRefresh":"","secure_cookies":""}; var log_object = {"ajax_url":"https:\/\/www.flickr.org\/wp-admin\/admin-ajax.php"}; /* ]]> */ </script> <script type="text/javascript" src="https://www.flickr.org/_static/??-eJyVjEsOAiEQBS8kMK2jroxnmU9DGqFBPiHeXkaNSxO3Ve+ValEsgQtyUdFVQ5yVvVdMD1HjOhVMyn7JQZ7kID2xtHmn/nl6MqmjXhh/FxrOJWiNKMwaU9fhRrit8mtVZ0fL1v0INzVBrIN4m169+guc9wAwDkewTwphUMw=" ></script><link rel="https://api.w.org/" href="https://www.flickr.org/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://www.flickr.org/wp-json/wp/v2/posts/7244" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://www.flickr.org/xmlrpc.php?rsd" /> <meta name="generator" content="WordPress 6.7.1" /> <link rel='shortlink' href='https://www.flickr.org/?p=7244' /> <style>img#wpstats{display:none}</style> <style type="text/css" id="wp-custom-css"> .hero-square-image .large-7 { overflow: hidden; } /* Alex, 7 February 2024 * This is a CSS class I'm using so I can include the 1024w copy of a Flickr photo in a post without it taking up the whole page. */ img.flickr_large { width: 512px; max-width: 100%; } /* Alex, 25 March 2024 * I'm using this in the post introducing the new Flickr Commons Explorer. */ div.grid_2up { display: grid; grid-gap: 1em; grid-template-columns: 1fr 1fr; margin-bottom: 1em; } @media screen and (max-width: 500px) { div.grid_2up { grid-template-columns: auto; } div.grid_2up p:not(:last-child) { margin-bottom: 0; } } /* Alex, 12 November 2024 * I'm using this to blat the "Contact" heading from the footer, which we're no longer using * * At time of writing, this was the only `div` with the `connect` class. * * See https://flickrfoundation.slack.com/archives/C05BQNG4CLQ/p1731414328094969 */ div.connect { display: none; } </style> <link rel="apple-touch-icon" sizes="180x180" href="/wp-content/themes/flickr-foundation/assets/dist/favicon/apple-touch-icon.png"> <link rel="icon" type="image/png" sizes="32x32" href="/wp-content/themes/flickr-foundation/assets/dist/favicon/favicon-32x32.png"> <link rel="icon" type="image/png" sizes="16x16" href="/wp-content/themes/flickr-foundation/assets/dist/favicon/favicon-16x16.png"> <link rel="manifest" webcrossorigin="use-credentials" href="/wp-content/themes/flickr-foundation/assets/dist/favicon/site.webmanifest"> <link rel="mask-icon" href="/wp-content/themes/flickr-foundation/assets/dist/favicon/safari-pinned-tab.svg" color="#e0599a"> <link rel="shortcut icon" href="/wp-content/themes/flickr-foundation/assets/dist/favicon/favicon.ico"> <meta name="msapplication-TileColor" content="#ffffff"> <meta name="msapplication-config" content="/wp-content/themes/flickr-foundation/assets/dist/favicon/browserconfig.xml"> <meta name="theme-color" content="#ffffff"> <!-- Link any any 3rd Part fonts --> <!-- Styles --> <link rel="stylesheet" type="text/css" media="all" href="https://www.flickr.org/wp-content/themes/flickr-foundation/assets/dist/css/app.min.css?v=202212071843"> <!-- /Styles --> <!-- production - 202212071843 --><!-- Google Tag Manager --> <script type="text/plain" data-cli-class="cli-blocker-script" data-cli-label="Google Tag Manager" data-cli-script-type="analytics" data-cli-block="true" data-cli-block-if-ccpa-optout="false" data-cli-element-position="head">(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-MNPT6Q7');</script> <!-- End Google Tag Manager --> <meta name=“google-site-verification” content=“iPx1-rGG7Mg6t5vUlZMvr8G61IFLzogIV5iI11wdN2o” /> <script>var filter_list_params = [];</script> </head> <body class="default-menu "> <!-- Google Tag Manager (noscript) --> <noscript><iframe data-cli-class="cli-blocker-script" data-cli-label="Google Tag Manager" data-cli-script-type="analytics" data-cli-block="true" data-cli-block-if-ccpa-optout="false" data-cli-element-position="body" data-cli-placeholder="Accept <a class='cli_manage_current_consent'>Analytics</a> cookies to view the content." data-cli-src="https://www.googletagmanager.com/ns.html?id=GTM-MNPT6Q7" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> <!-- End Google Tag Manager (noscript) --> <header id="global-header" class="global-header global-header-default" style="opacity: 0;" > <div class="grid-container"> <div class="grid-x grid-padding-x"> <div class="hamburger hamburger--stand"> <div class="hamburger-box"> <div class="hamburger-inner"></div> </div> </div> <div class="cell medium-12 logo-wrapper"> <div class="menu-area"> <span class="header-logo"> <a href="https://www.flickr.org" class="icon"><img src="https://www.flickr.org/wp-content/themes/flickr-foundation/assets/dist/svgs/flickr-logo-new.png" alt="Flickr Foundation"></a> </span> <nav class="menus"> <ul class="menu main vertical large-horizontal dropdown" data-dropdown-menu data-force-follow="false"> <li><a href="https://www.flickr.org/about-us/">About Us</a></li> <li><a href="https://www.flickr.org/blog/">Blog</a></li> <li><a href="https://www.flickr.org/events/">Events</a></li> <li><a href="https://www.flickr.org/programs/">Programs</a></li> <li><a href="https://www.flickr.org/donate/">Donate</a></li> </ul> </nav> </div> </div> </div> </div> </header> <div class="grid-container breadcrumb_container"> <div class="grid-x"> <div class="cell medium-12 breadcrumb_page"><span><span><a href="/">Home</a> > <span><a href="/blog">Blog</a> > <span class="breadcrumb_last" aria-current="page">The surprising utility of a Flickr URL parser</span></span></span></div> </div> </div> <main class="site-content"> <section class="header "> <div class="grid-container"> <div class="grid-x"> <div class="cell "> <h1 class="call-out">The surprising utility of a Flickr URL parser</h1> </div> </div> </div> </section> <section class="copy copy-text color-transparent-bg"> <div class="grid-container"> <div class="grid-x align-center"> <div class="cell large-8"> <a href="https://www.flickr.com/photos/usnationalarchives/4727552068/"><img decoding="async" src="https://live.staticflickr.com/1337/4727552068_ac3cbe50f8_b.jpg"></a></p> <p>In my first week at the Flickr Foundation, we made a toy called <a href="https://www.flickr.org/introducing-flinumeratr-our-first-toy/">Flinumeratr</a>. This is a small web app that takes a Flickr URL as input, and shows you all the photos which are present at that URL.</p> <p>As part of this toy, I made a Python library which parses Flickr URLs, and tells you what the URL points to – a single photo, an album, a gallery, and so on. Initially it just handled fairly common patterns, the sort of URLs that you’d encounter if you use Flickr today, but it’s grown to handle more complicated URLs.</p> <pre style="margin-left: 1em;margin-bottom: 1rem">$ flickr_url_parser "https://www.flickr.com/photos/sdasmarchives/50567413447" {"type": "single_photo", "photo_id": "50567413447"} $ flickr_url_parser "https://www.flickr.com/photos/aljazeeraenglish/albums/72157626164453131" {"type": "album", "user_url": "https://www.flickr.com/photos/aljazeeraenglish", "album_id": "72157626164453131", "page": 1} $ flickr_url_parser "https://www.flickr.com/photos/blueminds/page3" {"type": "user", "user_url": "https://www.flickr.com/photos/blueminds"}</pre> <p>The implementation is fairly straightforward: I use the <a href="https://hyperlink.readthedocs.io/en/latest/">hyperlink library</a> to parse the URL text into a structured object, then I compare that object to a list of known patterns. Does it look like this type of URL? Or this type of URL? Or this type of URL? And so on.</p> <p>You can run this library as a command-line tool, or call it from Python – there are instructions in <a href="https://github.com/flickr-foundation/flickr-url-parser">the GitHub README</a>.</p> </p> <h2 style="margin-top: 2em;margin-bottom: 0.4em">There are lots of URL variants</h2> <p>In my second week and beyond, I started to discover more variants, which should probably be expected in 20-year old software! I’ve been looking into collections of Flickr URLs that have been built up over multiple years, and although most of these URLs follow common patterns, there are lots of unusual variants in the long tail.</p> <p>Some of these are pretty simple. For example, the URL to a user’s photostream can be formed using your Flickr user NSID or your path alias, so <a href="https://www.flickr.com/photos/197130754@N07/" style="font-weight: normal">flickr.com/photos/<strong>197130754@N07</strong>/</a> and <a href="https://www.flickr.com/photos/flickrfoundation/" style="font-weight: normal">flickr.com/photos/<strong>flickrfoundation</strong>/</a> point to the same page.</p> <p>Others are more complicated, and you can trace the history of Flickr through some of the older URLs. Some of my favorites include:</p> <ul> <li> <p>Raw JPEG files, on live.staticflickr.com, farm1.static.flickr.com, and several other subdomains.</p> </li> <li> <p>Links with a .gne suffix, like <a href="http://www.flickr.com/photo_edit.gne?id=3435827496">www.flickr.com/photo_edit.gne?id=3435827496</a> (from <a href="https://commons.wikimedia.org/wiki/File:The_Peace_Hat_and_President_Chester_Arthur,_1829_-_1886_(3435827496).jpg">Wikimedia Commons</a>). This acronym stands for Game Neverending, the online game out of which Flickr was born.</p> </li> <li> <p>A Flash video player called stewart.swf, which might be a reference to Stewart Butterfield, one of the cofounders of Flickr.</p> </li> </ul> <p>I’ve added support for every variant of Flickr URL to the parsing library – if you want to see a complete list, check out <a href="https://github.com/Flickr-Foundation/flickr-url-parser/blob/main/tests/test_flickr_url_parser.py">the tests</a>. I need over a hundred tests to check all the variants are parsed correctly.</p> </p> <h2 style="margin-top: 2em;margin-bottom: 0.4em">Where we’re using it</h2> <p>I’ve been able to reuse this parsing code in a bunch of different projects, including:</p> <ul> <li> <p>Building a similar “get photos at this URL” interface in <a href="https://www.flickr.org/tools/flickypedia/">Flickypedia</a>.</p> </li> <li> <p>Looking for Flickr photo URLs in <a href="https://commons.wikimedia.org/wiki/Commons:Welcome">Wikimedia Commons</a>. This is for detecting Flickr photos which have already been uploaded to Commons, which I’ll describe more in another post.</p> </li> <li> <p>Finding Flickr pages which have been captured in the <a href="http://web.archive.org/">Wayback Machine</a> – I can <a href="https://alexwlchan.net/til/2024/get-a-list-of-captures-from-the-wayback-machine/">get a list of saved Flickr URLs</a>, and then see what sort of pages have actually been saved.</p> </li> </ul> <p>When I created the library, I wasn’t sure if this code was actually worth extracting as a standalone package – would I use it again, or was this a premature abstraction?</p> <p>Now that I’ve seen more of the diversity of Flickr URLs and found more uses for this code, I’m much happier with the decision to abstract it into a standalone library. Now we only need to add support for each new URL variant once, and then all our projects can benefit.</p> <p>If you want to try the Flickr URL parser yourself, all the code is <a href="https://github.com/flickr-foundation/flickr-url-parser">open source on GitHub</a>.</p> </div> </div> </div> </section> <section class="copy copy-text"><div class="grid-container"><div class="grid-x align-center"><div class="cell medium-10"> <p></p> </div></div></div></section> </main> <!-- /.site-content --> <footer class="global-footer color-primary-bg"> <div class="grid-container"> <div class="grid-x grid-padding-x grid-padding-y"> <!-- 1. Footer Logo and Social Links Start --> <div class="cell medium-3 small-order-1 medium-order-1 logo-footer-wrapper"> <span class="footer-logo"> <a href="https://www.flickr.org" class="icon"><img src="https://www.flickr.org/wp-content/themes/flickr-foundation/assets/dist/svgs/footer_logo.svg" alt="Flickr Foundation"></a> </span> <div class="footer_logo_content"> <h5>The 501(c)(3) Flickr Foundation exists to keep Flickr pictures visible for 100 years, preserving our shared visual commons for future generations.</h5> </div> </div> <!-- Footer Logo and Social Links End --> <!-- 2. Footer Schema Address Start --> <!-- Footer Schema Address End --> <!-- 3. Footer Definition lists Start --> <div class="cell small-6 medium-2 small-order-5 medium-order-3"> <div class="nav_wrapper"> <nav> <dl> <dd><a href="https://www.flickr.org/about-us/" class=" menu-item menu-item-type-post_type menu-item-object-page">About Us</a></dd><dd><a href="https://www.flickr.org/about-us/the-100-year-plan/" class=" menu-item menu-item-type-post_type menu-item-object-page">The 100-year plan</a></dd><dd><a href="https://www.flickr.org/about-us/people/" class=" menu-item menu-item-type-post_type menu-item-object-page">People</a></dd><dd><a href="https://www.flickr.org/about-us/partners/" class=" menu-item menu-item-type-post_type menu-item-object-page">Partners</a></dd><dd><a href="https://www.flickr.org/about-us/publications/" class=" menu-item menu-item-type-post_type menu-item-object-page">Publications</a></dd><dd><a href="https://www.flickr.org/tools/" class=" menu-item menu-item-type-post_type menu-item-object-page">Tools</a></dd><dd><a href="https://www.flickr.org/about-us/people/jobs/" class=" menu-item menu-item-type-post_type menu-item-object-page">Working at flickr.org</a></dd> </dl> </nav> </div> </div> <div class="cell small-6 medium-2 small-order-5 medium-order-3"> <div class="nav_wrapper"> <nav> <dl> <dd><a href="https://www.flickr.org/blog/" class=" menu-item menu-item-type-post_type menu-item-object-page">Blog</a></dd><dd><a href="https://www.flickr.org/progress-update-on-the-flickr-commons-revitalization/" class=" menu-item menu-item-type-post_type menu-item-object-post">→ Progress Update on the Flickr Commons Revitalization</a></dd><dd><a href="https://www.flickr.org/flickr-com-is-a-gathering-of-memoryinsights-from-the-flickr-foundations-first-conversation/" class=" menu-item menu-item-type-post_type menu-item-object-post">→ “Flickr.com is a Gathering of Memory”</a></dd><dd><a href="https://www.flickr.org/making-some-marvelous-maps/" class=" menu-item menu-item-type-post_type menu-item-object-post">→ Making some marvelous maps for Flickr Commons</a></dd> </dl> </nav> </div> </div> <div class="cell small-6 medium-2 small-order-5 medium-order-3"> <div class="nav_wrapper"> <nav> <dl> <dd><a href="https://www.flickr.org/events/" class=" menu-item menu-item-type-post_type menu-item-object-page">Events</a></dd><dd><a href="https://www.flickr.org/upcoming-events/" class=" menu-item menu-item-type-post_type menu-item-object-page">Upcoming events</a></dd><dd><a href="https://www.flickr.org/past-events/" class=" menu-item menu-item-type-post_type menu-item-object-page">Past events</a></dd> </dl> </nav> </div> </div> <div class="cell small-6 medium-2 small-order-5 medium-order-3"> <div class="nav_wrapper"> <nav> <dl> <dd><a href="https://www.flickr.org/programs/" class=" menu-item menu-item-type-post_type menu-item-object-page">Programs</a></dd><dd><a href="https://www.flickr.org/programs/flickr-commons/" class=" menu-item menu-item-type-post_type menu-item-object-programs">Flickr Commons</a></dd><dd><a href="https://www.flickr.org/programs/content-mobility/" class=" menu-item menu-item-type-post_type menu-item-object-programs">Content Mobility</a></dd><dd><a href="https://www.flickr.org/programs/creative-archives/" class=" menu-item menu-item-type-post_type menu-item-object-programs">Creative Archives</a></dd><dd><a href="https://www.flickr.org/programs/new-curators/" class=" menu-item menu-item-type-post_type menu-item-object-programs">New Curators</a></dd> </dl> </nav> </div> </div> <!-- Footer Definition lists End --> <div class="cell medium-4 small-order-2 medium-order-4 medium-offset-3"> <div class="connect"> <dl> <dt>Contact</dt> </dl> </div> </div> <div class="cell medium-4 small-order-3 medium-order-5"> <div class="footer_form"> </div> </div> </div> </div> <div class="grid-container"> <div class="grid-x post_footer"> <!-- 4. Footer Utility Menu & Copyright Text Start --> <div class="cell medium-12"> <nav> <ul class="menu simple"><li><a href="https://www.flickr.org/contact-us/">Contact Us</a></li> <li><a href="https://www.flickr.org/newsletter/">Join the Mailing List</a></li> <li><a href="https://www.flickr.org/donate/">Donate</a></li> <li><a href="https://www.flickr.org/about-us/privacy-policy/">Privacy policy</a></li> </ul> </nav> <p class="medium-text-right"><p>The content on <a href="#">flickr.org</a> is shared under a <a href="https://creativecommons.org/licenses/by/4.0/">CC-BY 4.0</a> license. <a href="https://flickr.org/feed/">RSS</a>.</p> </p> </div> <!-- Footer Utility Menu & Copyright Text End --> </div> </div> </footer> <!-- Scripts --> <script type="text/plain" data-cli-class="cli-blocker-script" data-cli-label="Vimeo embed" data-cli-script-type="functional" data-cli-block="true" data-cli-block-if-ccpa-optout="false" data-cli-element-position="body" src="https://player.vimeo.com/api/player.js" defer></script> <script src="https://www.youtube.com/iframe_api"></script> <div class="wt-cli-cookie-bar-container" data-nosnippet="true"><!--googleoff: all--><div id="cookie-law-info-bar" role="dialog" aria-live="polite" aria-label="cookieconsent" aria-describedby="wt-cli-cookie-banner" data-cli-geo-loc="0" style="text-align:left; padding:15px 30px; border-color:rgb(51, 51, 51); font-size:10px; padding-bottom:20px;" class="wt-cli-cookie-bar"><div class="cli-wrapper"><h5 role="heading" aria-level="5" tabindex="0" id="wt-cli-cookie-banner-title" style="display:block; background-color:rgba(0, 0, 0, 0); color:rgb(51, 51, 51); border-color:rgb(51, 51, 51); font-size:15px; font-weight:600;">Hi. We use some cookies on this website.</h5><span id="wt-cli-cookie-banner"><div class="cli-bar-container cli-style-v2"><div class="cli-bar-message">You can accept or reject all cookies, or choose 'Cookie Settings' to give consent for specific types of cookie. Thanks!</div><div class="cli-bar-btn_container"><a id="wt-cli-settings-btn" tabindex="0" role='button' style="border-bottom:1px solid rgb(0, 0, 0); text-decoration:none; margin-left:20px; border-top-color:rgb(0, 0, 0); border-right-color:rgb(0, 0, 0); border-left-color:rgb(0, 0, 0);" class="wt-cli-element medium cli-plugin-button cli-plugin-main-button cli_settings_button" >Cookie settings</a><a id="wt-cli-reject-btn" tabindex="0" role='button' style="margin:5px 5px 5px 25px; border-radius:5px; padding:8px 25px; border-color:rgb(0, 0, 0);" class="wt-cli-element medium cli-plugin-button cli-plugin-main-button cookie_action_close_header_reject cli_action_button" data-cli_action="reject">REJECT</a><a id="wt-cli-accept-all-btn" tabindex="0" role='button' style="margin:5px 5px 5px 0; border-radius:5px; padding:8px 25px; margin-top:20px; border-color:rgb(0, 0, 0);" data-cli_action="accept_all" class="wt-cli-element medium cli-plugin-button wt-cli-accept-all-btn cookie_action_close_header cli_action_button" >ACCEPT ALL</a></div></div></span></div></div><div tabindex="0" id="cookie-law-info-again" style="display:none;"><span id="cookie_hdr_showagain">Manage consent</span></div><div class="cli-modal" id="cliSettingsPopup" role="dialog" aria-labelledby="wt-cli-privacy-title" tabindex="-1" aria-hidden="true"> <div class="cli-modal-dialog" role="document"> <div class="cli-modal-content cli-bar-popup"> <button aria-label="Close" type="button" class="cli-modal-close" id="cliModalClose"> <svg class="" viewBox="0 0 24 24"><path d="M19 6.41l-1.41-1.41-5.59 5.59-5.59-5.59-1.41 1.41 5.59 5.59-5.59 5.59 1.41 1.41 5.59-5.59 5.59 5.59 1.41-1.41-5.59-5.59z"></path><path d="M0 0h24v24h-24z" fill="none"></path></svg> <span class="wt-cli-sr-only">Close</span> </button> <div class="cli-modal-body"> <div class="wt-cli-element cli-container-fluid cli-tab-container"> <div class="cli-row"> <div class="cli-col-12 cli-align-items-stretch cli-px-0"> <div class="cli-privacy-overview"> <h4 id='wt-cli-privacy-title'>Privacy Overview</h4> <div class="cli-privacy-content"> <div class="cli-privacy-content-text">This website uses cookies to improve your experience while you navigate through the website. Out of these cookies, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may have an effect on your browsing experience.</div> </div> <a id="wt-cli-privacy-readmore" tabindex="0" role="button" class="cli-privacy-readmore" data-readmore-text="Show more" data-readless-text="Show less"></a> </div> </div> <div class="cli-col-12 cli-align-items-stretch cli-px-0 cli-tab-section-container" role="tablist"> <div class="cli-tab-section"> <div class="cli-tab-header"> <a id="wt-cli-tab-link-necessary" tabindex="0" role="tab" aria-expanded="false" aria-describedby="wt-cli-tab-necessary" aria-controls="wt-cli-tab-necessary" class="cli-nav-link cli-settings-mobile" data-target="necessary" data-toggle="cli-toggle-tab"> Necessary </a> <div class="wt-cli-necessary-checkbox"> <input type="checkbox" class="cli-user-preference-checkbox" id="wt-cli-checkbox-necessary" aria-label="Necessary" data-id="checkbox-necessary" checked="checked" /> <label class="form-check-label" for="wt-cli-checkbox-necessary"> Necessary </label> </div> <span class="cli-necessary-caption"> Always Enabled </span> </div> <div class="cli-tab-content"> <div id="wt-cli-tab-necessary" tabindex="0" role="tabpanel" aria-labelledby="wt-cli-tab-link-necessary" class="cli-tab-pane cli-fade" data-id="necessary"> <div class="wt-cli-cookie-description">Necessary cookies are absolutely essential for the website to function properly. These cookies ensure basic functionalities and security features of the website, anonymously. <table class="wt-cli-element cookielawinfo-row-cat-table cookielawinfo-winter"><thead><tr><th scope="col" class="cookielawinfo-column-1">Cookie</th><th scope="col" class="cookielawinfo-column-3">Duration</th><th scope="col" class="cookielawinfo-column-4">Description</th></tr></thead><tbody><tr class="cookielawinfo-row"><td class="cookielawinfo-column-1">cookielawinfo-checkbox-analytics</td><td class="cookielawinfo-column-3">11 months</td><td class="cookielawinfo-column-4">This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Analytics".</td></tr><tr class="cookielawinfo-row"><td class="cookielawinfo-column-1">cookielawinfo-checkbox-functional</td><td class="cookielawinfo-column-3">11 months</td><td class="cookielawinfo-column-4">The cookie is set by GDPR cookie consent to record the user consent for the cookies in the category "Functional".</td></tr><tr class="cookielawinfo-row"><td class="cookielawinfo-column-1">cookielawinfo-checkbox-necessary</td><td class="cookielawinfo-column-3">11 months</td><td class="cookielawinfo-column-4">This cookie is set by GDPR Cookie Consent plugin. The cookies is used to store the user consent for the cookies in the category "Necessary".</td></tr><tr class="cookielawinfo-row"><td class="cookielawinfo-column-1">cookielawinfo-checkbox-others</td><td class="cookielawinfo-column-3">11 months</td><td class="cookielawinfo-column-4">This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Other.</td></tr><tr class="cookielawinfo-row"><td class="cookielawinfo-column-1">cookielawinfo-checkbox-performance</td><td class="cookielawinfo-column-3">11 months</td><td class="cookielawinfo-column-4">This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Performance".</td></tr><tr class="cookielawinfo-row"><td class="cookielawinfo-column-1">viewed_cookie_policy</td><td class="cookielawinfo-column-3">11 months</td><td class="cookielawinfo-column-4">The cookie is set by the GDPR Cookie Consent plugin and is used to store whether or not user has consented to the use of cookies. It does not store any personal data.</td></tr></tbody></table></div> </div> </div> </div> <div class="cli-tab-section"> <div class="cli-tab-header"> <a id="wt-cli-tab-link-functional" tabindex="0" role="tab" aria-expanded="false" aria-describedby="wt-cli-tab-functional" aria-controls="wt-cli-tab-functional" class="cli-nav-link cli-settings-mobile" data-target="functional" data-toggle="cli-toggle-tab"> Functional </a> <div class="cli-switch"> <input type="checkbox" class="cli-user-preference-checkbox" id="wt-cli-checkbox-functional" aria-label="functional" data-id="checkbox-functional" role="switch" aria-controls="wt-cli-tab-link-functional" aria-labelledby="wt-cli-tab-link-functional" /> <label for="wt-cli-checkbox-functional" class="cli-slider" data-cli-enable="Enabled" data-cli-disable="Disabled"><span class="wt-cli-sr-only">functional</span></label> </div> </div> <div class="cli-tab-content"> <div id="wt-cli-tab-functional" tabindex="0" role="tabpanel" aria-labelledby="wt-cli-tab-link-functional" class="cli-tab-pane cli-fade" data-id="functional"> <div class="wt-cli-cookie-description">Functional cookies help to perform certain functionalities like sharing the content of the website on social media platforms, collect feedbacks, and other third-party features. </div> </div> </div> </div> <div class="cli-tab-section"> <div class="cli-tab-header"> <a id="wt-cli-tab-link-performance" tabindex="0" role="tab" aria-expanded="false" aria-describedby="wt-cli-tab-performance" aria-controls="wt-cli-tab-performance" class="cli-nav-link cli-settings-mobile" data-target="performance" data-toggle="cli-toggle-tab"> Performance </a> <div class="cli-switch"> <input type="checkbox" class="cli-user-preference-checkbox" id="wt-cli-checkbox-performance" aria-label="performance" data-id="checkbox-performance" role="switch" aria-controls="wt-cli-tab-link-performance" aria-labelledby="wt-cli-tab-link-performance" /> <label for="wt-cli-checkbox-performance" class="cli-slider" data-cli-enable="Enabled" data-cli-disable="Disabled"><span class="wt-cli-sr-only">performance</span></label> </div> </div> <div class="cli-tab-content"> <div id="wt-cli-tab-performance" tabindex="0" role="tabpanel" aria-labelledby="wt-cli-tab-link-performance" class="cli-tab-pane cli-fade" data-id="performance"> <div class="wt-cli-cookie-description">Performance cookies are used to understand and analyze the key performance indexes of the website which helps in delivering a better user experience for the visitors. </div> </div> </div> </div> <div class="cli-tab-section"> <div class="cli-tab-header"> <a id="wt-cli-tab-link-analytics" tabindex="0" role="tab" aria-expanded="false" aria-describedby="wt-cli-tab-analytics" aria-controls="wt-cli-tab-analytics" class="cli-nav-link cli-settings-mobile" data-target="analytics" data-toggle="cli-toggle-tab"> Analytics </a> <div class="cli-switch"> <input type="checkbox" class="cli-user-preference-checkbox" id="wt-cli-checkbox-analytics" aria-label="analytics" data-id="checkbox-analytics" role="switch" aria-controls="wt-cli-tab-link-analytics" aria-labelledby="wt-cli-tab-link-analytics" /> <label for="wt-cli-checkbox-analytics" class="cli-slider" data-cli-enable="Enabled" data-cli-disable="Disabled"><span class="wt-cli-sr-only">analytics</span></label> </div> </div> <div class="cli-tab-content"> <div id="wt-cli-tab-analytics" tabindex="0" role="tabpanel" aria-labelledby="wt-cli-tab-link-analytics" class="cli-tab-pane cli-fade" data-id="analytics"> <div class="wt-cli-cookie-description">Analytical cookies are used to understand how visitors interact with the website. These cookies help provide information on metrics the number of visitors, bounce rate, traffic source, etc. </div> </div> </div> </div> <div class="cli-tab-section"> <div class="cli-tab-header"> <a id="wt-cli-tab-link-advertisement" tabindex="0" role="tab" aria-expanded="false" aria-describedby="wt-cli-tab-advertisement" aria-controls="wt-cli-tab-advertisement" class="cli-nav-link cli-settings-mobile" data-target="advertisement" data-toggle="cli-toggle-tab"> Advertisement </a> <div class="cli-switch"> <input type="checkbox" class="cli-user-preference-checkbox" id="wt-cli-checkbox-advertisement" aria-label="advertisement" data-id="checkbox-advertisement" role="switch" aria-controls="wt-cli-tab-link-advertisement" aria-labelledby="wt-cli-tab-link-advertisement" /> <label for="wt-cli-checkbox-advertisement" class="cli-slider" data-cli-enable="Enabled" data-cli-disable="Disabled"><span class="wt-cli-sr-only">advertisement</span></label> </div> </div> <div class="cli-tab-content"> <div id="wt-cli-tab-advertisement" tabindex="0" role="tabpanel" aria-labelledby="wt-cli-tab-link-advertisement" class="cli-tab-pane cli-fade" data-id="advertisement"> <div class="wt-cli-cookie-description">Advertisement cookies are used to provide visitors with relevant ads and marketing campaigns. These cookies track visitors across websites and collect information to provide customized ads. </div> </div> </div> </div> <div class="cli-tab-section"> <div class="cli-tab-header"> <a id="wt-cli-tab-link-others" tabindex="0" role="tab" aria-expanded="false" aria-describedby="wt-cli-tab-others" aria-controls="wt-cli-tab-others" class="cli-nav-link cli-settings-mobile" data-target="others" data-toggle="cli-toggle-tab"> Others </a> <div class="cli-switch"> <input type="checkbox" class="cli-user-preference-checkbox" id="wt-cli-checkbox-others" aria-label="others" data-id="checkbox-others" role="switch" aria-controls="wt-cli-tab-link-others" aria-labelledby="wt-cli-tab-link-others" /> <label for="wt-cli-checkbox-others" class="cli-slider" data-cli-enable="Enabled" data-cli-disable="Disabled"><span class="wt-cli-sr-only">others</span></label> </div> </div> <div class="cli-tab-content"> <div id="wt-cli-tab-others" tabindex="0" role="tabpanel" aria-labelledby="wt-cli-tab-link-others" class="cli-tab-pane cli-fade" data-id="others"> <div class="wt-cli-cookie-description">Other uncategorized cookies are those that are being analyzed and have not been classified into a category as yet. </div> </div> </div> </div> </div> </div> </div> </div> <div class="cli-modal-footer"> <div class="wt-cli-element cli-container-fluid cli-tab-container"> <div class="cli-row"> <div class="cli-col-12 cli-align-items-stretch cli-px-0"> <div class="cli-tab-footer wt-cli-privacy-overview-actions"> <a id="wt-cli-privacy-save-btn" role="button" tabindex="0" data-cli-action="accept" class="wt-cli-privacy-btn cli_setting_save_button wt-cli-privacy-accept-btn cli-btn">Save & Accept</a> </div> </div> </div> </div> </div> </div> </div> </div> <div class="cli-modal-backdrop cli-fade cli-settings-overlay"></div> <div class="cli-modal-backdrop cli-fade cli-popupbar-overlay"></div> <!--googleon: all--></div> <script type="text/javascript"> /* <![CDATA[ */ cli_cookiebar_settings='{"animate_speed_hide":"500","animate_speed_show":"500","background":"rgb(255, 255, 255)","border":"#b1a6a6c2","border_on":false,"button_1_button_colour":"rgb(97, 162, 41)","button_1_button_hover":"rgb(97, 162, 41)","button_1_link_colour":"#fff","button_1_as_button":true,"button_1_new_win":false,"button_2_button_colour":"rgb(255, 255, 255)","button_2_button_hover":"rgb(255, 255, 255)","button_2_link_colour":"#898888","button_2_as_button":true,"button_2_hidebar":false,"button_2_nofollow":false,"button_3_button_colour":"rgb(209, 192, 198)","button_3_button_hover":"rgb(209, 192, 198)","button_3_link_colour":"rgb(0, 0, 0)","button_3_as_button":true,"button_3_new_win":false,"button_4_button_colour":"rgb(255, 255, 255)","button_4_button_hover":"rgb(255, 255, 255)","button_4_link_colour":"rgb(0, 0, 0)","button_4_as_button":true,"button_7_button_colour":"rgb(209, 192, 198)","button_7_button_hover":"rgb(209, 192, 198)","button_7_link_colour":"rgb(0, 0, 0)","button_7_as_button":true,"button_7_new_win":false,"font_family":"inherit","header_fix":false,"notify_animate_hide":true,"notify_animate_show":false,"notify_div_id":"#cookie-law-info-bar","notify_position_horizontal":"right","notify_position_vertical":"bottom","scroll_close":false,"scroll_close_reload":false,"accept_close_reload":false,"reject_close_reload":false,"showagain_tab":false,"showagain_background":"#fff","showagain_border":"#000","showagain_div_id":"#cookie-law-info-again","showagain_x_position":"100px","text":"rgb(51, 51, 51)","show_once_yn":false,"show_once":"10000","logging_on":false,"as_popup":false,"popup_overlay":true,"bar_heading_text":"Hi. We use some cookies on this website.","cookie_bar_as":"popup","cookie_setting_popup":true,"accept_all":true,"js_script_blocker":false,"popup_showagain_position":"bottom-right","widget_position":"left","button_1_style":[["margin","5px 5px 5px 30px"],["border-radius","0"],["padding","8px 25px 8px 25px"]],"button_2_style":[],"button_3_style":[["margin","5px 5px 5px 25px"],["border-radius","5px"],["padding","8px 25px"],["border-color","rgb(0, 0, 0)"]],"button_4_style":[["border-bottom","1px solid rgb(0, 0, 0)"],["text-decoration","none"],["margin-left","20px"],["border-top-color","rgb(0, 0, 0)"],["border-right-color","rgb(0, 0, 0)"],["border-left-color","rgb(0, 0, 0)"]],"button_5_style":{"0":["float","right"],"1":["text-decoration","none"],"2":["color","#333"],"3":["background-color","rgba(0, 0, 0, 0)"],"6":["background-color","rgba(0, 0, 0, 0)"]},"button_7_style":[["margin","5px 5px 5px 0"],["border-radius","5px"],["padding","8px 25px"],["margin-top","20px"],["border-color","rgb(0, 0, 0)"]],"accept_close_page_navigation":false}'; /* ]]> */ </script> <link rel='stylesheet' id='all-css-2' href='https://www.flickr.org/wp-content/plugins/webtoffee-gdpr-cookie-consent/public/css/cookie-law-info-table.css?m=1721114051g' type='text/css' media='all' /> <script type="text/javascript" src="https://stats.wp.com/e-202448.js" id="jetpack-stats-js" data-wp-strategy="defer"></script> <script type="text/javascript" id="jetpack-stats-js-after"> /* <![CDATA[ */ _stq = window._stq || []; _stq.push([ "view", JSON.parse("{\"v\":\"ext\",\"blog\":\"209677621\",\"post\":\"7244\",\"tz\":\"0\",\"srv\":\"www.flickr.org\",\"hp\":\"vip\",\"j\":\"1:14.0\"}") ]); _stq.push([ "clickTrackerInit", "209677621", "7244" ]); /* ]]> */ </script> <script src="https://www.flickr.org/wp-content/themes/flickr-foundation/assets/dist/js/export.prod.min.js?v=202212071843"></script> <!-- /Scripts --> <script type="text/plain" data-cli-class="cli-blocker-script" data-cli-label="Youtube embed" data-cli-script-type="advertisement" data-cli-block="true" data-cli-block-if-ccpa-optout="false" data-cli-element-position="body"> //function onYouTubeIframeAPIReady() { $( document ).ready(function() { var tag = document.createElement('script'); tag.src = "https://www.flickr.org/wp-content/themes/flickr-foundation/assets/dist/js/video.js"; var firstScriptTag = document.getElementsByTagName('script')[0]; firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); }); //} </script> </body> </html>