本篇文章更新時間:2020/02/11
如有資訊過時或語誤之處,歡迎使用 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

資訊愛好人士。主張「人人都該為了偷懶而進步」。期許自己成為斜槓到變進度條 100% 的年輕人。[//////////____30%_________]

參與討論

10 則留言

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

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

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

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

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

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

發佈留言

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