Technology Experience
.NET World

[Flickr] Scaricare tutte le foto di un photoset, con un piccolo tip

Ogni tanto nel mio tempo libero la passione per la programmazione su Flickr sboccia. Ho scritto un piccolo metodo che scarica in locale tutte le fotografie appartenenti ad un certo photoset di Flickr. Il codice bene o male è questo:

1 public void DownloadPhotos(string photosetId) 2 { 3 Stream stream; 4 FileStream saveFileStream; 5 Uri uri; 6 string filename; 7 8 Photo[] ps = conn.PhotosetsGetPhotos(photosetId); 9 10 foreach (Photo p in ps) 11 { 12 uri = new Uri(p.ThumbnailUrl); 13 filename = string.Concat(@"D:\Download\", uri.Segments[uri.Segments.Length - 1]); 14 15 stream = conn.DownloadPicture(p.ThumbnailUrl); 16 byte[] download = new byte[stream.Length]; 17 stream.Read(download, 0, (int)stream.Length); 18 stream.Close(); 19 stream.Dispose(); 20 21 saveFileStream = new FileStream(filename, FileMode.Create); 22 saveFileStream.Write(download, 0, download.Length); 23 saveFileStream.Flush(); 24 saveFileStream.Close(); 25 } 26 }

Il codice così com’è è un pochino brutto, perchè non ha gestione di eccezioni, e soprattutto non gira in modo asincrono. Se in input a questo metodo date un photoset che contiene decine e decine di fotografie, la procedura di download può richiedere diverso tempo, e quindi sarebbe carino prevedere un funzionamento asincrono, in modo tale che il chiamante possa sottoscriversi ad un evento per essere notificato di tanto in tanto sul progresso dell’operazione stessa. Ma…come dicevo…ci sto lavorando su a tempo perso, e quindi non c’è alcuna fretta.

Alla riga 8 utilizzo la chiamata al metodo PhotosetsGetPhotos, al quale passo il photosetId. Questo metodo ritorna un array di Photo[], sul quale ciclo per scaricare, una alla volta, tutte le fotografie.

Domanda: come decido che nome dare al file scaricato?

Risposta: beh, utilizzo lo stesso nome che mi viene dato da Flickr!

Alla riga 12 creo un oggetto Uri, dato l’url dell’immagine che sto scaricando. Questo url per esempio assume la seguente forma:

http://static.flickr.com/2094/2121897417_0dab37d8c1_t.jpg

Ho pensato a diversi modi per estrarre da questa stringa solo il nome del file. Se fosse un path locale, potrei utilizzare la classe FileInfo, ma qui non posso, perchè non posso istanziare un FileInfo usando come path quello che in realtà è un Uri. E non mi piaceva pure troppo fare una semplice ricerca sulle stringhe: avrei dovuto invertire la stringa, trovare il primo backslash…lasciamo perdere.

Il modo che reputo migliore per prendersi solo il nome del file è quello appunto di passare attraverso un oggetto Uri, accedendo alla proprietà Segments, che “spezzetta” l’url nelle sue componenti – in pratica facendo uno split sul backslash (‘\’). Alla riga 13 costruisco il path locale dell’immagine prendendo sempre l’ultimo segmento dell’url, che è proprio – guarda caso – il nome del file stesso. Il path locale viene utilizzato più avanti (riga 21) per costruire il FileStream per salvare fisicamente su disco l’array di bytes.

Il ciclo for…each non fa altro che farsi passare una alla volta tutte le fotografie…ed il gioco è fatto.

Technorati Tags:  

Send to Kindle

Igor Damiani

La sua passione per l'informatica nasce nella prima metà degli anni '80, quando suo padre acquistò un Texas Instruments TI-99. Da allora ha continuato a seguire l'evoluzione sia hardware che software avvenuta nel corso degli anni. E' un utente, un videogiocatore ed uno sviluppatore software a tempo pieno. Igor ha lavorato e lavora anche oggi con le più moderne tecnologie Microsoft per lo sviluppo di applicazioni: .NET Framework, XAML, Universal Windows Platform, su diverse piattaforme, tra cui spiccano Windows 10 piattaforme mobile. Numerose sono le app che Igor ha creato e pubblicato sul marketplace sotto il nome VivendoByte, suo personale marchio di fabbrica. Adora mantenere i contatti attraverso Twitter e soprattutto attraverso gli eventi delle community .NET.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.