Adding base source

This commit is contained in:
2025-09-20 18:01:59 +10:00
parent 44f27e90f6
commit 61f517d159
51 changed files with 10086 additions and 0 deletions
+259
View File
@@ -0,0 +1,259 @@
#include "OSSP_Bridge.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/sysctl.h>
#include "libopensubsonic/crypto.h"
#include "libopensubsonic/httpclient.h"
#include "libopensubsonic/endpoint_ping.h"
#include "libopensubsonic/endpoint_getStarred.h"
#include "libopensubsonic/endpoint_getAlbum.h"
#include "libopensubsonic/endpoint_getPlaylists.h"
#include "libopensubsonic/endpoint_getPlaylist.h"
#include "libopensubsonic/endpoint_getSong.h"
#include "libopensubsonic/endpoint_getLyricsBySongId.h"
#include "libopensubsonic/endpoint_getAlbumList.h"
#include "libopensubsonic/endpoint_scrobble.h"
#include "configHandler.h"
#include "libopensubsonic/scrobble_lastFm.h"
#include "dscrdrpc.h"
struct memory {
char *data;
size_t size;
};
static size_t write_to_memory(void *ptr, size_t size, size_t nmemb, void *userdata) {
struct memory *mem = (struct memory *)userdata;
size_t total_size = size * nmemb;
mem->data = realloc(mem->data, mem->size + total_size + 1);
if (!mem->data) return 0; // Fail on OOM
memcpy(&(mem->data[mem->size]), ptr, total_size);
mem->size += total_size;
mem->data[mem->size] = '\0'; // Null-terminate
return total_size;
}
static int rc = 0;
configHandler_config_t* configObj = NULL;
opensubsonic_ping_struct* LOSS_PerformLogin(C_LoginStruct loginStruct) {
// Initialize configuration
configHandler_Read(&configObj);
// Generate the login token and salt
opensubsonic_crypto_generateLogin();
opensubsonic_httpClient_URL_t* url = (opensubsonic_httpClient_URL_t*)malloc(sizeof(opensubsonic_httpClient_URL_t));
opensubsonic_httpClient_URL_prepare(&url);
url->endpoint = OPENSUBSONIC_ENDPOINT_PING;
opensubsonic_httpClient_formUrl(&url);
opensubsonic_ping_struct* OSS_ping_struct;
opensubsonic_httpClient_fetchResponse(&url, (void**)&OSS_ping_struct);
// Print Response
//printf("Result: %s\n", OSS_ping_struct.status);
//opensubsonic_ping_struct_free(&OSS_ping_struct);
opensubsonic_httpClient_URL_cleanup(&url);
//configHandler_Free(&config);
//opensubsonic_authenticate_lastFm();
/*
opensubsonic_httpClient_URL_t* urlc = (opensubsonic_httpClient_URL_t*)malloc(sizeof(opensubsonic_httpClient_URL_t));
opensubsonic_httpClient_URL_prepare(&urlc);
urlc->endpoint = OPENSUBSONIC_ENDPOINT_GETLYRICSBYSONGID;
urlc->id = strdup("pvu323svJrim683Xf8fBV8");
printf("URLC Endponit: %d\n", urlc->endpoint);
opensubsonic_httpClient_formUrl(&urlc);
printf("URL: %s\n", urlc->formedUrl);
opensubsonic_getLyricsBySongId_struct* plStruct;
opensubsonic_httpClient_fetchResponse(&urlc, (void**)&plStruct);
printf("2nd: %s\n", plStruct->lyrics[1].data);
*/
return OSS_ping_struct; // TODO rename
}
void LOSS_FreeLoginStruct() {
}
opensubsonic_getStarred_struct* LOSS_getStarred(void) {
opensubsonic_httpClient_URL_t* url = (opensubsonic_httpClient_URL_t*)malloc(sizeof(opensubsonic_httpClient_URL_t));
opensubsonic_httpClient_URL_prepare(&url);
url->endpoint = OPENSUBSONIC_ENDPOINT_GETSTARRED;
opensubsonic_httpClient_formUrl(&url);
printf("STARRED URL: %s\n", url->formedUrl);
opensubsonic_getStarred_struct* getStarredStruct;
opensubsonic_httpClient_fetchResponse(&url, (void**)&getStarredStruct);
opensubsonic_httpClient_URL_cleanup(&url);
return getStarredStruct;
}
void LOSS_delete_getStarred(opensubsonic_getStarred_struct* starredStruct) {
opensubsonic_getStarred_struct_free(&starredStruct);
}
opensubsonic_getSong_struct* LOSS_getSong(char* id) {
opensubsonic_httpClient_URL_t* url = (opensubsonic_httpClient_URL_t*)malloc(sizeof(opensubsonic_httpClient_URL_t));
opensubsonic_httpClient_URL_prepare(&url);
url->endpoint = OPENSUBSONIC_ENDPOINT_GETSONG;
url->id = strdup(id);
opensubsonic_httpClient_formUrl(&url);
opensubsonic_getSong_struct* getSongStruct;
opensubsonic_httpClient_fetchResponse(&url, (void**)&getSongStruct);
opensubsonic_httpClient_URL_cleanup(&url);
return getSongStruct;
}
void LOSS_delete_getSong(opensubsonic_getSong_struct* songStruct) {
opensubsonic_getSong_struct_free(&songStruct);
}
opensubsonic_getAlbum_struct* LOSS_getAlbum(char* id) {
opensubsonic_httpClient_URL_t* url = (opensubsonic_httpClient_URL_t*)malloc(sizeof(opensubsonic_httpClient_URL_t));
opensubsonic_httpClient_URL_prepare(&url);
url->endpoint = OPENSUBSONIC_ENDPOINT_GETALBUM;
url->id = strdup(id);
opensubsonic_httpClient_formUrl(&url);
opensubsonic_getAlbum_struct* alStruct;
opensubsonic_httpClient_fetchResponse(&url, (void**)&alStruct);
opensubsonic_httpClient_URL_cleanup(&url);
return alStruct;
}
void LOSS_deleteAlbum(opensubsonic_getAlbum_struct* albumStruct) {
//opensubsonic_getAlbum_struct_free(albumStruct); // TODO
}
// no error checking right now because fuck that TODO
opensubsonic_getAlbumList_struct* LOSS_getAlbumList(int type, int amount) {
opensubsonic_httpClient_URL_t* url = (opensubsonic_httpClient_URL_t*)malloc(sizeof(opensubsonic_httpClient_URL_t));
opensubsonic_httpClient_URL_prepare(&url);
url->endpoint = OPENSUBSONIC_ENDPOINT_GETALBUMLIST;
url->type = type;
url->amount = amount;
opensubsonic_httpClient_formUrl(&url);
printf("%s\n", url->formedUrl);
opensubsonic_getAlbumList_struct* alStruct;
opensubsonic_httpClient_fetchResponse(&url, (void**)&alStruct);
opensubsonic_httpClient_URL_cleanup(&url);
return alStruct;
}
opensubsonic_getPlaylists_struct* LOSS_getPlaylists(void) {
opensubsonic_httpClient_URL_t* url = (opensubsonic_httpClient_URL_t*)malloc(sizeof(opensubsonic_httpClient_URL_t));
opensubsonic_httpClient_URL_prepare(&url);
url->endpoint = OPENSUBSONIC_ENDPOINT_GETPLAYLISTS;
opensubsonic_httpClient_formUrl(&url);
opensubsonic_getPlaylists_struct* alStruct;
opensubsonic_httpClient_fetchResponse(&url, (void**)&alStruct);
opensubsonic_httpClient_URL_cleanup(&url);
return alStruct;
}
char* LOSS_getCoverArt(char* id) {
opensubsonic_httpClient_URL_t* url = (opensubsonic_httpClient_URL_t*)malloc(sizeof(opensubsonic_httpClient_URL_t));
opensubsonic_httpClient_URL_prepare(&url);
url->endpoint = OPENSUBSONIC_ENDPOINT_GETCOVERART;
url->id = strdup(id);
opensubsonic_httpClient_formUrl(&url);
return url->formedUrl;
// TODO need to free URL struct
}
char* LOSS_Stream(char* id) {
// Perform scrobble to navidrome (Used purely for server side tracking)
opensubsonic_httpClient_URL_t* scrobble_url = (opensubsonic_httpClient_URL_t*)malloc(sizeof(opensubsonic_httpClient_URL_t));
opensubsonic_httpClient_URL_prepare(&scrobble_url);
scrobble_url->endpoint = OPENSUBSONIC_ENDPOINT_SCROBBLE;
scrobble_url->id = strdup(id);
scrobble_url->submit = true;
opensubsonic_httpClient_formUrl(&scrobble_url);
opensubsonic_scrobble_struct* scrobbleStruct;
opensubsonic_httpClient_fetchResponse(&scrobble_url, (void**)&scrobbleStruct);
opensubsonic_scrobble_struct_free(&scrobbleStruct);
opensubsonic_httpClient_URL_cleanup(&scrobble_url);
// Actually make the stream url
opensubsonic_httpClient_URL_t* url = (opensubsonic_httpClient_URL_t*)malloc(sizeof(opensubsonic_httpClient_URL_t));
opensubsonic_httpClient_URL_prepare(&url);
url->endpoint = OPENSUBSONIC_ENDPOINT_STREAM;
url->id = strdup(id);
opensubsonic_httpClient_formUrl(&url);
return url->formedUrl;
// TODO need to free URL struct
}
void discordrpc_update(int type, opensubsonic_getSong_struct* songStruct) {
printf("Updating Discord RPC\n");
dscrdrpc_data* dscrdrpc = NULL;
dscrdrpc_struct_init(&dscrdrpc);
if (type == 1) {
dscrdrpc->requestType = DSCRDRPC_REQTYPE_PLAYING;
} else if (type == 2) {
dscrdrpc->requestType = DSCRDRPC_REQTYPE_KEEPALIVE;
} else if (type == 3) {
dscrdrpc->requestType = DSCRDRPC_REQTYPE_PAUSED;
}
dscrdrpc->songTitle = strdup(songStruct->title);
dscrdrpc->songArtist = strdup(songStruct->artist);
dscrdrpc->coverArtUrl = LOSS_getCoverArt(songStruct->coverArt);
dscrdrpc->deviceInfo = strdup("iPhone (iOS 16.6)");
dscrdrpc->songLength = songStruct->duration;
dscrdrpc_encrypt(&dscrdrpc);
printf("Checksum: %s\n", dscrdrpc->checksum);
dscrdrpc_struct_deinit(&dscrdrpc);
}