質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

2回答

1977閲覧

Rubyで"PT5M9S"(5分9秒) といった文字列を秒数に変換したい

penguin_mask

総合スコア14

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2017/11/15 04:01

編集2017/11/15 04:26

rubyでYoutube Data api から動画の再生時間をとってくるコードを書きました
Youtube Data apiでは
https://www.googleapis.com/youtube/v3/videos?id=動画URLの末尾11桁&key=APIキー&part=snippet,contentDetails,statistics,status
にアクセスすると動画の再生時間やタイトル、視聴回数などがJSON方式で取得できます

ruby

1def get_duration(id) 2 require 'net/http' 3 uri = URI.parse('https://www.googleapis.com/youtube/v3/videos?id='+ id + 4 '&key=(私のAPIキー)&part=snippet, 5 contentDetails,statistics,status') 6 json = Net::HTTP.get(uri) 7 videoInfo = JSON.parse(json) 8 duration = videoInfo['items'][0]['contentDetails']['duration'] 9 return duration 10end

json

1--省略-- 2 "contentDetails": { 3 "duration": "PT5M9S", <-- ここ 4 "dimension": "2d", 5 "definition": "hd", 6 "caption": "false", 7 "licensedContent": true, 8 "projection": "rectangular" 9 }, 10--省略--

5分9秒の動画では”PT5M9S”という文字列が得られました
この文字列を秒数に変換したいです(この場合数値型の309にしたいです)
また試しにYouTubeで一番長いと言われる動画の再生時間をとってくると"P3W2DT19H1M41S"という文字列が得られました
更にYouTubeで一番短いと言われる動画の再生時間をとってくると"PT1S"という文字列が得られました
これらの文字列を数値型にするにはどうすればいいでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2017/11/15 04:08

YouTubeで使ったAPIの詳細を書いていただけないでしょうか。
penguin_mask

2017/11/15 04:24

rubyとJSONのコードを追記しました
guest

回答2

0

まず "PT5M9S" という文字から以下のようにして分と秒を抽出できるかと思います。

irb(main):011:0> m = /PT(?<min>\d+)M(?<sec>\d+)S/.match("PT5M9S") => #<MatchData "PT5M9S" min:"5" sec:"9"> irb(main):012:0> m["min"] => "5" irb(main):013:0> m["sec"] => "9"

抽出ができたので明示的に数値型にする必要がある場合は

irb(main):014:0> m["min"].to_i => 5 irb(main):016:0> m["sec"].to_i => 9

のようにすればよいかと思います。

投稿2017/11/15 04:39

bells17

総合スコア64

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bells17

2017/11/15 06:40

すみません。ベストアンサー出てるのに気づかずに書いてしまいました。
penguin_mask

2017/11/19 09:30

こちらこそすみませんでした
guest

0

ベストアンサー

この値は(Googleのヘルプにもあるように)ISO 8601形式の期間です。

Rubyだと、ruby-durationというGemがあります(GitHub)。

投稿2017/11/15 04:28

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

penguin_mask

2017/11/15 05:15

Duration.new("PT5M9S").format("%tsu")だとうまくいきましたが Duration.new("P3W3DT20H31M21S").format("%tsu")ではダメでした 何が原因でしょうか?
maisumakun

2017/11/15 05:16

単に秒数にしたいなら、「.to_i」だけでよさそうです。
penguin_mask

2017/11/15 05:20

そうではなくて、Duration.newがうまくかないみたいです ISO8601::Errors::UnknownPattern: Unknown pattern P3W3DT20H31M21S というエラーメッセージが出ました Duration.new("P3W") や Duration.new("P3DT20H31M21S") はうまくいきます
maisumakun

2017/11/15 05:38 編集

どうやら、正式にはWを含むものは「P5W」のようにWだけ書く形しか使えないようです(本当にそのような値がYouTubeから帰ってきました?)。
penguin_mask

2017/11/15 05:56

確かに"P3W3DT20H31M21S"と返ってきています そもそも1週間を超える動画なんて滅多にないのでDuration.newがうまくいかなかったら失敗扱いにするのもアリかと...あまりにも長い動画を受け付けると困るようなアプリを作っているので、この制約を逆手に取るのも良いかもしれません
maisumakun

2017/11/15 06:06

1本で3週間以上ある動画、どんなのなのか想像がつかないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問