quran-audio 0.3.3 → 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 +4 -4
- data/README.md +49 -17
- data/bin/quran-audio +6 -3
- data/lib/quran/audio/command/ls.rb +5 -12
- data/lib/quran/audio/command/pull.rb +17 -19
- data/lib/quran/audio/command.rb +13 -17
- data/lib/quran/audio/mp3.rb +15 -9
- data/lib/quran/audio.rb +7 -1
- data/libexec/quran-audio/ls +21 -4
- data/libexec/quran-audio/pull +25 -3
- 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
@@ -7,8 +7,11 @@ rescue Interrupt
|
|
7
7
|
retry
|
8
8
|
end
|
9
9
|
|
10
|
+
def libexec
|
11
|
+
File.realpath File.join(__dir__, "..", "libexec", "quran-audio")
|
12
|
+
end
|
13
|
+
|
10
14
|
def main(argv)
|
11
|
-
libexec = File.realpath File.join(__dir__, "..", "libexec", "quran-audio")
|
12
15
|
case argv[0]
|
13
16
|
when "pull"
|
14
17
|
Process.spawn File.join(libexec, "pull"), *ARGV[1..]
|
@@ -19,8 +22,8 @@ def main(argv)
|
|
19
22
|
else
|
20
23
|
warn "Usage: quran-audio [COMMAND] [OPTIONS]\n\n" \
|
21
24
|
"Commands:\n" \
|
22
|
-
" pull
|
23
|
-
" ls List
|
25
|
+
" pull Download recitations\n" \
|
26
|
+
" ls List available recitations\n"
|
24
27
|
end
|
25
28
|
rescue Interrupt
|
26
29
|
wait
|
@@ -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,19 +2,17 @@
|
|
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
|
-
|
15
|
-
end
|
16
|
-
|
17
|
-
def run
|
13
|
+
##
|
14
|
+
# @return [void]
|
15
|
+
def perform
|
18
16
|
summary(recitations[recitation])
|
19
17
|
start(surahs)
|
20
18
|
end
|
@@ -36,14 +34,15 @@ module Quran::Audio
|
|
36
34
|
end
|
37
35
|
|
38
36
|
def pull(mp3, delay, interrupt: false)
|
37
|
+
http = Net::HTTP.new(mp3.host, 443).tap { _1.use_ssl = true }
|
39
38
|
res = http.get(mp3.remote_path)
|
40
39
|
write(mp3, res, interrupt:)
|
41
40
|
sleep(delay)
|
42
41
|
rescue Interrupt
|
43
|
-
line.end.
|
42
|
+
line.end.print("SIGINT: exiting cleanly, please wait").end
|
44
43
|
pull(mp3, delay, interrupt: true)
|
45
44
|
rescue SocketError, SystemCallError, Net::OpenTimeout => e
|
46
|
-
line.end.
|
45
|
+
line.end.print("#{e.class}: retry")
|
47
46
|
interrupt ? abort! : pull(mp3, delay)
|
48
47
|
end
|
49
48
|
|
@@ -61,18 +60,17 @@ module Quran::Audio
|
|
61
60
|
|
62
61
|
def summary(r)
|
63
62
|
line
|
64
|
-
.
|
65
|
-
.print("
|
66
|
-
.print("Directory".ljust(12), format(r.destdir, sharedir: dir.sharedir))
|
63
|
+
.print("Recited by".ljust(12), r.name).end
|
64
|
+
.print("Directory".ljust(12), format(r.destdir, sharedir: dir.share))
|
67
65
|
.end.end
|
68
66
|
end
|
69
67
|
|
70
68
|
def sizeof
|
71
|
-
@sizeof ||= Ryo.from_json(path: File.join(dir.
|
69
|
+
@sizeof ||= Ryo.from_json(path: File.join(dir.json, "sizeof.json"))
|
72
70
|
end
|
73
71
|
|
74
72
|
def recitations
|
75
|
-
@recitations ||= Ryo.from_json(path: File.join(dir.
|
73
|
+
@recitations ||= Ryo.from_json(path: File.join(dir.json, "recitations.json"))
|
76
74
|
end
|
77
75
|
|
78
76
|
def abort!
|
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
|
##
|
@@ -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,11 +2,33 @@
|
|
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
|
31
|
+
|
10
32
|
excode = catch(:abort) {
|
11
33
|
main(ARGV)
|
12
34
|
0
|
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
|
-
"path": "/data/Alafasy_%{bitrate}kbps/",
|
8
|
-
"destdir": "%{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
|
-
"path": "/data/ahmed_ibn_ali_al_ajamy_%{bitrate}kbps/",
|
16
|
-
"destdir": "%{sharedir}/mp3/alajmi/"
|
17
|
-
},
|
18
|
-
"yassin": {
|
19
|
-
"name": "Sahl Yassin",
|
20
|
-
"origin": "Saudi Arabia",
|
21
|
-
"available_bitrates": [128],
|
22
|
-
"default_bitrate": 128,
|
23
|
-
"path": "/data/Sahl_Yassin_%{bitrate}kbps/",
|
24
|
-
"destdir": "%{sharedir}/mp3/yassin/"
|
25
|
-
}
|
26
|
-
}
|
File without changes
|
File without changes
|