lyrics_finder 0.0.2 → 0.0.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 57cc0f1e4ad122a9fde9703f7a422db906bda1b2
4
- data.tar.gz: ec34c7b3f0598f39dcd1073bfb42d086df8cc629
3
+ metadata.gz: 18fb39d6218af131f95a5f89a8fa9e3e13c60016
4
+ data.tar.gz: 7b5240100f25a8c0001c19a4427f45853346f785
5
5
  SHA512:
6
- metadata.gz: 04d13064bd6d959785a314df9fa1943aa6b77c9d22887040addb62014ca7fa82311d3c6d78b7321ace0e24500e495f247d1354a0f8a341ca8f767197ae51b98e
7
- data.tar.gz: f5c787f0727f686cafaf6611b6208a29d8d72c6ef262e8a2d9e10ac624eb17134e0dbe79bfef04ebdf4e824f29feca7c21419d1a6afc9aeba160b3a21e106200
6
+ metadata.gz: d7f9660235e0f0d67af718ddb9646f5ebaacee41f1af025be16dffa38af7ff09fb1e6cf743789b471bac74535386424aa818cd140842cface9f904e1cb6f05f0
7
+ data.tar.gz: e4a45e2bdc8d6c0cb17aa6c25016bf4f1093bacfe4129468774aa5cee818ea0214de95d238bc2bb92c4a1875def4df931eab68d8bc44e4ab3bbd172bff8d7236
data/README.md CHANGED
@@ -18,16 +18,25 @@ Or install it yourself as:
18
18
 
19
19
  ## Hello World!
20
20
 
21
- Create an instance of `Finder`:
21
+ Create an instance of `Lyrics::Finder`:
22
22
 
23
23
  ```ruby
24
- finder = Finder.new
24
+ finder = Lyrics::Finder.new
25
25
  ```
26
26
 
27
- You can specify which websites are you going to get the lyrics from:
27
+ And search passing the author and the song title as parameters to `Lyrics::Finder#search`:
28
28
 
29
29
  ```ruby
30
- finder = Finder.new(:song_lyrics, :azlyrics)
30
+ finder.search 'idina menzel', 'let it go'
31
+ ```
32
+ Which will return and array with all the verses of the song as strings, or `nil` if the song cannot be found.
33
+
34
+ ### Customizing the search
35
+
36
+ You can specify which websites do you want to get the lyrics from (all by default):
37
+
38
+ ```ruby
39
+ finder = Lyrics::Finder.new(:song_lyrics, :azlyrics)
31
40
  ```
32
41
 
33
42
  You can choose among the following:
@@ -36,20 +45,13 @@ You can choose among the following:
36
45
  - SongLyrics (`:song_lyrics`)
37
46
  - AZLyrics (`:azlyrics`)
38
47
 
39
- And search passing the author and the song title as parameters to `Finder#search`:
40
-
41
- ```ruby
42
- finder.search 'idina menzel', 'let it go'
43
- ```
44
- Which will return and array with all the verses of the song as strings, or `nil` if it cannot found the song in any of the websites.
45
-
46
48
  ## Example
47
49
 
48
50
  In your ruby apps:
49
51
  ```ruby
50
52
  require 'lyrics_finder'
51
53
 
52
- finder = Finder.new
54
+ finder = Lyrics::Finder.new
53
55
  @song = finder.search 'idina menzel', 'let it go'
54
56
  puts @song
55
57
  ```
@@ -62,6 +64,10 @@ LyricsFinder is also available as a command-line tool.
62
64
 
63
65
  ## Changelog
64
66
 
67
+ v 0.0.3
68
+
69
+ - Wrapped everything into a `Lyrics` module.
70
+
65
71
  v 0.0.2
66
72
 
67
73
  - Changed the app interface `LyricsFinder::Fetcher` is now `Finder`.
@@ -78,4 +84,8 @@ v 0.0.1
78
84
  2. Create your feature branch (`git checkout -b my-new-feature`)
79
85
  3. Commit your changes (`git commit -am 'Add some feature'`)
80
86
  4. Push to the branch (`git push origin my-new-feature`)
