quran-audio 0.3.2 → 0.4.0

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
  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