mirror of
https://github.com/riwiwa/muzi.git
synced 2025-12-30 12:45:26 -08:00
added unzip functionality, kinda buggy tho
This commit is contained in:
@@ -4,6 +4,7 @@ Self hosted music listening statistics
|
|||||||
|
|
||||||
### Dependencies:
|
### Dependencies:
|
||||||
- cJSON (https://github.com/DaveGamble/cJSON)
|
- cJSON (https://github.com/DaveGamble/cJSON)
|
||||||
|
- libzip (https://libzip.org/)
|
||||||
|
|
||||||
### plans:
|
### plans:
|
||||||
- Ability to import all listening statistics and scrobbles from lastfm, spotify, apple music
|
- Ability to import all listening statistics and scrobbles from lastfm, spotify, apple music
|
||||||
|
|||||||
80
muzi.c
80
muzi.c
@@ -2,16 +2,27 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <strings.h>
|
#include <strings.h>
|
||||||
|
#include <zip.h>
|
||||||
#include <cjson/cJSON.h>
|
#include <cjson/cJSON.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
// TODO:
|
// TODO:
|
||||||
// - unzip given .zip archives of spotify data
|
// - unzip a given .zip archive of spotify data to a directory
|
||||||
|
// - for each json file in the directory {
|
||||||
|
// - for each json entry {
|
||||||
|
// - add entry to postgresql db
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
// - web ui
|
// - web ui
|
||||||
// - enter all json data into postgresql db automatically
|
|
||||||
// - sql tables: "full history", "artists", "songs", "albums" (see ipad)
|
// - sql tables: "full history", "artists", "songs", "albums" (see ipad)
|
||||||
|
|
||||||
int main(void) {
|
int extract(const char *path);
|
||||||
FILE *fp = fopen("test.json", "r");
|
int get_artist_plays(void);
|
||||||
|
|
||||||
|
int get_artist_plays(void) {
|
||||||
|
FILE *fp = fopen("/home/r/dl/spotify-data/rm35@gm - Spotify Extended Streaming History/Streaming_History_Audio_2020-2021_4.json", "r");
|
||||||
if(fp == NULL) {
|
if(fp == NULL) {
|
||||||
printf("Error while opening file\n");
|
printf("Error while opening file\n");
|
||||||
return 1;
|
return 1;
|
||||||
@@ -39,7 +50,7 @@ int main(void) {
|
|||||||
|
|
||||||
cJSON *track = NULL;
|
cJSON *track = NULL;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
char artist[] = "Test";
|
char artist[] = "";
|
||||||
cJSON_ArrayForEach(track, json) {
|
cJSON_ArrayForEach(track, json) {
|
||||||
cJSON *trackName = cJSON_GetObjectItemCaseSensitive(track, "master_metadata_album_artist_name");
|
cJSON *trackName = cJSON_GetObjectItemCaseSensitive(track, "master_metadata_album_artist_name");
|
||||||
if(cJSON_IsString(trackName)) {
|
if(cJSON_IsString(trackName)) {
|
||||||
@@ -55,3 +66,62 @@ int main(void) {
|
|||||||
free(buffer);
|
free(buffer);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int extract(const char *path) {
|
||||||
|
zip_t *za;
|
||||||
|
int err;
|
||||||
|
if((za = zip_open(path, 0, &err)) == NULL) {
|
||||||
|
zip_error_t error;
|
||||||
|
zip_error_init_with_code(&error, err);
|
||||||
|
fprintf(stderr, "Error opening zip archive: %s\n", zip_error_strerror(&error));
|
||||||
|
zip_error_fini(&error);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int archived_files = zip_get_num_entries(za, ZIP_FL_UNCHANGED);
|
||||||
|
|
||||||
|
for (int i = 0; i < archived_files; i++) {
|
||||||
|
struct zip_stat st;
|
||||||
|
if (zip_stat_index(za, i, 0, &st) < 0) {
|
||||||
|
fprintf(stderr, "Error getting file info for index %d\n", i);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle directories
|
||||||
|
if (st.name[strlen(st.name) - 1] == '/') {
|
||||||
|
mkdir(st.name, 0755); // Create directory if it doesn't exist
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open file in archive
|
||||||
|
zip_file_t *zf = zip_fopen_index(za, i, 0);
|
||||||
|
if (!zf) {
|
||||||
|
fprintf(stderr, "Error opening file in zip: %s\n", st.name);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create output file
|
||||||
|
FILE *outfile = fopen(st.name, "w+");
|
||||||
|
if (!outfile) {
|
||||||
|
fprintf(stderr, "Error creating output file: %s\n", st.name);
|
||||||
|
zip_fclose(zf);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read and write data
|
||||||
|
char buffer[4096];
|
||||||
|
zip_int64_t bytes_read;
|
||||||
|
while ((bytes_read = zip_fread(zf, buffer, sizeof(buffer))) > 0) {
|
||||||
|
fwrite(buffer, 1, bytes_read, outfile);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close files
|
||||||
|
fclose(outfile);
|
||||||
|
zip_fclose(zf);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
extract("archive.zip");
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user