Skip to content

Commit 9737cc6

Browse files
upgrade libraries, move cache to better directory+boltdb
1 parent eb8de16 commit 9737cc6

File tree

365 files changed

+182889
-973
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

365 files changed

+182889
-973
lines changed

go.mod

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,17 @@ module github.com/kylegrantlucas/lyricpiece
33
go 1.19
44

55
require (
6-
github.com/andybrewer/mack v0.0.0-20200226161639-15be3d47cc54
6+
github.com/andybrewer/mack v0.0.0-20220307193339-22e922cc18af
7+
github.com/boltdb/bolt v1.3.1
78
github.com/rhnvrm/lyric-api-go v0.1.4
8-
gopkg.in/mattes/go-expand-tilde.v1 v1.0.0-20150330173918-cb884138e64c
99
)
1010

1111
require (
12-
github.com/PuerkitoBio/goquery v1.4.1 // indirect
13-
github.com/andybalholm/cascadia v1.0.0 // indirect
12+
github.com/PuerkitoBio/goquery v1.8.0 // indirect
13+
github.com/andybalholm/cascadia v1.3.1 // indirect
1414
github.com/gopherjs/gopherjs v1.17.2 // indirect
15-
github.com/gosimple/slug v1.2.0 // indirect
16-
github.com/rainycape/unidecode v0.0.0-20150907023854-cb7f23ec59be // indirect
17-
golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d // indirect
15+
github.com/gosimple/slug v1.13.0 // indirect
16+
github.com/gosimple/unidecode v1.0.1 // indirect
17+
golang.org/x/net v0.0.0-20220930213112-107f3e3c3b0b // indirect
18+
golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec // indirect
1819
)

