// @COMPILECMD gcc $@ -o $* -lcurl #include <stdio.h> #include <curl/curl.h> #include <stdlib.h> #include <string.h> typedef struct{ char *string; size_t size; } Response; size_t write_chunk(void *data, size_t size, size_t nmemb, void *userdata); int main(int argc, char** argv){ if(argc != 2){ fprintf(stderr, "how to use: ./curl_get_youtube_rss_link BroCodez (aka. the youtube channel name as seen on the link when you are on that channel`s home or video page ... without the @\n"); exit(1); } CURL *curl; CURLcode result; curl = curl_easy_init(); if (curl == NULL){ fprintf(stderr, "HTTP request failed\n"); return -1; } Response response; response.string = malloc(1); response.size = 0; char url[120]; sprintf(url, "https://www.youtube.com/@%s/videos", argv[1]); curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_chunk); curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *) &response); result = curl_easy_perform(curl); if (result != CURLE_OK){ fprintf(stderr, "Error: %s\n", curl_easy_strerror(result)); return -1; } int start_of_rss_link = 0; int end_of_rss_link = 0; for(int i = strlen(response.string); i != 0; i--){ if(response.string[i] == 102){ if(response.string[i+1] == 101){ if(response.string[i+2] == 101){ if(response.string[i+3] == 100){ if(response.string[i+4] == 115){ if(response.string[i+5] == 47){ start_of_rss_link = i-24; end_of_rss_link = i+51; char link[80]; int k = 0; for(int j = start_of_rss_link; j <= end_of_rss_link; j++){ link[k] = response.string[j]; k++; if(j == end_of_rss_link){ link[k] = '\0'; } } printf("%s\n", link); return 0; } } } } } } } curl_easy_cleanup(curl); free(response.string); return 0; } size_t write_chunk(void *data, size_t size, size_t nmemb, void *userdata){ size_t real_size = size * nmemb; Response *response = (Response *) userdata; char *ptr = realloc(response->string, response->size + real_size + 1); if (ptr == NULL){ return CURL_WRITEFUNC_ERROR; } response->string = ptr; memcpy(&(response->string[response->size]), data, real_size); response->size += real_size; response->string[response->size] = 0; // '\0'; return real_size; }