語学

# 語学 2017


以下の環境で動作を確認 (2017-04-10)

* OS X 10.12.4
* ruby 2.3.3
* ffmpeg 3.2.4

~~~
ffmpeg version 3.2.4 Copyright (c) 2000-2017 the FFmpeg developers
built with Apple LLVM version 8.0.0 (clang-800.0.42.1)
configuration: --prefix=/usr/local/Cellar/ffmpeg/3.2.4 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-libmp3lame --enable-libx264 --enable-libxvid --enable-opencl --disable-lzma --enable-vda
libavutil      55. 34.101 / 55. 34.101
libavcodec     57. 64.101 / 57. 64.101
libavformat    57. 56.101 / 57. 56.101
libavdevice    57.  1.100 / 57.  1.100
libavfilter     6. 65.100 /  6. 65.100
libavresample   3.  1.  0 /  3.  1.  0
libswscale      4.  2.100 /  4.  2.100
libswresample   2.  3.100 /  2.  3.100
libpostproc    54.  1.100 / 54.  1.100
~~~

* gogaku2017.rb

~~~ruby
require 'open-uri'
require 'openssl'
require 'rexml/document'
require 'rubygems'
require 'taglib'
require 'date'

OP_NO_TLSv1_2 = 0x08000000
OpenSSL::SSL::SSLContext::DEFAULT_PARAMS[:options] |= OP_NO_TLSv1_2

def make_path file, isLimited=false
  if isLimited
    "https://nhk-vh.akamaihd.net/i/gogaku-stream/r/#{file}/master.m3u8"
  else
    "https://nhk-vh.akamaihd.net/i/gogaku-stream/mp4/#{file}/master.m3u8"
  end
end

def listdataxml(lang, course)
  "https://www2.nhk.or.jp/gogaku/st/xml/#{lang}/#{course}/listdataflv.xml"
end

def download path, outfile
  system "ffmpeg -i #{path} -absf aac_adtstoasc -acodec copy #{outfile}"
end

def proc_xml url, isLimited=false
  # puts url
  open(url) do |f|
    doc = REXML::Document.new(f)
    doc.elements.to_a("musicdata/music").last(5).each do |e|
      title = e.attributes["title"]
      hdate = e.attributes["hdate"]
      kouza = e.attributes["kouza"]
      code = e.attributes["code"]
      file = e.attributes["file"]
      nendo = e.attributes["nendo"]
      pgcode = e.attributes["pgcode"]
      path = make_path(file, isLimited)
      outfile = "data/" + file.sub("mp4", "m4a")
      if FileTest.exist?(outfile) && FileTest.size?(outfile) >= 1000000
        puts "Skipped . . . #{outfile}"
      else
        puts "Downloading . . . #{outfile}"
        download path, outfile
        set_title outfile, title, hdate, kouza, code, nendo
      end
    end
  end
end

def proc_url_list(list, isLimited = false)
  list.each do |url|
    proc_xml url, isLimited
  end
end

def kouza(lang)
  listdataxml(lang, "kouza")
end

def kouza2(lang)
  listdataxml(lang, "kouza2")
end

def chinese(course)
  listdataxml("chinese", course)
end

def hangeul(course)
  listdataxml("hangeul", course)
end

def english(course)
  listdataxml("english", course)
end

def set_title file, title, hdate, kouza, code, nendo
  TagLib::MP4::File.open(file) do |mp4|
    tag = mp4.tag
    tag.genre = "Education"
    tag.artist = 'NHK'
    tag.album = title + nendo
    tag.title = hdate
    tag.year = nendo.to_i
    tag.track = code.to_i % 1000
    tag.comment = code
    mp4.save
  end
end


list = [
  # english("basic1"),
  # english("basic2"),
  # english("basic3"),
  # english("kaiwa"),
  # english("enjoy"),
  # english("timetrial"),
  english("gendai"),
  english("business1"),
  english("business2"),
  english("vr-radio"),

  chinese("kouza"),
  chinese("levelup"),
  chinese("omotenashi"),

  hangeul("kouza"),
  hangeul("levelup"),

  kouza("german"),
  kouza2("german"),
  kouza("french"),
  kouza2("french"),
  kouza("italian"),
  kouza2("italian"),
  kouza("spanish"),
  kouza2("spanish"),
  kouza("russian"),
  kouza2("russian"),
]

limited_list = [
  english("3month"),
]

proc_url_list list
proc_url_list limited_list, true
~~~

* Gemfile

~~~
source "https://rubygems.org"

gem "ruby-mp3info"
gem 'taglib-ruby' #, :git => 'git://github.com/robinst/taglib-ruby.git'
~~~