rubycue 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -1,8 +1,8 @@
1
1
  require 'rake'
2
- require 'spec/rake/spectask'
2
+ require 'rspec/core/rake_task'
3
3
 
4
- Spec::Rake::SpecTask.new(:spec) do |t|
5
- t.spec_files = FileList['spec/unit/*_spec.rb']
4
+ RSpec::Core::RakeTask.new(:spec) do |t|
5
+ t.pattern = './spec/unit/*_spec.rb'
6
6
  end
7
7
 
8
8
  task :default => :spec
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.1.0
@@ -1,14 +1,16 @@
1
1
  module RubyCue
2
2
  class Cuesheet
3
- attr_reader :cuesheet, :songs, :track_duration
3
+ attr_reader :cuesheet, :songs, :track_duration, :performer, :title, :file, :genre
4
4
 
5
5
  def initialize(cuesheet, track_duration=nil)
6
6
  @cuesheet = cuesheet
7
7
  @reg = {
8
- :track => %r(TRACK (\d{1,3}) AUDIO),
9
- :performer => %r(PERFORMER "(.*)"),
10
- :title => %r(TITLE "(.*)"),
11
- :index => %r(INDEX \d{1,3} (\d{1,3}):(\d{1,2}):(\d{1,2}))
8
+ :track => %r(TRACK (\d{1,3}) AUDIO),
9
+ :performer => %r(PERFORMER "(.*)"),
10
+ :title => %r(TITLE "(.*)"),
11
+ :index => %r(INDEX \d{1,3} (\d{1,3}):(\d{1,2}):(\d{1,2})),
12
+ :file => %r(FILE "(.*)"),
13
+ :genre => %r(REM GENRE (.*)\b)
12
14
  }
13
15
  @track_duration = RubyCue::Index.new(track_duration) if track_duration
14
16
  end
@@ -19,7 +21,9 @@ module RubyCue
19
21
  song[:performer] = parse_performers[i]
20
22
  song[:track] = parse_tracks[i]
21
23
  song[:index] = parse_indices[i]
24
+ song[:file] = parse_files[i]
22
25
  end
26
+ parse_genre
23
27
  raise RubyCue::InvalidCuesheet.new("Field amounts are not all present. Cuesheet is malformed!") unless valid?
24
28
  calculate_song_durations!
25
29
  true
@@ -42,7 +46,7 @@ module RubyCue
42
46
  end
43
47
  end
44
48
 
45
- private
49
+ private
46
50
 
47
51
  def calculate_song_durations!
48
52
  @songs.each_with_index do |song, i|
@@ -61,7 +65,7 @@ module RubyCue
61
65
  def parse_titles
62
66
  unless @titles
63
67
  @titles = cuesheet_scan(:title).map{|title| title.first}
64
- @titles.delete_at(0)
68
+ @title = @titles.delete_at(0)
65
69
  end
66
70
  @titles
67
71
  end
@@ -69,7 +73,7 @@ module RubyCue
69
73
  def parse_performers
70
74
  unless @performers
71
75
  @performers = cuesheet_scan(:performer).map{|performer| performer.first}
72
- @performers.delete_at(0)
76
+ @performer = @performers.delete_at(0)
73
77
  end
74
78
  @performers
75
79
  end
@@ -82,6 +86,21 @@ module RubyCue
82
86
  @indices ||= cuesheet_scan(:index).map{|index| RubyCue::Index.new([index[0].to_i, index[1].to_i, index[2].to_i])}
83
87
  end
84
88
 
89
+ def parse_files
90
+ unless @files
91
+ @files = cuesheet_scan(:file).map{|file| file.first}
92
+ @file = @files.delete_at(0) if @files.size == 1
93
+ end
94
+ @files
95
+ end
96
+
97
+ def parse_genre
98
+ @cuesheet.scan(@reg[:genre]) do |genre|
99
+ @genre = genre.first
100
+ break
101
+ end
102
+ end
103
+
85
104
  def cuesheet_scan(field)
86
105
  scan = @cuesheet.scan(@reg[field])
87
106
  raise InvalidCuesheet.new("No fields were found for #{field.to_s}") if scan.empty?
