mirror of
https://github.com/issadarkthing/gomu.git
synced 2025-04-26 13:49:21 +08:00
add lyric fetcher
add lyric fetcher
This commit is contained in:
parent
b049c075de
commit
5b05a60012
13
command.go
13
command.go
@ -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
8
go.mod
@ -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
33
go.sum
@ -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
78
lyric/lyric.go
Normal 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
23
lyric/lyric_test.go
Normal 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
158
lyric/sample-clean.srt
Normal 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′ that′s
|
||||
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 don′t 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 ain′t 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
3
lyric/sample-unclean.srt
Normal file
@ -0,0 +1,3 @@
|
||||
<h3>Arizona Zervas - 24 (Official Lyric Video) Subtitle (.SRT) </h3>
|
||||
0<br/>00:00:00‚000 --> 00:00:00‚000<br/>by RentAnAdviser.com<br/><br/>1<br/>00:00:10‚005 --> 00:00:12‚604<br/>Take take it easy word to 94<br/><br/>2<br/>00:00:12‚716 --> 00:00:16‚215<br/>I got twenty four hours‚<br/>twenty four hours<br/><br/>3<br/>00:00:16‚303 --> 00:00:19‚402<br/>Twenty four ***s in the hotel tower<br/><br/>4<br/>00:00:19‚514 --> 00:00:22‚613<br/>Twenty four ******* on<br/>the guest list yeah<br/><br/>5<br/>00:00:22‚717 --> 00:00:26‚116<br/>Twenty four carats on<br/>my necklace yeah<br/><br/>6<br/>00:00:26‚202 --> 00:00:29‚101<br/>Twenty four hours twenty four hours<br/><br/>7<br/>00:00:29‚203 --> 00:00:32‚402<br/>Twenty four ***s in the hotel tower<br/><br/>8<br/>00:00:32‚516 --> 00:00:35‚515<br/>Twenty four ******* on<br/>the guest list yeah<br/><br/>9<br/>00:00:35‚615 --> 00:00:38‚914<br/>Twenty four carats on<br/>my necklace yeah<br/><br/>10<br/>00:00:39‚000 --> 00:00:42‚199<br/>Ballin like I am Kobe Swish‚<br/>2 4 on my jersey<br/><br/>11<br/>00:00:42‚313 --> 00:00:45‚312<br/>I stay with the homies they<br/>pop out if you hurt me<br/><br/>12<br/>00:00:45‚404 --> 00:00:48‚603<br/>I might cop a Rollie for all<br/>the ***s who curved me<br/><br/>13<br/>00:00:48‚709 --> 00:00:51‚908<br/>When I pull up swervin′ that′s<br/>that Lamborghini Mercy<br/><br/>14<br/>00:00:52‚018 --> 00:00:55‚117<br/>I might do the dash goin fast<br/>in the coupe In the coupe<br/><br/>15<br/>00:00:55‚211 --> 00:00:58‚310<br/>I have been gettin cash all my racks<br/>lookin blue Lookin blue<br/><br/>16<br/>00:00:58‚402 --> 00:01:01‚401<br/>Chains gon splash when<br/>I smash in the pool<br/><br/>17<br/>00:01:01‚517 --> 00:01:04‚716<br/>Yeah I don′t take no nap‚<br/>I be stackin two to two<br/><br/>18<br/>00:01:04‚804 --> 00:01:08‚003<br/>I am mixin with the cup she just<br/>put somethin in my water<br/><br/>19<br/>00:01:08‚107 --> 00:01:11‚206<br/>Three shots ain′t enough my<br/>shorty pour me up stronger<br/><br/>20<br/>00:01:11‚318 --> 00:01:14‚517<br/>We just got the addy<br/>and she on one too<br/><br/>21<br/>00:01:14‚617 --> 00:01:17‚816<br/>We pull up with baddies<br/>to the hotel room<br/><br/>22<br/>00:01:17‚904 --> 00:01:21‚003<br/>I got twenty four hours‚<br/>twenty four hours<br/><br/>23<br/>00:01:21‚109 --> 00:01:24‚208<br/>Twenty four ***s in the hotel tower<br/><br/>24<br/>00:01:24‚304 --> 00:01:27‚603<br/>Twenty four ******* on the guest<br/>list yeah Guest list yeah<br/><br/>25<br/>00:01:27‚705 --> 00:01:30‚804<br/>Twenty four carats on my necklace‚<br/>yeah Necklace yeah<br/><br/>26<br/>00:01:30‚902 --> 00:01:33‚901<br/>Twenty four hours twenty four hours<br/><br/>27<br/>00:01:34‚009 --> 00:01:37‚208<br/>Twenty four ***s in the hotel tower<br/><br/>28<br/>00:01:37‚314 --> 00:01:40‚413<br/>Twenty four ******* on the guest<br/>list yeah Guest list yeah<br/><br/>29<br/>00:01:40‚515 --> 00:01:44‚614<br/>Twenty four carats on my necklace‚<br/>yeah Necklace yeah<br/><br/>30<br/>00:01:47‚002 --> 00:01:50‚901<br/>Twenty four hours twenty four hours<br/><br/>31<br/>00:01:53‚715 --> 00:01:58‚814<br/>Twenty four hours twenty<br/>four hours yeah<br/><br/>32<br/>00:01:59‚814 --> 00:02:08‚813<br/>by RentAnAdviser.com<br/><br/>
|
||||
|
@ -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 {
|
||||
|
Loading…
x
Reference in New Issue
Block a user