commit 07fa5158a20ada493c21b952710e1a7f5eeefade Author: anon <anon@anon.anon> Date: Sun Dec 24 17:49:37 2023 +0100 init diff --git a/curl_get_youtube_rss_link.c b/curl_get_youtube_rss_link.c new file mode 100644 index 0000000..2e31a1f --- /dev/null +++ b/curl_get_youtube_rss_link.c @@ -0,0 +1,94 @@ +// @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; +}