spfy 0.3.1 → 1.0.0
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 +4 -4
- data/README.md +9 -8
- data/lib/spfy.rb +58 -43
- data/spfy.gemspec +1 -1
- data/test.sh +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bf086944e45afbf5e0b3518d00b3ebaaaa261f9b
|
4
|
+
data.tar.gz: f32cc7491b140891272a0c56bc25968b1a7a69ad
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d2357fef3dae3191e26b38a30e0a6852b19bfb675271aa52958d59d336a834cdafefad75653811bda4fa7b8b1d05580878e1063f6a9d24267365dd89c4ea66b2
|
7
|
+
data.tar.gz: 65d1bf4328dacaf7ca232a5b9db632daccc1d9f294f01afba9fccaf1a8c6180b565f5798f6571f901a0d4827539f6b54c0cf85e0596a85a6141680c4e801fcac
|
data/README.md
CHANGED
@@ -1,9 +1,10 @@
|
|
1
|
-
|
1
|
+
## Spfy ("spiffy")
|
2
|
+
[](https://codeclimate.com/github/marcransome/Spfy)
|
2
3
|
|
3
|
-
|
4
|
+
### Overview
|
4
5
|
**Spfy** is a command-line tool for generating [XSPF](http://xspf.org/) playlists from metadata stored in several popular audio formats and is developed entirely in [Ruby](http://www.ruby-lang.org/). It takes one or more local directory paths as input, extracts metadata tags from any audio files that it encounters, and generates a valid XSPF playlist.
|
5
6
|
|
6
|
-
|
7
|
+
### Prerequisites
|
7
8
|
A working Ruby installation (version 1.9 or greater) is required for Spfy to work, but this is outside the scope of this guide. For more information refer to the [official installation procedure](http://www.ruby-lang.org/en/downloads/).
|
8
9
|
|
9
10
|
[TagLib](http://developer.kde.org/~wheeler/taglib.html) is also required. Follow the steps below (taken from the [taglib-ruby installation guide](http://robinst.github.com/taglib-ruby/)) to install the necessary files for your respective system type:
|
@@ -15,12 +16,12 @@ A working Ruby installation (version 1.9 or greater) is required for Spfy to wor
|
|
15
16
|
| Brew | `brew install taglib` |
|
16
17
|
| MacPorts | `sudo port install taglib` |
|
17
18
|
|
18
|
-
|
19
|
+
### Installation
|
19
20
|
With the prerequisites above taken care of Spfy can be installed with the following command:
|
20
21
|
|
21
22
|
$ gem install spfy
|
22
23
|
|
23
|
-
|
24
|
+
### Using Spfy
|
24
25
|
By default, Spfy will output a formatted XSPF playlist to the standard output stream that will include _location_, _title_, _creator_, _album_, and _trackNum_ elements for each audio file where available.
|
25
26
|
|
26
27
|
The general syntax for Spfy is `spfy [options] dir1 ... dirN`, where _dir1 ... dirN_ is one or more paths to directories containing audio files.
|
@@ -58,13 +59,13 @@ Command-line arguments allow you to control which elements Spfy outputs:
|
|
58
59
|
|
59
60
|
For additional options use `spfy --help`.
|
60
61
|
|
61
|
-
|
62
|
+
### License
|
62
63
|
Spfy is free software, and you are welcome to redistribute it under certain conditions. See the [GNU General Public License](http://www.gnu.org/licenses/gpl.html) for more details.
|
63
64
|
|
64
|
-
|
65
|
+
### Acknowledgments
|
65
66
|
Spfy uses the following third party software components:
|
66
67
|
|
67
68
|
* [taglib-ruby](http://robinst.github.com/taglib-ruby/) by Robin Stocker
|
68
69
|
|
69
|
-
|
70
|
+
### Comments or suggestions?
|
70
71
|
Email me at [marc.ransome@fidgetbox.co.uk](mailto://marc.ransome@fidgetbox.co.uk) with bug reports, feature requests or general comments and follow [@marcransome](http://www.twitter.com/marcransome) for updates.
|
data/lib/spfy.rb
CHANGED
@@ -18,6 +18,7 @@
|
|
18
18
|
#
|
19
19
|
# You should have received a copy of the GNU General Public License
|
20
20
|
# along with Spfy. If not, see <http://www.gnu.org/licenses/>.
|
21
|
+
#
|
21
22
|
|
22
23
|
require "spfy/optionreader"
|
23
24
|
require "optparse"
|
@@ -28,18 +29,18 @@ require "uri"
|
|
28
29
|
|
29
30
|
class Spfy
|
30
31
|
|
31
|
-
VERSION = "0.
|
32
|
+
VERSION = "1.0.0"
|
32
33
|
USAGE = "Use `#{File.basename($0)} --help` for available options."
|
33
34
|
|
34
|
-
@
|
35
|
+
@xml_tags = {
|
35
36
|
:header => "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"\
|
36
37
|
"<playlist version=\"1\" xmlns=\"http://xspf.org/ns/0/\">\n"\
|
37
38
|
"\t<trackList>\n",
|
38
39
|
:footer => "\t</trackList>\n</playlist>\n",
|
39
40
|
:title_start => "\t\t\t<title>",
|
40
41
|
:title_end => "</title>\n",
|
41
|
-
:
|
42
|
-
:
|
42
|
+
:artist_start => "\t\t\t<creator>",
|
43
|
+
:artist_end => "</creator>\n",
|
43
44
|
:album_start => "\t\t\t<album>",
|
44
45
|
:album_end => "</album>\n",
|
45
46
|
:location_start => "\t\t\t<location>file://",
|
@@ -52,9 +53,8 @@ class Spfy
|
|
52
53
|
|
53
54
|
def self.parse_args
|
54
55
|
begin
|
55
|
-
# test for zero arguments
|
56
56
|
if ARGV.empty? then
|
57
|
-
|
57
|
+
exit_with_banner
|
58
58
|
end
|
59
59
|
|
60
60
|
# parse command-line arguments
|
@@ -64,62 +64,77 @@ class Spfy
|
|
64
64
|
if @options.dirs.empty?
|
65
65
|
exit_with_message("No source path(s) specified.")
|
66
66
|
end
|
67
|
-
|
67
|
+
|
68
68
|
rescue OptionParser::InvalidOption, OptionParser::MissingArgument => error
|
69
69
|
exit_with_message(error.to_s.capitalize)
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
73
73
|
def self.generate_xml
|
74
|
+
@tracks_processed = 0
|
74
75
|
|
75
76
|
if @options.output.any?
|
76
77
|
puts "Generating XML..."
|
77
|
-
|
78
|
+
capture_stdout
|
78
79
|
end
|
79
80
|
|
80
|
-
puts @
|
81
|
-
tracks_processed = 0
|
82
|
-
|
81
|
+
puts @xml_tags[:header]
|
83
82
|
@options.dirs.each do |dir|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
next if tag.nil? # skip files with no tags
|
90
|
-
|
91
|
-
puts "#{@xspf_tags[:track_start]}"
|
92
|
-
|
93
|
-
if !@options.hide_location
|
94
|
-
encoded_path = URI.escape(path).sub("%5C", "/") # percent encode string for local path
|
95
|
-
puts "#{@xspf_tags[:location_start]}#{encoded_path}#{@xspf_tags[:location_end]}"
|
96
|
-
end
|
97
|
-
|
98
|
-
puts "#{@xspf_tags[:title_start]}#{tag.title}#{@xspf_tags[:title_end]}" if !@options.hide_title and !tag.title.nil?
|
99
|
-
puts "#{@xspf_tags[:creator_start]}#{tag.artist}#{@xspf_tags[:creator_end]}" if !@options.hide_artist and !tag.artist.nil?
|
100
|
-
puts "#{@xspf_tags[:album_start]}#{tag.album}#{@xspf_tags[:album_end]}" if !@options.hide_album and !tag.album.nil?
|
101
|
-
|
102
|
-
if !@options.hide_tracknum and !tag.track.nil?
|
103
|
-
if tag.track > 0
|
104
|
-
puts "#{@xspf_tags[:track_num_start]}#{tag.track}#{@xspf_tags[:track_num_end]}"
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
puts "#{@xspf_tags[:track_end]}"
|
109
|
-
|
110
|
-
tracks_processed += 1
|
111
|
-
break if @options.tracks_to_process[0].to_i > 0 and tracks_processed == options.tracks_to_process[0].to_i
|
83
|
+
catch :MaxTracksReached do
|
84
|
+
begin
|
85
|
+
Find.find(dir) do |path|
|
86
|
+
xml_for_path(path)
|
112
87
|
end
|
88
|
+
rescue Interrupt
|
89
|
+
abort("\nCancelled, exiting..")
|
113
90
|
end
|
114
|
-
rescue Interrupt
|
115
|
-
abort("\nCancelled, exiting..")
|
116
91
|
end
|
117
92
|
end
|
118
|
-
puts @
|
93
|
+
puts @xml_tags[:footer]
|
119
94
|
|
120
95
|
$stdout = STDOUT if @options.output.any?
|
121
96
|
end
|
122
97
|
|
98
|
+
def self.xml_for_path(path)
|
99
|
+
TagLib::FileRef.open(path) do |fileref|
|
100
|
+
tags = fileref.tag
|
101
|
+
|
102
|
+
next if tags.nil? # skip files with no tags
|
103
|
+
|
104
|
+
puts "#{@xml_tags[:track_start]}"
|
105
|
+
parse_location(path)
|
106
|
+
parse_tag(tags.title, @options.hide_title, @xml_tags[:title_start], @xml_tags[:title_end])
|
107
|
+
parse_tag(tags.artist, @options.hide_artist, @xml_tags[:artist_start], @xml_tags[:artist_end])
|
108
|
+
parse_tag(tags.album, @options.hide_album, @xml_tags[:album_start], @xml_tags[:album_end])
|
109
|
+
parse_track_num(tags.track)
|
110
|
+
puts "#{@xml_tags[:track_end]}"
|
111
|
+
|
112
|
+
@tracks_processed += 1
|
113
|
+
throw :MaxTracksReached if @options.tracks_to_process[0].to_i > 0 and @tracks_processed == @options.tracks_to_process[0].to_i
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def self.parse_location(path)
|
118
|
+
if !@options.hide_location
|
119
|
+
encoded_path = URI.escape(path).sub("%5C", "/") # percent encode string for local path
|
120
|
+
puts "#{@xml_tags[:location_start]}#{encoded_path}#{@xml_tags[:location_end]}"
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def self.parse_tag(tag, suppress_output, start_xml, end_xml)
|
125
|
+
if !tag.nil? and !suppress_output
|
126
|
+
puts "#{start_xml}#{tag}#{end_xml}"
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
def self.parse_track_num(track_num)
|
131
|
+
if !@options.hide_tracknum and !track_num.nil?
|
132
|
+
if track_num > 0
|
133
|
+
puts "#{@xml_tags[:track_num_start]}#{track_num}#{@xml_tags[:track_num_end]}"
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
123
138
|
def self.exit_with_message(message)
|
124
139
|
puts message if message
|
125
140
|
exit_with_banner
|
@@ -133,5 +148,5 @@ class Spfy
|
|
133
148
|
def self.capture_stdout
|
134
149
|
$stdout = File.open(@options.output[0], "w")
|
135
150
|
end
|
136
|
-
|
151
|
+
private_class_method :xml_for_path, :parse_location, :parse_tag, :parse_track_num, :exit_with_message, :exit_with_banner, :capture_stdout
|
137
152
|
end
|
data/spfy.gemspec
CHANGED
@@ -21,7 +21,7 @@
|
|
21
21
|
|
22
22
|
Gem::Specification.new do |s|
|
23
23
|
s.name = 'spfy'
|
24
|
-
s.version = '0.
|
24
|
+
s.version = '1.0.0'
|
25
25
|
s.date = '2013-07-28'
|
26
26
|
s.summary = 'XSPF playlist generator'
|
27
27
|
s.description = 'Spfy is a simple command-line tool for generating XSPF playlists from metadata stored in several popular audio formats.'
|
data/test.sh
CHANGED
@@ -20,7 +20,7 @@
|
|
20
20
|
# You should have received a copy of the GNU General Public License
|
21
21
|
# along with Spfy. If not, see <http://www.gnu.org/licenses/>.
|
22
22
|
|
23
|
-
version_from_gemspec=$( grep 's.version' spfy.gemspec | cut -c
|
23
|
+
version_from_gemspec=$( grep 's.version' spfy.gemspec | cut -c 20-24 )
|
24
24
|
gem_file="spfy-$version_from_gemspec.gem"
|
25
25
|
|
26
26
|
echo "Removing outdated gem files.."
|