go.sum

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,22 @@
1-
github.com/PuerkitoBio/goquery v1.4.1 h1:smcIRGdYm/w7JSbcdeLHEMzxmsBQvl8lhf0dSw2nzMI=
21
github.com/PuerkitoBio/goquery v1.4.1/go.mod h1:T9ezsOHcCrDCgA8aF1Cqr3sSYbO/xgdy8/R/XiIMAhA=
3-
github.com/andybalholm/cascadia v1.0.0 h1:hOCXnnZ5A+3eVDX8pvgl4kofXv2ELss0bKcqRySc45o=
2+
github.com/PuerkitoBio/goquery v1.8.0 h1:PJTF7AmFCFKk1N6V6jmKfrNH9tV5pNE6lZMkG0gta/U=
3+
github.com/PuerkitoBio/goquery v1.8.0/go.mod h1:ypIiRMtY7COPGk+I/YbZLbxsxn9g5ejnI2HSMtkjZvI=
44
github.com/andybalholm/cascadia v1.0.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
5-
github.com/andybrewer/mack v0.0.0-20200226161639-15be3d47cc54 h1:uZMWs9VZiUv6J6gHdlDUA4Y11ckPLe+qYagoHfQb6BY=
6-
github.com/andybrewer/mack v0.0.0-20200226161639-15be3d47cc54/go.mod h1:unYm1XWSUgGRVv0MaRe3DFEGh2OEcUQ/sFSGxXjXBfI=
5+
github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c=
6+
github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA=
7+
github.com/andybrewer/mack v0.0.0-20220307193339-22e922cc18af h1:PNE0xdyuLeOTujftqZs8DlhDoi+T54ONZhiGOxH5t2A=
8+
github.com/andybrewer/mack v0.0.0-20220307193339-22e922cc18af/go.mod h1:oUO968BJnuljnB5tntrY3w3zDfI5/PqnQ+RuiZ8aFhk=
9+
github.com/boltdb/bolt v1.3.1 h1:JQmyP4ZBrce+ZQu0dY660FMfatumYDLun9hBCUVIkF4=
10+
github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps=
711
github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g=
812
github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k=
9-
github.com/gosimple/slug v1.2.0 h1:DqQXHQLprYBsiO4ZtdadqBeKh7CFnl5qoVNkKkVI7No=
1013
github.com/gosimple/slug v1.2.0/go.mod h1:ER78kgg1Mv0NQGlXiDe57DpCyfbNywXXZ9mIorhxAf0=
14+
github.com/gosimple/slug v1.13.0 h1:w4W2sU2a/JcAkI+LN316Cn/NE4CXopoXto9aloYTic0=
15+
github.com/gosimple/slug v1.13.0/go.mod h1:UiRaFH+GEilHstLUmcBgWcI42viBN7mAb818JrYOeFQ=
16+
github.com/gosimple/unidecode v1.0.1 h1:hZzFTMMqSswvf0LBJZCZgThIZrpDHFXux9KeGmn6T/o=
17+
github.com/gosimple/unidecode v1.0.1/go.mod h1:CP0Cr1Y1kogOtx0bJblKzsVWrqYaqfNOnHzpgWw4Awc=
1118
github.com/jtolds/gls v4.2.1+incompatible h1:fSuqC+Gmlu6l/ZYAoZzx2pyucC8Xza35fpRVWLVmUEE=
1219
github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
13-
github.com/rainycape/unidecode v0.0.0-20150907023854-cb7f23ec59be h1:ta7tUOvsPHVHGom5hKW5VXNc2xZIkfCKP8iaqOyYtUQ=
1420
github.com/rainycape/unidecode v0.0.0-20150907023854-cb7f23ec59be/go.mod h1:MIDFMn7db1kT65GmV94GzpX9Qdi7N/pQlwb+AN8wh+Q=
1521
github.com/rhnvrm/lyric-api-go v0.1.4 h1:E3n6+H4PyVJCesc3NNIbLxKlFpyMVDiq2niKSZK7K1s=
1622
github.com/rhnvrm/lyric-api-go v0.1.4/go.mod h1:mxXSk7lWgck4BEMLsOgse2AiE+qoXIc9mcfxF2YQCHs=
@@ -20,7 +26,13 @@ github.com/smartystreets/goconvey v0.0.0-20180222194500-ef6db91d284a h1:JSvGDIbm
2026
github.com/smartystreets/goconvey v0.0.0-20180222194500-ef6db91d284a/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s=
2127
golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
2228
golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
23-
golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d h1:LO7XpTYMwTqxjLcGWPijK3vRXg1aWdlNOVOHRq45d7c=
24-
golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
25-
gopkg.in/mattes/go-expand-tilde.v1 v1.0.0-20150330173918-cb884138e64c h1:/Onz8dZtKBCmB8P0JU7+WSCfMekXry7BflVO0SQQrCU=
26-
gopkg.in/mattes/go-expand-tilde.v1 v1.0.0-20150330173918-cb884138e64c/go.mod h1:j6QavCO5cYWud1+2/PFTXL1y6tjjkhSs+qcWgibOIc0=
29+
golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
30+
golang.org/x/net v0.0.0-20220930213112-107f3e3c3b0b h1:uKO3Js8lXGjpjdc4J3rqs0/Ex5yDKUGfk43tTYWVLas=
31+
golang.org/x/net v0.0.0-20220930213112-107f3e3c3b0b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
32+
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
33+
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
34+
golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec h1:BkDtF2Ih9xZ7le9ndzTA7KJow28VbQW3odyk/8drmuI=
35+
golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
36+
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
37+
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
38+
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=

