/usr/share/tdiary/contrib/util/image2flickr.rb is in tdiary-contrib 3.2.2-1.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 | #!/usr/bin/env ruby
# -*- coding: utf-8 -*-
# = Image2Flickr
# imageプラグインからflickrプラグインへのマイグレーションツール
#
# Author:: MATSUOKA Kohei <http://www.machu.jp/>
# Copyright:: Copyright (c) MATSUOKA Kohei <http://www.machu.jp/>
# License:: GPL <http://www.gnu.org/copyleft/gpl.html>
#
# USEGE:
# imageプラグインからflickrプラグインへ移行するためのツールです。
# このツールの機能は、以下の2つです。
# (1) tDiaryのimageプラグインを利用して日記に載せた写真を、
# Flickrへアップロードします。
# (2) 日記データのimageプラグインの呼び出しを、
# flickrプラグインへと置き換えます。
# 古い日記データは .bak.YYYYmmddHHMMSS を付けてバックアップします。
#
# == 注意
#
# (1) tDiary2.3.1以降が対象です。
# 日記データがUTF-8に変換されている必要があります。
# (2) Wiki記法で記述された日記が対象です。
#
#
# == 移行手順
#
# 1. Flickr APIキーの取得
#
# flickr.comのAPIサイトにアクセスし、"Apply for a new API Key"にて
# 新しいAPIキーを生成します。
# http://www.flickr.com/services/api/keys/
#
# Authentication TypeはAuthentication Typeを選択してください。
#
#
# 2. tDiaryデータフォルダのバックアップ
#
# このマイグレーションツールはtDiaryの日記データを書き換えます。
# 古い日記データを残す仕様ですが、万が一に備えて
# 事前にtDiaryのデータフォルダをバックアップしてください。
#
#
# 3. rflickrライブラリの取得
#
# このマイグレーションツールはFlickrへの写真のアップロードに
# rflickrライブラリを使用します。
# 以下のサイトからrflickrライブラリを取得して、インストールしてください。
# http://rubyforge.org/projects/rflickr/
#
# RubyGemsが利用できる場合は、以下のコマンドでインストールできます。
# $ gem install rflickr
#
#
# 4. マイグレーションツールの設定
#
# image2flickr.rbをエディタで開き、以下の4つのパラメータを設定します。
#
# # FlickrのAPIキー
# @api_key = '123456789012345678901234567890'
# # Flickr APIのシークレットキー
# @secret = '1234567890'
# # tDiaryのデータフォルダ
# @data_path = '/var/tdiary'
# # tDiaryのイメージフォルダ
# @image_dir = '/var//www/tdiary/images'
#
#
# 5. マイグレーションツールの実行
#
# tDiaryのデータフォルダに書き込む権限を持つアカウントで、
# コマンドラインからimage2flickr.rbを実行してください。
# $ ./image2flickr
#
# すると、以下のメッセージが表示されます。
# ----
# Flickrへ写真をアップロードするためのトークンを取得します。
# Webブラウザで下記のURLへアクセスしたら、何かキーを押してください。
# http://www.flickr.com/services/auth/?api_sig=....
# ----
#
# 指定されたURLへWebブラウザでアクセスし、トークンの発行を許可してください。
# コマンドラインへ戻り何かキーを押すと、マイグレーションが始まります。
#
# なお、ツールを途中で中断し、2回目に実行するときはトークンを取得する
# 必要はありません。
#
#
# 6. 実行結果の確認
#
# ツールが終了したらtDiaryのデータフォルダを開き、
# imageプラグインの呼び出しがflickrプラグインの呼び出しへ
# 置き換わっていることを確認してください。
# 古い日記データは .bak.20081024090000 などの拡張子がついて
# バックアップされていますので、問題があれば元に戻してください。
#
# ツールを実行すると、以下の2つのファイルが作成されます。
# (1) flickr.token
# Flickrへ写真をアップロードするためのトークン。
# (2) image2flickr.yaml
# tDiaryのイメージフォルダに存在するJPEGファイル (ex. 20081025_0.jpg) と
# Flickrへアップロードしたphoto_idの対応付けを記録したファイル。
#
# これらのファイルは、マイグレーションツールを途中で中断したときのために
# 用意されています。
# マイグレーションが完了したら、少なくともflickr.tokenは削除してください。
# (トークンの不正利用を防ぐためです)
#
#
$KCODE = 'utf8'
begin
require 'rubygems'
gem 'rflickr'
rescue
end
require 'flickr'
require 'yaml/store'
require 'tempfile'
require 'fileutils'
# FlickrのAPIキー
@api_key = '123456789012345678901234567890'
# Flickr APIのシークレットキー
@secret = '1234567890'
# tDiaryのデータフォルダ
@data_path = '/var/tdiary'
# tDiaryのイメージフォルダ
@image_dir = '/var/www/tdiary/images'
def main
uploader = FlickrUploder.new('image2flickr.yaml', 'flickr.token', @api_key, @secret)
parser = TDiaryParser.new(@data_path)
i2f = Image2Flickr.new(parser, uploader, @image_dir)
# tDiaryのimagesフォルダから対象日記を取得
files = Dir.glob("#{@image_dir}/*.{jp{,e}g,png,gif}").map{|file|
File.basename(file).match(/^(\d{6})/)
$1
}.compact.uniq
# 対象日記を変換
files.each do |file|
i2f.convert(file)
end
# cache のクリア
Dir["#{@data_path}/cache/*.rb"].each{|f| FileUtils.rm_f( f )}
Dir["#{@data_path}/cache/*.parser"].each{|f| FileUtils.rm_f( f )}
end
# Flickrへ写真をアップロードし、元ファイル名とphoto_idのペアをYAMLに記録する
class FlickrUploder
def initialize(yaml, token, api_key, secret)
@flickr = Flickr.new(token, api_key, secret)
# トークンが無ければ取得する
unless @flickr.auth.token
puts "Flickrへ写真をアップロードするためのトークンを取得します。"
puts "Webブラウザで下記のURLへアクセスしたら、何かキーを押してください。"
puts @flickr.auth.login_link
# キー入力待ち
gets
@flickr.auth.getToken
@flickr.auth.cache_token
puts "トークンを取得し、#{token} へ保存しました。"
puts
end
@db = YAML::Store.new(yaml)
@db.transaction {
@db['photos'] ||= {}
}
end
# Flickrへ写真をアップロードする
def upload(file, title)
id = 0
@db.transaction {
basename = File.basename(file)
if @db['photos'][basename]
# アップロード済みの場合はスキップ
STDERR.puts "passed updating #{basename} (#{title}) ..."
id = @db['photos'][basename]
@db.abort
else
# 写真をアップロードする
STDERR.puts "updating #{basename} (#{title}) ..."
id = @flickr.photos.upload.upload_file(file, title)
@db['photos'][basename] = id
end
}
id
end
end
class TDiaryParser
include FileUtils
def initialize(data_path)
@data_path = data_path
end
# tDiaryの日記を置換する
# 拡張子に ".bak.yyyymmddHHMMSS" を付けて日記データをバックアップする
def each_diary(yearmonth)
yearmonth.match(/(\d{4})(\d{2})/)
year = $1
month = $2
file = "#{@data_path}/#{year}/#{yearmonth}.td2"
# ファイルをバックアップ
backup = "#{file}.bak.#{Time.now.strftime('%Y%m%d%H%M%S')}"
cp(file, backup, :preserve => true)
# 一時ファイルを生成
tmp = Tempfile.new('tmp')
open(file) do |fin|
fin.each('') do |headers|
date = headers.grep(/^Date:\s*(\d{4}\d{2}\d{2})/){$1}[0]
diary = fin.gets("\n.\n")
diary = yield(date, diary)
tmp.print headers
tmp.print diary
end
end
tmp.close
cp(tmp.path, file)
end
end
class Image2Flickr
def initialize(parser, uploader, image_dir)
@parser = parser
@uploader = uploader
@image_dir = image_dir
end
# imageプラグインをflickrプラグインへ置き換える
def convert(yearmonth)
@parser.each_diary(yearmonth) do |@date, diary|
# 現在はWiki記法のみ対応
diary.gsub!(/\{\{(image[^}]+)\}\}/) {|match|
begin
STDERR.puts "found: #{match}"
# image, image_left, image_right のいずれかに対応
replace = "{{#{eval($1)}}}"
STDERR.puts "replace: #{replace}"
STDERR.puts
replace
rescue => e
# 例外が発生したら置換しない
STDERR.puts "ERROR: #{e}"
STDERR.puts
match
end
}
diary
end
end
def image( index, title = nil, thumbnail = nil, size = nil, place = 'photo' )
replace("flickr", @date, index, title)
end
def image_center( index, title = nil, thumbnail = nil, size = nil, place = 'photo' )
replace("flickr", @date, index, title)
end
def image_left( index, title = nil, thumbnail = nil, size = nil, place = 'photo' )
replace("flickr_left", @date, index, title)
end
def image_right( index, title = nil, thumbnail = nil, size = nil, place = 'photo' )
replace("flickr_right", @date, index, title)
end
def replace(method, date, index, title)
file = Dir.glob("#{@image_dir}/#{date}_#{index}.{jp{,e}g,png,gif}").shift
# タイトルが未指定の場合はファイル名
title ||= File.basename(file)
id = @uploader.upload(file, title)
"#{method} #{id}"
end
end
main
|