Youtubeからmp3に変換するPythonスクリプト

Youtubeからmp3に変換するPythonスクリプトをネットを参考に作成したのでメモ。
youtube_dlはpipでインストール。
ffmpegもDLが必要。
他にもyoutube-mp3-downloaderというモジュールも見つかったがどうなのだろう?
mp4をDLして、変換はFreemake video converterでmp4からmp3に変換しても良いがmp4は重いのでネットに制限ある場合にはもったいない。

>C:Python34\Scripts\pip.exe install youtube-dl
import youtube_dl
import sys
import os
import glob

def dl(URL):
	options = {
		'format': 'bestaudio[ext=mp3]/bestaudio[ext=m4a]/bestaudio'
	}
	with youtube_dl.YoutubeDL(options) as ydl:
		ydl.download([URL])

def mp4to3(filename):
	root, ext = os.path.splitext(filename)
	if ext not in ['.m4a', '.mp4']: return
	newname = '%s.mp3' % root
	cmd = 'ffmpeg -i "%s" -ab 256k "%s"' % (filename, newname)
	os.system(cmd)
	os.remove(filename)

def main():
	if len(sys.argv) > 1:
		URL = sys.argv[1]
		dl(URL)
	filenames = glob.glob('./*.m4a')
	for filename in filenames:
		mp4to3(filename)

main()

VS2010ビルドエラー

.NET Framework 4.5.1をインストールしたら、VisualStudio2010のC++で以下のビルドエラーが出た。

>LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt

.NET 4.5.1をアンインストールして、VS2010を修復したら治った。
Microsoftの環境はバージョンにより依存関係があって結構難しい。

C++11のVS2010への対応


cpprefjpに対応状況まとまっているが、std::array、std::for_each、std::tupleを調べてみた。
結果として、VS2010に対応していた!
これで色々出来そう。

#include <iostream>
#include <array>
#include <tuple>

int main()
{
  // 3要素のint型配列を定義し、初期化子リストで初期化
  std::array<int, 3> ar = {3, 1, 4};

  // size()メンバ関数による要素数取得
  for (std::size_t i = 0; i < ar.size(); ++i) {
    ++ar[i]; // operator[]で任意の要素にランダムアクセス
  }

  // イテレータによる要素の横断
  std::for_each(ar.begin(), ar.end(), [](int x) {
    std::cout << x << std::endl;
  });

  // tuple
  auto tupleValue = std::tuple<int, double, double>(10, 15.5, 20.0);
  tupleValue =  std::make_tuple(11, 15.3, 20.2);
  int value1 = std::get<0>(tupleValue);
  double value2 = std::get<1>(tupleValue);
  double value3 = std::get<2>(tupleValue);
  std::cout << value1 << " " << value2 << " " << value3 << std::endl;
}

Harlan


GPUDSL言語。なぜか、文法はSchemeベースらしい。あと、対応OSが、今のところ、MacLinuxしかない。Windowsはいつになるのだ?
GPU言語の流行りは分からないが、これだったら、PyCUDAの方が良いんじゃないのか?

ライブラリ作成メモ

foo.dllの作成。

> set path=C:\MinGW_x64\x86_64-w64-mingw32\lib;%path%
> g++ -shared -static-libgcc -std=c++11 *.cpp -o foo.dll

a.exeの作成

> g++ -static-libgcc -std=c++11 -I. foo.dll main.cpp

VCと同様に、gccでもlibを作成してリンクすると思っていたが、直接dllでリンクできるので必要なかった。