lyricpiece/client.go

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
package lyricpiece
2+
3+
import (
4+
"fmt"
5+
"math/rand"
6+
"strings"
7+
"time"
8+
9+
"github.com/boltdb/bolt"
10+
lyrics "github.com/rhnvrm/lyric-api-go"
11+
)
12+
13+
type Client struct {
14+
db *bolt.DB
15+
}
16+
17+
func NewClient(dbfile string) (*Client, error) {
18+
db, err := bolt.Open(dbfile, 0600, nil)
19+
if err != nil {
20+
return nil, err
21+
}
22+
23+
return &Client{
24+
db: db,
25+
}, nil
26+
}
27+
28+
func (lp *Client) Close() error {
29+
return lp.db.Close()
30+
}
31+
32+
func (lp *Client) GetLyricPiece(song Song) (string, error) {
33+
rand.Seed(time.Now().Unix())
34+
35+
lyrics, err := lp.getLyrics(lp.db, song)
36+
if err != nil {
37+
fmt.Println(err)
38+
return "", err
39+
}
40+
chunkedLyrics := strings.Split(lyrics, "\n\n")
41+
42+
fullLyrics := []string{}
43+
for _, s := range chunkedLyrics {
44+
if strings.TrimSpace(s) != "" {
45+
fullLyrics = append(fullLyrics, s)
46+
}
47+
}
48+
49+
if len(fullLyrics) > 0 {
50+
return strings.TrimSpace(
51+
fullLyrics[rand.Intn(len(fullLyrics))],
52+
), nil
53+
}
54+
55+
return "", nil
56+
}
57+
58+
func (lp *Client) getLyrics(db *bolt.DB, song Song) (string, error) {
59+
lyrics, err := lp.queryDBForLyrics(db, song)
60+
if err != nil {
61+
return lyrics, err
62+
}
63+
64+
if lyrics == "" {
65+
downloadedLyrics, err := lp.queryLyrics(song)
66+
if err != nil {
67+
return lyrics, err
68+
}
69+
70+
if downloadedLyrics != "" {
71+
err = lp.writeLyricsToDB(db, song, downloadedLyrics)
72+
if err != nil {
73+
return lyrics, err
74+
}
75+
}
76+
77+
lyrics = downloadedLyrics
78+
}
79+
80+
return lyrics, nil
81+
}
82+
83+
func (lp *Client) queryDBForLyrics(db *bolt.DB, song Song) (string, error) {
84+
var lyrics string
85+
err := db.View(func(tx *bolt.Tx) error {
86+
b := tx.Bucket([]byte("lyrics"))
87+
if b == nil {
88+
// we don't care if we can't find the bucket
89+
return nil
90+
}
91+
lyrics = string(b.Get([]byte(song.buildLyricKey())))
92+
93+
return nil
94+
})
95+
if err != nil {
96+
return lyrics, err
97+
}
98+
99+
return lyrics, nil
100+
}
101+
102+
func (lp *Client) writeLyricsToDB(db *bolt.DB, song Song, lyrics string) error {
103+
err := db.Update(func(tx *bolt.Tx) error {
104+
bucket, err := tx.CreateBucketIfNotExists([]byte("lyrics"))
105+
if err != nil {
106+
return fmt.Errorf("create bucket: %s", err)
107+
}
108+
return bucket.Put([]byte(song.buildLyricKey()), []byte(lyrics))
109+
})
110+
if err != nil {
111+
return err
112+
}
113+
114+
return nil
115+
}
116+
117+
func (lp *Client) queryLyrics(song Song) (string, error) {
118+
l := lyrics.New()
119+
lyric, err := l.Search(song.Artist, song.Title)
120+
if err != nil {
121+
return "", err
122+
}
123+
124+
return lyric, nil
125+
}

lyricpiece/song.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package lyricpiece
2+
3+
type Song struct {
4+
Title string
5+
Artist string
6+
}
7+
8+
func (s Song) buildLyricKey() string {
9+
return s.Artist + "/" + s.Title
10+
}

main.go

Lines changed: 27 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -2,37 +2,50 @@ package main
22

33
import (
44
"fmt"
5-
"io/ioutil"
6-
"math/rand"
75
"os"
8-
"strings"
96
"sync"
10-
"time"
117

128
"github.com/andybrewer/mack"
13-
lyrics "github.com/rhnvrm/lyric-api-go"
14-
tilde "gopkg.in/mattes/go-expand-tilde.v1"
9+
"github.com/kylegrantlucas/lyricpiece/lyricpiece"
1510
)
1611

