Port of ani-cli with more features 😉
4 |count;
29 | for (int i = 0; i < MAX_ANIME_SEARCH_RESULTS; i++) {
30 | memcpy(results.results[i], regex_results->matches[i],
31 | MAX_ANIME_NAME_LEN);
32 | }
33 |
34 | return &results;
35 | }
36 |
37 | struct AnimeInfo *gogoanime_get_metadata(char *animeid)
38 | {
39 | int last_episode_num;
40 | char *last_episode_str;
41 | struct AnimeInfo *metadata = malloc(sizeof(struct AnimeInfo));
42 |
43 | char *url = JOIN_STR(BASE_URL "/category/", animeid, NULL);
44 |
45 | web_client_seturl(url, NULL);
46 | web_page = web_client_perform();
47 |
48 | last_episode_str = regex_find(web_page,
49 | ".*.*");
50 |
51 | last_episode_num = strtol(last_episode_str, NULL, 10);
52 |
53 | metadata->title = animeid;
54 | metadata->current_episode = 0;
55 | metadata->total_episodes = last_episode_num;
56 |
57 | return metadata;
58 | }
59 |
60 | void gogoanime_get_sources(struct AnimeInfo *anime)
61 | {
62 | char *video_url, *highq_video, *video_url_end, *embedded_video_url;
63 | unsigned int highq_video_len;
64 |
65 | char *url = JOIN_STR(BASE_URL, anime->title, "-episode-", int2str(anime->current_episode));
66 |
67 | web_client_seturl(url, NULL);
68 | web_page = web_client_perform();
69 |
70 | embedded_video_url = regex_find(web_page,
71 | "^[[:space:]]*.*");
72 |
73 | /* The resulting URL doesn't have `https:` part */
74 | embedded_video_url = JOIN_STR("https:", embedded_video_url);
75 |
76 | web_client_seturl(embedded_video_url, NULL);
77 | web_page = web_client_perform();
78 | video_url = regex_find(web_page,
79 | "^[[:space:]]*sources:\\[\\{file: '([^']*)'.*");
80 |
81 | web_client_seturl(video_url, embedded_video_url);
82 | web_page = web_client_perform();
83 | highq_video = get_lastline(web_page);
84 |
85 | // Copy referer and url to the result
86 | strncpy(anime->episode.referer, embedded_video_url, sizeof(anime->episode.referer) - 1);
87 | anime->episode.referer[sizeof(anime->episode.referer) - 1] = '\0';
88 |
89 | strncpy(anime->episode.url, video_url,
90 | sizeof(anime->episode.url) - 1);
91 |
92 | // Get the file name part from the video url
93 | video_url_end = strrchr(anime->episode.url, '/') + 1;
94 | highq_video_len = strlen(highq_video);
95 |
96 | // Replace the filename with highq_video
97 | // Also remove the pesky newline character at the end
98 | memcpy(video_url_end, highq_video, highq_video_len - 1);
99 | video_url_end[highq_video_len - 1] = '\0';
100 | }
101 |
--------------------------------------------------------------------------------
/src/sites/gogoanime.h:
--------------------------------------------------------------------------------
1 | #ifndef CANIME_SITES_GOGOANIME_H
2 | #define CANIME_SITES_GOGOANIME_H
3 |
4 | struct SearchResults *gogoanime_search(char *query);
5 | struct AnimeInfo *gogoanime_get_metadata(char *animeid);
6 | void gogoanime_get_sources(struct AnimeInfo *anime);
7 |
8 | #endif /* CANIME_SITES_GOGOANIME_H */
9 |
--------------------------------------------------------------------------------
/src/sites/sites.h:
--------------------------------------------------------------------------------
1 | #ifndef CANIME_SITES_H
2 | #define CANIME_SITES_H
3 |
4 | #include "gogoanime.h"
5 | #include "animepahe.h"
6 |
7 | #endif /* CANIME_SITES_H */
8 |
--------------------------------------------------------------------------------
/src/utils.c:
--------------------------------------------------------------------------------
1 | #include