quran-audio 0.3.2 → 0.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b9d4aa2977f958be7f3d1544b0cefa0141a464886fbcc6681390735b1af33083
4
- data.tar.gz: 467c4a4f34baf890df84fce649122fb3fca2bb483c399ee831fdb7e699b43b9b
3
+ metadata.gz: e4f6bb534d549b8f15007767b977d02ba66bb99b29230d208cd025beef58156e
4
+ data.tar.gz: fcf08060b5f19fc4404cf8620f3c4acde6e936f6080ecc5ee36f266eaa0a4f11
5
5
  SHA512:
6
- metadata.gz: 00c1fef420cf3fb24b2130c04da9b8c8032f8cb101089d4f430fb1a3029e869d0359aa20e7e650f9c2b0ce3f52c09e28399710bb62cb33a246a5c99efec1dab5
7
- data.tar.gz: 0c7ab62d560a4b775edfdbb596cffffa8163de8137133b84e826fd647f7654316d659490cc11c339715a8ac11e0f1f11703c1a1d5010606d23fdc873e1dca5de
6
+ metadata.gz: b470c6fc24757c9f77702dd1516a2ea13b853169cd8838515c911d8d9ed2c4cebccb7c502fec64df657badebb82f5f1870e3dcecce314e9e1c9e5ebf4ae69bbc
7
+ data.tar.gz: 0ade0f5665a4e42b2811ce6582a62ab4162954eccceee2084a8eccc2a98d59b2accae844a113fa1a4c1b71f03248291be66e0e42efc99e3c3d48b6eebb5ee5b9
data/README.md CHANGED
@@ -1,16 +1,23 @@
1
+ <p align="center">
2
+ الْحَمْدُ لِلَّهِ رَبِّ الْعَالَمِي
3
+ </p>
4
+
1
5
  ## About
2
6
 
3
7
  quran-audio is a command-line utility that
4
8
  can download recitations of The Noble Quran from