1712
func main() {
18-
song := getCurrentSong()
13+
dbPath, err := buildDBPath()
14+
if err != nil {
15+
fmt.Fprintln(os.Stderr, err)
16+
}
1917

20-
lyrics, err := getLyrics(song)
18+
client, err := lyricpiece.NewClient(dbPath)
2119
if err != nil {
2220
fmt.Fprintln(os.Stderr, err)
2321
}
22+
defer client.Close()
2423

25-
lyricPiece := getRandomLyricPiece(lyrics)
24+
song := getCurrentSong()
25+
lyricPiece, err := client.GetLyricPiece(song)
26+
if err != nil {
27+
fmt.Fprintln(os.Stderr, err)
28+
}
2629

2730
fmt.Print(lyricPiece)
2831
}
2932

30-
type Song struct {
31-
Title string
32-
Artist string
33+
func buildDBPath() (string, error) {
34+
homedir, err := os.UserHomeDir()
35+
if err != nil {
36+
return "", err
37+
}
38+
39+
path := homedir + "/.cache/lyricpiece"
40+
err = os.MkdirAll(path, os.ModePerm)
41+
if err != nil {
42+
return "", err
43+
}
44+
45+
return path + "/lyricpiece.db", nil
3346
}
3447

35-
func getCurrentSong() Song {
48+
func getCurrentSong() lyricpiece.Song {
3649
var track, artist string
3750
wg := &sync.WaitGroup{}
3851
wg.Add(2)
@@ -49,76 +62,5 @@ func getCurrentSong() Song {
4962

5063
wg.Wait()
5164

52-
return Song{Title: track, Artist: artist}
53-
}
54-
55-
func getLyrics(song Song) (string, error) {
56-
var lyrics string
57-
filename, err := tilde.Expand(fmt.Sprintf("~/lyrics/%s-%s.txt", strings.TrimSpace(song.Title), strings.TrimSpace(song.Artist)))
58-
if err != nil {
59-
return lyrics, err
60-
}
61-
62-
if fileExists(filename) {
63-
file, err := ioutil.ReadFile(filename)
64-
if err != nil {
65-
return lyrics, err
66-
}
67-
lyrics = string(file)
68-
} else {
69-
downloadedLyrics, err := queryLyrics(song)
70-
if err != nil {
71-
return lyrics, err
72-
}
73-
74-
if downloadedLyrics != "" {
75-
err = ioutil.WriteFile(filename, []byte(downloadedLyrics), 0644)
76-
if err != nil {
77-
return lyrics, err
78-
}
79-
}
80-
81-
lyrics = downloadedLyrics
82-
}
83-
84-
return lyrics, nil
85-
}
86-
87-
func getRandomLyricPiece(lyrics string) string {
88-
rand.Seed(time.Now().Unix())
89-
90-
chunkedLyrics := strings.Split(lyrics, "\n\n")
91-
92-
fullLyrics := []string{}
93-
for _, s := range chunkedLyrics {
94-
if strings.TrimSpace(s) != "" {
95-
fullLyrics = append(fullLyrics, s)
96-
}
97-
}
98-
99-
if len(fullLyrics) > 0 {
100-
return strings.TrimSpace(
101-
fullLyrics[rand.Intn(len(fullLyrics))],
102-
)
103-
}
104-
105-
return ""
106-
}
107-
108-
func fileExists(filename string) bool {
109-
info, err := os.Stat(filename)
110-
if os.IsNotExist(err) {
111-
return false
112-
}
113-
return !info.IsDir()
114-
}
115-
116-
func queryLyrics(song Song) (string, error) {
117-
l := lyrics.New()
118-
lyric, err := l.Search(song.Artist, song.Title)
119-
if err != nil {
120-
return "", err
121-
}
122-
123-
return lyric, nil
65+
return lyricpiece.Song{Title: track, Artist: artist}
12466
}

vendor/github.com/PuerkitoBio/goquery/.travis.yml

Lines changed: 0 additions & 15 deletions
This file was deleted.

vendor/github.com/PuerkitoBio/goquery/LICENSE

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)