mirror of
https://github.com/Zaarrg/stremio-community-v5.git
synced 2026-01-11 20:10:31 +00:00
Merge 36ead9d841 into da0783dfd8
This commit is contained in:
commit
e632caad9e
9 changed files with 378 additions and 17 deletions
38
.github/workflows/build.yml
vendored
Normal file
38
.github/workflows/build.yml
vendored
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
name: Windows Build
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "master", "main", "webview-windows" ]
|
||||
pull_request:
|
||||
branches: [ "master", "main", "webview-windows" ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: windows-latest
|
||||
|
||||
env:
|
||||
VCPKG_ROOT: 'C:\vcpkg'
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Setup Vcpkg
|
||||
run: |
|
||||
cd $env:VCPKG_ROOT
|
||||
git pull
|
||||
.\bootstrap-vcpkg.bat
|
||||
|
||||
- name: Install Dependencies via Vcpkg
|
||||
run: |
|
||||
vcpkg install --triplet x64-windows-static
|
||||
|
||||
- name: Configure CMake
|
||||
run: |
|
||||
cmake -S . -B out -DCMAKE_TOOLCHAIN_FILE="$env:VCPKG_ROOT\scripts\buildsystems\vcpkg.cmake" -DVCPKG_TARGET_TRIPLET=x64-windows-static
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
cmake --build out --config Release --parallel
|
||||
36
.gitignore
vendored
Normal file
36
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
# Build directories
|
||||
out/
|
||||
bin/
|
||||
lib/
|
||||
*.exe
|
||||
*.dll
|
||||
*.lib
|
||||
*.pdb
|
||||
*.obj
|
||||
*.exp
|
||||
*.ilk
|
||||
|
||||
# CMake
|
||||
CMakeCache.txt
|
||||
CMakeFiles/
|
||||
cmake_install.cmake
|
||||
CMakeUserPresets.json
|
||||
compile_commands.json
|
||||
.cmake/
|
||||
|
||||
# Visual Studio
|
||||
.vs/
|
||||
*.sln
|
||||
*.vcxproj
|
||||
*.vcxproj.filters
|
||||
*.vcxproj.user
|
||||
|
||||
# Mac / Linux
|
||||
.DS_Store
|
||||
*.dylib
|
||||
*.so
|
||||
.vscode/
|
||||
|
||||
# Project specific
|
||||
deps/libmpv/x86_64/libmpv-2.dll
|
||||
deps/libmpv/i686/libmpv-2.dll
|
||||
3
.gitmodules
vendored
3
.gitmodules
vendored
|
|
@ -2,3 +2,6 @@
|
|||
path = deps/libmpv
|
||||
url = https://github.com/Zaarrg/libmpv
|
||||
branch = master
|
||||
[submodule "deps/discord-rpc"]
|
||||
path = deps/discord-rpc
|
||||
url = https://github.com/discord/discord-rpc
|
||||
|
|
|
|||
133
CMakeLists.txt
133
CMakeLists.txt
|
|
@ -1,5 +1,78 @@
|
|||
cmake_minimum_required(VERSION 3.16)
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Auto-detect Vcpkg
|
||||
# -----------------------------------------------------------------------------
|
||||
if(NOT DEFINED CMAKE_TOOLCHAIN_FILE)
|
||||
if(DEFINED ENV{VCPKG_ROOT})
|
||||
set(CMAKE_TOOLCHAIN_FILE "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" CACHE STRING "")
|
||||
else()
|
||||
# Try common locations
|
||||
set(_VCPKG_PATHS
|
||||
"C:/vcpkg"
|
||||
"C:/Users/$ENV{USERNAME}/vcpkg"
|
||||
"C:/Users/$ENV{USERNAME}/scoop/apps/vcpkg/current"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/deps/vcpkg"
|
||||
)
|
||||
foreach(_PATH ${_VCPKG_PATHS})
|
||||
if(EXISTS "${_PATH}/scripts/buildsystems/vcpkg.cmake")
|
||||
message(STATUS "Found Vcpkg at: ${_PATH}")
|
||||
set(CMAKE_TOOLCHAIN_FILE "${_PATH}/scripts/buildsystems/vcpkg.cmake" CACHE STRING "")
|
||||
break()
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
if(NOT DEFINED CMAKE_TOOLCHAIN_FILE)
|
||||
message(WARNING "Vcpkg not found in standard locations. Please set VCPKG_ROOT environment variable or pass -DCMAKE_TOOLCHAIN_FILE.")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(DEFINED CMAKE_TOOLCHAIN_FILE)
|
||||
message(STATUS "Using toolchain: ${CMAKE_TOOLCHAIN_FILE}")
|
||||
set(VCPKG_TARGET_TRIPLET "x64-windows-static" CACHE STRING "")
|
||||
set(VCPKG_MANIFEST_MODE ON CACHE BOOL "")
|
||||
set(VCPKG_MANIFEST_INSTALL ON CACHE BOOL "")
|
||||
|
||||
# Resolve VCPKG_ROOT from toolchain file path
|
||||
get_filename_component(_VCPKG_SCRIPTS_DIR "${CMAKE_TOOLCHAIN_FILE}" DIRECTORY) # .../scripts/buildsystems
|
||||
get_filename_component(_VCPKG_SCRIPTS_ROOT "${_VCPKG_SCRIPTS_DIR}" DIRECTORY) # .../scripts
|
||||
get_filename_component(VCPKG_ROOT_DETECTED "${_VCPKG_SCRIPTS_ROOT}" DIRECTORY) # .../vcpkg (root)
|
||||
|
||||
# Preseed NASM if not present (fix for unstable nasm.us)
|
||||
# Extract the exact version vcpkg wants from its own scripts
|
||||
set(NASM_ACQUIRE_SCRIPT "${VCPKG_ROOT_DETECTED}/scripts/cmake/vcpkg_find_acquire_program(NASM).cmake")
|
||||
|
||||
if(EXISTS "${NASM_ACQUIRE_SCRIPT}")
|
||||
file(READ "${NASM_ACQUIRE_SCRIPT}" SCRIPT_CONTENTS)
|
||||
string(REGEX MATCH "set\\(program_version ([0-9.]+)\\)" _ "${SCRIPT_CONTENTS}")
|
||||
set(NASM_VERSION ${CMAKE_MATCH_1})
|
||||
|
||||
if(NASM_VERSION)
|
||||
set(NASM_ZIP "nasm-${NASM_VERSION}-win64.zip")
|
||||
set(VCPKG_DOWNLOADS "${VCPKG_ROOT_DETECTED}/downloads")
|
||||
|
||||
# 1. Ensure the downloads directory exists
|
||||
if(NOT EXISTS "${VCPKG_DOWNLOADS}")
|
||||
file(MAKE_DIRECTORY "${VCPKG_DOWNLOADS}")
|
||||
endif()
|
||||
|
||||
# 2. Pre-seed the ZIP
|
||||
if(NOT EXISTS "${VCPKG_DOWNLOADS}/${NASM_ZIP}")
|
||||
message(STATUS "vcpkg needs NASM ${NASM_VERSION}. Pre-seeding from mirror...")
|
||||
file(DOWNLOAD
|
||||
"https://gstreamer.freedesktop.org/data/src/mirror/${NASM_ZIP}"
|
||||
"${VCPKG_DOWNLOADS}/${NASM_ZIP}"
|
||||
SHOW_PROGRESS
|
||||
TLS_VERIFY ON
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
message(STATUS "DEBUG: CMake running...")
|
||||
|
||||
project(stremio VERSION "5.0.21")
|
||||
|
||||
set(CMAKE_CXX_STANDARD 20)
|
||||
|
|
@ -7,25 +80,53 @@ set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
|
|||
|
||||
option(DEBUG_LOG "Allow debug logs" ON)
|
||||
|
||||
# Locate MPV
|
||||
# Locate MPV and Discord
|
||||
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||
# 64-bit architecture
|
||||
set(MPV_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/deps/libmpv/x86_64/include")
|
||||
set(MPV_LIBRARY "${CMAKE_CURRENT_SOURCE_DIR}/deps/libmpv/x86_64/mpv.lib")
|
||||
set(MPV_DLL "${CMAKE_CURRENT_SOURCE_DIR}/deps/libmpv/x86_64/libmpv-2.dll")
|
||||
|
||||
set(DISCORD_LIB "${CMAKE_CURRENT_SOURCE_DIR}/deps/discord-rpc/win64-static/lib/discord-rpc.lib")
|
||||
set(DISCORD_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/deps/discord-rpc/win64-static/include")
|
||||
set(MPV_ARCH "x86_64")
|
||||
else()
|
||||
# 32-bit architecture
|
||||
set(MPV_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/deps/libmpv/i686/include")
|
||||
set(MPV_LIBRARY "${CMAKE_CURRENT_SOURCE_DIR}/deps/libmpv/i686/mpv.lib")
|
||||
set(MPV_DLL "${CMAKE_CURRENT_SOURCE_DIR}/deps/libmpv/i686/libmpv-2.dll")
|
||||
|
||||
set(DISCORD_LIB "${CMAKE_CURRENT_SOURCE_DIR}/deps/discord-rpc/win32-static/lib/discord-rpc.lib")
|
||||
set(DISCORD_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/deps/discord-rpc/win32-static/include")
|
||||
set(MPV_ARCH "i686")
|
||||
endif()
|
||||
|
||||
set(MPV_DIR "${CMAKE_CURRENT_SOURCE_DIR}/deps/libmpv/${MPV_ARCH}")
|
||||
set(MPV_INCLUDE_DIR "${MPV_DIR}/include")
|
||||
set(MPV_LIBRARY "${MPV_DIR}/mpv.lib")
|
||||
set(MPV_DLL "${MPV_DIR}/libmpv-2.dll")
|
||||
set(MPV_RAR "${MPV_DIR}/libmpv-2.dll.rar")
|
||||
|
||||
# Auto-extract libmpv if needed
|
||||
if(EXISTS "${MPV_RAR}" AND NOT EXISTS "${MPV_DLL}")
|
||||
message(STATUS "Extracting libmpv DLL from ${MPV_RAR}...")
|
||||
execute_process(
|
||||
COMMAND ${CMAKE_COMMAND} -E tar x "${MPV_RAR}"
|
||||
WORKING_DIRECTORY "${MPV_DIR}"
|
||||
RESULT_VARIABLE TAR_RESULT
|
||||
)
|
||||
if(NOT TAR_RESULT EQUAL 0)
|
||||
message(WARNING "Failed to extract libmpv dll. Please unzip manually.")
|
||||
else()
|
||||
message(STATUS "Successfully extracted libmpv.")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Automate discord-rpc patching
|
||||
file(READ "${CMAKE_CURRENT_SOURCE_DIR}/deps/discord-rpc/include/discord_rpc.h" RPC_HEADER_CONTENT)
|
||||
if(NOT RPC_HEADER_CONTENT MATCHES "statusDisplayType")
|
||||
message(STATUS "Patching discord-rpc...")
|
||||
find_package(Git REQUIRED)
|
||||
execute_process(
|
||||
COMMAND ${GIT_EXECUTABLE} apply --directory=deps/discord-rpc "${CMAKE_CURRENT_SOURCE_DIR}/deps/discord-rpc.patch"
|
||||
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
|
||||
RESULT_VARIABLE PATCH_RESULT
|
||||
)
|
||||
if(NOT PATCH_RESULT EQUAL 0)
|
||||
message(FATAL_ERROR "Failed to apply discord-rpc.patch. Please apply manually or check git state.")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
option(BUILD_EXAMPLES "Build example apps" OFF)
|
||||
add_subdirectory(deps/discord-rpc)
|
||||
set(DISCORD_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/deps/discord-rpc/include")
|
||||
|
||||
include_directories(${DISCORD_INCLUDE_DIR})
|
||||
include_directories(${MPV_INCLUDE_DIR})
|
||||
|
||||
|
|
@ -82,7 +183,7 @@ target_link_libraries(${PROJECT_NAME} PRIVATE
|
|||
OpenSSL::Crypto
|
||||
CURL::libcurl
|
||||
${MPV_LIBRARY}
|
||||
${DISCORD_LIB}
|
||||
discord-rpc
|
||||
)
|
||||
|
||||
target_compile_definitions(${PROJECT_NAME} PRIVATE DEBUG_LOG)
|
||||
|
|
|
|||
23
CMakePresets.json
Normal file
23
CMakePresets.json
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
"version": 3,
|
||||
"configurePresets": [
|
||||
{
|
||||
"name": "windows-base",
|
||||
"hidden": true,
|
||||
"generator": "Visual Studio 17 2022",
|
||||
"binaryDir": "${sourceDir}/out",
|
||||
"cacheVariables": {
|
||||
"VCPKG_TARGET_TRIPLET": "x64-windows-static"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "windows-vcpkg-auto",
|
||||
"displayName": "Windows x64 (Auto Vcpkg)",
|
||||
"description": "Uses VCPKG_ROOT env var or standard paths",
|
||||
"inherits": "windows-base",
|
||||
"cacheVariables": {
|
||||
"CMAKE_TOOLCHAIN_FILE": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
1
deps/discord-rpc
vendored
Submodule
1
deps/discord-rpc
vendored
Submodule
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 963aa9f3e5ce81a4682c6ca3d136cddda614db33
|
||||
147
deps/discord-rpc.patch
vendored
Normal file
147
deps/discord-rpc.patch
vendored
Normal file
|
|
@ -0,0 +1,147 @@
|
|||
diff --git a/include/discord_rpc.h b/include/discord_rpc.h
|
||||
index 9470434..619b13e 100644
|
||||
--- a/include/discord_rpc.h
|
||||
+++ b/include/discord_rpc.h
|
||||
@@ -1,5 +1,6 @@
|
||||
#pragma once
|
||||
#include <stdint.h>
|
||||
+#include <string.h>
|
||||
|
||||
// clang-format off
|
||||
|
||||
@@ -23,6 +24,24 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
+// Activity Type
|
||||
+#define DISCORD_ACTIVITY_TYPE_GAME 0
|
||||
+#define DISCORD_ACTIVITY_TYPE_STREAMING 1
|
||||
+#define DISCORD_ACTIVITY_TYPE_LISTENING 2
|
||||
+#define DISCORD_ACTIVITY_TYPE_WATCHING 3
|
||||
+#define DISCORD_ACTIVITY_TYPE_CUSTOM 4
|
||||
+#define DISCORD_ACTIVITY_TYPE_COMPETING 5
|
||||
+
|
||||
+// Status Display Types
|
||||
+#define DISCORD_STATUS_DISPLAY_TYPE_NAME 0
|
||||
+#define DISCORD_STATUS_DISPLAY_TYPE_STATE 1
|
||||
+#define DISCORD_STATUS_DISPLAY_TYPE_DETAILS 2
|
||||
+
|
||||
+typedef struct DiscordButton {
|
||||
+ const char* label;
|
||||
+ const char* url;
|
||||
+} DiscordButton;
|
||||
+
|
||||
typedef struct DiscordRichPresence {
|
||||
const char* state; /* max 128 bytes */
|
||||
const char* details; /* max 128 bytes */
|
||||
@@ -40,6 +59,24 @@ typedef struct DiscordRichPresence {
|
||||
const char* joinSecret; /* max 128 bytes */
|
||||
const char* spectateSecret; /* max 128 bytes */
|
||||
int8_t instance;
|
||||
+
|
||||
+ // New Fields
|
||||
+ const char* name;
|
||||
+ int type;
|
||||
+ const char* url;
|
||||
+ int64_t createdAt;
|
||||
+ const char* applicationId;
|
||||
+ int statusDisplayType;
|
||||
+ const char* detailsUrl;
|
||||
+ const char* stateUrl;
|
||||
+ const char* emojiName;
|
||||
+ const char* emojiId;
|
||||
+ int8_t emojiAnimated;
|
||||
+ int flags;
|
||||
+ const char* button1Label;
|
||||
+ const char* button1Url;
|
||||
+ const char* button2Label;
|
||||
+ const char* button2Url;
|
||||
} DiscordRichPresence;
|
||||
|
||||
typedef struct DiscordUser {
|
||||
diff --git a/src/serialization.cpp b/src/serialization.cpp
|
||||
index 70efa63..039f155 100644
|
||||
--- a/src/serialization.cpp
|
||||
+++ b/src/serialization.cpp
|
||||
@@ -107,6 +107,25 @@ size_t JsonWriteRichPresenceObj(char* dest,
|
||||
|
||||
WriteOptionalString(writer, "state", presence->state);
|
||||
WriteOptionalString(writer, "details", presence->details);
|
||||
+ WriteOptionalString(writer, "url", presence->url);
|
||||
+ WriteOptionalString(writer, "application_id", presence->applicationId);
|
||||
+ WriteOptionalString(writer, "details_url", presence->detailsUrl);
|
||||
+ WriteOptionalString(writer, "state_url", presence->stateUrl);
|
||||
+
|
||||
+ if (presence->type) {
|
||||
+ WriteKey(writer, "type");
|
||||
+ writer.Int(presence->type);
|
||||
+ }
|
||||
+
|
||||
+ if (presence->createdAt) {
|
||||
+ WriteKey(writer, "created_at");
|
||||
+ writer.Int64(presence->createdAt);
|
||||
+ }
|
||||
+
|
||||
+ if (presence->statusDisplayType) {
|
||||
+ WriteKey(writer, "status_display_type");
|
||||
+ writer.Int(presence->statusDisplayType);
|
||||
+ }
|
||||
|
||||
if (presence->startTimestamp || presence->endTimestamp) {
|
||||
WriteObject timestamps(writer, "timestamps");
|
||||
@@ -157,6 +176,43 @@ size_t JsonWriteRichPresenceObj(char* dest,
|
||||
WriteOptionalString(writer, "join", presence->joinSecret);
|
||||
WriteOptionalString(writer, "spectate", presence->spectateSecret);
|
||||
}
|
||||
+
|
||||
+ if ((presence->emojiName && presence->emojiName[0]) ||
|
||||
+ (presence->emojiId && presence->emojiId[0])) {
|
||||
+ WriteObject emoji(writer, "emoji");
|
||||
+ WriteOptionalString(writer, "name", presence->emojiName);
|
||||
+ WriteOptionalString(writer, "id", presence->emojiId);
|
||||
+ if (presence->emojiAnimated) {
|
||||
+ WriteKey(writer, "animated");
|
||||
+ writer.Bool(presence->emojiAnimated);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (presence->flags) {
|
||||
+ WriteKey(writer, "flags");
|
||||
+ writer.Int(presence->flags);
|
||||
+ }
|
||||
+
|
||||
+ if (presence->button1Label && presence->button1Label[0] &&
|
||||
+ presence->button1Url && presence->button1Url[0]) {
|
||||
+ WriteKey(writer, "buttons");
|
||||
+ writer.StartArray();
|
||||
+
|
||||
+ writer.StartObject();
|
||||
+ WriteOptionalString(writer, "label", presence->button1Label);
|
||||
+ WriteOptionalString(writer, "url", presence->button1Url);
|
||||
+ writer.EndObject();
|
||||
+
|
||||
+ if (presence->button2Label && presence->button2Label[0] &&
|
||||
+ presence->button2Url && presence->button2Url[0]) {
|
||||
+ writer.StartObject();
|
||||
+ WriteOptionalString(writer, "label", presence->button2Label);
|
||||
+ WriteOptionalString(writer, "url", presence->button2Url);
|
||||
+ writer.EndObject();
|
||||
+ }
|
||||
+
|
||||
+ writer.EndArray();
|
||||
+ }
|
||||
|
||||
writer.Key("instance");
|
||||
writer.Bool(presence->instance != 0);
|
||||
|
||||
diff --git a/.clang-format b/.clang-format
|
||||
index 0000000..0000000 100644
|
||||
--- a/.clang-format
|
||||
+++ b/.clang-format
|
||||
@@ -45,7 +45,6 @@ IncludeCategories:
|
||||
- Regex: '.*'
|
||||
Priority: 3
|
||||
IncludeIsMainRegex: '(_test|_win|_linux|_mac|_ios|_osx|_null)?$'
|
||||
-IndentCaseLabels: false
|
||||
IndentWidth: 4
|
||||
IndentWrappedFunctionNames: false
|
||||
|
|
@ -49,6 +49,7 @@ static void SetDiscordWatchingPresence(
|
|||
DiscordRichPresence discordPresence{};
|
||||
memset(&discordPresence, 0, sizeof(discordPresence));
|
||||
|
||||
discordPresence.statusDisplayType = DISCORD_STATUS_DISPLAY_TYPE_DETAILS;
|
||||
discordPresence.type = DISCORD_ACTIVITY_TYPE_WATCHING;
|
||||
|
||||
// Common fields (required)
|
||||
|
|
@ -108,7 +109,7 @@ static void SetDiscordMetaDetailPresence(const std::vector<std::string>& args) {
|
|||
|
||||
DiscordRichPresence discordPresence{};
|
||||
memset(&discordPresence, 0, sizeof(discordPresence));
|
||||
|
||||
discordPresence.statusDisplayType = DISCORD_STATUS_DISPLAY_TYPE_DETAILS;
|
||||
discordPresence.type = DISCORD_ACTIVITY_TYPE_WATCHING;
|
||||
discordPresence.details = args[2].c_str(); // Title (show/movie)
|
||||
discordPresence.largeImageKey = args[3].c_str();
|
||||
|
|
@ -127,6 +128,7 @@ static void SetDiscordDiscoverPresence(const char *const details, const char *co
|
|||
|
||||
DiscordRichPresence discordPresence{};
|
||||
memset(&discordPresence, 0, sizeof(discordPresence));
|
||||
discordPresence.statusDisplayType = DISCORD_STATUS_DISPLAY_TYPE_STATE;
|
||||
discordPresence.type = DISCORD_ACTIVITY_TYPE_WATCHING;
|
||||
discordPresence.state = state;
|
||||
discordPresence.details = details;
|
||||
|
|
|
|||
10
vcpkg.json
Normal file
10
vcpkg.json
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"name": "stremio-community-v5",
|
||||
"version-string": "5.0.21",
|
||||
"dependencies": [
|
||||
"curl",
|
||||
"nlohmann-json",
|
||||
"openssl",
|
||||
"webview2"
|
||||
]
|
||||
}
|
||||
Loading…
Reference in a new issue