[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 2chのread.cgiへ]
Update time : 05/09 15:17 / Filesize : 204 KB / Number-of Response : 724
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

LinuxでのCD-R/RWについてのスレ



1 名前:ペンギン mailto:halt@24i.net [02/06/01 22:42 ID:8nhbR4Y6]
Linux のCD-R/RWがわからんひと!!こい!ってか自分がわからん。

622 名前:login:Penguin [2008/08/09(土) 22:02:58 ID:/q6Hypz7]
自分用メモ
CDからwav+cueを作るスクリプト(Public Domain)
(FreeNAS(FreeBSD)で使ってるけどLinuxでも多分いける)

#!/bin/sh

umask 0
cd /mnt/disk/cdda

getCDinfo.rb

tempname=cdda-`date +%Y-%m%d-%H%M`

cdrdao read-cd --read-raw --device 0,0,0 --driver generic-mmc --speed 48 --datafile ${tempname}.bin ${tempname}.toc

filename=`getCDinfo.rb ${tempname}.toc`
echo ${filename}

echo 'convert...'
sox -t cdda -x ${tempname}.bin ${filename}.wav
mv ${tempname}.toc ${filename}.toc

rm ${tempname}.bin



623 名前:login:Penguin [2008/08/09(土) 22:08:04 ID:/q6Hypz7]
上記で使ってるCD-DBを参照して.tocを.cueに変換するスクリプト
(getCDinfo.rb 、同じくPublicDomain)

#!/usr/bin/env ruby
$KCODE='sjis' # Ruby-freedがsjis以外だと誤動作
$/="\r\n" # LFだとMagicDiskが誤動作
require 'iconv'
require "freedb"

def iconv(src,conv)
str=''
begin
str=conv.iconv(src)
rescue Iconv::InvalidCharacter => err
p err
p err.success
str=err.success
ensure
str << conv.iconv(nil)
end
str
end


624 名前:getCDinfo.rb 続き2 [2008/08/09(土) 22:09:53 ID:/q6Hypz7]
# cueファイルの文字コード
def iconvcue(src);iconv(src,Iconv.new('SHIFT_JIS','SHIFT_JIS'));end
# ファイルシステムの文字コード
def iconvfs(src);iconv(src,Iconv.new('UTF-8','SHIFT_JIS'));end

def getCDinfo2(server)
freedb=Freedb.new
freedb.fetch_cgi(server[0],80,nil,nil,server[1])
return nil if freedb.results.size<=0
freedb.get_result(0)
result={}
result[:server]=server[0]
result[:title]=freedb.title
result[:artist]=freedb.artist
result[:genre]=freedb.genre
result[:year]=freedb.year
result[:discid]=freedb.discid.upcase
# タイトルから特殊文字を抜いてファイル名を生成
filename=''
freedb.title.split(//).each{|c|
if c.size>1
filename << ((c!=' ')?c:'_') # Windows cmd.exeのバッチファイル対策
else
filename << ((c=~/[-_A-Za-z0-9]/)?c:'_')
end
}
result[:filename]=filename
result[:tracks]=[]
freedb.tracks.size.times{|i| result[:tracks] << freedb.tracks[i]['title'] }
return result
end


625 名前:getCDinfo.rb 続き3 [2008/08/09(土) 22:11:34 ID:/q6Hypz7]
def getCDinfo
result=nil
[
['freedbtest.dyndns.org','/~cddb/cddb.cgi'],
['www.freedb2.org','/~cddb/cddb.cgi'],
].each{|server|
result=getCDinfo2(server)
break if result!=nil
}
return result
end

def createCUE(tocfilename)
oldfilename=''
tracks=[]
open(tocfilename,"r") {|fs|
fs.read.split("\n").each{|l|
l.chomp.strip!
if l=~/^FILE/
data=l.split(/ +/)[1..3]
oldfilename=data[0][1..-2]
data[1]='00:00:00' if data[1]=='0'
tracks << [data[1],data[2]]
end
}
}
return if tracks.size<=0
cdinfo=getCDinfo
return if !cdinfo
filename2=iconvfs(cdinfo[:filename])


626 名前:getCDinfo.rb 続き4 [2008/08/09(土) 22:12:21 ID:/q6Hypz7]
result=<<EOD
REM GENRE "#{iconvcue(cdinfo[:genre])}"
REM DATE "#{cdinfo[:year]}"
REM DISCID "#{cdinfo[:discid]}"
TITLE "#{iconvcue(cdinfo[:title])}"
PERFORMER "#{iconvcue(cdinfo[:artist])}"
FILE "#{iconvcue(cdinfo[:filename])}.wav" WAVE
EOD
tracks.size.times{|i|
result+=<<EOD
TRACK #{format("%02d",i+1)} AUDIO
TITLE "#{iconvcue(cdinfo[:tracks][i])}"
PERFORMER "#{iconvcue(cdinfo[:artist])}"
INDEX 01 #{tracks[i][0]}
EOD
}
result.gsub!("\r",'')
result.gsub!("\n","\r\n")
open(filename2+'.cue',"w") {|fs|
fs.print result
}
return filename2
end

627 名前:getCDinfo.rb 続き5 [2008/08/09(土) 22:14:31 ID:/q6Hypz7]
if ARGV.size>0
# そのうちCD抜いた状態で作れるようにしたいのでこんな仕様に
ARGV.each{|tocfilename| puts createCUE(tocfilename)}
else
cdinfo=getCDinfo
exit if !cdinfo
puts <<EOD
SERVER\t\t#{iconvfs(cdinfo[:server])}
TITLE\t\t#{iconvfs(cdinfo[:title])}
PERFORMER\t#{iconvfs(cdinfo[:artist])}
GENRE\t\t#{iconvfs(cdinfo[:genre])}
DATE\t\t#{cdinfo[:year]}
DISCID\t\t#{cdinfo[:discid]}
FILE\t\t#{iconvfs(cdinfo[:filename])}
EOD
cdinfo[:tracks].size.times{|i| puts "#{format("%02d",i+1)} : #{iconvfs(cdinfo[:tracks][i])}" }
end


628 名前:getCDinfo.rb 続き6 [2008/08/09(土) 22:21:22 ID:/q6Hypz7]
使うにはRubyとruby-freedbが必要

処理の流れは
1. cdrdaoで.bin(バイトオーダ違い)と.tocを生成
2. getCDinfo.rbでfreeDBを検索してタイトル等を取得、さらに.tocを.cueに変換
 この時、ドライブに入っているCDを参照するのがカッコ悪い
 (1.でCDのTOCだけ別ファイルにしておくか?.tocだと情報がちょっと足りない)
3. soxで.binを.wavに変換
 ここでバイトオーダ(エンディアン)変換もやってるのがダサい
 誰かcdrdaoにパッチ当てて直に.wav吐けるようにしておくれ
4. cueファイルの名前に合わせてリネーム

それにしても改行制限が面倒で、スクリプト貼るのには向いてないな。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<204KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef