JUST FOR FUN

Twitter:@okwra GitHub:@tearon4

まだTwitterに作品投稿するのに消耗してるの? ~ TouchDesinger編 ~

はじめに

この記事はTouchDesigner Advent Calender 2018の22日目の記事です。

qiita.com

TwitterのApp申請が厳しくなった昨今では需要のあまりないことは承知の上で、僕はこんな感じでTouchDesignerで作った作品をTwitterにアップロードしているよ、という共有記事です。

シェア

以下のrepoにあるtoxファイル(Todays_TD.tox)を作って使っています。

github.com

これまで

僕は今年の夏頃にTouchDesignerに出会ってそこから5ヶ月弱で130作品ほどシコシコ作品を作ってTwitterやらInstagramにアップロードして承認欲求を満たしてまいりました。TouchDesignerで作品を作るのはとても奥深く面白い勉強だったのですが、一つとても煩雑な作業がありました。それが「作品投稿」の過程です。最初の頃は以下の手順で行なっておりました。

  1. Movie File Out TOPで動画を撮る
  2. ffmpegを使ってmov->gifに変換する
  3. Twitterだとgifは15MBのファイルサイズ制限があるので超えていないかチェック
  4. 超えていれば①からやり直し
  5. ツイート

「どうしてわざわざgifで?」というのはTwitterに動画をあげる際はファイルサイズに気を使わないとサーバの都合で非常に荒い動画となってアップロードされてしまうからです。せっかくいろんな人に見てもらえるかもしれないのに、満足いかないクオリティで出すのは嫌ですよね。 とはいえ、真面目にこの工程でやろうとするとだいたい5分くらいかかります。メンドーですねー。

そんな最中、TouchDesingerのExperimental版でgif出力に対応する、ということがわかりました。

「これはいいきっかけだし、Twitterに作品投稿を楽にできるようなシステムを組んでみるか」というのがTodays_TD.toxを作った所以です。

なにをやったか

f:id:taiga006:20181222183827p:plain

以下の手順で簡単に自分の作品をTwitterに投稿できます。

  1. [REC] gif動画を撮影することができます
  2. [LOAD] 撮影した動画を読み込んで流すことができます
  3. [CHECK] ファイルサイズが15MBを超えていないか確認することができます
  4. [TWEET] 撮影したgif動画を添付して「今日の #TouchDesigner 」ツイートできます

一つずつ見て行きましょう。

1. [REC]

f:id:taiga006:20181222184430p:plain

recボタンは単純でbuttonの1,0がMovie File Out TOPのrecordをON-OFFしています。 なんでもいいんですがtest.gifという名前で保存しておきます。

2. [LOAD]

f:id:taiga006:20181222185041p:plain

先ほどrecした動画をLOADします。 RECの0,1を使ってLOADしようとするとTouchDesingerはクラッシュして落ちます。 (ファイルの録画&保存と同時に読み込むことは難しいようです。) 本当はこのbuttonは作りたくなったですね。

3. [CHECK]

f:id:taiga006:20181222184609p:plain

# -*- coding:utf-8 -*-
def onValueChange(channel, sampleIndex, val, prev):
    import os
    bytes = os.path.getsize("test.gif")

    if bytes < 0:
        raise Exception('Cant Get Gif file!!')

    m_bytes = round(bytes / 1000000, 2)
    print (m_bytes, "MB")
    if m_bytes < 15:
        op('size').text = str(m_bytes) + "MB OK!!"
    else:
        op('size').text = str(m_bytes) + "MB NG!!"

buttonの0,1で先ほど作ったtest.gifのファイルサイズを確認します。pythonでファイルサイズを一番簡単に調べるのはos.path.getsizeです。 視覚的に捉えられるようにこの結果をtest TOPにしてさきほどLOADしたTOPにoverします。

f:id:taiga006:20181222185623p:plain

ボタンポチポチで簡単にここまでチェックできます。やったね。

4. [TWEET]

f:id:taiga006:20181222185258p:plain

# -*- coding:utf-8 -*-
def onValueChange(channel, sampleIndex, val, prev):
    import json
    from requests_oauthlib import OAuth1Session

    Consumerkey       = op('../params')[0,1].val
    Consumersecret    = op('../params')[1,1].val
    AccessToken       = op('../params')[3,1].val
    AccessTokenSecret = op('../params')[4,1].val

    twitter = OAuth1Session(
        Consumerkey,
        Consumersecret,
        AccessToken,
        AccessTokenSecret,
    )

    url_text   = "https://api.twitter.com/1.1/statuses/update.json"
    url_media  = "https://upload.twitter.com/1.1/media/upload.json"

    files = {"media" : open("test.gif", 'rb')}
    req_media = twitter.post(url_media, files = files)

    if req_media.status_code != 200:
        print("MEDIA UPLOAD FAILED... %s", req_media.text)
        exit()

    print("MEDIA UPLOAD UPDATED!!")

    media_id = json.loads(req_media.text)['media_id']
    print("MEDIA ID: %d" % media_id)

    tweet = "今日の #TouchDesigner"
    
    params = {"status" : tweet, "media_ids" : [media_id]}
    req_media = twitter.post(url_text, params = params)

    if req_media.status_code != 200:
        print("TWEET FAILED... %s", req_text.text)
        exit()

    print("TWEET SUCCEED!!")

さて、最後はツイートするスクリプトです。

qiita.com

都合よく何年か前に僕が書いた記事がそのまま使えそうだったので過去の自分に感謝して拝借。

ここまでファイルサイズに問題がなければ15秒くらいでできます。

ちなみに説明していませんでしたが、Customize Component... の設定は以下のようになっています。

f:id:taiga006:20181222190236p:plain

ComponentのExtensionに関しては以下の記事を参考にしてください。

qiita.com

qiita.com

ちなみにTipsというか忘れがちなところとしてbutton COMPの順番を制御するのはこの部分です。

f:id:taiga006:20181222191209p:plain

AlignはTop to Bottomにしています。

さて今回はここまで。

さいごに

会社のAdvent CalenderのほうにもTouchDesingerに関する記事をあげています、よろしければこちらもご覧ください。

techblog.kayac.com