本篇文章更新時間:2021/06/21
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知或向一介資男的 LINE 社群反應。
如果本站內容對你有幫助,歡迎贊助支持


Flickr 近期的操作都讓人擔心他的雲端相簿服務岌岌可危,也一直都沒好好改版,強化操作體驗。

乾脆趁這次有空來處理備份!

Flickr 請求全部資料

這功能在帳號後台 頁面下方可以請求,點下申請按鈕後,一天內會處理好發信給你。到後台就可以看到上面的下載連結。

不過,抓下來後才是整理地獄的開始!

他給檔案的方式就是全部扁平化不分目錄的所有照片一起給,隨後附上的是一堆 JSON 檔案,其中 photo-*.json 這類型檔案記錄每一個對應照片的 Meta 中繼資料,包含照片 EXIF 資訊和 Flickr 上的標籤、分類資訊。

要想快速整理的話勢必要寫程式來處理了!

我的作法比較客製化,下方整理了一份大眾化版本的程式。

首先,將下方程式儲存為 flickr.php

<?php
/**
 * 作者: Chun
 * 說明: 此程式使用於請求( https://www.flickr.com/account )下載完整的 Flickr 檔案,整理照片檔案。
 * 使用方法: 將所有檔案解壓縮至 Flickr 資料夾後,將此程式放於 Flickr 上一層。
 * 執行程式指令: php -f flickr.php (將此段程式儲存並命名為 flickr.php)
 **/

function filename_safe($name) {
    $except = array('\\', '/', ':', '*', '?', '"', '<', '>', '|', ' ');
    return str_replace($except, '_', $name);
}

function mkdir_p($dirName, $rights = 0777) {
    $dirs = explode('/', $dirName);
    $dir  = '';
    foreach ($dirs as $part) {
        $dir .= filename_safe($part) . '/';
        if (!is_dir($dir) && strlen($dir) > 0) {
            mkdir($dir, $rights);
        }

    }
}

$count_single_album_files = 0;

foreach (glob('Flickr/photo_*.json') as $json) {
    $data               = json_decode(file_get_contents($json), true);
    $media_file_path    = "";
    $media_file_count   = 0;
    $media_place_folder = "";
    $json_filename      = basename($json);

    foreach (glob('Flickr/*' . $data['id'] . '*.{jpg,mp4,png,avi,gif,mov}', GLOB_BRACE) as $media) {
        $media_file_path = $media;
        $media_file_count += 1;
    }
    if ($media_file_count >= 2) {
        //重複 ID ,先暫停,觀察看看
        print_r("Oops!" . PHP_EOL);
        print_r($data);
        exit;
    }
    $media_filename = basename($media_file_path);

    // 不屬於任何相簿的話,使用拍照年作為相簿
    if (empty($data['albums']) && $data['date_taken'] != "") {
        $date_time = date_parse_from_format('Y-m-d H:i:s', $data['date_taken']);
        $year      = $date_time['year'];
        if ($date_time['error_count'] == 0 && $year != "") {
            $media_place_folder = 'Flickr/' . $year;
            if (!is_dir($media_place_folder)) {
                mkdir_p($media_place_folder);
            }
            rename('Flickr/' . $media_filename, $media_place_folder . '/' . $media_filename);
            rename('Flickr/' . $json_filename, $media_place_folder . '/' . $json_filename);
            $count_single_album_files += 1;
            print_r($data['id'] . " -> 完成!( " . $count_single_album_files . " )" . PHP_EOL);
        }
    } else {
        //有相簿的話,抓最長名稱也應該算是最有意義的相簿名稱吧(!?)
        $album_name = ""; //找最長的相簿名稱
        foreach ($data['albums'] as $key => $album) {
            if (mb_strlen($album['title']) > mb_strlen($album_name)) {
                $album_name = $album['title'];
            }
        }
        $media_place_folder = 'Flickr/' . filename_safe($album_name);
        if (!is_dir($media_place_folder)) {
            mkdir_p($media_place_folder);
        }
        rename('Flickr/' . $media_filename, $media_place_folder . '/' . $media_filename);
        rename('Flickr/' . $json_filename, $media_place_folder . '/' . $json_filename);
        $count_single_album_files += 1;
        print_r($data['id'] . " -> 完成!( " . $count_single_album_files . " )" . PHP_EOL);
    }
}

再來把 Flickr 上抓來的打包 zip 檔案都解壓縮到 Flickr 資料夾中。

此時 flickr.php 程式檔案與 Flickr 目錄同一層,如下所示。

flickr.php
Flickr/

確保作業系統環境可以執行 PHP 指令,輸入 php -f flickr.php 開始做整理,檔案越多執行越久,需要耐心等待~ 跑完就「應該」完成啦!


Share:

作者: Chun

WordPress 社群貢獻者、開源社群推廣者。專注於 WordPress 外掛開發、網站效能最佳化、伺服器管理,以及 iDempiere 開源 ERP 導入與客製開發。曾參與 WordCamp Taipei 等社群活動,GitHub Arctic Code Vault Contributor。提供資訊顧問、WordPress 開發教學、主機最佳化與企業 ERP 整合服務。

參與討論

  1. clementabcv
  2. Chun
  3. tacototoro

11 則留言

  1. 我是很小心眼的人,我已經排程你沒發的話會通知你喔。

  2. Alex Lion 還好我發了! 一段被 Alex 激勵的故事 哈

  3. 有跟到學習有推,謝謝大大無私分享~
    "跑完就「應該」完成啦!" 耐人尋味,等實作看會怎麼樣。

  4. 請問是在甚麼環境下執行: php -f flickr.php
    可以在瀏覽器執行 php -f flickr.php 嗎?

    1. Hi!如果你的環境是在伺服器下的話才可以改由瀏覽器存取指令的作法。 不過不建議這樣操作,會有執行上 timeout 與環境相關的問題。

      畢竟把 PHP 的程式當一個後端運作的應用程式和網站程式,還是有些使用上的不同。

  5. 超級感謝的。
    不然我真的不知道怎麼面對要去重新設目錄以及把一萬九千多個檔案完整歸類…..

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *


文章
Filter
Apply Filters
Mastodon