@@ -0,0 +1,49 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "rubycue"
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Blake Smith"]
12
+ s.date = "2012-07-23"
13
+ s.description = "Basic ruby parser for song cuesheets"
14
+ s.email = "blakesmith0@gmail.com"
15
+ s.extra_rdoc_files = [
16
+ "README.rdoc"
17
+ ]
18
+ s.files = [
19
+ "MIT-LICENSE",
20
+ "README.rdoc",
21
+ "Rakefile",
22
+ "VERSION",
23
+ "lib/rubycue.rb",
24
+ "lib/rubycue/cuesheet.rb",
25
+ "lib/rubycue/exceptions.rb",
26
+ "lib/rubycue/index.rb",
27
+ "rubycue.gemspec",
28
+ "spec/fixtures/malformed.cue",
29
+ "spec/fixtures/multi_file.cue",
30
+ "spec/fixtures/test.cue",
31
+ "spec/spec_helper.rb",
32
+ "spec/unit/cuesheet_spec.rb",
33
+ "spec/unit/index_spec.rb"
34
+ ]
35
+ s.homepage = "http://github.com/blakesmith/rubycue"
36
+ s.require_paths = ["lib"]
37
+ s.rubygems_version = "1.8.15"
38
+ s.summary = "Ruby cuesheet track parser"
39
+
40
+ if s.respond_to? :specification_version then
41
+ s.specification_version = 3
42
+
43
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
44
+ else
45
+ end
46
+ else
47
+ end
48
+ end
49
+
@@ -0,0 +1,79 @@
1
+ REM GENRE Rock
2
+ REM DATE 2012
3
+ REM DISCID A60DC10C
4
+ REM COMMENT "ExactAudioCopy v1.0b3"
5
+ PERFORMER "Patti Smith"
6
+ TITLE "Banga"
7
+ FILE "01 - Amerigo.wav" WAVE
8
+ TRACK 01 AUDIO
9
+ TITLE "Amerigo"
10
+ PERFORMER "Patti Smith"
11
+ ISRC H2KM11202363
12
+ INDEX 01 00:00:00
13
+ FILE "02 - April Fool.wav" WAVE
14
+ TRACK 02 AUDIO
15
+ TITLE "April Fool"
16
+ PERFORMER "Patti Smith"
17
+ ISRC H2KM11202009
18
+ INDEX 01 00:00:00
19
+ FILE "03 - Fuji-san.wav" WAVE
20
+ TRACK 03 AUDIO
21
+ TITLE "Fuji-san"
22
+ PERFORMER "Patti Smith"
23
+ ISRC H2KM11202364
24
+ INDEX 01 00:00:00
25
+ FILE "04 - This Is The Girl.wav" WAVE
26
+ TRACK 04 AUDIO
27
+ TITLE "This Is The Girl"
28
+ PERFORMER "Patti Smith"
29
+ ISRC H2KM11202365
30
+ INDEX 01 00:00:00
31
+ FILE "05 - Banga.wav" WAVE
32
+ TRACK 05 AUDIO
33
+ TITLE "Banga"
34
+ PERFORMER "Patti Smith"
35
+ ISRC H2KM11202366
36
+ INDEX 01 00:00:00
37
+ TRACK 06 AUDIO
38
+ TITLE "Maria"
39
+ PERFORMER "Patti Smith"
40
+ ISRC H2KM11202367
41
+ INDEX 00 02:50:13
42
+ FILE "06 - Maria.wav" WAVE
43
+ INDEX 01 00:00:00
44
+ FILE "07 - Mosaic.wav" WAVE
45
+ TRACK 07 AUDIO
46
+ TITLE "Mosaic"
47
+ PERFORMER "Patti Smith"
48
+ ISRC H2KM11202368
49
+ INDEX 01 00:00:00
50
+ FILE "08 - Tarkovsky (The Second Stop Is Jupiter).wav" WAVE
51
+ TRACK 08 AUDIO
52
+ TITLE "Tarkovsky (The Second Stop Is Jupiter)"
53
+ PERFORMER "Patti Smith"
54
+ ISRC H2KM11202369
55
+ INDEX 01 00:00:00
56
+ FILE "09 - Nine.wav" WAVE
57
+ TRACK 09 AUDIO
58
+ TITLE "Nine"
59
+ PERFORMER "Patti Smith"
60
+ ISRC H2KM11202370
61
+ INDEX 01 00:00:00
62
+ FILE "10 - Seneca.wav" WAVE
63
+ TRACK 10 AUDIO
64
+ TITLE "Seneca"
65
+ PERFORMER "Patti Smith"
66
+ ISRC H2KM11202371
67
+ INDEX 01 00:00:00
68
+ FILE "11 - Constantine's Dream.wav" WAVE
69
+ TRACK 11 AUDIO
70
+ TITLE "Constantine's Dream"
71
+ PERFORMER "Patti Smith"
72
+ ISRC H2KM11202372
73
+ INDEX 01 00:00:00
74
+ FILE "12 - After The Gold Rush.wav" WAVE
75
+ TRACK 12 AUDIO
76
+ TITLE "After The Gold Rush"
77
+ PERFORMER "Patti Smith"
78
+ ISRC H2KM11202373
79
+ INDEX 01 00:00:00
@@ -17,6 +17,14 @@ describe RubyCue::Cuesheet do
17
17
  it "returns true if successfully parsed" do
18
18
  @cuesheet.parse!.should be_true
19
19
  end
20
+
21
+ it "has the main performer" do
22
+ @cuesheet.performer.should == 'Netsky'
23
+ end
24
+
25
+ it "has the main title" do
26
+ @cuesheet.title.should == 'Essential Mix (2010-10-09)'
27
+ end
20
28
 
