Skip to content

Commit cb716af

Browse files
committed
feature: added kdramahood engine
1 parent 8556c1e commit cb716af

File tree

1 file changed

+165
-0
lines changed

1 file changed

+165
-0
lines changed

engine/kdramahood.go

+165
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
package engine
2+
3+
import (
4+
"fmt"
5+
"net/url"
6+
"path"
7+
"strconv"
8+
"strings"
9+
10+
"github.com/gocolly/colly/v2"
11+
log "github.com/sirupsen/logrus"
12+
)
13+
14+
// KDramaHood : An Engine for KDramaHood
15+
type KDramaHood struct {
16+
Props
17+
}
18+
19+
// NewKDramaHoodEngine : create a new engine for scraping latest korean drama
20+
func NewKDramaHoodEngine() *KDramaHood {
21+
base := "https://kdramahood.com"
22+
baseURL, err := url.Parse(base)
23+
if err != nil {
24+
log.Fatal(err)
25+
}
26+
// Search URL
27+
searchURL, err := url.Parse(base)
28+
if err != nil {
29+
log.Fatal(err)
30+
}
31+
searchURL.Path = "/"
32+
33+
// List URL
34+
listURL, err := url.Parse(base)
35+
if err != nil {
36+
log.Fatal(err)
37+
}
38+
listURL.Path = "/home2/"
39+
40+
dramaFeverEngine := KDramaHood{}
41+
dramaFeverEngine.Name = "KDramaHood"
42+
dramaFeverEngine.BaseURL = baseURL
43+
dramaFeverEngine.Description = `Watch your favourite korean movie all in one place`
44+
dramaFeverEngine.SearchURL = searchURL
45+
dramaFeverEngine.ListURL = listURL
46+
return &dramaFeverEngine
47+
}
48+
49+
// Engine Interface Methods
50+
51+
func (engine *KDramaHood) String() string {
52+
st := fmt.Sprintf("%s (%s)", engine.Name, engine.BaseURL)
53+
return st
54+
}
55+
56+
func (engine *KDramaHood) getParseAttrs() (string, string, error) {
57+
return "div.items", "div.item", nil
58+
}
59+
60+
func (engine *KDramaHood) parseSingleMovie(el *colly.HTMLElement, index int) (Movie, error) {
61+
movie := Movie{
62+
Index: index,
63+
IsSeries: true,
64+
Source: engine.Name,
65+
Size: "---MB",
66+
}
67+
switch engine.mode {
68+
case SearchMode:
69+
movie.Title = strings.TrimSpace(el.ChildText("span.tt"))
70+
movie.Description = strings.TrimSpace(el.ChildText("span.ttx"))
71+
case ListMode:
72+
movie.Title = strings.TrimSpace(el.ChildAttr("img", "alt"))
73+
movie.Description = strings.TrimSpace(el.ChildText("div.contenido"))
74+
}
75+
movie.CoverPhotoLink = el.ChildAttr("img", "src")
76+
link := el.Request.AbsoluteURL(el.ChildAttr("a", "href"))
77+
downloadLink, err := url.Parse(link)
78+
79+
if err != nil {
80+
log.Fatal(err)
81+
}
82+
movie.DownloadLink = downloadLink
83+
movie.Category = "kdrama"
84+
return movie, nil
85+
}
86+
87+
func (engine *KDramaHood) updateDownloadProps(downloadCollector *colly.Collector, movies *[]Movie) {
88+
innerCollector := downloadCollector.Clone()
89+
episodeMap := map[string]*url.URL{}
90+
subtitleMap := map[string]*url.URL{}
91+
downloadCollector.OnHTML("ul.episodios", func(e *colly.HTMLElement) {
92+
// clear existing map
93+
for k := range episodeMap {
94+
delete(episodeMap, k)
95+
}
96+
for k := range subtitleMap {
97+
delete(subtitleMap, k)
98+
}
99+
// create local targets
100+
targetepisode := make(map[string]*url.URL)
101+
targetsub := make(map[string]*url.URL)
102+
movie := &(*movies)[getMovieIndexFromCtx(e.Request)]
103+
e.ForEach("li", func(_ int, inn *colly.HTMLElement) {
104+
innerCollector.Visit(inn.ChildAttr("a", "href"))
105+
})
106+
107+
// deepcopy to localtargets
108+
for k, v := range episodeMap {
109+
targetepisode[k] = v
110+
}
111+
for k, v := range subtitleMap {
112+
targetsub[k] = v
113+
}
114+
115+
movie.SDownloadLink = targetepisode
116+
movie.SubtitleLinks = targetsub
117+
})
118+
119+
innerCollector.OnHTML("div.linkstv", func(e *colly.HTMLElement) {
120+
name := e.ChildAttr("a", "download")
121+
links := e.ChildAttrs("a", "href")
122+
if len(links) > 1 {
123+
// select first link
124+
movieLink, _ := url.Parse(links[0])
125+
// subtitle is always the last link
126+
subLink, _ := url.Parse(links[len(links)-1])
127+
episodeMap[name] = movieLink
128+
subtitleMap[name] = subLink
129+
}
130+
})
131+
}
132+
133+
// List : list all the movies on a page
134+
func (engine *KDramaHood) List(page int) SearchResult {
135+
engine.mode = ListMode
136+
result := SearchResult{
137+
Query: "List of Recent Uploads - Page " + strconv.Itoa(page),
138+
}
139+
pageParam := fmt.Sprintf("page/%v", strconv.Itoa(page))
140+
engine.ListURL.Path = path.Join(engine.ListURL.Path, pageParam)
141+
movies, err := Scrape(engine)
142+
if err != nil {
143+
log.Fatal(err)
144+
}
145+
result.Movies = movies
146+
return result
147+
}
148+
149+
// Search : Searches fzmovies for a particular query and return an array of movies
150+
func (engine *KDramaHood) Search(param ...string) SearchResult {
151+
query := param[0]
152+
engine.mode = SearchMode
153+
result := SearchResult{
154+
Query: query,
155+
}
156+
q := engine.SearchURL.Query()
157+
q.Set("s", query)
158+
engine.SearchURL.RawQuery = q.Encode()
159+
movies, err := Scrape(engine)
160+
if err != nil {
161+
log.Fatal(err)
162+
}
163+
result.Movies = movies
164+
return result
165+
}

0 commit comments

Comments
 (0)