本篇文章更新時間:2021/06/21
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣新台幣 贊助支持。


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

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

Flickr 請求全部資料

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

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

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

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

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

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

', '|', ' ');
    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% 的年輕人。[///////////____36%_________]

參與討論

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

發佈留言

發佈回覆給「Chun」的留言 取消回覆

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


文章
Filter
Apply Filters
Mastodon