diff --git a/inc/lektor/config.def b/inc/lektor/config.def index 35f43dfd14ea98201121a27713909788f94dd93f..5536e16fc39bddc825ab061781828d1877b82227 100644 --- a/inc/lektor/config.def +++ b/inc/lektor/config.def @@ -11,11 +11,6 @@ comment("Can be DEBUG, INFO, WARN, ERROR.") value_opt("log", "INFO") -/* EXTERNALS */ -section("externals") -comment("All specified programs in this section must exists!") -value("mkvpropedit", "/usr/bin/mkvpropedit") - /* SERVER */ section("server") value("max_clients", "16") diff --git a/inc/lektor/mkv.h b/inc/lektor/mkv.h index a9116732fecc681e0dce8d2ad446dea4bb77a330..b29d6029095c6b8be6a0d48f05dbcf774dea17b6 100644 --- a/inc/lektor/mkv.h +++ b/inc/lektor/mkv.h @@ -47,7 +47,7 @@ int kara_metadata_read(struct kara_metadata *dst, const char *filename); int kara_read_length(double *len, const char *filename); /* Write metadata to a mkv file. Returns 0 on success and -1 on error */ -int kara_metadata_write(struct kara_metadata *mdt, const char *filename, const char *mkvpropedit); +int kara_metadata_write(struct kara_metadata *mdt, const char *filename); /* Concatenate the mdt in a string that is allocated and the user must free it */ void mdtcat(struct kara_metadata *mdt, char **ret); @@ -58,10 +58,10 @@ void mdtcat(struct kara_metadata *mdt, char **ret); int kara_metadata_equals(struct kara_metadata *mdt, const char *filename); /* Set the metadata for the file according to its path. */ -int metadata_set_file(char *karapath, const char *mkvpropedit); +int metadata_set_file(char *karapath); /* Set metadata for files under a given directory by their path. */ -int metadata_set_directory(const char *kara_dir, const char *mkvpropedit); +int metadata_set_directory(const char *kara_dir); /* Returns 0 if the correct magic number is found in the file, anything * otherwise. The correct magic number is `1A 45 DF A3`. */ diff --git a/src/main/lkt.c b/src/main/lkt.c index 814178c09f3657c392f301ad8a7203b5f94072b0..8e4c1d38639debc4bf2e2fe9236138a3364eda99 100644 --- a/src/main/lkt.c +++ b/src/main/lkt.c @@ -565,10 +565,10 @@ __read_kara_and_exit(FILE *sock) ok: if (language[0]) - printf("%s - %s / %s - %s - %s [ %s ]\n", + printf("%s - %s / %s - %s - %s [%s]\n", category, language, source, type, title, author); else if (category[0]) - printf("%s / %s - %s - %s [ %s ]\n", + printf("%s / %s - %s - %s [%s]\n", category, source, type, title, author); else exit(EXIT_FAILURE); @@ -749,9 +749,8 @@ status__(struct cmd_args *args) if (is_updating) { printf("Updating: %d/%d%s\n", update_tick, update_count, update_count >= update_tick ? "" : " (invalid)"); - } else { + } else printf("Last update: %s\n", buff); - } /* If there is a kara loaded in mpv, get this kara. */ if (!stopped) { diff --git a/src/main/mkv_test.c b/src/main/mkv_test.c deleted file mode 100644 index be64642ee2c7c4a49f70ad625e0087f01116cea7..0000000000000000000000000000000000000000 --- a/src/main/mkv_test.c +++ /dev/null @@ -1,58 +0,0 @@ -#define _POSIX_C_SOURCE 200809L - -#include <lektor/common.h> -#include <lektor/segv.h> -#include <lektor/mkv.h> - -#include <errno.h> -#include <fcntl.h> -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <strings.h> -#include <unistd.h> -#include <signal.h> -#include <limits.h> -#include <ctype.h> - -int -main(int argc, char **argv) -{ - if (argc != 2) { - puts("ARG MUST BE A FILENAME"); - exit(EXIT_FAILURE); - } - -#define WHICH "TOTO" - - struct kara_metadata mdt = { - .song_name = WHICH "_SONG_NAME", - .source_name = WHICH "_SOURCE_NAME", - .category = WHICH "_CAT_NAME", - .language = WHICH "_LANG_NAME", - .author_name = WHICH "_AUTHOR_NAME", - .song_type = WHICH "_TYPE ", - .song_number = 42, - }; - - puts(argv[1]); - - if (kara_metadata_write(&mdt, argv[1], "/usr/bin/mkvpropedit")) { - puts("WRITE FAILED"); - exit(EXIT_FAILURE); - } - - if (kara_metadata_read(&mdt, argv[1])) { - puts("WRITE FAILED"); - exit(EXIT_FAILURE); - } - - fprintf(stdout, "title:\t%s\nsource:\t%s\ncat:\t%s\nlang:\t%s\nauthor:\t%s\ntype:\t%s%d\n", - mdt.song_name, mdt.source_name, mdt.category, mdt.language, mdt.author_name, - mdt.song_type, mdt.song_number); - - return 0; - - return 0; -} diff --git a/src/main/server.c b/src/main/server.c index 2223ad06333c70003cd770b85bb034bea2cce259..64c15f3af6a61a6223667d86af08d7eef4a724e8 100644 --- a/src/main/server.c +++ b/src/main/server.c @@ -36,8 +36,8 @@ extern char **environ; /* Disable echo in the console, only for the program */ - struct termios ___tty_cur, ___tty_save; +static int ___tty_must_be_restored = 0; __attribute__((constructor)) static void ___tty_disable_echo(void) @@ -50,6 +50,7 @@ static void ___tty_disable_echo(void) GOTO_IF((tcsetattr(STDIN_FILENO, TCSAFLUSH, &___tty_cur) == -1), "Failed to turned of echo in termios flags", error); + ___tty_must_be_restored = 1; return; error: @@ -60,6 +61,10 @@ error: __attribute__((destructor)) static void ___tty_enable_echo(void) { + if (!___tty_must_be_restored) { + LOG_DEBUG("INIT", "No need to restore the tty"); + return; + } if (tcsetattr(STDIN_FILENO, TCSANOW, &___tty_save) == -1) LOG_ERROR("INIT", "Failed to reset termios flags"); errno = 0; @@ -122,7 +127,7 @@ ___kill_klkt(void) } while (!WIFEXITED(status) && !WIFSIGNALED(status)); } -static inline int +static int launch_klkt(va_list UNUSED *___args) { /* Check env variable! */ @@ -149,16 +154,18 @@ launch_klkt(va_list UNUSED *___args) bool appimage_once_goto = false; + /* No AppImage */ if (appimage == NULL) { - /* No AppImage */ -retry_without_appimage: + retry_without_appimage: appimage_once_goto = true; if (read_self_exe(exe_path, LKT_LINE_MAX)) { LOG_ERROR("INIT", "Failed to get the current executable path, not patching the PATH"); goto error; } - } else { - /* AppImage */ + } + + /* AppImage */ + else { safe_strncpy(exe_path, appimage, LKT_LINE_MAX); LOG_DEBUG("INIT", "Running an AppImage, file is %s", appimage); } @@ -210,6 +217,25 @@ end: return 0; } +static inline void +___resolve_appimage(void) +{ + /* Detect AppImage. Those env var names are defined for V2 AppImages, see + * https://docs.appimage.org/packaging-guide/environment-variables.html */ + const char *env_APPIMAGE = getenv("APPIMAGE"); + const char *env_APPDIR = getenv("APPDIR"); + const char *env_OWD = getenv("OWD"); + const char *env_ARGV0 = getenv("ARGV0"); + if (env_APPDIR || env_ARGV0 || env_APPIMAGE || env_OWD) { + LOG_DEBUG("INIT", "AppImage build detected, here are some usefull env vars"); + LOG_DEBUG("INIT", "AppImage env APPIMAGE = %s", env_APPIMAGE); + LOG_DEBUG("INIT", "AppImage env APPDIR = %s", env_APPDIR); + LOG_DEBUG("INIT", "AppImage env OWD = %s", env_OWD); + LOG_DEBUG("INIT", "AppImage env ARGV0 = %s", env_ARGV0); + } else + LOG_DEBUG("INIT", "No AppImage env variable found!"); +} + int main(int argc, char *argv[]) { @@ -262,20 +288,8 @@ main(int argc, char *argv[]) executable_name = exe; LOG_WARN("INIT", "The argv[0] from main is: %s", exe); - /* Detect AppImage. Those env var names are defined for V2 AppImages, see - * https://docs.appimage.org/packaging-guide/environment-variables.html */ - char *env_APPIMAGE = getenv("APPIMAGE"); - char *env_APPDIR = getenv("APPDIR"); - char *env_OWD = getenv("OWD"); - char *env_ARGV0 = getenv("ARGV0"); - if (env_APPDIR || env_ARGV0 || env_APPIMAGE || env_OWD) { - LOG_DEBUG("INIT", "AppImage build detected, here are some usefull env vars"); - LOG_DEBUG("INIT", "AppImage env APPIMAGE = %s", env_APPIMAGE); - LOG_DEBUG("INIT", "AppImage env APPDIR = %s", env_APPDIR); - LOG_DEBUG("INIT", "AppImage env OWD = %s", env_OWD); - LOG_DEBUG("INIT", "AppImage env ARGV0 = %s", env_ARGV0); - } else - LOG_DEBUG("INIT", "No AppImage env variable found!"); + /* Resolves */ + ___resolve_appimage(); /* Init the server */ struct lkt_state srv; diff --git a/src/mkv/write.c b/src/mkv/write.c index ad9de592e29ef96b8726a5976832d93d8f7986f4..cfc941c2d553325dc691ea71368a52d2ba92a58e 100644 --- a/src/mkv/write.c +++ b/src/mkv/write.c @@ -75,7 +75,8 @@ mkvpropedit__(const char *const args[]) return false; } - execv(args[0], (char *const *) args); + /* Let exec search the PATH for us */ + execvp(args[0], (char *const *) args); exit(EXIT_FAILURE); } @@ -106,20 +107,19 @@ mkvpropedit__(const char *const args[]) } int -kara_metadata_write(struct kara_metadata *mdt, const char *filename, - const char *mkvpropedit) +kara_metadata_write(struct kara_metadata *mdt, const char *filename) { char tmpfilepath[PATH_MAX]; char *const metadafilepath = &tmpfilepath[4]; - const char *args1[] = { mkvpropedit, "-t", "all:", filename, NULL }; - const char *args2[] = { mkvpropedit, "-t", tmpfilepath, filename, NULL }; + const char *args1[] = { "mkvpropedit", "-t", "all:", filename, NULL }; + const char *args2[] = { "mkvpropedit", "-t", tmpfilepath, filename, NULL }; int fd, sta = -1; memset(tmpfilepath, 0, PATH_MAX); strncat(tmpfilepath, "all:/tmp/lektor.metadata.XXXXXX", PATH_MAX - 1); if ((fd = mkstemp(metadafilepath)) < 0) { - LOG_ERROR("WRITER", "Failed to create temporary file: %s", + LOG_ERROR("MKV", "Failed to create temporary file: %s", strerror(errno)); goto error; } @@ -127,7 +127,7 @@ kara_metadata_write(struct kara_metadata *mdt, const char *filename, if (dprintf(fd, METADATA_TEMPLATE, mdt->source_name, mdt->song_name, mdt->category, mdt->language, mdt->author_name, mdt->song_type, mdt->song_number) < 0) { - LOG_ERROR("WRITER", "Failed to write to temporary file: %s", + LOG_ERROR("MKV", "Failed to write to temporary file: %s", metadafilepath); goto error; } @@ -155,7 +155,7 @@ metadata_from_path(char *const mkvfile, struct kara_metadata *meta) /* TODO: Import types and categories from the db */ static const char *rgx = - "^/(.+)/(vo|va|amv|cdg|autres|vocaloid)/" + "^/(.+)/(vo|va|amv|cdg|autres|vtuber)/" "(jp|fr|en|ru|sp|it|ch|latin|multi|undefined)/(.+)/" "(.+) - (OP|ED|IS|AMV|PV|MV|LIVE)([[:digit:]]*) - (.+)\\.mkv$"; @@ -180,11 +180,11 @@ metadata_from_path(char *const mkvfile, struct kara_metadata *meta) memcpy(meta->song_name, mkvfile + pmatch[8].rm_so, pmatch[8].rm_eo - pmatch[8].rm_so); // *INDENT-ON* } else if (REG_NOMATCH == reti) { - LOG_ERROR("WRITER", "No match for: %s", mkvfile); + LOG_ERROR("MKV", "No match for: %s", mkvfile); goto error; } else { regerror(reti, ®ex, msgbuf, sizeof(msgbuf)); - LOG_ERROR("WRITER", "Failed to execute regex: %s", msgbuf); + LOG_ERROR("MKV", "Failed to execute regex: %s", msgbuf); goto error; } @@ -199,7 +199,7 @@ error: } int -metadata_set_directory(const char *kara_dir, const char *mkvpropedit) +metadata_set_directory(const char *kara_dir) { DIR *d; struct dirent *dir; @@ -208,7 +208,7 @@ metadata_set_directory(const char *kara_dir, const char *mkvpropedit) memset(path, 0, PATH_MAX * sizeof(char)); if (!(d = opendir(kara_dir))) { - LOG_ERROR("WRITER", "Failed to open directory '%s': %s", kara_dir, + LOG_ERROR("MKV", "Failed to open directory '%s': %s", kara_dir, strerror(errno)); return 1; } @@ -220,25 +220,25 @@ metadata_set_directory(const char *kara_dir, const char *mkvpropedit) if (dir->d_type == DT_REG && metadata_from_path(path, &meta) && - ! kara_metadata_write(&meta, path, mkvpropedit)) + ! kara_metadata_write(&meta, path)) continue; else if (dir->d_type == DT_DIR && !STR_MATCH(dir->d_name, ".") && !STR_MATCH(dir->d_name, "..")) - metadata_set_directory(path, mkvpropedit); + metadata_set_directory(path); } - LOG_INFO("WRITER", "Passed directory '%s'", kara_dir); + LOG_INFO("MKV", "Passed directory '%s'", kara_dir); closedir(d); return false; } int -metadata_set_file(char *karapath, const char *mkvpropedit) +metadata_set_file(char *karapath) { struct kara_metadata meta; return metadata_from_path(karapath, &meta) && - ! kara_metadata_write(&meta, karapath, mkvpropedit); + ! kara_metadata_write(&meta, karapath); } diff --git a/src/module/module_repo.c b/src/module/module_repo.c index d05c07a1a9bfdd123caf1dcf813dd53c495b49fb..b52ac104ef8928d215393748a4139936452ca909 100644 --- a/src/module/module_repo.c +++ b/src/module/module_repo.c @@ -46,7 +46,6 @@ struct kara { long id; long unix_timestamp; struct kara_metadata mdt; - char mkvpropedit[LKT_LINE_MAX]; char url[LKT_LINE_MAX]; char database_filepath[PATH_MAX]; char filename[PATH_MAX]; @@ -349,7 +348,7 @@ __handle_got_json_dl(struct kara *kara, int current_id) return; } - if (kara_metadata_write(&kara->mdt, kara->filename, kara->mkvpropedit)) { + if (kara_metadata_write(&kara->mdt, kara->filename)) { LOG_WARN("REPO", "Could not write metadata to kara '%ld' with path '%s'", kara->id, kara->filename); return; @@ -455,9 +454,6 @@ __handle_got_json(volatile sqlite3 *db, struct module_repo_internal *repo, const }; RETURN_UNLESS(len > 0, "Json invalid or array empty", NOTHING); - RETURN_UNLESS(database_config_get(db, "externals", "mkvpropedit", - kara.mkvpropedit, PATH_MAX), - "Can't get the mkvpropedit executable path", NOTHING); /* Craft a folder path here, it will be used later */ kara.kara_dir_len = strlen(repo->kara_dir);