playlist 0.2.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/playlist.rb +2 -1
- data/lib/playlist/format/cue.rb +21 -20
- data/lib/playlist/format/m3u.rb +6 -5
- data/lib/playlist/format/simple_text.rb +7 -4
- data/lib/playlist/format/xspf.rb +2 -2
- data/lib/playlist/track.rb +12 -12
- data/lib/playlist/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bc3a6497a40653031438f4692659e4f1136e2a29
|
4
|
+
data.tar.gz: 88e19ff093d5b1eba7569f011f02e2707751daae
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7d7baa63b8aed79765ffac6280baa708eb65b5afccc30b40590b7f6383d91bddd1a5d0a9d80c57916c9f05ffc856d5203557cce99953b525e65a025ed2df6593
|
7
|
+
data.tar.gz: 09dfeed3a840b1c3aa8a1e8fb98dd85a3ec1a6175755f18c6dc3e4c2a9a29dcbc1e39d0bdcf58593b3e85d9f8f295dd44e16852b1c15f81632e5ff818ebb6e00
|
data/lib/playlist.rb
CHANGED
@@ -40,6 +40,7 @@ class Playlist
|
|
40
40
|
# @param attr [Hash] a hash of attibute values to set
|
41
41
|
def initialize(attr = {})
|
42
42
|
@tracks = []
|
43
|
+
@identifiers = {}
|
43
44
|
attr.each_pair do |key, value|
|
44
45
|
send("#{key}=", value)
|
45
46
|
end
|
@@ -54,7 +55,7 @@ class Playlist
|
|
54
55
|
@tracks << (args.is_a?(Track) ? args : Track.new(args))
|
55
56
|
end
|
56
57
|
|
57
|
-
# Get the total duration of this playlist
|
58
|
+
# Get the total duration of this playlist in milliseconds
|
58
59
|
# If any tracks on the playlist don't have a duation, then they are ignored
|
59
60
|
# @return [Integer, Float]
|
60
61
|
def duration
|
data/lib/playlist/format/cue.rb
CHANGED
@@ -11,9 +11,9 @@ module Playlist::Format::Cue
|
|
11
11
|
input.each_line do |line|
|
12
12
|
if line =~ /^\s*REM\s/
|
13
13
|
next
|
14
|
-
elsif
|
14
|
+
elsif (matches = line.match(/^\s*TRACK (\d+) AUDIO/))
|
15
15
|
track = Playlist::Track.new(
|
16
|
-
:track_number =>
|
16
|
+
:track_number => matches[1].to_i
|
17
17
|
)
|
18
18
|
playlist.add_track(track)
|
19
19
|
elsif !track.nil?
|
@@ -44,24 +44,24 @@ module Playlist::Format::Cue
|
|
44
44
|
protected
|
45
45
|
|
46
46
|
def parse_track_line(track, line)
|
47
|
-
if
|
48
|
-
track.title =
|
49
|
-
elsif
|
50
|
-
track.performer =
|
51
|
-
elsif
|
52
|
-
track.isrc =
|
53
|
-
elsif
|
54
|
-
track.start_time = parse_time(
|
47
|
+
if (matches = line.match(/^\s*TITLE \"?(.+?)\"?$/))
|
48
|
+
track.title = matches[1]
|
49
|
+
elsif (matches = line.match(/^\s*PERFORMER \"?(.+?)\"?$/))
|
50
|
+
track.performer = matches[1]
|
51
|
+
elsif (matches = line.match(/^\s*ISRC \"?(\w+?)\"?$/))
|
52
|
+
track.isrc = matches[1]
|
53
|
+
elsif (matches = line.match(/^\s*INDEX (.+)$/))
|
54
|
+
track.start_time = parse_time(matches[1])
|
55
55
|
else
|
56
56
|
warn "Unknown command: #{line}"
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
60
60
|
def parse_playlist_line(playlist, line)
|
61
|
-
if
|
62
|
-
playlist.title =
|
63
|
-
elsif
|
64
|
-
playlist.media_location =
|
61
|
+
if (matches = line.match(/^\s*TITLE \"?(.+?)\"?$/))
|
62
|
+
playlist.title = matches[1]
|
63
|
+
elsif (matches = line.match(/^\s*FILE \"?(.+?)\" (\w+)?$/))
|
64
|
+
playlist.media_location = matches[1]
|
65
65
|
end
|
66
66
|
end
|
67
67
|
|
@@ -90,18 +90,19 @@ module Playlist::Format::Cue
|
|
90
90
|
end
|
91
91
|
|
92
92
|
def parse_time(timestamp)
|
93
|
-
if
|
94
|
-
if
|
95
|
-
mins =
|
96
|
-
secs =
|
97
|
-
frames =
|
98
|
-
(mins *
|
93
|
+
if (matches = timestamp.match(/(\d+) (\d+):(\d+):(\d+)/))
|
94
|
+
if matches[1].to_i == 1
|
95
|
+
mins = matches[2].to_i
|
96
|
+
secs = matches[3].to_i
|
97
|
+
frames = matches[4].to_i
|
98
|
+
(mins * 60_000) + (secs * 1000) + (frames * (75 / 1000))
|
99
99
|
end
|
100
100
|
end
|
101
101
|
end
|
102
102
|
|
103
103
|
def format_time(duration)
|
104
104
|
duration = 0 if duration.nil?
|
105
|
+
duration = duration.to_f / 1000
|
105
106
|
mins = (duration / 60).floor
|
106
107
|
secs = (duration % 60).floor
|
107
108
|
frames = ((duration - duration.floor) * 75).round
|
data/lib/playlist/format/m3u.rb
CHANGED
@@ -9,10 +9,10 @@ module Playlist::Format::M3U
|
|
9
9
|
Playlist.new do |playlist|
|
10
10
|
track = Playlist::Track.new
|
11
11
|
input.each_line do |line|
|
12
|
-
if
|
13
|
-
track.duration =
|
14
|
-
track.creator =
|
15
|
-
track.title =
|
12
|
+
if (matches = line.match(/^#EXTINF:(-?\d+),\s*(.+?)\s*-\s*(.+?)\s*$/))
|
13
|
+
track.duration = matches[1].to_i * 1000
|
14
|
+
track.creator = matches[2]
|
15
|
+
track.title = matches[3]
|
16
16
|
else
|
17
17
|
if line =~ /^[^#]\S+.+\s*$/
|
18
18
|
track.location = line.strip
|
@@ -30,7 +30,8 @@ module Playlist::Format::M3U
|
|
30
30
|
def generate(playlist)
|
31
31
|
text = "#EXTM3U\n"
|
32
32
|
playlist.tracks.each do |t|
|
33
|
-
|
33
|
+
duration = (t.duration / 1000).round
|
34
|
+
text += "#EXTINF:#{duration},#{t.artist} - #{t.title}\n"
|
34
35
|
text += "#{t.location}\n"
|
35
36
|
end
|
36
37
|
text
|
@@ -20,11 +20,14 @@ module Playlist::Format::SimpleText
|
|
20
20
|
# @param line [String] any object that responds to #each_line
|
21
21
|
# @return [Track] a new Track object
|
22
22
|
def parse_line(line)
|
23
|
-
|
23
|
+
matches = line.match(
|
24
|
+
/^(\d{1,2}[:.]\d{1,2}([:.]\d{1,2})?)?\s*(.+?) - (.+?)$/
|
25
|
+
)
|
26
|
+
unless matches.nil?
|
24
27
|
Playlist::Track.new(
|
25
|
-
:start_time =>
|
26
|
-
:creator =>
|
27
|
-
:title =>
|
28
|
+
:start_time => matches[1],
|
29
|
+
:creator => matches[3].strip,
|
30
|
+
:title => matches[4].strip
|
28
31
|
)
|
29
32
|
end
|
30
33
|
end
|
data/lib/playlist/format/xspf.rb
CHANGED
@@ -43,7 +43,7 @@ module Playlist::Format::XSPF
|
|
43
43
|
track.title = doc.content_at('./xmlns:title')
|
44
44
|
track.location = doc.content_at('./xmlns:location')
|
45
45
|
if (duration = doc.content_at('./xmlns:duration'))
|
46
|
-
track.duration = duration.
|
46
|
+
track.duration = duration.to_i
|
47
47
|
end
|
48
48
|
end
|
49
49
|
end
|
@@ -53,7 +53,7 @@ module Playlist::Format::XSPF
|
|
53
53
|
xml.location(track.location) unless track.location.nil?
|
54
54
|
xml.title(track.title) unless track.title.nil?
|
55
55
|
xml.creator(track.creator) unless track.creator.nil?
|
56
|
-
xml.duration(
|
56
|
+
xml.duration(track.duration) unless track.duration.nil?
|
57
57
|
end
|
58
58
|
end
|
59
59
|
end
|
data/lib/playlist/track.rb
CHANGED
@@ -32,13 +32,13 @@ class Playlist::Track
|
|
32
32
|
# @return [String]
|
33
33
|
attr_accessor :publisher
|
34
34
|
|
35
|
-
# The time a track starts playing at, in
|
36
|
-
# May be a Float to include fractions of a
|
35
|
+
# The time a track starts playing at, in milliseconds
|
36
|
+
# May be a Float to include fractions of a millisecond.
|
37
37
|
# @return [Integer, Float]
|
38
38
|
attr_accessor :start_time
|
39
39
|
|
40
|
-
# The duration of the track in
|
41
|
-
# May be a Float to include fractions of a
|
40
|
+
# The duration of the track in milliseconds
|
41
|
+
# May be a Float to include fractions of a millisecond.
|
42
42
|
# @return [Integer, Float]
|
43
43
|
attr_reader :duration
|
44
44
|
|
@@ -132,16 +132,16 @@ class Playlist::Track
|
|
132
132
|
|
133
133
|
# Set the duration of the track
|
134
134
|
# If the duration is 0 or -1, then the duration is set to nil
|
135
|
-
# @param
|
136
|
-
def duration=(
|
137
|
-
if
|
138
|
-
@duration =
|
135
|
+
# @param milliseconds [Numeric] the duration of the track in seconds
|
136
|
+
def duration=(milliseconds)
|
137
|
+
if milliseconds.is_a?(Numeric)
|
138
|
+
@duration = milliseconds
|
139
139
|
else
|
140
|
-
|
141
|
-
@duration = if
|
142
|
-
|
140
|
+
milliseconds = milliseconds.to_s
|
141
|
+
@duration = if milliseconds =~ /\./
|
142
|
+
milliseconds.to_f
|
143
143
|
else
|
144
|
-
|
144
|
+
milliseconds.to_i
|
145
145
|
end
|
146
146
|
end
|
147
147
|
@duration = nil if [0, -1].include?(@duration)
|
data/lib/playlist/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: playlist
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nicholas Humfrey
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-08-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|