Web Downloader C
Web Downloader C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <curl/curl.h>
#include <sys/stat.h>
#include <time.h>
#include <unistd.h>
#define MAX_THREADS 10
#define MAX_URL_LENGTH 2048
#define MAX_FILENAME_LENGTH 256
typedef struct {
char url[MAX_URL_LENGTH];
char filename[MAX_FILENAME_LENGTH];
double progress;
pthread_mutex_t mutex;
} DownloadInfo;
DownloadInfo downloads[MAX_THREADS];
int active_downloads = 0;
pthread_mutex_t console_mutex = PTHREAD_MUTEX_INITIALIZER;
curl = curl_easy_init();
if (curl) {
fp = fopen(info->filename, "wb");
curl_easy_setopt(curl, CURLOPT_URL, info->url);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L);
curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, progress_callback);
curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, info);
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
fclose(fp);
}
pthread_mutex_lock(&console_mutex);
active_downloads--;
pthread_mutex_unlock(&console_mutex);
return NULL;
}
void print_progress() {
pthread_mutex_lock(&console_mutex);
printf("\033[2J\033[H"); // Clear screen and move cursor to top-left
for (int i = 0; i < MAX_THREADS; i++) {
if (downloads[i].filename[0] != '\0') {
printf("%s: %.2f%%\n", downloads[i].filename, downloads[i].progress);
}
}
pthread_mutex_unlock(&console_mutex);
}
if (res != CURLE_OK) {
fprintf(stderr, "Error al obtener la lista de archivos: %s\n",
curl_easy_strerror(res));
free(buffer);
curl_easy_cleanup(curl);
return 1;
}
pthread_mutex_lock(&console_mutex);
int idx = thread_count % MAX_THREADS;
active_downloads++;
strcpy(downloads[idx].url, full_url);
snprintf(downloads[idx].filename,
sizeof(downloads[idx].filename), "%s/%s", foldername, href);
downloads[idx].progress = 0;
pthread_mutex_init(&downloads[idx].mutex, NULL);
pthread_create(&threads[thread_count], NULL, download_thread,
&downloads[idx]);
thread_count++;
pthread_mutex_unlock(&console_mutex);
}
}
}
line = strtok(NULL, "\n");
}
free(buffer);
curl_easy_cleanup(curl);