From 732f31ccf351c21b8b33db29a61a17ffc4dd264b Mon Sep 17 00:00:00 2001 From: aynakeya Date: Mon, 29 Dec 2025 22:56:59 +0800 Subject: [PATCH] add libmiaosic --- .gitignore | 3 +- libmiaosic/example/main.c | 48 +++++++++++++++++ libmiaosic/libmiaosic.go | 108 +++++++++++++++++++++++++++++++++++++- libmiaosic/libmiaosic.h | 108 +++++++++++++++++++++++++++++++++++++- 4 files changed, 264 insertions(+), 3 deletions(-) create mode 100644 libmiaosic/example/main.c diff --git a/.gitignore b/.gitignore index 7638b0a..e55c11c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ go.sum cmd/miaosic/miaosic cmd/miaosic/session.json -cmd/miaosic/session.bak.json \ No newline at end of file +cmd/miaosic/session.bak.json +libmiaosic/libmiaosic.so \ No newline at end of file diff --git a/libmiaosic/example/main.c b/libmiaosic/example/main.c new file mode 100644 index 0000000..547cd84 --- /dev/null +++ b/libmiaosic/example/main.c @@ -0,0 +1,48 @@ +#include +#include + +#include "libmiaosic.h" + +static void print_error(const char* label, MiaosicResult* res) { + if (res == NULL) { + fprintf(stderr, "%s: result is NULL\n", label); + return; + } + if (res->ok) { + return; + } + fprintf(stderr, "%s failed: %s\n", label, res->err ? res->err : "unknown error"); +} + +int main(void) { + MiaosicResult* reg = UseBilibiliVideo(); + if (reg == NULL || !reg->ok) { + print_error("UseBilibiliVideo", reg); + FreeResult(reg); + return 1; + } + FreeResult(reg); + + MiaosicResult* search = SearchByProvider("bilibili-video", "家有女友", 1, 5); + if (search == NULL || !search->ok || search->result_type != MIAOSIC_RESULT_MEDIA_INFO_LIST) { + print_error("SearchByProvider", search); + FreeResult(search); + return 1; + } + + MiaosicMediaInfoList* list = (MiaosicMediaInfoList*)search->data; + printf("Search results: %d\n", list ? list->len : 0); + if (list && list->len > 0) { + for (int i = 0; i < list->len; i++) { + MiaosicMediaInfo* info = &list->items[i]; + const char* title = info->title ? info->title : ""; + const char* artist = info->artist ? info->artist : ""; + const char* provider = info->meta.provider ? info->meta.provider : ""; + const char* identifier = info->meta.identifier ? info->meta.identifier : ""; + printf("[%d] %s - %s (%s:%s)\n", i + 1, title, artist, provider, identifier); + } + } + + FreeResult(search); + return 0; +} diff --git a/libmiaosic/libmiaosic.go b/libmiaosic/libmiaosic.go index 7753750..a9a1f6e 100644 --- a/libmiaosic/libmiaosic.go +++ b/libmiaosic/libmiaosic.go @@ -3,7 +3,113 @@ package main /* #include #include -#include "libmiaosic.h" +typedef struct { + char* provider; + char* identifier; +} MiaosicMetaData; + +typedef struct { + char* url; + unsigned char* data; + int data_len; +} MiaosicPicture; + +typedef struct { + char* title; + char* artist; + MiaosicPicture cover; + char* album; + MiaosicMetaData meta; +} MiaosicMediaInfo; + +typedef struct { + char* key; + char* value; +} MiaosicHeaderPair; + +typedef struct { + char* url; + char* quality; + MiaosicHeaderPair* headers; + int header_len; +} MiaosicMediaUrl; + +typedef struct { + int len; + MiaosicMediaInfo* items; +} MiaosicMediaInfoList; + +typedef struct { + int len; + MiaosicMediaUrl* items; +} MiaosicMediaUrlList; + +typedef struct { + char* title; + MiaosicMediaInfoList medias; + MiaosicMetaData meta; +} MiaosicPlaylist; + +typedef struct { + int matched; + MiaosicMetaData meta; +} MiaosicMatchResult; + +typedef struct { + char* url; + char* key; +} MiaosicQrLoginSession; + +typedef struct { + int success; + char* message; +} MiaosicQrLoginResult; + +typedef struct { + char* lang; + char* lyrics; +} MiaosicLyrics; + +typedef struct { + int len; + MiaosicLyrics* items; +} MiaosicLyricsList; + +typedef struct { + int value; +} MiaosicBool; + +typedef struct { + char* value; +} MiaosicString; + +typedef struct { + int len; + char** items; +} MiaosicStringList; + +typedef enum { + MIAOSIC_RESULT_NONE = 0, + MIAOSIC_RESULT_BOOL = 1, + MIAOSIC_RESULT_STRING = 2, + MIAOSIC_RESULT_STRING_LIST = 3, + MIAOSIC_RESULT_META = 4, + MIAOSIC_RESULT_MEDIA_INFO = 5, + MIAOSIC_RESULT_MEDIA_INFO_LIST = 6, + MIAOSIC_RESULT_MEDIA_URL_LIST = 7, + MIAOSIC_RESULT_PLAYLIST = 8, + MIAOSIC_RESULT_MATCH = 9, + MIAOSIC_RESULT_QR_LOGIN_SESSION = 10, + MIAOSIC_RESULT_QR_LOGIN_RESULT = 11, + MIAOSIC_RESULT_LYRICS_LIST = 12 +} MiaosicResultType; + +typedef struct MiaosicResult { + int ok; + char* err; + MiaosicResultType result_type; + void* data; +} MiaosicResult; */ import "C" diff --git a/libmiaosic/libmiaosic.h b/libmiaosic/libmiaosic.h index 7b9e5a0..8cdef4a 100644 --- a/libmiaosic/libmiaosic.h +++ b/libmiaosic/libmiaosic.h @@ -23,7 +23,113 @@ typedef struct { const char *p; ptrdiff_t n; } _GoString_; #include #include -#include "libmiaosic.h" +typedef struct { + char* provider; + char* identifier; +} MiaosicMetaData; + +typedef struct { + char* url; + unsigned char* data; + int data_len; +} MiaosicPicture; + +typedef struct { + char* title; + char* artist; + MiaosicPicture cover; + char* album; + MiaosicMetaData meta; +} MiaosicMediaInfo; + +typedef struct { + char* key; + char* value; +} MiaosicHeaderPair; + +typedef struct { + char* url; + char* quality; + MiaosicHeaderPair* headers; + int header_len; +} MiaosicMediaUrl; + +typedef struct { + int len; + MiaosicMediaInfo* items; +} MiaosicMediaInfoList; + +typedef struct { + int len; + MiaosicMediaUrl* items; +} MiaosicMediaUrlList; + +typedef struct { + char* title; + MiaosicMediaInfoList medias; + MiaosicMetaData meta; +} MiaosicPlaylist; + +typedef struct { + int matched; + MiaosicMetaData meta; +} MiaosicMatchResult; + +typedef struct { + char* url; + char* key; +} MiaosicQrLoginSession; + +typedef struct { + int success; + char* message; +} MiaosicQrLoginResult; + +typedef struct { + char* lang; + char* lyrics; +} MiaosicLyrics; + +typedef struct { + int len; + MiaosicLyrics* items; +} MiaosicLyricsList; + +typedef struct { + int value; +} MiaosicBool; + +typedef struct { + char* value; +} MiaosicString; + +typedef struct { + int len; + char** items; +} MiaosicStringList; + +typedef enum { + MIAOSIC_RESULT_NONE = 0, + MIAOSIC_RESULT_BOOL = 1, + MIAOSIC_RESULT_STRING = 2, + MIAOSIC_RESULT_STRING_LIST = 3, + MIAOSIC_RESULT_META = 4, + MIAOSIC_RESULT_MEDIA_INFO = 5, + MIAOSIC_RESULT_MEDIA_INFO_LIST = 6, + MIAOSIC_RESULT_MEDIA_URL_LIST = 7, + MIAOSIC_RESULT_PLAYLIST = 8, + MIAOSIC_RESULT_MATCH = 9, + MIAOSIC_RESULT_QR_LOGIN_SESSION = 10, + MIAOSIC_RESULT_QR_LOGIN_RESULT = 11, + MIAOSIC_RESULT_LYRICS_LIST = 12 +} MiaosicResultType; + +typedef struct MiaosicResult { + int ok; + char* err; + MiaosicResultType result_type; + void* data; +} MiaosicResult; #line 1 "cgo-generated-wrapper"