AuraGem Servers > Commit [74939b2]
Fri March 1, 2024 7:28 PM -0600
Update SIS, move scriptures into scholasticdiversity. gemini/devlog.go | 4 ++-- gemini/gemini.go | 156 ++++++++++++++++++++++++++++------------------------- gemini/search/db.go | 40 ++++++++++++++++++++-------------------- gemini/search/feedback.go | 6 +++--- gemini/search/search.go | 31 +++++++++---------------------- gemini/search/types.go | 98 +++-------------------------------------------------- gemini/textola/textola.go | 69 +++++++++++++++++++++++++++++++++++++++++++++++------ gemini/textola/the_cask_of_amontillado.txt | 90 ----------------------------------------------------- gemini/texts/christianity/christianity.go | 46 +++++++++++++++++++++++----------------------- gemini/texts/islam/islam.go | 30 +++++++++++++++--------------- gemini/texts/judaism/judaism.go | 30 +++++++++++++++--------------- gemini/texts/texts.go | 8 ++++---- gemini/youtube/utils.go | 3 ++- go.mod | 4 ++-- go.sum | 26 ++++++++------------------
Commit Hash: 74939b2577d210fd31757966942f0377aef35ae3
Tree Hash: a902d382d0f4f67674e23dcfb9863eeef0a41627
Date: 2024-03-01T19:28:18-06:00
Changes
gemini/devlog.go
... | ...
3 | import (
4 | utils "gitlab.com/clseibold/auragem_sis/gemini/utils"
5 | sis "gitlab.com/clseibold/smallnetinformationservices"
6 | )
7 |
- 8 | func handleDevlog(g sis.ServerHandle) {
+ 8 | func handleDevlog(s sis.ServerHandle) {
9 | /*g.AddRoute("/~krixano/gemlog/atom.xml", func(request sis.Request) {
10 | // c.NoContent(gig.StatusRedirectTemporary, "/devlog/atom.xml")
11 | request.TextWithMimetype("text/xml", generateAtomFrom("SIS/gemini/devlog/index.gmi", "gemini://auragem.letz.dev", "gemini://auragem.letz.dev/devlog", "Christian \"Krixano\" Seibold", "christian.seibold32@outlook.com"))
12 | })*/
13 |
... | ...
9 | /*g.AddRoute("/~krixano/gemlog/atom.xml", func(request sis.Request) {
10 | // c.NoContent(gig.StatusRedirectTemporary, "/devlog/atom.xml")
11 | request.TextWithMimetype("text/xml", generateAtomFrom("SIS/gemini/devlog/index.gmi", "gemini://auragem.letz.dev", "gemini://auragem.letz.dev/devlog", "Christian \"Krixano\" Seibold", "christian.seibold32@outlook.com"))
12 | })*/
13 |
- 14 | g.AddRoute("/devlog/atom.xml", func(request sis.Request) {
+ 14 | s.AddRoute("/devlog/atom.xml", func(request sis.Request) {
15 | request.TextWithMimetype("text/xml", utils.GenerateAtomFrom("SIS/auragem_gemini/devlog/index.gmi", "gemini://auragem.letz.dev", "gemini://auragem.letz.dev/devlog", "Christian \"Krixano\" Seibold", "krixano@protonmail.com"))
16 | })
17 | }
gemini/gemini.go
... | ...
2 | package gemini
3 |
4 | import (
5 | // "io"
6 |
7 | "fmt"
+ 7 | "net/url"
7 | "strings"
8 | "unicode"
9 | "unicode/utf8"
10 |
11 | "github.com/spf13/cobra"
... | ...
25 | "gitlab.com/clseibold/auragem_sis/starwars"
26 | "gitlab.com/clseibold/auragem_sis/twitch"*/)
27 |
28 | var GeminiCommand = &cobra.Command{
29 | Short: "Start SIS",
- 30 | Run: func(cmd *cobra.Command, args []string) {
- 31 | //f, _ := os.Create("access.log")
- 32 | //gig.DefaultWriter = io.MultiWriter(f, os.Stdout)
+ 31 | Run: RunServer,
+ 32 | }
33 |
... | ...
29 |
- 34 | context, err := sis.InitSIS("./SIS/")
- 35 | context.AdminServer().BindAddress = "0.0.0.0"
- 36 | context.AdminServer().Hostname = "auragem.letz.dev"
- 37 | context.AdminServer().AddCertificate("auragem.pem")
- 38 | context.SaveConfiguration()
- 39 | context.GetPortListener("0.0.0.0", "1995").AddCertificate("auragem.letz.dev", "auragem.pem")
- 40 | if err != nil {
- 41 | panic(err)
- 42 | }
+ 34 | func RunServer(cmd *cobra.Command, args []string) {
+ 35 | //f, _ := os.Create("access.log")
+ 36 | //gig.DefaultWriter = io.MultiWriter(f, os.Stdout)
43 |
... | ...
39 |
- 44 | // ----- AuraGem Servers -----
+ 38 | context, err := sis.InitSIS("./SIS/")
+ 39 | context.AdminServer().BindAddress = "0.0.0.0"
+ 40 | context.AdminServer().Hostname = "auragem.letz.dev"
+ 41 | context.AdminServer().AddCertificate("auragem.pem")
+ 42 | context.SaveConfiguration()
+ 43 | context.GetPortListener("0.0.0.0", "1995").AddCertificate("auragem.letz.dev", "auragem.pem")
+ 44 | if err != nil {
+ 45 | panic(err)
+ 46 | }
45 |
... | ...
41 |
- 46 | // TODO: Pointers are not stable! Use a new ServerID struct with methods instead.
- 47 | geminiServer := context.AddServer(sis.Server{Type: sis.ServerType_Gemini, Name: "auragem_gemini", Hostname: "auragem.letz.dev"})
- 48 | geminiServer.AddCertificate("auragem.pem")
- 49 | context.GetPortListener("0.0.0.0", "1965").AddCertificate("auragem.letz.dev", "auragem.pem")
+ 48 | // ----- AuraGem Servers -----
50 |
... | ...
46 |
- 51 | geminiServer.AddDirectory("/*", "./")
- 52 | geminiServer.AddFile("/.well-known/security.txt", "./security.txt")
- 53 | geminiServer.AddProxyRoute("/nex/*", "$auragem_nex/*", '1')
+ 50 | // TODO: Pointers are not stable! Use a new ServerID struct with methods instead.
+ 51 | geminiServer := context.AddServer(sis.Server{Type: sis.ServerType_Gemini, Name: "auragem_gemini", Hostname: "auragem.letz.dev"})
+ 52 | geminiServer.AddCertificate("auragem.pem")
+ 53 | context.GetPortListener("0.0.0.0", "1965").AddCertificate("auragem.letz.dev", "auragem.pem")
54 |
... | ...
50 |
- 55 | // Guestbook via Titan
- 56 | geminiServer.AddUploadRoute("/guestbook.gmi", handleGuestbook)
+ 55 | geminiServer.AddDirectory("/*", "./")
+ 56 | geminiServer.AddFile("/.well-known/security.txt", "./security.txt")
+ 57 | geminiServer.AddProxyRoute("/nex/*", "$auragem_nex/*", '1')
57 |
... | ...
53 |
- 58 | handleDevlog(geminiServer)
- 59 | youtube.HandleYoutube(geminiServer)
- 60 | handleWeather(geminiServer)
- 61 | handleGithub(geminiServer)
- 62 | texts.HandleTexts(geminiServer)
- 63 | textgame.HandleTextGame(geminiServer)
- 64 | chat.HandleChat(geminiServer)
- 65 | textola.HandleTextola(geminiServer)
- 66 | music.HandleMusic(geminiServer)
- 67 | search.HandleSearchEngine(geminiServer)
- 68 | // twitch.HandleTwitch(geminiServer)
- 69 | // ask.HandleAsk(geminiServer)
+ 59 | // Guestbook via Titan
+ 60 | geminiServer.AddUploadRoute("/guestbook.gmi", handleGuestbook)
70 |
... | ...
66 |
- 71 | nexServer := context.AddServer(sis.Server{Type: sis.ServerType_Nex, Name: "auragem_nex", Hostname: "auragem.letz.dev"})
- 72 | nexServer.AddDirectory("/*", "./")
- 73 | nexServer.AddProxyRoute("/gemini/*", "$auragem_gemini/*", '1')
- 74 | nexServer.AddProxyRoute("/scholasticdiversity/*", "$scholasticdiversity_gemini/*", '1')
+ 62 | handleDevlog(geminiServer)
+ 63 | youtube.HandleYoutube(geminiServer)
+ 64 | handleWeather(geminiServer)
+ 65 | handleGithub(geminiServer)
+ 66 | textgame.HandleTextGame(geminiServer)
+ 67 | chat.HandleChat(geminiServer)
+ 68 | textola.HandleTextola(geminiServer)
+ 69 | music.HandleMusic(geminiServer)
+ 70 | search.HandleSearchEngine(geminiServer)
+ 71 | // twitch.HandleTwitch(geminiServer)
+ 72 | // ask.HandleAsk(geminiServer)
75 |
... | ...
71 |
- 76 | // ----- Scholastic Diversity stuff -----
- 77 | scholasticdiversity_gemini := context.AddServer(sis.Server{Type: sis.ServerType_Gemini, Name: "scholasticdiversity_gemini", Hostname: "scholasticdiversity.us.to"})
- 78 | scholasticdiversity_gemini.AddCertificate("scholasticdiversity.pem")
- 79 | context.GetPortListener("0.0.0.0", "1965").AddCertificate("scholasticdiversity.us.to", "scholasticdiversity.pem")
- 80 | scholasticdiversity_gemini.AddDirectory("/*", "./")
+ 74 | nexServer := context.AddServer(sis.Server{Type: sis.ServerType_Nex, Name: "auragem_nex", Hostname: "auragem.letz.dev"})
+ 75 | nexServer.AddDirectory("/*", "./")
+ 76 | nexServer.AddProxyRoute("/gemini/*", "$auragem_gemini/*", '1')
+ 77 | nexServer.AddProxyRoute("/scholasticdiversity/*", "$scholasticdiversity_gemini/*", '1')
81 |
... | ...
77 |
- 82 | gopherServer := context.AddServer(sis.Server{Type: sis.ServerType_Gopher, Name: "gopher", Hostname: "auragem.letz.dev"})
- 83 | gopherServer.AddRoute("/*", func(request sis.Request) {
- 84 | request.GophermapLine("i", " AuraGem Gopher Server", "", request.Hostname(), request.Server.Port)
- 85 | request.GophermapLine("1", "Devlog", "/devlog/", request.Hostname(), request.Server.Port)
- 86 | request.GophermapLine("1", "Personal Log", "/~clseibold/", request.Hostname(), request.Server.Port)
- 87 | request.GophermapLine("1", "Scholastic Diversity", "/scholasticdiversity/", request.Hostname(), request.Server.Port)
- 88 | request.GophermapLine("i", "", "", request.Hostname(), request.Server.Port)
- 89 | request.GophermapLine("i", "Software", "", request.Hostname(), request.Server.Port)
- 90 | request.GophermapLine("i", "--------", "", request.Hostname(), request.Server.Port)
- 91 | request.GophermapLine("1", "Misfin-Server", "/misfin-server/", request.Hostname(), request.Server.Port)
- 92 | request.GophermapLine("i", "", "", request.Hostname(), request.Server.Port)
- 93 | request.GophermapLine("i", "Other", "", request.Hostname(), request.Server.Port)
- 94 | request.GophermapLine("i", "-----", "", request.Hostname(), request.Server.Port)
- 95 | request.GophermapLine("h", "AuraGem Gemini Server", "URL:gemini://auragem.letz.dev", request.Hostname(), request.Server.Port)
- 96 | request.GophermapLine("h", "AuraGem Nex Server", "URL:nex://auragem.letz.dev", request.Hostname(), request.Server.Port)
- 97 | request.GophermapLine("h", "Scholastic Diversity Gemini Server", "URL:gemini://auragem.letz.dev", request.Hostname(), request.Server.Port)
- 98 | })
- 99 | gopherServer.AddProxyRoute("/scholasticdiversity/*", "$scholasticdiversity_gemini/*", '1')
- 100 | gopherServer.AddProxyRoute("/devlog/*", "$auragem_gemini/devlog/*", '1')
- 101 | gopherServer.AddProxyRoute("/~clseibold/*", "$auragem_gemini/~clseibold/*", '1')
- 102 | gopherServer.AddProxyRoute("/misfin-server/*", "$auragem_gemini/misfin-server/*", '1')
+ 79 | // ----- Scholastic Diversity stuff -----
+ 80 | scholasticdiversity_gemini := context.AddServer(sis.Server{Type: sis.ServerType_Gemini, Name: "scholasticdiversity_gemini", Hostname: "scholasticdiversity.us.to"})
+ 81 | scholasticdiversity_gemini.AddCertificate("scholasticdiversity.pem")
+ 82 | context.GetPortListener("0.0.0.0", "1965").AddCertificate("scholasticdiversity.us.to", "scholasticdiversity.pem")
+ 83 | scholasticdiversity_gemini.AddDirectory("/*", "./")
103 |
... | ...
99 |
- 104 | // Proxy public_radio stuff to gopherserver
- 105 | gopherServer.AddProxyRoute("/public_radio/", "$auragem_gemini/music/public_radio/", '1')
- 106 | gopherServer.AddProxyRoute("/public_radio/:station_name", "$auragem_gemini/music/public_radio/$station_name", '1')
- 107 | gopherServer.AddProxyRoute("/public_radio/:station_name/schedule_feed", "$auragem_gemini/public_radio/$station_name/schedule_feed", '1')
- 108 | gopherServer.AddProxyRoute("/stream/public_radio/:station_name.mp3", "$auragem_gemini/stream/public_radio/$station_name.mp3", 's')
+ 85 | texts.HandleTexts(scholasticdiversity_gemini)
+ 86 | // Add "/texts/" redirect from auragem gemini server to scholastic diversity gemini server
+ 87 | geminiServer.AddRoute("/texts/*", func(request sis.Request) {
+ 88 | request.Redirect("gemini://scholasticdiversity.us.to/texts/%s", url.PathEscape(request.GlobString))
+ 89 | })
109 |
... | ...
105 |
- 110 | context.Start()
- 111 | },
+ 91 | gopherServer := context.AddServer(sis.Server{Type: sis.ServerType_Gopher, Name: "gopher", Hostname: "auragem.letz.dev"})
+ 92 | gopherServer.AddRoute("/*", func(request sis.Request) {
+ 93 | request.GophermapLine("i", " AuraGem Gopher Server", "", request.Hostname(), request.Server.Port())
+ 94 | request.GophermapLine("1", "Devlog", "/devlog/", request.Hostname(), request.Server.Port())
+ 95 | request.GophermapLine("1", "Personal Log", "/~clseibold/", request.Hostname(), request.Server.Port())
+ 96 | request.GophermapLine("1", "Scholastic Diversity", "/scholasticdiversity/", request.Hostname(), request.Server.Port())
+ 97 | request.GophermapLine("i", "", "", request.Hostname(), request.Server.Port())
+ 98 | request.GophermapLine("i", "Software", "", request.Hostname(), request.Server.Port())
+ 99 | request.GophermapLine("i", "--------", "", request.Hostname(), request.Server.Port())
+ 100 | request.GophermapLine("1", "Misfin-Server", "/misfin-server/", request.Hostname(), request.Server.Port())
+ 101 | request.GophermapLine("i", "", "", request.Hostname(), request.Server.Port())
+ 102 | request.GophermapLine("i", "Other", "", request.Hostname(), request.Server.Port())
+ 103 | request.GophermapLine("i", "-----", "", request.Hostname(), request.Server.Port())
+ 104 | request.GophermapLine("h", "AuraGem Gemini Server", "URL:gemini://auragem.letz.dev", request.Hostname(), request.Server.Port())
+ 105 | request.GophermapLine("h", "AuraGem Nex Server", "URL:nex://auragem.letz.dev", request.Hostname(), request.Server.Port())
+ 106 | request.GophermapLine("h", "Scholastic Diversity Gemini Server", "URL:gemini://auragem.letz.dev", request.Hostname(), request.Server.Port())
+ 107 | })
+ 108 | gopherServer.AddProxyRoute("/scholasticdiversity/*", "$scholasticdiversity_gemini/*", '1')
+ 109 | gopherServer.AddProxyRoute("/devlog/*", "$auragem_gemini/devlog/*", '1')
+ 110 | gopherServer.AddProxyRoute("/~clseibold/*", "$auragem_gemini/~clseibold/*", '1')
+ 111 | gopherServer.AddProxyRoute("/misfin-server/*", "$auragem_gemini/misfin-server/*", '1')
+ 112 |
+ 113 | // Proxy public_radio stuff to gopherserver
+ 114 | gopherServer.AddProxyRoute("/public_radio/", "$auragem_gemini/music/public_radio/", '1')
+ 115 | gopherServer.AddProxyRoute("/public_radio/:station_name", "$auragem_gemini/music/public_radio/$station_name", '1')
+ 116 | gopherServer.AddProxyRoute("/public_radio/:station_name/schedule_feed", "$auragem_gemini/public_radio/$station_name/schedule_feed", '1')
+ 117 | gopherServer.AddProxyRoute("/stream/public_radio/:station_name.mp3", "$auragem_gemini/stream/public_radio/$station_name.mp3", 's')
+ 118 |
+ 119 | context.Start()
112 | }
113 |
114 | func handleGuestbook(request sis.Request) {
115 | guestbookPrefix := `# AuraGem Guestbook
116 |
... | ...
152 | request.TemporaryFailure("You edited the start of the document above \"---\". Your edit is rejected.")
153 | return
154 | //return c.NoContent(gig.StatusPermanentFailure, "You edited the start of the document above \"---\". Your edit is rejected.")
155 | }
156 |
- 157 | fileBefore, _ := request.Server.FS.ReadFile("guestbook.gmi")
+ 165 | fileBefore, _ := request.Server.FS().ReadFile("guestbook.gmi")
158 | //fileBefore, _ := os.ReadFile(filepath.Join(request.Server.Directory, "gemini", "guestbook.gmi"))
159 | if !strings.HasPrefix(string(data), string(fileBefore)) {
160 | request.TemporaryFailure("You edited a portion of the document that already existed. Only appends are allowed. Your edit is rejected.")
161 | return
162 | //return c.NoContent(gig.StatusPermanentFailure, "You edited a portion of the document that already existed. Only appends are allowed. Your edit is rejected.")
... | ...
160 | request.TemporaryFailure("You edited a portion of the document that already existed. Only appends are allowed. Your edit is rejected.")
161 | return
162 | //return c.NoContent(gig.StatusPermanentFailure, "You edited a portion of the document that already existed. Only appends are allowed. Your edit is rejected.")
163 | }
164 |
- 165 | err := request.Server.FS.WriteFile("guestbook.gmi", data, 0644)
+ 173 | err := request.Server.FS().WriteFile("guestbook.gmi", data, 0644)
166 | //err := os.WriteFile(filepath.Join(request.Server.Directory, "gemini", "guestbook.gmi"), data, 0644)
167 | if err != nil {
168 | fmt.Printf("Write failed: %s\n", err.Error())
169 | return
170 | //return err
... | ...
167 | if err != nil {
168 | fmt.Printf("Write failed: %s\n", err.Error())
169 | return
170 | //return err
171 | }
- 172 | request.Redirect("gemini://%s:%s/guestbook.gmi", request.Server.Hostname, request.Server.Port)
+ 180 | request.Redirect("gemini://%s:%s/guestbook.gmi", request.Server.Hostname(), request.Server.Port())
173 | }
174 |
175 | func CensorWords(str string) string {
176 | wordCensors := []string{"fuck", "kill", "die", "damn", "ass", "shit", "stupid", "faggot", "fag", "whore", "cock", "cunt", "motherfucker", "fucker", "asshole", "nigger", "abbie", "abe", "abie", "abid", "abeed", "ape", "armo", "nazi", "ashke-nazi", "אשכנאצי", "bamboula", "barbarian", "beaney", "beaner", "bohunk", "boerehater", "boer-hater", "burrhead", "burr-head", "chode", "chad", "penis", "vagina", "porn", "bbc", "stealthing", "bbw", "Hentai", "milf", "dilf", "tummysticks", "heeb", "hymie", "kike", "jidan", "sheeny", "shylock", "zhyd", "yid", "shyster", "smouch"}
177 |
gemini/search/db.go
... | ...
19 |
20 | var pages []Page = make([]Page, 0, 50)
21 | if rows_err == nil {
22 | defer rows.Close()
23 | for rows.Next() {
- 24 | var page pageNullable
+ 24 | var page Page
25 | scan_err := rows.Scan(&page.Id, &page.Url, &page.Scheme, &page.DomainId, &page.Content_type, &page.Charset, &page.Language, &page.Linecount, &page.Title, &page.Prompt, &page.Size, &page.Hash, &page.Feed, &page.PublishDate, &page.Index_time, &page.Album, &page.Artist, &page.AlbumArtist, &page.Composer, &page.Track, &page.Disc, &page.Copyright, &page.CrawlIndex, &page.Date_added, &page.LastSuccessfulVisit, &page.Hidden)
26 | if scan_err == nil {
... | ...
22 | scan_err := rows.Scan(&page.Id, &page.Url, &page.Scheme, &page.DomainId, &page.Content_type, &page.Charset, &page.Language, &page.Linecount, &page.Title, &page.Prompt, &page.Size, &page.Hash, &page.Feed, &page.PublishDate, &page.Index_time, &page.Album, &page.Artist, &page.AlbumArtist, &page.Composer, &page.Track, &page.Disc, &page.Copyright, &page.CrawlIndex, &page.Date_added, &page.LastSuccessfulVisit, &page.Hidden)
23 | if scan_err == nil {
- 27 | pages = append(pages, scanPage(page))
+ 27 | pages = append(pages, page)
28 | } else {
29 | panic(scan_err)
30 | }
31 | }
32 | }
... | ...
92 | var pages []Page = nil
93 | if rows_err == nil {
94 | var count int64
95 | defer rows.Close()
96 | for rows.Next() {
- 97 | var page pageNullable
+ 97 | var page Page
98 | scan_err := rows.Scan(&count, &page.Id, &page.Url, &page.Scheme, &page.DomainId, &page.Content_type, &page.Charset, &page.Language, &page.Linecount, &page.Title, &page.Prompt, &page.Size, &page.Hash, &page.Feed, &page.PublishDate, &page.Index_time, &page.Album, &page.Artist, &page.AlbumArtist, &page.Composer, &page.Track, &page.Disc, &page.Copyright, &page.CrawlIndex, &page.Date_added, &page.LastSuccessfulVisit, &page.Hidden)
99 | if scan_err == nil {
100 | if pages == nil {
101 | pages = make([]Page, 0, count)
102 | }
... | ...
98 | scan_err := rows.Scan(&count, &page.Id, &page.Url, &page.Scheme, &page.DomainId, &page.Content_type, &page.Charset, &page.Language, &page.Linecount, &page.Title, &page.Prompt, &page.Size, &page.Hash, &page.Feed, &page.PublishDate, &page.Index_time, &page.Album, &page.Artist, &page.AlbumArtist, &page.Composer, &page.Track, &page.Disc, &page.Copyright, &page.CrawlIndex, &page.Date_added, &page.LastSuccessfulVisit, &page.Hidden)
99 | if scan_err == nil {
100 | if pages == nil {
101 | pages = make([]Page, 0, count)
102 | }
- 103 | pages = append(pages, scanPage(page))
+ 103 | pages = append(pages, page)
104 | } else {
105 | panic(scan_err)
106 | }
107 | }
108 | }
... | ...
117 |
118 | var pages []Page = make([]Page, 0, 300)
119 | if rows_err == nil {
120 | defer rows.Close()
121 | for rows.Next() {
- 122 | var page pageNullable
+ 122 | var page Page
123 | scan_err := rows.Scan(&page.Id, &page.Url, &page.Scheme, &page.DomainId, &page.Content_type, &page.Charset, &page.Language, &page.Linecount, &page.Title, &page.Prompt, &page.Size, &page.Hash, &page.Feed, &page.PublishDate, &page.Index_time, &page.Album, &page.Artist, &page.AlbumArtist, &page.Composer, &page.Track, &page.Disc, &page.Copyright, &page.CrawlIndex, &page.Date_added, &page.LastSuccessfulVisit, &page.Hidden)
124 | if scan_err == nil {
... | ...
120 | scan_err := rows.Scan(&page.Id, &page.Url, &page.Scheme, &page.DomainId, &page.Content_type, &page.Charset, &page.Language, &page.Linecount, &page.Title, &page.Prompt, &page.Size, &page.Hash, &page.Feed, &page.PublishDate, &page.Index_time, &page.Album, &page.Artist, &page.AlbumArtist, &page.Composer, &page.Track, &page.Disc, &page.Copyright, &page.CrawlIndex, &page.Date_added, &page.LastSuccessfulVisit, &page.Hidden)
121 | if scan_err == nil {
- 125 | pages = append(pages, scanPage(page))
+ 125 | pages = append(pages, page)
126 | } else {
127 | panic(scan_err)
128 | }
129 | }
130 | }
... | ...
162 | var pages []Page = nil
163 | if rows_err == nil {
164 | var count int64
165 | defer rows.Close()
166 | for rows.Next() {
- 167 | var page pageNullable
+ 167 | var page Page
168 | scan_err := rows.Scan(&count, &page.Id, &page.Url, &page.Scheme, &page.DomainId, &page.Content_type, &page.Charset, &page.Language, &page.Linecount, &page.Title, &page.Prompt, &page.Size, &page.Hash, &page.Feed, &page.PublishDate, &page.Index_time, &page.Album, &page.Artist, &page.AlbumArtist, &page.Composer, &page.Track, &page.Disc, &page.Copyright, &page.CrawlIndex, &page.Date_added, &page.LastSuccessfulVisit, &page.Hidden)
169 | if scan_err == nil {
170 | if pages == nil {
171 | pages = make([]Page, 0, count)
172 | }
... | ...
168 | scan_err := rows.Scan(&count, &page.Id, &page.Url, &page.Scheme, &page.DomainId, &page.Content_type, &page.Charset, &page.Language, &page.Linecount, &page.Title, &page.Prompt, &page.Size, &page.Hash, &page.Feed, &page.PublishDate, &page.Index_time, &page.Album, &page.Artist, &page.AlbumArtist, &page.Composer, &page.Track, &page.Disc, &page.Copyright, &page.CrawlIndex, &page.Date_added, &page.LastSuccessfulVisit, &page.Hidden)
169 | if scan_err == nil {
170 | if pages == nil {
171 | pages = make([]Page, 0, count)
172 | }
- 173 | pages = append(pages, scanPage(page))
+ 173 | pages = append(pages, page)
174 | } else {
175 | panic(scan_err)
176 | }
177 | }
178 | }
... | ...
186 | var pages []Page = nil
187 | if rows_err == nil {
188 | var count int64
189 | defer rows.Close()
190 | for rows.Next() {
- 191 | var page pageNullable
+ 191 | var page Page
192 | scan_err := rows.Scan(&count, &page.Id, &page.Url, &page.Scheme, &page.DomainId, &page.Content_type, &page.Charset, &page.Language, &page.Linecount, &page.Title, &page.Prompt, &page.Size, &page.Hash, &page.Feed, &page.PublishDate, &page.Index_time, &page.Album, &page.Artist, &page.AlbumArtist, &page.Composer, &page.Track, &page.Disc, &page.Copyright, &page.CrawlIndex, &page.Date_added, &page.LastSuccessfulVisit, &page.Hidden)
193 | if scan_err == nil {
194 | if pages == nil {
195 | pages = make([]Page, 0, count)
196 | }
... | ...
192 | scan_err := rows.Scan(&count, &page.Id, &page.Url, &page.Scheme, &page.DomainId, &page.Content_type, &page.Charset, &page.Language, &page.Linecount, &page.Title, &page.Prompt, &page.Size, &page.Hash, &page.Feed, &page.PublishDate, &page.Index_time, &page.Album, &page.Artist, &page.AlbumArtist, &page.Composer, &page.Track, &page.Disc, &page.Copyright, &page.CrawlIndex, &page.Date_added, &page.LastSuccessfulVisit, &page.Hidden)
193 | if scan_err == nil {
194 | if pages == nil {
195 | pages = make([]Page, 0, count)
196 | }
- 197 | pages = append(pages, scanPage(page))
+ 197 | pages = append(pages, page)
198 | } else {
199 | panic(scan_err)
200 | }
201 | }
202 | }
... | ...
213 | var pages []Page = make([]Page, 0, results)
214 | var totalCount int
215 | if rows_err == nil {
216 | defer rows.Close()
217 | for rows.Next() {
- 218 | var page pageNullable
+ 218 | var page Page
219 | scan_err := rows.Scan(&totalCount, &page.Id, &page.Url, &page.Scheme, &page.DomainId, &page.Content_type, &page.Charset, &page.Language, &page.Linecount, &page.Title, &page.Prompt, &page.Size, &page.Hash, &page.Feed, &page.PublishDate, &page.Index_time, &page.Album, &page.Artist, &page.AlbumArtist, &page.Composer, &page.Track, &page.Disc, &page.Copyright, &page.CrawlIndex, &page.Date_added, &page.LastSuccessfulVisit, &page.Hidden)
220 | if scan_err == nil {
... | ...
216 | scan_err := rows.Scan(&totalCount, &page.Id, &page.Url, &page.Scheme, &page.DomainId, &page.Content_type, &page.Charset, &page.Language, &page.Linecount, &page.Title, &page.Prompt, &page.Size, &page.Hash, &page.Feed, &page.PublishDate, &page.Index_time, &page.Album, &page.Artist, &page.AlbumArtist, &page.Composer, &page.Track, &page.Disc, &page.Copyright, &page.CrawlIndex, &page.Date_added, &page.LastSuccessfulVisit, &page.Hidden)
217 | if scan_err == nil {
- 221 | pages = append(pages, scanPage(page))
+ 221 | pages = append(pages, page)
222 | } else {
223 | panic(scan_err)
224 | }
225 | }
226 | }
... | ...
237 |
238 | var pages []Page = make([]Page, 0, results)
239 | if rows_err == nil {
240 | defer rows.Close()
241 | for rows.Next() {
- 242 | var page pageNullable
+ 242 | var page Page
243 | scan_err := rows.Scan(&page.Id, &page.Url, &page.Scheme, &page.DomainId, &page.Content_type, &page.Charset, &page.Language, &page.Title, &page.Prompt, &page.Size, &page.Hash, &page.Feed, &page.PublishDate, &page.Index_time, &page.Album, &page.Artist, &page.AlbumArtist, &page.Composer, &page.Track, &page.Disc, &page.Copyright, &page.CrawlIndex, &page.Date_added, &page.LastSuccessfulVisit, &page.Hidden)
244 | if scan_err == nil {
... | ...
240 | scan_err := rows.Scan(&page.Id, &page.Url, &page.Scheme, &page.DomainId, &page.Content_type, &page.Charset, &page.Language, &page.Title, &page.Prompt, &page.Size, &page.Hash, &page.Feed, &page.PublishDate, &page.Index_time, &page.Album, &page.Artist, &page.AlbumArtist, &page.Composer, &page.Track, &page.Disc, &page.Copyright, &page.CrawlIndex, &page.Date_added, &page.LastSuccessfulVisit, &page.Hidden)
241 | if scan_err == nil {
- 245 | pages = append(pages, scanPage(page))
+ 245 | pages = append(pages, page)
246 | } else {
247 | panic(scan_err)
248 | }
249 | }
250 | }
... | ...
261 |
262 | var pages []Page = make([]Page, 0, results)
263 | if rows_err == nil {
264 | defer rows.Close()
265 | for rows.Next() {
- 266 | var page pageNullable
+ 266 | var page Page
267 | scan_err := rows.Scan(&page.Id, &page.Url, &page.Scheme, &page.DomainId, &page.Content_type, &page.Charset, &page.Language, &page.Title, &page.Prompt, &page.Size, &page.Hash, &page.Feed, &page.PublishDate, &page.Index_time, &page.Album, &page.Artist, &page.AlbumArtist, &page.Composer, &page.Track, &page.Disc, &page.Copyright, &page.CrawlIndex, &page.Date_added, &page.LastSuccessfulVisit, &page.Hidden)
268 | if scan_err == nil {
... | ...
264 | scan_err := rows.Scan(&page.Id, &page.Url, &page.Scheme, &page.DomainId, &page.Content_type, &page.Charset, &page.Language, &page.Title, &page.Prompt, &page.Size, &page.Hash, &page.Feed, &page.PublishDate, &page.Index_time, &page.Album, &page.Artist, &page.AlbumArtist, &page.Composer, &page.Track, &page.Disc, &page.Copyright, &page.CrawlIndex, &page.Date_added, &page.LastSuccessfulVisit, &page.Hidden)
265 | if scan_err == nil {
- 269 | pages = append(pages, scanPage(page))
+ 269 | pages = append(pages, page)
270 | } else {
271 | panic(scan_err)
272 | }
273 | }
274 | }
... | ...
284 | var pages []Page = nil
285 | if rows_err == nil {
286 | var count int64
287 | defer rows.Close()
288 | for rows.Next() {
- 289 | var page pageNullable
+ 289 | var page Page
290 | scan_err := rows.Scan(&count, &page.Id, &page.Url, &page.Scheme, &page.DomainId, &page.Content_type, &page.Charset, &page.Language, &page.Linecount, &page.Title, &page.Prompt, &page.Size, &page.Hash, &page.Feed, &page.PublishDate, &page.Index_time, &page.Album, &page.Artist, &page.AlbumArtist, &page.Composer, &page.Track, &page.Disc, &page.Copyright, &page.CrawlIndex, &page.Date_added, &page.LastSuccessfulVisit, &page.Hidden)
291 | if scan_err == nil {
292 | if pages == nil {
293 | pages = make([]Page, 0, count)
294 | }
... | ...
290 | scan_err := rows.Scan(&count, &page.Id, &page.Url, &page.Scheme, &page.DomainId, &page.Content_type, &page.Charset, &page.Language, &page.Linecount, &page.Title, &page.Prompt, &page.Size, &page.Hash, &page.Feed, &page.PublishDate, &page.Index_time, &page.Album, &page.Artist, &page.AlbumArtist, &page.Composer, &page.Track, &page.Disc, &page.Copyright, &page.CrawlIndex, &page.Date_added, &page.LastSuccessfulVisit, &page.Hidden)
291 | if scan_err == nil {
292 | if pages == nil {
293 | pages = make([]Page, 0, count)
294 | }
- 295 | pages = append(pages, scanPage(page))
+ 295 | pages = append(pages, page)
296 | } else {
297 | panic(scan_err)
298 | }
299 | }
300 | }
... | ...
310 | var pages []PageWithDomain = nil
311 | if rows_err == nil {
312 | var count int64
313 | defer rows.Close()
314 | for rows.Next() {
- 315 | var page pageNullable
+ 315 | var page Page
316 | var domain Domain
317 | scan_err := rows.Scan(&count, &page.Id, &page.Url, &page.Scheme, &page.DomainId, &page.Content_type, &page.Charset, &page.Language, &page.Linecount, &page.Title, &page.Prompt, &page.Size, &page.Hash, &page.Feed, &page.PublishDate, &page.Index_time, &page.Album, &page.Artist, &page.AlbumArtist, &page.Composer, &page.Track, &page.Disc, &page.Copyright, &page.CrawlIndex, &page.Date_added, &page.LastSuccessfulVisit, &page.Hidden, &domain.Id, &domain.Domain, &domain.Title, &domain.Port, &domain.HasRobots, &domain.HasSecurity, &domain.HasFavicon, &domain.Favicon, &domain.CrawlIndex, &domain.Date_added)
318 | if scan_err == nil {
319 | if pages == nil {
320 | pages = make([]PageWithDomain, 0, count)
... | ...
317 | scan_err := rows.Scan(&count, &page.Id, &page.Url, &page.Scheme, &page.DomainId, &page.Content_type, &page.Charset, &page.Language, &page.Linecount, &page.Title, &page.Prompt, &page.Size, &page.Hash, &page.Feed, &page.PublishDate, &page.Index_time, &page.Album, &page.Artist, &page.AlbumArtist, &page.Composer, &page.Track, &page.Disc, &page.Copyright, &page.CrawlIndex, &page.Date_added, &page.LastSuccessfulVisit, &page.Hidden, &domain.Id, &domain.Domain, &domain.Title, &domain.Port, &domain.HasRobots, &domain.HasSecurity, &domain.HasFavicon, &domain.Favicon, &domain.CrawlIndex, &domain.Date_added)
318 | if scan_err == nil {
319 | if pages == nil {
320 | pages = make([]PageWithDomain, 0, count)
321 | }
- 322 | pages = append(pages, PageWithDomain{scanPage(page), domain})
+ 322 | pages = append(pages, PageWithDomain{page, domain})
323 | } else {
324 | panic(scan_err)
325 | }
326 | }
327 | }
gemini/search/feedback.go
... | ...
50 | /*if !strings.HasPrefix(string(data), feedbackPrefix) {
51 | request.TemporaryFailure("You edited the start of the document above \"---\". Your edit is rejected.")
52 | return
53 | }*/
54 |
- 55 | fileBefore, _ := request.Server.FS.ReadFile("searchfeedback.gmi")
+ 55 | fileBefore, _ := request.Server.FS().ReadFile("searchfeedback.gmi")
56 | //fileBefore, _ := os.ReadFile("searchfeedback.gmi")
57 | if !strings.HasPrefix(string(data), string(fileBefore)) {
58 | request.TemporaryFailure("You edited a portion of the document that already existed. Only appends are allowed. Your edit is rejected.")
59 | return
60 | }
... | ...
57 | if !strings.HasPrefix(string(data), string(fileBefore)) {
58 | request.TemporaryFailure("You edited a portion of the document that already existed. Only appends are allowed. Your edit is rejected.")
59 | return
60 | }
61 |
- 62 | err = request.Server.FS.WriteFile("searchfeedback.gmi", data, 0644)
+ 62 | err = request.Server.FS().WriteFile("searchfeedback.gmi", data, 0644)
63 | if err != nil {
64 | return //err
65 | }
... | ...
61 | if err != nil {
62 | return //err
63 | }
- 66 | request.Redirect("gemini://%s:%s/search/feedback.gmi", request.Server.Hostname, request.Server.Port)
+ 66 | request.Redirect("gemini://%s:%s/search/feedback.gmi", request.Server.Hostname(), request.Server.Port())
67 | return
68 | } else {
69 | request.FileMimetype("text/gemini", "searchfeedback.gmi")
70 | return
71 | }
gemini/search/search.go
... | ...
62 | `
63 |
64 | func HandleSearchEngineDown(s sis.ServerHandle) {
65 | s.AddRoute("/searchengine", func(request sis.Request) {
66 | request.Redirect("/search/")
- 67 | return
68 | })
69 | s.AddRoute("/searchengine/", func(request sis.Request) {
70 | request.Redirect("/search/")
... | ...
66 | })
67 | s.AddRoute("/searchengine/", func(request sis.Request) {
68 | request.Redirect("/search/")
- 71 | return
72 | })
73 | s.AddRoute("/search", func(request sis.Request) {
74 | request.Redirect("/search/")
... | ...
70 | })
71 | s.AddRoute("/search", func(request sis.Request) {
72 | request.Redirect("/search/")
- 75 | return
76 | })
77 | s.AddRoute("/search/*", func(request sis.Request) {
78 | request.ServerUnavailable("AuraGem Search is currently down due to upgrades.")
79 | })
80 | }
... | ...
556 | `, builder.String()))
557 | })
558 |
559 | s.AddRoute("/search/test", func(request sis.Request) {
560 | request.Redirect("/search/yearposts")
- 561 | return
562 | })
563 | s.AddRoute("/search/yearposts", func(request sis.Request) {
564 | page := 1
565 | results := 40
566 | skip := (page - 1) * results
... | ...
876 | q := `SELECT FIRST 1 'gemini://' || r.DOMAIN || '/'
877 | FROM DOMAINS r
878 | ORDER BY (r.ID + cast(? as bigint))*4294967291-((r.ID + cast(? as bigint))*4294967291/49157)*49157`
879 | time := time.Now().Unix()
880 | row := conn.QueryRowContext(context.Background(), q, time, time)
- 881 | var urlPage Page
- 882 | var page pageNullable
+ 877 | var page Page
883 | scan_err := row.Scan(&page.Url)
884 | if scan_err == nil {
... | ...
880 | scan_err := row.Scan(&page.Url)
881 | if scan_err == nil {
- 885 | urlPage = scanPage(page)
+ 880 | request.Redirect(page.Url)
+ 881 | return
886 | } else if scan_err == sql.ErrNoRows {
887 | request.Redirect("/search/")
888 | return
889 | } else {
890 | panic(scan_err)
... | ...
887 | request.Redirect("/search/")
888 | return
889 | } else {
890 | panic(scan_err)
891 | }
- 892 |
- 893 | request.Redirect(urlPage.Url)
- 894 | return
895 | })
896 | }
897 |
898 | func handleBacklinks(request sis.Request, conn *sql.DB, url *url.URL) {
899 | q := `SELECT COUNT(*) OVER () totalCount, r.ID, P_FROM.ID, P_FROM.URL, r.TITLE, r.CROSSHOST, r.CRAWLINDEX,
... | ...
908 | var totalResultsCount = 0 // Total count of all results, regardless of pagination
909 | if rows_err == nil {
910 | defer rows.Close()
911 | for rows.Next() {
912 | var backlink Backlink
- 913 | //var rank interface{}
914 | scan_err := rows.Scan(&totalResultsCount, &backlink.Id, &backlink.PageId_From, &backlink.PageURL_FROM, &backlink.Title, &backlink.Crosshost, &backlink.CrawlIndex, &backlink.Date_added)
915 | if scan_err == nil {
916 | backlinks = append(backlinks, backlink)
917 | } else {
918 | panic(scan_err)
... | ...
982 | var pages []Page = make([]Page, 0, results)
983 | var totalResultsCount = 0 // Total count of all results, regardless of pagination
984 | if rows_err == nil {
985 | defer rows.Close()
986 | for rows.Next() {
- 987 | var page pageNullable
- 988 | //var rank interface{}
+ 979 | var page Page
989 | scan_err := rows.Scan(&totalResultsCount, &page.Score, &page.Id, &page.Url, &page.Scheme, &page.DomainId, &page.Content_type, &page.Charset, &page.Language, &page.Linecount, &page.Title, &page.Prompt, &page.Size, &page.Hash, &page.Feed, &page.PublishDate, &page.Index_time, &page.Album, &page.Artist, &page.AlbumArtist, &page.Composer, &page.Track, &page.Disc, &page.Copyright, &page.CrawlIndex, &page.Date_added, &page.LastSuccessfulVisit, &page.Hidden)
990 | if scan_err == nil {
... | ...
986 | scan_err := rows.Scan(&totalResultsCount, &page.Score, &page.Id, &page.Url, &page.Scheme, &page.DomainId, &page.Content_type, &page.Charset, &page.Language, &page.Linecount, &page.Title, &page.Prompt, &page.Size, &page.Hash, &page.Feed, &page.PublishDate, &page.Index_time, &page.Album, &page.Artist, &page.AlbumArtist, &page.Composer, &page.Track, &page.Disc, &page.Copyright, &page.CrawlIndex, &page.Date_added, &page.LastSuccessfulVisit, &page.Hidden)
987 | if scan_err == nil {
- 991 | pages = append(pages, scanPage(page))
+ 982 | pages = append(pages, page)
992 | } else {
993 | panic(scan_err)
994 | }
995 | }
996 | } else {
... | ...
1050 | var pages []Page = make([]Page, 0, results_per_query)
1051 | var totalResultsCount = 0 // Total count of all results, regardless of pagination
1052 | if rows_err == nil {
1053 | defer rows.Close()
1054 | for rows.Next() {
- 1055 | var page pageNullable
- 1056 | //var rank interface{}
+ 1046 | var page Page
1057 | scan_err := rows.Scan(&totalResultsCount, &page.Id, &page.Url, &page.Scheme, &page.DomainId, &page.Content_type, &page.Charset, &page.Language, &page.Linecount, &page.Title, &page.Prompt, &page.Size, &page.Hash, &page.Feed, &page.PublishDate, &page.Index_time, &page.Album, &page.Artist, &page.AlbumArtist, &page.Composer, &page.Track, &page.Disc, &page.Copyright, &page.CrawlIndex, &page.Date_added, &page.LastSuccessfulVisit, &page.Hidden)
1058 | if scan_err == nil {
... | ...
1054 | scan_err := rows.Scan(&totalResultsCount, &page.Id, &page.Url, &page.Scheme, &page.DomainId, &page.Content_type, &page.Charset, &page.Language, &page.Linecount, &page.Title, &page.Prompt, &page.Size, &page.Hash, &page.Feed, &page.PublishDate, &page.Index_time, &page.Album, &page.Artist, &page.AlbumArtist, &page.Composer, &page.Track, &page.Disc, &page.Copyright, &page.CrawlIndex, &page.Date_added, &page.LastSuccessfulVisit, &page.Hidden)
1055 | if scan_err == nil {
- 1059 | pages = append(pages, scanPage(page))
+ 1049 | pages = append(pages, page)
1060 | } else {
1061 | panic(scan_err)
1062 | }
1063 | }
1064 | max_results = totalResultsCount
... | ...
1080 |
1081 | if first {
1082 | request.TemporaryFailure("Error")
1083 | return
1084 | }
- 1085 |
- 1086 | return //nil
1087 | }
1088 |
1089 | func handleAudioSearch(request sis.Request, conn *sql.DB, query string, page int) {
1090 | rawQuery := request.RawQuery()
1091 | results := 30
... | ...
1105 | var pages []Page = make([]Page, 0, results)
1106 | var totalResultsCount = 0 // Total count of all results, regardless of pagination
1107 | if rows_err == nil {
1108 | defer rows.Close()
1109 | for rows.Next() {
- 1110 | var page pageNullable
- 1111 | //var rank interface{}
+ 1098 | var page Page
1112 | scan_err := rows.Scan(&totalResultsCount, &page.Score, &page.Highlight, &page.Id, &page.Url, &page.Scheme, &page.DomainId, &page.Content_type, &page.Charset, &page.Language, &page.Linecount, &page.Title, &page.Prompt, &page.Size, &page.Hash, &page.Feed, &page.PublishDate, &page.Index_time, &page.Album, &page.Artist, &page.AlbumArtist, &page.Composer, &page.Track, &page.Disc, &page.Copyright, &page.CrawlIndex, &page.Date_added, &page.LastSuccessfulVisit, &page.Hidden)
1113 | if scan_err == nil {
... | ...
1109 | scan_err := rows.Scan(&totalResultsCount, &page.Score, &page.Highlight, &page.Id, &page.Url, &page.Scheme, &page.DomainId, &page.Content_type, &page.Charset, &page.Language, &page.Linecount, &page.Title, &page.Prompt, &page.Size, &page.Hash, &page.Feed, &page.PublishDate, &page.Index_time, &page.Album, &page.Artist, &page.AlbumArtist, &page.Composer, &page.Track, &page.Disc, &page.Copyright, &page.CrawlIndex, &page.Date_added, &page.LastSuccessfulVisit, &page.Hidden)
1110 | if scan_err == nil {
- 1114 | pages = append(pages, scanPage(page))
+ 1101 | pages = append(pages, page)
1115 | } else {
1116 | panic(scan_err)
1117 | }
1118 | }
1119 | } else {
gemini/search/types.go
... | ...
-1 | package search
0 |
1 | import (
+ 4 | "database/sql"
4 | "time"
5 | )
6 |
7 | type Seed struct {
8 | Id int
... | ...
14 | Id int
15 | Domain string
16 | Title string
17 | Port int
18 | //ParentDomain Domain // ForeignKey
- 19 | ParentDomainId interface{}
+ 20 | ParentDomainId sql.Null[int64]
20 | //Robots string // contents of robots.txt?
21 | HasRobots bool
22 | HasSecurity bool
23 | HasFavicon bool
... | ...
19 | //Robots string // contents of robots.txt?
20 | HasRobots bool
21 | HasSecurity bool
22 | HasFavicon bool
- 24 | Favicon interface{}
+ 25 | Favicon sql.Null[string]
25 | CrawlIndex int
26 | Date_added time.Time
27 | }
28 |
29 | type Page struct {
... | ...
30 | Score float64
31 | Id int64
32 | Url string // fetchable_url, normalized_url
33 | Scheme string
34 | // Domain Domain // foreign key
- 35 | DomainId int64
+ 36 | DomainId sql.Null[int64]
36 |
37 | Content_type string
38 | Charset string
39 | Language string
40 | Linecount int
... | ...
64 | Hidden bool
65 |
66 | Highlight string // Used for highlights when searching
67 | }
68 |
- 69 | type pageNullable struct {
- 70 | Score float64
- 71 | Id int64
- 72 | Url string // fetchable_url, normalized_url
- 73 | Scheme string
- 74 | // Domain Domain // foreign key
- 75 | DomainId interface{}
- 76 |
- 77 | Content_type string
- 78 | Charset string
- 79 | Language string
- 80 | Linecount int
- 81 |
- 82 | Title string // Used for text/gemini and text/markdown files with page titles
- 83 | // content []u8 // TODO
- 84 | Prompt string // For input prompt urls
- 85 | Headings string
- 86 | Size int // bytes
- 87 | Hash string
- 88 | Feed bool // rss, atom, or gmisub
- 89 | PublishDate time.Time // Used if linked from a feed, or if audio/video with year tag
- 90 | Index_time time.Time
- 91 |
- 92 | // Audio/Video-only info
- 93 | Album string
- 94 | Artist string
- 95 | AlbumArtist string
- 96 | Composer string
- 97 | Track int
- 98 | Disc int
- 99 | Copyright string
- 100 | CrawlIndex int
- 101 | Date_added time.Time
- 102 | LastSuccessfulVisit time.Time
- 103 |
- 104 | Hidden bool
- 105 |
- 106 | Highlight string // Used for highlights when searching
- 107 | }
- 108 |
109 | type PageWithDomain struct {
110 | page Page
111 | domain Domain
... | ...
107 | type PageWithDomain struct {
108 | page Page
109 | domain Domain
- 112 | }
- 113 |
- 114 | func scanPage(page pageNullable) Page {
- 115 | var result Page
- 116 | result.Score = page.Score
- 117 | result.Id = page.Id
- 118 | result.Url = page.Url
- 119 |
- 120 | result.Scheme = page.Scheme
- 121 | if page.DomainId != nil {
- 122 | if _, ok := page.DomainId.(int64); ok {
- 123 | result.DomainId = int64(page.DomainId.(int64))
- 124 | } else {
- 125 | if _, ok2 := page.DomainId.(int); ok2 {
- 126 | result.DomainId = int64(page.DomainId.(int))
- 127 | }
- 128 | }
- 129 | } else {
- 130 | result.DomainId = -1
- 131 | }
- 132 |
- 133 | result.Content_type = page.Content_type
- 134 | result.Charset = page.Charset
- 135 | result.Language = page.Language
- 136 | result.Linecount = page.Linecount
- 137 |
- 138 | result.Title = page.Title
- 139 | result.Prompt = page.Prompt
- 140 | result.Headings = page.Headings
- 141 | result.Size = page.Size
- 142 | result.Hash = page.Hash
- 143 | result.Feed = page.Feed
- 144 | result.PublishDate = page.PublishDate
- 145 | result.Index_time = page.Index_time
- 146 |
- 147 | result.Album = page.Album
- 148 | result.Artist = page.Artist
- 149 | result.AlbumArtist = page.AlbumArtist
- 150 | result.Composer = page.Composer
- 151 | result.Track = page.Track
- 152 | result.Disc = page.Disc
- 153 | result.Copyright = page.Copyright
- 154 | result.CrawlIndex = page.CrawlIndex
- 155 | result.Date_added = page.Date_added
- 156 | result.LastSuccessfulVisit = page.LastSuccessfulVisit
- 157 |
- 158 | result.Hidden = page.Hidden
- 159 |
- 160 | result.Highlight = page.Highlight
- 161 |
- 162 | return result
163 | }
164 |
165 | type Tag struct {
166 | Id int
167 | PageId int
gemini/textola/textola.go
... | ...
108 | }
109 |
110 | return textolaText
111 | }
112 |
- 113 | //go:embed the_cask_of_amontillado.txt
- 114 | var theCaskOfAmontilladoText string
+ 113 | /*
+ 114 | func makeTextFromFile(announcer string, filepath string, contentType TextolaContentType) TextolaText {
+ 115 | text, _ := os.ReadFile(filepath)
+ 116 | return makeTextFromString(announcer, string(text), contentType)
+ 117 | }
+ 118 | */
115 |
116 | var hourAnnouncer TextolaText = makeTextFromString("Welcome.", "This is AuraGem Textola, the text equivalent of radio!\n$time\n", TextolaContentType_Fiction)
... | ...
112 |
113 | var hourAnnouncer TextolaText = makeTextFromString("Welcome.", "This is AuraGem Textola, the text equivalent of radio!\n$time\n", TextolaContentType_Fiction)
- 117 | var theCaskOfAmontillado TextolaText = makeTextFromString("Presenting Edgar Allan Poe's The Cask of Amontillado", theCaskOfAmontilladoText, TextolaContentType_OldClassicsFiction)
+ 121 |
+ 122 | var schedule = map[int]string{
+ 123 | 0: "",
+ 124 | 1: "",
+ 125 | 2: "",
+ 126 | 3: "",
+ 127 | 4: "",
+ 128 | 5: "JewishPrayerMorning",
+ 129 | 6: "",
+ 130 | 7: "",
+ 131 | 8: "",
+ 132 | 9: "",
+ 133 | 10: "",
+ 134 | 11: "",
+ 135 | 12: "JewishPrayerAfternoon",
+ 136 | 13: "",
+ 137 | 14: "",
+ 138 | 15: "",
+ 139 | 16: "JewishPrayerAfternoon",
+ 140 | 17: "",
+ 141 | 18: "",
+ 142 | 19: "JewishPrayerEvening",
+ 143 | 20: "Fiction",
+ 144 | 21: "",
+ 145 | 22: "",
+ 146 | 23: "",
+ 147 | }
+ 148 |
+ 149 | func getTextFromSchedule(s sis.ServerHandle) TextolaText {
+ 150 | currentTime := time.Now()
+ 151 | scheduleString := schedule[currentTime.Hour()]
+ 152 | switch scheduleString {
+ 153 | case "JewishPrayerMorning":
+ 154 | filedata, _ := s.GetServer().FS.ReadFile("textolatexts/prayers/jewishprayermorning.txt")
+ 155 | return makeTextFromString("Presenting Jewish Morning Prayers, Weekdays", string(filedata), TextolaContentType_Poetry)
+ 156 | case "JewishPrayerAfternoon":
+ 157 | filedata, _ := s.GetServer().FS.ReadFile("textolatexts/prayers/jewishprayerafternoon.txt")
+ 158 | return makeTextFromString("Presenting Jewish Afternoon Prayers, Weekdays", string(filedata), TextolaContentType_Poetry)
+ 159 | case "JewishPrayerEvening":
+ 160 | filedata, _ := s.GetServer().FS.ReadFile("textolatexts/prayers/jewishprayerevening.txt")
+ 161 | return makeTextFromString("Presenting Jewish Evening Prayers, Weekdays", string(filedata), TextolaContentType_Poetry)
+ 162 | case "Fiction":
+ 163 | filedata, _ := s.GetServer().FS.ReadFile("textolatexts/fiction/the_cask_of_amontillado.txt")
+ 164 | return makeTextFromString("Presenting Edgar Allan Poe's The Cask of Amontillado", string(filedata), TextolaContentType_OldClassicsFiction)
+ 165 | case "": // Anything (random)
+ 166 | filedata, _ := s.GetServer().FS.ReadFile("textolatexts/fiction/the_cask_of_amontillado.txt")
+ 167 | return makeTextFromString("Presenting Edgar Allan Poe's The Cask of Amontillado", string(filedata), TextolaContentType_OldClassicsFiction)
+ 168 | }
+ 169 |
+ 170 | filedata, _ := s.GetServer().FS.ReadFile("the_cask_of_amontillado.txt")
+ 171 | return makeTextFromString("Presenting Edgar Allan Poe's The Cask of Amontillado", string(filedata), TextolaContentType_OldClassicsFiction)
+ 172 | }
118 |
119 | func HandleTextola(s sis.ServerHandle) {
120 | //fmt.Printf("GuestbookText: %s\n", theCaskOfAmontillado)
121 | var context *TextolaContext = &TextolaContext{
... | ...
117 |
118 | func HandleTextola(s sis.ServerHandle) {
119 | //fmt.Printf("GuestbookText: %s\n", theCaskOfAmontillado)
120 | var context *TextolaContext = &TextolaContext{
- 122 | currentText: theCaskOfAmontillado,
+ 177 | currentText: getTextFromSchedule(s),
123 | mutex: sync.RWMutex{},
124 | }
125 | context.readCond = sync.NewCond(context.mutex.RLocker())
126 |
127 | //fmt.Printf("Textola Text: (Lines %d) %#v\n", len(context.currentText.lines), context.currentText.lines)
... | ...
188 | }
189 | }
190 |
191 | connectedClients.Add(-1)
192 | })
- 193 | go fakeClient(context)
+ 248 | go fakeClient(s, context)
194 | }
195 |
... | ...
191 | }
192 |
- 196 | func fakeClient(context *TextolaContext) {
+ 251 | func fakeClient(s sis.ServerHandle, context *TextolaContext) {
197 | // Seconds Ticker
198 | //ticker := time.NewTicker(time.Millisecond / 100)
199 | limiter := rate.NewLimiter(rate.Every(time.Second), 1)
200 |
201 | currentLine := context.currentLine
... | ...
222 | // If Hour changed or 30 minutes after, switch to hourAnnouncer text
223 | context.currentText = hourAnnouncer
224 | previousAnnouncerTime = context.startTime
225 | } else {
226 | // Else, switch to the next text on the schedule
- 227 | context.currentText = theCaskOfAmontillado
+ 282 | context.currentText = getTextFromSchedule(s)
228 | }
229 |
230 | context.newText = true
231 | context.changeInt += 1
232 | context.readCond.Broadcast()
gemini/textola/the_cask_of_amontillado.txt (deleted)
- 1 | The Cask of Amontillado - 2 | The thousand injuries of Fortunato I had borne as I best could; but when he ventured upon insult, I vowed revenge. You, who so well know the nature of my soul, will not suppose, however, that I gave utterance to a threat. At length I would be avenged; this was a point definitively settled—but the very definitiveness with which it was resolved, precluded the idea of risk. I must not only punish, but punish with impunity. A wrong is unredressed when retribution overtakes its redresser. It is equally unredressed when the avenger fails to make himself felt as such to him who has done the wrong. - 3 | It must be understood, that neither by word nor deed had I given Fortunato cause to doubt my good will. I continued, as was my wont, to smile in his face, and he did not perceive that my smile now was at the thought of his immolation. - 4 | He had a weak point—this Fortunato—although in other regards he was a man to be respected and even feared. He prided himself on his connoisseurship in wine. Few Italians have the true virtuoso spirit. For the most part their enthusiasm is adopted to suit the time and opportunity—to practise imposture upon the British and Austrian millionaires. In painting and gemmary, Fortunato, like his countrymen, was a quack—but in the matter of old wines he was sincere. In this respect I did not differ from him materially: I was skilful in the Italian vintages myself, and bought largely whenever I could. - 5 | It was about dusk, one evening during the supreme madness of the carnival season, that I encountered my friend. He accosted me with excessive warmth, for he had been drinking much. The man wore motley. He had on a tight-fitting parti-striped dress, and his head was surmounted by the conical cap and bells. I was so pleased to see him, that I thought I should never have done wringing his hand. - 6 | I said to him: “My dear Fortunato, you are luckily met. How remarkably well you are looking today! But I have received a pipe of what passes for Amontillado, and I have my doubts.” - 7 | “How?” said he. “Amontillado? A pipe? Impossible! And in the middle of the carnival!” - 8 | “I have my doubts,” I replied; “and I was silly enough to pay the full Amontillado price without consulting you in the matter. You were not to be found, and I was fearful of losing a bargain.” - 9 | “Amontillado!” - 10 | “I have my doubts.” - 11 | “Amontillado!” - 12 | “And I must satisfy them.” - 13 | “Amontillado!” - 14 | “As you are engaged, I am on my way to Luchesi. If anyone has a critical turn, it is he. He will tell me—” - 15 | “Luchesi cannot tell Amontillado from Sherry.” - 16 | “And yet some fools will have it that his taste is a match for your own.” - 17 | “Come, let us go.” - 18 | “Whither?” - 19 | “To your vaults.” - 20 | “My friend, no; I will not impose upon your good nature. I perceive you have an engagement. Luchesi—” - 21 | “I have no engagement;—come.” - 22 | “My friend, no. It is not the engagement, but the severe cold with which I perceive you are afflicted. The vaults are insufferably damp. They are encrusted with nitre.” - 23 | “Let us go, nevertheless. The cold is merely nothing. Amontillado! You have been imposed upon. And as for Luchesi, he cannot distinguish Sherry from Amontillado.” - 24 | Thus speaking, Fortunato possessed himself of my arm. Putting on a mask of black silk, and drawing a roquelaire closely about my person, I suffered him to hurry me to my palazzo. - 25 | There were no attendants at home; they had absconded to make merry in honor of the time. I had told them that I should not return until the morning, and had given them explicit orders not to stir from the house. These orders were sufficient, I well knew, to insure their immediate disappearance, one and all, as soon as my back was turned. - 26 | I took from their sconces two flambeaux, and giving one to Fortunato, bowed him through several suites of rooms to the archway that led into the vaults. I passed down a long and winding staircase, requesting him to be cautious as he followed. We came at length to the foot of the descent, and stood together on the damp ground of the catacombs of the Montresors. - 27 | The gait of my friend was unsteady, and the bells upon his cap jingled as he strode. - 28 | “The pipe,” said he. - 29 | “It is farther on,” said I; “but observe the white web-work which gleams from these cavern walls.” - 30 | He turned towards me, and looked into my eyes with two filmy orbs that distilled the rheum of intoxication. - 31 | “Nitre?” he asked, at length. - 32 | “Nitre,” I replied. “How long have you had that cough?” - 33 | “Ugh! ugh! ugh!—ugh! ugh! ugh!—ugh! ugh! ugh!—ugh! ugh! ugh!—ugh! ugh! ugh!” - 34 | My poor friend found it impossible to reply for many minutes. - 35 | “It is nothing,” he said, at last. - 36 | “Come,” I said, with decision, “we will go back; your health is precious. You are rich, respected, admired, beloved; you are happy, as once I was. You are a man to be missed. For me it is no matter. We will go back; you will be ill, and I cannot be responsible. Besides, there is Luchesi—” - 37 | “Enough,” he said; “the cough is a mere nothing; it will not kill me. I shall not die of a cough.” - 38 | “True—true,” I replied; “and, indeed, I had no intention of alarming you unnecessarily—but you should use all proper caution. A draught of this Medoc will defend us from the damps.” - 39 | Here I knocked off the neck of a bottle which I drew from a long row of its fellows that lay upon the mould. - 40 | “Drink,” I said, presenting him the wine. - 41 | He raised it to his lips with a leer. He paused and nodded to me familiarly, while his bells jingled. - 42 | “I drink,” he said, “to the buried that repose around us.” - 43 | “And I to your long life.” - 44 | He again took my arm, and we proceeded. - 45 | “These vaults,” he said, “are extensive.” - 46 | “The Montresors,” I replied, “were a great and numerous family.” - 47 | “I forget your arms.” - 48 | “A huge human foot d’or, in a field azure; the foot crushes a serpent rampant whose fangs are imbedded in the heel.” - 49 | “And the motto?” - 50 | “Nemo me impune lacessit.” - 51 | “Good!” he said. - 52 | The wine sparkled in his eyes and the bells jingled. My own fancy grew warm with the Medoc. We had passed through walls of piled bones, with casks and puncheons intermingling, into the inmost recesses of the catacombs. I paused again, and this time I made bold to seize Fortunato by an arm above the elbow. - 53 | “The nitre!” I said: “see, it increases. It hangs like moss upon the vaults. We are below the river’s bed. The drops of moisture trickle among the bones. Come, we will go back ere it is too late. Your cough—” - 54 | “It is nothing,” he said; “let us go on. But first, another draught of the Medoc.” - 55 | I broke and reached him a flagon of De Grâve. He emptied it at a breath. His eyes flashed with a fierce light. He laughed and threw the bottle upwards with a gesticulation I did not understand. - 56 | I looked at him in surprise. He repeated the movement—a grotesque one. - 57 | “You do not comprehend?” he said. - 58 | “Not I,” I replied. - 59 | “Then you are not of the brotherhood.” - 60 | “How?” - 61 | “You are not of the masons.” - 62 | “Yes, yes,” I said, “yes, yes.” - 63 | “You? Impossible! A mason?” - 64 | “A mason,” I replied. - 65 | “A sign,” he said. - 66 | “It is this,” I answered, producing a trowel from beneath the folds of my roquelaire. - 67 | “You jest,” he exclaimed, recoiling a few paces. “But let us proceed to the Amontillado.” - 68 | “Be it so,” I said, replacing the tool beneath the cloak, and again offering him my arm. He leaned upon it heavily. We continued our route in search of the Amontillado. We passed through a range of low arches, descended, passed on, and descending again, arrived at a deep crypt, in which the foulness of the air caused our flambeaux rather to glow than flame. - 69 | At the most remote end of the crypt there appeared another less spacious. Its walls had been lined with human remains, piled to the vault overhead, in the fashion of the great catacombs of Paris. Three sides of this interior crypt were still ornamented in this manner. From the fourth the bones had been thrown down, and lay promiscuously upon the earth, forming at one point a mound of some size. Within the wall thus exposed by the displacing of the bones, we perceived a still interior recess, in depth about four feet, in width three, in height six or seven. It seemed to have been constructed for no especial use in itself, but formed merely the interval between two of the colossal supports of the roof of the catacombs, and was backed by one of their circumscribing walls of solid granite. - 70 | It was in vain that Fortunato, uplifting his dull torch, endeavored to pry into the depths of the recess. Its termination the feeble light did not enable us to see. - 71 | “Proceed,” I said; “herein is the Amontillado. As for Luchesi—” - 72 | “He is an ignoramus,” interrupted my friend, as he stepped unsteadily forward, while I followed immediately at his heels. In an instant he had reached the extremity of the niche, and finding his progress arrested by the rock, stood stupidly bewildered. A moment more and I had fettered him to the granite. In its surface were two iron staples, distant from each other about two feet, horizontally. From one of these depended a short chain, from the other a padlock. Throwing the links about his waist, it was but the work of a few seconds to secure it. He was too much astounded to resist. Withdrawing the key I stepped back from the recess. - 73 | “Pass your hand,” I said, “over the wall; you cannot help feeling the nitre. Indeed it is very damp. Once more let me implore you to return. No? Then I must positively leave you. But I must first render you all the little attentions in my power.” - 74 | “The Amontillado!” ejaculated my friend, not yet recovered from his astonishment. - 75 | “True,” I replied; “the Amontillado.” - 76 | As I said these words I busied myself among the pile of bones of which I have before spoken. Throwing them aside, I soon uncovered a quantity of building stone and mortar. With these materials and with the aid of my trowel, I began vigorously to wall up the entrance of the niche. - 77 | I had scarcely laid the first tier of my masonry when I discovered that the intoxication of Fortunato had in a great measure worn off. The earliest indication I had of this was a low moaning cry from the depth of the recess. It was not the cry of a drunken man. There was then a long and obstinate silence. I laid the second tier, and the third, and the fourth; and then I heard the furious vibrations of the chain. The noise lasted for several minutes, during which, that I might hearken to it with the more satisfaction, I ceased my labors and sat down upon the bones. When at last the clanking subsided, I resumed the trowel, and finished without interruption the fifth, the sixth, and the seventh tier. The wall was now nearly upon a level with my breast. I again paused, and holding the flambeaux over the mason-work, threw a few feeble rays upon the figure within. - 78 | A succession of loud and shrill screams, bursting suddenly from the throat of the chained form, seemed to thrust me violently back. For a brief moment I hesitated—I trembled. Unsheathing my rapier, I began to grope with it about the recess; but the thought of an instant reassured me. I placed my hand upon the solid fabric of the catacombs, and felt satisfied. I reapproached the wall. I replied to the yells of him who clamored. I reechoed—I aided—I surpassed them in volume and in strength. I did this, and the clamorer grew still. - 79 | It was now midnight, and my task was drawing to a close. I had completed the eighth, the ninth, and the tenth tier. I had finished a portion of the last and the eleventh; there remained but a single stone to be fitted and plastered in. I struggled with its weight; I placed it partially in its destined position. But now there came from out the niche a low laugh that erected the hairs upon my head. It was succeeded by a sad voice, which I had difficulty in recognising as that of the noble Fortunato. The voice said— - 80 | “Ha! ha! ha!—he! he!—a very good joke indeed—an excellent jest. We will have many a rich laugh about it at the palazzo—he! he! he!—over our wine—he! he! he!” - 81 | “The Amontillado!” I said. - 82 | “He! he! he!—he! he! he!—yes, the Amontillado. But is it not getting late? Will not they be awaiting us at the palazzo, the Lady Fortunato and the rest? Let us be gone.” - 83 | “Yes,” I said, “let us be gone.” - 84 | “For the love of God, Montressor!” - 85 | “Yes,” I said, “for the love of God!” - 86 | But to these words I hearkened in vain for a reply. I grew impatient. I called aloud: - 87 | “Fortunato!” - 88 | No answer. I called again: - 89 | “Fortunato!” - 90 | No answer still. I thrust a torch through the remaining aperture and let it fall within. There came forth in return only a jingling of the bells. My heart grew sick—on account of the dampness of the catacombs. I hastened to make an end of my labor. I forced the last stone into its position; I plastered it up. Against the new masonry I re-erected the old rampart of bones. For the half of a century no mortal has disturbed them. In pace requiescat!
gemini/texts/christianity/christianity.go
... | ...
91 | // Hindi Contemporary Version 2019 2133003bb8b5e62b-01
92 |
93 | // Cache the books from the ASV version of the bible. These should be the same for the ESV bible as well. Note: This does not include the apocrypha.
94 | asvBooks := GetBooks(englishBibleVersions[0].Id, apiKey)
95 |
- 96 | g.AddRoute("/texts/christian/", func(request sis.Request) {
+ 96 | g.AddRoute("/scriptures/christian/", func(request sis.Request) {
97 | var builder strings.Builder
98 | fmt.Fprintf(&builder, "## Bible Versions\n")
99 | fmt.Fprintf(&builder, "### English\n")
... | ...
95 | var builder strings.Builder
96 | fmt.Fprintf(&builder, "## Bible Versions\n")
97 | fmt.Fprintf(&builder, "### English\n")
- 100 | fmt.Fprintf(&builder, "=> /texts/christian/bible/esv/ ESV Bible\n")
+ 100 | fmt.Fprintf(&builder, "=> /scriptures/christian/bible/esv/ ESV Bible\n")
101 | for _, version := range englishBibleVersions {
102 | if version.Id != "" {
... | ...
98 | for _, version := range englishBibleVersions {
99 | if version.Id != "" {
- 103 | fmt.Fprintf(&builder, "=> /texts/christian/bible/%s/ %s\n", version.Id, version.Name)
+ 103 | fmt.Fprintf(&builder, "=> /scriptures/christian/bible/%s/ %s\n", version.Id, version.Name)
104 | } else {
105 | fmt.Fprintf(&builder, "\n")
106 | }
107 | }
108 | fmt.Fprintf(&builder, "\n### Spanish\n")
... | ...
106 | }
107 | }
108 | fmt.Fprintf(&builder, "\n### Spanish\n")
109 | for _, version := range spanishBibleVersions {
110 | if version.Id != "" {
- 111 | fmt.Fprintf(&builder, "=> /texts/christian/bible/%s/ %s\n", version.Id, version.Name)
+ 111 | fmt.Fprintf(&builder, "=> /scriptures/christian/bible/%s/ %s\n", version.Id, version.Name)
112 | } else {
113 | fmt.Fprintf(&builder, "\n")
114 | }
115 | }
116 | fmt.Fprintf(&builder, "\n### German\n")
... | ...
114 | }
115 | }
116 | fmt.Fprintf(&builder, "\n### German\n")
117 | for _, version := range germanBibleVersions {
118 | if version.Id != "" {
- 119 | fmt.Fprintf(&builder, "=> /texts/christian/bible/%s/ %s\n", version.Id, version.Name)
+ 119 | fmt.Fprintf(&builder, "=> /scriptures/christian/bible/%s/ %s\n", version.Id, version.Name)
120 | } else {
121 | fmt.Fprintf(&builder, "\n")
122 | }
123 | }
124 | fmt.Fprintf(&builder, "\n### Arabic\n")
... | ...
122 | }
123 | }
124 | fmt.Fprintf(&builder, "\n### Arabic\n")
125 | for _, version := range arabicBibleVersions {
126 | if version.Id != "" {
- 127 | fmt.Fprintf(&builder, "=> /texts/christian/bible/%s/ %s\n", version.Id, version.Name)
+ 127 | fmt.Fprintf(&builder, "=> /scriptures/christian/bible/%s/ %s\n", version.Id, version.Name)
128 | } else {
129 | fmt.Fprintf(&builder, "\n")
130 | }
131 | }
132 | fmt.Fprintf(&builder, "\n### Italian\n")
... | ...
130 | }
131 | }
132 | fmt.Fprintf(&builder, "\n### Italian\n")
133 | for _, version := range italianBibleVersions {
134 | if version.Id != "" {
- 135 | fmt.Fprintf(&builder, "=> /texts/christian/bible/%s/ %s\n", version.Id, version.Name)
+ 135 | fmt.Fprintf(&builder, "=> /scriptures/christian/bible/%s/ %s\n", version.Id, version.Name)
136 | } else {
137 | fmt.Fprintf(&builder, "\n")
138 | }
139 | }
140 | fmt.Fprintf(&builder, "\n### Modern Hebrew\n")
... | ...
138 | }
139 | }
140 | fmt.Fprintf(&builder, "\n### Modern Hebrew\n")
141 | for _, version := range hebrewBibleVersions {
142 | if version.Id != "" {
- 143 | fmt.Fprintf(&builder, "=> /texts/christian/bible/%s/ %s\n", version.Id, version.Name)
+ 143 | fmt.Fprintf(&builder, "=> /scriptures/christian/bible/%s/ %s\n", version.Id, version.Name)
144 | } else {
145 | fmt.Fprintf(&builder, "\n")
146 | }
147 | }
148 | fmt.Fprintf(&builder, "\n### Greek\n")
... | ...
146 | }
147 | }
148 | fmt.Fprintf(&builder, "\n### Greek\n")
149 | for _, version := range greekBibleVersions {
150 | if version.Id != "" {
- 151 | fmt.Fprintf(&builder, "=> /texts/christian/bible/%s/ %s\n", version.Id, version.Name)
+ 151 | fmt.Fprintf(&builder, "=> /scriptures/christian/bible/%s/ %s\n", version.Id, version.Name)
152 | } else {
153 | fmt.Fprintf(&builder, "\n")
154 | }
155 | }
156 |
... | ...
162 |
163 | Tags: #bible #new #old #testament #septuagint #pentateuch
164 | `, builder.String()))
165 | })
166 |
- 167 | g.AddRoute("/texts/christian/bible/esv/", func(request sis.Request) {
+ 167 | g.AddRoute("/scriptures/christian/bible/esv/", func(request sis.Request) {
168 | var builder strings.Builder
169 | for _, book := range asvBooks {
... | ...
165 | var builder strings.Builder
166 | for _, book := range asvBooks {
- 170 | fmt.Fprintf(&builder, "=> /texts/christian/bible/esv/%s %s\n", url.PathEscape(book.Name+" 1"), book.Name)
+ 170 | fmt.Fprintf(&builder, "=> /scriptures/christian/bible/esv/%s %s\n", url.PathEscape(book.Name+" 1"), book.Name)
171 | }
172 |
173 | request.Gemini(fmt.Sprintf(`# ESV Bible
174 |
175 | => https://api.esv.org/ Powered by Crossway's ESV API
... | ...
182 |
183 | Users may not copy or download more than 500 verses of the ESV Bible or more than one half of any book of the ESV Bible.
184 | `, builder.String()))
185 | })
186 |
- 187 | g.AddRoute("/texts/christian/bible/esv/:text", func(request sis.Request) {
+ 187 | g.AddRoute("/scriptures/christian/bible/esv/:text", func(request sis.Request) {
188 | text := request.GetParam("text")
189 | resp := GetPassages(text)
190 | var builder strings.Builder
191 | for _, s := range resp.Passages {
192 | fmt.Fprintf(&builder, "%s", s)
... | ...
196 |
197 | %s
198 | `, resp.Canonical, builder.String()))
199 | })
200 |
- 201 | g.AddRoute("/texts/christian/bible/:id", func(request sis.Request) {
+ 201 | g.AddRoute("/scriptures/christian/bible/:id", func(request sis.Request) {
202 | versionId := request.GetParam("id")
203 | version := GetBibleVersion(versionId, apiKey)
204 | books := GetBooks(versionId, apiKey)
205 | var builder strings.Builder
206 | for _, book := range books {
... | ...
202 | versionId := request.GetParam("id")
203 | version := GetBibleVersion(versionId, apiKey)
204 | books := GetBooks(versionId, apiKey)
205 | var builder strings.Builder
206 | for _, book := range books {
- 207 | fmt.Fprintf(&builder, "=> /texts/christian/bible/%s/%s %s\n", versionId, book.Id, book.Name)
+ 207 | fmt.Fprintf(&builder, "=> /scriptures/christian/bible/%s/%s %s\n", versionId, book.Id, book.Name)
208 | }
209 |
210 | request.Gemini(fmt.Sprintf(`# %s
211 |
... | ...
207 | }
208 |
209 | request.Gemini(fmt.Sprintf(`# %s
210 |
- 212 | => /texts/christian Bible Versions
+ 212 | => /scriptures/christian Bible Versions
213 |
214 | %s
215 |
216 | Description: %s
217 | Copyright: %s
... | ...
217 | Copyright: %s
218 |
219 | => https://scripture.api.bible Powered by API.Bible`, version.Name, builder.String(), version.Description, version.Copyright))
220 | })
221 |
- 222 | g.AddRoute("/texts/christian/bible/:id/:book", func(request sis.Request) {
+ 222 | g.AddRoute("/scriptures/christian/bible/:id/:book", func(request sis.Request) {
223 | versionId := request.GetParam("id")
224 | bookId := request.GetParam("book")
225 | version := GetBibleVersion(versionId, apiKey)
226 | book := GetBook(versionId, bookId, apiKey, true)
227 | var builder strings.Builder
... | ...
224 | bookId := request.GetParam("book")
225 | version := GetBibleVersion(versionId, apiKey)
226 | book := GetBook(versionId, bookId, apiKey, true)
227 | var builder strings.Builder
228 | for _, chapter := range book.Chapters {
- 229 | fmt.Fprintf(&builder, "=> /texts/christian/bible/%s/chapter/%s Chapter %s\n", versionId, chapter.Id, chapter.Number)
+ 229 | fmt.Fprintf(&builder, "=> /scriptures/christian/bible/%s/chapter/%s Chapter %s\n", versionId, chapter.Id, chapter.Number)
230 | }
231 |
232 | request.Gemini(fmt.Sprintf(`# %s: %s
233 |
... | ...
229 | }
230 |
231 | request.Gemini(fmt.Sprintf(`# %s: %s
232 |
- 234 | => /texts/christian/bible/%s Books
+ 234 | => /scriptures/christian/bible/%s Books
235 |
236 | %s
237 |
238 | %s
239 |
... | ...
238 | %s
239 |
240 | => https://scripture.api.bible Powered by API.Bible`, version.Abbreviation, book.Name, versionId, builder.String(), version.Copyright))
241 | })
242 |
- 243 | g.AddRoute("/texts/christian/bible/:id/chapter/:chapter", func(request sis.Request) {
+ 243 | g.AddRoute("/scriptures/christian/bible/:id/chapter/:chapter", func(request sis.Request) {
244 | versionId := request.GetParam("id")
245 | chapterId := request.GetParam("chapter")
246 | version := GetBibleVersion(versionId, apiKey)
247 | chapter := GetChapter(versionId, chapterId, apiKey)
248 | var builder strings.Builder
... | ...
246 | version := GetBibleVersion(versionId, apiKey)
247 | chapter := GetChapter(versionId, chapterId, apiKey)
248 | var builder strings.Builder
249 | fmt.Fprintf(&builder, "%s", chapter.Content)
250 | /*for _, chapter := range book.Chapters {
- 251 | fmt.Fprintf(&builder, "=> /texts/christian/bible/%s/%s/%s Chapter %s\n", versionId, book.Id, chapter.Id, chapter.Number)
+ 251 | fmt.Fprintf(&builder, "=> /scriptures/christian/bible/%s/%s/%s Chapter %s\n", versionId, book.Id, chapter.Id, chapter.Number)
252 | }*/
253 |
254 | request.Gemini(fmt.Sprintf(`# %s: %s
255 |
... | ...
251 | }*/
252 |
253 | request.Gemini(fmt.Sprintf(`# %s: %s
254 |
- 256 | => /texts/christian/bible/%s/%s Chapters
+ 256 | => /scriptures/christian/bible/%s/%s Chapters
257 |
258 | %s
259 |
... | ...
255 |
256 | %s
257 |
- 260 | => /texts/christian/bible/%s/chapter/%s Previous
- 261 | => /texts/christian/bible/%s/chapter/%s Next
+ 260 | => /scriptures/christian/bible/%s/chapter/%s Previous
+ 261 | => /scriptures/christian/bible/%s/chapter/%s Next
262 |
263 | %s
264 |
265 | => https://scripture.api.bible Powered by API.Bible`, version.Abbreviation, chapter.Reference, versionId, chapter.BookId, builder.String(), versionId, chapter.PreviousChapter.Id, versionId, chapter.NextChapter.Id, version.Copyright))
266 | })
gemini/texts/islam/islam.go
... | ...
105 | versionNames[version.Identifier] = version.Name
106 | }
107 |
108 | versionNames["arabic"] = "Qur'an"
109 |
- 110 | g.AddRoute("/texts/islam", func(request sis.Request) {
+ 110 | g.AddRoute("/scriptures/islam", func(request sis.Request) {
111 | var builder strings.Builder
... | ...
107 | var builder strings.Builder
- 112 | fmt.Fprintf(&builder, "## Qur'an Versions\n\n=> /texts/islam/quran/arabic Arabic\n")
+ 112 | fmt.Fprintf(&builder, "## Qur'an Versions\n\n=> /scriptures/islam/quran/arabic/ Arabic\n")
113 | fmt.Fprintf(&builder, "### English\n")
114 | for _, version := range englishQuranVersions {
115 | if version.Identifier != "" {
... | ...
111 | fmt.Fprintf(&builder, "### English\n")
112 | for _, version := range englishQuranVersions {
113 | if version.Identifier != "" {
- 116 | fmt.Fprintf(&builder, "=> /texts/islam/quran/%s %s\n", version.Identifier, version.Name)
+ 116 | fmt.Fprintf(&builder, "=> /scriptures/islam/quran/%s/ %s\n", version.Identifier, version.Name)
117 | } else {
118 | fmt.Fprintf(&builder, "\n")
119 | }
120 | }
121 | fmt.Fprintf(&builder, "\n### Spanish\n")
... | ...
119 | }
120 | }
121 | fmt.Fprintf(&builder, "\n### Spanish\n")
122 | for _, version := range spanishQuranVersions {
123 | if version.Identifier != "" {
- 124 | fmt.Fprintf(&builder, "=> /texts/islam/quran/%s %s\n", version.Identifier, version.Name)
+ 124 | fmt.Fprintf(&builder, "=> /scriptures/islam/quran/%s/ %s\n", version.Identifier, version.Name)
125 | } else {
126 | fmt.Fprintf(&builder, "\n")
127 | }
128 | }
129 | fmt.Fprintf(&builder, "\n### German\n")
... | ...
127 | }
128 | }
129 | fmt.Fprintf(&builder, "\n### German\n")
130 | for _, version := range germanQuranVersions {
131 | if version.Identifier != "" {
- 132 | fmt.Fprintf(&builder, "=> /texts/islam/quran/%s %s\n", version.Identifier, version.Name)
+ 132 | fmt.Fprintf(&builder, "=> /scriptures/islam/quran/%s/ %s\n", version.Identifier, version.Name)
133 | } else {
134 | fmt.Fprintf(&builder, "\n")
135 | }
136 | }
137 | fmt.Fprintf(&builder, "\n### Russian\n")
... | ...
135 | }
136 | }
137 | fmt.Fprintf(&builder, "\n### Russian\n")
138 | for _, version := range russianQuranVersions {
139 | if version.Identifier != "" {
- 140 | fmt.Fprintf(&builder, "=> /texts/islam/quran/%s %s\n", version.Identifier, version.Name)
+ 140 | fmt.Fprintf(&builder, "=> /scriptures/islam/quran/%s/ %s\n", version.Identifier, version.Name)
141 | } else {
142 | fmt.Fprintf(&builder, "\n")
143 | }
144 | }
145 | fmt.Fprintf(&builder, "\n### French\n")
... | ...
143 | }
144 | }
145 | fmt.Fprintf(&builder, "\n### French\n")
146 | for _, version := range frenchQuranVersions {
147 | if version.Identifier != "" {
- 148 | fmt.Fprintf(&builder, "=> /texts/islam/quran/%s %s\n", version.Identifier, version.Name)
+ 148 | fmt.Fprintf(&builder, "=> /scriptures/islam/quran/%s/ %s\n", version.Identifier, version.Name)
149 | } else {
150 | fmt.Fprintf(&builder, "\n")
151 | }
152 | }
153 | fmt.Fprintf(&builder, "\n### Farsi\n")
... | ...
151 | }
152 | }
153 | fmt.Fprintf(&builder, "\n### Farsi\n")
154 | for _, version := range farsiQuranVersions {
155 | if version.Identifier != "" {
- 156 | fmt.Fprintf(&builder, "=> /texts/islam/quran/%s %s\n", version.Identifier, version.Name)
+ 156 | fmt.Fprintf(&builder, "=> /scriptures/islam/quran/%s/ %s\n", version.Identifier, version.Name)
157 | } else {
158 | fmt.Fprintf(&builder, "\n")
159 | }
160 | }
161 |
... | ...
167 |
168 | Tags: #quran #qur'an #koran #القرآن
169 | `, builder.String()))
170 | })
171 |
- 172 | g.AddRoute("/texts/islam/quran/:version", func(request sis.Request) {
+ 172 | g.AddRoute("/scriptures/islam/quran/:version", func(request sis.Request) {
173 | versionId := request.GetParam("version")
174 | var builder strings.Builder
175 | for _, surah := range quranSurahs {
... | ...
171 | versionId := request.GetParam("version")
172 | var builder strings.Builder
173 | for _, surah := range quranSurahs {
- 176 | fmt.Fprintf(&builder, "=> /texts/islam/quran/%s/%d Surah %d: %s (%s)\n", versionId, surah.Number, surah.Number, surah.EnglishNameTranslation, surah.EnglishName)
+ 176 | fmt.Fprintf(&builder, "=> /scriptures/islam/quran/%s/%d/ Surah %d: %s (%s)\n", versionId, surah.Number, surah.Number, surah.EnglishNameTranslation, surah.EnglishName)
177 | }
178 |
179 | request.Gemini(fmt.Sprintf(`# %s
180 |
... | ...
176 | }
177 |
178 | request.Gemini(fmt.Sprintf(`# %s
179 |
- 181 | => /texts/islam Qur'an Versions
+ 181 | => /scriptures/islam Qur'an Versions
182 |
183 | %s
184 |
185 | => https://alquran.cloud/ Powered by Al Quran Cloud
186 | `, versionNames[versionId], builder.String()))
... | ...
184 |
185 | => https://alquran.cloud/ Powered by Al Quran Cloud
186 | `, versionNames[versionId], builder.String()))
187 | })
188 |
- 189 | g.AddRoute("/texts/islam/quran/:version/:surah", func(request sis.Request) {
+ 189 | g.AddRoute("/scriptures/islam/quran/:version/:surah", func(request sis.Request) {
190 | versionId := request.GetParam("version")
191 | surahNumber := request.GetParam("surah")
192 |
193 | surah := GetSurah(versionId, surahNumber)
194 |
... | ...
199 |
200 | if surah.Number > 1 || surah.Number < len(quranSurahs) {
201 | fmt.Fprintf(&builder, "\n\n")
202 | }
203 | if surah.Number > 1 {
- 204 | fmt.Fprintf(&builder, "=> /texts/islam/quran/%s/%d Previous\n", versionId, surah.Number-1)
+ 204 | fmt.Fprintf(&builder, "=> /scriptures/islam/quran/%s/%d/ Previous\n", versionId, surah.Number-1)
205 | }
206 | if surah.Number < len(quranSurahs) {
... | ...
202 | }
203 | if surah.Number < len(quranSurahs) {
- 207 | fmt.Fprintf(&builder, "=> /texts/islam/quran/%s/%d Next\n", versionId, surah.Number+1)
+ 207 | fmt.Fprintf(&builder, "=> /scriptures/islam/quran/%s/%d/ Next\n", versionId, surah.Number+1)
208 | }
209 |
210 | request.Gemini(fmt.Sprintf(`# %s, Surah %d: %s (%s)
211 |
... | ...
207 | }
208 |
209 | request.Gemini(fmt.Sprintf(`# %s, Surah %d: %s (%s)
210 |
- 212 | => /texts/islam/quran/%s Surahs
+ 212 | => /scriptures/islam/quran/%s/ Surahs
213 |
214 | %s
215 |
216 | => https://alquran.cloud/ Powered by Al Quran Cloud
217 | `, versionNames[versionId], surah.Number, surah.EnglishNameTranslation, surah.EnglishName, versionId, builder.String()))
gemini/texts/judaism/judaism.go
... | ...
25 | //stripTags := bluemonday.StripTagsPolicy()
26 |
27 | index := GetFullIndex()
28 | //indexMap := make(map[string]int)
29 |
- 30 | g.AddRoute("/texts/jewish/", func(request sis.Request) {
+ 30 | g.AddRoute("/scriptures/jewish/", func(request sis.Request) {
31 | query := request.Query()
32 | if query == "" {
33 | handleIndex(index, request)
34 | } else {
35 | handleCategory(index, query, request)
... | ...
34 | } else {
35 | handleCategory(index, query, request)
36 | }
37 | })
38 |
- 39 | g.AddRoute("/texts/jewish/t/:ref", func(request sis.Request) {
+ 39 | g.AddRoute("/scriptures/jewish/t/:ref", func(request sis.Request) {
40 | ref := request.GetParam("ref")
41 | handleText(ref, request)
42 | })
43 | }
44 |
... | ...
43 | }
44 |
45 | func handleIndex(index []SefariaIndexCategoryOrText, request sis.Request) {
46 | var builder strings.Builder
47 | for _, category := range index {
- 48 | fmt.Fprintf(&builder, "=> /texts/jewish/?%s %s\n", url.QueryEscape(category.Category), category.Category)
+ 48 | fmt.Fprintf(&builder, "=> /scriptures/jewish/?%s %s\n", url.QueryEscape(category.Category), category.Category)
49 | }
50 |
51 | calendars := GetCalendars()
52 | fmt.Fprintf(&builder, "\n## Learning Schedules for %s\n", calendars.Date)
53 | for _, calendar := range calendars.CalendarItems {
... | ...
52 | fmt.Fprintf(&builder, "\n## Learning Schedules for %s\n", calendars.Date)
53 | for _, calendar := range calendars.CalendarItems {
54 | // Special handling of parashot
55 | if calendar.Title.English == "Parashat Hashavua" {
56 | fmt.Fprintf(&builder, "### Parashat %s (%s)\n", calendar.DisplayValue.English, calendar.Title.Hebrew+" "+calendar.DisplayValue.Hebrew)
- 57 | fmt.Fprintf(&builder, "=> /texts/jewish/t/%s %s\n", EncodeTextReference(calendar.Ref), calendar.Ref)
+ 57 | fmt.Fprintf(&builder, "=> /scriptures/jewish/t/%s %s\n", EncodeTextReference(calendar.Ref), calendar.Ref)
58 | if calendar.Description.English != "" {
59 | fmt.Fprintf(&builder, "%s\n\n", calendar.Description.English)
60 | }
61 | } else if calendar.Title.English == "Tanakh Yomi" {
62 | fmt.Fprintf(&builder, "### %s (%s)\n", calendar.Title.English, calendar.Title.Hebrew)
... | ...
58 | if calendar.Description.English != "" {
59 | fmt.Fprintf(&builder, "%s\n\n", calendar.Description.English)
60 | }
61 | } else if calendar.Title.English == "Tanakh Yomi" {
62 | fmt.Fprintf(&builder, "### %s (%s)\n", calendar.Title.English, calendar.Title.Hebrew)
- 63 | fmt.Fprintf(&builder, "=> /texts/jewish/t/%s %s (%s)\n", EncodeTextReference(calendar.Ref), calendar.DisplayValue.English, calendar.Ref)
+ 63 | fmt.Fprintf(&builder, "=> /scriptures/jewish/t/%s %s (%s)\n", EncodeTextReference(calendar.Ref), calendar.DisplayValue.English, calendar.Ref)
64 | if calendar.Description.English != "" {
65 | fmt.Fprintf(&builder, "%s\n\n", calendar.Description.English)
66 | }
67 | } else {
68 | fmt.Fprintf(&builder, "### %s (%s)\n", calendar.Title.English, calendar.Title.Hebrew)
... | ...
64 | if calendar.Description.English != "" {
65 | fmt.Fprintf(&builder, "%s\n\n", calendar.Description.English)
66 | }
67 | } else {
68 | fmt.Fprintf(&builder, "### %s (%s)\n", calendar.Title.English, calendar.Title.Hebrew)
- 69 | fmt.Fprintf(&builder, "=> /texts/jewish/t/%s %s\n", EncodeTextReference(calendar.Ref), calendar.DisplayValue.English)
+ 69 | fmt.Fprintf(&builder, "=> /scriptures/jewish/t/%s %s\n", EncodeTextReference(calendar.Ref), calendar.DisplayValue.English)
70 | if calendar.Description.English != "" {
71 | fmt.Fprintf(&builder, "%s\n\n", calendar.Description.English)
72 | }
73 | }
74 | }
... | ...
100 |
101 | var builder strings.Builder
102 | for _, category := range categoryOrText.Contents {
103 | if category.Title != "" {
104 | // A text
- 105 | fmt.Fprintf(&builder, "=> /texts/jewish/t/%s %s\n", url.PathEscape(category.Title), category.Title)
+ 105 | fmt.Fprintf(&builder, "=> /scriptures/jewish/t/%s %s\n", url.PathEscape(category.Title), category.Title)
106 | } else {
... | ...
102 | } else {
- 107 | fmt.Fprintf(&builder, "=> /texts/jewish/?%s %s\n", url.QueryEscape(query+"/"+category.Category), category.Category)
+ 107 | fmt.Fprintf(&builder, "=> /scriptures/jewish/?%s %s\n", url.QueryEscape(query+"/"+category.Category), category.Category)
108 | }
109 | }
110 |
111 | request.Gemini(fmt.Sprintf(`# %s
112 |
... | ...
173 |
174 | if text.Next != "" || text.Prev != "" {
175 | fmt.Fprintf(&builder, "\n\n")
176 | }
177 | if text.Prev != "" {
- 178 | fmt.Fprintf(&builder, "=> /texts/jewish/t/%s Previous\n", url.PathEscape(text.Prev))
+ 178 | fmt.Fprintf(&builder, "=> /scriptures/jewish/t/%s Previous\n", url.PathEscape(text.Prev))
179 | }
180 | if text.Next != "" {
... | ...
176 | }
177 | if text.Next != "" {
- 181 | fmt.Fprintf(&builder, "=> /texts/jewish/t/%s Next", url.PathEscape(text.Next))
+ 181 | fmt.Fprintf(&builder, "=> /scriptures/jewish/t/%s Next", url.PathEscape(text.Next))
182 | }
183 |
184 | // Commentary links to display on the text's page. The other commentaries are listed on a "More Commentaries" page
185 | // TODO: Add Abarbanel (Which is considered in the category of "Quoting Commentary")
186 | // TODO: Add Gersonides/Ralbag
... | ...
209 | links := GetLinks(text.Ref, "", "") // Get Commentaries
210 | dict := make(map[string]bool)
211 |
212 | fmt.Fprintf(&builder, "\n\n##Commentaries\n\n")
213 | if text.PrimaryCategory == "Mishnah" {
- 214 | fmt.Fprintf(&builder, "=> /texts/jewish/t/%s Tosefta\n", url.PathEscape("Tosefta "+text.Ref))
+ 214 | fmt.Fprintf(&builder, "=> /scriptures/jewish/t/%s Tosefta\n", url.PathEscape("Tosefta "+text.Ref))
215 | }
216 | for _, link := range links {
217 | if (link.Category != "Commentary" && link.Category != "Halakhah" && link.Category != "Targum") || !link.SourceHasEn {
218 | continue
219 | }
... | ...
221 | continue
222 | }
223 | if _, ok := dict[link.IndexTitle]; !ok {
224 | // Add to map so we can check whether it repeats, then print the first reference.
225 | dict[link.IndexTitle] = true
- 226 | fmt.Fprintf(&builder, "=> /texts/jewish/t/%s %s\n", url.PathEscape(link.Ref), link.IndexTitle)
+ 226 | fmt.Fprintf(&builder, "=> /scriptures/jewish/t/%s %s\n", url.PathEscape(link.Ref), link.IndexTitle)
227 | }
228 | }
229 | }
230 |
231 | request.Gemini(fmt.Sprintf(`# %s
232 |
... | ...
228 | }
229 | }
230 | }
231 |
232 | request.Gemini(fmt.Sprintf(`# %s
233 |
- 233 | => /texts/jewish Home
- 234 | => /texts/jewish?%s %s
+ 233 | => /scriptures/jewish Home
+ 234 | => /scriptures/jewish?%s %s
235 |
236 | %s
237 |
238 | ## Version Info
239 |
240 | Version: %s
241 | => %s Source: %s
242 | License: %s
243 |
... | ...
239 |
240 | %s
241 |
242 | ## Version Info
243 |
244 | Version: %s
245 | => %s Source: %s
246 | License: %s
247 |
- 244 | => /texts/jewish Jewish Texts
+ 244 | => /scriptures/jewish Jewish Texts
245 | => https://sefaria.org Powered by Sefaria.org`, text.Ref, url.QueryEscape(strings.Join(text.Categories, "/")), text.Categories[len(text.Categories)-1] /*stripTags.Sanitize(*/, builder.String() /*)*/, text.VersionTitle, text.VersionSource, text.VersionSource, text.License))
246 | }
247 |
248 | func parseHtmlFromString(text string) string {
249 | root, err := html.Parse(strings.NewReader(text))
gemini/texts/texts.go
... | ...
15 | "gitlab.com/clseibold/auragem_sis/gemini/texts/judaism"
16 | sis "gitlab.com/clseibold/smallnetinformationservices"
17 | )
18 |
19 | func HandleTexts(g sis.ServerHandle) {
- 20 | g.AddRoute("/texts/", func(request sis.Request) {
+ 20 | g.AddRoute("/scriptures/", func(request sis.Request) {
21 | request.Gemini(`# Religious Texts
22 |
... | ...
18 | request.Gemini(`# Religious Texts
19 |
- 23 | => /texts/jewish/ ✡ Jewish Texts
- 24 | => /texts/christian/ ✝ Christian Texts
- 25 | => /texts/islam/ ☪ Islamic Texts
+ 23 | => /scriptures/jewish/ ✡ Jewish Texts
+ 24 | => /scriptures/christian/ ✝ Christian Texts
+ 25 | => /scriptures/islam/ ☪ Islamic Texts
26 | `)
27 | })
28 |
29 | judaism.HandleJewishTexts(g)
30 | christianity.HandleChristianTexts(g)
gemini/youtube/utils.go
... | ...
100 | panic(err)
101 | }
102 |
103 | channel := response.Items[0]
104 | uploadsPlaylistId := channel.ContentDetails.RelatedPlaylists.Uploads
+ 105 | time.Sleep(time.Millisecond * 120)
105 |
106 | var call2 *youtube.PlaylistItemsListCall
107 | if currentPage != "" {
108 | call2 = service.PlaylistItems.List([]string{"id", "snippet"}).PlaylistId(uploadsPlaylistId).MaxResults(25).PageToken(currentPage)
109 | } else {
... | ...
110 | call2 = service.PlaylistItems.List([]string{"id", "snippet"}).PlaylistId(uploadsPlaylistId).MaxResults(25)
111 | }
112 | response2, err2 := call2.Do()
113 | if err2 != nil {
114 | //log.Fatalf("Error: %v", err)
- 115 | panic(err)
+ 116 | panic(err2)
116 | }
117 |
118 | var builder strings.Builder
119 | if response2.PrevPageToken != "" {
120 | fmt.Fprintf(&builder, "=> /youtube/channel/%s/videos/%s Previous Page\n", channelId, response2.PrevPageToken)
go.mod
... | ...
-2 | module gitlab.com/clseibold/auragem_sis
-1 |
- 3 | go 1.21.0
+ 3 | go 1.22.0
4 |
5 | require (
6 | github.com/dhowden/tag v0.0.0-20240122214204-713ab0e94639
7 | github.com/efarrer/iothrottler v0.0.3
8 | github.com/gammazero/deque v0.2.1
... | ...
12 | github.com/kkdai/youtube/v2 v2.10.0
13 | github.com/krayzpipes/cronticker v0.0.1
14 | github.com/nakagami/firebirdsql v0.9.7
15 | github.com/rs/zerolog v1.32.0
16 | github.com/spf13/cobra v1.8.0
- 17 | gitlab.com/clseibold/smallnetinformationservices v0.0.0-20240301122553-fbf9978ceae5
+ 17 | gitlab.com/clseibold/smallnetinformationservices v0.0.0-20240302012040-36a79727c3ec
18 | golang.org/x/net v0.21.0
19 | golang.org/x/oauth2 v0.17.0
20 | golang.org/x/text v0.14.0
21 | golang.org/x/time v0.5.0
22 | google.golang.org/api v0.167.0
go.sum
... | ... 159 | github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= 160 | github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= 161 | github.com/warpfork/go-fsx v0.4.0 h1:mlSH89UOECT5+NdRo8gPaE92Pm1xvt6cbzGkFa4QcsA= 162 | github.com/warpfork/go-fsx v0.4.0/go.mod h1:oTACCMj+Zle+vgVa5SAhGAh7WksYpLgGUCKEAVc+xPg= 163 | github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= - 164 | gitlab.com/clseibold/smallnetinformationservices v0.0.0-20240229204432-77e5f2792788 h1:rDMYjWdLcx/LUJa4UlNWVC5otHQFhzD9gE9ryi9Tqls= - 165 | gitlab.com/clseibold/smallnetinformationservices v0.0.0-20240229204432-77e5f2792788/go.mod h1:4JbT4i/Kh08G+Z6brPWq/HfRLqSK7+0HXuw1GC1wa9U= - 166 | gitlab.com/clseibold/smallnetinformationservices v0.0.0-20240301001341-a902ff8e3220 h1:rXHgvH+DBUSp8Xu7UoG+aII+GkC1ZI24Fs/VLpqtwSQ= - 167 | gitlab.com/clseibold/smallnetinformationservices v0.0.0-20240301001341-a902ff8e3220/go.mod h1:4JbT4i/Kh08G+Z6brPWq/HfRLqSK7+0HXuw1GC1wa9U= - 168 | gitlab.com/clseibold/smallnetinformationservices v0.0.0-20240301004723-4a4bc4f556f2 h1:q9Y3igKtw4GNMY11QIupEZtBrqO+5qtOEY2vvET8DsY= - 169 | gitlab.com/clseibold/smallnetinformationservices v0.0.0-20240301004723-4a4bc4f556f2/go.mod h1:4JbT4i/Kh08G+Z6brPWq/HfRLqSK7+0HXuw1GC1wa9U= - 170 | gitlab.com/clseibold/smallnetinformationservices v0.0.0-20240301062240-e03829b00a05 h1:SG8tPslVXLZifef7DajXoK8yELKYGlD2nyxxpRWELkw= - 171 | gitlab.com/clseibold/smallnetinformationservices v0.0.0-20240301062240-e03829b00a05/go.mod h1:+xMppp52ZAhfo5QdXvSgdtH1bZgQ8KIHz5cFYu5qhOc= - 172 | gitlab.com/clseibold/smallnetinformationservices v0.0.0-20240301090632-9841c942c1fb h1:W7LcabUTLv+WsrCsQKkguaRRoHbx0z+suji1YpQvIug= - 173 | gitlab.com/clseibold/smallnetinformationservices v0.0.0-20240301090632-9841c942c1fb/go.mod h1:+xMppp52ZAhfo5QdXvSgdtH1bZgQ8KIHz5cFYu5qhOc= - 174 | gitlab.com/clseibold/smallnetinformationservices v0.0.0-20240301101742-3320185e18a0 h1:sdmTBtHWkkoU1jkusOnFrjTP/G7PFrZ6RqqbHaLg3ok= - 175 | gitlab.com/clseibold/smallnetinformationservices v0.0.0-20240301101742-3320185e18a0/go.mod h1:+xMppp52ZAhfo5QdXvSgdtH1bZgQ8KIHz5cFYu5qhOc= - 176 | gitlab.com/clseibold/smallnetinformationservices v0.0.0-20240301121107-c3544f67d315 h1:3/EGVH5m6a5rS02DnB5w+ViMuOb1GEFq8X4TVESMDbo= - 177 | gitlab.com/clseibold/smallnetinformationservices v0.0.0-20240301121107-c3544f67d315/go.mod h1:+xMppp52ZAhfo5QdXvSgdtH1bZgQ8KIHz5cFYu5qhOc= - 178 | gitlab.com/clseibold/smallnetinformationservices v0.0.0-20240301121808-ef50d7e83a74 h1:KIbcN4eLLszGzcZr5011PlMIWxcuPCXUO8KlABteFic= - 179 | gitlab.com/clseibold/smallnetinformationservices v0.0.0-20240301121808-ef50d7e83a74/go.mod h1:+xMppp52ZAhfo5QdXvSgdtH1bZgQ8KIHz5cFYu5qhOc= - 180 | gitlab.com/clseibold/smallnetinformationservices v0.0.0-20240301122553-fbf9978ceae5 h1:6dQlbBTZzcfcVomy9oVphLVVMOjTwO54YKF5qL6Uz8Q= - 181 | gitlab.com/clseibold/smallnetinformationservices v0.0.0-20240301122553-fbf9978ceae5/go.mod h1:+xMppp52ZAhfo5QdXvSgdtH1bZgQ8KIHz5cFYu5qhOc= + 164 | gitlab.com/clseibold/smallnetinformationservices v0.0.0-20240301124704-c136cd97a912 h1:SCGTuj5k7Q2+O7kd5IPJE9d/3O3Ju6m1IPvsz5RsFNE= + 165 | gitlab.com/clseibold/smallnetinformationservices v0.0.0-20240301124704-c136cd97a912/go.mod h1:+xMppp52ZAhfo5QdXvSgdtH1bZgQ8KIHz5cFYu5qhOc= + 166 | gitlab.com/clseibold/smallnetinformationservices v0.0.0-20240302000743-bcbe5440062f h1:Z5o7uQ1OGcYlV6Aqcpe8yjs5hycWAs5veftLqHyZqY4= + 167 | gitlab.com/clseibold/smallnetinformationservices v0.0.0-20240302000743-bcbe5440062f/go.mod h1:+xMppp52ZAhfo5QdXvSgdtH1bZgQ8KIHz5cFYu5qhOc= + 168 | gitlab.com/clseibold/smallnetinformationservices v0.0.0-20240302011715-e37eb80374f5 h1:cCA2G99jiZg5Kd3Sq87IfUncu1dhcLywMsTIlVqE5G4= + 169 | gitlab.com/clseibold/smallnetinformationservices v0.0.0-20240302011715-e37eb80374f5/go.mod h1:+xMppp52ZAhfo5QdXvSgdtH1bZgQ8KIHz5cFYu5qhOc= + 170 | gitlab.com/clseibold/smallnetinformationservices v0.0.0-20240302012040-36a79727c3ec h1:LVniyZT8HBp3u8PvcrMzFmohRHK8QHM8VpJuWCF6/K0= + 171 | gitlab.com/clseibold/smallnetinformationservices v0.0.0-20240302012040-36a79727c3ec/go.mod h1:+xMppp52ZAhfo5QdXvSgdtH1bZgQ8KIHz5cFYu5qhOc= 182 | gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b h1:7gd+rd8P3bqcn/96gOZa3F5dpJr/vEiDQYlNb/y2uNs= 183 | gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b/go.mod h1:T3BPAOm2cqquPa0MKWeNkmOM5RQsRhkrwMWonFMN7fE= 184 | go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= 185 | go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= 186 | go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.48.0 h1:doUP+ExOpH3spVTLS0FcWGLnQrPct/hD/bCPbDRUEAU=