5
- [everyayah.com](https://everyayah.com).
6
- The recitations are provided as MP3 files
7
- (with one MP3 file per ayah).
9
+ [al-quran-audio.reflectslight.io](https://al-quran-audio.reflectslight.io).
10
+ The recitations are provided in the MP3 format with
11
+ one MP3 file per ayah and a *minimum* bitrate of
12
+ 128kbps.
8
13
 
9
- ## ~/.local/share/quran-audio/
14
+ ## share/
10
15
 
11
- Downloads are stored relative to ~/.local/share/quran-audio. <br>
12
- An example path:
13
- `/home/user/.local/share/quran-audio/mp3/alafasy/1/1.mp3`
16
+ The command-line utility attempts to download MP3 files
17
+ relative to the `~/.local/share/quran-audio/` directory.
18
+ A single, full recitation of The Noble Quran typically
19
+ ranges from 2.5GB to 2.8GB in size. Each recitation is
20
+ organized per this directory structure:
14
21
 
15
22
  * **~/.local/share/quran-audio/mp3/alafasy/** <br>
16
23
  Contains recitations by Mishari bin Rashed Alafasy
@@ -18,25 +25,50 @@ An example path:
18
25
  Contains recitations by Ahmad bin Ali Al-Ajmi
19
26
  * **~/.local/share/quran-audio/mp3/yassin/** <br>
20
27
  Contains recitations by Sahl Yassin
28
+ * **~/.local/share/quran-audio/mp3/rifai/** <br>
29
+ Contains recitations by Hani ar-Rifai
30
+
31
+ ## Examples
32
+
33
+ The following examples demonstrate how to use the quran-audio
34
+ command-line utility to download particular recitations, and
35
+ list available recitations as well:
36
+
37
+ ##
38
+ # Download recitations
39
+ user@localhost$ quran-audio pull -r alafasy
40
+ user@localhost$ quran-audio pull -r rifai
41
+
42
+ ##
43
+ # List available recitations
44
+ user@localhost$ quran-audio ls
21
45
 
22
46
  ## Install
23
47
 
24
- quran-audio is available via rubygems.org:
48
+ quran-audio is available via rubygems.org
49
+
50
+ gem install quran-audio
51
+
52
+ ## Credit
53
+
54
+ **Recitations**
55
+
56
+ * Mishari bin Rashed Alafasy
57
+ * Ahmad bin Ali Al-Ajmi
58
+ * Sahl Yassin
59
+ * Hani ar-Rifai
25
60
 
26
- user@localhost$ gem install quran-audio
27
- user@localhost$ quran-audio --help
28
- user@localhost$ quran-audio ls --help
29
- user@localhost$ quran-audio pull --help
61
+ **Sources**
30
62
 
31
- ## Thanks
63
+ * The [everyayah.com](https://everyayah.com) website
32
64
 
33
- Alhamdulillah
65
+ ## See also
34
66
 
35
- * Thanks to the [everyayah.com](https://everyayah.com) website
36
- * Thanks to the reciters
67
+ * [al-quran.reflectslight.io](https://al-quran.reflectslight.io)
68
+ * [al-quran-audio.reflectslight.io](https://al-quran-audio.reflectslight.io)
37
69
 
38
70
  ## License
39
71
 
40
72
  The "source code" is released under the [GPL](./LICENSE) license
41
73
  <br>
42
- The reciters hold the copyright for the audio files
74
+ Copyright for the recitations belongs to the reciters
data/bin/quran-audio CHANGED
@@ -1,17 +1,31 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
- libexec = File.realpath File.join(__dir__, "..", "libexec", "quran-audio")
5
- case ARGV[0]
6
- when "pull"
7
- Process.spawn File.join(libexec, "pull"), *ARGV[1..]
4
+ def wait
8
5
  Process.wait
9
- when "ls"
10
- Process.spawn File.join(libexec, "ls"), *ARGV[1..]
11
- Process.wait
12
- else
13
- warn "Usage: quran-audio [COMMAND] [OPTIONS]\n\n" \
14
- "Commands:\n" \
15
- " pull Pull MP3 files from everyayah.com\n" \
16
- " ls List reciters\n" \
6
+ rescue Interrupt
7
+ retry
8
+ end
9
+
10
+ def libexec
11
+ File.realpath File.join(__dir__, "..", "libexec", "quran-audio")
12
+ end
13
+
14
+ def main(argv)
15
+ case argv[0]
16
+ when "pull"
17
+ Process.spawn File.join(libexec, "pull"), *ARGV[1..]
18
+ Process.wait
19
+ when "ls"
20
+ Process.spawn File.join(libexec, "ls"), *ARGV[1..]
21
+ Process.wait
22
+ else
23
+ warn "Usage: quran-audio [COMMAND] [OPTIONS]\n\n" \
24
+ "Commands:\n" \
25
+ " pull Download recitations\n" \
26
+ " ls List available recitations\n"
27
+ end
28
+ rescue Interrupt
29
+ wait
17
30
  end
31
+ main(ARGV)
@@ -2,18 +2,11 @@
2
2
 
3
3
  module Quran::Audio
4
4
  class Command::Ls < Command
5
- set_banner usage: "quran-audio ls [OPTIONS]",
6
- description: "List recitations"
7
-
8
- def run
9
- recitations = Ryo.from_json(path: File.join(dir.datadir, "recitations.json"))
10
- template = File.binread(File.join(dir.datadir, "erb", "recitation.erb"))
11
- render(recitations, template)
12
- end
13
-
14
- private
15
-
16
- def render(recitations, template)
5
+ ##
6
+ # @return [void]
7
+ def perform
8
+ recitations = Ryo.from_json(path: File.join(dir.json, "recitations.json"))
9
+ template = File.binread(File.join(dir.erb, "recitation.erb"))
17
10
  puts Ryo.each(recitations).map { |switch, recitation|
18
11
  ERB.new(template).result_with_hash({switch:, recitation: Ryo(recitation)})
19
12
  }.join("\n")
@@ -2,20 +2,26 @@
2
2
 
3
3
  module Quran::Audio
4
4
  class Command::Pull < Command
5
- set_banner usage: "quran-audio pull [OPTIONS]",
6
- description: "Pull MP3 files from everyayah.com"
7
- set_option "-r RECITATION", "--recitation RECITATION", "A recitation's name", default: "alafasy"
8
- set_option "-b BITRATE", "--bitrate BITRATE", "MP3 bitrate"
9
- set_option "-s NUMBERS", "--surahs NUMBERS", "Comma-separated list of surah IDs", as: Array, default: (1..114)
10
- set_option "-d SECONDS", "--delay", "Delay between requests, in seconds", as: Float, default: 0.5
5
+ require "forwardable"
6
+ extend Forwardable
7
+ def_delegators :@options,
8
+ :surahs,
9
+ :recitation,
10
+ :delay,
11
+ :bitrate
11
12
 
12
- def initialize(...)
13
- super
14
- @http = Net::HTTP.new("everyayah.com", 443).tap { _1.use_ssl = true }
13
+ ##
14
+ # @return [void]
15
+ def perform
16
+ summary(recitations[recitation])
17
+ start(surahs)
15
18
  end
16
19
 
17
- def run
18
- summary(recitations[recitation])
20
+ private
21
+
22
+ attr_reader :http
23
+
24
+ def start(surahs)
19
25
  surahs.each do |surah|
20
26
  1.upto(sizeof[surah]) do |ayah|
21
27
  mp3 = MP3.new(recitation:, surah:, ayah:, bitrate:)
@@ -27,20 +33,17 @@ module Quran::Audio
27
33
  end
28
34
  end
29
35
 
30
- private
31
-
32
- attr_reader :http
33
-
34
36
  def pull(mp3, delay, interrupt: false)
37
+ http = Net::HTTP.new(mp3.host, 443).tap { _1.use_ssl = true }
35
38
  res = http.get(mp3.remote_path)
36
39
  write(mp3, res, interrupt:)
37
40
  sleep(delay)
38
41
  rescue Interrupt
39
- line.end.rewind.print("Wait for a graceful exit").end
42
+ line.end.print("SIGINT: exiting cleanly, please wait").end
40
43
  pull(mp3, delay, interrupt: true)
41
44
  rescue SocketError, SystemCallError, Net::OpenTimeout => e
42
- line.end.rewind.print("#{e.class}: retry")
43
- interrupt ? throw(:interrupt, true) : pull(mp3, delay)
45
+ line.end.print("#{e.class}: retry")
46
+ interrupt ? abort! : pull(mp3, delay)
44
47
  end
45
48
 
46
49
  def write(mp3, res, interrupt:)
@@ -48,26 +51,30 @@ module Quran::Audio
48
51
  when Net::HTTPOK
49
52
  mkdir_p File.dirname(mp3.local_path)
50
53
  File.binwrite(mp3.local_path, res.body)
51
- throw(:interrupt, true) if interrupt
54
+ abort! if interrupt
52
55
  else
53
- puts "error #{res.body}"
56
+ line.end.print("error: unexpected response (#{res.class})")
57
+ abort!
54
58
  end
55
59
  end
56
60
 
57
61
  def summary(r)
58
62
  line
59
- .rewind
60
- .print("Recitation".ljust(12), r.name).end
61
- .print("Directory".ljust(12), format(r.dest_dir, sharedir: dir.sharedir))
63
+ .print("Recited by".ljust(12), r.name).end
64
+ .print("Directory".ljust(12), format(r.destdir, sharedir: dir.share))
62
65
  .end.end
63
66
  end
64
67
 
65
68
  def sizeof
66
- @sizeof ||= Ryo.from_json(path: File.join(dir.datadir, "sizeof.json"))
69
+ @sizeof ||= Ryo.from_json(path: File.join(dir.json, "sizeof.json"))
67
70
  end
68
71
 
69
72
  def recitations
70
- @recitations ||= Ryo.from_json(path: File.join(dir.datadir, "recitations.json"))
73
+ @recitations ||= Ryo.from_json(path: File.join(dir.json, "recitations.json"))
74
+ end
75
+
76
+ def abort!
77
+ throw(:abort, 1)
71
78
  end
72
79
  end
73
80
  end
@@ -4,21 +4,20 @@ module Quran::Audio
4
4
  ##
5
5
  # The {Quran::Audio::Command Quran::Audio::Command} class
6
6
  # is the superclass of all commands.
7
- class Command < Cmd
7
+ class Command
8
8
  require_relative "command/ls"
9
9
  require_relative "command/pull"
10
10
  include FileUtils
11
11
 
12
- def method_missing(m, *ary, &b)
13
- Ryo.property?(options, m) ? options[m] : super
14
- end
15
-
16
- def respond_to_missing?(m, p = false)
17
- Ryo.property?(options, m) || super
18
- end
12
+ ##
13
+ # @return [Ryo]
14
+ # Command-line options
15
+ attr_reader :options
19
16
 
20
- def respond_to?(m, p = false)
21
- Ryo.property?(options, m) || super
17
+ ##
18
+ # @param [Ryo] options
19
+ def initialize(options)
20
+ @options = options
22
21
  end
23
22
 
24
23
  private
@@ -26,16 +25,13 @@ module Quran::Audio
26
25
  def dir
27
26
  @dir ||= Ryo.from({
28
27
  localbase: File.join(Dir.home, ".local"),
29
- rootdir: File.realpath(File.join(__dir__, "..", "..", "..")),
30
- sharedir: Ryo.memo { File.join(localbase, "share", "quran-audio") },
31
- datadir: Ryo.memo { File.join(rootdir, "share", "quran-audio", "data") }
28
+ share: Ryo.memo { File.join(localbase, "share", "quran-audio") },
29
+ root: File.realpath(File.join(__dir__, "..", "..", "..")),
30
+ erb: Ryo.memo { File.join(root, "share", "quran-audio", "erb") },
31
+ json: Ryo.memo { File.join(root, "share", "quran-audio", "json") },
32
32
  })
33
33
  end
34
34
 
35
- def options
36
- @options ||= parse_options(argv)
37
- end
38
-
39
35
  def line
40
36
  @line ||= IO::Line.new($stdout)
41
37
  end
@@ -2,9 +2,8 @@
2
2
 
3
3
  module Quran::Audio
4
4
  ##
5
- # {Quran::Audio::MP3 Quran::Audio::MP3} provides
6
- # an abstract interface around an MP3 file, and
7
- # within the context of the quran-audio project.
5
+ # {Quran::Audio::MP3 Quran::Audio::MP3} represents
6
+ # an ayah of The Noble Quran in the MP3 format.
8
7
  class MP3 < Struct.new(:recitation, :surah, :ayah, :bitrate, keyword_init: true)
9
8
  def initialize(recitation:, **kw)
10
9
  super(recitation: recitations[recitation], **kw)
@@ -17,12 +16,19 @@ module Quran::Audio
17
16
  super || recitation.default_bitrate
18
17
  end
19
18
 
19
+ ##
20
+ # @return [String]
21
+ # Returns the host of a remote HTTP server
22
+ def host
23
+ recitation.host
24
+ end
25
+
20
26
  ##
21
27
  # @return [String]
22
28
  # Returns the path to an MP3 file on a remote HTTP server
23
29
  def remote_path
24
- filename = [surah.to_s.rjust(3, "0"), ayah.to_s.rjust(3, "0"), ".mp3"].join
25
- File.join format(recitation.remote_path, bitrate:), filename
30
+ File.join format(recitation.path, bitrate:),
31
+ [surah, "/", ayah, ".mp3"].join
26
32
  end
27
33
 
28
34
  ##
@@ -30,7 +36,7 @@ module Quran::Audio
30
36
  # Returns the path to an MP3 file on disk
31
37
  def local_path
32
38
  File.join(
33
- format(recitation.dest_dir, sharedir:),
39
+ format(recitation.destdir, sharedir:),
34
40
  surah.to_s,
35
41
  "#{ayah}.mp3"
36
42
  )
@@ -39,7 +45,7 @@ module Quran::Audio
39
45
  private
40
46
 
41
47
  def recitations
42
- @recitations ||= Ryo.from_json(path: File.join(datadir, "recitations.json"))
48
+ @recitations ||= Ryo.from_json(path: File.join(jsondir, "recitations.json"))
43
49
  end
44
50
 
45
51
  def sharedir
@@ -49,10 +55,10 @@ module Quran::Audio
49
55
  end
50
56
  end
51
57
 
52
- def datadir
53
- @datadir ||= File.realpath File.join(
58
+ def jsondir
59
+ @jsondir ||= File.realpath File.join(
54
60
  __dir__, "..", "..", "..",
55
- "share", "quran-audio", "data"
61
+ "share", "quran-audio", "json"
56
62
  )
57
63
  end
58
64
  end
data/lib/quran/audio.rb CHANGED
@@ -2,7 +2,13 @@
2
2
 
3
3
  module Quran
4
4
  module Audio
5
- require "cmd"
5
+ def self.setup_bundle!
6
+ bundle = File.realpath File.join(__dir__, "..", "..", "bundle")
7
+ Dir[File.join(bundle, "*")].each { $:.unshift File.join(_1, "lib") }
8
+ end
9
+ setup_bundle!
10
+
11
+ require "json"
6
12
  require "ryo"
7
13
  require "ryo/json"
8
14
  require "fileutils"
@@ -2,9 +2,26 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require "quran/audio"
5
+ require "optparse"
6
+
7
+ ##
8
+ # main
5
9
  def main(argv)
6
- Quran::Audio::Command::Ls
7
- .new(argv)
8
- .run
10
+ options = Ryo({})
11
+ option_parser.parse(argv, into: options)
12
+ Quran::Audio::Command::Ls.new(options).perform
13
+ end
14
+
15
+ ##
16
+ # utils
17
+ def option_parser
18
+ OptionParser.new do |o|
19
+ o.banner = "Usage: quran-audio ls [OPTIONS]"
20
+ end
9
21
  end
10
- main(ARGV)
22
+
23
+ excode = catch(:abort) {
24
+ main(ARGV)
25
+ 0
26
+ }
27
+ exit excode
@@ -2,10 +2,35 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require "quran/audio"
5
+ require "optparse"
6
+
7
+ ##
8
+ # main
5
9
  def main(argv)
6
- Quran::Audio::Command::Pull
7
- .new(argv)
8
- .run
10
+ options = Ryo({
11
+ recitation: "alafasy",
12
+ bitrate: 128,
13
+ surahs: (1..114),
14
+ delay: 0.5
15
+ })
16
+ option_parser.parse(argv, into: options)
17
+ Quran::Audio::Command::Pull.new(options).perform
18
+ end
19
+
20
+ ##
21
+ # utils
22
+ def option_parser
23
+ OptionParser.new do |o|
24
+ o.banner = "Usage: quran-audio pull [OPTIONS]"
25
+ o.on("-r RECITATION", "--recitation RECITATION", "A recitation's name", String)
26
+ o.on("-b BITRATE" , "--bitrate BITRATE", "MP3 bitrate", Integer)
27
+ o.on("-s NUMBERS" , "--surahs NUMBERS", "Comma-separated list of surah IDs", Array)
28
+ o.on("-d SECONDS" , "--delay", "Delay between requests, in seconds", Float)
29
+ end
9
30
  end
10
- interrupt = catch(:interrupt) { main(ARGV) }
11
- exit(1) if interrupt
31
+
32
+ excode = catch(:abort) {
33
+ main(ARGV)
34
+ 0
35
+ }
36
+ exit excode
@@ -0,0 +1,4 @@
1
+ * vNEXT
2
+
3
+ ** Add new reciter: Nabil Al-Rifai
4
+ At the recommendation of a friend
@@ -1 +1 @@
1
- v0.3.2
1
+ v0.4.0
@@ -0,0 +1,42 @@
1
+ {
2
+ "alafasy": {
3
+ "id": "alafasy",
4
+ "name": "Mishari bin Rashed Alafasy",
5
+ "origin": "Kuwait",
6
+ "available_bitrates": [128],
7
+ "default_bitrate": 128,
8
+ "host": "al-quran-audio.reflectslight.io",
9
+ "path": "/alafasy/",
10
+ "destdir": "%{sharedir}/mp3/alafasy/"
11
+ },
12
+ "alajmi": {
13
+ "id": "alajmi",
14
+ "name": "Ahmad bin Ali Al-Ajmi",
15
+ "origin": "Saudi Arabia",
16
+ "available_bitrates": [128],
17
+ "default_bitrate": 128,
18
+ "host": "al-quran-audio.reflectslight.io",
19
+ "path": "/alajmi/",
20
+ "destdir": "%{sharedir}/mp3/alajmi/"
21
+ },
22
+ "yassin": {
23
+ "id": "yassin",
24
+ "name": "Sahl Yassin",
25
+ "origin": "Saudi Arabia",
26
+ "available_bitrates": [128],
27
+ "default_bitrate": 128,
28
+ "host": "al-quran-audio.reflectslight.io",
29
+ "path": "/yassin/",
30
+ "destdir": "%{sharedir}/mp3/yassin/"
31
+ },
32
+ "rifai": {
33
+ "id": "rifai",
34
+ "name": "Hani ar-Rifai",
35
+ "origin": "Saudi Arabia",
36
+ "available_bitrates": [192],
37
+ "default_bitrate": 192,
38
+ "host": "al-quran-audio.reflectslight.io",
39
+ "path": "/rifai/",
40
+ "destdir": "%{sharedir}/mp3/rifai/"
41
+ }
42
+ }
metadata CHANGED
@@ -1,85 +1,85 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: quran-audio
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - '0x1eef'
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-06-13 00:00:00.000000000 Z
11
+ date: 2024-11-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: ryo.rb
14
+ name: paint
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0.5'
19
+ version: '2.3'
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.5'
26
+ version: '2.3'
27
27
  - !ruby/object:Gem::Dependency
28
- name: cmd.rb
28
+ name: json
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.5'
33
+ version: '2.6'
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: '0.5'
40
+ version: '2.6'
41
41
  - !ruby/object:Gem::Dependency
42
- name: paint
42
+ name: optparse
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '2.3'
47
+ version: '0.6'
48
48
  type: :runtime
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: '2.3'
54
+ version: '0.6'
55
55
  - !ruby/object:Gem::Dependency
56
- name: json
56
+ name: net-http
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '2.6'
61
+ version: '0.5'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '2.6'
68
+ version: '0.5'
69
69
  - !ruby/object:Gem::Dependency
70
- name: io-line.rb
70
+ name: forwardable
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '0.1'
75
+ version: '1.3'
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '0.1'
82
+ version: '1.3'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: standard
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -94,7 +94,21 @@ dependencies:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '1.25'
97
- description: Downloads recitations of The Noble Quran from everyayah.com
97
+ - !ruby/object:Gem::Dependency
98
+ name: irb
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '1.14'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '1.14'
111
+ description: Download recitations of The Noble Quran
98
112
  email:
99
113
  - 0x1eef@protonmail.com
100
114
  executables:
@@ -112,10 +126,11 @@ files:
112
126
  - lib/quran/audio/mp3.rb
113
127
  - libexec/quran-audio/ls
114
128
  - libexec/quran-audio/pull
129
+ - share/quran-audio/CHANGELOG
115
130
  - share/quran-audio/VERSION
116
- - share/quran-audio/data/erb/recitation.erb
117
- - share/quran-audio/data/recitations.json
118
- - share/quran-audio/data/sizeof.json
131
+ - share/quran-audio/erb/recitation.erb
132
+ - share/quran-audio/json/recitations.json
133
+ - share/quran-audio/json/sizeof.json
119
134
  homepage: https://github.com/ReflectsLight/quran-audio#readme
120
135
  licenses:
121
136
  - GPL-3.0-or-later
@@ -135,8 +150,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
135
150
  - !ruby/object:Gem::Version
136
151
  version: '0'
137
152
  requirements: []
138
- rubygems_version: 3.5.9
153
+ rubygems_version: 3.5.21
139
154
  signing_key:
140
155
  specification_version: 4
141
- summary: Downloads recitations of The Noble Quran from everyayah.com
156
+ summary: Download recitations of The Noble Quran
142
157
  test_files: []
@@ -1,26 +0,0 @@
1
- {
2
- "alafasy": {
3
- "name": "Mishari bin Rashed Alafasy",
4
- "origin": "Kuwait",
5
- "available_bitrates": [128, 64],
6
- "default_bitrate": 128,
7
- "remote_path": "/data/Alafasy_%{bitrate}kbps/",
8
- "dest_dir": "%{sharedir}/mp3/alafasy/"
9
- },
10
- "alajmi": {
11
- "name": "Ahmad bin Ali Al-Ajmi",
12
- "origin": "Saudi Arabia",
13
- "available_bitrates": [128],
14
- "default_bitrate": 128,
15
- "remote_path": "/data/ahmed_ibn_ali_al_ajamy_%{bitrate}kbps/",
16
- "dest_dir": "%{sharedir}/mp3/alajmi/"
17
- },
18
- "yassin": {
19
- "name": "Sahl Yassin",
20
- "origin": "Saudi Arabia",
21
- "available_bitrates": [128],
22
- "default_bitrate": 128,
23
- "remote_path": "/data/Sahl_Yassin_%{bitrate}kbps/",
24
- "dest_dir": "%{sharedir}/mp3/yassin/"
25
- }
26
- }
File without changes
File without changes