| @@ -18,8 +18,25 @@ import ( |
| 18 | var ( |
18 | var ( |
| 19 | fetchDeviation = devianter.GetDeviation |
19 | fetchDeviation = devianter.GetDeviation |
| 20 | fetchComments = devianter.GetComments |
20 | fetchComments = devianter.GetComments |
| |
21 | fetchProfile = func(name string) (devianter.GRuser, devianter.Error, error) { |
| |
22 | g := devianter.Group{Name: name} |
| |
23 | return g.Get() |
| |
24 | } |
| 21 | ) |
25 | ) |
| 22 | |
26 | |
| |
27 | // groupSearchURL is the DeviantArt group search page for query, paged ten |
| |
28 | // results at a time. page counts from 1; 0 means the first page too. |
| |
29 | func groupSearchURL(query string, page int) string { |
| |
30 | var url strings.Builder |
| |
31 | url.WriteString("https://www.deviantart.com/groups/?q=") |
| |
32 | url.WriteString(query) |
| |
33 | if page > 1 { |
| |
34 | url.WriteString("&offset=") |
| |
35 | url.WriteString(strconv.Itoa(10 * (page - 1))) |
| |
36 | } |
| |
37 | return url.String() |
| |
38 | } |
| |
39 | |
| 23 | // commentsOrLink renders a comment thread only when the request asked for it |
40 | // commentsOrLink renders a comment thread only when the request asked for it |
| 24 | // with ?comments=1, and otherwise a link that does. A thread is a second |
41 | // with ?comments=1, and otherwise a link that does. A thread is a second |
| 25 | // upstream call on every post and profile view, and most viewers never open |
42 | // upstream call on every post and profile view, and most viewers never open |
| @@ -60,7 +77,7 @@ func (s skunkyart) GRUser() { |
| 60 | var daError devianter.Error |
77 | var daError devianter.Error |
| 61 | g.Name = s.Query |
78 | g.Name = s.Query |
| 62 | var err error |
79 | var err error |
| 63 | s.Templates.GroupUser.GR, daError, err = g.Get() |
80 | s.Templates.GroupUser.GR, daError, err = fetchProfile(s.Query) |
| 64 | try(err) |
81 | try(err) |
| 65 | if daError.RAW != nil { |
82 | if daError.RAW != nil { |
| 66 | s.Error(daError) |
83 | s.Error(daError) |
| @@ -81,7 +98,7 @@ func (s skunkyart) GRUser() { |
| 81 | group.Group = true |
98 | group.Group = true |
| 82 | group.CreationDate = x.ModuleData.GroupAbout.FoundatedAt.UTC().String() |
99 | group.CreationDate = x.ModuleData.GroupAbout.FoundatedAt.UTC().String() |
| 83 | group.About.DescriptionFormatted = template.HTML(ParseDescription(s.Host, about.Description)) //nolint:gosec // G203: ParseDescription escapes its input |
100 | group.About.DescriptionFormatted = template.HTML(ParseDescription(s.Host, about.Description)) //nolint:gosec // G203: ParseDescription escapes its input |
| 84 | } else if false { |
101 | } else { |
| 85 | group.About.A = x.ModuleData.About |
102 | group.About.A = x.ModuleData.About |
| 86 | var about = &group.About.A |
103 | var about = &group.About.A |
| 87 | group.CreationDate = time.Unix(time.Now().Unix()-x.ModuleData.About.RegDate, 0).UTC().String() |
104 | group.CreationDate = time.Unix(time.Now().Unix()-x.ModuleData.About.RegDate, 0).UTC().String() |
| @@ -318,20 +335,10 @@ func (s skunkyart) Search() { |
| 318 | case 'r': // scraper, since DeviantArt withholds the guest API for group search |
335 | case 'r': // scraper, since DeviantArt withholds the guest API for group search |
| 319 | var ( |
336 | var ( |
| 320 | usernames = make(map[int]string) |
337 | usernames = make(map[int]string) |
| 321 | url strings.Builder |
| |
| 322 | num int |
338 | num int |
| 323 | ) |
339 | ) |
| 324 | |
340 | |
| 325 | s.Page++ |
341 | dwnld := Download(groupSearchURL(s.Query, s.Page)) |
| 326 | |
| |
| 327 | url.WriteString("https://www.deviantart.com/groups/?q=") |
| |
| 328 | url.WriteString(s.Query) |
| |
| 329 | if s.Page > 1 { |
| |
| 330 | url.WriteString("&offset=") |
| |
| 331 | url.WriteString(strconv.Itoa(10 * s.Page)) |
| |
| 332 | } |
| |
| 333 | |
| |
| 334 | dwnld := Download(url.String()) |
| |
| 335 | |
342 | |
| 336 | for z := html.NewTokenizer(strings.NewReader(string(dwnld.Body))); ; { |
343 | for z := html.NewTokenizer(strings.NewReader(string(dwnld.Body))); ; { |
| 337 | if n, token := z.Next(), z.Token(); n == html.StartTagToken && token.Data == "a" { |
344 | if n, token := z.Next(), z.Token(); n == html.StartTagToken && token.Data == "a" { |