dropcaster 0.0.4 → 0.0.5.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.document +5 -5
- data/.gitignore +14 -0
- data/.travis.yml +6 -0
- data/Gemfile +2 -13
- data/Gemfile.lock +94 -29
- data/Guardfile +12 -0
- data/LICENSE.txt +20 -20
- data/{README.md → README.markdown} +185 -171
- data/Rakefile +11 -47
- data/TODO +13 -12
- data/bin/dropcaster +129 -117
- data/bin/lstags +51 -45
- data/doc/sample-channel.yml +88 -81
- data/doc/sample-sidecar.yml +19 -19
- data/dropcaster.gemspec +36 -97
- data/lib/dropcaster/channel.rb +195 -159
- data/lib/dropcaster/channel_file_locator.rb +57 -57
- data/lib/dropcaster/errors.rb +25 -25
- data/lib/dropcaster/item.rb +28 -47
- data/lib/dropcaster/log_formatter.rb +9 -9
- data/lib/dropcaster/version.rb +3 -0
- data/lib/dropcaster.rb +28 -30
- data/templates/channel.html.erb +45 -43
- data/templates/channel.rss.erb +65 -64
- data/test/extensions/windows.rb +12 -12
- data/test/fixtures/channel.yml +16 -15
- data/test/fixtures/test_template.json.erb +40 -40
- data/test/helper.rb +10 -14
- data/test/unit/test_app.rb +129 -99
- data/test/unit/test_channel.rb +80 -73
- data/test/unit/test_channel_locator.rb +76 -93
- data/test/unit/test_channel_xml.rb +90 -89
- data/test/unit/test_item.rb +51 -63
- metadata +225 -158
- data/VERSION +0 -1
- data/lib/dropcaster/hashkeys.rb +0 -12
data/Rakefile
CHANGED
@@ -1,47 +1,11 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require '
|
4
|
-
require '
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
require 'rake'
|
13
|
-
|
14
|
-
require 'jeweler'
|
15
|
-
Jeweler::Tasks.new do |gem|
|
16
|
-
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
17
|
-
gem.name = "dropcaster"
|
18
|
-
gem.homepage = "http://nerab.github.com/dropcaster"
|
19
|
-
gem.license = "MIT"
|
20
|
-
gem.summary = %Q{Simple Podcast Publishing with Dropbox}
|
21
|
-
gem.description = %Q{Dropcaster is a podcast feed generator for the command line. It is most simple to use with Dropbox, but works equally well with any other hoster.}
|
22
|
-
gem.email = "nerab@gmx.at"
|
23
|
-
gem.authors = ["nerab"]
|
24
|
-
gem.executables << 'dropcaster'
|
25
|
-
gem.executables << 'lstags'
|
26
|
-
# dependencies defined in Gemfile
|
27
|
-
end
|
28
|
-
Jeweler::RubygemsDotOrgTasks.new
|
29
|
-
|
30
|
-
require 'rake/testtask'
|
31
|
-
Rake::TestTask.new(:test) do |test|
|
32
|
-
test.libs << 'lib' << 'test'
|
33
|
-
test.pattern = 'test/**/test_*.rb'
|
34
|
-
test.verbose = true
|
35
|
-
end
|
36
|
-
|
37
|
-
task :default => :test
|
38
|
-
|
39
|
-
require 'rdoc/task'
|
40
|
-
RDoc::Task.new do |rdoc|
|
41
|
-
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
42
|
-
|
43
|
-
rdoc.rdoc_dir = 'rdoc'
|
44
|
-
rdoc.title = "dropcaster #{version}"
|
45
|
-
rdoc.rdoc_files.include('README*')
|
46
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
47
|
-
end
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'bundler/gem_tasks'
|
4
|
+
require 'rake/testtask'
|
5
|
+
|
6
|
+
Rake::TestTask.new(:test) do |test|
|
7
|
+
test.libs << 'test'
|
8
|
+
test.pattern = 'test/**/test_*.rb'
|
9
|
+
end
|
10
|
+
|
11
|
+
task :default => :test
|
data/TODO
CHANGED
@@ -1,12 +1,13 @@
|
|
1
|
-
*
|
2
|
-
*
|
3
|
-
*
|
4
|
-
*
|
5
|
-
*
|
6
|
-
*
|
7
|
-
* Support other file types than mp3 (e.g. ogg or pdf)
|
8
|
-
* Treat lyrics as plain text for the episode page, and with an optional command line switch we could also support markdown etc.
|
9
|
-
* Potential optimization for large numbers of mp3 files: If there is an existing index.rss file, do not re-read the information from those files that are still there and still have the same hash value.
|
10
|
-
* It feels pretty awkward to refer to the ID3v2 frame names all the time. After all, this is an implementation detail. Maybe we can wrap the frames with a nicer name, but still allow access to the underlying mp3info library? Maybe all we need is some aliasing and / or delegation?
|
11
|
-
* Potentially replace the ERB template with Builder::XmlMarkup, see http://builder.rubyforge.org/ (the same that Rails uses)
|
12
|
-
*
|
1
|
+
* If the option for the item template is present (e.g. --item-template templates/item.html.erb), generate individual html pages for each item from it and link to it from the index.html. Leave it off by default.
|
2
|
+
* Derive nice-looking HTML templates from Wordpress' Twenty Eleven theme
|
3
|
+
* Print warnings when one of the specs from http://www.apple.com/itunes/podcasts/specs.html is violated
|
4
|
+
* Allow muting of the iTunes warnings (see above) using a commandline switch
|
5
|
+
* Implement sidecar files
|
6
|
+
* Write up some documentation on how the mapping between ID3 tags, iTunes and channel / item attributes works
|
7
|
+
* Support other file types than mp3 (e.g. ogg or pdf)
|
8
|
+
* Treat lyrics as plain text for the episode page, and with an optional command line switch we could also support markdown etc.
|
9
|
+
* Potential optimization for large numbers of mp3 files: If there is an existing index.rss file, do not re-read the information from those files that are still there and still have the same hash value.
|
10
|
+
* It feels pretty awkward to refer to the ID3v2 frame names all the time. After all, this is an implementation detail. Maybe we can wrap the frames with a nicer name, but still allow access to the underlying mp3info library? Maybe all we need is some aliasing and / or delegation?
|
11
|
+
* Potentially replace the ERB template with Builder::XmlMarkup, see http://builder.rubyforge.org/ (the same that Rails uses)
|
12
|
+
* Improve handling of iTunes' normalization data. ```id3info test/fixtures/iTunes.mp3``` shows that comments do have a key, and we want to skip iTunNORM.
|
13
|
+
* Write up a man page so that [gem man](http://defunkt.io/gem-man/) can pick it up
|
data/bin/dropcaster
CHANGED
@@ -1,117 +1,129 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
$:.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
|
4
|
-
|
5
|
-
require '
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
dropcaster
|
17
|
-
dropcaster [
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
require '
|
28
|
-
|
29
|
-
|
30
|
-
options =
|
31
|
-
|
32
|
-
|
33
|
-
opts =
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
Dropcaster.logger =
|
38
|
-
Dropcaster.logger.
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
Dropcaster.logger.info
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
end
|
58
|
-
|
59
|
-
opts.on("--
|
60
|
-
Dropcaster.logger.info "Setting channel
|
61
|
-
options[:
|
62
|
-
end
|
63
|
-
|
64
|
-
opts.on("--
|
65
|
-
Dropcaster.logger.info "Setting channel
|
66
|
-
options[:
|
67
|
-
end
|
68
|
-
|
69
|
-
opts.on("--
|
70
|
-
Dropcaster.logger.info "Setting
|
71
|
-
options[:
|
72
|
-
end
|
73
|
-
|
74
|
-
opts.on("--
|
75
|
-
Dropcaster.logger.info "Setting
|
76
|
-
options[:
|
77
|
-
end
|
78
|
-
|
79
|
-
opts.on("--
|
80
|
-
Dropcaster.logger.info "
|
81
|
-
options[:
|
82
|
-
end
|
83
|
-
|
84
|
-
opts.on("--
|
85
|
-
|
86
|
-
|
87
|
-
end
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
Dropcaster.logger.info "
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$:.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
|
4
|
+
|
5
|
+
require 'yaml'
|
6
|
+
|
7
|
+
help = <<HELP
|
8
|
+
Dropcaster is a podcast feed generator for the command line.
|
9
|
+
|
10
|
+
Author: Nicolas E. Rabenau nerab@gmx.at
|
11
|
+
Homepage: http://rubydoc.info/gems/dropcaster/file/README.md
|
12
|
+
|
13
|
+
Basic Usage:
|
14
|
+
|
15
|
+
dropcaster Prints a podcast feed document for the mp3 files in the current directory.
|
16
|
+
dropcaster [FILE]... Prints a podcast feed document for FILES
|
17
|
+
dropcaster [DIR]... Prints a podcast feed document for the mp3 files in DIR
|
18
|
+
|
19
|
+
Options:
|
20
|
+
HELP
|
21
|
+
|
22
|
+
def usage
|
23
|
+
"Run '#{File.basename(__FILE__)} --help' for further help."
|
24
|
+
end
|
25
|
+
|
26
|
+
require 'optparse'
|
27
|
+
require 'dropcaster'
|
28
|
+
|
29
|
+
options = Hash.new
|
30
|
+
options[:auto_detect_channel_file] = true
|
31
|
+
|
32
|
+
opts = OptionParser.new do |opts|
|
33
|
+
opts.banner = help
|
34
|
+
|
35
|
+
opts.on("--verbose", "Verbose mode - displays additional diagnostic information") do |file|
|
36
|
+
Dropcaster.logger = Logger.new(STDERR)
|
37
|
+
Dropcaster.logger.formatter = Dropcaster::LogFormatter.new
|
38
|
+
Dropcaster.logger.level = Logger::INFO
|
39
|
+
end
|
40
|
+
|
41
|
+
opts.on("--trace", "Verbose mode - displays additional diagnostic information") do |file|
|
42
|
+
Dropcaster.logger = Logger.new(STDERR)
|
43
|
+
Dropcaster.logger.formatter = Dropcaster::LogFormatter.new
|
44
|
+
Dropcaster.logger.level = Logger::DEBUG
|
45
|
+
end
|
46
|
+
|
47
|
+
opts.on("--channel FILE", "Read the channel definition from FILE instead of channel.yml in the current directory.") do |file|
|
48
|
+
begin
|
49
|
+
Dropcaster.logger.info "Reading channel definition from #{file}"
|
50
|
+
options = YAML.load_file(file).merge(options)
|
51
|
+
options[:auto_detect_channel_file] = false
|
52
|
+
rescue
|
53
|
+
Dropcaster.logger.error "Could not load channel definition. #{$!.message}"
|
54
|
+
Dropcaster.logger.info $!.backtrace
|
55
|
+
exit(1)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
opts.on("--title STRING", "Use STRING as the channel's title. Overrides settings read from channel definition file.") do |title|
|
60
|
+
Dropcaster.logger.info "Setting channel title to '#{title}' via command line"
|
61
|
+
options[:title] = title
|
62
|
+
end
|
63
|
+
|
64
|
+
opts.on("--subtitle STRING", "Use STRING as the channel's subtitle. Overrides settings read from channel definition file.") do |subtitle|
|
65
|
+
Dropcaster.logger.info "Setting channel subtitle to '#{subtitle}' via command line"
|
66
|
+
options[:subtitle] = subtitle
|
67
|
+
end
|
68
|
+
|
69
|
+
opts.on("--url URL", "Use URL as the channel's url. Overrides settings read from channel definition file.") do |url|
|
70
|
+
Dropcaster.logger.info "Setting channel URL to '#{url}' via command line"
|
71
|
+
options[:url] = url
|
72
|
+
end
|
73
|
+
|
74
|
+
opts.on("--description STRING", "Use STRING as the channel's description. Overrides settings read from channel definition file.") do |description|
|
75
|
+
Dropcaster.logger.info "Setting channel description to '#{description}' via command line"
|
76
|
+
options[:description] = description
|
77
|
+
end
|
78
|
+
|
79
|
+
opts.on("--enclosures URL", "Use URL as the base URL for the channel's enclosures. Overrides settings read from channel definition file.") do |enclosures_url|
|
80
|
+
Dropcaster.logger.info "Setting enclosures base URL to '#{enclosures_url}' via command line"
|
81
|
+
options[:enclosures_url] = enclosures_url
|
82
|
+
end
|
83
|
+
|
84
|
+
opts.on("--image URL", "Use URL as the channel's image URL. Overrides settings read from channel definition file.") do |image_url|
|
85
|
+
Dropcaster.logger.info "Setting image URL to '#{image_url}' via command line"
|
86
|
+
options[:image_url] = image_url
|
87
|
+
end
|
88
|
+
|
89
|
+
opts.on("--channel-template FILE", "Use FILE as template for generating the channel feed. Overrides the default that comes with Dropcaster.") do |file|
|
90
|
+
Dropcaster.logger.info "Using'#{file}' as channel template file"
|
91
|
+
options[:channel_template] = file
|
92
|
+
end
|
93
|
+
|
94
|
+
opts.on("--version", "Display current version") do
|
95
|
+
puts "#{File.basename(__FILE__)} " + Dropcaster::VERSION
|
96
|
+
exit 0
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
opts.parse!
|
101
|
+
sources = ARGV.blank? ? '.' : ARGV
|
102
|
+
|
103
|
+
if options[:auto_detect_channel_file]
|
104
|
+
# There was no channel file specified, so we try to load channel.yml from sources dir
|
105
|
+
channel_file = Dropcaster::ChannelFileLocator.locate(sources)
|
106
|
+
|
107
|
+
if File.exists?(channel_file)
|
108
|
+
Dropcaster.logger.info "Auto-detected channel file at #{channel_file}"
|
109
|
+
options_from_yaml = YAML.load_file(channel_file)
|
110
|
+
options = options_from_yaml.merge(options)
|
111
|
+
else
|
112
|
+
Dropcaster.logger.error "No channel file found at #{channel_file})"
|
113
|
+
Dropcaster.logger.info usage
|
114
|
+
exit(1) # No way to continue without a channel definition
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
Dropcaster.logger.info "Generating the channel with these options: #{options.inspect}"
|
119
|
+
|
120
|
+
begin
|
121
|
+
puts Dropcaster::Channel.new(sources, options).to_rss
|
122
|
+
rescue
|
123
|
+
Dropcaster.logger.error $!.message
|
124
|
+
$!.backtrace.each do |line|
|
125
|
+
Dropcaster.logger.debug(line)
|
126
|
+
end
|
127
|
+
Dropcaster.logger.info usage
|
128
|
+
exit(1)
|
129
|
+
end
|
data/bin/lstags
CHANGED
@@ -1,45 +1,51 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
unless ARGV.size == 1
|
4
|
-
STDERR.puts "#{File.basename(__FILE__)}: Missing required parameter for the mp3 file to process"
|
5
|
-
exit(1)
|
6
|
-
end
|
7
|
-
|
8
|
-
require 'rubygems'
|
9
|
-
require 'mp3info'
|
10
|
-
|
11
|
-
begin
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
puts
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
end
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
unless ARGV.size == 1
|
4
|
+
STDERR.puts "#{File.basename(__FILE__)}: Missing required parameter for the mp3 file to process"
|
5
|
+
exit(1)
|
6
|
+
end
|
7
|
+
|
8
|
+
require 'rubygems'
|
9
|
+
require 'mp3info'
|
10
|
+
|
11
|
+
begin
|
12
|
+
file_name = ARGV.first
|
13
|
+
|
14
|
+
puts "Listing tags for file: #{file_name}"
|
15
|
+
|
16
|
+
Mp3Info.open(file_name) do |mp3info|
|
17
|
+
puts 'ID3v1 tags:'
|
18
|
+
mp3info.tag.keys.each{|key|
|
19
|
+
puts " #{key} => #{mp3info.tag.send(key)}"
|
20
|
+
}
|
21
|
+
puts
|
22
|
+
puts 'ID3v2 tags:'
|
23
|
+
mp3info.tag2.keys.each{|key|
|
24
|
+
case key
|
25
|
+
when 'PIC'
|
26
|
+
when 'APIC'
|
27
|
+
# picture - do not print binary data
|
28
|
+
when 'ULT'
|
29
|
+
print " ULT => "
|
30
|
+
block_counter = 0
|
31
|
+
mp3info.tag2.ULT.bytes{|b|
|
32
|
+
print "0x%02x " % b.to_i
|
33
|
+
print b > 31 ? " '#{b.chr}' " : " " * 5
|
34
|
+
if (block_counter += 1) > 7 # display in blocks of 8 bytes
|
35
|
+
puts
|
36
|
+
print " " * 9
|
37
|
+
block_counter = 0
|
38
|
+
end
|
39
|
+
}
|
40
|
+
puts
|
41
|
+
else
|
42
|
+
puts " #{key} => #{mp3info.tag2.send(key)}"
|
43
|
+
end
|
44
|
+
}
|
45
|
+
end
|
46
|
+
puts "Modification date: #{File.new(file_name).mtime}"
|
47
|
+
|
48
|
+
rescue
|
49
|
+
puts "Error: #{$!.message}"
|
50
|
+
exit(1)
|
51
|
+
end
|
data/doc/sample-channel.yml
CHANGED
@@ -1,81 +1,88 @@
|
|
1
|
-
#
|
2
|
-
# A sample RSS channel definition
|
3
|
-
#
|
4
|
-
# This file is read by Dropcaster
|
5
|
-
# http://github.com/nerab/dropcaster
|
6
|
-
#
|
7
|
-
# It defines the properties of your podcast channel.
|
8
|
-
#
|
9
|
-
|
10
|
-
#
|
11
|
-
# Title (name) of the podcast
|
12
|
-
#
|
13
|
-
:title: 'All About Everything'
|
14
|
-
|
15
|
-
#
|
16
|
-
# Short description of the podcast (a few words)
|
17
|
-
#
|
18
|
-
:subtitle: 'A show about everything'
|
19
|
-
|
20
|
-
#
|
21
|
-
# URL to the podcast.
|
22
|
-
#
|
23
|
-
:url: 'http://www.example.com/podcasts/everything/'
|
24
|
-
|
25
|
-
#
|
26
|
-
# Optional base URL for enclosure links
|
27
|
-
#
|
28
|
-
:enclosures_url: 'http://www.example.com/podcasts/everything/episodes'
|
29
|
-
|
30
|
-
#
|
31
|
-
# Language of the podcast - ISO 639-1 Alpha-2 list (two-letter language codes, some with possible modifiers, such as "en-us").
|
32
|
-
#
|
33
|
-
:language: 'en-us'
|
34
|
-
|
35
|
-
#
|
36
|
-
# Not visible in iTunes, but useful as a statement in the feed
|
37
|
-
#
|
38
|
-
:copyright: '© 2011 John Doe & Family'
|
39
|
-
|
40
|
-
#
|
41
|
-
# Author / creator of the podcast. In iTunes, it is displayed in the artist column.
|
42
|
-
#
|
43
|
-
:author: 'John Doe'
|
44
|
-
|
45
|
-
#
|
46
|
-
# Longer description of the podcast
|
47
|
-
#
|
48
|
-
:description: 'All About Everything is a show about everything. Each week we dive into any subject known to man and talk about it as much as we can. Look for our Podcast in the iTunes Store!'
|
49
|
-
|
50
|
-
#
|
51
|
-
# Contact information of the owner of the podcast. Not be publicly displayed in iTunes.
|
52
|
-
#
|
53
|
-
:owner:
|
54
|
-
:name: 'John Doe'
|
55
|
-
:email: 'john.doe@example.com'
|
56
|
-
|
57
|
-
#
|
58
|
-
# iTunes prefers square .jpg images that are at least 600 x 600 pixels
|
59
|
-
#
|
60
|
-
# If the URL does not start with http: or https:, it will be prefixed with the channel url.
|
61
|
-
#
|
62
|
-
:image_url: 'AllAboutEverything.jpg'
|
63
|
-
|
64
|
-
#
|
65
|
-
# Category / categories of the podcast
|
66
|
-
#
|
67
|
-
# For iTunes, see http://www.apple.com/itunes/podcasts/specs.html#categories for applicable values
|
68
|
-
#
|
69
|
-
# Examples:
|
70
|
-
# :categories: 'Technology'
|
71
|
-
# :categories: ['Technology', 'Gadgets']
|
72
|
-
# :categories: ['TV & Film', ['Technology', 'Gadgets']]
|
73
|
-
#
|
74
|
-
# Don't HTML-escape the categories, this will be taken care of by Dropcaster
|
75
|
-
#
|
76
|
-
:categories: ['Technology', 'Gadgets']
|
77
|
-
|
78
|
-
#
|
79
|
-
# Yes, No or Clean, see http://www.apple.com/itunes/podcasts/specs.html#explicit
|
80
|
-
#
|
81
|
-
:explicit: No
|
1
|
+
#
|
2
|
+
# A sample RSS channel definition
|
3
|
+
#
|
4
|
+
# This file is read by Dropcaster
|
5
|
+
# http://github.com/nerab/dropcaster
|
6
|
+
#
|
7
|
+
# It defines the properties of your podcast channel.
|
8
|
+
#
|
9
|
+
|
10
|
+
#
|
11
|
+
# Title (name) of the podcast
|
12
|
+
#
|
13
|
+
:title: 'All About Everything'
|
14
|
+
|
15
|
+
#
|
16
|
+
# Short description of the podcast (a few words)
|
17
|
+
#
|
18
|
+
:subtitle: 'A show about everything'
|
19
|
+
|
20
|
+
#
|
21
|
+
# URL to the podcast.
|
22
|
+
#
|
23
|
+
:url: 'http://www.example.com/podcasts/everything/'
|
24
|
+
|
25
|
+
#
|
26
|
+
# Optional base URL for enclosure links
|
27
|
+
#
|
28
|
+
:enclosures_url: 'http://www.example.com/podcasts/everything/episodes'
|
29
|
+
|
30
|
+
#
|
31
|
+
# Language of the podcast - ISO 639-1 Alpha-2 list (two-letter language codes, some with possible modifiers, such as "en-us").
|
32
|
+
#
|
33
|
+
:language: 'en-us'
|
34
|
+
|
35
|
+
#
|
36
|
+
# Not visible in iTunes, but useful as a statement in the feed
|
37
|
+
#
|
38
|
+
:copyright: '© 2011 John Doe & Family'
|
39
|
+
|
40
|
+
#
|
41
|
+
# Author / creator of the podcast. In iTunes, it is displayed in the artist column.
|
42
|
+
#
|
43
|
+
:author: 'John Doe'
|
44
|
+
|
45
|
+
#
|
46
|
+
# Longer description of the podcast
|
47
|
+
#
|
48
|
+
:description: 'All About Everything is a show about everything. Each week we dive into any subject known to man and talk about it as much as we can. Look for our Podcast in the iTunes Store!'
|
49
|
+
|
50
|
+
#
|
51
|
+
# Contact information of the owner of the podcast. Not be publicly displayed in iTunes.
|
52
|
+
#
|
53
|
+
:owner:
|
54
|
+
:name: 'John Doe'
|
55
|
+
:email: 'john.doe@example.com'
|
56
|
+
|
57
|
+
#
|
58
|
+
# iTunes prefers square .jpg images that are at least 600 x 600 pixels
|
59
|
+
#
|
60
|
+
# If the URL does not start with http: or https:, it will be prefixed with the channel url.
|
61
|
+
#
|
62
|
+
:image_url: 'AllAboutEverything.jpg'
|
63
|
+
|
64
|
+
#
|
65
|
+
# Category / categories of the podcast
|
66
|
+
#
|
67
|
+
# For iTunes, see http://www.apple.com/itunes/podcasts/specs.html#categories for applicable values
|
68
|
+
#
|
69
|
+
# Examples:
|
70
|
+
# :categories: 'Technology'
|
71
|
+
# :categories: ['Technology', 'Gadgets']
|
72
|
+
# :categories: ['TV & Film', ['Technology', 'Gadgets']]
|
73
|
+
#
|
74
|
+
# Don't HTML-escape the categories, this will be taken care of by Dropcaster
|
75
|
+
#
|
76
|
+
:categories: ['Technology', 'Gadgets']
|
77
|
+
|
78
|
+
#
|
79
|
+
# Yes, No or Clean, see http://www.apple.com/itunes/podcasts/specs.html#explicit
|
80
|
+
#
|
81
|
+
:explicit: No
|
82
|
+
|
83
|
+
#
|
84
|
+
# Keywords
|
85
|
+
#
|
86
|
+
# Apple recommends to use not more than 12 keywords
|
87
|
+
#
|
88
|
+
:keywords: [salt, pepper, shaker, exciting]
|
data/doc/sample-sidecar.yml
CHANGED
@@ -1,19 +1,19 @@
|
|
1
|
-
#
|
2
|
-
# Sample sidecar file
|
3
|
-
#
|
4
|
-
# If this file is present side-by-side with an mp3 file, and if it has the same name as the mp3 (but with
|
5
|
-
# an extension of yml or yaml), then any setting made in this file will be used instead of the value from the mp3.
|
6
|
-
#
|
7
|
-
:title: 'Title of the episode'
|
8
|
-
:author: 'Author of the episode'
|
9
|
-
:subtitle: 'Subtitle of the episode'
|
10
|
-
:description: 'Desciption and summary of the episode'
|
11
|
-
:image_url: 'URL to an image specific for this episode'
|
12
|
-
:enclosure:
|
13
|
-
:url: 'URL where this episode can be downloaded'
|
14
|
-
:length: 42 # length of the episode in milliseconds
|
15
|
-
:type: 'usually audio/mp3'
|
16
|
-
:guid: 'Globally unique id of the episode'
|
17
|
-
:pubDate: 'Date as per RFC 2822; e.g. Wed, 15 Jun 2005 19:00:00 GMT'
|
18
|
-
:duration: 'Either HH:MM:SS, H:MM:SS, MM:SS, M:SS, or SS'
|
19
|
-
:keywords: ['ruby', 'rails', 'podcast'] # up to 12 text keywords
|
1
|
+
#
|
2
|
+
# Sample sidecar file
|
3
|
+
#
|
4
|
+
# If this file is present side-by-side with an mp3 file, and if it has the same name as the mp3 (but with
|
5
|
+
# an extension of yml or yaml), then any setting made in this file will be used instead of the value from the mp3.
|
6
|
+
#
|
7
|
+
:title: 'Title of the episode'
|
8
|
+
:author: 'Author of the episode'
|
9
|
+
:subtitle: 'Subtitle of the episode'
|
10
|
+
:description: 'Desciption and summary of the episode'
|
11
|
+
:image_url: 'URL to an image specific for this episode'
|
12
|
+
:enclosure:
|
13
|
+
:url: 'URL where this episode can be downloaded'
|
14
|
+
:length: 42 # length of the episode in milliseconds
|
15
|
+
:type: 'usually audio/mp3'
|
16
|
+
:guid: 'Globally unique id of the episode'
|
17
|
+
:pubDate: 'Date as per RFC 2822; e.g. Wed, 15 Jun 2005 19:00:00 GMT'
|
18
|
+
:duration: 'Either HH:MM:SS, H:MM:SS, MM:SS, M:SS, or SS'
|
19
|
+
:keywords: ['ruby', 'rails', 'podcast'] # up to 12 text keywords
|