手動ダウンロードしたファイルをRss形式で配信するために作ったスクリプト。
ファイルをダウンロード、もしくはコピーして、パスを指定して実行する。
参考元はこちら。
makepodcast.rb
実行コマンド
ruby /path/makepodcast_add_fix_ver.rb タイトル指定 https://公開RSSのURL/ /path/ファイルのあるdir >/path/アクセスされるディレクトリ/xmlファイルの名称.xml
2022-10-27(TH)バグ対応、エスケープ文字対応
& が含まれていてxmlが機能しなかった。
xmlのエスケープ文字、参考
対応前
‘name’ => name,
require “cgi/escape”
‘name’ => CGI.escapeHTML(name),
url = CGI.escapeHTML(url)
ーーーーーーーーー全コードーーーーーーーーーーーーーー
#!/usr/bin/env ruby
require ‘time’
require ‘nkf’
##add
require ‘uri’
require “cgi/escape”
###
abort “Usage:#{$0} PodcastTitle PublicURL FilesDir” if ARGV.length < 3
title = NKF.nkf(‘-w’, ARGV[0])
location = ARGV[1]
filesDir = ARGV[2]
files = [];
#add20220714 target file
Dir.glob(File.join(filesDir, ‘*.{mp3,m4a,aac,mp4,webm,mkv,wma}’)) do |path|
# Add time calc
# p ‘★★★★’
# p path
# p File.mtime(path)
# p (Time.now – File.mtime(path))/60
# p (Time.now – File.mtime(path))/60/60
# p (Time.now – File.mtime(path))/60/60/24
#
if (Time.now – File.mtime(path))/60 < 10 then
# print(“ファイル更新から10分経っていないから飛ばす”)
next
end
######
name = File.basename(path, File.extname(path))
item = { ‘path’ => path,
# ‘name’ => name, #del_escape
‘name’ => CGI.escapeHTML(name),
‘fname’ => File.basename(path),
‘time’ => File.ctime(path),
‘length’ => File.size(path) }
files << item
end
files = files.sort do |a, b|
a[‘time’] <=> b[‘time’]
end
puts <<EOS
<?xml version=”1.0″ encoding=”utf-8″?>
<rss xmlns:itunes=”http://www.itunes.com/dtds/podcast-1.0.dtd” version=”2.0″>
<channel>
<title>#{title}</title>
EOS
#####modify20220619
files.each do |item|
url = location + item[‘fname’]
if (/\.mp3$/ =~ item[‘fname’]) then
mime = ‘audio/mp3’
elsif (/\.webm$/ =~ item[‘fname’]) then
mime = ‘video/webm’
elsif (/\.mkv$/ =~ item[‘fname’]) then
mime = ‘video/x-matroska’
elsif (/\.wma$/ =~ item[‘fname’]) then
mime = ‘audio/x-ms-wma’
else
# mime = ‘audio/mp4’
mime = ‘video/mp4’
end
###add
#url = URI.encode_www_form_component(url)
url = URI.escape(url)
#add escape
url = CGI.escapeHTML(url)
###
puts <<-EOS
<item>
<title>#{item[‘name’]}</title>
<enclosure url=”#{url}”
length=”#{item[‘length’]}”
type=”#{mime}” />
<guid isPermaLink=”true”>#{url}</guid>
<pubDate>#{item[‘time’].rfc822}</pubDate>
</item>
EOS
end
puts <<EOS
</channel>
</rss>
EOS
—–以下以前のバージョンーーーーー
#!/usr/bin/env ruby
require 'time'
require 'nkf'
##add
require 'uri'
###
abort "Usage:#{$0} PodcastTitle PublicURL FilesDir" if ARGV.length < 3
title = NKF.nkf('-w', ARGV[0])
location = ARGV[1]
filesDir = ARGV[2]
files = [];
#add20220714 target file
Dir.glob(File.join(filesDir, '*.{mp3,m4a,aac,mp4,webm,mkv,wma}')) do |path|
# Add time calc
if (Time.now - File.mtime(path))/60 < 10 then # print("ファイル更新から10分経っていないから飛ばす") next end ###### name = File.basename(path, File.extname(path)) item = { 'path' => path,
'name' => name,
'fname' => File.basename(path),
'time' => File.ctime(path),
'length' => File.size(path) }
files << item
end
files = files.sort do |a, b|
a['time'] <=> b['time']
end
puts <
#{title}
EOS
#####modify20220619
files.each do |item|
url = location + item['fname']
if (/\.mp3$/ =~ item['fname']) then
mime = 'audio/mp3'
elsif (/\.webm$/ =~ item['fname']) then
mime = 'video/webm'
elsif (/\.mkv$/ =~ item['fname']) then
mime = 'video/x-matroska'
elsif (/\.wma$/ =~ item['fname']) then
mime = 'audio/x-ms-wma'
else
# mime = 'audio/mp4'
mime = 'video/mp4'
end
###add
#url = URI.encode_www_form_component(url)
url = URI.escape(url)
###
puts <<-EOS
-
#{item['name']}
#{url}
#{item['time'].rfc822}
EOS
end
puts <
EOS