Nimbin2git.christianimmanuel.de / Games / dvd / download_unpack.c

dvd files

last change 2026-09-04 (2 hours ago)

wget https://git.christianimmanuel.de/games/dvd/archive/dvd.tar.gz
download_unpack.c 3.8 KB · 115 lines raw
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#include "download_unpack.h"

// Function to create directories if they do not exist
void make_directories(const char *path) {
    struct stat st = {0};
    if (stat(path, &st) == -1) {
        printf("Creating directory: %s\n", path);
        if (mkdir(path, 0755) != 0) {
            perror("mkdir failed");
            exit(EXIT_FAILURE);
        }
    }
}

// Function to download a single file
void download_file(const char *url, const char *output_dir, int line) {
    char command[512];

    // Move the cursor to the specific line
    printf("\033[%d;1H", line); // Move cursor to (line, 1)
    printf("Downloading: %s\n", url);

    snprintf(command, sizeof(command), "rm -f %s/%s", output_dir, strrchr(url, '/') + 1);
    system(command); // Remove the file if it already exists

    snprintf(command, sizeof(command), "wget -c -P %s %s", output_dir, url);  // Added -c to continue download
    if (system(command) != 0) {
        fprintf(stderr, "Error downloading: %s\n", url);
        exit(EXIT_FAILURE);
    }
}

// Function to unpack a file
void unpack_file(const char *file_path, const char *output_dir, int line) {
    char command[512];

    // Move the cursor to the specific line
    printf("\033[%d;1H", line); // Move cursor to (line, 1)
    printf("Unpacking: %s\n", file_path);

    snprintf(command, sizeof(command), "test -f %s", file_path);
    if (system(command) != 0) {
        fprintf(stderr, "File %s does not exist, skipping unpack.\n", file_path);
        return;
    }

    snprintf(command, sizeof(command), "gunzip -c %s > %s/$(basename %s .gz)", file_path, output_dir, file_path);
    if (system(command) != 0) {
        fprintf(stderr, "Error unpacking: %s\n", file_path);
        exit(EXIT_FAILURE);
    }
}

// Function to download and unpack with status
void process_file(const char *url, const char *download_dir, const char *unpack_dir, int line) {
    char file_path[512];
    snprintf(file_path, sizeof(file_path), "%s/%s", download_dir, strrchr(url, '/') + 1);

    download_file(url, download_dir, line);  // Pass the line number
    unpack_file(file_path, unpack_dir, line); // Pass the line number

    printf("Processed: %s\n", url);
}

// Function to process files in parallel
void process_files_in_parallel(const char **urls, int url_count, const char *download_dir, const char *unpack_dir) {
    make_directories(download_dir); // Ensure download directory exists
    make_directories(unpack_dir);   // Ensure unpack directory exists

    for (int i = 0; i < url_count; i++) {
        pid_t pid = fork();
        if (pid == 0) {
            // Child process
            process_file(urls[i], download_dir, unpack_dir, i + 1);  // Pass line number based on index
            exit(EXIT_SUCCESS);
        } else if (pid < 0) {
            perror("Fork failed");
            exit(EXIT_FAILURE);
        }
    }

    // Parent process waits for all child processes
    for (int i = 0; i < url_count; i++) {
        wait(NULL);
    }
}

// Test function (used for main)
int test_download_unpack() {
    printf("Fuuf");
    const char *urls[] = {
        "https://datasets.imdbws.com/name.basics.tsv.gz",
        "https://datasets.imdbws.com/title.akas.tsv.gz",
        "https://datasets.imdbws.com/title.basics.tsv.gz",
        "https://datasets.imdbws.com/title.crew.tsv.gz",
        "https://datasets.imdbws.com/title.episode.tsv.gz",
        "https://datasets.imdbws.com/title.principals.tsv.gz",
        "https://datasets.imdbws.com/title.ratings.tsv.gz"
    };
    int url_count = sizeof(urls) / sizeof(urls[0]);
    const char *download_dir = "imdb_gz";
    const char *unpack_dir = "imdb";

    process_files_in_parallel(urls, url_count, download_dir, unpack_dir);

    printf("All files processed successfully.\n");
    return 0;
}