Reach Global Recordings Network, and lift 147 more groups
GRN records the gospel as AUDIO for languages with no writing, which is most of what is left in the gap — and every earlier attempt recorded it as unreachable. globalrecordings.net sits behind a proof-of-work bot shield that challenges even robots.txt; that is an access control and is not worked around. Their own delivery site, 5fish.org, is not shielded, allows what this reads, and resolves by ISO 639-3 directly. First 180 gap codes swept: 74 hold gospel audio, a 41% hit rate, and 147 people groups that had nothing now have the gospel in a form they can receive. Tier 0 falls 2,873 to 2,746. The host NEVER 404s. A nonsense path returns HTTP 200 and a plausible geo-located page, so reading 200 as existence would have marked every code on earth as covered. Existence is read from the page title, and a negative and a positive control run in band on every run — the fetcher aborts if a nonsense code ever reads as a real language. Their robots.txt asks for a ten-second crawl delay, so the sweep is sequential, capped per run and resumable. Do not add concurrency. Three sign languages are deliberately left out. GRN's catalogue is audio; 5fish holding a page titled "Pakistan Sign Language" says they index the language, not that they have signed video. Attaching it told 20 Deaf groups — 11.5 million people — that gospel audio was available to them. Unverified, and for that audience useless. Six places across three surfaces still told the reader GRN answers 403 to everything and had never been searched. That is now false, and a stale caveat misleads exactly as much as a stale number. Also here, because adding a source is what exposed it: the charts profile decided "this group has nothing" a second time, by listing the resource fields by hand. That list went stale every time a source was added — 7 languages once, 23 when Scripture Earth landed — so the chart drew groups as having nothing while the map offered them a working link. It now reads the tier the pin index already computed, and a new gate refuses any surface that re-derives it. The gate was checked against the real pre-fix file, not only a synthetic one.
This commit is contained in:
parent
4d79c08fd4
commit
b089f9effb
35 changed files with 3264 additions and 1378 deletions
File diff suppressed because it is too large
Load diff
|
|
@ -14,29 +14,29 @@
|
|||
"country": "People's Republic of China",
|
||||
"region": "Asia",
|
||||
"groups": 391,
|
||||
"no_resource": 125,
|
||||
"pop_no_resource": 150271700,
|
||||
"no_resource": 111,
|
||||
"pop_no_resource": 128103100,
|
||||
"scripture": 118,
|
||||
"film": 227,
|
||||
"growing_unreached": 0,
|
||||
"deaths_day": 274.2,
|
||||
"growth": -0.12,
|
||||
"pct_no_resource": 32,
|
||||
"band": "high"
|
||||
"pct_no_resource": 28.4,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
"iso3": "LAO",
|
||||
"country": "Lao People's Democratic Republic",
|
||||
"region": "Asia",
|
||||
"groups": 158,
|
||||
"no_resource": 79,
|
||||
"pop_no_resource": 1306185,
|
||||
"no_resource": 72,
|
||||
"pop_no_resource": 982785,
|
||||
"scripture": 55,
|
||||
"film": 58,
|
||||
"growing_unreached": 0,
|
||||
"deaths_day": 15.5,
|
||||
"growth": null,
|
||||
"pct_no_resource": 50,
|
||||
"pct_no_resource": 45.6,
|
||||
"band": "high"
|
||||
},
|
||||
{
|
||||
|
|
@ -44,14 +44,14 @@
|
|||
"country": "India",
|
||||
"region": "Asia",
|
||||
"groups": 2146,
|
||||
"no_resource": 63,
|
||||
"pop_no_resource": 2157770,
|
||||
"no_resource": 55,
|
||||
"pop_no_resource": 1320695,
|
||||
"scripture": 1757,
|
||||
"film": 2044,
|
||||
"growing_unreached": 38,
|
||||
"deaths_day": 721.2,
|
||||
"growth": 0.89,
|
||||
"pct_no_resource": 2.9,
|
||||
"pct_no_resource": 2.6,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -74,14 +74,14 @@
|
|||
"country": "Chad",
|
||||
"region": "Africa",
|
||||
"groups": 150,
|
||||
"no_resource": 79,
|
||||
"pop_no_resource": 4813200,
|
||||
"no_resource": 69,
|
||||
"pop_no_resource": 2565700,
|
||||
"scripture": 46,
|
||||
"film": 49,
|
||||
"growing_unreached": 37,
|
||||
"deaths_day": 68.4,
|
||||
"growth": 4.95,
|
||||
"pct_no_resource": 52.7,
|
||||
"pct_no_resource": 46,
|
||||
"band": "high"
|
||||
},
|
||||
{
|
||||
|
|
@ -89,14 +89,14 @@
|
|||
"country": "Sudan",
|
||||
"region": "Africa",
|
||||
"groups": 185,
|
||||
"no_resource": 62,
|
||||
"pop_no_resource": 3220900,
|
||||
"no_resource": 58,
|
||||
"pop_no_resource": 2809900,
|
||||
"scripture": 96,
|
||||
"film": 117,
|
||||
"growing_unreached": 36,
|
||||
"deaths_day": 359.6,
|
||||
"growth": 0.81,
|
||||
"pct_no_resource": 33.5,
|
||||
"pct_no_resource": 31.4,
|
||||
"band": "high"
|
||||
},
|
||||
{
|
||||
|
|
@ -104,14 +104,14 @@
|
|||
"country": "Nigeria",
|
||||
"region": "Africa",
|
||||
"groups": 433,
|
||||
"no_resource": 187,
|
||||
"pop_no_resource": 8978825,
|
||||
"no_resource": 180,
|
||||
"pop_no_resource": 6759525,
|
||||
"scripture": 105,
|
||||
"film": 188,
|
||||
"growing_unreached": 0,
|
||||
"deaths_day": 44,
|
||||
"growth": null,
|
||||
"pct_no_resource": 43.2,
|
||||
"pct_no_resource": 41.6,
|
||||
"band": "high"
|
||||
},
|
||||
{
|
||||
|
|
@ -119,14 +119,14 @@
|
|||
"country": "Indonesia",
|
||||
"region": "Asia",
|
||||
"groups": 669,
|
||||
"no_resource": 321,
|
||||
"pop_no_resource": 5140960,
|
||||
"no_resource": 320,
|
||||
"pop_no_resource": 4968960,
|
||||
"scripture": 222,
|
||||
"film": 265,
|
||||
"growing_unreached": 23,
|
||||
"deaths_day": 47.2,
|
||||
"growth": 0.81,
|
||||
"pct_no_resource": 48,
|
||||
"pct_no_resource": 47.8,
|
||||
"band": "high"
|
||||
},
|
||||
{
|
||||
|
|
@ -164,14 +164,14 @@
|
|||
"country": "Bhutan",
|
||||
"region": "Asia",
|
||||
"groups": 36,
|
||||
"no_resource": 19,
|
||||
"pop_no_resource": 238225,
|
||||
"no_resource": 18,
|
||||
"pop_no_resource": 233625,
|
||||
"scripture": 11,
|
||||
"film": 16,
|
||||
"growing_unreached": 13,
|
||||
"deaths_day": 2.1,
|
||||
"growth": 0.65,
|
||||
"pct_no_resource": 52.8,
|
||||
"pct_no_resource": 50,
|
||||
"band": "high"
|
||||
},
|
||||
{
|
||||
|
|
@ -194,14 +194,14 @@
|
|||
"country": "Vietnam",
|
||||
"region": "Asia",
|
||||
"groups": 74,
|
||||
"no_resource": 29,
|
||||
"pop_no_resource": 1860175,
|
||||
"no_resource": 27,
|
||||
"pop_no_resource": 1540175,
|
||||
"scripture": 28,
|
||||
"film": 38,
|
||||
"growing_unreached": 11,
|
||||
"deaths_day": 5.7,
|
||||
"growth": 0.63,
|
||||
"pct_no_resource": 39.2,
|
||||
"pct_no_resource": 36.5,
|
||||
"band": "high"
|
||||
},
|
||||
{
|
||||
|
|
@ -209,14 +209,14 @@
|
|||
"country": "Islamic Republic of Iran",
|
||||
"region": "Asia",
|
||||
"groups": 47,
|
||||
"no_resource": 11,
|
||||
"pop_no_resource": 625400,
|
||||
"no_resource": 10,
|
||||
"pop_no_resource": 445400,
|
||||
"scripture": 27,
|
||||
"film": 32,
|
||||
"growing_unreached": 10,
|
||||
"deaths_day": 55.3,
|
||||
"growth": 1.05,
|
||||
"pct_no_resource": 23.4,
|
||||
"pct_no_resource": 21.3,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -239,14 +239,14 @@
|
|||
"country": "South Sudan",
|
||||
"region": "Africa",
|
||||
"groups": 80,
|
||||
"no_resource": 22,
|
||||
"pop_no_resource": 577100,
|
||||
"no_resource": 20,
|
||||
"pop_no_resource": 546600,
|
||||
"scripture": 39,
|
||||
"film": 52,
|
||||
"growing_unreached": 8,
|
||||
"deaths_day": 59,
|
||||
"growth": 3.93,
|
||||
"pct_no_resource": 27.5,
|
||||
"pct_no_resource": 25,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -254,14 +254,14 @@
|
|||
"country": "Mali",
|
||||
"region": "Africa",
|
||||
"groups": 40,
|
||||
"no_resource": 11,
|
||||
"pop_no_resource": 1066800,
|
||||
"no_resource": 10,
|
||||
"pop_no_resource": 1000800,
|
||||
"scripture": 20,
|
||||
"film": 26,
|
||||
"growing_unreached": 8,
|
||||
"deaths_day": 54.8,
|
||||
"growth": 2.94,
|
||||
"pct_no_resource": 27.5,
|
||||
"pct_no_resource": 25,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -269,14 +269,14 @@
|
|||
"country": "Malaysia",
|
||||
"region": "Asia",
|
||||
"groups": 160,
|
||||
"no_resource": 67,
|
||||
"pop_no_resource": 2650950,
|
||||
"no_resource": 65,
|
||||
"pop_no_resource": 1918550,
|
||||
"scripture": 75,
|
||||
"film": 68,
|
||||
"growing_unreached": 8,
|
||||
"deaths_day": 8.2,
|
||||
"growth": 1.22,
|
||||
"pct_no_resource": 41.9,
|
||||
"pct_no_resource": 40.6,
|
||||
"band": "high"
|
||||
},
|
||||
{
|
||||
|
|
@ -284,14 +284,14 @@
|
|||
"country": "Cameroon",
|
||||
"region": "Africa",
|
||||
"groups": 260,
|
||||
"no_resource": 129,
|
||||
"pop_no_resource": 3656425,
|
||||
"no_resource": 126,
|
||||
"pop_no_resource": 3210925,
|
||||
"scripture": 72,
|
||||
"film": 84,
|
||||
"growing_unreached": 8,
|
||||
"deaths_day": 3.4,
|
||||
"growth": 2.61,
|
||||
"pct_no_resource": 49.6,
|
||||
"pct_no_resource": 48.5,
|
||||
"band": "high"
|
||||
},
|
||||
{
|
||||
|
|
@ -299,14 +299,14 @@
|
|||
"country": "Thailand",
|
||||
"region": "Asia",
|
||||
"groups": 62,
|
||||
"no_resource": 16,
|
||||
"pop_no_resource": 1528800,
|
||||
"no_resource": 15,
|
||||
"pop_no_resource": 1069800,
|
||||
"scripture": 34,
|
||||
"film": 37,
|
||||
"growing_unreached": 0,
|
||||
"deaths_day": 12.6,
|
||||
"growth": -0.05,
|
||||
"pct_no_resource": 25.8,
|
||||
"pct_no_resource": 24.2,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -359,14 +359,14 @@
|
|||
"country": "Nepal",
|
||||
"region": "Asia",
|
||||
"groups": 171,
|
||||
"no_resource": 47,
|
||||
"pop_no_resource": 1259050,
|
||||
"no_resource": 46,
|
||||
"pop_no_resource": 1035050,
|
||||
"scripture": 97,
|
||||
"film": 111,
|
||||
"growing_unreached": 0,
|
||||
"deaths_day": 34,
|
||||
"growth": null,
|
||||
"pct_no_resource": 27.5,
|
||||
"pct_no_resource": 26.9,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -389,14 +389,14 @@
|
|||
"country": "Burkina Faso",
|
||||
"region": "Africa",
|
||||
"groups": 76,
|
||||
"no_resource": 20,
|
||||
"pop_no_resource": 1500700,
|
||||
"no_resource": 17,
|
||||
"pop_no_resource": 727700,
|
||||
"scripture": 41,
|
||||
"film": 37,
|
||||
"growing_unreached": 6,
|
||||
"deaths_day": 13.4,
|
||||
"growth": 2.25,
|
||||
"pct_no_resource": 26.3,
|
||||
"pct_no_resource": 22.4,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -449,14 +449,14 @@
|
|||
"country": "Democratic Republic of the Congo",
|
||||
"region": "Africa",
|
||||
"groups": 215,
|
||||
"no_resource": 105,
|
||||
"pop_no_resource": 12428000,
|
||||
"no_resource": 89,
|
||||
"pop_no_resource": 7568000,
|
||||
"scripture": 50,
|
||||
"film": 95,
|
||||
"growing_unreached": 5,
|
||||
"deaths_day": 10.9,
|
||||
"growth": 3.24,
|
||||
"pct_no_resource": 48.8,
|
||||
"pct_no_resource": 41.4,
|
||||
"band": "high"
|
||||
},
|
||||
{
|
||||
|
|
@ -479,14 +479,14 @@
|
|||
"country": "United Republic of Tanzania",
|
||||
"region": "Africa",
|
||||
"groups": 132,
|
||||
"no_resource": 22,
|
||||
"pop_no_resource": 4760400,
|
||||
"no_resource": 18,
|
||||
"pop_no_resource": 3289400,
|
||||
"scripture": 81,
|
||||
"film": 101,
|
||||
"growing_unreached": 4,
|
||||
"deaths_day": 126.9,
|
||||
"growth": 2.87,
|
||||
"pct_no_resource": 16.7,
|
||||
"pct_no_resource": 13.6,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -509,14 +509,14 @@
|
|||
"country": "Benin",
|
||||
"region": "Africa",
|
||||
"groups": 57,
|
||||
"no_resource": 4,
|
||||
"pop_no_resource": 500000,
|
||||
"no_resource": 3,
|
||||
"pop_no_resource": 277000,
|
||||
"scripture": 29,
|
||||
"film": 38,
|
||||
"growing_unreached": 4,
|
||||
"deaths_day": 21.9,
|
||||
"growth": 2.46,
|
||||
"pct_no_resource": 7,
|
||||
"pct_no_resource": 5.3,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -524,14 +524,14 @@
|
|||
"country": "Libya",
|
||||
"region": "Africa",
|
||||
"groups": 27,
|
||||
"no_resource": 6,
|
||||
"pop_no_resource": 329300,
|
||||
"no_resource": 5,
|
||||
"pop_no_resource": 317800,
|
||||
"scripture": 16,
|
||||
"film": 20,
|
||||
"growing_unreached": 4,
|
||||
"deaths_day": 0,
|
||||
"growth": 1.03,
|
||||
"pct_no_resource": 22.2,
|
||||
"pct_no_resource": 18.5,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -569,15 +569,15 @@
|
|||
"country": "Comoros",
|
||||
"region": "Africa",
|
||||
"groups": 11,
|
||||
"no_resource": 4,
|
||||
"pop_no_resource": 445500,
|
||||
"no_resource": 3,
|
||||
"pop_no_resource": 45500,
|
||||
"scripture": 6,
|
||||
"film": 6,
|
||||
"growing_unreached": 3,
|
||||
"deaths_day": 8.3,
|
||||
"growth": 1.89,
|
||||
"pct_no_resource": 36.4,
|
||||
"band": "high"
|
||||
"pct_no_resource": 27.3,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
"iso3": "BRN",
|
||||
|
|
@ -629,14 +629,14 @@
|
|||
"country": "Mozambique",
|
||||
"region": "Africa",
|
||||
"groups": 49,
|
||||
"no_resource": 6,
|
||||
"pop_no_resource": 2882000,
|
||||
"no_resource": 4,
|
||||
"pop_no_resource": 1032000,
|
||||
"scripture": 31,
|
||||
"film": 41,
|
||||
"growing_unreached": 2,
|
||||
"deaths_day": 26.4,
|
||||
"growth": 2.92,
|
||||
"pct_no_resource": 12.2,
|
||||
"pct_no_resource": 8.2,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -659,14 +659,14 @@
|
|||
"country": "Uganda",
|
||||
"region": "Africa",
|
||||
"groups": 54,
|
||||
"no_resource": 6,
|
||||
"pop_no_resource": 2970200,
|
||||
"no_resource": 4,
|
||||
"pop_no_resource": 460200,
|
||||
"scripture": 38,
|
||||
"film": 46,
|
||||
"growing_unreached": 2,
|
||||
"deaths_day": 23,
|
||||
"growth": 2.75,
|
||||
"pct_no_resource": 11.1,
|
||||
"pct_no_resource": 7.4,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -674,14 +674,14 @@
|
|||
"country": "Peru",
|
||||
"region": "Americas",
|
||||
"groups": 90,
|
||||
"no_resource": 12,
|
||||
"pop_no_resource": 1160875,
|
||||
"no_resource": 11,
|
||||
"pop_no_resource": 660875,
|
||||
"scripture": 73,
|
||||
"film": 57,
|
||||
"growing_unreached": 2,
|
||||
"deaths_day": 5.4,
|
||||
"growth": 1.09,
|
||||
"pct_no_resource": 13.3,
|
||||
"pct_no_resource": 12.2,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -704,14 +704,14 @@
|
|||
"country": "Niger",
|
||||
"region": "Africa",
|
||||
"groups": 25,
|
||||
"no_resource": 5,
|
||||
"pop_no_resource": 1153500,
|
||||
"no_resource": 4,
|
||||
"pop_no_resource": 1138500,
|
||||
"scripture": 16,
|
||||
"film": 18,
|
||||
"growing_unreached": 2,
|
||||
"deaths_day": 2.1,
|
||||
"growth": 3.28,
|
||||
"pct_no_resource": 20,
|
||||
"pct_no_resource": 16,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -749,14 +749,14 @@
|
|||
"country": "Sweden",
|
||||
"region": "Europe",
|
||||
"groups": 32,
|
||||
"no_resource": 6,
|
||||
"pop_no_resource": 65500,
|
||||
"no_resource": 5,
|
||||
"pop_no_resource": 62500,
|
||||
"scripture": 26,
|
||||
"film": 26,
|
||||
"growing_unreached": 2,
|
||||
"deaths_day": 1.1,
|
||||
"growth": 0.31,
|
||||
"pct_no_resource": 18.8,
|
||||
"pct_no_resource": 15.6,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -764,14 +764,14 @@
|
|||
"country": "Republic of The Gambia",
|
||||
"region": "Africa",
|
||||
"groups": 17,
|
||||
"no_resource": 4,
|
||||
"pop_no_resource": 430000,
|
||||
"no_resource": 3,
|
||||
"pop_no_resource": 35000,
|
||||
"scripture": 6,
|
||||
"film": 13,
|
||||
"growing_unreached": 2,
|
||||
"deaths_day": 0.6,
|
||||
"growth": 2.28,
|
||||
"pct_no_resource": 23.5,
|
||||
"pct_no_resource": 17.6,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -779,14 +779,14 @@
|
|||
"country": "Republic of the Congo",
|
||||
"region": "Africa",
|
||||
"groups": 64,
|
||||
"no_resource": 30,
|
||||
"pop_no_resource": 1344200,
|
||||
"no_resource": 27,
|
||||
"pop_no_resource": 907200,
|
||||
"scripture": 16,
|
||||
"film": 27,
|
||||
"growing_unreached": 2,
|
||||
"deaths_day": 1,
|
||||
"growth": 2.4,
|
||||
"pct_no_resource": 46.9,
|
||||
"pct_no_resource": 42.2,
|
||||
"band": "high"
|
||||
},
|
||||
{
|
||||
|
|
@ -959,14 +959,14 @@
|
|||
"country": "Cote d'Ivoire",
|
||||
"region": "Africa",
|
||||
"groups": 83,
|
||||
"no_resource": 21,
|
||||
"pop_no_resource": 1167500,
|
||||
"no_resource": 19,
|
||||
"pop_no_resource": 541500,
|
||||
"scripture": 44,
|
||||
"film": 53,
|
||||
"growing_unreached": 1,
|
||||
"deaths_day": 3.7,
|
||||
"growth": 2.44,
|
||||
"pct_no_resource": 25.3,
|
||||
"pct_no_resource": 22.9,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -1094,14 +1094,14 @@
|
|||
"country": "Central African Republic",
|
||||
"region": "Africa",
|
||||
"groups": 69,
|
||||
"no_resource": 34,
|
||||
"pop_no_resource": 1496250,
|
||||
"no_resource": 31,
|
||||
"pop_no_resource": 1025250,
|
||||
"scripture": 16,
|
||||
"film": 28,
|
||||
"growing_unreached": 1,
|
||||
"deaths_day": 0.6,
|
||||
"growth": 3.4,
|
||||
"pct_no_resource": 49.3,
|
||||
"pct_no_resource": 44.9,
|
||||
"band": "high"
|
||||
},
|
||||
{
|
||||
|
|
@ -1574,15 +1574,15 @@
|
|||
"country": "Liechtenstein",
|
||||
"region": "Europe",
|
||||
"groups": 4,
|
||||
"no_resource": 2,
|
||||
"pop_no_resource": 36400,
|
||||
"no_resource": 1,
|
||||
"pop_no_resource": 400,
|
||||
"scripture": 2,
|
||||
"film": 2,
|
||||
"growing_unreached": 1,
|
||||
"deaths_day": 0,
|
||||
"growth": 1.5,
|
||||
"pct_no_resource": 50,
|
||||
"band": "high"
|
||||
"pct_no_resource": 25,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
"iso3": "FRO",
|
||||
|
|
@ -2009,14 +2009,14 @@
|
|||
"country": "Namibia",
|
||||
"region": "Africa",
|
||||
"groups": 29,
|
||||
"no_resource": 7,
|
||||
"pop_no_resource": 992225,
|
||||
"no_resource": 5,
|
||||
"pop_no_resource": 113225,
|
||||
"scripture": 4,
|
||||
"film": 19,
|
||||
"growing_unreached": 0,
|
||||
"deaths_day": 3.3,
|
||||
"growth": 2.24,
|
||||
"pct_no_resource": 24.1,
|
||||
"pct_no_resource": 17.2,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -2054,14 +2054,14 @@
|
|||
"country": "Türkiye",
|
||||
"region": "Asia",
|
||||
"groups": 40,
|
||||
"no_resource": 2,
|
||||
"pop_no_resource": 1175000,
|
||||
"no_resource": 1,
|
||||
"pop_no_resource": 855000,
|
||||
"scripture": 35,
|
||||
"film": 37,
|
||||
"growing_unreached": 0,
|
||||
"deaths_day": 3.7,
|
||||
"growth": 0.23,
|
||||
"pct_no_resource": 5,
|
||||
"pct_no_resource": 2.5,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -2144,14 +2144,14 @@
|
|||
"country": "Philippines",
|
||||
"region": "Asia",
|
||||
"groups": 156,
|
||||
"no_resource": 28,
|
||||
"pop_no_resource": 4727275,
|
||||
"no_resource": 26,
|
||||
"pop_no_resource": 3398275,
|
||||
"scripture": 108,
|
||||
"film": 90,
|
||||
"growing_unreached": 0,
|
||||
"deaths_day": 0.2,
|
||||
"growth": 0.83,
|
||||
"pct_no_resource": 17.9,
|
||||
"pct_no_resource": 16.7,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -2264,14 +2264,14 @@
|
|||
"country": "United States of America",
|
||||
"region": "Americas",
|
||||
"groups": 623,
|
||||
"no_resource": 41,
|
||||
"pop_no_resource": 465640,
|
||||
"no_resource": 38,
|
||||
"pop_no_resource": 462510,
|
||||
"scripture": 517,
|
||||
"film": 549,
|
||||
"growing_unreached": 0,
|
||||
"deaths_day": 0.1,
|
||||
"growth": 0.96,
|
||||
"pct_no_resource": 6.6,
|
||||
"pct_no_resource": 6.1,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -2772,14 +2772,14 @@
|
|||
"country": "Singapore",
|
||||
"region": "Asia",
|
||||
"groups": 38,
|
||||
"no_resource": 3,
|
||||
"pop_no_resource": 237500,
|
||||
"no_resource": 2,
|
||||
"pop_no_resource": 218500,
|
||||
"scripture": 33,
|
||||
"film": 35,
|
||||
"growing_unreached": null,
|
||||
"deaths_day": null,
|
||||
"growth": null,
|
||||
"pct_no_resource": 7.9,
|
||||
"pct_no_resource": 5.3,
|
||||
"band": "partial",
|
||||
"from_pins_only": true
|
||||
},
|
||||
|
|
@ -2836,14 +2836,14 @@
|
|||
"country": "Ghana",
|
||||
"region": "Africa",
|
||||
"groups": 96,
|
||||
"no_resource": 15,
|
||||
"pop_no_resource": 2402300,
|
||||
"no_resource": 14,
|
||||
"pop_no_resource": 637300,
|
||||
"scripture": 71,
|
||||
"film": 70,
|
||||
"growing_unreached": null,
|
||||
"deaths_day": null,
|
||||
"growth": null,
|
||||
"pct_no_resource": 15.6,
|
||||
"pct_no_resource": 14.6,
|
||||
"band": "partial",
|
||||
"from_pins_only": true
|
||||
},
|
||||
|
|
@ -2868,14 +2868,14 @@
|
|||
"country": "Canada",
|
||||
"region": "Americas",
|
||||
"groups": 304,
|
||||
"no_resource": 18,
|
||||
"pop_no_resource": 183000,
|
||||
"no_resource": 16,
|
||||
"pop_no_resource": 157400,
|
||||
"scripture": 256,
|
||||
"film": 270,
|
||||
"growing_unreached": null,
|
||||
"deaths_day": null,
|
||||
"growth": null,
|
||||
"pct_no_resource": 5.9,
|
||||
"pct_no_resource": 5.3,
|
||||
"band": "partial",
|
||||
"from_pins_only": true
|
||||
},
|
||||
|
|
@ -2900,14 +2900,14 @@
|
|||
"country": "Switzerland",
|
||||
"region": "Europe",
|
||||
"groups": 13,
|
||||
"no_resource": 2,
|
||||
"pop_no_resource": 5612500,
|
||||
"no_resource": 1,
|
||||
"pop_no_resource": 92500,
|
||||
"scripture": 11,
|
||||
"film": 11,
|
||||
"growing_unreached": null,
|
||||
"deaths_day": null,
|
||||
"growth": null,
|
||||
"pct_no_resource": 15.4,
|
||||
"pct_no_resource": 7.7,
|
||||
"band": "partial",
|
||||
"from_pins_only": true
|
||||
},
|
||||
|
|
@ -3140,15 +3140,15 @@
|
|||
"country": "Trinidad and Tobago",
|
||||
"region": "Americas",
|
||||
"groups": 11,
|
||||
"no_resource": 4,
|
||||
"pop_no_resource": 388500,
|
||||
"no_resource": 2,
|
||||
"pop_no_resource": 176000,
|
||||
"scripture": 7,
|
||||
"film": 6,
|
||||
"growing_unreached": null,
|
||||
"deaths_day": null,
|
||||
"growth": null,
|
||||
"pct_no_resource": 36.4,
|
||||
"band": "high",
|
||||
"pct_no_resource": 18.2,
|
||||
"band": "partial",
|
||||
"from_pins_only": true
|
||||
},
|
||||
{
|
||||
|
|
@ -3156,14 +3156,14 @@
|
|||
"country": "Timor-Leste",
|
||||
"region": "Asia",
|
||||
"groups": 17,
|
||||
"no_resource": 13,
|
||||
"pop_no_resource": 704500,
|
||||
"no_resource": 12,
|
||||
"pop_no_resource": 448500,
|
||||
"scripture": 2,
|
||||
"film": 1,
|
||||
"growing_unreached": null,
|
||||
"deaths_day": null,
|
||||
"growth": null,
|
||||
"pct_no_resource": 76.5,
|
||||
"pct_no_resource": 70.6,
|
||||
"band": "critical",
|
||||
"from_pins_only": true
|
||||
},
|
||||
|
|
@ -3252,14 +3252,14 @@
|
|||
"country": "Italy",
|
||||
"region": "Europe",
|
||||
"groups": 38,
|
||||
"no_resource": 2,
|
||||
"pop_no_resource": 872000,
|
||||
"no_resource": 1,
|
||||
"pop_no_resource": 600000,
|
||||
"scripture": 30,
|
||||
"film": 36,
|
||||
"growing_unreached": null,
|
||||
"deaths_day": null,
|
||||
"growth": null,
|
||||
"pct_no_resource": 5.3,
|
||||
"pct_no_resource": 2.6,
|
||||
"band": "partial",
|
||||
"from_pins_only": true
|
||||
},
|
||||
|
|
@ -3364,15 +3364,15 @@
|
|||
"country": "Ukraine",
|
||||
"region": "Europe",
|
||||
"groups": 10,
|
||||
"no_resource": 1,
|
||||
"pop_no_resource": 334000,
|
||||
"no_resource": 0,
|
||||
"pop_no_resource": 0,
|
||||
"scripture": 8,
|
||||
"film": 9,
|
||||
"growing_unreached": null,
|
||||
"deaths_day": null,
|
||||
"growth": null,
|
||||
"pct_no_resource": 10,
|
||||
"band": "partial",
|
||||
"pct_no_resource": 0,
|
||||
"band": "covered",
|
||||
"from_pins_only": true
|
||||
},
|
||||
{
|
||||
|
|
@ -3412,14 +3412,14 @@
|
|||
"country": "Poland",
|
||||
"region": "Europe",
|
||||
"groups": 9,
|
||||
"no_resource": 2,
|
||||
"pop_no_resource": 394500,
|
||||
"no_resource": 1,
|
||||
"pop_no_resource": 384000,
|
||||
"scripture": 7,
|
||||
"film": 7,
|
||||
"growing_unreached": null,
|
||||
"deaths_day": null,
|
||||
"growth": null,
|
||||
"pct_no_resource": 22.2,
|
||||
"pct_no_resource": 11.1,
|
||||
"band": "partial",
|
||||
"from_pins_only": true
|
||||
},
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"meta": {
|
||||
"title": "Gospel resource link verification",
|
||||
"generated": "2026-09-24T17:38:08.638Z",
|
||||
"generated": "2026-09-24T18:33:00.458Z",
|
||||
"method": "HEAD, redirects followed. verified = HTTP 200. broken = 404/410. unknown = unreachable, an ambiguous status, or a URL shape that cannot be checked by fetch.",
|
||||
"scope": "Every URL in data/tables/people-group-pins.json, deduplicated.",
|
||||
"states": {
|
||||
|
|
@ -86,12 +86,12 @@
|
|||
]
|
||||
},
|
||||
"summary": {
|
||||
"records": 7491,
|
||||
"checkedThisPass": 921,
|
||||
"records": 7565,
|
||||
"checkedThisPass": 74,
|
||||
"carriedForward": 74,
|
||||
"pruned": 0,
|
||||
"broken": 74,
|
||||
"verified": 7412,
|
||||
"verified": 7486,
|
||||
"unknown": 5
|
||||
},
|
||||
"byHost": {
|
||||
|
|
@ -130,6 +130,9 @@
|
|||
},
|
||||
"scriptureearth.org": {
|
||||
"verified": 921
|
||||
},
|
||||
"fivefish.org": {
|
||||
"verified": 74
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
@ -37588,6 +37591,376 @@
|
|||
"state": "verified",
|
||||
"detail": "HTTP 200",
|
||||
"at": "2026-09-24T17:38:08.356Z"
|
||||
},
|
||||
"https://fivefish.org/cpx": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/421?language=Chinese%2C%20Puxian)",
|
||||
"at": "2026-09-24T18:32:54.859Z"
|
||||
},
|
||||
"https://fivefish.org/dio": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/9250?language=Dibo)",
|
||||
"at": "2026-09-24T18:32:54.880Z"
|
||||
},
|
||||
"https://fivefish.org/xmc": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/13359?language=eMarrevoni)",
|
||||
"at": "2026-09-24T18:32:54.901Z"
|
||||
},
|
||||
"https://fivefish.org/buf": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1281?language=Bushongo)",
|
||||
"at": "2026-09-24T18:32:54.928Z"
|
||||
},
|
||||
"https://fivefish.org/njx": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/2864?language=Kikouni)",
|
||||
"at": "2026-09-24T18:32:54.954Z"
|
||||
},
|
||||
"https://fivefish.org/lej": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1526?language=Kilengola)",
|
||||
"at": "2026-09-24T18:32:54.967Z"
|
||||
},
|
||||
"https://fivefish.org/aba": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/2554?language=Abe)",
|
||||
"at": "2026-09-24T18:32:55.077Z"
|
||||
},
|
||||
"https://fivefish.org/gew": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/2003?language=Gyere)",
|
||||
"at": "2026-09-24T18:32:55.144Z"
|
||||
},
|
||||
"https://fivefish.org/sgd": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/279?language=Surigaonon)",
|
||||
"at": "2026-09-24T18:32:55.424Z"
|
||||
},
|
||||
"https://fivefish.org/nkw": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/94?language=Lonkutu)",
|
||||
"at": "2026-09-24T18:32:55.496Z"
|
||||
},
|
||||
"https://fivefish.org/brf": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/303?language=Kibira)",
|
||||
"at": "2026-09-24T18:32:55.538Z"
|
||||
},
|
||||
"https://fivefish.org/hmg": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/6168?language=Miao%2C%20Shai%20Lou%20Zhenningxian)",
|
||||
"at": "2026-09-24T18:32:55.554Z"
|
||||
},
|
||||
"https://fivefish.org/koo": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1101?language=Konzo)",
|
||||
"at": "2026-09-24T18:32:55.570Z"
|
||||
},
|
||||
"https://fivefish.org/bar": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/3202?language=Austrian%3A%20Tyrolean)",
|
||||
"at": "2026-09-24T18:32:55.595Z"
|
||||
},
|
||||
"https://fivefish.org/ish": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/2202?language=Ishan)",
|
||||
"at": "2026-09-24T18:32:55.709Z"
|
||||
},
|
||||
"https://fivefish.org/bli": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1856?language=Lolia)",
|
||||
"at": "2026-09-24T18:32:55.743Z"
|
||||
},
|
||||
"https://fivefish.org/bgx": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/7617?language=Balkan%20Gagauz%20Turkish%3A%20Yuruk)",
|
||||
"at": "2026-09-24T18:32:55.992Z"
|
||||
},
|
||||
"https://fivefish.org/ckl": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1777?language=Chibuku)",
|
||||
"at": "2026-09-24T18:32:56.011Z"
|
||||
},
|
||||
"https://fivefish.org/slx": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1275?language=Salampasu)",
|
||||
"at": "2026-09-24T18:32:56.047Z"
|
||||
},
|
||||
"https://fivefish.org/eto": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/9663?language=Eton)",
|
||||
"at": "2026-09-24T18:32:56.176Z"
|
||||
},
|
||||
"https://fivefish.org/mgm": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/4612?language=Mambae)",
|
||||
"at": "2026-09-24T18:32:56.190Z"
|
||||
},
|
||||
"https://fivefish.org/qxp": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/15876?language=Quechua%2C%20Puno)",
|
||||
"at": "2026-09-24T18:32:56.211Z"
|
||||
},
|
||||
"https://fivefish.org/bta": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/7843?language=Bata)",
|
||||
"at": "2026-09-24T18:32:56.297Z"
|
||||
},
|
||||
"https://fivefish.org/smm": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/14441?language=Musasa)",
|
||||
"at": "2026-09-24T18:32:56.422Z"
|
||||
},
|
||||
"https://fivefish.org/msi": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/13428?language=Malay%2C%20Sabah)",
|
||||
"at": "2026-09-24T18:32:56.569Z"
|
||||
},
|
||||
"https://fivefish.org/bpj": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1278?language=Bindji)",
|
||||
"at": "2026-09-24T18:32:56.636Z"
|
||||
},
|
||||
"https://fivefish.org/kqk": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/4888?language=Kotafon)",
|
||||
"at": "2026-09-24T18:32:56.656Z"
|
||||
},
|
||||
"https://fivefish.org/ttj": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/984?language=Tooro)",
|
||||
"at": "2026-09-24T18:32:56.747Z"
|
||||
},
|
||||
"https://fivefish.org/khc": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/17734?language=Tukangbesi%20North%3A%20Wanci)",
|
||||
"at": "2026-09-24T18:32:56.759Z"
|
||||
},
|
||||
"https://fivefish.org/bnx": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1353?language=Kibangubangu)",
|
||||
"at": "2026-09-24T18:32:56.906Z"
|
||||
},
|
||||
"https://fivefish.org/suj": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/4528?language=Kisubi)",
|
||||
"at": "2026-09-24T18:32:56.929Z"
|
||||
},
|
||||
"https://fivefish.org/mnp": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/507?language=Hockchia)",
|
||||
"at": "2026-09-24T18:32:56.958Z"
|
||||
},
|
||||
"https://fivefish.org/kel": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1309?language=Ikela)",
|
||||
"at": "2026-09-24T18:32:57.128Z"
|
||||
},
|
||||
"https://fivefish.org/czh": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/6237?language=Chinese%2C%20Huizhou)",
|
||||
"at": "2026-09-24T18:32:57.237Z"
|
||||
},
|
||||
"https://fivefish.org/rue": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/4289?language=Ruthenian)",
|
||||
"at": "2026-09-24T18:32:57.264Z"
|
||||
},
|
||||
"https://fivefish.org/nbm": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1384?language=Ngbaka%20Mabo)",
|
||||
"at": "2026-09-24T18:32:57.295Z"
|
||||
},
|
||||
"https://fivefish.org/zeh": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/5123?language=Zhuang%3A%20Guigang%20Guiping)",
|
||||
"at": "2026-09-24T18:32:57.316Z"
|
||||
},
|
||||
"https://fivefish.org/bqv": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/4543?language=Koro%20Wachi)",
|
||||
"at": "2026-09-24T18:32:57.639Z"
|
||||
},
|
||||
"https://fivefish.org/abr": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/6021?language=Abron)",
|
||||
"at": "2026-09-24T18:32:57.687Z"
|
||||
},
|
||||
"https://fivefish.org/nto": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1858?language=Ntomba)",
|
||||
"at": "2026-09-24T18:32:57.724Z"
|
||||
},
|
||||
"https://fivefish.org/rkm": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/3068?language=Maraka)",
|
||||
"at": "2026-09-24T18:32:57.732Z"
|
||||
},
|
||||
"https://fivefish.org/shc": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1593?language=Kilua-Kisonde)",
|
||||
"at": "2026-09-24T18:32:57.806Z"
|
||||
},
|
||||
"https://fivefish.org/trf": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/3495?language=Trinidadian%20English%20Creole)",
|
||||
"at": "2026-09-24T18:32:57.878Z"
|
||||
},
|
||||
"https://fivefish.org/daw": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/283?language=Davaweno)",
|
||||
"at": "2026-09-24T18:32:57.965Z"
|
||||
},
|
||||
"https://fivefish.org/mde": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/2971?language=Maba)",
|
||||
"at": "2026-09-24T18:32:58.215Z"
|
||||
},
|
||||
"https://fivefish.org/sip": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/678?language=Sikkimese)",
|
||||
"at": "2026-09-24T18:32:58.276Z"
|
||||
},
|
||||
"https://fivefish.org/tek": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/4529?language=Kiteke)",
|
||||
"at": "2026-09-24T18:32:58.311Z"
|
||||
},
|
||||
"https://fivefish.org/wof": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/4592?language=Wolof%2C%20Gambian)",
|
||||
"at": "2026-09-24T18:32:58.405Z"
|
||||
},
|
||||
"https://fivefish.org/jya": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/11143?language=Jiarong)",
|
||||
"at": "2026-09-24T18:32:58.428Z"
|
||||
},
|
||||
"https://fivefish.org/ndo": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1952?language=Ndonga)",
|
||||
"at": "2026-09-24T18:32:58.476Z"
|
||||
},
|
||||
"https://fivefish.org/xac": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/619?language=Bodo%3A%20Kachari)",
|
||||
"at": "2026-09-24T18:32:58.491Z"
|
||||
},
|
||||
"https://fivefish.org/rwk": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1065?language=Rwa)",
|
||||
"at": "2026-09-24T18:32:58.808Z"
|
||||
},
|
||||
"https://fivefish.org/bbp": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1742?language=Banda)",
|
||||
"at": "2026-09-24T18:32:58.818Z"
|
||||
},
|
||||
"https://fivefish.org/gsw": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/2909?language=German%2C%20Swiss%3A%20Basel)",
|
||||
"at": "2026-09-24T18:32:58.853Z"
|
||||
},
|
||||
"https://fivefish.org/bjo": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1495?language=Banda%2C%20Mid-Southern%3A%20Yakpa)",
|
||||
"at": "2026-09-24T18:32:58.951Z"
|
||||
},
|
||||
"https://fivefish.org/zag": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/2939?language=Zaghawa)",
|
||||
"at": "2026-09-24T18:32:59.067Z"
|
||||
},
|
||||
"https://fivefish.org/dse": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/19011?language=Sign%20Language%20of%20the%20Netherlands)",
|
||||
"at": "2026-09-24T18:32:59.114Z"
|
||||
},
|
||||
"https://fivefish.org/yix": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/4983?language=Axi)",
|
||||
"at": "2026-09-24T18:32:59.196Z"
|
||||
},
|
||||
"https://fivefish.org/pht": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1711?language=Phu%20Thai)",
|
||||
"at": "2026-09-24T18:32:59.278Z"
|
||||
},
|
||||
"https://fivefish.org/sjo": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/4943?language=Xibe)",
|
||||
"at": "2026-09-24T18:32:59.300Z"
|
||||
},
|
||||
"https://fivefish.org/fsl": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/19026?language=French%20Sign%20Language)",
|
||||
"at": "2026-09-24T18:32:59.368Z"
|
||||
},
|
||||
"https://fivefish.org/kfa": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/4078?language=Coorgi)",
|
||||
"at": "2026-09-24T18:32:59.516Z"
|
||||
},
|
||||
"https://fivefish.org/bdm": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1771?language=Buduma)",
|
||||
"at": "2026-09-24T18:32:59.578Z"
|
||||
},
|
||||
"https://fivefish.org/tma": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/3511?language=Tama)",
|
||||
"at": "2026-09-24T18:32:59.632Z"
|
||||
},
|
||||
"https://fivefish.org/avd": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/6913?language=Alviri)",
|
||||
"at": "2026-09-24T18:32:59.666Z"
|
||||
},
|
||||
"https://fivefish.org/gow": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1028?language=Fiome)",
|
||||
"at": "2026-09-24T18:32:59.818Z"
|
||||
},
|
||||
"https://fivefish.org/tyr": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/17053?language=Tai%20Daeng)",
|
||||
"at": "2026-09-24T18:32:59.831Z"
|
||||
},
|
||||
"https://fivefish.org/twm": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/14200?language=Monpa%2C%20Tawang)",
|
||||
"at": "2026-09-24T18:32:59.946Z"
|
||||
},
|
||||
"https://fivefish.org/wni": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/6031?language=Shindzwani)",
|
||||
"at": "2026-09-24T18:32:59.994Z"
|
||||
},
|
||||
"https://fivefish.org/mne": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/2966?language=Naba%3A%20Kouka)",
|
||||
"at": "2026-09-24T18:33:00.059Z"
|
||||
},
|
||||
"https://fivefish.org/hmb": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/4849?language=Songhay%2C%20Humburi%20Senni%3A%20Maranse)",
|
||||
"at": "2026-09-24T18:33:00.068Z"
|
||||
},
|
||||
"https://fivefish.org/rui": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1067?language=Rufiji)",
|
||||
"at": "2026-09-24T18:33:00.101Z"
|
||||
},
|
||||
"https://fivefish.org/pks": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/19209?language=Pakistan%20Sign%20Language)",
|
||||
"at": "2026-09-24T18:33:00.233Z"
|
||||
},
|
||||
"https://fivefish.org/vmk": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/13367?language=Exirima)",
|
||||
"at": "2026-09-24T18:33:00.244Z"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
413
data/tables/grn-index.json
Normal file
413
data/tables/grn-index.json
Normal file
|
|
@ -0,0 +1,413 @@
|
|||
{
|
||||
"source": "https://fivefish.org/<iso639-3> (5fish, Global Recordings Network)",
|
||||
"fetched": "2026-09-24",
|
||||
"_note": "GRN gospel AUDIO, typed as Gospel audio and never as Scripture — \"Words of Life\" is gospel messages and Bible stories, not a translation of the canon. The host never 404s: a nonsense path returns a geo-located page with HTTP 200, so existence is read from the page title, with a negative and a positive control run in band every time. Their robots.txt asks for Crawl-delay: 10 and this fetcher obeys it, sequentially.",
|
||||
"codes": 74,
|
||||
"decidedNone": 106,
|
||||
"byIso": {
|
||||
"mnp": {
|
||||
"u": "https://fivefish.org/mnp",
|
||||
"n": "Hockchia"
|
||||
},
|
||||
"pks": {
|
||||
"u": "https://fivefish.org/pks",
|
||||
"n": "Pakistan Sign Language"
|
||||
},
|
||||
"gsw": {
|
||||
"u": "https://fivefish.org/gsw",
|
||||
"n": "German, Swiss: Basel"
|
||||
},
|
||||
"czh": {
|
||||
"u": "https://fivefish.org/czh",
|
||||
"n": "Chinese, Huizhou"
|
||||
},
|
||||
"cpx": {
|
||||
"u": "https://fivefish.org/cpx",
|
||||
"n": "Chinese, Puxian"
|
||||
},
|
||||
"abr": {
|
||||
"u": "https://fivefish.org/abr",
|
||||
"n": "Abron"
|
||||
},
|
||||
"koo": {
|
||||
"u": "https://fivefish.org/koo",
|
||||
"n": "Konzo"
|
||||
},
|
||||
"ttj": {
|
||||
"u": "https://fivefish.org/ttj",
|
||||
"n": "Tooro"
|
||||
},
|
||||
"zeh": {
|
||||
"u": "https://fivefish.org/zeh",
|
||||
"n": "Zhuang: Guigang Guiping"
|
||||
},
|
||||
"sgd": {
|
||||
"u": "https://fivefish.org/sgd",
|
||||
"n": "Cantilangnon"
|
||||
},
|
||||
"fsl": {
|
||||
"u": "https://fivefish.org/fsl",
|
||||
"n": "French Sign Language"
|
||||
},
|
||||
"vmk": {
|
||||
"u": "https://fivefish.org/vmk",
|
||||
"n": "Exirima"
|
||||
},
|
||||
"kel": {
|
||||
"u": "https://fivefish.org/kel",
|
||||
"n": "Ikela"
|
||||
},
|
||||
"ndo": {
|
||||
"u": "https://fivefish.org/ndo",
|
||||
"n": "Ndonga"
|
||||
},
|
||||
"pht": {
|
||||
"u": "https://fivefish.org/pht",
|
||||
"n": "Phu Thai"
|
||||
},
|
||||
"xmc": {
|
||||
"u": "https://fivefish.org/xmc",
|
||||
"n": "eMarrevoni"
|
||||
},
|
||||
"mne": {
|
||||
"u": "https://fivefish.org/mne",
|
||||
"n": "Naba: Kouka"
|
||||
},
|
||||
"ish": {
|
||||
"u": "https://fivefish.org/ish",
|
||||
"n": "Ishan"
|
||||
},
|
||||
"msi": {
|
||||
"u": "https://fivefish.org/msi",
|
||||
"n": "Malay, Sabah"
|
||||
},
|
||||
"mde": {
|
||||
"u": "https://fivefish.org/mde",
|
||||
"n": "Maba"
|
||||
},
|
||||
"rui": {
|
||||
"u": "https://fivefish.org/rui",
|
||||
"n": "Rufiji"
|
||||
},
|
||||
"rkm": {
|
||||
"u": "https://fivefish.org/rkm",
|
||||
"n": "Maraka"
|
||||
},
|
||||
"zag": {
|
||||
"u": "https://fivefish.org/zag",
|
||||
"n": "Zaghawa"
|
||||
},
|
||||
"qxp": {
|
||||
"u": "https://fivefish.org/qxp",
|
||||
"n": "Quechua, Puno"
|
||||
},
|
||||
"gew": {
|
||||
"u": "https://fivefish.org/gew",
|
||||
"n": "Gyere"
|
||||
},
|
||||
"suj": {
|
||||
"u": "https://fivefish.org/suj",
|
||||
"n": "Kisubi"
|
||||
},
|
||||
"eto": {
|
||||
"u": "https://fivefish.org/eto",
|
||||
"n": "Eton"
|
||||
},
|
||||
"tek": {
|
||||
"u": "https://fivefish.org/tek",
|
||||
"n": "Kiteke"
|
||||
},
|
||||
"nto": {
|
||||
"u": "https://fivefish.org/nto",
|
||||
"n": "Ntomba"
|
||||
},
|
||||
"wni": {
|
||||
"u": "https://fivefish.org/wni",
|
||||
"n": "Shindzwani"
|
||||
},
|
||||
"nbm": {
|
||||
"u": "https://fivefish.org/nbm",
|
||||
"n": "Ngbaka Mabo"
|
||||
},
|
||||
"hmg": {
|
||||
"u": "https://fivefish.org/hmg",
|
||||
"n": "Miao, Shai Lou Zhenningxian"
|
||||
},
|
||||
"wof": {
|
||||
"u": "https://fivefish.org/wof",
|
||||
"n": "Wolof, Gambian"
|
||||
},
|
||||
"bnx": {
|
||||
"u": "https://fivefish.org/bnx",
|
||||
"n": "Kibangubangu"
|
||||
},
|
||||
"bpj": {
|
||||
"u": "https://fivefish.org/bpj",
|
||||
"n": "Bindji"
|
||||
},
|
||||
"bbp": {
|
||||
"u": "https://fivefish.org/bbp",
|
||||
"n": "Banda"
|
||||
},
|
||||
"bta": {
|
||||
"u": "https://fivefish.org/bta",
|
||||
"n": "Bata"
|
||||
},
|
||||
"aba": {
|
||||
"u": "https://fivefish.org/aba",
|
||||
"n": "Abbey"
|
||||
},
|
||||
"buf": {
|
||||
"u": "https://fivefish.org/buf",
|
||||
"n": "Bushongo"
|
||||
},
|
||||
"jya": {
|
||||
"u": "https://fivefish.org/jya",
|
||||
"n": "Jiarong"
|
||||
},
|
||||
"rue": {
|
||||
"u": "https://fivefish.org/rue",
|
||||
"n": "Ruthenian"
|
||||
},
|
||||
"brf": {
|
||||
"u": "https://fivefish.org/brf",
|
||||
"n": "Kibira"
|
||||
},
|
||||
"bgx": {
|
||||
"u": "https://fivefish.org/bgx",
|
||||
"n": "Balkan Gagauz Turkish: Yuruk"
|
||||
},
|
||||
"tma": {
|
||||
"u": "https://fivefish.org/tma",
|
||||
"n": "Tama"
|
||||
},
|
||||
"bar": {
|
||||
"u": "https://fivefish.org/bar",
|
||||
"n": "Austrian: Tyrolean"
|
||||
},
|
||||
"sip": {
|
||||
"u": "https://fivefish.org/sip",
|
||||
"n": "Sikkimese"
|
||||
},
|
||||
"rwk": {
|
||||
"u": "https://fivefish.org/rwk",
|
||||
"n": "Rwa"
|
||||
},
|
||||
"slx": {
|
||||
"u": "https://fivefish.org/slx",
|
||||
"n": "Salampasu"
|
||||
},
|
||||
"hmb": {
|
||||
"u": "https://fivefish.org/hmb",
|
||||
"n": "Songhay, Humburi Senni: Maranse"
|
||||
},
|
||||
"dio": {
|
||||
"u": "https://fivefish.org/dio",
|
||||
"n": "Dibo"
|
||||
},
|
||||
"mgm": {
|
||||
"u": "https://fivefish.org/mgm",
|
||||
"n": "Mambae"
|
||||
},
|
||||
"lej": {
|
||||
"u": "https://fivefish.org/lej",
|
||||
"n": "Kilengola"
|
||||
},
|
||||
"bli": {
|
||||
"u": "https://fivefish.org/bli",
|
||||
"n": "Lolia"
|
||||
},
|
||||
"ckl": {
|
||||
"u": "https://fivefish.org/ckl",
|
||||
"n": "Chibuku"
|
||||
},
|
||||
"nkw": {
|
||||
"u": "https://fivefish.org/nkw",
|
||||
"n": "Lonkutu"
|
||||
},
|
||||
"tyr": {
|
||||
"u": "https://fivefish.org/tyr",
|
||||
"n": "Tai Daeng"
|
||||
},
|
||||
"smm": {
|
||||
"u": "https://fivefish.org/smm",
|
||||
"n": "Musasa"
|
||||
},
|
||||
"kqk": {
|
||||
"u": "https://fivefish.org/kqk",
|
||||
"n": "Kotafon"
|
||||
},
|
||||
"trf": {
|
||||
"u": "https://fivefish.org/trf",
|
||||
"n": "Trinidadian English Creole"
|
||||
},
|
||||
"shc": {
|
||||
"u": "https://fivefish.org/shc",
|
||||
"n": "Kilua-Kisonde"
|
||||
},
|
||||
"xac": {
|
||||
"u": "https://fivefish.org/xac",
|
||||
"n": "Bodo: Kachari"
|
||||
},
|
||||
"kfa": {
|
||||
"u": "https://fivefish.org/kfa",
|
||||
"n": "Coorgi"
|
||||
},
|
||||
"twm": {
|
||||
"u": "https://fivefish.org/twm",
|
||||
"n": "Monpa, Tawang"
|
||||
},
|
||||
"bjo": {
|
||||
"u": "https://fivefish.org/bjo",
|
||||
"n": "Banda, Mid-Southern: Yakpa"
|
||||
},
|
||||
"bdm": {
|
||||
"u": "https://fivefish.org/bdm",
|
||||
"n": "Buduma"
|
||||
},
|
||||
"daw": {
|
||||
"u": "https://fivefish.org/daw",
|
||||
"n": "Davawenyo"
|
||||
},
|
||||
"sjo": {
|
||||
"u": "https://fivefish.org/sjo",
|
||||
"n": "Xibe"
|
||||
},
|
||||
"gow": {
|
||||
"u": "https://fivefish.org/gow",
|
||||
"n": "Fiome"
|
||||
},
|
||||
"avd": {
|
||||
"u": "https://fivefish.org/avd",
|
||||
"n": "Alviri"
|
||||
},
|
||||
"dse": {
|
||||
"u": "https://fivefish.org/dse",
|
||||
"n": "Sign Language of the Netherlands"
|
||||
},
|
||||
"yix": {
|
||||
"u": "https://fivefish.org/yix",
|
||||
"n": "Axi"
|
||||
},
|
||||
"bqv": {
|
||||
"u": "https://fivefish.org/bqv",
|
||||
"n": "Koro Wachi"
|
||||
},
|
||||
"njx": {
|
||||
"u": "https://fivefish.org/njx",
|
||||
"n": "Kikouni"
|
||||
},
|
||||
"khc": {
|
||||
"u": "https://fivefish.org/khc",
|
||||
"n": "Tukangbesi North: Wanci"
|
||||
}
|
||||
},
|
||||
"none": [
|
||||
"cjy",
|
||||
"gan",
|
||||
"csl",
|
||||
"inl",
|
||||
"ayh",
|
||||
"mmr",
|
||||
"nsi",
|
||||
"zlj",
|
||||
"acx",
|
||||
"nos",
|
||||
"qcd",
|
||||
"zgb",
|
||||
"eth",
|
||||
"esl",
|
||||
"psp",
|
||||
"cps",
|
||||
"czo",
|
||||
"tsm",
|
||||
"hab",
|
||||
"abv",
|
||||
"gsg",
|
||||
"bfi",
|
||||
"now",
|
||||
"zmi",
|
||||
"thz",
|
||||
"auh",
|
||||
"tsq",
|
||||
"mfu",
|
||||
"fia",
|
||||
"ise",
|
||||
"sfs",
|
||||
"aju",
|
||||
"ssp",
|
||||
"mhm",
|
||||
"suw",
|
||||
"ysm",
|
||||
"bww",
|
||||
"asp",
|
||||
"vic",
|
||||
"aed",
|
||||
"qns",
|
||||
"han",
|
||||
"qiq",
|
||||
"mry",
|
||||
"kxd",
|
||||
"afg",
|
||||
"fmp",
|
||||
"bah",
|
||||
"ugn",
|
||||
"wxa",
|
||||
"phu",
|
||||
"pso",
|
||||
"xms",
|
||||
"mlm",
|
||||
"hmh",
|
||||
"zlq",
|
||||
"kdg",
|
||||
"sdl",
|
||||
"nsp",
|
||||
"shz",
|
||||
"diz",
|
||||
"sjg",
|
||||
"tza",
|
||||
"zhk",
|
||||
"prl",
|
||||
"gex",
|
||||
"xml",
|
||||
"noq",
|
||||
"ypg",
|
||||
"jbn",
|
||||
"mzc",
|
||||
"vsl",
|
||||
"qry",
|
||||
"gse",
|
||||
"ras",
|
||||
"mny",
|
||||
"soe",
|
||||
"hnm",
|
||||
"qkp",
|
||||
"amj",
|
||||
"btw",
|
||||
"ayc",
|
||||
"qbf",
|
||||
"bog",
|
||||
"xki",
|
||||
"cri",
|
||||
"sbm",
|
||||
"kiv",
|
||||
"tiz",
|
||||
"kwl",
|
||||
"grj",
|
||||
"gdq",
|
||||
"qsg",
|
||||
"qso",
|
||||
"lws",
|
||||
"bpd",
|
||||
"dec",
|
||||
"lap",
|
||||
"gsm",
|
||||
"cds",
|
||||
"tor",
|
||||
"csg",
|
||||
"dux",
|
||||
"ajz",
|
||||
"mdi",
|
||||
"psi"
|
||||
]
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -93,7 +93,7 @@ if (POISON) {
|
|||
}
|
||||
|
||||
const SPECIAL = (c) => c === 'und' || c === 'mul' || c === 'mis' || c === 'zxx' || (c >= 'qaa' && c <= 'qtz')
|
||||
const hasRes = (v) => !!(v && (v.s || v.f || v.au || v.bv || v.se || (v.d && v.d.length)))
|
||||
const hasRes = (v) => !!(v && (v.s || v.f || v.au || v.bv || v.se || v.ga || (v.d && v.d.length)))
|
||||
const fails = []
|
||||
const add = (clause, msg) => fails.push(` [${clause}] ${msg}`)
|
||||
|
||||
|
|
@ -121,7 +121,7 @@ if (missing.length) add('D', `${missing.length} code(s) carry a resource but app
|
|||
// E — the table cannot invent a URL
|
||||
const known = new Set()
|
||||
for (const v of Object.values(codes)) {
|
||||
if (v.s) known.add(v.s); if (v.f) known.add(v.f); if (v.z) known.add(v.z); if (v.za) known.add(v.za.u); if (v.au) known.add(v.au.u); if (v.bv) known.add(v.bv.u); if (v.gp) known.add(v.gp.u); if (v.se) known.add(v.se.u)
|
||||
if (v.s) known.add(v.s); if (v.f) known.add(v.f); if (v.z) known.add(v.z); if (v.za) known.add(v.za.u); if (v.au) known.add(v.au.u); if (v.bv) known.add(v.bv.u); if (v.gp) known.add(v.gp.u); if (v.se) known.add(v.se.u); if (v.ga) known.add(v.ga.u)
|
||||
for (const d of v.d || []) known.add(d.u)
|
||||
}
|
||||
const invented = trows.filter((t) => t.resource_url && !known.has(t.resource_url))
|
||||
|
|
@ -164,7 +164,7 @@ if (misTyped.length) add('H', `${misTyped.length} row(s) named "Open Bible Stori
|
|||
// G — no plain-http URL
|
||||
const httpUrls = []
|
||||
for (const [c, v] of Object.entries(codes)) {
|
||||
for (const u of [v.s, v.f, v.z, v.za && v.za.u, v.au && v.au.u, v.bv && v.bv.u, v.gp && v.gp.u, v.se && v.se.u, ...(v.d || []).map((d) => d.u)]) {
|
||||
for (const u of [v.s, v.f, v.z, v.za && v.za.u, v.au && v.au.u, v.bv && v.bv.u, v.gp && v.gp.u, v.se && v.se.u, v.ga && v.ga.u, ...(v.d || []).map((d) => d.u)]) {
|
||||
if (u && /^http:\/\//i.test(u)) httpUrls.push(`${c} ${u}`)
|
||||
}
|
||||
}
|
||||
|
|
@ -174,7 +174,7 @@ if (httpUrls.length) add('G', `${httpUrls.length} plain-http URL(s) (e.g. ${http
|
|||
let fBad = 0
|
||||
for (const r of rows) {
|
||||
const v = codes[r[4]] || {}
|
||||
const want = v.s && v.f ? 2 : (v.s || v.f || (v.d && v.d.length) || v.au || v.bv || v.se) ? 1 : 0
|
||||
const want = v.s && v.f ? 2 : (v.s || v.f || (v.d && v.d.length) || v.au || v.bv || v.se || v.ga) ? 1 : 0
|
||||
if (want !== r[6]) fBad++
|
||||
}
|
||||
if (fBad) add('F', `${fBad} pin(s) carry a tier that disagrees with their code's URLs`)
|
||||
|
|
@ -205,6 +205,7 @@ if (verif && verif.links) {
|
|||
if (v.au && v.au.u) shipped.add(v.au.u)
|
||||
if (v.bv && v.bv.u) shipped.add(v.bv.u)
|
||||
if (v.se && v.se.u) shipped.add(v.se.u)
|
||||
if (v.ga && v.ga.u) shipped.add(v.ga.u)
|
||||
if (v.gp && v.gp.u) shipped.add(v.gp.u)
|
||||
for (const d of v.d || []) if (d.u) shipped.add(d.u)
|
||||
}
|
||||
|
|
@ -241,6 +242,7 @@ if (verif && verif.links) {
|
|||
if (v.au && v.au.u) shipped2.add(v.au.u)
|
||||
if (v.bv && v.bv.u) shipped2.add(v.bv.u)
|
||||
if (v.se && v.se.u) shipped2.add(v.se.u)
|
||||
if (v.ga && v.ga.u) shipped2.add(v.ga.u)
|
||||
if (v.gp && v.gp.u) shipped2.add(v.gp.u)
|
||||
for (const d of v.d || []) if (d.u) shipped2.add(d.u)
|
||||
}
|
||||
|
|
|
|||
85
internal/check-surfaces-read-the-tier.mjs
Normal file
85
internal/check-surfaces-read-the-tier.mjs
Normal file
|
|
@ -0,0 +1,85 @@
|
|||
/**
|
||||
* check-surfaces-read-the-tier.mjs — one place decides "this group has nothing".
|
||||
*
|
||||
* THE BUG THIS EXISTS FOR, THREE TIMES OVER. The pin index computes a tier per group:
|
||||
* 0 means no resource was found in any pool checked. The charts profile used to decide the
|
||||
* same thing again, by listing the resource fields by hand:
|
||||
*
|
||||
* none: !c.s && !c.f && !c.au && !c.bv && !c.z && !(c.d && c.d.length)
|
||||
*
|
||||
* Every time a source was added, that list was one field short and the two views of the same
|
||||
* dataset disagreed — 7 codes the first time, then 28 when Scripture Earth landed: drawn as
|
||||
* having nothing by the chart while the map offered them a working link. Nothing failed. The
|
||||
* chart simply told a quieter, wronger story than the map, and only a hand count found it.
|
||||
*
|
||||
* THE RULE. A surface may READ the tier the pin index computed. It may not RE-DERIVE it from
|
||||
* the raw resource fields. Adding a source should reach every view for free.
|
||||
*
|
||||
* Run with --poison to prove the check can fail: it re-injects the hand-rolled formula into
|
||||
* a copy of each surface and requires every one to be caught.
|
||||
*/
|
||||
import { readFileSync, readdirSync } from 'node:fs'
|
||||
import { resolve, dirname, basename } from 'node:path'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
|
||||
const HERE = dirname(fileURLToPath(import.meta.url))
|
||||
const DIR = resolve(HERE, '../plugin-designs/gospel-resources')
|
||||
const POISON = process.argv.includes('--poison')
|
||||
|
||||
/**
|
||||
* A hand-rolled "has nothing" decision: a negated resource field, joined by && to at least
|
||||
* two more negated field reads. Matching the SHAPE rather than one spelling is the point —
|
||||
* the next drift will use a different field list, not this one.
|
||||
*/
|
||||
const FIELD = String.raw`!\s*c\.(?:s|f|au|bv|se|ga|z|gp|d)\b[^\n]{0,40}`
|
||||
const HANDROLLED = new RegExp(`${FIELD}&&\\s*${FIELD}&&\\s*${FIELD}`)
|
||||
|
||||
function offendersIn(src, label) {
|
||||
const out = []
|
||||
const lines = src.split('\n')
|
||||
for (let i = 0; i < lines.length; i++) {
|
||||
const line = lines[i]
|
||||
/* Only lines that are actually deciding emptiness, not e.g. a render guard. */
|
||||
if (!/\bnone\b|\bgap\b|\bnothing\b|hasNothing/.test(line)) continue
|
||||
if (HANDROLLED.test(line)) out.push(`${label}:${i + 1} ${line.trim().slice(0, 90)}`)
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
const surfaces = readdirSync(DIR).filter((f) => f.endsWith('.vue'))
|
||||
if (!surfaces.length) {
|
||||
console.error('SURFACES-READ-THE-TIER: no .vue surfaces found — the check would pass vacuously.')
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
if (POISON) {
|
||||
const INJECT =
|
||||
' none: !c.s && !c.f && !c.au && !c.bv && !c.z && !(c.d && c.d.length),'
|
||||
let caught = 0
|
||||
for (const f of surfaces) {
|
||||
const poisoned = `${readFileSync(resolve(DIR, f), 'utf8')}\n${INJECT}\n`
|
||||
if (offendersIn(poisoned, f).length) caught++
|
||||
else console.error(` NOT CAUGHT in ${f}`)
|
||||
}
|
||||
if (caught === surfaces.length) {
|
||||
console.log(
|
||||
`SURFACES-READ-THE-TIER --poison: ${caught}/${surfaces.length} surface(s) caught the injected formula.`,
|
||||
)
|
||||
console.log('SURFACES-READ-THE-TIER: SELF-TEST PASS — the check fails as designed.')
|
||||
process.exit(0)
|
||||
}
|
||||
console.error('SURFACES-READ-THE-TIER: SELF-TEST FAIL — the check cannot detect the bug it exists for.')
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
const offenders = surfaces.flatMap((f) => offendersIn(readFileSync(resolve(DIR, f), 'utf8'), f))
|
||||
if (offenders.length) {
|
||||
console.error(`SURFACES-READ-THE-TIER: FAIL — ${offenders.length} surface line(s) re-derive "has nothing":`)
|
||||
for (const o of offenders) console.error(` ${o}`)
|
||||
console.error(' Read the tier the pin index computed (pins[i][6] === 0) instead of listing')
|
||||
console.error(' the resource fields again — that list goes stale every time a source is added.')
|
||||
process.exit(1)
|
||||
}
|
||||
console.log(
|
||||
`SURFACES-READ-THE-TIER: PASS — ${surfaces.length} surface(s), none re-derives the tier.`,
|
||||
)
|
||||
|
|
@ -153,6 +153,8 @@
|
|||
"check:snapshot-guard:poison": "node internal/check-snapshot-guard.mjs --poison",
|
||||
"check:coverage-consistent": "node internal/check-gospel-coverage-consistent.mjs # the gospel-resources surfaces must agree: no resource on an ISO RESERVED code (und/mul/mis/zxx), every resourced code NAMED, table reach recounted off the pins, no invented URL, tiers reconcile. Static, sub-second. Self-test: `bun run check:coverage-consistent:poison`, all 12 clauses (A-L) must fail. Clause L is the one that is not about consistency: it fails when the link-verification record goes stale, because 'link checked' is a claim about the present tense. Written after the same drift defect was found by hand three times.",
|
||||
"check:coverage-consistent:poison": "node internal/check-gospel-coverage-consistent.mjs --poison",
|
||||
"check:surfaces-read-the-tier": "node internal/check-surfaces-read-the-tier.mjs # a surface may READ the tier the pin index computed, never re-derive 'this group has nothing' from the raw resource fields. That hand-rolled field list went stale every time a source was added: 7 codes drawn as having nothing while the map showed them a link, then 28 when Scripture Earth landed. Static, sub-second. Self-test: `bun run check:surfaces-read-the-tier:poison` re-injects the old formula into every surface and each must be caught.",
|
||||
"check:surfaces-read-the-tier:poison": "node internal/check-surfaces-read-the-tier.mjs --poison",
|
||||
"check:synced-css:self-test": "node internal/check-synced-css-copies.mjs --self-test",
|
||||
"serve:permissive": "python3 -m http.server 4173 --bind 127.0.0.1 --directory public # LOOPBACK ONLY. This was --bind 0.0.0.0, which published the built tree on every interface of whatever machine ran a gate; measured on the build VPS it answered HTTP 200 on the box's PUBLIC IP while a browser gate was running. Every consumer (verify-browser-all, check:a11y-button-names, check:nav-reachable, smoke:share-all) already defaults to 127.0.0.1, so nothing needed the wider bind. Override with BASE_URL/BASE if you deliberately want to reach it from another host.",
|
||||
"check:doc-scripts": "node internal/check-doc-quotes-scripts.mjs",
|
||||
|
|
|
|||
|
|
@ -20,9 +20,10 @@
|
|||
* ═══ WHAT A BAR MEANS, AND WHAT IT MUST NEVER BE READ AS ════════════════════
|
||||
* A bar counts what was FOUND IN THE POOLS CHECKED — eBible.org and PNG.Bible (text
|
||||
* Scripture), Arclight/JESUS Film (film), Door43/unfoldingWord (stories and Scripture)
|
||||
* and Faith Comes By Hearing (audio Scripture). It is NEVER proof of absence. Three
|
||||
* pools remain unchecked: API.Bible, DBL and progress.bible. GRN is a fourth and still
|
||||
* answers 403 on every path including robots.txt.
|
||||
* Faith Comes By Hearing (audio Scripture), Scripture Earth (minority-language Scripture)
|
||||
* and Global Recordings Network (gospel audio). It is NEVER proof of absence. Three pools
|
||||
* remain unchecked — API.Bible, DBL and progress.bible — and GRN is swept a batch at a time
|
||||
* at the crawl delay they ask for, so part of it is still unread.
|
||||
*
|
||||
* Three consequences the charts are built around:
|
||||
* 1. A pool nobody has queried is drawn as a HATCHED "not measured" row, never a zero
|
||||
|
|
@ -128,7 +129,7 @@ const languages = computed(() => {
|
|||
if (!d || !d.codes) return []
|
||||
const { codes, pins } = d
|
||||
const by = new Map()
|
||||
for (const [, , , iso3, code, pop] of pins) {
|
||||
for (const [, , , iso3, code, pop, tier] of pins) {
|
||||
if (!code) continue
|
||||
let e = by.get(code)
|
||||
if (!e) {
|
||||
|
|
@ -153,8 +154,8 @@ const languages = computed(() => {
|
|||
jesusFilm: !!c.f,
|
||||
obs,
|
||||
// Audio is now MEASURED, from Faith Comes By Hearing, so this is a real count and
|
||||
// no longer an "unknown". GRN is still unsearchable and still 403s on everything,
|
||||
// but it was never the only audio pool and the chart no longer implies it was.
|
||||
// no longer an "unknown". GRN is now searched too, through their 5fish site, and
|
||||
// counted separately as gospel audio rather than folded in here.
|
||||
audioKnown: !!(c.au && /audio/.test(c.au.m || '')),
|
||||
// THREE MEDIA THE CHART DID NOT DRAW AT ALL. Bible video reaches 1,666 languages —
|
||||
// more than Scripture does — and was simply absent, so the picture a reader took
|
||||
|
|
@ -162,10 +163,13 @@ const languages = computed(() => {
|
|||
bibleVideo: !!(c.bv || (c.au && /video/.test(c.au.m || ''))),
|
||||
tract: !!c.gp,
|
||||
training: !!c.z,
|
||||
// Bible video and training count too. Without them 7 codes were drawn as having
|
||||
// nothing while the map showed them a real link — small, but it is the same
|
||||
// contradiction between two views of one dataset.
|
||||
none: !c.s && !c.f && !c.au && !c.bv && !c.z && !(c.d && c.d.length),
|
||||
// READ THE TIER, DO NOT RECOMPUTE IT. This line used to list the resource fields by
|
||||
// hand, and it drifted every single time a source was added: first 7 codes drawn as
|
||||
// having nothing while the map showed them a link, then 28 when Scripture Earth
|
||||
// landed. The pin index already decides this, one place, and a gate guards it — so
|
||||
// the chart asks rather than deciding again. A new source now reaches this view for
|
||||
// free instead of silently leaving it a source behind.
|
||||
none: tier === 0,
|
||||
unmatchable: !code,
|
||||
countries: new Set(),
|
||||
}
|
||||
|
|
@ -396,12 +400,12 @@ useShadowStyles(
|
|||
The "Where Nothing Was Found" table is keyed per people group and does include them.</small>
|
||||
</template>
|
||||
<!-- This said "four resource pools, including all audio, were never queried" until
|
||||
Faith Comes By Hearing was added. Audio is queried now; GRN is the one that
|
||||
cannot be. A stale caveat misleads exactly as much as a stale number. -->
|
||||
<br>Not found is not the same as not existing. Audio has been searched at Faith Comes
|
||||
By Hearing, but GRN — the largest audio pool — answers 403 to every request including
|
||||
its own robots.txt, and api.bible, the Digital Bible Library and progress.bible all
|
||||
need credentials this build does not have.
|
||||
Faith Comes By Hearing was added, then again when GRN was reached through 5fish.
|
||||
A stale caveat misleads exactly as much as a stale number. -->
|
||||
<br>Not found is not the same as not existing. Audio has been searched at Faith Comes By
|
||||
Hearing and at Global Recordings Network, the latter a batch at a time at the ten-second
|
||||
crawl delay they ask for, so part of that pool is still unread. api.bible, the Digital
|
||||
Bible Library and progress.bible all need credentials this build does not have.
|
||||
</div>
|
||||
|
||||
<div class="gc-tabs">
|
||||
|
|
|
|||
|
|
@ -19,8 +19,10 @@
|
|||
* ═══ THE HONESTY THE UI IS BUILT AROUND ═════════════════════════════════════
|
||||
* `has_scripture:false` means NOT FOUND IN THE POOLS CHECKED — eBible.org, PNG.Bible and
|
||||
* Faith Comes By Hearing for text, Arclight for film, Door43 for stories, and FCBH again
|
||||
* for audio. It does NOT mean no scripture exists. GRN is still unchecked and answers 403
|
||||
* on every path including robots.txt; API.Bible, DBL and progress.bible need keys. Every
|
||||
* for audio, Scripture Earth for minority-language Scripture, and Global Recordings Network
|
||||
* for gospel audio. It does NOT mean no scripture exists: GRN is swept a batch at a time at
|
||||
* the crawl delay they ask for, so part of it is still unread, and API.Bible, DBL and
|
||||
* progress.bible need keys. Every
|
||||
* card names its checked and unchecked pools, and a pool nobody queried renders as
|
||||
* "unknown" rather than "no".
|
||||
*
|
||||
|
|
@ -329,9 +331,10 @@ useShadowStyles(
|
|||
currently <b>eBible.org</b> ({{ fmt(stats.ebible_translations) }} translations across
|
||||
{{ fmt(stats.ebible_languages) }} languages, public data), plus PNG.Bible, the JESUS
|
||||
Film catalogue, Door43, and Faith Comes By Hearing for both text and audio Scripture. It does
|
||||
<b>not</b> mean no scripture exists: GRN, the Digital Bible Library and progress.bible
|
||||
are <b>not yet checked</b> — GRN answers 403 to every request, including its own
|
||||
robots.txt. A pool nobody has queried shows as unknown, never as “no”.
|
||||
<b>not</b> mean no scripture exists: Scripture Earth and Global Recordings Network are
|
||||
searched too, GRN a batch at a time at the crawl delay they ask for, so part of it is
|
||||
still unread; api.bible, the Digital Bible Library and progress.bible need credentials
|
||||
this build does not have. A pool nobody has queried shows as unknown, never as “no”.
|
||||
Languages are joined to people groups by exact ISO 639-3 code.
|
||||
<br><br>
|
||||
This page lists <b>published resource availability only</b>. It carries no information
|
||||
|
|
|
|||
|
|
@ -501,6 +501,7 @@ function groupAt(i) {
|
|||
bible_video: c.bv || null,
|
||||
gospel_tract: c.gp || null,
|
||||
scripture_earth: c.se || null,
|
||||
gospel_audio: c.ga || null,
|
||||
related: c.rel || null,
|
||||
zume_url: c.z || '',
|
||||
zume_approx: c.za || null,
|
||||
|
|
@ -1089,10 +1090,10 @@ useShadowStyles(
|
|||
across its groups; a dot is that ONE group's own language. So a red dot can sit on a green
|
||||
country — that is the case worth finding, not a rendering fault. Both are counted from the
|
||||
same index, so the colour and the dots can no longer disagree.
|
||||
<br>“None found” = not in the pools checked (eBible, PNG.Bible, JESUS Film, Door43 and
|
||||
Faith Comes By Hearing). <b>GRN, the largest audio pool, is still unchecked</b> — it answers
|
||||
403 to every request, including its own robots.txt — so for an oral culture there is one
|
||||
place this map has not been able to look. Never proof of absence.
|
||||
<br>“None found” = not in the pools checked (eBible, PNG.Bible, JESUS Film, Door43,
|
||||
Faith Comes By Hearing, Scripture Earth and Global Recordings Network). GRN is reached
|
||||
through their 5fish site and is being swept <b>a batch at a time</b>, at the ten-second
|
||||
crawl delay they ask for, so part of that pool is still unread. Never proof of absence.
|
||||
<template v-if="mode === 'coverage'">
|
||||
A “found” colour is equally bounded: it counts what these pools list, not everything that exists.
|
||||
</template>
|
||||
|
|
@ -1135,13 +1136,12 @@ useShadowStyles(
|
|||
sending translators or broadcasters.
|
||||
</template>
|
||||
<template v-else>These are the 40 largest; tap one to fly there.</template>
|
||||
<!-- This paragraph used to say audio had never been searched for any of them. That
|
||||
stopped being true when Faith Comes By Hearing was added, and a stale caveat is
|
||||
as misleading as a stale number. GRN is still unsearchable and still named. -->
|
||||
<br>Audio <b>has</b> been searched, at Faith Comes By Hearing — these groups have none
|
||||
there either. GRN remains the one audio pool nobody has looked in: it answers 403 to
|
||||
every request, including its own robots.txt, and needs an agreement rather than a
|
||||
scraper.
|
||||
<!-- This paragraph has twice had to stop claiming a pool was unsearched: first when
|
||||
Faith Comes By Hearing was added, then when GRN was reached through 5fish. A
|
||||
stale caveat is as misleading as a stale number. -->
|
||||
<br>Audio <b>has</b> been searched — at Faith Comes By Hearing, and at Global
|
||||
Recordings Network through their 5fish site, which is being swept a batch at a time
|
||||
because they ask crawlers for a ten-second delay. These groups have none in either.
|
||||
<br><em>related:</em> where a line below carries it, ISO 639-3 files that code under a
|
||||
macrolanguage with another variety that does have resources. It is how the standard
|
||||
groups the codes, not a claim they are mutually intelligible.
|
||||
|
|
@ -1235,10 +1235,9 @@ useShadowStyles(
|
|||
<span v-else class="gm-chip meh">Film · none found</span>
|
||||
|
||||
<!-- AUDIO SCRIPTURE, from Faith Comes By Hearing. This chip read "not searched
|
||||
(GRN)" on every group on this map for as long as it has existed, because GRN
|
||||
answers 403 to everything including robots.txt. That is still true and still
|
||||
said below — but it is no longer the whole answer, and a group with an audio
|
||||
Bible should never have been told the audio question was simply unasked. -->
|
||||
(GRN)" on every group for as long as this map existed. GRN is now searched too,
|
||||
through 5fish, and appears as its own Gospel audio chip — so this one speaks
|
||||
only for FCBH and no longer implies the audio question went unasked. -->
|
||||
<!-- ONE link, and it says what it carries. A bible.is fileset is a single page
|
||||
that may hold audio, text or both, so two chips to the same URL would be
|
||||
noise; the media list is the useful part, because "there is a recording"
|
||||
|
|
@ -1254,8 +1253,8 @@ useShadowStyles(
|
|||
matters — which pool could still have signed Scripture — further down. When
|
||||
FCBH does hold something for them it is text, and the link above still shows. -->
|
||||
<span v-else-if="!selectedGroup.is_sign" class="gm-chip meh"
|
||||
title="Faith Comes By Hearing publishes no audio or text Scripture in this language. GRN (Global Recordings Network) is the other main audio pool and answers 403 to every request, so it has not been searched for any group on this map.">
|
||||
Audio · none at FCBH, GRN unsearchable
|
||||
title="Faith Comes By Hearing publishes no audio or text Scripture in this language. Global Recordings Network is searched separately and appears as its own Gospel audio chip when they hold something.">
|
||||
Audio · none found at FCBH
|
||||
</span>
|
||||
|
||||
<!-- Bible VIDEO, kept visibly apart from Film. Film here means the JESUS Film;
|
||||
|
|
@ -1287,6 +1286,16 @@ useShadowStyles(
|
|||
Gospel presentation · {{ selectedGroup.gospel_tract.n }}
|
||||
</a>
|
||||
|
||||
<!-- GOSPEL AUDIO — for a language with no writing system this may be the only
|
||||
form the gospel can take, so it gets its own chip rather than being folded
|
||||
into the audio-Scripture one. The title says plainly that it is not a
|
||||
translation: a worker must not set out believing they have Scripture. -->
|
||||
<a v-if="selectedGroup.gospel_audio" class="gm-chip ok wrap"
|
||||
:href="selectedGroup.gospel_audio.u" target="_blank" rel="noopener noreferrer"
|
||||
title="Global Recordings Network publishes gospel audio in this language — usually Words of Life, gospel messages and Bible stories with songs. It is not a translation of the Bible.">
|
||||
Gospel audio · GRN
|
||||
</a>
|
||||
|
||||
<!-- SCRIPTURE EARTH — SIL and its translation partners, reaching small languages
|
||||
the big catalogues skip. The chip names WHAT IS THERE rather than saying just
|
||||
"Scripture Earth", because the kinds differ per language and a worker needs to
|
||||
|
|
|
|||
|
|
@ -48,6 +48,7 @@ const FCBH = resolve(REPO, 'data/tables/fcbh-index.json')
|
|||
const MACRO = resolve(REPO, 'data/tables/iso-macrolanguages.json')
|
||||
const GODTOOLS = resolve(REPO, 'data/tables/godtools-index.json')
|
||||
const SCRIPTUREEARTH = resolve(REPO, 'data/tables/scriptureearth-index.json')
|
||||
const GRN = resolve(REPO, 'data/tables/grn-index.json')
|
||||
|
||||
// Two entries with the same subject rendered as "Open Bible Stories Open Bible Stories"
|
||||
// — two links a reader cannot tell apart. 40 languages are in that state, because a
|
||||
|
|
@ -156,6 +157,10 @@ try { godtools = JSON.parse(readFileSync(GODTOOLS, 'utf8')).codes || {} } catch
|
|||
let scriptureEarth = {}
|
||||
try { scriptureEarth = JSON.parse(readFileSync(SCRIPTUREEARTH, 'utf8')).byIso || {} } catch { scriptureEarth = {} }
|
||||
|
||||
// Global Recordings Network via 5fish (scripts/fetch-grn-index.mjs). Optional like the rest.
|
||||
let grn = {}
|
||||
try { grn = JSON.parse(readFileSync(GRN, 'utf8')).byIso || {} } catch { grn = {} }
|
||||
|
||||
let zume = {}
|
||||
let zumeApprox = {}
|
||||
try {
|
||||
|
|
@ -322,8 +327,8 @@ for (const [c, v] of Object.entries(codes)) {
|
|||
// credentials this build does not have, and they are the ONLY things the unchecked list
|
||||
// should ever name. A reader deciding where to work needs "we looked and it is not there"
|
||||
// to be distinguishable from "nobody looked".
|
||||
const SCANNED = 'ebible, arclight, door43, fcbh, scriptureearth'
|
||||
const NOT_SCANNED = 'grn, api_bible, dbl, progress_bible'
|
||||
const SCANNED = 'ebible, arclight, door43, fcbh, scriptureearth, grn'
|
||||
const NOT_SCANNED = 'api_bible, dbl, progress_bible'
|
||||
// SIGN LANGUAGES GET THEIR OWN PROVENANCE, because the generic list is actively
|
||||
// misleading for them. A Deaf group is not served by eBible (text), Door43 (text and
|
||||
// stories) or FCBH audio, so listing those as "checked" implies a search that was never
|
||||
|
|
@ -421,6 +426,29 @@ for (const [c, e] of Object.entries(scriptureEarth)) {
|
|||
seCodes++
|
||||
}
|
||||
|
||||
// GOSPEL AUDIO (GRN). For a language with no writing system this is the ONLY form the
|
||||
// gospel can take, which is why it belongs in the gap rather than beside it. It lifts a
|
||||
// group off tier 0 — a person can hear the gospel in their own language — and never reaches
|
||||
// tier 2, which stays reserved for text Scripture together with the JESUS Film.
|
||||
//
|
||||
// Typed as Gospel audio, NEVER as Scripture: "Words of Life" is gospel messages and Bible
|
||||
// stories with songs, not a translation of the canon. Calling it Scripture would be the
|
||||
// same error as filing a story set under Scripture, and it is the error that matters most.
|
||||
let grnCodes = 0
|
||||
let grnNew = 0
|
||||
let grnSignSkipped = 0
|
||||
for (const [c, g] of Object.entries(grn)) {
|
||||
// NEVER on a sign language. GRN's catalogue is AUDIO recordings, and 5fish having a page
|
||||
// titled "Pakistan Sign Language" says they index the language, not that they hold signed
|
||||
// video. Attaching it anyway told 20 Deaf groups — 11.5M people — that gospel audio was
|
||||
// available to them, which is both unverified and, for this audience, useless. The rule
|
||||
// for an unclear source is to leave it out and say why, so it is left out here.
|
||||
if (codes[c] && codes[c].sg === 1) { grnSignSkipped++; continue }
|
||||
if (!codes[c]) { codes[c] = { l: g.n || '', ck: SCANNED, un: NOT_SCANNED }; grnNew++ }
|
||||
codes[c].ga = { u: g.u, n: g.n }
|
||||
grnCodes++
|
||||
}
|
||||
|
||||
let zumeApproxCodes = 0
|
||||
for (const [c, a] of Object.entries(zumeApprox)) {
|
||||
// Never overwrite an exact join with an approximate one, and never create a code that
|
||||
|
|
@ -447,6 +475,7 @@ if (dead.size) {
|
|||
if (v.bv && dead.has(v.bv.u)) { delete v.bv; droppedDead++ }
|
||||
if (v.gp && dead.has(v.gp.u)) { delete v.gp; droppedDead++ }
|
||||
if (v.se && dead.has(v.se.u)) { delete v.se; droppedDead++ }
|
||||
if (v.ga && dead.has(v.ga.u)) { delete v.ga; droppedDead++ }
|
||||
if (v.d) {
|
||||
const before = v.d.length
|
||||
v.d = v.d.filter((x) => !dead.has(x.u))
|
||||
|
|
@ -504,14 +533,15 @@ for (const p of slim) {
|
|||
const hasA = !!(c && c.au)
|
||||
const hasBV = !!(c && c.bv)
|
||||
const hasSE = !!(c && c.se)
|
||||
if (hasS || hasF || hasD || hasA || hasBV || hasSE) withUrl++
|
||||
const hasGA = !!(c && c.ga)
|
||||
if (hasS || hasF || hasD || hasA || hasBV || hasSE || hasGA) withUrl++
|
||||
if (!hasS && !hasF && hasD) liftedByD43++
|
||||
if (!hasS && !hasF && !hasD && (hasA || hasBV)) liftedByAudio++
|
||||
if (!hasS && !hasF && !hasD && !hasA && !hasBV && hasSE) liftedBySE++
|
||||
// tier 2 = Scripture AND film · 1 = SOMETHING found · 0 = nothing in any pool checked.
|
||||
// A Door43 resource lifts a group out of tier 0 because "nothing found" is then simply
|
||||
// untrue for them — but it never reaches tier 2, which is reserved for Scripture + film.
|
||||
const tier = hasS && hasF ? 2 : (hasS || hasF || hasD || hasA || hasBV || hasSE) ? 1 : 0
|
||||
const tier = hasS && hasF ? 2 : (hasS || hasF || hasD || hasA || hasBV || hasSE || hasGA) ? 1 : 0
|
||||
pins.push([
|
||||
p.Name || '',
|
||||
Math.round(lat * 100) / 100,
|
||||
|
|
@ -552,6 +582,7 @@ console.log(`arclight codes ${Object.keys(arc).length} (${arcOnly} new, ${upgr
|
|||
console.log(`share urls ${Object.keys(share).length}`)
|
||||
console.log(`fcbh codes ${audioCodes} (${audioNew} new codes)`)
|
||||
console.log(`gospel tracts ${gospelCodes} (Cru/GodTools presentations; depth only, tier UNCHANGED)`)
|
||||
console.log(`gospel audio ${grnCodes} (${grnNew} new codes; GRN via 5fish — heard, not read; ${grnSignSkipped} sign language(s) skipped)`)
|
||||
console.log(`scripture earth ${seCodes} (${seNew} new codes; SIL partners — Scripture in their own language)`)
|
||||
console.log(`related variety ${relatedCodes} (nothing of their own; an ISO macrolanguage sibling has something — tier UNCHANGED)`)
|
||||
console.log(`fcbh bible video ${videoCodes} (a separate page; never counted as film) + ${videoMerged} merged into the Scripture link`)
|
||||
|
|
|
|||
|
|
@ -55,6 +55,7 @@ const SOURCE = (u) =>
|
|||
: /bible\.is/i.test(u) ? 'Faith Comes By Hearing'
|
||||
: /knowgod\.com/i.test(u) ? 'Cru (GodTools)'
|
||||
: /scriptureearth\.org/i.test(u) ? 'Scripture Earth (SIL)'
|
||||
: /fivefish\.org|globalrecordings\.net/i.test(u) ? 'Global Recordings Network'
|
||||
: 'other'
|
||||
|
||||
const out = []
|
||||
|
|
@ -120,6 +121,10 @@ for (const [code, c] of Object.entries(codes)) {
|
|||
// translation partners publishing the text in this language. The scope column names the
|
||||
// FORMATS actually held, since a worker needs to know whether they are being sent to a
|
||||
// PDF, to recorded audio, or to an app before they set out.
|
||||
// Gospel audio is its own type. It is NOT Scripture — "Words of Life" is gospel messages
|
||||
// and Bible stories with songs — and for a language with no writing it may be the only
|
||||
// form the gospel can take, so it must be findable rather than folded into another row.
|
||||
if (c.ga) add(c.ga.n ? `Words of Life — ${c.ga.n}` : 'Gospel audio', 'Gospel audio', c.ga.u, 'Listen in this language')
|
||||
if (c.se) {
|
||||
const SE_KIND = { PDF: 'PDF', audio: 'audio', sab: 'app', study: 'study notes', viewer: 'read online' }
|
||||
const kinds = (c.se.k || []).map((k) => SE_KIND[k] || k).join(', ')
|
||||
|
|
|
|||
172
plugin-designs/gospel-resources/scripts/fetch-grn-index.mjs
Normal file
172
plugin-designs/gospel-resources/scripts/fetch-grn-index.mjs
Normal file
|
|
@ -0,0 +1,172 @@
|
|||
/**
|
||||
* fetch-grn-index.mjs — Global Recordings Network, via 5fish, joined on ISO 639-3.
|
||||
*
|
||||
* WHY THIS SOURCE, AND WHY IT WAS MISSING SO LONG. GRN records the gospel as AUDIO for
|
||||
* languages that have no written Scripture at all, which is precisely the population left
|
||||
* in this map's gap. It is named in the brief, and every previous attempt recorded it as
|
||||
* unreachable — globalrecordings.net sits behind a proof-of-work bot shield that answers
|
||||
* even robots.txt with a challenge page. That shield is an access control and is not worked
|
||||
* around here. Their own delivery site, 5fish.org, is NOT shielded and its robots.txt allows
|
||||
* everything except /abyss/, /app.xml and /PrayerApp.json, none of which this touches.
|
||||
*
|
||||
* WE OBEY THEIR CRAWL-DELAY. 5fish asks for `Crawl-delay: 10`. This fetcher is therefore
|
||||
* SEQUENTIAL with a ten-second gap and a per-run cap, and it is RESUMABLE so the work is
|
||||
* spread across runs rather than taken all at once. A full sweep of the gap is some hours of
|
||||
* wall clock at that rate; that is their rate to set, not ours, and this is a small ministry's
|
||||
* server. Do not add concurrency here.
|
||||
*
|
||||
* A 200 IS NOT AN ANSWER — MEASURED, WITH CONTROLS. The host never 404s. Three states were
|
||||
* observed and the title is what separates them:
|
||||
* - "…| Learn about Christian beliefs in <Language>" a real language page
|
||||
* - "…| Languages Spoken in <Country>" a GEO FALLBACK: /zzz-no-such-language
|
||||
* -xyzzy returns this, 200, 151,042 bytes
|
||||
* - "…| The Gospel in Every Language" (bare) no such language
|
||||
* Both of the two largest gap codes, cjy and gan, return the bare form, which is consistent
|
||||
* with their being in the gap at all. Taking HTTP 200 as existence would have marked every
|
||||
* code on earth as covered.
|
||||
*
|
||||
* WHAT IS CLAIMED. A hit means GRN publishes at least one audio program in that language —
|
||||
* typically "Words of Life", gospel messages and Bible stories with songs. It is typed as
|
||||
* Gospel audio and NEVER as Scripture: it is not a translation of the canon, and the same
|
||||
* care applies here as to Bible Stories. It lifts a group off tier 0, because a person can
|
||||
* hear the gospel in their own language, and it never reaches tier 2.
|
||||
*/
|
||||
import { readFileSync, existsSync } from 'node:fs'
|
||||
import { resolve, dirname } from 'node:path'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
import { writeSnapshot } from './_snapshot-guard.mjs'
|
||||
|
||||
const HERE = dirname(fileURLToPath(import.meta.url))
|
||||
const TABLES = resolve(HERE, '../../../data/tables')
|
||||
const OUT = resolve(TABLES, 'grn-index.json')
|
||||
const PINS = resolve(TABLES, 'people-group-pins.json')
|
||||
const ORIGIN = 'https://fivefish.org'
|
||||
|
||||
const UA =
|
||||
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36'
|
||||
|
||||
/** Their stated crawl-delay, in ms. Lowering this is a decision about someone else's server. */
|
||||
const CRAWL_DELAY_MS = Number(process.env.GRN_DELAY_MS || 10000)
|
||||
/** Codes probed per run. The sweep is resumable, so this bounds one sitting, not the total. */
|
||||
const MAX = Number(process.env.GRN_MAX || 150)
|
||||
const LIMIT_SMOKE = process.env.GRN_SMOKE === '1'
|
||||
|
||||
const sleep = (ms) => new Promise((r) => setTimeout(r, ms))
|
||||
|
||||
const titleOf = (html) => {
|
||||
const m = /<title>([^<]*)<\/title>/i.exec(html || '')
|
||||
return m ? m[1].trim() : ''
|
||||
}
|
||||
|
||||
/** @returns {'hit'|'none'|'geo'|'error'} and the language name when it is a hit. */
|
||||
function classify(title) {
|
||||
if (/Learn about Christian beliefs in\s+(.+)$/i.test(title)) {
|
||||
return { state: 'hit', name: /Learn about Christian beliefs in\s+(.+)$/i.exec(title)[1].trim() }
|
||||
}
|
||||
if (/Languages Spoken in/i.test(title)) return { state: 'geo' }
|
||||
if (title) return { state: 'none' }
|
||||
return { state: 'error' }
|
||||
}
|
||||
|
||||
async function probe(iso) {
|
||||
try {
|
||||
const r = await fetch(`${ORIGIN}/${encodeURIComponent(iso)}`, {
|
||||
headers: { 'user-agent': UA, accept: 'text/html,application/xhtml+xml' },
|
||||
redirect: 'follow',
|
||||
signal: AbortSignal.timeout(30000),
|
||||
})
|
||||
if (!r.ok) return { state: 'error' }
|
||||
return classify(titleOf(await r.text()))
|
||||
} catch {
|
||||
return { state: 'error' }
|
||||
}
|
||||
}
|
||||
|
||||
/* ── controls, in band, before anything is trusted ───────────────────────────────────── */
|
||||
const neg = await probe('zzz-no-such-language-xyzzy')
|
||||
await sleep(CRAWL_DELAY_MS)
|
||||
const pos = await probe('amh')
|
||||
if (neg.state === 'hit') {
|
||||
console.error('GRN: control FAILED — a nonsense code reported a real language page. Aborting.')
|
||||
process.exit(1)
|
||||
}
|
||||
if (pos.state !== 'hit') {
|
||||
console.error(`GRN: control FAILED — amh did not read as a language page (${pos.state}). Aborting.`)
|
||||
process.exit(1)
|
||||
}
|
||||
console.log(`GRN: controls pass — nonsense reads "${neg.state}", amh reads "${pos.name}".`)
|
||||
|
||||
/* ── what still needs deciding ───────────────────────────────────────────────────────── */
|
||||
const prev = existsSync(OUT) ? JSON.parse(readFileSync(OUT, 'utf8')) : { byIso: {}, none: [] }
|
||||
const decided = new Set([...Object.keys(prev.byIso || {}), ...(prev.none || [])])
|
||||
|
||||
const pins = JSON.parse(readFileSync(PINS, 'utf8'))
|
||||
/* The gap first, largest population first: a bounded run should buy the most people it can. */
|
||||
const pop = {}
|
||||
const gap = new Set()
|
||||
for (const r of pins.pins) {
|
||||
const c = (r[4] || '').toLowerCase()
|
||||
if (!c) continue
|
||||
if (r[6] === 0) {
|
||||
gap.add(c)
|
||||
pop[c] = (pop[c] || 0) + (r[5] || 0)
|
||||
}
|
||||
}
|
||||
const todo = [...gap].filter((c) => !decided.has(c)).sort((a, b) => pop[b] - pop[a])
|
||||
console.log(`GRN: ${gap.size} gap code(s); ${decided.size} already decided; ${todo.length} left.`)
|
||||
|
||||
const batch = todo.slice(0, LIMIT_SMOKE ? 3 : MAX)
|
||||
const byIso = { ...(prev.byIso || {}) }
|
||||
const none = [...(prev.none || [])]
|
||||
let hits = 0
|
||||
let errors = 0
|
||||
|
||||
for (let i = 0; i < batch.length; i++) {
|
||||
const iso = batch[i]
|
||||
await sleep(CRAWL_DELAY_MS)
|
||||
const r = await probe(iso)
|
||||
if (r.state === 'hit') {
|
||||
byIso[iso] = { u: `${ORIGIN}/${iso}`, n: r.name }
|
||||
hits++
|
||||
} else if (r.state === 'none' || r.state === 'geo') {
|
||||
/* A geo fallback means the path did not resolve to a language, same as "none" for us. */
|
||||
none.push(iso)
|
||||
} else {
|
||||
errors++
|
||||
}
|
||||
if ((i + 1) % 25 === 0) console.log(` ${i + 1}/${batch.length} (${hits} hit)`)
|
||||
}
|
||||
|
||||
console.log(
|
||||
`GRN: probed ${batch.length}, ${hits} with audio, ${batch.length - hits - errors} without, ${errors} error(s).`,
|
||||
)
|
||||
|
||||
if (LIMIT_SMOKE) {
|
||||
console.log('GRN: GRN_SMOKE=1 — writing nothing.')
|
||||
process.exit(0)
|
||||
}
|
||||
|
||||
writeSnapshot(
|
||||
OUT,
|
||||
`${JSON.stringify(
|
||||
{
|
||||
source: `${ORIGIN}/<iso639-3> (5fish, Global Recordings Network)`,
|
||||
fetched: new Date().toISOString().slice(0, 10),
|
||||
_note:
|
||||
'GRN gospel AUDIO, typed as Gospel audio and never as Scripture — "Words of Life" is ' +
|
||||
'gospel messages and Bible stories, not a translation of the canon. The host never ' +
|
||||
'404s: a nonsense path returns a geo-located page with HTTP 200, so existence is read ' +
|
||||
'from the page title, with a negative and a positive control run in band every time. ' +
|
||||
'Their robots.txt asks for Crawl-delay: 10 and this fetcher obeys it, sequentially.',
|
||||
codes: Object.keys(byIso).length,
|
||||
decidedNone: none.length,
|
||||
byIso,
|
||||
none,
|
||||
},
|
||||
null,
|
||||
1,
|
||||
)}\n`,
|
||||
(j) => Object.keys(j.byIso || {}).length + (j.none || []).length,
|
||||
'GRN code(s) decided',
|
||||
)
|
||||
console.log(`wrote ${OUT}`)
|
||||
|
|
@ -334,6 +334,7 @@ for (const v of Object.values(pins.codes)) {
|
|||
if (v.bv && v.bv.u) urls.add(v.bv.u)
|
||||
if (v.gp && v.gp.u) urls.add(v.gp.u)
|
||||
if (v.se && v.se.u) urls.add(v.se.u)
|
||||
if (v.ga && v.ga.u) urls.add(v.ga.u)
|
||||
for (const d of v.d || []) if (d.u) urls.add(d.u)
|
||||
}
|
||||
// Carry forward everything a previous run proved dead, so dropping a link cannot erase the
|
||||
|
|
|
|||
2
public/assets/tables/gospel-gaps.json
vendored
2
public/assets/tables/gospel-gaps.json
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
2
public/assets/tables/people-group-pins.json
vendored
2
public/assets/tables/people-group-pins.json
vendored
File diff suppressed because one or more lines are too long
1004
public/doxa-maps/assets/tables/country-gap.json
generated
1004
public/doxa-maps/assets/tables/country-gap.json
generated
File diff suppressed because it is too large
Load diff
280
public/doxa-maps/assets/tables/gospel-by-country.json
generated
280
public/doxa-maps/assets/tables/gospel-by-country.json
generated
|
|
@ -14,29 +14,29 @@
|
|||
"country": "People's Republic of China",
|
||||
"region": "Asia",
|
||||
"groups": 391,
|
||||
"no_resource": 125,
|
||||
"pop_no_resource": 150271700,
|
||||
"no_resource": 111,
|
||||
"pop_no_resource": 128103100,
|
||||
"scripture": 118,
|
||||
"film": 227,
|
||||
"growing_unreached": 0,
|
||||
"deaths_day": 274.2,
|
||||
"growth": -0.12,
|
||||
"pct_no_resource": 32,
|
||||
"band": "high"
|
||||
"pct_no_resource": 28.4,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
"iso3": "LAO",
|
||||
"country": "Lao People's Democratic Republic",
|
||||
"region": "Asia",
|
||||
"groups": 158,
|
||||
"no_resource": 79,
|
||||
"pop_no_resource": 1306185,
|
||||
"no_resource": 72,
|
||||
"pop_no_resource": 982785,
|
||||
"scripture": 55,
|
||||
"film": 58,
|
||||
"growing_unreached": 0,
|
||||
"deaths_day": 15.5,
|
||||
"growth": null,
|
||||
"pct_no_resource": 50,
|
||||
"pct_no_resource": 45.6,
|
||||
"band": "high"
|
||||
},
|
||||
{
|
||||
|
|
@ -44,14 +44,14 @@
|
|||
"country": "India",
|
||||
"region": "Asia",
|
||||
"groups": 2146,
|
||||
"no_resource": 63,
|
||||
"pop_no_resource": 2157770,
|
||||
"no_resource": 55,
|
||||
"pop_no_resource": 1320695,
|
||||
"scripture": 1757,
|
||||
"film": 2044,
|
||||
"growing_unreached": 38,
|
||||
"deaths_day": 721.2,
|
||||
"growth": 0.89,
|
||||
"pct_no_resource": 2.9,
|
||||
"pct_no_resource": 2.6,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -74,14 +74,14 @@
|
|||
"country": "Chad",
|
||||
"region": "Africa",
|
||||
"groups": 150,
|
||||
"no_resource": 79,
|
||||
"pop_no_resource": 4813200,
|
||||
"no_resource": 69,
|
||||
"pop_no_resource": 2565700,
|
||||
"scripture": 46,
|
||||
"film": 49,
|
||||
"growing_unreached": 37,
|
||||
"deaths_day": 68.4,
|
||||
"growth": 4.95,
|
||||
"pct_no_resource": 52.7,
|
||||
"pct_no_resource": 46,
|
||||
"band": "high"
|
||||
},
|
||||
{
|
||||
|
|
@ -89,14 +89,14 @@
|
|||
"country": "Sudan",
|
||||
"region": "Africa",
|
||||
"groups": 185,
|
||||
"no_resource": 62,
|
||||
"pop_no_resource": 3220900,
|
||||
"no_resource": 58,
|
||||
"pop_no_resource": 2809900,
|
||||
"scripture": 96,
|
||||
"film": 117,
|
||||
"growing_unreached": 36,
|
||||
"deaths_day": 359.6,
|
||||
"growth": 0.81,
|
||||
"pct_no_resource": 33.5,
|
||||
"pct_no_resource": 31.4,
|
||||
"band": "high"
|
||||
},
|
||||
{
|
||||
|
|
@ -104,14 +104,14 @@
|
|||
"country": "Nigeria",
|
||||
"region": "Africa",
|
||||
"groups": 433,
|
||||
"no_resource": 187,
|
||||
"pop_no_resource": 8978825,
|
||||
"no_resource": 180,
|
||||
"pop_no_resource": 6759525,
|
||||
"scripture": 105,
|
||||
"film": 188,
|
||||
"growing_unreached": 0,
|
||||
"deaths_day": 44,
|
||||
"growth": null,
|
||||
"pct_no_resource": 43.2,
|
||||
"pct_no_resource": 41.6,
|
||||
"band": "high"
|
||||
},
|
||||
{
|
||||
|
|
@ -119,14 +119,14 @@
|
|||
"country": "Indonesia",
|
||||
"region": "Asia",
|
||||
"groups": 669,
|
||||
"no_resource": 321,
|
||||
"pop_no_resource": 5140960,
|
||||
"no_resource": 320,
|
||||
"pop_no_resource": 4968960,
|
||||
"scripture": 222,
|
||||
"film": 265,
|
||||
"growing_unreached": 23,
|
||||
"deaths_day": 47.2,
|
||||
"growth": 0.81,
|
||||
"pct_no_resource": 48,
|
||||
"pct_no_resource": 47.8,
|
||||
"band": "high"
|
||||
},
|
||||
{
|
||||
|
|
@ -164,14 +164,14 @@
|
|||
"country": "Bhutan",
|
||||
"region": "Asia",
|
||||
"groups": 36,
|
||||
"no_resource": 19,
|
||||
"pop_no_resource": 238225,
|
||||
"no_resource": 18,
|
||||
"pop_no_resource": 233625,
|
||||
"scripture": 11,
|
||||
"film": 16,
|
||||
"growing_unreached": 13,
|
||||
"deaths_day": 2.1,
|
||||
"growth": 0.65,
|
||||
"pct_no_resource": 52.8,
|
||||
"pct_no_resource": 50,
|
||||
"band": "high"
|
||||
},
|
||||
{
|
||||
|
|
@ -194,14 +194,14 @@
|
|||
"country": "Vietnam",
|
||||
"region": "Asia",
|
||||
"groups": 74,
|
||||
"no_resource": 29,
|
||||
"pop_no_resource": 1860175,
|
||||
"no_resource": 27,
|
||||
"pop_no_resource": 1540175,
|
||||
"scripture": 28,
|
||||
"film": 38,
|
||||
"growing_unreached": 11,
|
||||
"deaths_day": 5.7,
|
||||
"growth": 0.63,
|
||||
"pct_no_resource": 39.2,
|
||||
"pct_no_resource": 36.5,
|
||||
"band": "high"
|
||||
},
|
||||
{
|
||||
|
|
@ -209,14 +209,14 @@
|
|||
"country": "Islamic Republic of Iran",
|
||||
"region": "Asia",
|
||||
"groups": 47,
|
||||
"no_resource": 11,
|
||||
"pop_no_resource": 625400,
|
||||
"no_resource": 10,
|
||||
"pop_no_resource": 445400,
|
||||
"scripture": 27,
|
||||
"film": 32,
|
||||
"growing_unreached": 10,
|
||||
"deaths_day": 55.3,
|
||||
"growth": 1.05,
|
||||
"pct_no_resource": 23.4,
|
||||
"pct_no_resource": 21.3,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -239,14 +239,14 @@
|
|||
"country": "South Sudan",
|
||||
"region": "Africa",
|
||||
"groups": 80,
|
||||
"no_resource": 22,
|
||||
"pop_no_resource": 577100,
|
||||
"no_resource": 20,
|
||||
"pop_no_resource": 546600,
|
||||
"scripture": 39,
|
||||
"film": 52,
|
||||
"growing_unreached": 8,
|
||||
"deaths_day": 59,
|
||||
"growth": 3.93,
|
||||
"pct_no_resource": 27.5,
|
||||
"pct_no_resource": 25,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -254,14 +254,14 @@
|
|||
"country": "Mali",
|
||||
"region": "Africa",
|
||||
"groups": 40,
|
||||
"no_resource": 11,
|
||||
"pop_no_resource": 1066800,
|
||||
"no_resource": 10,
|
||||
"pop_no_resource": 1000800,
|
||||
"scripture": 20,
|
||||
"film": 26,
|
||||
"growing_unreached": 8,
|
||||
"deaths_day": 54.8,
|
||||
"growth": 2.94,
|
||||
"pct_no_resource": 27.5,
|
||||
"pct_no_resource": 25,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -269,14 +269,14 @@
|
|||
"country": "Malaysia",
|
||||
"region": "Asia",
|
||||
"groups": 160,
|
||||
"no_resource": 67,
|
||||
"pop_no_resource": 2650950,
|
||||
"no_resource": 65,
|
||||
"pop_no_resource": 1918550,
|
||||
"scripture": 75,
|
||||
"film": 68,
|
||||
"growing_unreached": 8,
|
||||
"deaths_day": 8.2,
|
||||
"growth": 1.22,
|
||||
"pct_no_resource": 41.9,
|
||||
"pct_no_resource": 40.6,
|
||||
"band": "high"
|
||||
},
|
||||
{
|
||||
|
|
@ -284,14 +284,14 @@
|
|||
"country": "Cameroon",
|
||||
"region": "Africa",
|
||||
"groups": 260,
|
||||
"no_resource": 129,
|
||||
"pop_no_resource": 3656425,
|
||||
"no_resource": 126,
|
||||
"pop_no_resource": 3210925,
|
||||
"scripture": 72,
|
||||
"film": 84,
|
||||
"growing_unreached": 8,
|
||||
"deaths_day": 3.4,
|
||||
"growth": 2.61,
|
||||
"pct_no_resource": 49.6,
|
||||
"pct_no_resource": 48.5,
|
||||
"band": "high"
|
||||
},
|
||||
{
|
||||
|
|
@ -299,14 +299,14 @@
|
|||
"country": "Thailand",
|
||||
"region": "Asia",
|
||||
"groups": 62,
|
||||
"no_resource": 16,
|
||||
"pop_no_resource": 1528800,
|
||||
"no_resource": 15,
|
||||
"pop_no_resource": 1069800,
|
||||
"scripture": 34,
|
||||
"film": 37,
|
||||
"growing_unreached": 0,
|
||||
"deaths_day": 12.6,
|
||||
"growth": -0.05,
|
||||
"pct_no_resource": 25.8,
|
||||
"pct_no_resource": 24.2,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -359,14 +359,14 @@
|
|||
"country": "Nepal",
|
||||
"region": "Asia",
|
||||
"groups": 171,
|
||||
"no_resource": 47,
|
||||
"pop_no_resource": 1259050,
|
||||
"no_resource": 46,
|
||||
"pop_no_resource": 1035050,
|
||||
"scripture": 97,
|
||||
"film": 111,
|
||||
"growing_unreached": 0,
|
||||
"deaths_day": 34,
|
||||
"growth": null,
|
||||
"pct_no_resource": 27.5,
|
||||
"pct_no_resource": 26.9,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -389,14 +389,14 @@
|
|||
"country": "Burkina Faso",
|
||||
"region": "Africa",
|
||||
"groups": 76,
|
||||
"no_resource": 20,
|
||||
"pop_no_resource": 1500700,
|
||||
"no_resource": 17,
|
||||
"pop_no_resource": 727700,
|
||||
"scripture": 41,
|
||||
"film": 37,
|
||||
"growing_unreached": 6,
|
||||
"deaths_day": 13.4,
|
||||
"growth": 2.25,
|
||||
"pct_no_resource": 26.3,
|
||||
"pct_no_resource": 22.4,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -449,14 +449,14 @@
|
|||
"country": "Democratic Republic of the Congo",
|
||||
"region": "Africa",
|
||||
"groups": 215,
|
||||
"no_resource": 105,
|
||||
"pop_no_resource": 12428000,
|
||||
"no_resource": 89,
|
||||
"pop_no_resource": 7568000,
|
||||
"scripture": 50,
|
||||
"film": 95,
|
||||
"growing_unreached": 5,
|
||||
"deaths_day": 10.9,
|
||||
"growth": 3.24,
|
||||
"pct_no_resource": 48.8,
|
||||
"pct_no_resource": 41.4,
|
||||
"band": "high"
|
||||
},
|
||||
{
|
||||
|
|
@ -479,14 +479,14 @@
|
|||
"country": "United Republic of Tanzania",
|
||||
"region": "Africa",
|
||||
"groups": 132,
|
||||
"no_resource": 22,
|
||||
"pop_no_resource": 4760400,
|
||||
"no_resource": 18,
|
||||
"pop_no_resource": 3289400,
|
||||
"scripture": 81,
|
||||
"film": 101,
|
||||
"growing_unreached": 4,
|
||||
"deaths_day": 126.9,
|
||||
"growth": 2.87,
|
||||
"pct_no_resource": 16.7,
|
||||
"pct_no_resource": 13.6,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -509,14 +509,14 @@
|
|||
"country": "Benin",
|
||||
"region": "Africa",
|
||||
"groups": 57,
|
||||
"no_resource": 4,
|
||||
"pop_no_resource": 500000,
|
||||
"no_resource": 3,
|
||||
"pop_no_resource": 277000,
|
||||
"scripture": 29,
|
||||
"film": 38,
|
||||
"growing_unreached": 4,
|
||||
"deaths_day": 21.9,
|
||||
"growth": 2.46,
|
||||
"pct_no_resource": 7,
|
||||
"pct_no_resource": 5.3,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -524,14 +524,14 @@
|
|||
"country": "Libya",
|
||||
"region": "Africa",
|
||||
"groups": 27,
|
||||
"no_resource": 6,
|
||||
"pop_no_resource": 329300,
|
||||
"no_resource": 5,
|
||||
"pop_no_resource": 317800,
|
||||
"scripture": 16,
|
||||
"film": 20,
|
||||
"growing_unreached": 4,
|
||||
"deaths_day": 0,
|
||||
"growth": 1.03,
|
||||
"pct_no_resource": 22.2,
|
||||
"pct_no_resource": 18.5,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -569,15 +569,15 @@
|
|||
"country": "Comoros",
|
||||
"region": "Africa",
|
||||
"groups": 11,
|
||||
"no_resource": 4,
|
||||
"pop_no_resource": 445500,
|
||||
"no_resource": 3,
|
||||
"pop_no_resource": 45500,
|
||||
"scripture": 6,
|
||||
"film": 6,
|
||||
"growing_unreached": 3,
|
||||
"deaths_day": 8.3,
|
||||
"growth": 1.89,
|
||||
"pct_no_resource": 36.4,
|
||||
"band": "high"
|
||||
"pct_no_resource": 27.3,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
"iso3": "BRN",
|
||||
|
|
@ -629,14 +629,14 @@
|
|||
"country": "Mozambique",
|
||||
"region": "Africa",
|
||||
"groups": 49,
|
||||
"no_resource": 6,
|
||||
"pop_no_resource": 2882000,
|
||||
"no_resource": 4,
|
||||
"pop_no_resource": 1032000,
|
||||
"scripture": 31,
|
||||
"film": 41,
|
||||
"growing_unreached": 2,
|
||||
"deaths_day": 26.4,
|
||||
"growth": 2.92,
|
||||
"pct_no_resource": 12.2,
|
||||
"pct_no_resource": 8.2,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -659,14 +659,14 @@
|
|||
"country": "Uganda",
|
||||
"region": "Africa",
|
||||
"groups": 54,
|
||||
"no_resource": 6,
|
||||
"pop_no_resource": 2970200,
|
||||
"no_resource": 4,
|
||||
"pop_no_resource": 460200,
|
||||
"scripture": 38,
|
||||
"film": 46,
|
||||
"growing_unreached": 2,
|
||||
"deaths_day": 23,
|
||||
"growth": 2.75,
|
||||
"pct_no_resource": 11.1,
|
||||
"pct_no_resource": 7.4,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -674,14 +674,14 @@
|
|||
"country": "Peru",
|
||||
"region": "Americas",
|
||||
"groups": 90,
|
||||
"no_resource": 12,
|
||||
"pop_no_resource": 1160875,
|
||||
"no_resource": 11,
|
||||
"pop_no_resource": 660875,
|
||||
"scripture": 73,
|
||||
"film": 57,
|
||||
"growing_unreached": 2,
|
||||
"deaths_day": 5.4,
|
||||
"growth": 1.09,
|
||||
"pct_no_resource": 13.3,
|
||||
"pct_no_resource": 12.2,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -704,14 +704,14 @@
|
|||
"country": "Niger",
|
||||
"region": "Africa",
|
||||
"groups": 25,
|
||||
"no_resource": 5,
|
||||
"pop_no_resource": 1153500,
|
||||
"no_resource": 4,
|
||||
"pop_no_resource": 1138500,
|
||||
"scripture": 16,
|
||||
"film": 18,
|
||||
"growing_unreached": 2,
|
||||
"deaths_day": 2.1,
|
||||
"growth": 3.28,
|
||||
"pct_no_resource": 20,
|
||||
"pct_no_resource": 16,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -749,14 +749,14 @@
|
|||
"country": "Sweden",
|
||||
"region": "Europe",
|
||||
"groups": 32,
|
||||
"no_resource": 6,
|
||||
"pop_no_resource": 65500,
|
||||
"no_resource": 5,
|
||||
"pop_no_resource": 62500,
|
||||
"scripture": 26,
|
||||
"film": 26,
|
||||
"growing_unreached": 2,
|
||||
"deaths_day": 1.1,
|
||||
"growth": 0.31,
|
||||
"pct_no_resource": 18.8,
|
||||
"pct_no_resource": 15.6,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -764,14 +764,14 @@
|
|||
"country": "Republic of The Gambia",
|
||||
"region": "Africa",
|
||||
"groups": 17,
|
||||
"no_resource": 4,
|
||||
"pop_no_resource": 430000,
|
||||
"no_resource": 3,
|
||||
"pop_no_resource": 35000,
|
||||
"scripture": 6,
|
||||
"film": 13,
|
||||
"growing_unreached": 2,
|
||||
"deaths_day": 0.6,
|
||||
"growth": 2.28,
|
||||
"pct_no_resource": 23.5,
|
||||
"pct_no_resource": 17.6,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -779,14 +779,14 @@
|
|||
"country": "Republic of the Congo",
|
||||
"region": "Africa",
|
||||
"groups": 64,
|
||||
"no_resource": 30,
|
||||
"pop_no_resource": 1344200,
|
||||
"no_resource": 27,
|
||||
"pop_no_resource": 907200,
|
||||
"scripture": 16,
|
||||
"film": 27,
|
||||
"growing_unreached": 2,
|
||||
"deaths_day": 1,
|
||||
"growth": 2.4,
|
||||
"pct_no_resource": 46.9,
|
||||
"pct_no_resource": 42.2,
|
||||
"band": "high"
|
||||
},
|
||||
{
|
||||
|
|
@ -959,14 +959,14 @@
|
|||
"country": "Cote d'Ivoire",
|
||||
"region": "Africa",
|
||||
"groups": 83,
|
||||
"no_resource": 21,
|
||||
"pop_no_resource": 1167500,
|
||||
"no_resource": 19,
|
||||
"pop_no_resource": 541500,
|
||||
"scripture": 44,
|
||||
"film": 53,
|
||||
"growing_unreached": 1,
|
||||
"deaths_day": 3.7,
|
||||
"growth": 2.44,
|
||||
"pct_no_resource": 25.3,
|
||||
"pct_no_resource": 22.9,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -1094,14 +1094,14 @@
|
|||
"country": "Central African Republic",
|
||||
"region": "Africa",
|
||||
"groups": 69,
|
||||
"no_resource": 34,
|
||||
"pop_no_resource": 1496250,
|
||||
"no_resource": 31,
|
||||
"pop_no_resource": 1025250,
|
||||
"scripture": 16,
|
||||
"film": 28,
|
||||
"growing_unreached": 1,
|
||||
"deaths_day": 0.6,
|
||||
"growth": 3.4,
|
||||
"pct_no_resource": 49.3,
|
||||
"pct_no_resource": 44.9,
|
||||
"band": "high"
|
||||
},
|
||||
{
|
||||
|
|
@ -1574,15 +1574,15 @@
|
|||
"country": "Liechtenstein",
|
||||
"region": "Europe",
|
||||
"groups": 4,
|
||||
"no_resource": 2,
|
||||
"pop_no_resource": 36400,
|
||||
"no_resource": 1,
|
||||
"pop_no_resource": 400,
|
||||
"scripture": 2,
|
||||
"film": 2,
|
||||
"growing_unreached": 1,
|
||||
"deaths_day": 0,
|
||||
"growth": 1.5,
|
||||
"pct_no_resource": 50,
|
||||
"band": "high"
|
||||
"pct_no_resource": 25,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
"iso3": "FRO",
|
||||
|
|
@ -2009,14 +2009,14 @@
|
|||
"country": "Namibia",
|
||||
"region": "Africa",
|
||||
"groups": 29,
|
||||
"no_resource": 7,
|
||||
"pop_no_resource": 992225,
|
||||
"no_resource": 5,
|
||||
"pop_no_resource": 113225,
|
||||
"scripture": 4,
|
||||
"film": 19,
|
||||
"growing_unreached": 0,
|
||||
"deaths_day": 3.3,
|
||||
"growth": 2.24,
|
||||
"pct_no_resource": 24.1,
|
||||
"pct_no_resource": 17.2,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -2054,14 +2054,14 @@
|
|||
"country": "Türkiye",
|
||||
"region": "Asia",
|
||||
"groups": 40,
|
||||
"no_resource": 2,
|
||||
"pop_no_resource": 1175000,
|
||||
"no_resource": 1,
|
||||
"pop_no_resource": 855000,
|
||||
"scripture": 35,
|
||||
"film": 37,
|
||||
"growing_unreached": 0,
|
||||
"deaths_day": 3.7,
|
||||
"growth": 0.23,
|
||||
"pct_no_resource": 5,
|
||||
"pct_no_resource": 2.5,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -2144,14 +2144,14 @@
|
|||
"country": "Philippines",
|
||||
"region": "Asia",
|
||||
"groups": 156,
|
||||
"no_resource": 28,
|
||||
"pop_no_resource": 4727275,
|
||||
"no_resource": 26,
|
||||
"pop_no_resource": 3398275,
|
||||
"scripture": 108,
|
||||
"film": 90,
|
||||
"growing_unreached": 0,
|
||||
"deaths_day": 0.2,
|
||||
"growth": 0.83,
|
||||
"pct_no_resource": 17.9,
|
||||
"pct_no_resource": 16.7,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -2264,14 +2264,14 @@
|
|||
"country": "United States of America",
|
||||
"region": "Americas",
|
||||
"groups": 623,
|
||||
"no_resource": 41,
|
||||
"pop_no_resource": 465640,
|
||||
"no_resource": 38,
|
||||
"pop_no_resource": 462510,
|
||||
"scripture": 517,
|
||||
"film": 549,
|
||||
"growing_unreached": 0,
|
||||
"deaths_day": 0.1,
|
||||
"growth": 0.96,
|
||||
"pct_no_resource": 6.6,
|
||||
"pct_no_resource": 6.1,
|
||||
"band": "partial"
|
||||
},
|
||||
{
|
||||
|
|
@ -2772,14 +2772,14 @@
|
|||
"country": "Singapore",
|
||||
"region": "Asia",
|
||||
"groups": 38,
|
||||
"no_resource": 3,
|
||||
"pop_no_resource": 237500,
|
||||
"no_resource": 2,
|
||||
"pop_no_resource": 218500,
|
||||
"scripture": 33,
|
||||
"film": 35,
|
||||
"growing_unreached": null,
|
||||
"deaths_day": null,
|
||||
"growth": null,
|
||||
"pct_no_resource": 7.9,
|
||||
"pct_no_resource": 5.3,
|
||||
"band": "partial",
|
||||
"from_pins_only": true
|
||||
},
|
||||
|
|
@ -2836,14 +2836,14 @@
|
|||
"country": "Ghana",
|
||||
"region": "Africa",
|
||||
"groups": 96,
|
||||
"no_resource": 15,
|
||||
"pop_no_resource": 2402300,
|
||||
"no_resource": 14,
|
||||
"pop_no_resource": 637300,
|
||||
"scripture": 71,
|
||||
"film": 70,
|
||||
"growing_unreached": null,
|
||||
"deaths_day": null,
|
||||
"growth": null,
|
||||
"pct_no_resource": 15.6,
|
||||
"pct_no_resource": 14.6,
|
||||
"band": "partial",
|
||||
"from_pins_only": true
|
||||
},
|
||||
|
|
@ -2868,14 +2868,14 @@
|
|||
"country": "Canada",
|
||||
"region": "Americas",
|
||||
"groups": 304,
|
||||
"no_resource": 18,
|
||||
"pop_no_resource": 183000,
|
||||
"no_resource": 16,
|
||||
"pop_no_resource": 157400,
|
||||
"scripture": 256,
|
||||
"film": 270,
|
||||
"growing_unreached": null,
|
||||
"deaths_day": null,
|
||||
"growth": null,
|
||||
"pct_no_resource": 5.9,
|
||||
"pct_no_resource": 5.3,
|
||||
"band": "partial",
|
||||
"from_pins_only": true
|
||||
},
|
||||
|
|
@ -2900,14 +2900,14 @@
|
|||
"country": "Switzerland",
|
||||
"region": "Europe",
|
||||
"groups": 13,
|
||||
"no_resource": 2,
|
||||
"pop_no_resource": 5612500,
|
||||
"no_resource": 1,
|
||||
"pop_no_resource": 92500,
|
||||
"scripture": 11,
|
||||
"film": 11,
|
||||
"growing_unreached": null,
|
||||
"deaths_day": null,
|
||||
"growth": null,
|
||||
"pct_no_resource": 15.4,
|
||||
"pct_no_resource": 7.7,
|
||||
"band": "partial",
|
||||
"from_pins_only": true
|
||||
},
|
||||
|
|
@ -3140,15 +3140,15 @@
|
|||
"country": "Trinidad and Tobago",
|
||||
"region": "Americas",
|
||||
"groups": 11,
|
||||
"no_resource": 4,
|
||||
"pop_no_resource": 388500,
|
||||
"no_resource": 2,
|
||||
"pop_no_resource": 176000,
|
||||
"scripture": 7,
|
||||
"film": 6,
|
||||
"growing_unreached": null,
|
||||
"deaths_day": null,
|
||||
"growth": null,
|
||||
"pct_no_resource": 36.4,
|
||||
"band": "high",
|
||||
"pct_no_resource": 18.2,
|
||||
"band": "partial",
|
||||
"from_pins_only": true
|
||||
},
|
||||
{
|
||||
|
|
@ -3156,14 +3156,14 @@
|
|||
"country": "Timor-Leste",
|
||||
"region": "Asia",
|
||||
"groups": 17,
|
||||
"no_resource": 13,
|
||||
"pop_no_resource": 704500,
|
||||
"no_resource": 12,
|
||||
"pop_no_resource": 448500,
|
||||
"scripture": 2,
|
||||
"film": 1,
|
||||
"growing_unreached": null,
|
||||
"deaths_day": null,
|
||||
"growth": null,
|
||||
"pct_no_resource": 76.5,
|
||||
"pct_no_resource": 70.6,
|
||||
"band": "critical",
|
||||
"from_pins_only": true
|
||||
},
|
||||
|
|
@ -3252,14 +3252,14 @@
|
|||
"country": "Italy",
|
||||
"region": "Europe",
|
||||
"groups": 38,
|
||||
"no_resource": 2,
|
||||
"pop_no_resource": 872000,
|
||||
"no_resource": 1,
|
||||
"pop_no_resource": 600000,
|
||||
"scripture": 30,
|
||||
"film": 36,
|
||||
"growing_unreached": null,
|
||||
"deaths_day": null,
|
||||
"growth": null,
|
||||
"pct_no_resource": 5.3,
|
||||
"pct_no_resource": 2.6,
|
||||
"band": "partial",
|
||||
"from_pins_only": true
|
||||
},
|
||||
|
|
@ -3364,15 +3364,15 @@
|
|||
"country": "Ukraine",
|
||||
"region": "Europe",
|
||||
"groups": 10,
|
||||
"no_resource": 1,
|
||||
"pop_no_resource": 334000,
|
||||
"no_resource": 0,
|
||||
"pop_no_resource": 0,
|
||||
"scripture": 8,
|
||||
"film": 9,
|
||||
"growing_unreached": null,
|
||||
"deaths_day": null,
|
||||
"growth": null,
|
||||
"pct_no_resource": 10,
|
||||
"band": "partial",
|
||||
"pct_no_resource": 0,
|
||||
"band": "covered",
|
||||
"from_pins_only": true
|
||||
},
|
||||
{
|
||||
|
|
@ -3412,14 +3412,14 @@
|
|||
"country": "Poland",
|
||||
"region": "Europe",
|
||||
"groups": 9,
|
||||
"no_resource": 2,
|
||||
"pop_no_resource": 394500,
|
||||
"no_resource": 1,
|
||||
"pop_no_resource": 384000,
|
||||
"scripture": 7,
|
||||
"film": 7,
|
||||
"growing_unreached": null,
|
||||
"deaths_day": null,
|
||||
"growth": null,
|
||||
"pct_no_resource": 22.2,
|
||||
"pct_no_resource": 11.1,
|
||||
"band": "partial",
|
||||
"from_pins_only": true
|
||||
},
|
||||
|
|
|
|||
2
public/doxa-maps/assets/tables/gospel-gaps.json
generated
2
public/doxa-maps/assets/tables/gospel-gaps.json
generated
File diff suppressed because one or more lines are too long
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"meta": {
|
||||
"title": "Gospel resource link verification",
|
||||
"generated": "2026-09-24T17:38:08.638Z",
|
||||
"generated": "2026-09-24T18:33:00.458Z",
|
||||
"method": "HEAD, redirects followed. verified = HTTP 200. broken = 404/410. unknown = unreachable, an ambiguous status, or a URL shape that cannot be checked by fetch.",
|
||||
"scope": "Every URL in data/tables/people-group-pins.json, deduplicated.",
|
||||
"states": {
|
||||
|
|
@ -86,12 +86,12 @@
|
|||
]
|
||||
},
|
||||
"summary": {
|
||||
"records": 7491,
|
||||
"checkedThisPass": 921,
|
||||
"records": 7565,
|
||||
"checkedThisPass": 74,
|
||||
"carriedForward": 74,
|
||||
"pruned": 0,
|
||||
"broken": 74,
|
||||
"verified": 7412,
|
||||
"verified": 7486,
|
||||
"unknown": 5
|
||||
},
|
||||
"byHost": {
|
||||
|
|
@ -130,6 +130,9 @@
|
|||
},
|
||||
"scriptureearth.org": {
|
||||
"verified": 921
|
||||
},
|
||||
"fivefish.org": {
|
||||
"verified": 74
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
@ -37588,6 +37591,376 @@
|
|||
"state": "verified",
|
||||
"detail": "HTTP 200",
|
||||
"at": "2026-09-24T17:38:08.356Z"
|
||||
},
|
||||
"https://fivefish.org/cpx": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/421?language=Chinese%2C%20Puxian)",
|
||||
"at": "2026-09-24T18:32:54.859Z"
|
||||
},
|
||||
"https://fivefish.org/dio": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/9250?language=Dibo)",
|
||||
"at": "2026-09-24T18:32:54.880Z"
|
||||
},
|
||||
"https://fivefish.org/xmc": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/13359?language=eMarrevoni)",
|
||||
"at": "2026-09-24T18:32:54.901Z"
|
||||
},
|
||||
"https://fivefish.org/buf": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1281?language=Bushongo)",
|
||||
"at": "2026-09-24T18:32:54.928Z"
|
||||
},
|
||||
"https://fivefish.org/njx": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/2864?language=Kikouni)",
|
||||
"at": "2026-09-24T18:32:54.954Z"
|
||||
},
|
||||
"https://fivefish.org/lej": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1526?language=Kilengola)",
|
||||
"at": "2026-09-24T18:32:54.967Z"
|
||||
},
|
||||
"https://fivefish.org/aba": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/2554?language=Abe)",
|
||||
"at": "2026-09-24T18:32:55.077Z"
|
||||
},
|
||||
"https://fivefish.org/gew": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/2003?language=Gyere)",
|
||||
"at": "2026-09-24T18:32:55.144Z"
|
||||
},
|
||||
"https://fivefish.org/sgd": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/279?language=Surigaonon)",
|
||||
"at": "2026-09-24T18:32:55.424Z"
|
||||
},
|
||||
"https://fivefish.org/nkw": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/94?language=Lonkutu)",
|
||||
"at": "2026-09-24T18:32:55.496Z"
|
||||
},
|
||||
"https://fivefish.org/brf": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/303?language=Kibira)",
|
||||
"at": "2026-09-24T18:32:55.538Z"
|
||||
},
|
||||
"https://fivefish.org/hmg": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/6168?language=Miao%2C%20Shai%20Lou%20Zhenningxian)",
|
||||
"at": "2026-09-24T18:32:55.554Z"
|
||||
},
|
||||
"https://fivefish.org/koo": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1101?language=Konzo)",
|
||||
"at": "2026-09-24T18:32:55.570Z"
|
||||
},
|
||||
"https://fivefish.org/bar": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/3202?language=Austrian%3A%20Tyrolean)",
|
||||
"at": "2026-09-24T18:32:55.595Z"
|
||||
},
|
||||
"https://fivefish.org/ish": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/2202?language=Ishan)",
|
||||
"at": "2026-09-24T18:32:55.709Z"
|
||||
},
|
||||
"https://fivefish.org/bli": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1856?language=Lolia)",
|
||||
"at": "2026-09-24T18:32:55.743Z"
|
||||
},
|
||||
"https://fivefish.org/bgx": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/7617?language=Balkan%20Gagauz%20Turkish%3A%20Yuruk)",
|
||||
"at": "2026-09-24T18:32:55.992Z"
|
||||
},
|
||||
"https://fivefish.org/ckl": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1777?language=Chibuku)",
|
||||
"at": "2026-09-24T18:32:56.011Z"
|
||||
},
|
||||
"https://fivefish.org/slx": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1275?language=Salampasu)",
|
||||
"at": "2026-09-24T18:32:56.047Z"
|
||||
},
|
||||
"https://fivefish.org/eto": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/9663?language=Eton)",
|
||||
"at": "2026-09-24T18:32:56.176Z"
|
||||
},
|
||||
"https://fivefish.org/mgm": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/4612?language=Mambae)",
|
||||
"at": "2026-09-24T18:32:56.190Z"
|
||||
},
|
||||
"https://fivefish.org/qxp": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/15876?language=Quechua%2C%20Puno)",
|
||||
"at": "2026-09-24T18:32:56.211Z"
|
||||
},
|
||||
"https://fivefish.org/bta": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/7843?language=Bata)",
|
||||
"at": "2026-09-24T18:32:56.297Z"
|
||||
},
|
||||
"https://fivefish.org/smm": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/14441?language=Musasa)",
|
||||
"at": "2026-09-24T18:32:56.422Z"
|
||||
},
|
||||
"https://fivefish.org/msi": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/13428?language=Malay%2C%20Sabah)",
|
||||
"at": "2026-09-24T18:32:56.569Z"
|
||||
},
|
||||
"https://fivefish.org/bpj": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1278?language=Bindji)",
|
||||
"at": "2026-09-24T18:32:56.636Z"
|
||||
},
|
||||
"https://fivefish.org/kqk": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/4888?language=Kotafon)",
|
||||
"at": "2026-09-24T18:32:56.656Z"
|
||||
},
|
||||
"https://fivefish.org/ttj": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/984?language=Tooro)",
|
||||
"at": "2026-09-24T18:32:56.747Z"
|
||||
},
|
||||
"https://fivefish.org/khc": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/17734?language=Tukangbesi%20North%3A%20Wanci)",
|
||||
"at": "2026-09-24T18:32:56.759Z"
|
||||
},
|
||||
"https://fivefish.org/bnx": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1353?language=Kibangubangu)",
|
||||
"at": "2026-09-24T18:32:56.906Z"
|
||||
},
|
||||
"https://fivefish.org/suj": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/4528?language=Kisubi)",
|
||||
"at": "2026-09-24T18:32:56.929Z"
|
||||
},
|
||||
"https://fivefish.org/mnp": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/507?language=Hockchia)",
|
||||
"at": "2026-09-24T18:32:56.958Z"
|
||||
},
|
||||
"https://fivefish.org/kel": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1309?language=Ikela)",
|
||||
"at": "2026-09-24T18:32:57.128Z"
|
||||
},
|
||||
"https://fivefish.org/czh": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/6237?language=Chinese%2C%20Huizhou)",
|
||||
"at": "2026-09-24T18:32:57.237Z"
|
||||
},
|
||||
"https://fivefish.org/rue": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/4289?language=Ruthenian)",
|
||||
"at": "2026-09-24T18:32:57.264Z"
|
||||
},
|
||||
"https://fivefish.org/nbm": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1384?language=Ngbaka%20Mabo)",
|
||||
"at": "2026-09-24T18:32:57.295Z"
|
||||
},
|
||||
"https://fivefish.org/zeh": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/5123?language=Zhuang%3A%20Guigang%20Guiping)",
|
||||
"at": "2026-09-24T18:32:57.316Z"
|
||||
},
|
||||
"https://fivefish.org/bqv": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/4543?language=Koro%20Wachi)",
|
||||
"at": "2026-09-24T18:32:57.639Z"
|
||||
},
|
||||
"https://fivefish.org/abr": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/6021?language=Abron)",
|
||||
"at": "2026-09-24T18:32:57.687Z"
|
||||
},
|
||||
"https://fivefish.org/nto": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1858?language=Ntomba)",
|
||||
"at": "2026-09-24T18:32:57.724Z"
|
||||
},
|
||||
"https://fivefish.org/rkm": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/3068?language=Maraka)",
|
||||
"at": "2026-09-24T18:32:57.732Z"
|
||||
},
|
||||
"https://fivefish.org/shc": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1593?language=Kilua-Kisonde)",
|
||||
"at": "2026-09-24T18:32:57.806Z"
|
||||
},
|
||||
"https://fivefish.org/trf": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/3495?language=Trinidadian%20English%20Creole)",
|
||||
"at": "2026-09-24T18:32:57.878Z"
|
||||
},
|
||||
"https://fivefish.org/daw": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/283?language=Davaweno)",
|
||||
"at": "2026-09-24T18:32:57.965Z"
|
||||
},
|
||||
"https://fivefish.org/mde": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/2971?language=Maba)",
|
||||
"at": "2026-09-24T18:32:58.215Z"
|
||||
},
|
||||
"https://fivefish.org/sip": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/678?language=Sikkimese)",
|
||||
"at": "2026-09-24T18:32:58.276Z"
|
||||
},
|
||||
"https://fivefish.org/tek": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/4529?language=Kiteke)",
|
||||
"at": "2026-09-24T18:32:58.311Z"
|
||||
},
|
||||
"https://fivefish.org/wof": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/4592?language=Wolof%2C%20Gambian)",
|
||||
"at": "2026-09-24T18:32:58.405Z"
|
||||
},
|
||||
"https://fivefish.org/jya": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/11143?language=Jiarong)",
|
||||
"at": "2026-09-24T18:32:58.428Z"
|
||||
},
|
||||
"https://fivefish.org/ndo": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1952?language=Ndonga)",
|
||||
"at": "2026-09-24T18:32:58.476Z"
|
||||
},
|
||||
"https://fivefish.org/xac": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/619?language=Bodo%3A%20Kachari)",
|
||||
"at": "2026-09-24T18:32:58.491Z"
|
||||
},
|
||||
"https://fivefish.org/rwk": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1065?language=Rwa)",
|
||||
"at": "2026-09-24T18:32:58.808Z"
|
||||
},
|
||||
"https://fivefish.org/bbp": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1742?language=Banda)",
|
||||
"at": "2026-09-24T18:32:58.818Z"
|
||||
},
|
||||
"https://fivefish.org/gsw": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/2909?language=German%2C%20Swiss%3A%20Basel)",
|
||||
"at": "2026-09-24T18:32:58.853Z"
|
||||
},
|
||||
"https://fivefish.org/bjo": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1495?language=Banda%2C%20Mid-Southern%3A%20Yakpa)",
|
||||
"at": "2026-09-24T18:32:58.951Z"
|
||||
},
|
||||
"https://fivefish.org/zag": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/2939?language=Zaghawa)",
|
||||
"at": "2026-09-24T18:32:59.067Z"
|
||||
},
|
||||
"https://fivefish.org/dse": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/19011?language=Sign%20Language%20of%20the%20Netherlands)",
|
||||
"at": "2026-09-24T18:32:59.114Z"
|
||||
},
|
||||
"https://fivefish.org/yix": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/4983?language=Axi)",
|
||||
"at": "2026-09-24T18:32:59.196Z"
|
||||
},
|
||||
"https://fivefish.org/pht": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1711?language=Phu%20Thai)",
|
||||
"at": "2026-09-24T18:32:59.278Z"
|
||||
},
|
||||
"https://fivefish.org/sjo": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/4943?language=Xibe)",
|
||||
"at": "2026-09-24T18:32:59.300Z"
|
||||
},
|
||||
"https://fivefish.org/fsl": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/19026?language=French%20Sign%20Language)",
|
||||
"at": "2026-09-24T18:32:59.368Z"
|
||||
},
|
||||
"https://fivefish.org/kfa": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/4078?language=Coorgi)",
|
||||
"at": "2026-09-24T18:32:59.516Z"
|
||||
},
|
||||
"https://fivefish.org/bdm": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1771?language=Buduma)",
|
||||
"at": "2026-09-24T18:32:59.578Z"
|
||||
},
|
||||
"https://fivefish.org/tma": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/3511?language=Tama)",
|
||||
"at": "2026-09-24T18:32:59.632Z"
|
||||
},
|
||||
"https://fivefish.org/avd": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/6913?language=Alviri)",
|
||||
"at": "2026-09-24T18:32:59.666Z"
|
||||
},
|
||||
"https://fivefish.org/gow": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1028?language=Fiome)",
|
||||
"at": "2026-09-24T18:32:59.818Z"
|
||||
},
|
||||
"https://fivefish.org/tyr": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/17053?language=Tai%20Daeng)",
|
||||
"at": "2026-09-24T18:32:59.831Z"
|
||||
},
|
||||
"https://fivefish.org/twm": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/14200?language=Monpa%2C%20Tawang)",
|
||||
"at": "2026-09-24T18:32:59.946Z"
|
||||
},
|
||||
"https://fivefish.org/wni": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/6031?language=Shindzwani)",
|
||||
"at": "2026-09-24T18:32:59.994Z"
|
||||
},
|
||||
"https://fivefish.org/mne": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/2966?language=Naba%3A%20Kouka)",
|
||||
"at": "2026-09-24T18:33:00.059Z"
|
||||
},
|
||||
"https://fivefish.org/hmb": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/4849?language=Songhay%2C%20Humburi%20Senni%3A%20Maranse)",
|
||||
"at": "2026-09-24T18:33:00.068Z"
|
||||
},
|
||||
"https://fivefish.org/rui": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/1067?language=Rufiji)",
|
||||
"at": "2026-09-24T18:33:00.101Z"
|
||||
},
|
||||
"https://fivefish.org/pks": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/19209?language=Pakistan%20Sign%20Language)",
|
||||
"at": "2026-09-24T18:33:00.233Z"
|
||||
},
|
||||
"https://fivefish.org/vmk": {
|
||||
"state": "verified",
|
||||
"detail": "HTTP 200 (via https://fivefish.org/13367?language=Exirima)",
|
||||
"at": "2026-09-24T18:33:00.244Z"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
413
public/doxa-maps/assets/tables/grn-index.json
generated
Normal file
413
public/doxa-maps/assets/tables/grn-index.json
generated
Normal file
|
|
@ -0,0 +1,413 @@
|
|||
{
|
||||
"source": "https://fivefish.org/<iso639-3> (5fish, Global Recordings Network)",
|
||||
"fetched": "2026-09-24",
|
||||
"_note": "GRN gospel AUDIO, typed as Gospel audio and never as Scripture — \"Words of Life\" is gospel messages and Bible stories, not a translation of the canon. The host never 404s: a nonsense path returns a geo-located page with HTTP 200, so existence is read from the page title, with a negative and a positive control run in band every time. Their robots.txt asks for Crawl-delay: 10 and this fetcher obeys it, sequentially.",
|
||||
"codes": 74,
|
||||
"decidedNone": 106,
|
||||
"byIso": {
|
||||
"mnp": {
|
||||
"u": "https://fivefish.org/mnp",
|
||||
"n": "Hockchia"
|
||||
},
|
||||
"pks": {
|
||||
"u": "https://fivefish.org/pks",
|
||||
"n": "Pakistan Sign Language"
|
||||
},
|
||||
"gsw": {
|
||||
"u": "https://fivefish.org/gsw",
|
||||
"n": "German, Swiss: Basel"
|
||||
},
|
||||
"czh": {
|
||||
"u": "https://fivefish.org/czh",
|
||||
"n": "Chinese, Huizhou"
|
||||
},
|
||||
"cpx": {
|
||||
"u": "https://fivefish.org/cpx",
|
||||
"n": "Chinese, Puxian"
|
||||
},
|
||||
"abr": {
|
||||
"u": "https://fivefish.org/abr",
|
||||
"n": "Abron"
|
||||
},
|
||||
"koo": {
|
||||
"u": "https://fivefish.org/koo",
|
||||
"n": "Konzo"
|
||||
},
|
||||
"ttj": {
|
||||
"u": "https://fivefish.org/ttj",
|
||||
"n": "Tooro"
|
||||
},
|
||||
"zeh": {
|
||||
"u": "https://fivefish.org/zeh",
|
||||
"n": "Zhuang: Guigang Guiping"
|
||||
},
|
||||
"sgd": {
|
||||
"u": "https://fivefish.org/sgd",
|
||||
"n": "Cantilangnon"
|
||||
},
|
||||
"fsl": {
|
||||
"u": "https://fivefish.org/fsl",
|
||||
"n": "French Sign Language"
|
||||
},
|
||||
"vmk": {
|
||||
"u": "https://fivefish.org/vmk",
|
||||
"n": "Exirima"
|
||||
},
|
||||
"kel": {
|
||||
"u": "https://fivefish.org/kel",
|
||||
"n": "Ikela"
|
||||
},
|
||||
"ndo": {
|
||||
"u": "https://fivefish.org/ndo",
|
||||
"n": "Ndonga"
|
||||
},
|
||||
"pht": {
|
||||
"u": "https://fivefish.org/pht",
|
||||
"n": "Phu Thai"
|
||||
},
|
||||
"xmc": {
|
||||
"u": "https://fivefish.org/xmc",
|
||||
"n": "eMarrevoni"
|
||||
},
|
||||
"mne": {
|
||||
"u": "https://fivefish.org/mne",
|
||||
"n": "Naba: Kouka"
|
||||
},
|
||||
"ish": {
|
||||
"u": "https://fivefish.org/ish",
|
||||
"n": "Ishan"
|
||||
},
|
||||
"msi": {
|
||||
"u": "https://fivefish.org/msi",
|
||||
"n": "Malay, Sabah"
|
||||
},
|
||||
"mde": {
|
||||
"u": "https://fivefish.org/mde",
|
||||
"n": "Maba"
|
||||
},
|
||||
"rui": {
|
||||
"u": "https://fivefish.org/rui",
|
||||
"n": "Rufiji"
|
||||
},
|
||||
"rkm": {
|
||||
"u": "https://fivefish.org/rkm",
|
||||
"n": "Maraka"
|
||||
},
|
||||
"zag": {
|
||||
"u": "https://fivefish.org/zag",
|
||||
"n": "Zaghawa"
|
||||
},
|
||||
"qxp": {
|
||||
"u": "https://fivefish.org/qxp",
|
||||
"n": "Quechua, Puno"
|
||||
},
|
||||
"gew": {
|
||||
"u": "https://fivefish.org/gew",
|
||||
"n": "Gyere"
|
||||
},
|
||||
"suj": {
|
||||
"u": "https://fivefish.org/suj",
|
||||
"n": "Kisubi"
|
||||
},
|
||||
"eto": {
|
||||
"u": "https://fivefish.org/eto",
|
||||
"n": "Eton"
|
||||
},
|
||||
"tek": {
|
||||
"u": "https://fivefish.org/tek",
|
||||
"n": "Kiteke"
|
||||
},
|
||||
"nto": {
|
||||
"u": "https://fivefish.org/nto",
|
||||
"n": "Ntomba"
|
||||
},
|
||||
"wni": {
|
||||
"u": "https://fivefish.org/wni",
|
||||
"n": "Shindzwani"
|
||||
},
|
||||
"nbm": {
|
||||
"u": "https://fivefish.org/nbm",
|
||||
"n": "Ngbaka Mabo"
|
||||
},
|
||||
"hmg": {
|
||||
"u": "https://fivefish.org/hmg",
|
||||
"n": "Miao, Shai Lou Zhenningxian"
|
||||
},
|
||||
"wof": {
|
||||
"u": "https://fivefish.org/wof",
|
||||
"n": "Wolof, Gambian"
|
||||
},
|
||||
"bnx": {
|
||||
"u": "https://fivefish.org/bnx",
|
||||
"n": "Kibangubangu"
|
||||
},
|
||||
"bpj": {
|
||||
"u": "https://fivefish.org/bpj",
|
||||
"n": "Bindji"
|
||||
},
|
||||
"bbp": {
|
||||
"u": "https://fivefish.org/bbp",
|
||||
"n": "Banda"
|
||||
},
|
||||
"bta": {
|
||||
"u": "https://fivefish.org/bta",
|
||||
"n": "Bata"
|
||||
},
|
||||
"aba": {
|
||||
"u": "https://fivefish.org/aba",
|
||||
"n": "Abbey"
|
||||
},
|
||||
"buf": {
|
||||
"u": "https://fivefish.org/buf",
|
||||
"n": "Bushongo"
|
||||
},
|
||||
"jya": {
|
||||
"u": "https://fivefish.org/jya",
|
||||
"n": "Jiarong"
|
||||
},
|
||||
"rue": {
|
||||
"u": "https://fivefish.org/rue",
|
||||
"n": "Ruthenian"
|
||||
},
|
||||
"brf": {
|
||||
"u": "https://fivefish.org/brf",
|
||||
"n": "Kibira"
|
||||
},
|
||||
"bgx": {
|
||||
"u": "https://fivefish.org/bgx",
|
||||
"n": "Balkan Gagauz Turkish: Yuruk"
|
||||
},
|
||||
"tma": {
|
||||
"u": "https://fivefish.org/tma",
|
||||
"n": "Tama"
|
||||
},
|
||||
"bar": {
|
||||
"u": "https://fivefish.org/bar",
|
||||
"n": "Austrian: Tyrolean"
|
||||
},
|
||||
"sip": {
|
||||
"u": "https://fivefish.org/sip",
|
||||
"n": "Sikkimese"
|
||||
},
|
||||
"rwk": {
|
||||
"u": "https://fivefish.org/rwk",
|
||||
"n": "Rwa"
|
||||
},
|
||||
"slx": {
|
||||
"u": "https://fivefish.org/slx",
|
||||
"n": "Salampasu"
|
||||
},
|
||||
"hmb": {
|
||||
"u": "https://fivefish.org/hmb",
|
||||
"n": "Songhay, Humburi Senni: Maranse"
|
||||
},
|
||||
"dio": {
|
||||
"u": "https://fivefish.org/dio",
|
||||
"n": "Dibo"
|
||||
},
|
||||
"mgm": {
|
||||
"u": "https://fivefish.org/mgm",
|
||||
"n": "Mambae"
|
||||
},
|
||||
"lej": {
|
||||
"u": "https://fivefish.org/lej",
|
||||
"n": "Kilengola"
|
||||
},
|
||||
"bli": {
|
||||
"u": "https://fivefish.org/bli",
|
||||
"n": "Lolia"
|
||||
},
|
||||
"ckl": {
|
||||
"u": "https://fivefish.org/ckl",
|
||||
"n": "Chibuku"
|
||||
},
|
||||
"nkw": {
|
||||
"u": "https://fivefish.org/nkw",
|
||||
"n": "Lonkutu"
|
||||
},
|
||||
"tyr": {
|
||||
"u": "https://fivefish.org/tyr",
|
||||
"n": "Tai Daeng"
|
||||
},
|
||||
"smm": {
|
||||
"u": "https://fivefish.org/smm",
|
||||
"n": "Musasa"
|
||||
},
|
||||
"kqk": {
|
||||
"u": "https://fivefish.org/kqk",
|
||||
"n": "Kotafon"
|
||||
},
|
||||
"trf": {
|
||||
"u": "https://fivefish.org/trf",
|
||||
"n": "Trinidadian English Creole"
|
||||
},
|
||||
"shc": {
|
||||
"u": "https://fivefish.org/shc",
|
||||
"n": "Kilua-Kisonde"
|
||||
},
|
||||
"xac": {
|
||||
"u": "https://fivefish.org/xac",
|
||||
"n": "Bodo: Kachari"
|
||||
},
|
||||
"kfa": {
|
||||
"u": "https://fivefish.org/kfa",
|
||||
"n": "Coorgi"
|
||||
},
|
||||
"twm": {
|
||||
"u": "https://fivefish.org/twm",
|
||||
"n": "Monpa, Tawang"
|
||||
},
|
||||
"bjo": {
|
||||
"u": "https://fivefish.org/bjo",
|
||||
"n": "Banda, Mid-Southern: Yakpa"
|
||||
},
|
||||
"bdm": {
|
||||
"u": "https://fivefish.org/bdm",
|
||||
"n": "Buduma"
|
||||
},
|
||||
"daw": {
|
||||
"u": "https://fivefish.org/daw",
|
||||
"n": "Davawenyo"
|
||||
},
|
||||
"sjo": {
|
||||
"u": "https://fivefish.org/sjo",
|
||||
"n": "Xibe"
|
||||
},
|
||||
"gow": {
|
||||
"u": "https://fivefish.org/gow",
|
||||
"n": "Fiome"
|
||||
},
|
||||
"avd": {
|
||||
"u": "https://fivefish.org/avd",
|
||||
"n": "Alviri"
|
||||
},
|
||||
"dse": {
|
||||
"u": "https://fivefish.org/dse",
|
||||
"n": "Sign Language of the Netherlands"
|
||||
},
|
||||
"yix": {
|
||||
"u": "https://fivefish.org/yix",
|
||||
"n": "Axi"
|
||||
},
|
||||
"bqv": {
|
||||
"u": "https://fivefish.org/bqv",
|
||||
"n": "Koro Wachi"
|
||||
},
|
||||
"njx": {
|
||||
"u": "https://fivefish.org/njx",
|
||||
"n": "Kikouni"
|
||||
},
|
||||
"khc": {
|
||||
"u": "https://fivefish.org/khc",
|
||||
"n": "Tukangbesi North: Wanci"
|
||||
}
|
||||
},
|
||||
"none": [
|
||||
"cjy",
|
||||
"gan",
|
||||
"csl",
|
||||
"inl",
|
||||
"ayh",
|
||||
"mmr",
|
||||
"nsi",
|
||||
"zlj",
|
||||
"acx",
|
||||
"nos",
|
||||
"qcd",
|
||||
"zgb",
|
||||
"eth",
|
||||
"esl",
|
||||
"psp",
|
||||
"cps",
|
||||
"czo",
|
||||
"tsm",
|
||||
"hab",
|
||||
"abv",
|
||||
"gsg",
|
||||
"bfi",
|
||||
"now",
|
||||
"zmi",
|
||||
"thz",
|
||||
"auh",
|
||||
"tsq",
|
||||
"mfu",
|
||||
"fia",
|
||||
"ise",
|
||||
"sfs",
|
||||
"aju",
|
||||
"ssp",
|
||||
"mhm",
|
||||
"suw",
|
||||
"ysm",
|
||||
"bww",
|
||||
"asp",
|
||||
"vic",
|
||||
"aed",
|
||||
"qns",
|
||||
"han",
|
||||
"qiq",
|
||||
"mry",
|
||||
"kxd",
|
||||
"afg",
|
||||
"fmp",
|
||||
"bah",
|
||||
"ugn",
|
||||
"wxa",
|
||||
"phu",
|
||||
"pso",
|
||||
"xms",
|
||||
"mlm",
|
||||
"hmh",
|
||||
"zlq",
|
||||
"kdg",
|
||||
"sdl",
|
||||
"nsp",
|
||||
"shz",
|
||||
"diz",
|
||||
"sjg",
|
||||
"tza",
|
||||
"zhk",
|
||||
"prl",
|
||||
"gex",
|
||||
"xml",
|
||||
"noq",
|
||||
"ypg",
|
||||
"jbn",
|
||||
"mzc",
|
||||
"vsl",
|
||||
"qry",
|
||||
"gse",
|
||||
"ras",
|
||||
"mny",
|
||||
"soe",
|
||||
"hnm",
|
||||
"qkp",
|
||||
"amj",
|
||||
"btw",
|
||||
"ayc",
|
||||
"qbf",
|
||||
"bog",
|
||||
"xki",
|
||||
"cri",
|
||||
"sbm",
|
||||
"kiv",
|
||||
"tiz",
|
||||
"kwl",
|
||||
"grj",
|
||||
"gdq",
|
||||
"qsg",
|
||||
"qso",
|
||||
"lws",
|
||||
"bpd",
|
||||
"dec",
|
||||
"lap",
|
||||
"gsm",
|
||||
"cds",
|
||||
"tor",
|
||||
"csg",
|
||||
"dux",
|
||||
"ajz",
|
||||
"mdi",
|
||||
"psi"
|
||||
]
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -26,7 +26,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
|
||||
<script src="../gospel-resources.js" integrity="sha384-DLpCR/4TKWn/tY/3M4MYKfBcueIKSL1WhSTGSWs49t6raFYF5vJit++4TpmCdNJ2" crossorigin="anonymous"></script>
|
||||
<script src="../gospel-resources.js" integrity="sha384-uMCRwdkQhMDk/yyoDE+EaQyScTVu6VxHZ4Zkufh/MZvzsOhz8L5eCsvsAKzc2RqL" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
|
||||
<script src="../gospel-resources.js" integrity="sha384-DLpCR/4TKWn/tY/3M4MYKfBcueIKSL1WhSTGSWs49t6raFYF5vJit++4TpmCdNJ2" crossorigin="anonymous"></script>
|
||||
<script src="../gospel-resources.js" integrity="sha384-uMCRwdkQhMDk/yyoDE+EaQyScTVu6VxHZ4Zkufh/MZvzsOhz8L5eCsvsAKzc2RqL" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
|
||||
<script src="../gospel-resources.js" integrity="sha384-DLpCR/4TKWn/tY/3M4MYKfBcueIKSL1WhSTGSWs49t6raFYF5vJit++4TpmCdNJ2" crossorigin="anonymous"></script>
|
||||
<script src="../gospel-resources.js" integrity="sha384-uMCRwdkQhMDk/yyoDE+EaQyScTVu6VxHZ4Zkufh/MZvzsOhz8L5eCsvsAKzc2RqL" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -26,7 +26,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
|
||||
<script src="../gospel-resources.js" integrity="sha384-DLpCR/4TKWn/tY/3M4MYKfBcueIKSL1WhSTGSWs49t6raFYF5vJit++4TpmCdNJ2" crossorigin="anonymous"></script>
|
||||
<script src="../gospel-resources.js" integrity="sha384-uMCRwdkQhMDk/yyoDE+EaQyScTVu6VxHZ4Zkufh/MZvzsOhz8L5eCsvsAKzc2RqL" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@
|
|||
|
||||
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
|
||||
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
|
||||
<script src="../gospel-resources.js" integrity="sha384-DLpCR/4TKWn/tY/3M4MYKfBcueIKSL1WhSTGSWs49t6raFYF5vJit++4TpmCdNJ2" crossorigin="anonymous"></script>
|
||||
<script src="../gospel-resources.js" integrity="sha384-uMCRwdkQhMDk/yyoDE+EaQyScTVu6VxHZ4Zkufh/MZvzsOhz8L5eCsvsAKzc2RqL" crossorigin="anonymous"></script>
|
||||
|
||||
<script>
|
||||
// Mapbox token resolution — the A3 ladder, in precedence order:
|
||||
|
|
|
|||
2
public/doxa-maps/index.html
generated
2
public/doxa-maps/index.html
generated
File diff suppressed because one or more lines are too long
12
public/doxa-maps/manifest.json
generated
12
public/doxa-maps/manifest.json
generated
|
|
@ -591,7 +591,7 @@
|
|||
"bundle": "gospel-resources",
|
||||
"scriptUrl": "./gospel-resources/gospel-resources.js",
|
||||
"output": "doxa-maps/gospel-resources/gospel-resources.js",
|
||||
"integrity": "sha384-DLpCR/4TKWn/tY/3M4MYKfBcueIKSL1WhSTGSWs49t6raFYF5vJit++4TpmCdNJ2",
|
||||
"integrity": "sha384-uMCRwdkQhMDk/yyoDE+EaQyScTVu6VxHZ4Zkufh/MZvzsOhz8L5eCsvsAKzc2RqL",
|
||||
"elements": [
|
||||
"gospel-resources-map"
|
||||
],
|
||||
|
|
@ -611,7 +611,7 @@
|
|||
"scriptUrl": "./gospel-resources/gospel-resources.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./gospel-resources/charts/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-DLpCR/4TKWn/tY/3M4MYKfBcueIKSL1WhSTGSWs49t6raFYF5vJit++4TpmCdNJ2\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"charts\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-uMCRwdkQhMDk/yyoDE+EaQyScTVu6VxHZ4Zkufh/MZvzsOhz8L5eCsvsAKzc2RqL\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"charts\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -625,7 +625,7 @@
|
|||
"scriptUrl": "./gospel-resources/gospel-resources.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./gospel-resources/data-tables/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-DLpCR/4TKWn/tY/3M4MYKfBcueIKSL1WhSTGSWs49t6raFYF5vJit++4TpmCdNJ2\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-uMCRwdkQhMDk/yyoDE+EaQyScTVu6VxHZ4Zkufh/MZvzsOhz8L5eCsvsAKzc2RqL\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -639,7 +639,7 @@
|
|||
"scriptUrl": "./gospel-resources/gospel-resources.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./gospel-resources/gospel-dashboard/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-DLpCR/4TKWn/tY/3M4MYKfBcueIKSL1WhSTGSWs49t6raFYF5vJit++4TpmCdNJ2\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"gospel-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-uMCRwdkQhMDk/yyoDE+EaQyScTVu6VxHZ4Zkufh/MZvzsOhz8L5eCsvsAKzc2RqL\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"gospel-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -653,7 +653,7 @@
|
|||
"scriptUrl": "./gospel-resources/gospel-resources.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./gospel-resources/resources-list/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-DLpCR/4TKWn/tY/3M4MYKfBcueIKSL1WhSTGSWs49t6raFYF5vJit++4TpmCdNJ2\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-uMCRwdkQhMDk/yyoDE+EaQyScTVu6VxHZ4Zkufh/MZvzsOhz8L5eCsvsAKzc2RqL\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
@ -667,7 +667,7 @@
|
|||
"scriptUrl": "./gospel-resources/gospel-resources.js",
|
||||
"embed": {
|
||||
"iframe": "<iframe src=\"./gospel-resources/resources-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-DLpCR/4TKWn/tY/3M4MYKfBcueIKSL1WhSTGSWs49t6raFYF5vJit++4TpmCdNJ2\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-uMCRwdkQhMDk/yyoDE+EaQyScTVu6VxHZ4Zkufh/MZvzsOhz8L5eCsvsAKzc2RqL\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
|
|||
Loading…
Reference in a new issue