81
- 5. Create a new Pull Request
87
+ 5. Create a new Pull Request
88
+
89
+ ## Credits
90
+
91
+ Inspired by [Lyricfy](https://github.com/javichito/Lyricfy).
data/bin/lyricsfinder CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env ruby
2
2
  require 'lyrics_finder/cli'
3
- CLI.start
3
+ Lyrics::CLI.start
@@ -1,12 +1,14 @@
1
1
  require 'thor'
2
2
  require 'lyrics_finder'
3
3
 
4
- class CLI < Thor
5
- desc 'search -a Author -t Song Title', 'Search the lyrics for the specified author and title'
6
- method_option 'author', :aliases => '-a', :type => :string
7
- method_option 'title', :aliases => '-t', :type => :string
8
- def search
9
- finder = Finder.new
10
- puts finder.search(options[:author], options[:title])
4
+ module Lyrics
5
+ class CLI < Thor
6
+ desc 'search -a Author -t Song Title', 'Search the lyrics for the specified author and title'
7
+ method_option 'author', :aliases => '-a', :type => :string
8
+ method_option 'title', :aliases => '-t', :type => :string
9
+ def search
10
+ finder = Lyrics::Finder.new
11
+ puts finder.search(options[:author], options[:title])
12
+ end
11
13
  end
12
14
  end
@@ -1,14 +1,16 @@
1
- module Providers::Azlyrics
2
- include Contracts
1
+ module Lyrics
2
+ module Providers::Azlyrics
3
+ include Contracts
3
4
 
4
- Contract Song => String
5
- def self.format_url(song)
6
- song.format_attributes_with_separator!("")
7
- "http://www.azlyrics.com/lyrics/#{song.author}/#{song.title}.html"
8
- end
5
+ Contract Lyrics::Song => String
6
+ def self.format_url(song)
7
+ song.format_attributes_with_separator!("")
8
+ "http://www.azlyrics.com/lyrics/#{song.author}/#{song.title}.html"
9
+ end
9
10
 
10
- Contract Tempfile => Or[Array, nil]
11
- def self.extract_lyric(data)
12
- Providers.extract_lyrics_at_css_from_data('div:nth-child(7)', data)
11
+ Contract Tempfile => Or[Array, nil]
12
+ def self.extract_lyric(data)
13
+ Lyrics::Providers.extract_lyrics_at_css_from_data('div:nth-child(7)', data)
14
+ end
13
15
  end
14
16
  end
@@ -1,14 +1,16 @@
1
- module Providers::LyricsWikia
2
- include Contracts
1
+ module Lyrics
2
+ module Providers::LyricsWikia
3
+ include Contracts
3
4
 
4
- Contract Song => String
5
- def self.format_url(song)
6
- song.format_attributes_with_separator!("_")
7
- "http://lyrics.wikia.com/#{song.author}:#{song.title}"
8
- end
5
+ Contract Lyrics::Song => String
6
+ def self.format_url(song)
7
+ song.format_attributes_with_separator!("_")
8
+ "http://lyrics.wikia.com/#{song.author}:#{song.title}"
9
+ end
9
10
 
10
- Contract Tempfile => Or[Array, nil]
11
- def self.extract_lyric(data)
12
- Providers.extract_lyrics_at_css_from_data('.lyricbox', data)
11
+ Contract Tempfile => Or[Array, nil]
12
+ def self.extract_lyric(data)
13
+ Lyrics::Providers.extract_lyrics_at_css_from_data('.lyricbox', data)
14
+ end
13
15
  end
14
16
  end
@@ -1,14 +1,16 @@
1
- module Providers::SongLyrics
2
- include Contracts
1
+ module Lyrics
2
+ module Providers::SongLyrics
3
+ include Contracts
3
4
 
4
- Contract Song => String
5
- def self.format_url(song)
6
- song.format_attributes_with_separator!("-")
7
- "http://www.songlyrics.com/#{song.author}/#{song.title}-lyrics/"
8
- end
5
+ Contract Lyrics::Song => String
6
+ def self.format_url(song)
7
+ song.format_attributes_with_separator!("-")
8
+ "http://www.songlyrics.com/#{song.author}/#{song.title}-lyrics/"
9
+ end
9
10
 
10
- Contract Tempfile => Or[Array, nil]
11
- def self.extract_lyric(data)
12
- Providers.extract_lyrics_at_css_from_data('#songLyricsDiv', data)
11
+ Contract Tempfile => Or[Array, nil]
12
+ def self.extract_lyric(data)
13
+ Lyrics::Providers.extract_lyrics_at_css_from_data('#songLyricsDiv', data)
14
+ end
13
15
  end
14
16
  end
@@ -1,21 +1,23 @@
1
1
  require_relative 'song'
2
2
 
3
- module Providers
4
- include Contracts
3
+ module Lyrics
4
+ module Providers
5
+ include Contracts
5
6
 
6
- Contract Symbol => Module
7
- def self.build_klass(provider)
8
- klass = "Providers::" + provider.to_s.camelize
9
- klass.constantize
10
- end
7
+ Contract Symbol => Module
8
+ def self.build_klass(provider)
9
+ klass = "Lyrics::Providers::" + provider.to_s.camelize
10
+ klass.constantize
11
+ end
11
12
 
12
- def self.extract_lyrics_at_css_from_data(css_element, data)
13
- html = Nokogiri::HTML(data)
14
- lyrics_container = html.css(css_element).first
15
- unless lyrics_container.nil?
16
- elements = lyrics_container.children.to_a
17
- phrases = elements.select { |el| el.text? && el.text != "\n" && !el.blank? }
18
- phrases.map! { |element| element.text.strip }
13
+ def self.extract_lyrics_at_css_from_data(css_element, data)
14
+ html = Nokogiri::HTML(data)
15
+ lyrics_container = html.css(css_element).first
16
+ unless lyrics_container.nil?
17
+ elements = lyrics_container.children.to_a
18
+ phrases = elements.select { |el| el.text? && el.text != "\n" && !el.blank? }
19
+ phrases.map! { |element| element.text.strip }
20
+ end
19
21
  end
20
22
  end
21
23
  end
@@ -1,21 +1,23 @@
1
- class Song
2
- attr_accessor :author, :title
1
+ module Lyrics
2
+ class Song
3
+ attr_accessor :author, :title
3
4
 
4
- def initialize(author, title)
5
- @author = author
6
- @title = title
7
- end
5
+ def initialize(author, title)
6
+ @author = author
7
+ @title = title
8
+ end
8
9
 
9
- def self.valid?(val)
10
- val.is_a?(Song) && !val.author.blank? && !val.title.blank?
11
- end
10
+ def self.valid?(val)
11
+ val.is_a?(Song) && !val.author.blank? && !val.title.blank?
12
+ end
12
13
 
13
- def self.to_s
14
- "a valid author and song title please"
15
- end
14
+ def self.to_s
15
+ "a valid author and song title please"
16
+ end
16
17
 
17
- def format_attributes_with_separator!(separator)
18
- self.author = I18n.transliterate(@author.strip.gsub(" ", separator))
19
- self.title = I18n.transliterate(@title.strip.gsub(" ", separator))
18
+ def format_attributes_with_separator!(separator)
19
+ self.author = I18n.transliterate(@author.strip.gsub(" ", separator))
20
+ self.title = I18n.transliterate(@title.strip.gsub(" ", separator))
21
+ end
20
22
  end
21
23
  end
@@ -1,3 +1,3 @@
1
1
  module LyricsFinder
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3.1"
3
3
  end
data/lib/lyrics_finder.rb CHANGED
@@ -1,53 +1,55 @@
1
1
  require_relative 'lyrics_finder/dependencies'
2
2
 
3
- class Finder
4
- include Contracts
5
- PROVIDERS_LIST = [:lyrics_wikia, :song_lyrics, :azlyrics]
3
+ module Lyrics
4
+ class Finder
5
+ include Contracts
6
+ PROVIDERS_LIST = [:lyrics_wikia, :song_lyrics, :azlyrics]
6
7
 
7
- def initialize(*args)
8
- @providers = filter_providers(args)
9
- end
10
-
11
- def selected_providers
12
- @providers
13
- end
8
+ def initialize(*args)
9
+ @providers = filter_providers(args)
10
+ end
14
11
 
15
- def search(author, title)
16
- song = Song.new(author, title)
17
- perform_search(song)
18
- end
12
+ def selected_providers
13
+ @providers
14
+ end
19
15
 
20
- Contract Song => Or[Array, nil]
21
- def perform_search(song)
22
- song_lyric = catch(:song_lyric) {
23
- @providers.each do |provider|
24
- klass = Providers.build_klass(provider)
25
- url = klass.format_url(song)
16
+ def search(author, title)
17
+ song = Song.new(author, title)
18
+ perform_search(song)
19
+ end
26
20
 
27
- data = perform_request(url)
28
- result = klass.extract_lyric(data) if data
29
- throw :song_lyric, result unless result.nil?
30
- end
31
- }
32
- # because if it doesn't find anything returns @providers by default
33
- song_lyric != @providers ? song_lyric : nil
34
- end
21
+ Contract Lyrics::Song => Or[Array, nil]
22
+ def perform_search(song)
23
+ song_lyric = catch(:song_lyric) {
24
+ @providers.each do |provider|
25
+ klass = Providers.build_klass(provider)
26
+ url = klass.format_url(song)
27
+
28
+ data = perform_request(url)
29
+ result = klass.extract_lyric(data) if data
30
+ throw :song_lyric, result unless result.nil?
31
+ end
32
+ }
33
+ # because if it doesn't find anything returns @providers by default
34
+ song_lyric != @providers ? song_lyric : nil
35
+ end
35
36
 
36
- private
37
+ private
37
38
 
38
- def filter_providers(providers)
39
- valid_providers = []
40
- providers.each do |provider|
41
- valid_providers << provider if PROVIDERS_LIST.include?(provider)
39
+ def filter_providers(providers)
40
+ valid_providers = []
41
+ providers.each do |provider|
42
+ valid_providers << provider if PROVIDERS_LIST.include?(provider)
43
+ end
44
+ valid_providers.any? ? valid_providers : PROVIDERS_LIST
42
45
  end
43
- valid_providers.any? ? valid_providers : PROVIDERS_LIST
44
- end
45
46
 
46
- def perform_request(url)
47
- begin
48
- open(url)
49
- rescue Exception => ex
50
- # puts "ERROR: " + ex.message
47
+ def perform_request(url)
48
+ begin
49
+ open(url)
50
+ rescue Exception => ex
51
+ # puts "ERROR: " + ex.message
52
+ end
51
53
  end
52
54
  end
53
55
  end
@@ -1,16 +1,16 @@
1
- describe Finder do
1
+ describe Lyrics::Finder do
2
2
  describe 'sets @providers properly on initialization' do
3
3
  context 'without specifying providers' do
4
- let(:finder) { Finder.new }
4
+ let(:finder) { Lyrics::Finder.new }
5
5
 
6
6
  it 'sets @providers to default PROVIDERS_LIST' do
7
- expect(finder.selected_providers).to eq Finder::PROVIDERS_LIST
7
+ expect(finder.selected_providers).to eq Lyrics::Finder::PROVIDERS_LIST
8
8
  end
9
9
  end
10
10
 
11
11
  context 'specifying providers' do
12
12
  context 'some providers are invalid' do
13
- let(:finder) { Finder.new(:lyrics_wikia, :bad_songs) }
13
+ let(:finder) { Lyrics::Finder.new(:lyrics_wikia, :bad_songs) }
14
14
 
15
15
  it 'filters invalid providers' do
16
16
  expect(finder.selected_providers).to match_array [:lyrics_wikia]
@@ -18,10 +18,10 @@ describe Finder do
18
18
  end
19
19
 
20
20
  context 'all providers are invalid' do
21
- let(:finder) { Finder.new(:bad_songs, :invalid_songs) }
21
+ let(:finder) { Lyrics::Finder.new(:bad_songs, :invalid_songs) }
22
22
 
23
23
  it 'sets @providers to default PROVIDERS_LIST' do
24
- expect(finder.selected_providers).to eq Finder::PROVIDERS_LIST
24
+ expect(finder.selected_providers).to eq Lyrics::Finder::PROVIDERS_LIST
25
25
  end
26
26
  end
27
27
  end
@@ -31,7 +31,7 @@ describe Finder do
31
31
  describe 'using LyricsWikia as the provider' do
32
32
  context 'with a song that can be found' do
33
33
  before :each do
34
- @finder = Finder.new(:lyrics_wikia)
34
+ @finder = Lyrics::Finder.new(:lyrics_wikia)
35
35
  VCR.use_cassette 'LyricsWikia 200 search' do
36
36
  @song = @finder.search("american authors", "best day of my life")
37
37
  end
@@ -49,7 +49,7 @@ describe Finder do
49
49
  # Searching for a song that exist but it's not yet on this website.
50
50
  context 'with a song that cannot be found' do
51
51
  before :each do
52
- @finder = Finder.new(:lyrics_wikia)
52
+ @finder = Lyrics::Finder.new(:lyrics_wikia)
53
53
  VCR.use_cassette 'LyricsWikia Song does not exist search' do
54
54
  @song = @finder.search("arctic monkeys", "do i wanna know")
55
55
  end
@@ -63,7 +63,7 @@ describe Finder do
63
63
 
64
64
  describe 'using Azlyrics as the provider' do
65
65
  before :each do
66
- @finder = Finder.new(:azlyrics)
66
+ @finder = Lyrics::Finder.new(:azlyrics)
67
67
  VCR.use_cassette 'Azlyrics 200 search' do
68
68
  @song = @finder.search("american authors", "best day of my life")
69
69
  end
@@ -80,7 +80,7 @@ describe Finder do
80
80
 
81
81
  describe 'using SongLyrics as the provider' do
82
82
  before :each do
83
- @finder = Finder.new(:song_lyrics)
83
+ @finder = Lyrics::Finder.new(:song_lyrics)
84
84
  VCR.use_cassette 'SongLyrics 200 search' do
85
85
  @song = @finder.search("american authors", "best day of my life")
86
86
  end
@@ -99,7 +99,7 @@ describe Finder do
99
99
  # it just redirect to the root url www.lyricsmania.com
100
100
  # describe 'using LyricsMania as the provider' do
101
101
  # before :each do
102
- # @finder = Finder.new(:lyrics_mania)
102
+ # @finder = Lyrics::Finder.new(:lyrics_mania)
103
103
  # VCR.use_cassette 'LyricsMania 200 search' do
104
104
  # @song = @finder.search("american authors", "best day of my life")
105
105
  # end
@@ -116,7 +116,7 @@ describe Finder do
116
116
 
117
117
  describe 'with a song that cannot be found' do
118
118
  before :each do
119
- @finder = Finder.new
119
+ @finder = Lyrics::Finder.new
120
120
  VCR.use_cassette 'Nonexistent Song 404 search' do
121
121
  @song = @finder.search("the foobar band", "rubynation")
122
122
  end
@@ -128,7 +128,7 @@ describe Finder do
128
128
  end
129
129
 
130
130
  describe 'with invalid parameters' do
131
- let(:finder) { Finder.new }
131
+ let(:finder) { Lyrics::Finder.new }
132
132
 
133
133
  it 'fails with ContractError' do
134
134
  expect{
@@ -1,9 +1,9 @@
1
1
  # encoding: UTF-8
2
- describe Providers::Azlyrics do
2
+ describe Lyrics::Providers::Azlyrics do
3
3
  describe '.format_url' do
4
4
  context 'with valid author and title' do
5
- let(:klass) { Providers::Azlyrics }
6
- let(:song) { Song.new("amêricàn authors", "best day of my life") }
5
+ let(:klass) { Lyrics::Providers::Azlyrics }
6
+ let(:song) { Lyrics::Song.new("amêricàn authors", "best day of my life") }
7
7
  let(:valid_url) { "http://www.azlyrics.com/lyrics/americanauthors/bestdayofmylife.html" }
8
8
 
9
9
  it 'returns a properly formatted url' do
@@ -1,9 +1,9 @@
1
1
  # encoding: UTF-8
2
- describe Providers::LyricsWikia do
2
+ describe Lyrics::Providers::LyricsWikia do
3
3
  describe '.format_url' do
4
4
  context 'with valid author and title' do
5
- let(:klass) { Providers::LyricsWikia }
6
- let(:song) { Song.new("amëricán authòrs", "best day of my life") }
5
+ let(:klass) { Lyrics::Providers::LyricsWikia }
6
+ let(:song) { Lyrics::Song.new("amëricán authòrs", "best day of my life") }
7
7
  let(:valid_url) { "http://lyrics.wikia.com/american_authors:best_day_of_my_life" }
8
8
 
9
9
  it 'returns a properly formatted url' do
@@ -12,7 +12,7 @@ describe Providers::LyricsWikia do
12
12
  end
13
13
 
14
14
  context 'with invalid author or title' do
15
- let(:klass) { Providers::LyricsWikia }
15
+ let(:klass) { Lyrics::Providers::LyricsWikia }
16
16
 
17
17
  it 'with non-string arguments raises a ContractError Exception' do
18
18
  expect{
@@ -31,7 +31,7 @@ describe Providers::LyricsWikia do
31
31
  describe '.extract_lyric' do
32
32
  # with valid data it's already tested in lyrics_finder_spec.rb
33
33
  context 'with invalid data' do
34
- let(:klass) { Providers::LyricsWikia }
34
+ let(:klass) { Lyrics::Providers::LyricsWikia }
35
35
 
36
36
  it 'raises a ContractError Exception' do
37
37
  expect{
@@ -1,9 +1,9 @@
1
1
  # encoding: UTF-8
2
- describe Providers::SongLyrics do
2
+ describe Lyrics::Providers::SongLyrics do
3
3
  describe '.format_url' do
4
4
  context 'with valid author and title' do
5
- let(:klass) { Providers::SongLyrics}
6
- let(:song) { Song.new("amêricàn authors", "best day of my life") }
5
+ let(:klass) { Lyrics::Providers::SongLyrics}
6
+ let(:song) { Lyrics::Song.new("amêricàn authors", "best day of my life") }
7
7
  let(:valid_url) { "http://www.songlyrics.com/american-authors/best-day-of-my-life-lyrics/" }
8
8
 
9
9
  it 'returns a properly formatted url' do
@@ -1,17 +1,17 @@
1
- describe Providers do
1
+ describe Lyrics::Providers do
2
2
  describe '.build_klass' do
3
3
  context 'with valid arguments' do
4
- let(:klass) { Providers::LyricsWikia }
4
+ let(:klass) { Lyrics::Providers::LyricsWikia }
5
5
 
6
6
  it 'builds the correct class' do
7
- expect(Providers.build_klass(:lyrics_wikia)).to eq klass
7
+ expect(Lyrics::Providers.build_klass(:lyrics_wikia)).to eq klass
8
8
  end
9
9
  end
10
10
 
11
11
  context 'with invalid arguments' do
12
12
  it 'raises a ContractError Exception' do
13
13
  expect{
14
- Providers.build_klass("klass")
14
+ Lyrics::Providers.build_klass("klass")
15
15
  }.to raise_error ContractError
16
16
  end
17
17
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lyrics_finder
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Romero
@@ -216,11 +216,6 @@ files:
216
216
  - spec/support/lyrics_wikia_sample_songs.rb
217
217
  - spec/support/song_lyrics_sample_songs.rb
218
218
  - spec/support/vcr_setup.rb
219
- - spec/vcr_cassettes/Azlyrics_200_search.yml
220
- - spec/vcr_cassettes/LyricsWikia_200_search.yml
221
- - spec/vcr_cassettes/LyricsWikia_Song_does_not_exist_search.yml
222
- - spec/vcr_cassettes/Nonexistent_Song_404_search.yml
223
- - spec/vcr_cassettes/SongLyrics_200_search.yml
224
219
  homepage: https://github.com/dnlR/lyrics_finder
225
220
  licenses:
226
221
  - MIT
@@ -256,8 +251,3 @@ test_files:
256
251
  - spec/support/lyrics_wikia_sample_songs.rb
257
252
  - spec/support/song_lyrics_sample_songs.rb
258
253
  - spec/support/vcr_setup.rb
259
- - spec/vcr_cassettes/Azlyrics_200_search.yml
260
- - spec/vcr_cassettes/LyricsWikia_200_search.yml
261
- - spec/vcr_cassettes/LyricsWikia_Song_does_not_exist_search.yml
262
- - spec/vcr_cassettes/Nonexistent_Song_404_search.yml
263
- - spec/vcr_cassettes/SongLyrics_200_search.yml