diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 0000000..dea5239
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,59 @@
+name: Build
+
+on:
+ push:
+ branches: [master]
+ pull_request:
+ workflow_dispatch:
+
+jobs:
+ publish:
+ name: ${{ matrix.rid }}
+ runs-on: ${{ matrix.os }}
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ # NativeAOT cannot cross-compile between operating systems, so each OS builds its own RIDs
+ - os: windows-latest
+ rid: win-x64
+ smoke: false
+ - os: windows-latest
+ rid: win-arm64
+ smoke: false
+ - os: macos-latest
+ rid: osx-arm64
+ smoke: true
+ - os: macos-latest
+ rid: osx-x64
+ smoke: false # Apple Silicon runner can't execute x64 AOT output without Rosetta
+ - os: ubuntu-latest
+ rid: linux-x64
+ smoke: true
+ - os: ubuntu-24.04-arm
+ rid: linux-arm64
+ smoke: true
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: 10.0.x
+
+ - name: Publish (NativeAOT)
+ run: dotnet publish WaveBox.Server -c Release -r ${{ matrix.rid }}
+
+ - name: Smoke test
+ if: matrix.smoke
+ shell: bash
+ run: Scripts/smoke-test.sh WaveBox.Server/bin/Release/net10.0/${{ matrix.rid }}/publish/WaveBox.Server
+
+ - name: Upload artifact
+ uses: actions/upload-artifact@v4
+ with:
+ name: WaveBox-${{ matrix.rid }}
+ path: |
+ WaveBox.Server/bin/Release/net10.0/${{ matrix.rid }}/publish/
+ !WaveBox.Server/bin/Release/net10.0/${{ matrix.rid }}/publish/*.dSYM
+ !WaveBox.Server/bin/Release/net10.0/${{ matrix.rid }}/publish/*.pdb
diff --git a/Directory.Build.props b/Directory.Build.props
new file mode 100644
index 0000000..5f46ae2
--- /dev/null
+++ b/Directory.Build.props
@@ -0,0 +1,10 @@
+
+
+ net10.0
+ latest
+ disable
+ disable
+ latest-minimum
+ en
+
+
diff --git a/Scripts/ImageMagick/gnu_cpp_64bit_fpic_libs.tar.gz b/Scripts/ImageMagick/gnu_cpp_64bit_fpic_libs.tar.gz
deleted file mode 100644
index 791e71e..0000000
Binary files a/Scripts/ImageMagick/gnu_cpp_64bit_fpic_libs.tar.gz and /dev/null differ
diff --git a/Scripts/ImageMagick/imagemagick_build_script_linux_x64 b/Scripts/ImageMagick/imagemagick_build_script_linux_x64
deleted file mode 100755
index 5a33ee1..0000000
--- a/Scripts/ImageMagick/imagemagick_build_script_linux_x64
+++ /dev/null
@@ -1,87 +0,0 @@
-#!/bin/bash
-
-# Defines
-BUILD_DIR=~/ImageMagickBuild
-VERSION=6.8.5-5
-MAGICK_DIR=$BUILD_DIR/ImageMagick-$VERSION
-
-# Functions
-
-download()
-{
- wget http://www.imagemagick.org/download/ImageMagick.tar.gz
- wget http://www.imagemagick.org/download/delegates/jpegsrc.v9.tar.gz
- wget http://www.imagemagick.org/download/delegates/libpng-1.6.2.tar.gz
- wget http://www.imagemagick.org/download/delegates/tiff-4.0.3.tar.gz
- wget http://zlib.net/zlib-1.2.8.tar.gz
-}
-
-extract()
-{
- tar xzvf ImageMagick.tar.gz
- tar xzvf jpegsrc.v9.tar.gz
- tar xzvf libpng-1.6.2.tar.gz
- tar xzvf tiff-4.0.3.tar.gz
- tar xzvf zlib-1.2.8.tar.gz
-}
-
-move()
-{
- mv jpeg-9 $MAGICK_DIR/jpeg
- mv libpng-1.6.2 $MAGICK_DIR/png
- mv tiff-4.0.3 $MAGICK_DIR/tiff
- mv zlib-1.2.8 $MAGICK_DIR/zlib
-}
-
-compile()
-{
- cd $MAGICK_DIR/zlib && env CFLAGS="-m64 -fPIC" ./configure --static && make clean && make
- cd $MAGICK_DIR/jpeg && env CFLAGS="-m64 -fPIC" ./configure --disable-shared && make clean && make
- cd $MAGICK_DIR/png && env CFLAGS="-m64 -fPIC" CPPFLAGS="-I../zlib -m64 -fPIC" CXXFLAGS="-fPIC" LDFLAGS="-L../zlib -m64 -fPIC" ./configure --disable-shared && make clean && make
- cd $MAGICK_DIR/tiff && env CFLAGS="-m64 -fPIC" CPPFLAGS="-m64 -fPIC" CXXFLAGS="-fPIC" ./configure --disable-shared --disable-lzma && make clean && make
- cd $MAGICK_DIR && ./configure --disable-installed --disable-shared --enable-delegate-build --prefix=/ImageMagick-$VERSION --disable-dependency-tracking --with-x=no --without-perl --with-freetype=no --with-jp2=no --with-tiff=yes --with-magick-plus-plus=no --with-bzlib=no --without-lzma --without-fontconfig --without-lcms --without-lcms2 --without-x11 --without-xml --without-pango --disable-opencl CFLAGS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 -m64 -fPIC" CPPFLAGS="-m64 -fPIC" CXXFLAGS="-fPIC" LDFLAGS="-m64 -fPIC" && make clean && make
-
-}
-
-create_shared()
-{
- mkdir $BUILD_DIR/sharedbuild
- cd $BUILD_DIR/sharedbuild
- cp $MAGICK_DIR/magick/.libs/libMagickCore-6.Q16.a $MAGICK_DIR/wand/.libs/libMagickWand-6.Q16.a $MAGICK_DIR/jpeg/.libs/libjpeg.a $MAGICK_DIR/png/.libs/libpng16.a $MAGICK_DIR/tiff/libtiff/.libs/libtiff.a $MAGICK_DIR/tiff/libtiff/.libs/libtiffxx.a $MAGICK_DIR/zlib/libz.a .
-
- # Download the 64bit gnu c++ libs compiled with -fPIC
- wget https://dl.dropboxusercontent.com/u/40866/gnu_cpp_64bit_fpic_libs.tar.gz
- tar xzvf gnu_cpp_64bit_fpic_libs.tar.gz
-
- ar -x libMagickCore-6.Q16.a
- ar -x libMagickWand-6.Q16.a
- ar -x libjpeg.a
- ar -x libpng16.a
- ar -x libtiff.a
- ar -x libtiffxx.a
- ar -x libz.a
- ar -x libstdc++.a
- ar -x libgcc.a
- ar -x libgomp.a
- g++ -m64 -shared *.o -o libMagickWand-6.Q16-Static.x64.so
- mv libMagickWand-6.Q16-Static.x64.so $BUILD_DIR/
-}
-
-# Create the build directory
-mkdir $BUILD_DIR
-cd $BUILD_DIR
-
-# Download ImageMagick and depedencies
-download
-
-# Untar everything
-extract
-
-# Move the libs into the ImageMagick directory
-move
-
-# Compile everything
-compile
-
-# Create the shared library from the static libs
-create_shared
diff --git a/Scripts/ImageMagick/imagemagick_build_script_linux_x86 b/Scripts/ImageMagick/imagemagick_build_script_linux_x86
deleted file mode 100755
index e65cc31..0000000
--- a/Scripts/ImageMagick/imagemagick_build_script_linux_x86
+++ /dev/null
@@ -1,81 +0,0 @@
-#!/bin/bash
-
-# Defines
-BUILD_DIR=~/ImageMagickBuild
-VERSION=6.8.5-5
-MAGICK_DIR=$BUILD_DIR/ImageMagick-$VERSION
-
-# Functions
-
-download()
-{
- wget http://www.imagemagick.org/download/ImageMagick.tar.gz
- wget http://www.imagemagick.org/download/delegates/jpegsrc.v9.tar.gz
- wget http://www.imagemagick.org/download/delegates/libpng-1.6.2.tar.gz
- wget http://www.imagemagick.org/download/delegates/tiff-4.0.3.tar.gz
- wget http://zlib.net/zlib-1.2.8.tar.gz
-}
-
-extract()
-{
- tar xzvf ImageMagick.tar.gz
- tar xzvf jpegsrc.v9.tar.gz
- tar xzvf libpng-1.6.2.tar.gz
- tar xzvf tiff-4.0.3.tar.gz
- tar xzvf zlib-1.2.8.tar.gz
-}
-
-move()
-{
- mv jpeg-9 $MAGICK_DIR/jpeg
- mv libpng-1.6.2 $MAGICK_DIR/png
- mv tiff-4.0.3 $MAGICK_DIR/tiff
- mv zlib-1.2.8 $MAGICK_DIR/zlib
-}
-
-compile()
-{
- cd $MAGICK_DIR/zlib && env CFLAGS="-m32" ./configure --static && make clean && make
- cd $MAGICK_DIR/jpeg && env CFLAGS="-m32" ./configure --disable-shared && make clean && make
- cd $MAGICK_DIR/png && env CFLAGS="-m32" CPPFLAGS="-I../zlib -m32" LDFLAGS="-L../zlib -m32" ./configure --disable-shared && make clean && make
- cd $MAGICK_DIR/tiff && env CFLAGS="-m32" CPPFLAGS="-m32" ./configure --disable-shared --disable-lzma && make clean && make
- cd $MAGICK_DIR && ./configure --disable-installed --disable-shared --enable-delegate-build --prefix=/ImageMagick-$VERSION --disable-dependency-tracking --with-x=no --without-perl --with-freetype=no --with-jp2=no --with-tiff=yes --with-magick-plus-plus=no --with-bzlib=no --without-lzma --without-fontconfig --without-lcms --without-lcms2 --without-x11 --without-xml --without-pango --disable-opencl CFLAGS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 -m32" CPPFLAGS="-m32" LDFLAGS="-m32" && make clean && make
-}
-
-create_shared()
-{
- mkdir $BUILD_DIR/sharedbuild
- cd $BUILD_DIR/sharedbuild
- cp $MAGICK_DIR/magick/.libs/libMagickCore-6.Q16.a $MAGICK_DIR/wand/.libs/libMagickWand-6.Q16.a $MAGICK_DIR/jpeg/.libs/libjpeg.a $MAGICK_DIR/png/.libs/libpng16.a $MAGICK_DIR/tiff/libtiff/.libs/libtiff.a $MAGICK_DIR/tiff/libtiff/.libs/libtiffxx.a $MAGICK_DIR/zlib/libz.a .
- ar -x libMagickCore-6.Q16.a
- ar -x libMagickWand-6.Q16.a
- ar -x libjpeg.a
- ar -x libpng16.a
- ar -x libtiff.a
- ar -x libtiffxx.a
- ar -x libz.a
- g++ -m32 -shared -static-libgcc -static-libstdc++ *.o -o libMagickWand-6.Q16-Static.x86.so
- mv libMagickWand-6.Q16-Static.x86.so $BUILD_DIR/
-}
-
-# Install the 32bit libraries
-sudo apt-get install gcc-multilib g++-multilib libc6:i386 libc6-dev:i386
-
-# Create the build directory
-mkdir $BUILD_DIR
-cd $BUILD_DIR
-
-# Download ImageMagick and depedencies
-download
-
-# Untar everything
-extract
-
-# Move the libs into the ImageMagick directory
-move
-
-# Compile everything
-compile
-
-# Create the shared library from the static libs
-create_shared
diff --git a/Scripts/ImageMagick/imagemagick_build_script_osx_universal b/Scripts/ImageMagick/imagemagick_build_script_osx_universal
deleted file mode 100755
index a5782b4..0000000
--- a/Scripts/ImageMagick/imagemagick_build_script_osx_universal
+++ /dev/null
@@ -1,90 +0,0 @@
-#!/bin/bash
-
-# Defines
-BUILD_DIR=~/ImageMagickBuild
-VERSION=6.8.5-5
-MAGICK_DIR=$BUILD_DIR/ImageMagick-$VERSION
-
-# Functions
-
-download()
-{
- wget http://www.imagemagick.org/download/ImageMagick.tar.gz
- wget http://www.imagemagick.org/download/delegates/jpegsrc.v9.tar.gz
- wget http://www.imagemagick.org/download/delegates/libpng-1.6.2.tar.gz
- wget http://www.imagemagick.org/download/delegates/tiff-4.0.3.tar.gz
- wget http://zlib.net/zlib-1.2.8.tar.gz
-}
-
-extract()
-{
- tar xzvf ImageMagick.tar.gz
- tar xzvf jpegsrc.v9.tar.gz
- tar xzvf libpng-1.6.2.tar.gz
- tar xzvf tiff-4.0.3.tar.gz
- tar xzvf zlib-1.2.8.tar.gz
-}
-
-move()
-{
- mv jpeg-9 $MAGICK_DIR/jpeg
- mv libpng-1.6.2 $MAGICK_DIR/png
- mv tiff-4.0.3 $MAGICK_DIR/tiff
- mv zlib-1.2.8 $MAGICK_DIR/zlib
-}
-
-compile()
-{
- cd $MAGICK_DIR/zlib && env CFLAGS="-m$1" ./configure --static && make clean && make
- cd $MAGICK_DIR/jpeg && env CFLAGS="-m$1" ./configure --disable-shared && make clean && make
- cd $MAGICK_DIR/png && env CFLAGS="-m$1" CPPFLAGS="-I../zlib -m$1" LDFLAGS="-L../zlib -m$1" ./configure --disable-shared && make clean && make
- cd $MAGICK_DIR/tiff && env CFLAGS="-m$1" CPPFLAGS="-m$1" ./configure --disable-shared --disable-lzma && make clean && make
- cd $MAGICK_DIR && ./configure --disable-installed --disable-shared --enable-delegate-build --prefix=/ImageMagick-$VERSION --disable-dependency-tracking --with-x=no --without-perl --with-freetype=no --with-jp2=no --with-tiff=yes --with-magick-plus-plus=no --with-bzlib=no --without-lzma --without-fontconfig --without-lcms --without-lcms2 --without-x11 --without-xml --without-pango --disable-opencl --disable-openmp CFLAGS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 -m$1" CPPFLAGS="-m$1" LDFLAGS="-m$1" && make clean && make
-}
-
-create_dylib()
-{
- mkdir $BUILD_DIR/sharedbuild
- rm -rf $BUILD_DIR/sharedbuild/*
- cd $BUILD_DIR/sharedbuild
- cp $MAGICK_DIR/magick/.libs/libMagickCore-6.Q16.a $MAGICK_DIR/wand/.libs/libMagickWand-6.Q16.a $MAGICK_DIR/jpeg/.libs/libjpeg.a $MAGICK_DIR/png/.libs/libpng16.a $MAGICK_DIR/tiff/libtiff/.libs/libtiff.a $MAGICK_DIR/tiff/libtiff/.libs/libtiffxx.a $MAGICK_DIR/zlib/libz.a .
- ar -x libMagickCore-6.Q16.a
- ar -x libMagickWand-6.Q16.a
- ar -x libjpeg.a
- ar -x libpng16.a
- ar -x libtiff.a
- ar -x libtiffxx.a
- ar -x libz.a
- gcc -m$1 -shared -lstdc++ *.o -o libMagickWand-6.Q16-Static.$1.dylib
- mv libMagickWand-6.Q16-Static.$1.dylib $BUILD_DIR/
-}
-
-# Create the build directory
-mkdir $BUILD_DIR
-cd $BUILD_DIR
-
-# Download ImageMagick and depedencies
-download
-
-# Untar everything
-extract
-
-# Move the libs into the ImageMagick directory
-move
-
-# Compile everything for i386
-compile "32"
-
-# Create the i386 shared library from the static libs
-create_dylib "32"
-
-# Compile everything for x86_64
-compile "64"
-
-# Create the x86_64 shared library from the static libs
-create_dylib "64"
-
-# Combine both into a single dylib
-cd $BUILD_DIR
-lipo -create libMagickWand-6.Q16-Static.32.dylib libMagickWand-6.Q16-Static.64.dylib -output libMagickWand-6.Q16-Static.universal.dylib
-
diff --git a/Scripts/mkbundle/linux_32_mkbundle_build_script b/Scripts/mkbundle/linux_32_mkbundle_build_script
deleted file mode 100755
index 32968d3..0000000
--- a/Scripts/mkbundle/linux_32_mkbundle_build_script
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/bin/sh
-
-# Cleanup
-echo "Cleaning up old files\n"
-rm -f WaveBoxBinary WaveBoxLauncher WaveBox_Linux_32bit*
-
-# Use 32bit building
-#export AS="as -arch i386"
-#export CC="cc -arch i386"
-
-# Create the binary
-echo "Building the binary\n"
-mkbundle --static --deps -o WaveBoxBinary WaveBox.exe Bass.Net.dll Cirrious.MvvmCross.Plugins.Sqlite.dll Cirrious.MvvmCross.dll Microsoft.AspNet.SignalR.Core.dll Microsoft.AspNet.SignalR.Owin.dll Microsoft.Owin.Diagnostics.dll Microsoft.Owin.Host.HttpListener.dll Microsoft.Owin.Hosting.dll Mono.Nat.dll Mono.Zeroconf.dll Newtonsoft.Json.dll Ninject.dll Owin.dll System.Data.SQLite.dll WaveBox.Core.dll log4net.dll taglib-sharp.dll
-
-# Create the launcher
-echo '#!/bin/bash
-cd "${0%/*}"
-BINARY=WaveBoxBinary
-if ps aux | grep -v grep | grep $BINARY > /dev/null
-then
- killall $BINARY
- echo "WaveBox Stopped"
-else
- MONO_ZEROCONF_PROVIDERS=. nohup ./$BINARY &
- echo "WaveBox Started"
-fi' > WaveBoxLauncher
-chmod a+x WaveBoxLauncher
-
-# Create an archive
-rm lib_native/*.dll
-rm lib_native/*.dylib
-rm lib_native/*.x64.so
-tar czvf WaveBox_Linux_32bit_`date +%s`.tgz WaveBoxBinary WaveBoxLauncher Mono.Zeroconf.Providers.AvahiDBus.dll lib_native html -C /usr/lib/ libMonoPosixHelper.so
-echo "DONE :)"
diff --git a/Scripts/mkbundle/linux_64_mkbundle_build_script b/Scripts/mkbundle/linux_64_mkbundle_build_script
deleted file mode 100755
index 02bb364..0000000
--- a/Scripts/mkbundle/linux_64_mkbundle_build_script
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/bin/sh
-
-# Cleanup
-echo "Cleaning up old files\n"
-rm -f WaveBoxBinary WaveBoxLauncher WaveBox_Linux_32bit*
-
-# Use 32bit building
-#export AS="as -arch i386"
-#export CC="cc -arch i386"
-
-# Create the binary
-echo "Building the binary\n"
-mkbundle --static --deps -o WaveBoxBinary WaveBox.exe Bass.Net.dll Cirrious.MvvmCross.Plugins.Sqlite.dll Cirrious.MvvmCross.dll Microsoft.AspNet.SignalR.Core.dll Microsoft.AspNet.SignalR.Owin.dll Microsoft.Owin.Diagnostics.dll Microsoft.Owin.Host.HttpListener.dll Microsoft.Owin.Hosting.dll Mono.Nat.dll Mono.Zeroconf.dll Newtonsoft.Json.dll Ninject.dll Owin.dll System.Data.SQLite.dll WaveBox.Core.Model.dll WaveBox.Core.dll log4net.dll taglib-sharp.dll
-
-# Create the launcher
-echo '#!/bin/bash
-cd "${0%/*}"
-BINARY=WaveBoxBinary
-if ps aux | grep -v grep | grep $BINARY > /dev/null
-then
- killall $BINARY
- echo "WaveBox Stopped"
-else
- MONO_ZEROCONF_PROVIDERS=. nohup ./$BINARY &
- echo "WaveBox Started"
-fi' > WaveBoxLauncher
-chmod a+x WaveBoxLauncher
-
-# Create an archive
-rm lib_native/*.dll
-rm lib_native/*.dylib
-rm lib_native/*.x64.so
-tar czvf WaveBox_Linux_32bit_`date +%s`.tgz WaveBoxBinary WaveBoxLauncher Mono.Zeroconf.Providers.AvahiDBus.dll lib_native html -C /usr/lib/ libMonoPosixHelper.so
-echo "DONE :)"
diff --git a/Scripts/mkbundle/linux_mkbundle_build_script b/Scripts/mkbundle/linux_mkbundle_build_script
deleted file mode 100755
index d56c6c2..0000000
--- a/Scripts/mkbundle/linux_mkbundle_build_script
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/bin/sh
-
-# Cleanup
-echo "Cleaning up old files\n"
-rm -f WaveBoxBinary WaveBoxLauncher WaveBox_Linux_32bit.tgz
-
-# Use 32bit building
-#export AS="as -arch i386"
-#export CC="cc -arch i386"
-
-# Create the binary
-echo "Building the binary\n"
-mkbundle --static --deps -o WaveBoxBinary WaveBox.exe Newtonsoft.Json.dll taglib-sharp.dll Bass.Net.dll Mono.Zeroconf.dll System.Data.SQLite.dll
-
-# Create the launcher
-echo '#!/bin/bash
-cd "${0%/*}"
-BINARY=WaveBoxBinary
-if ps aux | grep -v grep | grep $BINARY > /dev/null
-then
- killall $BINARY
- echo "WaveBox Stopped"
-else
- MONO_ZEROCONF_PROVIDERS=. nohup ./$BINARY &
- echo "WaveBox Started"
-fi' > WaveBoxLauncher
-chmod a+x WaveBoxLauncher
-
-# Create an archive
-tar czvf WaveBox_Linux_32bit.tgz WaveBoxBinary WaveBoxLauncher wavebox.conf ffmpeg libsqlite3.so.0 libbass.so Mono.Zeroconf.Providers.AvahiDBus.dll -C /usr/lib/ libMonoPosixHelper.so -C ../../ html
-echo "DONE :)"
diff --git a/Scripts/mkbundle/linux_nomkbundle_zip_script b/Scripts/mkbundle/linux_nomkbundle_zip_script
deleted file mode 100755
index 0010379..0000000
--- a/Scripts/mkbundle/linux_nomkbundle_zip_script
+++ /dev/null
@@ -1,43 +0,0 @@
-#!/bin/sh
-
-# Cleanup
-rm WaveBox_Linux_* WaveBoxLauncher
-
-# Create the launcher
-echo '#!/bin/bash
-cd "${0%/*}"
-BINARY=WaveBox.exe
-if ps aux | grep -v grep | grep $BINARY > /dev/null
-then
- output=`ps aux | grep -v grep | grep $BINARY`
- set -- $output
- pid=$2
- kill $pid
- sleep 5
- kill -9 $pid >/dev/null 2>&1
- echo "WaveBox Stopped"
-else
- MONO_ZEROCONF_PROVIDERS=. nohup mono --debug $BINARY &
- echo "WaveBox Started"
-fi' > WaveBoxLauncher
-chmod a+x WaveBoxLauncher
-
-# Create an archive for 32bit
-mv lib_native lib_native.bak
-mkdir lib_native
-cp lib_native.bak/*.x86.so lib_native
-tar czvf WaveBox_Linux_32bit_`date +%s`.tgz *.config WaveBoxLauncher WaveBox.exe Bass.Net.dll Cirrious.MvvmCross.Plugins.Sqlite.dll Cirrious.MvvmCross.dll Microsoft.AspNet.SignalR.Core.dll Microsoft.AspNet.SignalR.Owin.dll Microsoft.Owin.Diagnostics.dll Microsoft.Owin.Host.HttpListener.dll Microsoft.Owin.Hosting.dll Mono.Nat.dll Mono.Zeroconf.dll Newtonsoft.Json.dll Ninject.dll Owin.dll System.Data.SQLite.dll WaveBox.Core.dll log4net.dll taglib-sharp.dll Mono.Zeroconf.Providers.AvahiDBus.dll lib_native html
-rm -r lib_native
-mv lib_native.bak lib_native
-echo "32bit done"
-
-# Create an archive for 32bit
-mv lib_native lib_native.bak
-mkdir lib_native
-cp lib_native.bak/*.x64.so lib_native
-tar czvf WaveBox_Linux_64bit_`date +%s`.tgz *.config WaveBoxLauncher WaveBox.exe Bass.Net.dll Cirrious.MvvmCross.Plugins.Sqlite.dll Cirrious.MvvmCross.dll Microsoft.AspNet.SignalR.Core.dll Microsoft.AspNet.SignalR.Owin.dll Microsoft.Owin.Diagnostics.dll Microsoft.Owin.Host.HttpListener.dll Microsoft.Owin.Hosting.dll Mono.Nat.dll Mono.Zeroconf.dll Newtonsoft.Json.dll Ninject.dll Owin.dll System.Data.SQLite.dll WaveBox.Core.dll log4net.dll taglib-sharp.dll Mono.Zeroconf.Providers.AvahiDBus.dll lib_native html
-rm -r lib_native
-mv lib_native.bak lib_native
-echo "64bit done"
-
-echo "DONE :)"
diff --git a/Scripts/mkbundle/osx_mkbundle_build_script b/Scripts/mkbundle/osx_mkbundle_build_script
deleted file mode 100755
index 21e285c..0000000
--- a/Scripts/mkbundle/osx_mkbundle_build_script
+++ /dev/null
@@ -1,81 +0,0 @@
-#!/bin/sh
-
-#
-# Download terminal-notifier from here: https://github.com/alloy/terminal-notifier/downloads
-#
-
-#
-# First, edit /Library/Frameworks/Mono.framework/Versions/Current/lib/pkgconfig/mono-2.pc to match the following
-#
-#Libs: -L${libdir} -lmono-2.0 -pthread -lpthread -liconv
-#Cflags: -I${includedir} -D_THREAD_SAFE -framework CoreFoundation -arch i386 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk -mmacosx-version-min=10.5
-#
-# If on OS X 10.6, use this for the sysroot instead: /Developer/SDKs/MacOSX10.6.sdk
-#
-#
-
-echo "If the build fails, check the script comments and make sure you edited the mono-2.pc file as directed\n"
-
-# Cleanup
-echo "Cleaning up old files\n"
-rm -rf WaveBox_OSX_32bit* WaveBoxBinary WaveBoxLauncher WaveBox.app
-
-# Enable 32bit building, or it will default to 64bit and fail to link
-export AS="as -arch i386"
-export CC="cc -arch i386"
-
-# Make sure we're using the correct pkgconfig binary
-export PATH=/Library/Frameworks/Mono.framework/Commands/:$PATH
-
-# Create the binary
-echo "Building the binary\n"
-#env PKG_CONFIG_PATH=/Library/Frameworks/Mono.framework/Versions/Current/lib/pkgconfig mkbundle -o WaveBoxBinary WaveBox.exe
-env PKG_CONFIG_PATH=/Library/Frameworks/Mono.framework/Versions/Current/lib/pkgconfig mkbundle --static --deps -o WaveBoxBinary WaveBox.exe Bass.Net.dll Cirrious.MvvmCross.Plugins.Sqlite.dll Cirrious.MvvmCross.dll Microsoft.AspNet.SignalR.Core.dll Microsoft.AspNet.SignalR.Owin.dll Microsoft.Owin.Diagnostics.dll Microsoft.Owin.Host.HttpListener.dll Microsoft.Owin.Hosting.dll Mono.Nat.dll Mono.Zeroconf.dll Newtonsoft.Json.dll Ninject.dll Owin.dll System.Data.SQLite.dll WaveBox.Core.Model.dll WaveBox.Core.dll log4net.dll taglib-sharp.dll
-
-# Create the launcher
-echo '#!/bin/bash
-cd "${0%/*}"
-BINARY=WaveBoxBinary
-if ps aux | grep -v grep | grep $BINARY > /dev/null
-then
- killall $BINARY
- ./terminal-notifier.app/Contents/MacOS/terminal-notifier -message "WaveBox Stopped"
-else
- DYLD_FALLBACK_LIBRARY_PATH=. MONO_ZEROCONF_PROVIDERS=. nohup ./$BINARY &
- ./terminal-notifier.app/Contents/MacOS/terminal-notifier -message "WaveBox Started"
-fi' > WaveBoxLauncher
-chmod a+x WaveBoxLauncher
-
-# Create the app bundle directories
-echo "Creating the app bundle\n"
-mkdir -p WaveBox.app/Contents/MacOS WaveBox.app/Contents/Resources
-
-# Create the app bundle plist
-echo '
-
-
- CFBundleGetInfoString
- WaveBox
- CFBundleExecutable
- WaveBoxLauncher
- CFBundleIdentifier
- com.wavebox.wavebox
- CFBundleName
- WaveBox
- CFBundleIconFile
- Icon
- CFBundleShortVersionString
- 1.0
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundlePackageType
- APPL
-
-' > WaveBox.app/Contents/Info.plist
-
-# Copy the files into the bundle
-cp -r WaveBoxBinary WaveBoxLauncher terminal-notifier.app res WaveBox.exe html ffmpeg Mono.Zeroconf.Providers.Bonjour.dll *.config /Library/Frameworks/Mono.framework/Versions/Current/lib/libMonoPosixHelper.dylib WaveBox.app/Contents/MacOS/
-mkdir WaveBox.app/Contents/MacOS/lib_native
-cp lib_native/*.dylib WaveBox.app/Contents/MacOS/lib_native/
-rm WaveBoxLauncher
-zip -r WaveBox_OSX_32bit_`date +%s`.zip WaveBox.app
diff --git a/Scripts/mkbundle/windows_mkbundle_build_script b/Scripts/mkbundle/windows_mkbundle_build_script
deleted file mode 100755
index af3407d..0000000
--- a/Scripts/mkbundle/windows_mkbundle_build_script
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/sh
-echo "Build info found here: http://blog.shilbert.com/2012/06/using-mono-to-avoid-depending-on-net-framework/"
-echo "Make sure to install the required cygwin packages and the Mono framework"
-# Cleanup
-echo "Cleaning up old files\n"
-rm -rf WaveBox_Windows_32bit.zip WaveBoxService.exe WaveBoxBinary WaveBoxLauncher WaveBox.app
-# First set some environment variables so everything works
-export MONO=/cygdrive/c/progra~2/Mono-2.10.9
-export PATH=$PATH:$MONO/bin
-export PKG_CONFIG_PATH=$MONO/lib/pkgconfig
-export CC="i686-pc-mingw32-gcc -U _WIN32"
-# Create the binary
-echo "Building the binary\n"
-mkbundle --deps -o WaveBoxService.exe WaveBox.exe Bass.Net.dll Cirrious.MvvmCross.Plugins.Sqlite.dll Cirrious.MvvmCross.dll Microsoft.AspNet.SignalR.Core.dll Microsoft.AspNet.SignalR.Owin.dll Microsoft.Owin.Diagnostics.dll Microsoft.Owin.Host.HttpListener.dll Microsoft.Owin.Hosting.dll Mono.Nat.dll Mono.Zeroconf.dll Newtonsoft.Json.dll Ninject.dll Owin.dll System.Data.SQLite.dll WaveBox.Core.Model.dll WaveBox.Core.dll log4net.dll taglib-sharp.dll
-cp /cygdrive/c/progra~2/Mono-2.10.9/bin/mono-2.0.dll .
diff --git a/Scripts/mkbundle/windows_nomkbundle_build_script b/Scripts/mkbundle/windows_nomkbundle_build_script
deleted file mode 100755
index 78f444f..0000000
--- a/Scripts/mkbundle/windows_nomkbundle_build_script
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-
-rm -rf WaveBox_Windows_32bit*
-
-# Zip the files
-mv lib_native lib_native.bak
-mkdir lib_native
-cp lib_native.bak/*.dll lib_native/
-zip -r WaveBox_Windows_32bit_`date +%s`.zip lib_native res WaveBox.exe html ffmpeg.exe Bass.Net.dll Cirrious.MvvmCross.Plugins.Sqlite.dll Cirrious.MvvmCross.dll Microsoft.AspNet.SignalR.Core.dll Microsoft.AspNet.SignalR.Owin.dll Microsoft.Owin.Diagnostics.dll Microsoft.Owin.Host.HttpListener.dll Microsoft.Owin.Hosting.dll Mono.Nat.dll Mono.Zeroconf.dll Newtonsoft.Json.dll Ninject.dll Owin.dll System.Data.SQLite.dll WaveBox.Core.Model.dll WaveBox.Core.dll log4net.dll taglib-sharp.dll Mono.Zeroconf.Providers.Bonjour.dll *.config
-rm -r lib_native
-mv lib_native.bak lib_native
diff --git a/Scripts/smoke-test.sh b/Scripts/smoke-test.sh
new file mode 100755
index 0000000..60d15e1
--- /dev/null
+++ b/Scripts/smoke-test.sh
@@ -0,0 +1,130 @@
+#!/usr/bin/env bash
+# WaveBox end-to-end smoke test.
+#
+# Usage:
+# Scripts/smoke-test.sh
+# Scripts/smoke-test.sh --dotnet # run via `dotnet run` from source instead
+#
+# Starts the server against an isolated data directory, then verifies:
+# login, status, media scan of a generated MP3 fixture, songs listing, and a range request.
+set -uo pipefail
+
+REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
+WORK="$(mktemp -d)"
+PORT=6500
+FAILURES=0
+SERVER_PID=""
+
+cleanup() {
+ if [ -n "$SERVER_PID" ]; then
+ kill "$SERVER_PID" 2>/dev/null
+ wait "$SERVER_PID" 2>/dev/null
+ fi
+ rm -rf "$WORK"
+}
+trap cleanup EXIT
+
+check() {
+ local name="$1" ok="$2" detail="${3:-}"
+ if [ "$ok" = "0" ]; then
+ echo "PASS: $name"
+ else
+ echo "FAIL: $name $detail"
+ FAILURES=$((FAILURES + 1))
+ fi
+}
+
+# Generate media fixture
+mkdir -p "$WORK/media"
+python3 "$REPO_ROOT/tests/fixtures/make_fixture.py" "$WORK/media/test_song.mp3"
+
+# Launch server with isolated HOME so real user data is untouched
+export HOME="$WORK/home"
+mkdir -p "$HOME"
+
+if [ "${1:-}" = "--dotnet" ]; then
+ (cd "$REPO_ROOT/WaveBox.Server" && dotnet run -c Release) > "$WORK/server.log" 2>&1 &
+ SERVER_PID=$!
+else
+ BINARY="${1:?usage: smoke-test.sh |--dotnet}"
+ "$BINARY" > "$WORK/server.log" 2>&1 &
+ SERVER_PID=$!
+fi
+
+# Wait for the port to open (up to 60s to allow for a cold dotnet build)
+for i in $(seq 1 120); do
+ if curl -s -o /dev/null "http://localhost:$PORT/api/status"; then
+ break
+ fi
+ if ! kill -0 "$SERVER_PID" 2>/dev/null; then
+ echo "FAIL: server process exited early"; cat "$WORK/server.log"; exit 1
+ fi
+ sleep 0.5
+done
+
+# Point the config at the media fixture folder and restart to pick it up
+CONF="$HOME/Library/Application Support/WaveBox/wavebox.conf"
+[ -f "$CONF" ] || CONF="$HOME/.wavebox/wavebox.conf"
+if [ ! -f "$CONF" ]; then
+ echo "FAIL: wavebox.conf was not created"; exit 1
+fi
+python3 - "$CONF" "$WORK/media" <<'EOF'
+import sys
+conf, media = sys.argv[1], sys.argv[2]
+s = open(conf).read()
+open(conf, "w").write(s.replace('"/srv/your/media/here"', '"%s"' % media))
+EOF
+kill "$SERVER_PID" 2>/dev/null; wait "$SERVER_PID" 2>/dev/null
+
+if [ "${1:-}" = "--dotnet" ]; then
+ (cd "$REPO_ROOT/WaveBox.Server" && dotnet run -c Release --no-build) > "$WORK/server2.log" 2>&1 &
+ SERVER_PID=$!
+else
+ "$1" > "$WORK/server2.log" 2>&1 &
+ SERVER_PID=$!
+fi
+for i in $(seq 1 60); do
+ curl -s -o /dev/null "http://localhost:$PORT/api/status" && break
+ sleep 0.5
+done
+
+# 1. Login
+SESSION=$(curl -s "http://localhost:$PORT/api/login?u=test&p=test" | python3 -c "import json,sys; print(json.load(sys.stdin).get('sessionId') or '')")
+[ -n "$SESSION" ]; check "login returns session" $?
+
+# 2. Status
+curl -s "http://localhost:$PORT/api/status?s=$SESSION" | python3 -c "import json,sys; d=json.load(sys.stdin); assert d['error'] is None and 'version' in d['status']"
+check "status endpoint" $?
+
+# 3. Albums endpoint responds
+curl -s "http://localhost:$PORT/api/albums?s=$SESSION" | python3 -c "import json,sys; d=json.load(sys.stdin); assert d['error'] is None"
+check "albums endpoint" $?
+
+# 4. Wait for the scanner to index the fixture (up to 30s)
+SONG_ID=""
+for i in $(seq 1 30); do
+ SONG_ID=$(curl -s "http://localhost:$PORT/api/songs?s=$SESSION" | python3 -c "import json,sys; d=json.load(sys.stdin); print(d['songs'][0]['itemId'] if d['songs'] else '')")
+ [ -n "$SONG_ID" ] && break
+ sleep 1
+done
+[ -n "$SONG_ID" ]; check "media scan indexed fixture song" $?
+
+# 5. Song metadata parsed by TagLib
+curl -s "http://localhost:$PORT/api/songs?s=$SESSION" | python3 -c "import json,sys; d=json.load(sys.stdin); s=d['songs'][0]; assert s['songName']=='Test Song' and s['artistName']=='Test Artist', s"
+check "tag metadata parsed" $?
+
+# 6. Stream with range request returns 206
+if [ -n "$SONG_ID" ]; then
+ STATUS=$(curl -s -o /dev/null -w "%{http_code}" -H "Range: bytes=100-199" "http://localhost:$PORT/api/stream/$SONG_ID?s=$SESSION")
+ [ "$STATUS" = "206" ]; check "range request returns 206" $? "(got $STATUS)"
+else
+ check "range request returns 206" 1 "(no song id)"
+fi
+
+echo ""
+if [ "$FAILURES" -gt 0 ]; then
+ echo "$FAILURES smoke test(s) FAILED"
+ echo "--- server log tail ---"; tail -40 "$WORK/server2.log"
+ exit 1
+fi
+echo "All smoke tests passed"
diff --git a/WaveBox.Core/Properties/AssemblyInfo.cs b/WaveBox.Core/Properties/AssemblyInfo.cs
deleted file mode 100644
index e34ea08..0000000
--- a/WaveBox.Core/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("WaveBox.Core.Model")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("WaveBox.Core.Model")]
-[assembly: AssemblyCopyright("Copyright © 2013")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// Setting ComVisible to false makes the types in this assembly not visible
-// to COM components. If you need to access a type in this assembly from
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("95859d60-f38c-4b34-b343-33e04016d3a9")]
-
-// Version information for an assembly consists of the following four values:
-//
-// Major Version
-// Minor Version
-// Build Number
-// Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/WaveBox.Core/WaveBox.Core.csproj b/WaveBox.Core/WaveBox.Core.csproj
index 06f13f5..eba011c 100644
--- a/WaveBox.Core/WaveBox.Core.csproj
+++ b/WaveBox.Core/WaveBox.Core.csproj
@@ -1,191 +1,13 @@
-
-
-
-
- Debug
- AnyCPU
- {C6CEE72B-DBE2-4024-8F5C-D5C23E88194A}
- Library
- Properties
- WaveBox.Core
- WaveBox.Core
- v4.5
- 512
- 10.0.0
- 2.0
-
-
- true
- full
- false
- bin\Debug\
- DEBUG;TRACE
- prompt
- 4
-
-
- pdbonly
- true
- bin\Release\
- TRACE
- prompt
- 4
-
-
-
-
-
-
-
-
-
-
-
-
- lib\taglib-sharp.dll
-
-
- lib\Newtonsoft.Json.dll
-
-
- lib\log4net.dll
-
-
- lib\Ninject.dll
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PreserveNewest
-
-
-
+
+
+
+ WaveBox.Core
+ true
+
+
+
+
+
+
+
+
diff --git a/WaveBox.Core/WaveBox.Core.dll.config b/WaveBox.Core/WaveBox.Core.dll.config
deleted file mode 100644
index 0bbb636..0000000
--- a/WaveBox.Core/WaveBox.Core.dll.config
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/WaveBox.Core/WaveBox.Core.sln b/WaveBox.Core/WaveBox.Core.sln
deleted file mode 100644
index 1c43de7..0000000
--- a/WaveBox.Core/WaveBox.Core.sln
+++ /dev/null
@@ -1,20 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 11.00
-# Visual Studio 2010
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WaveBox.Core", "WaveBox.Core.csproj", "{C6CEE72B-DBE2-4024-8F5C-D5C23E88194A}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Release|Any CPU = Release|Any CPU
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {C6CEE72B-DBE2-4024-8F5C-D5C23E88194A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {C6CEE72B-DBE2-4024-8F5C-D5C23E88194A}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {C6CEE72B-DBE2-4024-8F5C-D5C23E88194A}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {C6CEE72B-DBE2-4024-8F5C-D5C23E88194A}.Release|Any CPU.Build.0 = Release|Any CPU
- EndGlobalSection
- GlobalSection(MonoDevelopProperties) = preSolution
- StartupItem = WaveBox.Core.csproj
- EndGlobalSection
-EndGlobal
diff --git a/WaveBox.Core/lib/Cirrious.MvvmCross.Plugins.Sqlite.dll b/WaveBox.Core/lib/Cirrious.MvvmCross.Plugins.Sqlite.dll
deleted file mode 100644
index ec6b571..0000000
Binary files a/WaveBox.Core/lib/Cirrious.MvvmCross.Plugins.Sqlite.dll and /dev/null differ
diff --git a/WaveBox.Core/lib/Cirrious.MvvmCross.dll b/WaveBox.Core/lib/Cirrious.MvvmCross.dll
deleted file mode 100644
index c915458..0000000
Binary files a/WaveBox.Core/lib/Cirrious.MvvmCross.dll and /dev/null differ
diff --git a/WaveBox.Core/lib/Newtonsoft.Json.dll b/WaveBox.Core/lib/Newtonsoft.Json.dll
deleted file mode 100644
index 81639f9..0000000
Binary files a/WaveBox.Core/lib/Newtonsoft.Json.dll and /dev/null differ
diff --git a/WaveBox.Core/lib/Ninject.dll b/WaveBox.Core/lib/Ninject.dll
deleted file mode 100755
index 7b50811..0000000
Binary files a/WaveBox.Core/lib/Ninject.dll and /dev/null differ
diff --git a/WaveBox.Core/lib/System.Windows.dll b/WaveBox.Core/lib/System.Windows.dll
deleted file mode 100644
index 2f13eea..0000000
Binary files a/WaveBox.Core/lib/System.Windows.dll and /dev/null differ
diff --git a/WaveBox.Core/lib/log4net.dll b/WaveBox.Core/lib/log4net.dll
deleted file mode 100755
index a366176..0000000
Binary files a/WaveBox.Core/lib/log4net.dll and /dev/null differ
diff --git a/WaveBox.Core/lib/taglib-sharp.dll b/WaveBox.Core/lib/taglib-sharp.dll
deleted file mode 100755
index 4d61148..0000000
Binary files a/WaveBox.Core/lib/taglib-sharp.dll and /dev/null differ
diff --git a/WaveBox.Core/src/ApiResponse/AlbumArtistsResponse.cs b/WaveBox.Core/src/ApiResponse/AlbumArtistsResponse.cs
index 9730325..da0f362 100644
--- a/WaveBox.Core/src/ApiResponse/AlbumArtistsResponse.cs
+++ b/WaveBox.Core/src/ApiResponse/AlbumArtistsResponse.cs
@@ -1,29 +1,29 @@
using System;
-using Newtonsoft.Json;
+using System.Text.Json.Serialization;
using System.Collections.Generic;
using WaveBox.Core.Model;
namespace WaveBox.Core.ApiResponse {
public class AlbumArtistsResponse : IApiResponse {
- [JsonProperty("error")]
+ [JsonPropertyName("error")]
public string Error { get; set; }
- [JsonProperty("albumArtists")]
+ [JsonPropertyName("albumArtists")]
public IList AlbumArtists { get; set; }
- [JsonProperty("albums")]
+ [JsonPropertyName("albums")]
public IList Albums { get; set; }
- [JsonProperty("songs")]
+ [JsonPropertyName("songs")]
public IList Songs { get; set; }
- [JsonProperty("counts")]
+ [JsonPropertyName("counts")]
public Dictionary Counts { get; set; }
- [JsonProperty("lastfmInfo")]
+ [JsonPropertyName("lastfmInfo")]
public string LastfmInfo { get; set; }
- [JsonProperty("sectionPositions")]
+ [JsonPropertyName("sectionPositions")]
public PairList SectionPositions { get; set; }
public AlbumArtistsResponse(string error, IList albumArtists, IList albums, IList songs, Dictionary counts, string lastfmInfo, PairList sectionPositions) {
diff --git a/WaveBox.Core/src/ApiResponse/AlbumsResponse.cs b/WaveBox.Core/src/ApiResponse/AlbumsResponse.cs
index f10af0e..144ecd0 100644
--- a/WaveBox.Core/src/ApiResponse/AlbumsResponse.cs
+++ b/WaveBox.Core/src/ApiResponse/AlbumsResponse.cs
@@ -1,20 +1,20 @@
using System;
-using Newtonsoft.Json;
+using System.Text.Json.Serialization;
using System.Collections.Generic;
using WaveBox.Core.Model;
namespace WaveBox.Core.ApiResponse {
public class AlbumsResponse : IApiResponse {
- [JsonProperty("error")]
+ [JsonPropertyName("error")]
public string Error { get; set; }
- [JsonProperty("albums")]
+ [JsonPropertyName("albums")]
public IList Albums { get; set; }
- [JsonProperty("songs")]
+ [JsonPropertyName("songs")]
public IList Songs { get; set; }
- [JsonProperty("sectionPositions")]
+ [JsonPropertyName("sectionPositions")]
public PairList SectionPositions { get; set; }
public AlbumsResponse(string error, IList albums, IList songs, PairList sectionPositions) {
diff --git a/WaveBox.Core/src/ApiResponse/ArtistsResponse.cs b/WaveBox.Core/src/ApiResponse/ArtistsResponse.cs
index 35b5919..19134aa 100644
--- a/WaveBox.Core/src/ApiResponse/ArtistsResponse.cs
+++ b/WaveBox.Core/src/ApiResponse/ArtistsResponse.cs
@@ -1,29 +1,29 @@
using System;
-using Newtonsoft.Json;
+using System.Text.Json.Serialization;
using System.Collections.Generic;
using WaveBox.Core.Model;
namespace WaveBox.Core.ApiResponse {
public class ArtistsResponse : IApiResponse {
- [JsonProperty("error")]
+ [JsonPropertyName("error")]
public string Error { get; set; }
- [JsonProperty("artists")]
+ [JsonPropertyName("artists")]
public IList Artists { get; set; }
- [JsonProperty("albums")]
+ [JsonPropertyName("albums")]
public IList Albums { get; set; }
- [JsonProperty("songs")]
+ [JsonPropertyName("songs")]
public IList Songs { get; set; }
- [JsonProperty("counts")]
+ [JsonPropertyName("counts")]
public Dictionary Counts { get; set; }
- [JsonProperty("lastfmInfo")]
+ [JsonPropertyName("lastfmInfo")]
public string LastfmInfo { get; set; }
- [JsonProperty("sectionPositions")]
+ [JsonPropertyName("sectionPositions")]
public PairList SectionPositions { get; set; }
public ArtistsResponse(string error, IList artists, IList albums, IList songs, Dictionary counts, string lastfmInfo, PairList sectionPositions) {
diff --git a/WaveBox.Core/src/ApiResponse/DatabaseResponse.cs b/WaveBox.Core/src/ApiResponse/DatabaseResponse.cs
index 8199f09..2e2f2be 100644
--- a/WaveBox.Core/src/ApiResponse/DatabaseResponse.cs
+++ b/WaveBox.Core/src/ApiResponse/DatabaseResponse.cs
@@ -1,14 +1,14 @@
using System;
-using Newtonsoft.Json;
+using System.Text.Json.Serialization;
using System.Collections.Generic;
using WaveBox.Core.Model;
namespace WaveBox.Core.ApiResponse {
public class DatabaseResponse : IApiResponse {
- [JsonProperty("error")]
+ [JsonPropertyName("error")]
public string Error { get; set; }
- [JsonProperty("queries")]
+ [JsonPropertyName("queries")]
public IList Queries { get; set; }
public DatabaseResponse(string error, IList queries) {
diff --git a/WaveBox.Core/src/ApiResponse/ErrorResponse.cs b/WaveBox.Core/src/ApiResponse/ErrorResponse.cs
index 6e3dc91..23b3631 100644
--- a/WaveBox.Core/src/ApiResponse/ErrorResponse.cs
+++ b/WaveBox.Core/src/ApiResponse/ErrorResponse.cs
@@ -1,9 +1,9 @@
using System;
-using Newtonsoft.Json;
+using System.Text.Json.Serialization;
namespace WaveBox.Core.ApiResponse {
public class ErrorResponse : IApiResponse {
- [JsonProperty("error")]
+ [JsonPropertyName("error")]
public string Error { get; set; }
public ErrorResponse(string error) {
diff --git a/WaveBox.Core/src/ApiResponse/ExternalArtResponse.cs b/WaveBox.Core/src/ApiResponse/ExternalArtResponse.cs
index 9a97d69..e5995ec 100644
--- a/WaveBox.Core/src/ApiResponse/ExternalArtResponse.cs
+++ b/WaveBox.Core/src/ApiResponse/ExternalArtResponse.cs
@@ -1,12 +1,12 @@
using System;
-using Newtonsoft.Json;
+using System.Text.Json.Serialization;
namespace WaveBox.Core.ApiResponse {
public class ExternalArtResponse : IApiResponse {
- [JsonProperty("error")]
+ [JsonPropertyName("error")]
public string Error { get; set; }
- [JsonProperty("url")]
+ [JsonPropertyName("url")]
public string Url { get; set; }
public ExternalArtResponse(string error, string url) {
diff --git a/WaveBox.Core/src/ApiResponse/FavoritesResponse.cs b/WaveBox.Core/src/ApiResponse/FavoritesResponse.cs
index 5c3c3c4..735891a 100644
--- a/WaveBox.Core/src/ApiResponse/FavoritesResponse.cs
+++ b/WaveBox.Core/src/ApiResponse/FavoritesResponse.cs
@@ -1,17 +1,17 @@
using System;
-using Newtonsoft.Json;
+using System.Text.Json.Serialization;
using System.Collections.Generic;
using WaveBox.Core.Model;
namespace WaveBox.Core.ApiResponse {
public class FavoritesResponse : IApiResponse {
- [JsonProperty("error")]
+ [JsonPropertyName("error")]
public string Error { get; set; }
- [JsonProperty("items")]
+ [JsonPropertyName("items")]
public IList Items { get; set; }
- [JsonProperty("favorites")]
+ [JsonPropertyName("favorites")]
public IList Favorites { get; set; }
public FavoritesResponse(string error, IList items, IList favorites) {
diff --git a/WaveBox.Core/src/ApiResponse/FoldersResponse.cs b/WaveBox.Core/src/ApiResponse/FoldersResponse.cs
index a63ef42..47363f0 100644
--- a/WaveBox.Core/src/ApiResponse/FoldersResponse.cs
+++ b/WaveBox.Core/src/ApiResponse/FoldersResponse.cs
@@ -1,26 +1,26 @@
using System;
-using Newtonsoft.Json;
+using System.Text.Json.Serialization;
using WaveBox.Core.Model;
using System.Collections.Generic;
namespace WaveBox.Core.ApiResponse {
public class FoldersResponse : IApiResponse {
- [JsonProperty("error")]
+ [JsonPropertyName("error")]
public string Error { get; set; }
- [JsonProperty("folders")]
+ [JsonPropertyName("folders")]
public IList Folders { get; set; }
- [JsonProperty("containingFolder")]
+ [JsonPropertyName("containingFolder")]
public Folder ContainingFolder { get; set; }
- [JsonProperty("songs")]
+ [JsonPropertyName("songs")]
public IList Songs { get; set; }
- [JsonProperty("videos")]
+ [JsonPropertyName("videos")]
public IList