dropcaster 0.0.5.rc1 → 0.0.5.rc3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/.travis.yml +2 -1
- data/Gemfile.lock +70 -55
- data/README.markdown +2 -6
- data/VISION.markdown +189 -0
- data/dropcaster.gemspec +15 -14
- data/lib/dropcaster/channel.rb +1 -1
- data/lib/dropcaster/item.rb +4 -0
- data/lib/dropcaster/version.rb +1 -1
- data/lib/dropcaster.rb +1 -1
- data/test/Vagrantfile +18 -0
- data/test/fixtures/channel.yml +3 -3
- data/test/fixtures/test_template.json.erb +1 -1
- data/test/helper.rb +1 -0
- data/test/unit/test_channel_xml.rb +2 -2
- data/test/unit/test_item.rb +2 -2
- metadata +81 -64
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d01ad09f1151c57baf7349a1893b8619a6b56c92
|
4
|
+
data.tar.gz: 47106a0c706d6f6dac8594c77e3e0d4c1634b015
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 90630400d639e97de96e25751eaa3921b3a4c1163b56c7fbe886a1c8daed6d61b3838c1a11c3a31d6b3944b6d268fd201ef6fe7aea5cc426c83a0de431e17c56
|
7
|
+
data.tar.gz: 62f5a563b371b9cb370bd29fe5fc249482a99753c5a1f55ad497e8b3071d8ffc8cfcee4a8b891d4de4a4c5d620e3ee2cc6db54a31839c6bf7feda8d76ace1e0d
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,77 +1,91 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
dropcaster (0.0.5.
|
5
|
-
activesupport
|
6
|
-
ruby-mp3info
|
4
|
+
dropcaster (0.0.5.rc3)
|
5
|
+
activesupport
|
6
|
+
ruby-mp3info
|
7
7
|
|
8
8
|
GEM
|
9
9
|
remote: https://rubygems.org/
|
10
10
|
specs:
|
11
|
-
activesupport (
|
12
|
-
i18n (~> 0.
|
13
|
-
|
11
|
+
activesupport (4.2.0)
|
12
|
+
i18n (~> 0.7)
|
13
|
+
json (~> 1.7, >= 1.7.7)
|
14
|
+
minitest (~> 5.1)
|
15
|
+
thread_safe (~> 0.3, >= 0.3.4)
|
16
|
+
tzinfo (~> 1.1)
|
14
17
|
binding_of_caller (0.7.2)
|
15
18
|
debug_inspector (>= 0.0.1)
|
16
|
-
celluloid (0.
|
17
|
-
timers (~>
|
18
|
-
celluloid-io (0.15.0)
|
19
|
-
celluloid (>= 0.15.0)
|
20
|
-
nio4r (>= 0.5.0)
|
19
|
+
celluloid (0.16.0)
|
20
|
+
timers (~> 4.0.0)
|
21
21
|
coderay (1.1.0)
|
22
22
|
debug_inspector (0.0.2)
|
23
|
-
ffi (1.9.
|
24
|
-
|
25
|
-
|
23
|
+
ffi (1.9.6)
|
24
|
+
ffi (1.9.6-x86-mingw32)
|
25
|
+
formatador (0.2.5)
|
26
|
+
guard (2.11.1)
|
26
27
|
formatador (>= 0.2.4)
|
27
|
-
listen (~> 2.
|
28
|
+
listen (~> 2.7)
|
28
29
|
lumberjack (~> 1.0)
|
30
|
+
nenv (~> 0.1)
|
31
|
+
notiffany (~> 0.0)
|
29
32
|
pry (>= 0.9.12)
|
33
|
+
shellany (~> 0.0)
|
30
34
|
thor (>= 0.18.1)
|
31
|
-
guard-bundler (2.
|
35
|
+
guard-bundler (2.1.0)
|
32
36
|
bundler (~> 1.0)
|
33
37
|
guard (~> 2.2)
|
34
|
-
|
35
|
-
|
38
|
+
guard-compat (~> 1.1)
|
39
|
+
guard-compat (1.2.1)
|
40
|
+
guard-minitest (2.4.3)
|
41
|
+
guard-compat (~> 1.2)
|
36
42
|
minitest (>= 3.0)
|
37
|
-
|
38
|
-
|
43
|
+
hitimes (1.2.2)
|
44
|
+
hitimes (1.2.2-x86-mingw32)
|
45
|
+
i18n (0.7.0)
|
46
|
+
json (1.8.2)
|
47
|
+
libnotify (0.9.1)
|
39
48
|
ffi (>= 1.0.11)
|
40
|
-
libxml-ruby (2.
|
41
|
-
|
42
|
-
listen (2.5.0)
|
49
|
+
libxml-ruby (2.8.0)
|
50
|
+
listen (2.8.5)
|
43
51
|
celluloid (>= 0.15.2)
|
44
|
-
celluloid-io (>= 0.15.0)
|
45
52
|
rb-fsevent (>= 0.9.3)
|
46
53
|
rb-inotify (>= 0.9)
|
47
|
-
lumberjack (1.0.
|
54
|
+
lumberjack (1.0.9)
|
48
55
|
method_source (0.8.2)
|
49
|
-
minitest (5.
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
56
|
+
minitest (5.5.1)
|
57
|
+
nenv (0.2.0)
|
58
|
+
notiffany (0.0.4)
|
59
|
+
nenv (~> 0.1)
|
60
|
+
shellany (~> 0.0)
|
61
|
+
pry (0.10.1)
|
62
|
+
coderay (~> 1.1.0)
|
63
|
+
method_source (~> 0.8.1)
|
55
64
|
slop (~> 3.4)
|
56
|
-
pry (0.
|
57
|
-
coderay (~> 1.0)
|
58
|
-
method_source (~> 0.8)
|
65
|
+
pry (0.10.1-x86-mingw32)
|
66
|
+
coderay (~> 1.1.0)
|
67
|
+
method_source (~> 0.8.1)
|
59
68
|
slop (~> 3.4)
|
60
69
|
win32console (~> 1.3)
|
61
|
-
pry-nav (0.2.
|
62
|
-
pry (
|
70
|
+
pry-nav (0.2.4)
|
71
|
+
pry (>= 0.9.10, < 0.11.0)
|
63
72
|
pry-stack_explorer (0.4.9.1)
|
64
73
|
binding_of_caller (>= 0.7)
|
65
74
|
pry (>= 0.9.11)
|
66
|
-
rake (10.
|
75
|
+
rake (10.4.2)
|
67
76
|
rb-fsevent (0.9.4)
|
68
|
-
rb-inotify (0.9.
|
77
|
+
rb-inotify (0.9.5)
|
69
78
|
ffi (>= 0.5.0)
|
70
|
-
rb-readline (0.5.
|
71
|
-
ruby-mp3info (0.8.
|
72
|
-
|
73
|
-
|
74
|
-
|
79
|
+
rb-readline (0.5.2)
|
80
|
+
ruby-mp3info (0.8.5)
|
81
|
+
shellany (0.0.1)
|
82
|
+
slop (3.6.0)
|
83
|
+
thor (0.19.1)
|
84
|
+
thread_safe (0.3.4)
|
85
|
+
timers (4.0.1)
|
86
|
+
hitimes
|
87
|
+
tzinfo (1.2.2)
|
88
|
+
thread_safe (~> 0.1)
|
75
89
|
win32console (1.3.2-x86-mingw32)
|
76
90
|
|
77
91
|
PLATFORMS
|
@@ -79,16 +93,17 @@ PLATFORMS
|
|
79
93
|
x86-mingw32
|
80
94
|
|
81
95
|
DEPENDENCIES
|
82
|
-
bundler
|
96
|
+
bundler
|
83
97
|
dropcaster!
|
84
|
-
guard-bundler
|
85
|
-
guard-minitest
|
86
|
-
libnotify
|
87
|
-
libxml-ruby
|
88
|
-
|
89
|
-
pry
|
90
|
-
pry-
|
91
|
-
|
92
|
-
|
93
|
-
rb-
|
94
|
-
rb-
|
98
|
+
guard-bundler
|
99
|
+
guard-minitest
|
100
|
+
libnotify
|
101
|
+
libxml-ruby
|
102
|
+
minitest
|
103
|
+
pry
|
104
|
+
pry-nav
|
105
|
+
pry-stack_explorer
|
106
|
+
rake
|
107
|
+
rb-fsevent
|
108
|
+
rb-inotify
|
109
|
+
rb-readline
|
data/README.markdown
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
[![Build Status](https://travis-ci.org/nerab/dropcaster.png?branch=master)](https://travis-ci.org/nerab/dropcaster)
|
4
4
|
|
5
|
+
_This project is developed with the [readme-driven development](http://tom.preston-werner.com/2010/08/23/readme-driven-development.html) method. This file describes the functionality that is actually implemented, whereas the [VISION](VISION.md) reflects the vision where the tool should go._
|
6
|
+
|
5
7
|
[Dropcaster](http://rubydoc.info/gems/dropcaster/file/README.md) 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.
|
6
8
|
|
7
9
|
Author: Nicolas E. Rabenau <nerab@gmx.at>
|
@@ -136,12 +138,6 @@ As discussed above, the output of this command can be written to a file, too:
|
|
136
138
|
|
137
139
|
Dropcaster works exactly the same, whether it generates an RSS feed or a HTML page. Therefore, all options discussed before also apply when generating HTML.
|
138
140
|
|
139
|
-
## Sidecar files
|
140
|
-
|
141
|
-
You may override the meta data for any episode by providing a YAML file with the same name as the mp3 file, but with an extension of yml or yaml (ususally refered to as [sidecar file](http://en.wikipedia.org/wiki/Sidecar_file)). Any attributes specified in this file override the ID tags in the mp3 file.
|
142
|
-
|
143
|
-
Dropcaster will only write the sidecar file if the appropriate command line option was passed, and it will use the information in it only for generating new files like the index.rss. It will not write back to mp3 files.
|
144
|
-
|
145
141
|
## A Note on iTunes
|
146
142
|
|
147
143
|
The generated XML file contains all elements required for iTunes. However, Dropcaster will not notify the iTunes store about new episodes.
|
data/VISION.markdown
ADDED
@@ -0,0 +1,189 @@
|
|
1
|
+
# Dropcaster - Simple Podcast Publishing with Dropbox
|
2
|
+
|
3
|
+
[![Build Status](https://travis-ci.org/nerab/dropcaster.png?branch=master)](https://travis-ci.org/nerab/dropcaster)
|
4
|
+
|
5
|
+
_This project is developed with the [readme-driven development](http://tom.preston-werner.com/2010/08/23/readme-driven-development.html) method. This file contains the vision, whereas the [README](README.md) reflects the functionality that is actually implemented._
|
6
|
+
|
7
|
+
[Dropcaster](http://rubydoc.info/gems/dropcaster/file/README.md) 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.
|
8
|
+
|
9
|
+
Author: Nicolas E. Rabenau <nerab@gmx.at>
|
10
|
+
|
11
|
+
# What is the problem Dropcaster is trying to solve?
|
12
|
+
|
13
|
+
You have a number of podcast episodes that you would like to publish as a feed. Nothing else - no fancy website, no stats, nothing but the pure podcast.
|
14
|
+
|
15
|
+
With Dropcaster, you simply put the mp3 files into the Public folder of your [Dropbox](http://www.dropbox.com/). Then run the Dropcaster script that generates the feed, writing it to a file in your Dropbox, e.g. index.rss. All mp3 files in the Public folder of your Dropbox are already accessible via HTTP, and so will the RSS file. You can then take the RSS file's URL and publish it (again, this is because any file in the Public folder of a Dropbox automatically gets a public, HTTP-accessible URL).
|
16
|
+
|
17
|
+
The feed URL can be consumed by any podcatcher, e.g. [iTunes](http://www.apple.com/itunes/) or [Juice](http://juicereceiver.sourceforge.net/).
|
18
|
+
|
19
|
+
# Installation
|
20
|
+
|
21
|
+
To get started, use RubyGems to install Dropcaster:
|
22
|
+
|
23
|
+
$ gem install dropcaster
|
24
|
+
|
25
|
+
With Dropcaster installed, you can use the `dropcaster` command to generate a new podcast feed document.
|
26
|
+
|
27
|
+
# Basic Usage
|
28
|
+
|
29
|
+
Once Dropcaster is installed, the only two other things you will need are a channel definition and one or more mp3 files to publish.
|
30
|
+
|
31
|
+
Let's start with the channel definition. It is a simple [YAML](http://yaml.org/) file that holds the general information about your podcast channel. According to the [RSS 2.0 spec](http://feedvalidator.org/docs/rss2.html#requiredChannelElements), the only mandatory information that your channel absolutely needs are a title, a description and a link to a web site where the channel belongs to.
|
32
|
+
|
33
|
+
The simplest channel file looks like this:
|
34
|
+
|
35
|
+
:title: 'All About Everything'
|
36
|
+
:subtitle: 'A show about everything'
|
37
|
+
:url: 'http://www.example.com/podcasts/everything/index.html'
|
38
|
+
|
39
|
+
Store this file as channel.yml in the same directory where the mp3 files of your podcast reside. The channel definition is expected to be present in the same directory as your mp3 files, but this can be overridden using a command line switch. You can find a [more elaborate example](http://github.com/nerab/dropcaster/blob/master/doc/sample-channel.yml) for the channel definition in the doc folder of the Dropcaster gem. You can find it by running `gem open dropcaster`.
|
40
|
+
|
41
|
+
Now that we have the podcast channel defined, we need at least one episode (an audio file) in it. From Dropcaster's perspective, it does not matter how the episode was produced, but the critical information is the meta data in the mp3 file, because that is the authoritative source for the episode information. Almost all audio editors can write metadata, usually called ID3 tags. Dropcaster reads these tags from the mp3 files and fills the item element in the feed (that's how an episode is defined, technically) from it.
|
42
|
+
|
43
|
+
With all required pieces in place, we could generate the podcast feed. Just before we do that, we will inspect the feed by running the following commands:
|
44
|
+
|
45
|
+
$ cd ~/Dropbox/Public
|
46
|
+
$ dropcaster
|
47
|
+
|
48
|
+
(The above lines assume that you are using Dropbox, and that there is at least one mp3 file in ~/Dropbox/Public).
|
49
|
+
|
50
|
+
Dropcaster will print the feed to standard-out, without writing it to disk. When you are happy with the results, call Dropcaster again, but redirect the output to a file, this time:
|
51
|
+
|
52
|
+
$ dropcaster > index.rss
|
53
|
+
|
54
|
+
If all went well, you will now have a valid podcast feed in your Dropbox, listing all mp3 files as podcast episodes. Please see the section [Publish Your Feed] for details on how to find the public URL of your feed.
|
55
|
+
|
56
|
+
# Use Cases
|
57
|
+
|
58
|
+
## Publish a New Episode
|
59
|
+
|
60
|
+
1. Drop the mp3 file into the Dropbox Public folder (e.g. ~/Dropbox/Public), and then run the following command in the directory where the mp3 files reside:
|
61
|
+
|
62
|
+
$ dropcaster > index.rss
|
63
|
+
|
64
|
+
1. Dropbox will sync the updated index.rss file to its web server and any podcast client will download the new episode as soon as it has loaded the updated index.rss.
|
65
|
+
|
66
|
+
## Delete an Episode
|
67
|
+
|
68
|
+
Remove the mp3 you want to delete from the Dropbox Public folder, and then run the following command in the directory where the remaining mp3 files reside:
|
69
|
+
|
70
|
+
$ dropcaster > index.rss
|
71
|
+
|
72
|
+
## Replace an Episode With an Updated File
|
73
|
+
|
74
|
+
In the Dropbox Public folder, replace the mp3 you want to update with a new version, and then run the following command in the directory where the mp3 files reside:
|
75
|
+
|
76
|
+
$ dropcaster > index.rss
|
77
|
+
|
78
|
+
## Publish Your Feed
|
79
|
+
|
80
|
+
1. Re-generate the feed to make sure the it is up to date (see above):
|
81
|
+
|
82
|
+
$ dropcaster > index.rss
|
83
|
+
|
84
|
+
1. In your Dropbox Public folder, right-click the index.rss and select "Dropbox / Copy public link". This copies the public, HTTP-addressable link to your podcast into the clipboard.
|
85
|
+
1. Publish this link and tell people to subscribe to it.
|
86
|
+
|
87
|
+
## Generate a Podcast Feed for a Subset of the Available MP3 Files
|
88
|
+
|
89
|
+
Dropcaster accepts any number of files or directories as episodes. For directories, all files ending in .mp3 will be included. For advanced filtering, you can use regular shell patterns to further specify which files will be included. These patterns will be resolved by the shell itself (e.g. bash), and not by Dropcaster.
|
90
|
+
|
91
|
+
For example, in order to generate a feed that only publishes MP3 files where the name starts with 'A', call Dropcaster like this:
|
92
|
+
|
93
|
+
$ dropcaster A*.mp3 > index.rss
|
94
|
+
|
95
|
+
## Publish More than One Feed
|
96
|
+
|
97
|
+
$ dropcaster project1 > project1.rss
|
98
|
+
$ dropcaster project2 > project2.rss
|
99
|
+
|
100
|
+
or
|
101
|
+
|
102
|
+
$ cd project1
|
103
|
+
$ dropcaster > index.rss
|
104
|
+
$ cd ../project2
|
105
|
+
$ dropcaster > index.rss
|
106
|
+
|
107
|
+
## Include Episodes From Two Subdirectories Into a Single Feed
|
108
|
+
|
109
|
+
$ dropcaster project1 project2 > index.rss
|
110
|
+
|
111
|
+
# Advanced features
|
112
|
+
|
113
|
+
## Overriding defaults
|
114
|
+
|
115
|
+
Dropcaster is opinionated software. That means, it makes a number of assumptions about names, files, and directory structures. Dropcaster will be most simple to use if these assumptions and opinions apply to your way of using the program.
|
116
|
+
|
117
|
+
However, it is still possible to override Dropcaster's behavior in many ways. You can, for instance, host your episode files on a different URL than the channel. Instead of writing title, subtitle, etc. to a channel.yml, you may also spedify them on the command line.
|
118
|
+
|
119
|
+
In order to find out about all the options, simply run
|
120
|
+
|
121
|
+
$ dropcaster --help
|
122
|
+
|
123
|
+
## Using custom channel templates
|
124
|
+
|
125
|
+
Dropcaster generates a feed that is suitable for most podcast clients, especially iTunes. By default, dropcaster follows [Apple's podcast specs / recommendations](http://www.apple.com/itunes/podcasts/specs.html).
|
126
|
+
|
127
|
+
It is also possible to customize the channel by supplying an alternative channel template on the command line. Start your own template by copying the default template, or look at the test directory of the dropcaster gem. You can get there by running `gem open dropcaster`.
|
128
|
+
|
129
|
+
## Generate a HTML page for your podcast
|
130
|
+
|
131
|
+
Besides generating an RSS feed, dropcaster can also generate HTML that can be used as a home page for your podcast. The template directory contains a sample template that can be used to get started:
|
132
|
+
|
133
|
+
$ dropcaster --channel-template templates/channel.html.erb
|
134
|
+
|
135
|
+
As discussed above, the output of this command can be written to a file, too:
|
136
|
+
|
137
|
+
$ dropcaster --channel-template templates/channel.html.erb > ~/Dropbox/Public/allabouteverything.html
|
138
|
+
|
139
|
+
Dropcaster works exactly the same, whether it generates an RSS feed or a HTML page. Therefore, all options discussed before also apply when generating HTML.
|
140
|
+
|
141
|
+
## Sidecar files
|
142
|
+
|
143
|
+
You may override the meta data for any episode by providing a YAML file with the same name as the mp3 file, but with an extension of yml or yaml (ususally refered to as [sidecar file](http://en.wikipedia.org/wiki/Sidecar_file)). Any attributes specified in this file override the ID tags in the mp3 file.
|
144
|
+
|
145
|
+
Dropcaster will only write the sidecar file if the appropriate command line option was passed, and it will use the information in it only for generating new files like the index.rss. It will not write back to mp3 files.
|
146
|
+
|
147
|
+
Sidecar files are also useful for referencing a (remote) enclosure without re-hosting it (which, besides wasted bandwidth, could also create copyright issues). If a sidecar file is present and it points to a remote media URL, dropcaster will generate an item in the feed, even if the media is not available locally.
|
148
|
+
|
149
|
+
## A Note on iTunes
|
150
|
+
|
151
|
+
The generated XML file contains all elements required for iTunes. However, Dropcaster will not notify the iTunes store about new episodes.
|
152
|
+
|
153
|
+
## Using Dropcaster Without Dropbox
|
154
|
+
|
155
|
+
The whole concept of Dropcaster works perfectly fine without Dropbox. Just run the Dropcaster script in a directory of mp3 files and upload the files as well as the generated index.rss to a web server. Leave the relative position of the index and mp3 files as is, otherwise the path to the mp3 files in index.rss will become invalid.
|
156
|
+
|
157
|
+
## Episode Identifier (uuid)
|
158
|
+
|
159
|
+
Dropcaster uses a rather simple approach to uniquely identify the episodes. It simply generates a SHA1 hash of the mp3 file. If it changes, for whatever reason (even if only a tag was changed), the episode will get a new UUID, and any podcatcher will fetch the episode again (which is what you want, in most cases).
|
160
|
+
|
161
|
+
Modifying the sidecar file does not change the UUID, because it only affects the feed and not the episode itself.
|
162
|
+
|
163
|
+
## I Don't Like the Output Format that Dropcaster produces
|
164
|
+
|
165
|
+
Dropcaster uses an ERB template to generate the XML feed. The template was written so that it is easy to understand, but not necessarily in a way that would make the output rather nice-looking. That should not be an issue, as long as the XML is correct.
|
166
|
+
|
167
|
+
It you prefer a more aesthetically pleasing output, just pipe the output of Dropcaster through `xmllint`, which is part of [libxml](http://xmlsoft.org/), which in turn is one of the prerequisites of the Dropcaster gem, and, as such, installed with Dropcaster):
|
168
|
+
|
169
|
+
dropcaster | xmllint --format -
|
170
|
+
|
171
|
+
For writing the output to a file, just redirect the ouput of the above command:
|
172
|
+
|
173
|
+
dropcaster | xmllint --format - > index.rss
|
174
|
+
|
175
|
+
# Contributing to Dropcaster
|
176
|
+
|
177
|
+
Dropcaster is hosted at [Github](http://github.com/nerab/dropcaster):
|
178
|
+
|
179
|
+
* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
|
180
|
+
* Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
|
181
|
+
* Fork the project
|
182
|
+
* Start a feature/bugfix branch
|
183
|
+
* Commit and push until you are happy with your contribution
|
184
|
+
* Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
|
185
|
+
* Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
|
186
|
+
|
187
|
+
# Copyright
|
188
|
+
|
189
|
+
Copyright (c) 2011-2014 Nicolas E. Rabenau. See [LICENSE.txt](https://raw.github.com/nerab/dropcaster/master/LICENSE.txt) for further details.
|
data/dropcaster.gemspec
CHANGED
@@ -18,19 +18,20 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_dependency 'ruby-mp3info'
|
22
|
-
spec.add_dependency 'activesupport'
|
21
|
+
spec.add_dependency 'ruby-mp3info'
|
22
|
+
spec.add_dependency 'activesupport'
|
23
23
|
|
24
|
-
spec.add_development_dependency 'bundler'
|
25
|
-
spec.add_development_dependency '
|
26
|
-
spec.add_development_dependency '
|
27
|
-
spec.add_development_dependency '
|
28
|
-
spec.add_development_dependency 'guard-
|
29
|
-
spec.add_development_dependency '
|
30
|
-
spec.add_development_dependency '
|
31
|
-
spec.add_development_dependency 'rb-
|
32
|
-
spec.add_development_dependency '
|
33
|
-
spec.add_development_dependency 'pry
|
34
|
-
spec.add_development_dependency 'pry-
|
35
|
-
spec.add_development_dependency '
|
24
|
+
spec.add_development_dependency 'bundler'
|
25
|
+
spec.add_development_dependency 'minitest'
|
26
|
+
spec.add_development_dependency 'rake'
|
27
|
+
spec.add_development_dependency 'libxml-ruby'
|
28
|
+
spec.add_development_dependency 'guard-minitest'
|
29
|
+
spec.add_development_dependency 'guard-bundler'
|
30
|
+
spec.add_development_dependency 'libnotify'
|
31
|
+
spec.add_development_dependency 'rb-inotify'
|
32
|
+
spec.add_development_dependency 'rb-fsevent'
|
33
|
+
spec.add_development_dependency 'pry'
|
34
|
+
spec.add_development_dependency 'pry-nav'
|
35
|
+
spec.add_development_dependency 'pry-stack_explorer'
|
36
|
+
spec.add_development_dependency 'rb-readline'
|
36
37
|
end
|
data/lib/dropcaster/channel.rb
CHANGED
@@ -97,7 +97,7 @@ module Dropcaster
|
|
97
97
|
end
|
98
98
|
|
99
99
|
# construct absolute URL, based on the channel's enclosures_url attribute
|
100
|
-
item.url = (URI.parse(enclosures_url) + item.file_name)
|
100
|
+
item.url = (URI.parse(enclosures_url) + URI.encode(item.file_name))
|
101
101
|
|
102
102
|
# Warn if keyword count is larger than recommended
|
103
103
|
assert_keyword_count(item.keywords)
|
data/lib/dropcaster/item.rb
CHANGED
@@ -12,6 +12,10 @@ module Dropcaster
|
|
12
12
|
@tag = mp3info.tag
|
13
13
|
@tag2 = mp3info.tag2
|
14
14
|
@duration = mp3info.length
|
15
|
+
if @tag2["ULT"]
|
16
|
+
@lyrics = {};
|
17
|
+
@tag2["ULT"].split(/\x00/).drop(1).each_slice(2) { |k, v| @lyrics[k] = v }
|
18
|
+
end
|
15
19
|
}
|
16
20
|
|
17
21
|
@file_size = File.new(@file_name).stat.size
|
data/lib/dropcaster/version.rb
CHANGED
data/lib/dropcaster.rb
CHANGED
@@ -7,13 +7,13 @@ require 'active_support/core_ext/object/blank'
|
|
7
7
|
require 'active_support/core_ext/module/attribute_accessors'
|
8
8
|
|
9
9
|
require 'logger'
|
10
|
-
require 'active_support/core_ext/logger'
|
11
10
|
|
12
11
|
require 'dropcaster/errors'
|
13
12
|
require 'dropcaster/log_formatter'
|
14
13
|
require 'dropcaster/channel'
|
15
14
|
require 'dropcaster/item'
|
16
15
|
require 'dropcaster/channel_file_locator'
|
16
|
+
require 'dropcaster/version'
|
17
17
|
|
18
18
|
module Dropcaster
|
19
19
|
CHANNEL_YML = 'channel.yml'
|
data/test/Vagrantfile
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# -*- mode: ruby -*-
|
2
|
+
# vi: set ft=ruby :
|
3
|
+
|
4
|
+
Vagrant.configure(2) do |config|
|
5
|
+
config.vm.box = 'ubuntu/trusty64'
|
6
|
+
config.vm.synced_folder '..', '/dropcaster'
|
7
|
+
|
8
|
+
config.vm.provider 'virtualbox' do |vb|
|
9
|
+
vb.memory = '256'
|
10
|
+
end
|
11
|
+
|
12
|
+
config.vm.provision 'shell', inline: <<-SHELL
|
13
|
+
sudo add-apt-repository ppa:brightbox/ruby-ng-experimental
|
14
|
+
sudo apt-get update
|
15
|
+
sudo apt-get install -y ruby2.2 git ruby2.2-dev libxml2-dev zlib1g-dev
|
16
|
+
sudo gem install bundler
|
17
|
+
SHELL
|
18
|
+
end
|
data/test/fixtures/channel.yml
CHANGED
@@ -2,15 +2,15 @@
|
|
2
2
|
:subtitle: A show about everything
|
3
3
|
:url: http://www.example.com/podcasts/everything/
|
4
4
|
:language: en-us
|
5
|
-
:copyright:
|
5
|
+
:copyright: 2011 John Doe and Family
|
6
6
|
:author: John Doe
|
7
7
|
: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!
|
8
8
|
:owner:
|
9
9
|
:name: John Doe
|
10
10
|
:email: john.doe@example.com
|
11
11
|
:image_url: AllAboutEverything.jpg
|
12
|
-
:keywords: [bumm, zack, return]
|
13
|
-
:categories:
|
12
|
+
:keywords: [bumm, zack, return]
|
13
|
+
:categories:
|
14
14
|
- [Technology, Gadgets]
|
15
15
|
- TV & Film
|
16
16
|
:explicit: No
|
data/test/helper.rb
CHANGED
@@ -24,7 +24,7 @@ class TestChannelXML < MiniTest::Test
|
|
24
24
|
# constructing the XML string in a different way
|
25
25
|
#
|
26
26
|
def channel_rss
|
27
|
-
Dropcaster::Channel.new(FIXTURES_DIR, @options).to_rss
|
27
|
+
Dropcaster::Channel.new(FIXTURES_DIR, @options.dup).to_rss
|
28
28
|
end
|
29
29
|
|
30
30
|
def test_item
|
@@ -47,7 +47,7 @@ class TestChannelXML < MiniTest::Test
|
|
47
47
|
assert_equal('false', guid['isPermaLink'])
|
48
48
|
assert_equal('77bf84447c0f69ce4a33a18b0ae1e030b82010de', guid.content)
|
49
49
|
|
50
|
-
assert_equal(
|
50
|
+
assert_equal(File.mtime(FIXTURE_ITUNES_MP3).rfc2822, item.find('pubDate').first.content)
|
51
51
|
assert_equal('3', item.find('itunes:duration', NS_ITUNES).first.content)
|
52
52
|
end
|
53
53
|
|
data/test/unit/test_item.rb
CHANGED
@@ -8,10 +8,10 @@ class TestItem < MiniTest::Test
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def test_basics
|
11
|
-
assert_in_delta(3, @item.duration, 0.
|
11
|
+
assert_in_delta(3, @item.duration, 0.05)
|
12
12
|
assert_equal(58119, @item.file_size)
|
13
13
|
assert_equal('77bf84447c0f69ce4a33a18b0ae1e030b82010de', @item.uuid)
|
14
|
-
assert_equal(
|
14
|
+
assert_equal(File.mtime(FIXTURE_ITUNES_MP3).to_i, @item.pub_date.to_i)
|
15
15
|
assert_equal('test/fixtures/iTunes.mp3', @item.file_name)
|
16
16
|
end
|
17
17
|
|
metadata
CHANGED
@@ -1,211 +1,225 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dropcaster
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.5.
|
4
|
+
version: 0.0.5.rc3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nicholas E. Rabenau
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-02-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ruby-mp3info
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '0
|
19
|
+
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '0
|
26
|
+
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: activesupport
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: bundler
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: minitest
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: rake
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
58
72
|
requirements:
|
59
|
-
- -
|
73
|
+
- - ">="
|
60
74
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
75
|
+
version: '0'
|
62
76
|
type: :development
|
63
77
|
prerelease: false
|
64
78
|
version_requirements: !ruby/object:Gem::Requirement
|
65
79
|
requirements:
|
66
|
-
- -
|
80
|
+
- - ">="
|
67
81
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
82
|
+
version: '0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: libxml-ruby
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
72
86
|
requirements:
|
73
|
-
- -
|
87
|
+
- - ">="
|
74
88
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
89
|
+
version: '0'
|
76
90
|
type: :development
|
77
91
|
prerelease: false
|
78
92
|
version_requirements: !ruby/object:Gem::Requirement
|
79
93
|
requirements:
|
80
|
-
- -
|
94
|
+
- - ">="
|
81
95
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
96
|
+
version: '0'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: guard-minitest
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
86
100
|
requirements:
|
87
|
-
- -
|
101
|
+
- - ">="
|
88
102
|
- !ruby/object:Gem::Version
|
89
|
-
version: '
|
103
|
+
version: '0'
|
90
104
|
type: :development
|
91
105
|
prerelease: false
|
92
106
|
version_requirements: !ruby/object:Gem::Requirement
|
93
107
|
requirements:
|
94
|
-
- -
|
108
|
+
- - ">="
|
95
109
|
- !ruby/object:Gem::Version
|
96
|
-
version: '
|
110
|
+
version: '0'
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
112
|
name: guard-bundler
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
100
114
|
requirements:
|
101
|
-
- -
|
115
|
+
- - ">="
|
102
116
|
- !ruby/object:Gem::Version
|
103
|
-
version: '
|
117
|
+
version: '0'
|
104
118
|
type: :development
|
105
119
|
prerelease: false
|
106
120
|
version_requirements: !ruby/object:Gem::Requirement
|
107
121
|
requirements:
|
108
|
-
- -
|
122
|
+
- - ">="
|
109
123
|
- !ruby/object:Gem::Version
|
110
|
-
version: '
|
124
|
+
version: '0'
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
126
|
name: libnotify
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
114
128
|
requirements:
|
115
|
-
- -
|
129
|
+
- - ">="
|
116
130
|
- !ruby/object:Gem::Version
|
117
|
-
version: '0
|
131
|
+
version: '0'
|
118
132
|
type: :development
|
119
133
|
prerelease: false
|
120
134
|
version_requirements: !ruby/object:Gem::Requirement
|
121
135
|
requirements:
|
122
|
-
- -
|
136
|
+
- - ">="
|
123
137
|
- !ruby/object:Gem::Version
|
124
|
-
version: '0
|
138
|
+
version: '0'
|
125
139
|
- !ruby/object:Gem::Dependency
|
126
140
|
name: rb-inotify
|
127
141
|
requirement: !ruby/object:Gem::Requirement
|
128
142
|
requirements:
|
129
|
-
- -
|
143
|
+
- - ">="
|
130
144
|
- !ruby/object:Gem::Version
|
131
|
-
version: '0
|
145
|
+
version: '0'
|
132
146
|
type: :development
|
133
147
|
prerelease: false
|
134
148
|
version_requirements: !ruby/object:Gem::Requirement
|
135
149
|
requirements:
|
136
|
-
- -
|
150
|
+
- - ">="
|
137
151
|
- !ruby/object:Gem::Version
|
138
|
-
version: '0
|
152
|
+
version: '0'
|
139
153
|
- !ruby/object:Gem::Dependency
|
140
154
|
name: rb-fsevent
|
141
155
|
requirement: !ruby/object:Gem::Requirement
|
142
156
|
requirements:
|
143
|
-
- -
|
157
|
+
- - ">="
|
144
158
|
- !ruby/object:Gem::Version
|
145
|
-
version: '0
|
159
|
+
version: '0'
|
146
160
|
type: :development
|
147
161
|
prerelease: false
|
148
162
|
version_requirements: !ruby/object:Gem::Requirement
|
149
163
|
requirements:
|
150
|
-
- -
|
164
|
+
- - ">="
|
151
165
|
- !ruby/object:Gem::Version
|
152
|
-
version: '0
|
166
|
+
version: '0'
|
153
167
|
- !ruby/object:Gem::Dependency
|
154
168
|
name: pry
|
155
169
|
requirement: !ruby/object:Gem::Requirement
|
156
170
|
requirements:
|
157
|
-
- -
|
171
|
+
- - ">="
|
158
172
|
- !ruby/object:Gem::Version
|
159
|
-
version: '0
|
173
|
+
version: '0'
|
160
174
|
type: :development
|
161
175
|
prerelease: false
|
162
176
|
version_requirements: !ruby/object:Gem::Requirement
|
163
177
|
requirements:
|
164
|
-
- -
|
178
|
+
- - ">="
|
165
179
|
- !ruby/object:Gem::Version
|
166
|
-
version: '0
|
180
|
+
version: '0'
|
167
181
|
- !ruby/object:Gem::Dependency
|
168
182
|
name: pry-nav
|
169
183
|
requirement: !ruby/object:Gem::Requirement
|
170
184
|
requirements:
|
171
|
-
- -
|
185
|
+
- - ">="
|
172
186
|
- !ruby/object:Gem::Version
|
173
|
-
version: '0
|
187
|
+
version: '0'
|
174
188
|
type: :development
|
175
189
|
prerelease: false
|
176
190
|
version_requirements: !ruby/object:Gem::Requirement
|
177
191
|
requirements:
|
178
|
-
- -
|
192
|
+
- - ">="
|
179
193
|
- !ruby/object:Gem::Version
|
180
|
-
version: '0
|
194
|
+
version: '0'
|
181
195
|
- !ruby/object:Gem::Dependency
|
182
196
|
name: pry-stack_explorer
|
183
197
|
requirement: !ruby/object:Gem::Requirement
|
184
198
|
requirements:
|
185
|
-
- -
|
199
|
+
- - ">="
|
186
200
|
- !ruby/object:Gem::Version
|
187
|
-
version: '0
|
201
|
+
version: '0'
|
188
202
|
type: :development
|
189
203
|
prerelease: false
|
190
204
|
version_requirements: !ruby/object:Gem::Requirement
|
191
205
|
requirements:
|
192
|
-
- -
|
206
|
+
- - ">="
|
193
207
|
- !ruby/object:Gem::Version
|
194
|
-
version: '0
|
208
|
+
version: '0'
|
195
209
|
- !ruby/object:Gem::Dependency
|
196
210
|
name: rb-readline
|
197
211
|
requirement: !ruby/object:Gem::Requirement
|
198
212
|
requirements:
|
199
|
-
- -
|
213
|
+
- - ">="
|
200
214
|
- !ruby/object:Gem::Version
|
201
|
-
version: '0
|
215
|
+
version: '0'
|
202
216
|
type: :development
|
203
217
|
prerelease: false
|
204
218
|
version_requirements: !ruby/object:Gem::Requirement
|
205
219
|
requirements:
|
206
|
-
- -
|
220
|
+
- - ">="
|
207
221
|
- !ruby/object:Gem::Version
|
208
|
-
version: '0
|
222
|
+
version: '0'
|
209
223
|
description: Dropcaster is a podcast feed generator for the command line. It is most
|
210
224
|
simple to use with Dropbox, but works equally well with any other hoster.
|
211
225
|
email:
|
@@ -216,9 +230,9 @@ executables:
|
|
216
230
|
extensions: []
|
217
231
|
extra_rdoc_files: []
|
218
232
|
files:
|
219
|
-
- .document
|
220
|
-
- .gitignore
|
221
|
-
- .travis.yml
|
233
|
+
- ".document"
|
234
|
+
- ".gitignore"
|
235
|
+
- ".travis.yml"
|
222
236
|
- Gemfile
|
223
237
|
- Gemfile.lock
|
224
238
|
- Guardfile
|
@@ -226,6 +240,7 @@ files:
|
|
226
240
|
- README.markdown
|
227
241
|
- Rakefile
|
228
242
|
- TODO
|
243
|
+
- VISION.markdown
|
229
244
|
- bin/dropcaster
|
230
245
|
- bin/lstags
|
231
246
|
- doc/infoPane.png
|
@@ -243,6 +258,7 @@ files:
|
|
243
258
|
- lib/dropcaster/version.rb
|
244
259
|
- templates/channel.html.erb
|
245
260
|
- templates/channel.rss.erb
|
261
|
+
- test/Vagrantfile
|
246
262
|
- test/extensions/windows.rb
|
247
263
|
- test/fixtures/channel.yml
|
248
264
|
- test/fixtures/iTunes.mp3
|
@@ -263,21 +279,22 @@ require_paths:
|
|
263
279
|
- lib
|
264
280
|
required_ruby_version: !ruby/object:Gem::Requirement
|
265
281
|
requirements:
|
266
|
-
- -
|
282
|
+
- - ">="
|
267
283
|
- !ruby/object:Gem::Version
|
268
284
|
version: '0'
|
269
285
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
270
286
|
requirements:
|
271
|
-
- -
|
287
|
+
- - ">"
|
272
288
|
- !ruby/object:Gem::Version
|
273
289
|
version: 1.3.1
|
274
290
|
requirements: []
|
275
291
|
rubyforge_project:
|
276
|
-
rubygems_version: 2.
|
292
|
+
rubygems_version: 2.4.3
|
277
293
|
signing_key:
|
278
294
|
specification_version: 4
|
279
295
|
summary: Simple Podcast Publishing with Dropbox
|
280
296
|
test_files:
|
297
|
+
- test/Vagrantfile
|
281
298
|
- test/extensions/windows.rb
|
282
299
|
- test/fixtures/channel.yml
|
283
300
|
- test/fixtures/iTunes.mp3
|