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 +4 -4
- data/README.md +49 -17
- data/bin/quran-audio +26 -12
- data/lib/quran/audio/command/ls.rb +5 -12
- data/lib/quran/audio/command/pull.rb +32 -25
- data/lib/quran/audio/command.rb +13 -17
- data/lib/quran/audio/mp3.rb +16 -10
- data/lib/quran/audio.rb +7 -1
- data/libexec/quran-audio/ls +21 -4
- data/libexec/quran-audio/pull +30 -5
- data/share/quran-audio/CHANGELOG +4 -0
- data/share/quran-audio/VERSION +1 -1
- data/share/quran-audio/json/recitations.json +42 -0
- metadata +38 -23
- data/share/quran-audio/data/recitations.json +0 -26
- /data/share/quran-audio/{data/erb → erb}/recitation.erb +0 -0
- /data/share/quran-audio/{data → json}/sizeof.json +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e4f6bb534d549b8f15007767b977d02ba66bb99b29230d208cd025beef58156e
|
4
|
+
data.tar.gz: fcf08060b5f19fc4404cf8620f3c4acde6e936f6080ecc5ee36f266eaa0a4f11
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
[
|
6
|
-
The recitations are provided
|
7
|
-
|
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
|
-
##
|
14
|
+
## share/
|
10
15
|
|
11
|
-
|
12
|
-
|
13
|
-
|
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
|
-
|
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
|
-
|
63
|
+
* The [everyayah.com](https://everyayah.com) website
|
32
64
|
|
33
|
-
|
65
|
+
## See also
|
34
66
|
|
35
|
-
*
|
36
|
-
*
|
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
|
-
|
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
|
-
|
5
|
-
case ARGV[0]
|
6
|
-
when "pull"
|
7
|
-
Process.spawn File.join(libexec, "pull"), *ARGV[1..]
|
4
|
+
def wait
|
8
5
|
Process.wait
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
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
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
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
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
5
|
+
require "forwardable"
|
6
|
+
extend Forwardable
|
7
|
+
def_delegators :@options,
|
8
|
+
:surahs,
|
9
|
+
:recitation,
|
10
|
+
:delay,
|
11
|
+
:bitrate
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
|
13
|
+
##
|
14
|
+
# @return [void]
|
15
|
+
def perform
|
16
|
+
summary(recitations[recitation])
|
17
|
+
start(surahs)
|
15
18
|
end
|
16
19
|
|
17
|
-
|
18
|
-
|
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.
|
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.
|
43
|
-
interrupt ?
|
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
|
-
|
54
|
+
abort! if interrupt
|
52
55
|
else
|
53
|
-
|
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
|
-
.
|
60
|
-
.print("
|
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.
|
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.
|
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
|
data/lib/quran/audio/command.rb
CHANGED
@@ -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
|
7
|
+
class Command
|
8
8
|
require_relative "command/ls"
|
9
9
|
require_relative "command/pull"
|
10
10
|
include FileUtils
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
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
|
-
|
21
|
-
|
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
|
-
|
30
|
-
|
31
|
-
|
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
|
data/lib/quran/audio/mp3.rb
CHANGED
@@ -2,9 +2,8 @@
|
|
2
2
|
|
3
3
|
module Quran::Audio
|
4
4
|
##
|
5
|
-
# {Quran::Audio::MP3 Quran::Audio::MP3}
|
6
|
-
# an
|
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
|
-
|
25
|
-
|
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.
|
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(
|
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
|
53
|
-
@
|
58
|
+
def jsondir
|
59
|
+
@jsondir ||= File.realpath File.join(
|
54
60
|
__dir__, "..", "..", "..",
|
55
|
-
"share", "quran-audio", "
|
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
|
-
|
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"
|
data/libexec/quran-audio/ls
CHANGED
@@ -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
|
-
|
7
|
-
|
8
|
-
|
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
|
-
|
22
|
+
|
23
|
+
excode = catch(:abort) {
|
24
|
+
main(ARGV)
|
25
|
+
0
|
26
|
+
}
|
27
|
+
exit excode
|
data/libexec/quran-audio/pull
CHANGED
@@ -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
|
-
|
7
|
-
|
8
|
-
|
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
|
-
|
11
|
-
|
31
|
+
|
32
|
+
excode = catch(:abort) {
|
33
|
+
main(ARGV)
|
34
|
+
0
|
35
|
+
}
|
36
|
+
exit excode
|
data/share/quran-audio/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
v0.
|
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.
|
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-
|
11
|
+
date: 2024-11-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: paint
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
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: '
|
26
|
+
version: '2.3'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: json
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
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: '
|
40
|
+
version: '2.6'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: optparse
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
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: '
|
54
|
+
version: '0.6'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: net-http
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
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: '
|
68
|
+
version: '0.5'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: forwardable
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
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: '
|
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
|
-
|
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/
|
117
|
-
- share/quran-audio/
|
118
|
-
- share/quran-audio/
|
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.
|
153
|
+
rubygems_version: 3.5.21
|
139
154
|
signing_key:
|
140
155
|
specification_version: 4
|
141
|
-
summary:
|
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
|