add lyric fetcher

add lyric fetcher
This commit is contained in:
raziman 2021-02-23 10:24:23 +08:00
parent b049c075de
commit 5b05a60012
8 changed files with 318 additions and 0 deletions

View File

@ -386,6 +386,19 @@ func (c Command) defineCommands() {
})
c.define("fetch_lyric", func() {
audioFile := gomu.playlist.getCurrentFile()
if audioFile.isAudioFile {
go func() {
err := lyricPopup(audioFile)
if err != nil {
errorPopup(err)
}
}()
}
})
for name, cmd := range c.commands {
err := gomu.anko.Define(name, cmd)
if err != nil {

8
go.mod
View File

@ -3,9 +3,14 @@ module github.com/issadarkthing/gomu
go 1.14
require (
github.com/PuerkitoBio/goquery v1.6.1 // indirect
github.com/antchfx/htmlquery v1.2.3 // indirect
github.com/antchfx/xmlquery v1.3.4 // indirect
github.com/bogem/id3v2 v1.2.0
github.com/faiface/beep v1.0.2
github.com/gdamore/tcell/v2 v2.1.0
github.com/gobwas/glob v0.2.3 // indirect
github.com/gocolly/colly v1.2.0
github.com/hajimehoshi/go-mp3 v0.3.1 // indirect
github.com/hajimehoshi/oto v0.7.1 // indirect
github.com/kylelemons/godebug v1.1.0 // indirect
@ -15,9 +20,12 @@ require (
github.com/pkg/errors v0.9.1 // indirect
github.com/rivo/tview v0.0.0-20210125085121-dbc1f32bb1d0
github.com/sahilm/fuzzy v0.1.0
github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca // indirect
github.com/stretchr/testify v1.7.0
github.com/temoto/robotstxt v1.1.1 // indirect
github.com/tj/go-spin v1.1.0
github.com/ztrue/tracerr v0.3.0
golang.org/x/exp v0.0.0-20201229011636-eab1b5eb1a03 // indirect
golang.org/x/image v0.0.0-20201208152932-35266b937fa6 // indirect
google.golang.org/appengine v1.6.7 // indirect
)

33
go.sum
View File

@ -1,7 +1,18 @@
dmitri.shuralyov.com/gpu/mtl v0.0.0-20201218220906-28db891af037/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/PuerkitoBio/goquery v1.6.1 h1:FgjbQZKl5HTmcn4sKBgvx8vv63nhyhIpv7lJpFGCWpk=
github.com/PuerkitoBio/goquery v1.6.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc=
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20210208195552-ff826a37aa15/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE=
github.com/andybalholm/cascadia v1.1.0 h1:BuuO6sSfQNFRu1LppgbD25Hr2vLYW25JvxHs5zzsLTo=
github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
github.com/antchfx/htmlquery v1.2.3 h1:sP3NFDneHx2stfNXCKbhHFo8XgNjCACnU/4AO5gWz6M=
github.com/antchfx/htmlquery v1.2.3/go.mod h1:B0ABL+F5irhhMWg54ymEZinzMSi0Kt3I2if0BLYa3V0=
github.com/antchfx/xmlquery v1.3.4 h1:RuhsI4AA5Ma4XoXhaAr2VjJxU0Xp0W2zy/f9ZIpsF4s=
github.com/antchfx/xmlquery v1.3.4/go.mod h1:64w0Xesg2sTaawIdNqMB+7qaW/bSqkQm+ssPaCMWNnc=
github.com/antchfx/xpath v1.1.6/go.mod h1:Yee4kTMuNiPYJ7nSNorELQMr1J33uOpXDMByNYhvtNk=
github.com/antchfx/xpath v1.1.10 h1:cJ0pOvEdN/WvYXxvRrzQH9x5QWKpzHacYO8qzCcDYAg=
github.com/antchfx/xpath v1.1.10/go.mod h1:Yee4kTMuNiPYJ7nSNorELQMr1J33uOpXDMByNYhvtNk=
github.com/bogem/id3v2 v1.2.0 h1:hKDF+F1gOgQ5r1QmBCEZUk4MveJbKxCeIDSBU7CQ4oI=
github.com/bogem/id3v2 v1.2.0/go.mod h1:t78PK5AQ56Q47kizpYiV6gtjj3jfxlz87oFpty8DYs8=
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
@ -20,6 +31,14 @@ github.com/gdamore/tcell/v2 v2.0.1-0.20201017141208-acf90d56d591/go.mod h1:vSVL/
github.com/gdamore/tcell/v2 v2.1.0 h1:UnSmozHgBkQi2PGsFr+rpdXuAPRRucMegpQp3Z3kDro=
github.com/gdamore/tcell/v2 v2.1.0/go.mod h1:vSVL/GV5mCSlPC6thFP5kfOFdM9MGZcalipmpTxTgQA=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
github.com/gocolly/colly v1.2.0 h1:qRz9YAn8FIH0qzgNUw+HT9UN7wm1oF9OBAilwEWpyrI=
github.com/gocolly/colly v1.2.0/go.mod h1:Hof5T3ZswNVsOHYmba1u03W65HDWgpV5HifSuueE0EA=
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY=
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/gopherjs/gopherjs v0.0.0-20180628210949-0892b62f0d9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gopherjs/gopherjs v0.0.0-20180825215210-0210a2f0f73c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gopherjs/gopherwasm v0.1.1/go.mod h1:kx4n9a+MzHH0BJJhvlsQ65hqLFXDO/m256AsaDPQ+/4=
@ -74,13 +93,18 @@ github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/sahilm/fuzzy v0.1.0 h1:FzWGaw2Opqyu+794ZQ9SYifWv2EIXpwP4q8dY1kDAwI=
github.com/sahilm/fuzzy v0.1.0/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y=
github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca h1:NugYot0LIVPxTvN8n+Kvkn6TrbMyxQiuvKdEwFdR9vI=
github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU=
github.com/sirupsen/logrus v1.8.0 h1:nfhvjKcUMhBMVqbKHJlk5RPrrfYr/NMo3692g0dwfWU=
github.com/sirupsen/logrus v1.8.0/go.mod h1:4GuYW9TZmE769R5STWrRakJc4UqQ3+QQ95fyz7ENv1A=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/temoto/robotstxt v1.1.1 h1:Gh8RCs8ouX3hRSxxK7B1mO5RFByQ4CmJZDwgom++JaA=
github.com/temoto/robotstxt v1.1.1/go.mod h1:+1AmkuG3IYkh1kv0d2qEB9Le88ehNO0zwOr3ujewlOo=
github.com/tj/go-spin v1.1.0 h1:lhdWZsvImxvZ3q1C5OIB7d72DuOwP4O2NdBg9PyzNds=
github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4=
github.com/ztrue/tracerr v0.3.0 h1:lDi6EgEYhPYPnKcjsYzmWw4EkFEoA/gfe+I9Y5f+h6Y=
@ -88,6 +112,7 @@ github.com/ztrue/tracerr v0.3.0/go.mod h1:qEalzze4VN9O8tnhBXScfCrmoJo10o8TN5ciKj
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/exp v0.0.0-20180710024300-14dda7b62fcd/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4=
@ -108,9 +133,14 @@ golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20210119194325-5f4716e94777 h1:003p0dJM77cxMSyCPFphvZf/Y5/NXf5fzg6ufd1/Oew=
golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@ -122,6 +152,7 @@ golang.org/x/sys v0.0.0-20190429190828-d89cdac9e872/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210113181707-4bcb84eeeb78 h1:nVuTkr9L6Bq62qpUqKo/RnZCFfzDBL0bYo6w9OJUqZY=
golang.org/x/sys v0.0.0-20210113181707-4bcb84eeeb78/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@ -139,6 +170,8 @@ golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa h1:5E4dL8+NgFOgjwbTKz+OOEG
golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=
google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
gopkg.in/DATA-DOG/go-sqlmock.v1 v1.3.0/go.mod h1:OdE7CF6DbADk7lN8LIKRzRJTTZXIjtWgA5THM5lhBAw=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=

78
lyric/lyric.go Normal file
View File

@ -0,0 +1,78 @@
package lyric
import (
"html"
"net/url"
"regexp"
"strings"
"github.com/gocolly/colly"
)
// GetLyric should receive url that was returned from GetLyricOptions. GetLyric
// returns lyric of the queried song.
func GetLyric(url string) (string, error) {
var lyric string
c := colly.NewCollector()
c.OnHTML("span#ctl00_ContentPlaceHolder1_lblSubtitle", func(e *colly.HTMLElement) {
content, err := e.DOM.Html()
if err != nil {
panic(err)
}
lyric = cleanHTML(content)
})
err := c.Visit(url + "&type=srt")
if err != nil {
return "", err
}
return lyric, nil
}
// GetLyricOptions queries available song lyrics. It returns map of title and
// url of the lyric.
func GetLyricOptions(search string) (map[string]string, error) {
result := make(map[string]string)
c := colly.NewCollector()
c.OnHTML("#tablecontainer td a", func(e *colly.HTMLElement) {
link := e.Request.AbsoluteURL(e.Attr("href"))
title := strings.TrimSpace(e.Text)
result[title] = link
})
query := url.QueryEscape(search)
err := c.Visit("https://www.rentanadviser.com/en/subtitles/subtitles4songs.aspx?src=" + query)
if err != nil {
return nil, err
}
return result, nil
}
// cleanHTML parses html text to valid utf-8 text
func cleanHTML(input string) string {
content := html.UnescapeString(input)
content = strings.ReplaceAll(content, "<br/>", "\n")
// delete heading tag
re := regexp.MustCompile(`^<h3>.*`)
content = re.ReplaceAllString(content, "")
// remove non-utf8 character
re = regexp.MustCompile(``)
content = re.ReplaceAllString(content, ",")
content = strings.ToValidUTF8(content, " ")
content = strings.Map(func(r rune) rune {
if r == 160 {
return 32
}
return r
}, content)
return content
}

23
lyric/lyric_test.go Normal file
View File

@ -0,0 +1,23 @@
package lyric
import (
"io/ioutil"
"testing"
"github.com/stretchr/testify/assert"
)
func TestCleanHTML(t *testing.T) {
clean, err := ioutil.ReadFile("./sample-clean.srt")
if err != nil {
t.Error(err)
}
unclean, err := ioutil.ReadFile("./sample-unclean.srt")
if err != nil {
t.Error(err)
}
assert.Equal(t, string(clean), cleanHTML(string(unclean)))
}

158
lyric/sample-clean.srt Normal file
View File

@ -0,0 +1,158 @@
0
00:00:00,000 --> 00:00:00,000
by RentAnAdviser.com
1
00:00:10,005 --> 00:00:12,604
Take take it easy word to 94
2
00:00:12,716 --> 00:00:16,215
I got twenty four hours,
twenty four hours
3
00:00:16,303 --> 00:00:19,402
Twenty four ***s in the hotel tower
4
00:00:19,514 --> 00:00:22,613
Twenty four ******* on
the guest list yeah
5
00:00:22,717 --> 00:00:26,116
Twenty four carats on
my necklace yeah
6
00:00:26,202 --> 00:00:29,101
Twenty four hours twenty four hours
7
00:00:29,203 --> 00:00:32,402
Twenty four ***s in the hotel tower
8
00:00:32,516 --> 00:00:35,515
Twenty four ******* on
the guest list yeah
9
00:00:35,615 --> 00:00:38,914
Twenty four carats on
my necklace yeah
10
00:00:39,000 --> 00:00:42,199
Ballin like I am Kobe Swish,
2 4 on my jersey
11
00:00:42,313 --> 00:00:45,312
I stay with the homies they
pop out if you hurt me
12
00:00:45,404 --> 00:00:48,603
I might cop a Rollie for all
the ***s who curved me
13
00:00:48,709 --> 00:00:51,908
When I pull up swervin thats
that Lamborghini Mercy
14
00:00:52,018 --> 00:00:55,117
I might do the dash goin fast
in the coupe In the coupe
15
00:00:55,211 --> 00:00:58,310
I have been gettin cash all my racks
lookin blue Lookin blue
16
00:00:58,402 --> 00:01:01,401
Chains gon splash when
I smash in the pool
17
00:01:01,517 --> 00:01:04,716
Yeah I dont take no nap,
I be stackin two to two
18
00:01:04,804 --> 00:01:08,003
I am mixin with the cup she just
put somethin in my water
19
00:01:08,107 --> 00:01:11,206
Three shots aint enough my
shorty pour me up stronger
20
00:01:11,318 --> 00:01:14,517
We just got the addy
and she on one too
21
00:01:14,617 --> 00:01:17,816
We pull up with baddies
to the hotel room
22
00:01:17,904 --> 00:01:21,003
I got twenty four hours,
twenty four hours
23
00:01:21,109 --> 00:01:24,208
Twenty four ***s in the hotel tower
24
00:01:24,304 --> 00:01:27,603
Twenty four ******* on the guest
list yeah Guest list yeah
25
00:01:27,705 --> 00:01:30,804
Twenty four carats on my necklace,
yeah Necklace yeah
26
00:01:30,902 --> 00:01:33,901
Twenty four hours twenty four hours
27
00:01:34,009 --> 00:01:37,208
Twenty four ***s in the hotel tower
28
00:01:37,314 --> 00:01:40,413
Twenty four ******* on the guest
list yeah Guest list yeah
29
00:01:40,515 --> 00:01:44,614
Twenty four carats on my necklace,
yeah Necklace yeah
30
00:01:47,002 --> 00:01:50,901
Twenty four hours twenty four hours
31
00:01:53,715 --> 00:01:58,814
Twenty four hours twenty
four hours yeah
32
00:01:59,814 --> 00:02:08,813
by RentAnAdviser.com

3
lyric/sample-unclean.srt Normal file
View File

@ -0,0 +1,3 @@
<h3>Arizona Zervas - 24 (Official Lyric Video) Subtitle (.SRT) </h3>
0<br/>00:00:00000 --&gt; 00:00:00000<br/>by RentAnAdviser.com<br/><br/>1<br/>00:00:10005 --&gt; 00:00:12604<br/>Take take it easy word to 94<br/><br/>2<br/>00:00:12716 --&gt; 00:00:16215<br/>I got twenty four hours<br/>twenty four hours<br/><br/>3<br/>00:00:16303 --&gt; 00:00:19402<br/>Twenty four ***s in the hotel tower<br/><br/>4<br/>00:00:19514 --&gt; 00:00:22613<br/>Twenty four ******* on<br/>the guest list yeah<br/><br/>5<br/>00:00:22717 --&gt; 00:00:26116<br/>Twenty four carats on<br/>my necklace yeah<br/><br/>6<br/>00:00:26202 --&gt; 00:00:29101<br/>Twenty four hours twenty four hours<br/><br/>7<br/>00:00:29203 --&gt; 00:00:32402<br/>Twenty four ***s in the hotel tower<br/><br/>8<br/>00:00:32516 --&gt; 00:00:35515<br/>Twenty four ******* on<br/>the guest list yeah<br/><br/>9<br/>00:00:35615 --&gt; 00:00:38914<br/>Twenty four carats on<br/>my necklace yeah<br/><br/>10<br/>00:00:39000 --&gt; 00:00:42199<br/>Ballin like I am Kobe Swish<br/>2 4 on my jersey<br/><br/>11<br/>00:00:42313 --&gt; 00:00:45312<br/>I stay with the homies they<br/>pop out if you hurt me<br/><br/>12<br/>00:00:45404 --&gt; 00:00:48603<br/>I might cop a Rollie for all<br/>the ***s who curved me<br/><br/>13<br/>00:00:48709 --&gt; 00:00:51908<br/>When I pull up swervin thats<br/>that Lamborghini Mercy<br/><br/>14<br/>00:00:52018 --&gt; 00:00:55117<br/>I might do the dash goin fast<br/>in the coupe In the coupe<br/><br/>15<br/>00:00:55211 --&gt; 00:00:58310<br/>I have been gettin cash all my racks<br/>lookin blue Lookin blue<br/><br/>16<br/>00:00:58402 --&gt; 00:01:01401<br/>Chains gon splash when<br/>I smash in the pool<br/><br/>17<br/>00:01:01517 --&gt; 00:01:04716<br/>Yeah I dont take no nap<br/>I be stackin two to two<br/><br/>18<br/>00:01:04804 --&gt; 00:01:08003<br/>I am mixin with the cup she just<br/>put somethin in my water<br/><br/>19<br/>00:01:08107 --&gt; 00:01:11206<br/>Three shots aint enough my<br/>shorty pour me up stronger<br/><br/>20<br/>00:01:11318 --&gt; 00:01:14517<br/>We just got the addy<br/>and she on one too<br/><br/>21<br/>00:01:14617 --&gt; 00:01:17816<br/>We pull up with baddies<br/>to the hotel room<br/><br/>22<br/>00:01:17904 --&gt; 00:01:21003<br/>I got twenty four hours<br/>twenty four hours<br/><br/>23<br/>00:01:21109 --&gt; 00:01:24208<br/>Twenty four ***s in the hotel tower<br/><br/>24<br/>00:01:24304 --&gt; 00:01:27603<br/>Twenty four ******* on the guest<br/>list yeah Guest list yeah<br/><br/>25<br/>00:01:27705 --&gt; 00:01:30804<br/>Twenty four carats on my necklace<br/>yeah Necklace yeah<br/><br/>26<br/>00:01:30902 --&gt; 00:01:33901<br/>Twenty four hours twenty four hours<br/><br/>27<br/>00:01:34009 --&gt; 00:01:37208<br/>Twenty four ***s in the hotel tower<br/><br/>28<br/>00:01:37314 --&gt; 00:01:40413<br/>Twenty four ******* on the guest<br/>list yeah Guest list yeah<br/><br/>29<br/>00:01:40515 --&gt; 00:01:44614<br/>Twenty four carats on my necklace<br/>yeah Necklace yeah<br/><br/>30<br/>00:01:47002 --&gt; 00:01:50901<br/>Twenty four hours twenty four hours<br/><br/>31<br/>00:01:53715 --&gt; 00:01:58814<br/>Twenty four hours twenty<br/>four hours yeah<br/><br/>32<br/>00:01:59814 --&gt; 00:02:08813<br/>by RentAnAdviser.com<br/><br/>

View File

@ -65,6 +65,7 @@ func (p *Playlist) help() []string {
"/ find in playlist",
"s search audio from youtube",
"t edit mp3 tags",
"1 find lyric if available",
}
}
@ -172,6 +173,7 @@ func newPlaylist(args Args) *Playlist {
'p': "paste",
'/': "playlist_search",
't': "edit_tags",
'1': "fetch_lyric",
}
for key, cmd := range cmds {