1対1の動画交換:リクエスト、提案、そして別の提案

tapeshelfの非公開動画は、どのフィードにも流れず、誰も売っていません。手に入れるには、持っている人に頼みます。そのまま共有してくれることもありますが、何かお返しを求められることもよくあります。画面ではどう見えるのか、そして内部ではどう作られているのかを紹介します。
動画をリクエストする
誰かの棚で非公開動画を開くと、プレイヤーの代わりに、サムネイル、16コマのプレビュー、「この動画をリクエスト」 ボタンが表示されます。メッセージ欄もあり、空のままでもかまいません。お返しに何を渡すかがもう決まっているなら、「+ お返しに動画を提案」 を押して自分の動画から選びます。持ち主には両方の内容が見えるので、その場で受け入れることもできます。持ち主が 「探しているもの」 と 「提案お断り」 を書いていれば、ボタンの横に表示されます。何本かまとめて頼みたいときは、棚で動画を選んで1つのリクエストとして送れます(最大20本)。
ボタンが出るかどうかは、いくつかのルールで決まります。
- リクエストは、いま見ている棚の持ち主に届きます。その人が投稿者でなくても同じです。その人のコピーなので、決めるのもその人です。
- 公開動画のブックマークはリクエストできません。代わりに投稿者へのリンクが表示されます。
- すでに視聴できる動画や、誰かに対してリクエスト中の動画はリクエストできません。
- どちらかが相手をブロックしている場合、2人の間ではリクエストできません。
- リクエストできるのは1日に動画30本までです。
自分の棚が空なら、アプリは先に何本かアップロードするよう勧めます。これはもっともなアドバイスです。お返しできるものを持っている人のほうが、ずっと共有してもらいやすくなります。
持ち主ができる返事
持ち主には通知が届き、「リクエスト」 ページでリクエストを確認します。できることは次のとおりです。
- 無料で共有。 頼んだ動画すべてのコピーがあなたに届きます。
- 交換を提案。 お返しにほしい動画を、あなたの棚から選びます。
- 断る。 コメントを添えることもできます。
- ユーザーをブロック。 2人の間のリクエストはすべて終了します。あなたからは自分のリクエストが断られたように見え、ブロックされたことは知らされません。
リクエストに提案を付けていれば、持ち主はそれをそのまま受け入れることもできます。
何往復ものやり取り
誰かが交換を提案すると、リクエストは短い交渉に変わります。ページには、いまどちらの番か(「あなたの番」または「相手の返事待ち」)が表示されます。自分の番では、出ている提案を受け入れるか、断るか、別の動画を組み合わせて交換を提案し返すことができます。
やり取りの回数に上限はありません。1本と1本、1本と数本、数本と数本のどれでもかまいませんが、どちらも最低1本は渡します。提案できるのは、公開動画のブックマークを除く自分の棚の動画すべてで、以前の交換で受け取った動画も含まれます。相手がすでに持っている動画は提案できません。交渉の間も、持ち主はいつでも無料で共有したりブロックしたりでき、頼んだ側はリクエストを取り下げられます。
例を挙げます。ミナさんがケンさんに「夜明けの港」をリクエストします。ケンさんは、ミナさんの「夜行列車」となら交換すると提案します。ミナさんは代わりに「屋根の雨音」ではどうかと提案し返します。ケンさんが受け入れると、2人は同時にコピーを受け取ります。
ユーザーどうしのリクエストに期限はありません。誰かが返事をするまで「リクエスト」ページ(受信、送信、履歴)で待ち、スレッドにはすべてのやり取りが残ります。各ステップは通知ベルにも届き、設定していればメールでも届きます。
断られたら1週間待つ
どちらの側でも、何回目のやり取りでも、断ると7日間の待ち期間が始まります。頼んだ人は1週間、その動画を誰にもリクエストできません。これで終わりのない押し問答を防ぎ、断られたあとに別のコピーの持ち主に頼んで回り込むこともできなくなります。残りの日数はリクエストボタンに表示されます。
自分でリクエストを取り下げた場合は待ち期間は始まりませんが、その動画は1日の上限には数えられます。
手元に残るもの
一度自分のものになったコピーを、誰かが取り上げることはできません。ライブラリの 「受け取った動画」 と、訪問者が棚で見る「ほかの投稿者の動画」の欄に表示されます。視聴、プランの範囲でのダウンロード、カテゴリ分け、訪問者への非表示、さらに別の人との交換もできます。投稿者の名前はどこでも動画についていきます。容量も使いません。容量に数えられるのは自分でアップロードした動画だけです。
コピーがなくなるのは、投稿者が動画を削除したとき(そのときはすべての棚から一度に消えます)か、自分で削除したとき(消えるのは自分のコピーだけです)です。
交渉の途中で状況が変わることもあります。たとえば、いま出ている提案の動画が削除されたり、どちらかがもう持っていなかったりした場合です。そのときはその提案が無効になり、リクエストは最初に頼んだ内容に戻ります。それも残っていなければ、リクエストは終了します。どちらの場合も2人に通知が届きます。
アカウントのない人との交換
アカウントのない人とも、相手が自分の動画を持ってくれば交換できます。交換リンクを送るか(「リンクをコピー → 交換用」。無効にするまで使えます)、相手があなたの非公開動画のページで 「交換を提案」 を押します。どちらの場合も「公平な交換」というページが開き、相手は動画を5本までアップロードします。その動画はロックされた状態で保管され、2人が合意するまで誰も視聴もダウンロードもできません。取引はあなたの「リクエスト」に「ゲスト」からのものとして表示され、ほかのリクエストと同じように返事をします。
ゲストとの取引は返事を3日間待ち、どちらかが新しく動くたびにさらに3日延びます。断られたり、キャンセルされたり、期限が切れたりすると、ゲストの動画はすぐにサーバーから削除されます。自分の動画にゲストから提案が来ないようにするには、「設定 → プロフィール → 交換」で 「ゲストからの交換を受け付ける」 をオフにします。交換リンクはそのまま使えます。
内部の仕組み
ここまでの動きは、すべて1つのステートマシンです。リクエストは開いているか閉じているかのどちらかで、閉じ方は5通りあります。成立、お断り、取り下げ、ブロック、そしてシステムによる終了です。ゲストとの取引には、期限切れもあります。最初のリクエストは0回目のやり取りとして扱います。持ち主は頼まれた動画を渡し、頼んだ側は付けたもの(多くは何もなし)を渡します。「無料で共有」は、持ち主が自分の側を渡して何も受け取らないことを意味します。別の提案が出るたびに新しい回が始まり、前の提案は置き換え済みになります。リクエスト自体に、現在の回、出ている提案、どちらの番かを記録しているので、自分の返事を待っているものはインデックスを使った1回の検索で取り出せます。
どの操作も1つのデータベーストランザクションの中で実行され、最初にリクエストの行をロックします。同じ秒に2人がボタンを押しても、処理は順番に行われます。
受け入れるときは、いま見ている提案そのものを指定します。直前に別の提案が届いていた場合、サーバーは競合を返し、ページはスレッドを読み込み直します。見ていない提案を受け入れてしまうことはありません。
受け入れの時点で、すべてをもう一度確認します。動画がまだ存在して準備ができていること、それぞれが渡すものをまだ持っていること、誰も相手をブロックしていないこと。そのうえで、同じトランザクションの中で双方にコピーが渡ります。
1人の人からの新しいリクエストは、厳密に1つずつ作成されます。ダブルクリックしても、タブを2つ開いていても、重複したり、1日の上限や待ち期間をすり抜けたりすることはありません。
通知とメールは、操作と同じトランザクションの中でアウトボックスに入り、コミットのあとでバックグラウンドのワーカーが配信します。操作が失敗してロールバックされれば、起きなかったことが誰かに知らされることはありません。途中でプロセスが再起動しても、何も失われません。