21
29
  it "has the right first track" do
22
30
  @cuesheet.songs.first[:title].should == "Intro"
@@ -54,6 +62,14 @@ describe RubyCue::Cuesheet do
54
62
  @cuesheet.songs.size.should == 53
55
63
  end
56
64
 
65
+ it "has the main file" do
66
+ @cuesheet.file.should == '2010-10-09 - Essential Mix - Netsky.mp3'
67
+ end
68
+
69
+ it "has no tracks files" do
70
+ @cuesheet.songs.each { |song| song[:file].should == nil }
71
+ end
72
+
57
73
  describe "#calculate_song_duration!" do
58
74
  it "properly calculates song duration at the beginning of the track" do
59
75
  @cuesheet.songs.first[:duration].to_a.should == [1, 50, 07]
@@ -83,6 +99,30 @@ describe RubyCue::Cuesheet do
83
99
  lambda { cuesheet.parse! }.should raise_error(RubyCue::InvalidCuesheet)
84
100
  end
85
101
  end
102
+
103
+ context "multiple files cuesheet" do
104
+ before do
105
+ @cuesheet_file = load_cuesheet("multi_file")
106
+ @cuesheet = RubyCue::Cuesheet.new(@cuesheet_file)
107
+ @cuesheet.parse!
108
+ end
109
+
110
+ it "has the main file" do
111
+ @cuesheet.file.should == nil
112
+ end
113
+
114
+ it "has the right first track file" do
115
+ @cuesheet.songs.first[:file].should == "01 - Amerigo.wav"
116
+ end
117
+
118
+ it "has the right last track file" do
119
+ @cuesheet.songs.last[:file].should == "12 - After The Gold Rush.wav"
120
+ end
121
+
122
+ it "has genre" do
123
+ @cuesheet.genre.should == 'Rock'
124
+ end
125
+ end
86
126
  end
87
127
 
88
128
  describe "#position" do
metadata CHANGED
@@ -1,34 +1,23 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: rubycue
3
- version: !ruby/object:Gem::Version
4
- hash: 29
5
- prerelease: false
6
- segments:
7
- - 0
8
- - 0
9
- - 1
10
- version: 0.0.1
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.1.0
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Blake Smith
14
- autorequire:
9
+ autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2010-10-26 00:00:00 -05:00
19
- default_executable:
12
+ date: 2012-07-23 00:00:00.000000000Z
20
13
  dependencies: []
21
-
22
14
  description: Basic ruby parser for song cuesheets
23
15
  email: blakesmith0@gmail.com
24
16
  executables: []
25
-
26
17
  extensions: []
27
-
28
- extra_rdoc_files:
18
+ extra_rdoc_files:
29
19
  - README.rdoc
30
- files:
31
- - .gitignore
20
+ files:
32
21
  - MIT-LICENSE
33
22
  - README.rdoc
34
23
  - Rakefile
@@ -37,46 +26,36 @@ files:
37
26
  - lib/rubycue/cuesheet.rb
38
27
  - lib/rubycue/exceptions.rb
39
28
  - lib/rubycue/index.rb
29
+ - rubycue.gemspec
40
30
  - spec/fixtures/malformed.cue
31
+ - spec/fixtures/multi_file.cue
41
32
  - spec/fixtures/test.cue
42
33
  - spec/spec_helper.rb
43
34
  - spec/unit/cuesheet_spec.rb
44
35
  - spec/unit/index_spec.rb
45
- has_rdoc: true
46
36
  homepage: http://github.com/blakesmith/rubycue
47
37
  licenses: []
48
-
49
- post_install_message:
50
- rdoc_options:
51
- - --charset=UTF-8
52
- require_paths:
38
+ post_install_message:
39
+ rdoc_options: []
40
+ require_paths:
53
41
  - lib
54
- required_ruby_version: !ruby/object:Gem::Requirement
42
+ required_ruby_version: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
55
47
  none: false
56
- requirements:
57
- - - ">="
58
- - !ruby/object:Gem::Version
59
- hash: 3
60
- segments:
61
- - 0
62
- version: "0"
63
- required_rubygems_version: !ruby/object:Gem::Requirement
48
+ required_rubygems_version: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ! '>='
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
64
53
  none: false
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- hash: 3
69
- segments:
70
- - 0
71
- version: "0"
72
54
  requirements: []
73
-
74
- rubyforge_project:
75
- rubygems_version: 1.3.7
76
- signing_key:
55
+ rubyforge_project:
56
+ rubygems_version: 1.8.15
57
+ signing_key:
77
58
  specification_version: 3
78
59
  summary: Ruby cuesheet track parser
79
- test_files:
80
- - spec/spec_helper.rb
81
- - spec/unit/cuesheet_spec.rb
82
- - spec/unit/index_spec.rb
60
+ test_files: []
61
+ ...
data/.gitignore DELETED
@@ -1 +0,0 @@
1
- *.swp