Merge pull request #1 from AleAtDev/refactor/new-icons
Refactor/new icons
24
.env.example
@ -1,17 +1,15 @@
|
||||
# The format:
|
||||
# SPOTIFY_SECRETS=clintId1:clientSecret1,clientId2:clientSecret2
|
||||
SPOTIFY_SECRETS=$SPOTIFY_SECRETS
|
||||
# Structure: client,secret:client,secret
|
||||
SPOTIFY_SECRETS=
|
||||
|
||||
# 0 or 1
|
||||
# 0 = disable
|
||||
# 1 = enable
|
||||
ENABLE_UPDATE_CHECK=$ENABLE_UPDATE_CHECK
|
||||
# Choice: true (enter: 1) or false (enter: 0)
|
||||
ENABLE_UPDATE_CHECK=
|
||||
|
||||
LASTFM_API_KEY=$LASTFM_API_KEY
|
||||
LASTFM_API_SECRET=$LASTFM_API_SECRET
|
||||
LASTFM_API_KEY=
|
||||
LASTFM_API_SECRET=
|
||||
|
||||
# Release channel. Can be: nightly, stable
|
||||
RELEASE_CHANNEL=$RELEASE_CHANNEL
|
||||
# Choice: stable or nightly
|
||||
RELEASE_CHANNEL=
|
||||
|
||||
HIDE_DONATIONS=$HIDE_DONATIONS
|
||||
DISABLE_SPOTIFY_IMAGES=$DISABLE_SPOTIFY_IMAGES
|
||||
# Choice: true (enter: 1) or false (enter: 0)
|
||||
HIDE_DONATIONS=
|
||||
DISABLE_SPOTIFY_IMAGES=
|
||||
|
||||
1
.vscode/settings.json
vendored
@ -9,6 +9,7 @@
|
||||
"fuzzywuzzy",
|
||||
"gapless",
|
||||
"instrumentalness",
|
||||
"isrc",
|
||||
"Mpris",
|
||||
"RGBO",
|
||||
"riverpod",
|
||||
|
||||
@ -3,4 +3,17 @@
|
||||
to allow setting breakpoints, to provide hot reload, etc.
|
||||
-->
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<application
|
||||
android:name="${applicationName}"
|
||||
android:allowBackup="false"
|
||||
android:fullBackupContent="false"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:label="@string/app_name_en"
|
||||
android:requestLegacyExternalStorage="true"
|
||||
android:usesCleartextTraffic="true">
|
||||
<!-- Disable Impeller -->
|
||||
<meta-data
|
||||
android:name="io.flutter.embedding.android.EnableImpeller"
|
||||
android:value="false" />
|
||||
</application>
|
||||
</manifest>
|
||||
|
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 7.5 KiB |
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 38 KiB |
@ -1,6 +1,9 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@color/ic_launcher_background"/>
|
||||
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
|
||||
<monochrome android:drawable="@drawable/ic_launcher_monochrome"/>
|
||||
<foreground>
|
||||
<inset
|
||||
android:drawable="@drawable/ic_launcher_foreground"
|
||||
android:inset="16%" />
|
||||
</foreground>
|
||||
</adaptive-icon>
|
||||
|
||||
|
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 6.9 KiB |
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 9.9 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 28 KiB |
BIN
assets/spotube-icon-rounded.png
Normal file
|
After Width: | Height: | Size: 648 KiB |
BIN
assets/spotube-icon.png
Normal file
|
After Width: | Height: | Size: 486 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 86 KiB After Width: | Height: | Size: 435 KiB |
BIN
assets/spotube-logo-notWallpaper.png
Normal file
|
After Width: | Height: | Size: 1.4 MiB |
BIN
assets/spotube-logo-rounded.png
Normal file
|
After Width: | Height: | Size: 144 KiB |
|
Before Width: | Height: | Size: 9.1 KiB |
|
Before Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 89 KiB |
@ -1,349 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
viewBox="0 0 762 762"
|
||||
version="1.1"
|
||||
id="svg270"
|
||||
sodipodi:docname="spotube-logo.svg"
|
||||
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
|
||||
xml:space="preserve"
|
||||
inkscape:export-filename="spotube-logo.png"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96"
|
||||
width="762"
|
||||
height="762"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns:bx="https://boxy-svg.com"><sodipodi:namedview
|
||||
id="namedview272"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="0.76199998"
|
||||
inkscape:cx="194.22573"
|
||||
inkscape:cy="314.96064"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1001"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg270"
|
||||
inkscape:lockguides="false"><inkscape:page
|
||||
x="0"
|
||||
y="0"
|
||||
width="762"
|
||||
height="762"
|
||||
id="page3136" /><inkscape:page
|
||||
x="640.44641"
|
||||
y="132.29141"
|
||||
width="89.999939"
|
||||
height="89.999985"
|
||||
id="page3138" /></sodipodi:namedview><defs
|
||||
id="defs220"><linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient5535"><stop
|
||||
style="stop-color:#00063b;stop-opacity:1;"
|
||||
offset="0.25885531"
|
||||
id="stop5531" /><stop
|
||||
style="stop-color:#004256;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop5533" /></linearGradient><linearGradient
|
||||
id="linearGradient2809"><stop
|
||||
offset="0.113"
|
||||
style="stop-color:#5668ea;stop-opacity:1;"
|
||||
id="stop2803" /><stop
|
||||
offset="0.60799998"
|
||||
style="stop-color:#0093b1;stop-opacity:1;"
|
||||
id="stop2805" /><stop
|
||||
offset="0.94400001"
|
||||
style="stop-color:#00a29f;stop-opacity:1;"
|
||||
id="stop2807" /></linearGradient><linearGradient
|
||||
id="linearGradient938"><stop
|
||||
offset="0.113"
|
||||
style="stop-color:#5869eb;stop-opacity:1;"
|
||||
id="stop932" /><stop
|
||||
offset="0.60799998"
|
||||
style="stop-color:#0093b1;stop-opacity:1;"
|
||||
id="stop934" /><stop
|
||||
offset="0.94400001"
|
||||
style="stop-color:#02a7a4;stop-opacity:1;"
|
||||
id="stop936" /></linearGradient><radialGradient
|
||||
id="gradient-2-0"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
cx="251.179"
|
||||
cy="248.821"
|
||||
r="241.45"
|
||||
gradientTransform="translate(-1.768285,0.589104)"
|
||||
xlink:href="#gradient-2" /><linearGradient
|
||||
id="gradient-2"><stop
|
||||
offset="0.841"
|
||||
style="stop-color: rgb(255, 255, 255);"
|
||||
id="stop169" /><stop
|
||||
offset="1"
|
||||
style="stop-color: rgb(201, 201, 201);"
|
||||
id="stop171" /></linearGradient><filter
|
||||
id="drop-shadow-filter-0"
|
||||
x="-0.050892502"
|
||||
y="-0.050892502"
|
||||
width="1.1017849"
|
||||
height="1.1017849"
|
||||
bx:preset="drop-shadow 1 0 0 10 0.42 rgba(201,201,201,1)"><feGaussianBlur
|
||||
in="SourceAlpha"
|
||||
stdDeviation="10"
|
||||
id="feGaussianBlur174" /><feOffset
|
||||
dx="0"
|
||||
dy="0"
|
||||
id="feOffset176" /><feComponentTransfer
|
||||
result="offsetblur"
|
||||
id="feComponentTransfer179"><feFuncA
|
||||
id="spread-ctrl"
|
||||
type="linear"
|
||||
slope="0.84" /></feComponentTransfer><feFlood
|
||||
flood-color="rgba(201,201,201,1)"
|
||||
id="feFlood181" /><feComposite
|
||||
in2="offsetblur"
|
||||
operator="in"
|
||||
id="feComposite183" /><feMerge
|
||||
id="feMerge189"><feMergeNode
|
||||
id="feMergeNode185" /><feMergeNode
|
||||
in="SourceGraphic"
|
||||
id="feMergeNode187" /></feMerge></filter><linearGradient
|
||||
id="gradient-4-3"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="47.146"
|
||||
y1="18.044001"
|
||||
x2="47.146"
|
||||
y2="75.353996"
|
||||
xlink:href="#gradient-4" /><linearGradient
|
||||
id="gradient-4"><stop
|
||||
offset="0.113"
|
||||
style="stop-color: rgb(83, 240, 111);"
|
||||
id="stop193" /><stop
|
||||
offset="0.608"
|
||||
style="stop-color: rgb(0, 177, 86);"
|
||||
id="stop195" /><stop
|
||||
offset="0.944"
|
||||
style="stop-color: rgb(2, 167, 156);"
|
||||
id="stop197" /></linearGradient><filter
|
||||
id="inner-shadow-filter-0"
|
||||
x="-0.064836091"
|
||||
y="-0.071329232"
|
||||
width="1.1296722"
|
||||
height="1.108079"
|
||||
bx:preset="inner-shadow 1 0 0 4 0.5 rgba(0,0,0,0.7)"><feOffset
|
||||
dx="0"
|
||||
dy="0"
|
||||
id="feOffset200" /><feGaussianBlur
|
||||
stdDeviation="4"
|
||||
id="feGaussianBlur202"
|
||||
result="result1" /><feComposite
|
||||
operator="out"
|
||||
in="SourceGraphic"
|
||||
in2="result1"
|
||||
id="feComposite204" /><feComponentTransfer
|
||||
result="choke"
|
||||
id="feComponentTransfer208"><feFuncA
|
||||
type="linear"
|
||||
slope="1"
|
||||
id="feFuncA206" /></feComponentTransfer><feFlood
|
||||
flood-color="rgba(0,0,0,0.7)"
|
||||
result="color"
|
||||
id="feFlood210" /><feComposite
|
||||
operator="in"
|
||||
in="color"
|
||||
in2="choke"
|
||||
result="shadow"
|
||||
id="feComposite212" /><feComposite
|
||||
operator="over"
|
||||
in="shadow"
|
||||
in2="SourceGraphic"
|
||||
id="feComposite214" /></filter><linearGradient
|
||||
id="gradient-4-1"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="82.026001"
|
||||
y1="144.832"
|
||||
x2="82.026001"
|
||||
y2="264.46201"
|
||||
xlink:href="#linearGradient2809"
|
||||
gradientTransform="translate(7.2213312)" /><linearGradient
|
||||
id="gradient-4-2"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="143.69299"
|
||||
y1="22.804001"
|
||||
x2="143.69299"
|
||||
y2="264.582"
|
||||
xlink:href="#linearGradient938" /><linearGradient
|
||||
id="gradient-4-0"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="205.862"
|
||||
y1="146.28"
|
||||
x2="205.862"
|
||||
y2="265.91"
|
||||
xlink:href="#gradient-4"
|
||||
gradientTransform="translate(-7.2213312)" /><filter
|
||||
style="color-interpolation-filters:sRGB"
|
||||
inkscape:label="Drop Shadow"
|
||||
id="filter2000"
|
||||
x="-0.3425389"
|
||||
y="-0.3425389"
|
||||
width="1.6850778"
|
||||
height="1.6850778"><feFlood
|
||||
flood-opacity="1"
|
||||
flood-color="rgb(0,0,0)"
|
||||
result="flood"
|
||||
id="feFlood1990" /><feComposite
|
||||
in="flood"
|
||||
in2="SourceGraphic"
|
||||
operator="out"
|
||||
result="composite1"
|
||||
id="feComposite1992" /><feGaussianBlur
|
||||
in="composite1"
|
||||
stdDeviation="29.980818"
|
||||
result="blur"
|
||||
id="feGaussianBlur1994" /><feOffset
|
||||
dx="0"
|
||||
dy="0"
|
||||
result="offset"
|
||||
id="feOffset1996" /><feComposite
|
||||
in="offset"
|
||||
in2="SourceGraphic"
|
||||
operator="atop"
|
||||
result="fbSourceGraphic"
|
||||
id="feComposite1998" /><feColorMatrix
|
||||
result="fbSourceGraphicAlpha"
|
||||
in="fbSourceGraphic"
|
||||
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
|
||||
id="feColorMatrix2062" /><feFlood
|
||||
id="feFlood2064"
|
||||
flood-opacity="1"
|
||||
flood-color="rgb(0,0,0)"
|
||||
result="flood"
|
||||
in="fbSourceGraphic" /><feComposite
|
||||
in2="fbSourceGraphic"
|
||||
id="feComposite2066"
|
||||
in="flood"
|
||||
operator="out"
|
||||
result="composite1" /><feGaussianBlur
|
||||
id="feGaussianBlur2068"
|
||||
in="composite1"
|
||||
stdDeviation="28.6433"
|
||||
result="blur" /><feOffset
|
||||
id="feOffset2070"
|
||||
dx="0"
|
||||
dy="0"
|
||||
result="offset" /><feComposite
|
||||
in2="fbSourceGraphic"
|
||||
id="feComposite2072"
|
||||
in="offset"
|
||||
operator="atop"
|
||||
result="fbSourceGraphic" /><feColorMatrix
|
||||
result="fbSourceGraphicAlpha"
|
||||
in="fbSourceGraphic"
|
||||
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
|
||||
id="feColorMatrix3393" /><feFlood
|
||||
id="feFlood3395"
|
||||
flood-opacity="0.352941"
|
||||
flood-color="rgb(0,0,0)"
|
||||
result="flood"
|
||||
in="fbSourceGraphic" /><feComposite
|
||||
in2="fbSourceGraphic"
|
||||
id="feComposite3397"
|
||||
in="flood"
|
||||
operator="in"
|
||||
result="composite1" /><feGaussianBlur
|
||||
id="feGaussianBlur3399"
|
||||
in="composite1"
|
||||
stdDeviation="6.59891"
|
||||
result="blur" /><feOffset
|
||||
id="feOffset3401"
|
||||
dx="0"
|
||||
dy="0"
|
||||
result="offset" /><feComposite
|
||||
in2="offset"
|
||||
id="feComposite3403"
|
||||
in="fbSourceGraphic"
|
||||
operator="over"
|
||||
result="composite2" /></filter><linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2809"
|
||||
id="linearGradient5506"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(117.34662)"
|
||||
x1="82.026001"
|
||||
y1="144.832"
|
||||
x2="82.026001"
|
||||
y2="264.46201" /><radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5535"
|
||||
id="radialGradient5537"
|
||||
cx="143.6935"
|
||||
cy="143.69299"
|
||||
fx="143.6935"
|
||||
fy="143.69299"
|
||||
r="152.72653"
|
||||
gradientTransform="matrix(1,0,0,0.8506841,0,21.45565)"
|
||||
gradientUnits="userSpaceOnUse" /></defs><circle
|
||||
style="opacity:1;fill:#242832;fill-opacity:1;stroke:#000000;stroke-width:10;stroke-dasharray:none;stroke-opacity:0.961795;filter:url(#filter2000)"
|
||||
id="path1157"
|
||||
cx="381.48901"
|
||||
cy="381.48901"
|
||||
inkscape:label="path1157"
|
||||
r="235.79112"
|
||||
sodipodi:insensitive="true" /><g
|
||||
transform="matrix(0.319972,0,0,0.323174,379.08153,437.03375)"
|
||||
id="g228"><g
|
||||
style="opacity:1;fill:none;fill-rule:nonzero;stroke:none;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none"
|
||||
transform="matrix(3.89,0,0,3.89,-175.05,-175.05)"
|
||||
id="g226" /></g><g
|
||||
id="g236"
|
||||
style="fill:none;filter:url(#inner-shadow-filter-0)"
|
||||
transform="matrix(1.107829,0,0,1.106267,221.95533,199.03714)"><path
|
||||
d="m 78.642332,155.437 v 98.42 c 0,5.867 4.741,10.605 10.605,10.605 5.854,0 10.604995,-4.738 10.604995,-10.605 v -98.42 c 0,-5.856 -4.750995,-10.605 -10.604995,-10.605 -5.864,0 -10.605,4.744 -10.605,10.605 z"
|
||||
style="fill:none;fill-opacity:1;stroke:url(#gradient-4-1);stroke-width:9.80924px;stroke-linecap:round;stroke-linejoin:round"
|
||||
id="path230" /><path
|
||||
d="m 29.456,264.582 h 23.351 v -116.85 c 0.064,-0.56 0.166,-1.119 0.166,-1.693 0,-50.412 40.69,-91.42 90.698,-91.42 50.002,0 90.692,41.008 90.692,91.42 0,0.771 0.113,1.518 0.228,2.263 v 116.28 h 23.354 c 16.254,0 29.442,-13.64 29.442,-30.469 v -60.936 c 0,-13.878 -8.989,-25.57 -21.261,-29.249 C 264.997,76.957 210.518,22.804 143.676,22.804 76.816,22.804 22.329,76.962 21.211,143.954 8.956,147.638 0,159.32 0,173.187 v 60.926 c 0,16.819 13.187,30.469 29.456,30.469 z"
|
||||
style="fill:url(#radialGradient5537);fill-opacity:1;stroke:url(#gradient-4-2);stroke-width:18.0661;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"
|
||||
id="path232" /><path
|
||||
d="M 49.735541,279.35822 C 23.7214,267.48486 38.122112,248.62719 80.85964,237.45225 c 14.400662,-3.49216 25.08508,-5.12184 43.66659,-4.88901 11.61348,0.23282 24.62053,3.49216 24.62053,3.49216 0,-42.13877 -0.46471,-121.7601 -0.46471,-160.872338 4.6454,0 7.89719,-0.232827 14.40071,-0.232827 0,2.328107 0,4.190613 0,6.053093 0,2.095305 0,3.259358 0.46471,4.656212 4.6454,14.66709 11.14893,20.48736 43.66659,38.41381 41.34392,23.04827 53.42195,36.78411 53.42195,55.17616 -0.46471,17.22802 -30.65954,54.01213 -37.16306,52.61528 9.29075,-13.03741 22.2978,-27.00606 25.54958,-38.64661 4.18085,-14.20147 -7.43263,-34.2232 -26.01414,-44.69971 -14.86522,-8.8468 -50.17016,-16.52957 -59.92547,-16.52957 0,0 -0.46472,84.74317 -0.46472,116.87109 0,5.35464 -9.7553,14.89989 -15.32977,18.15925 -25.54958,15.36551 -75.25519,22.34984 -97.553043,12.33896 z"
|
||||
id="path3079"
|
||||
style="stroke-width:3.28861" /><path
|
||||
d="m 188.76763,155.437 v 98.42 c 0,5.867 4.741,10.605 10.60501,10.605 5.854,0 10.605,-4.738 10.605,-10.605 v -98.42 c 0,-5.856 -4.751,-10.605 -10.605,-10.605 -5.86401,0 -10.60501,4.744 -10.60501,10.605 z"
|
||||
style="fill:none;stroke:url(#linearGradient5506);stroke-width:9.80924px;stroke-linecap:round;stroke-linejoin:round"
|
||||
id="path5502" /></g><g
|
||||
transform="matrix(0.972684,0,0,0.972684,193.06382,142.14148)"
|
||||
id="g240" /><g
|
||||
transform="matrix(0.972684,0,0,0.972684,193.06382,142.14148)"
|
||||
id="g242" /><g
|
||||
transform="matrix(0.972684,0,0,0.972684,193.06382,142.14148)"
|
||||
id="g244" /><g
|
||||
transform="matrix(0.972684,0,0,0.972684,193.06382,142.14148)"
|
||||
id="g246" /><g
|
||||
transform="matrix(0.972684,0,0,0.972684,193.06382,142.14148)"
|
||||
id="g248" /><g
|
||||
transform="matrix(0.972684,0,0,0.972684,193.06382,142.14148)"
|
||||
id="g250" /><g
|
||||
transform="matrix(0.972684,0,0,0.972684,193.06382,142.14148)"
|
||||
id="g252" /><g
|
||||
transform="matrix(0.972684,0,0,0.972684,193.06382,142.14148)"
|
||||
id="g254" /><g
|
||||
transform="matrix(0.972684,0,0,0.972684,193.06382,142.14148)"
|
||||
id="g256" /><g
|
||||
transform="matrix(0.972684,0,0,0.972684,193.06382,142.14148)"
|
||||
id="g258" /><g
|
||||
transform="matrix(0.972684,0,0,0.972684,193.06382,142.14148)"
|
||||
id="g260" /><g
|
||||
transform="matrix(0.972684,0,0,0.972684,193.06382,142.14148)"
|
||||
id="g262" /><g
|
||||
transform="matrix(0.972684,0,0,0.972684,193.06382,142.14148)"
|
||||
id="g264" /><g
|
||||
transform="matrix(0.972684,0,0,0.972684,193.06382,142.14148)"
|
||||
id="g266" /><g
|
||||
transform="matrix(0.972684,0,0,0.972684,193.06382,142.14148)"
|
||||
id="g268" /></svg>
|
||||
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 359 KiB After Width: | Height: | Size: 351 KiB |
|
Before Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 128 KiB |
@ -1,359 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
viewBox="0 0 762 762"
|
||||
version="1.1"
|
||||
id="svg270"
|
||||
sodipodi:docname="spotube-nightly-logo.svg"
|
||||
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
|
||||
xml:space="preserve"
|
||||
inkscape:export-filename="spotube-logo.png"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96"
|
||||
width="762"
|
||||
height="762"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns:bx="https://boxy-svg.com"><sodipodi:namedview
|
||||
id="namedview272"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="0.26940768"
|
||||
inkscape:cx="-413.87091"
|
||||
inkscape:cy="562.34478"
|
||||
inkscape:window-width="1518"
|
||||
inkscape:window-height="1080"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="g236"
|
||||
inkscape:lockguides="false"><inkscape:page
|
||||
x="0"
|
||||
y="0"
|
||||
width="762"
|
||||
height="762"
|
||||
id="page3136" /><inkscape:page
|
||||
x="640.44641"
|
||||
y="132.29141"
|
||||
width="89.999939"
|
||||
height="89.999985"
|
||||
id="page3138" /></sodipodi:namedview><defs
|
||||
id="defs220"><linearGradient
|
||||
id="linearGradient1211"><stop
|
||||
offset="0.113"
|
||||
style="stop-color:#ff4b4b;stop-opacity:1;"
|
||||
id="stop1205" /><stop
|
||||
offset="0.60799998"
|
||||
style="stop-color:#d6a400;stop-opacity:1;"
|
||||
id="stop1207" /><stop
|
||||
offset="0.94400001"
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
id="stop1209" /></linearGradient><linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient5535"><stop
|
||||
style="stop-color:#3b2100;stop-opacity:1;"
|
||||
offset="0.25885531"
|
||||
id="stop5531" /><stop
|
||||
style="stop-color:#004256;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop5533" /></linearGradient><linearGradient
|
||||
id="linearGradient2809"><stop
|
||||
offset="0.113"
|
||||
style="stop-color:#ff4b4b;stop-opacity:1;"
|
||||
id="stop2803" /><stop
|
||||
offset="0.60799998"
|
||||
style="stop-color:#d6a400;stop-opacity:1;"
|
||||
id="stop2805" /><stop
|
||||
offset="0.94400001"
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
id="stop2807" /></linearGradient><linearGradient
|
||||
id="linearGradient938"><stop
|
||||
offset="0.113"
|
||||
style="stop-color:#ff4b4b;stop-opacity:1;"
|
||||
id="stop932" /><stop
|
||||
offset="0.60799998"
|
||||
style="stop-color:#d6a400;stop-opacity:1;"
|
||||
id="stop934" /><stop
|
||||
offset="0.94400001"
|
||||
style="stop-color:#fffcf1;stop-opacity:1;"
|
||||
id="stop936" /></linearGradient><radialGradient
|
||||
id="gradient-2-0"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
cx="251.179"
|
||||
cy="248.821"
|
||||
r="241.45"
|
||||
gradientTransform="translate(-1.768285,0.589104)"
|
||||
xlink:href="#gradient-2" /><linearGradient
|
||||
id="gradient-2"><stop
|
||||
offset="0.841"
|
||||
style="stop-color: rgb(255, 255, 255);"
|
||||
id="stop169" /><stop
|
||||
offset="1"
|
||||
style="stop-color: rgb(201, 201, 201);"
|
||||
id="stop171" /></linearGradient><filter
|
||||
id="drop-shadow-filter-0"
|
||||
x="-0.050892502"
|
||||
y="-0.050892502"
|
||||
width="1.1017849"
|
||||
height="1.1017849"
|
||||
bx:preset="drop-shadow 1 0 0 10 0.42 rgba(201,201,201,1)"><feGaussianBlur
|
||||
in="SourceAlpha"
|
||||
stdDeviation="10"
|
||||
id="feGaussianBlur174" /><feOffset
|
||||
dx="0"
|
||||
dy="0"
|
||||
id="feOffset176" /><feComponentTransfer
|
||||
result="offsetblur"
|
||||
id="feComponentTransfer179"><feFuncA
|
||||
id="spread-ctrl"
|
||||
type="linear"
|
||||
slope="0.84" /></feComponentTransfer><feFlood
|
||||
flood-color="rgba(201,201,201,1)"
|
||||
id="feFlood181" /><feComposite
|
||||
in2="offsetblur"
|
||||
operator="in"
|
||||
id="feComposite183" /><feMerge
|
||||
id="feMerge189"><feMergeNode
|
||||
id="feMergeNode185" /><feMergeNode
|
||||
in="SourceGraphic"
|
||||
id="feMergeNode187" /></feMerge></filter><linearGradient
|
||||
id="gradient-4-3"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="47.146"
|
||||
y1="18.044001"
|
||||
x2="47.146"
|
||||
y2="75.353996"
|
||||
xlink:href="#gradient-4" /><linearGradient
|
||||
id="gradient-4"><stop
|
||||
offset="0.113"
|
||||
style="stop-color: rgb(83, 240, 111);"
|
||||
id="stop193" /><stop
|
||||
offset="0.608"
|
||||
style="stop-color: rgb(0, 177, 86);"
|
||||
id="stop195" /><stop
|
||||
offset="0.944"
|
||||
style="stop-color: rgb(2, 167, 156);"
|
||||
id="stop197" /></linearGradient><filter
|
||||
id="inner-shadow-filter-0"
|
||||
x="-0.064836091"
|
||||
y="-0.071329232"
|
||||
width="1.1296722"
|
||||
height="1.108079"
|
||||
bx:preset="inner-shadow 1 0 0 4 0.5 rgba(0,0,0,0.7)"><feOffset
|
||||
dx="0"
|
||||
dy="0"
|
||||
id="feOffset200" /><feGaussianBlur
|
||||
stdDeviation="4"
|
||||
id="feGaussianBlur202"
|
||||
result="result1" /><feComposite
|
||||
operator="out"
|
||||
in="SourceGraphic"
|
||||
in2="result1"
|
||||
id="feComposite204" /><feComponentTransfer
|
||||
result="choke"
|
||||
id="feComponentTransfer208"><feFuncA
|
||||
type="linear"
|
||||
slope="1"
|
||||
id="feFuncA206" /></feComponentTransfer><feFlood
|
||||
flood-color="rgba(0,0,0,0.7)"
|
||||
result="color"
|
||||
id="feFlood210" /><feComposite
|
||||
operator="in"
|
||||
in="color"
|
||||
in2="choke"
|
||||
result="shadow"
|
||||
id="feComposite212" /><feComposite
|
||||
operator="over"
|
||||
in="shadow"
|
||||
in2="SourceGraphic"
|
||||
id="feComposite214" /></filter><linearGradient
|
||||
id="gradient-4-1"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="82.026001"
|
||||
y1="144.832"
|
||||
x2="82.026001"
|
||||
y2="264.46201"
|
||||
xlink:href="#linearGradient2809"
|
||||
gradientTransform="translate(7.2213312)" /><linearGradient
|
||||
id="gradient-4-2"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="143.69299"
|
||||
y1="22.804001"
|
||||
x2="143.69299"
|
||||
y2="264.582"
|
||||
xlink:href="#linearGradient938" /><linearGradient
|
||||
id="gradient-4-0"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="205.862"
|
||||
y1="146.28"
|
||||
x2="205.862"
|
||||
y2="265.91"
|
||||
xlink:href="#gradient-4"
|
||||
gradientTransform="translate(-7.2213312)" /><filter
|
||||
style="color-interpolation-filters:sRGB"
|
||||
inkscape:label="Drop Shadow"
|
||||
id="filter2000"
|
||||
x="-0.3425389"
|
||||
y="-0.3425389"
|
||||
width="1.6850778"
|
||||
height="1.6850778"><feFlood
|
||||
flood-opacity="1"
|
||||
flood-color="rgb(0,0,0)"
|
||||
result="flood"
|
||||
id="feFlood1990" /><feComposite
|
||||
in="flood"
|
||||
in2="SourceGraphic"
|
||||
operator="out"
|
||||
result="composite1"
|
||||
id="feComposite1992" /><feGaussianBlur
|
||||
in="composite1"
|
||||
stdDeviation="29.980818"
|
||||
result="blur"
|
||||
id="feGaussianBlur1994" /><feOffset
|
||||
dx="0"
|
||||
dy="0"
|
||||
result="offset"
|
||||
id="feOffset1996" /><feComposite
|
||||
in="offset"
|
||||
in2="SourceGraphic"
|
||||
operator="atop"
|
||||
result="fbSourceGraphic"
|
||||
id="feComposite1998" /><feColorMatrix
|
||||
result="fbSourceGraphicAlpha"
|
||||
in="fbSourceGraphic"
|
||||
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
|
||||
id="feColorMatrix2062" /><feFlood
|
||||
id="feFlood2064"
|
||||
flood-opacity="1"
|
||||
flood-color="rgb(0,0,0)"
|
||||
result="flood"
|
||||
in="fbSourceGraphic" /><feComposite
|
||||
in2="fbSourceGraphic"
|
||||
id="feComposite2066"
|
||||
in="flood"
|
||||
operator="out"
|
||||
result="composite1" /><feGaussianBlur
|
||||
id="feGaussianBlur2068"
|
||||
in="composite1"
|
||||
stdDeviation="28.6433"
|
||||
result="blur" /><feOffset
|
||||
id="feOffset2070"
|
||||
dx="0"
|
||||
dy="0"
|
||||
result="offset" /><feComposite
|
||||
in2="fbSourceGraphic"
|
||||
id="feComposite2072"
|
||||
in="offset"
|
||||
operator="atop"
|
||||
result="fbSourceGraphic" /><feColorMatrix
|
||||
result="fbSourceGraphicAlpha"
|
||||
in="fbSourceGraphic"
|
||||
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
|
||||
id="feColorMatrix3393" /><feFlood
|
||||
id="feFlood3395"
|
||||
flood-opacity="0.352941"
|
||||
flood-color="rgb(0,0,0)"
|
||||
result="flood"
|
||||
in="fbSourceGraphic" /><feComposite
|
||||
in2="fbSourceGraphic"
|
||||
id="feComposite3397"
|
||||
in="flood"
|
||||
operator="in"
|
||||
result="composite1" /><feGaussianBlur
|
||||
id="feGaussianBlur3399"
|
||||
in="composite1"
|
||||
stdDeviation="6.59891"
|
||||
result="blur" /><feOffset
|
||||
id="feOffset3401"
|
||||
dx="0"
|
||||
dy="0"
|
||||
result="offset" /><feComposite
|
||||
in2="offset"
|
||||
id="feComposite3403"
|
||||
in="fbSourceGraphic"
|
||||
operator="over"
|
||||
result="composite2" /></filter><linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient1211"
|
||||
id="linearGradient5506"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(117.34662)"
|
||||
x1="82.026001"
|
||||
y1="144.832"
|
||||
x2="82.026001"
|
||||
y2="264.46201" /><radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5535"
|
||||
id="radialGradient5537"
|
||||
cx="143.6935"
|
||||
cy="143.69299"
|
||||
fx="143.6935"
|
||||
fy="143.69299"
|
||||
r="152.72653"
|
||||
gradientTransform="matrix(1,0,0,0.8506841,0,21.45565)"
|
||||
gradientUnits="userSpaceOnUse" /></defs><circle
|
||||
style="opacity:1;fill:#242832;fill-opacity:1;stroke:#000000;stroke-width:10;stroke-dasharray:none;stroke-opacity:0.961795;filter:url(#filter2000)"
|
||||
id="path1157"
|
||||
cx="381.48901"
|
||||
cy="381.48901"
|
||||
inkscape:label="path1157"
|
||||
r="235.79112"
|
||||
sodipodi:insensitive="true" /><g
|
||||
transform="matrix(0.319972,0,0,0.323174,379.08153,437.03375)"
|
||||
id="g228"><g
|
||||
style="opacity:1;fill:none;fill-rule:nonzero;stroke:none;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none"
|
||||
transform="matrix(3.89,0,0,3.89,-175.05,-175.05)"
|
||||
id="g226" /></g><g
|
||||
id="g236"
|
||||
style="fill:none;filter:url(#inner-shadow-filter-0)"
|
||||
transform="matrix(1.107829,0,0,1.106267,221.95533,199.03714)"><path
|
||||
d="m 78.642332,155.437 v 98.42 c 0,5.867 4.741,10.605 10.605,10.605 5.854,0 10.604995,-4.738 10.604995,-10.605 v -98.42 c 0,-5.856 -4.750995,-10.605 -10.604995,-10.605 -5.864,0 -10.605,4.744 -10.605,10.605 z"
|
||||
style="fill:none;fill-opacity:1;stroke:url(#gradient-4-1);stroke-width:9.80924px;stroke-linecap:round;stroke-linejoin:round"
|
||||
id="path230" /><path
|
||||
d="m 29.456,264.582 h 23.351 v -116.85 c 0.064,-0.56 0.166,-1.119 0.166,-1.693 0,-50.412 40.69,-91.42 90.698,-91.42 50.002,0 90.692,41.008 90.692,91.42 0,0.771 0.113,1.518 0.228,2.263 v 116.28 h 23.354 c 16.254,0 29.442,-13.64 29.442,-30.469 v -60.936 c 0,-13.878 -8.989,-25.57 -21.261,-29.249 C 264.997,76.957 210.518,22.804 143.676,22.804 76.816,22.804 22.329,76.962 21.211,143.954 8.956,147.638 0,159.32 0,173.187 v 60.926 c 0,16.819 13.187,30.469 29.456,30.469 z"
|
||||
style="fill:url(#radialGradient5537);fill-opacity:1;stroke:url(#gradient-4-2);stroke-width:18.0661;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"
|
||||
id="path232" /><path
|
||||
d="M 49.735541,279.35822 C 23.7214,267.48486 38.122112,248.62719 80.85964,237.45225 c 14.400662,-3.49216 25.08508,-5.12184 43.66659,-4.88901 11.61348,0.23282 24.62053,3.49216 24.62053,3.49216 0,-42.13877 -0.46471,-121.7601 -0.46471,-160.872338 4.6454,0 7.89719,-0.232827 14.40071,-0.232827 0,2.328107 0,4.190613 0,6.053093 0,2.095305 0,3.259358 0.46471,4.656212 4.6454,14.66709 11.14893,20.48736 43.66659,38.41381 41.34392,23.04827 53.42195,36.78411 53.42195,55.17616 -0.46471,17.22802 -30.65954,54.01213 -37.16306,52.61528 9.29075,-13.03741 22.2978,-27.00606 25.54958,-38.64661 4.18085,-14.20147 -7.43263,-34.2232 -26.01414,-44.69971 -14.86522,-8.8468 -50.17016,-16.52957 -59.92547,-16.52957 0,0 -0.46472,84.74317 -0.46472,116.87109 0,5.35464 -9.7553,14.89989 -15.32977,18.15925 -25.54958,15.36551 -75.25519,22.34984 -97.553043,12.33896 z"
|
||||
id="path3079"
|
||||
style="stroke-width:3.28861" /><path
|
||||
d="m 188.76763,155.437 v 98.42 c 0,5.867 4.741,10.605 10.60501,10.605 5.854,0 10.605,-4.738 10.605,-10.605 v -98.42 c 0,-5.856 -4.751,-10.605 -10.605,-10.605 -5.86401,0 -10.60501,4.744 -10.60501,10.605 z"
|
||||
style="fill:none;stroke:url(#linearGradient5506);stroke-width:9.80924px;stroke-linecap:round;stroke-linejoin:round"
|
||||
id="path5502" /></g><g
|
||||
transform="matrix(0.972684,0,0,0.972684,193.06382,142.14148)"
|
||||
id="g240" /><g
|
||||
transform="matrix(0.972684,0,0,0.972684,193.06382,142.14148)"
|
||||
id="g242" /><g
|
||||
transform="matrix(0.972684,0,0,0.972684,193.06382,142.14148)"
|
||||
id="g244" /><g
|
||||
transform="matrix(0.972684,0,0,0.972684,193.06382,142.14148)"
|
||||
id="g246" /><g
|
||||
transform="matrix(0.972684,0,0,0.972684,193.06382,142.14148)"
|
||||
id="g248" /><g
|
||||
transform="matrix(0.972684,0,0,0.972684,193.06382,142.14148)"
|
||||
id="g250" /><g
|
||||
transform="matrix(0.972684,0,0,0.972684,193.06382,142.14148)"
|
||||
id="g252" /><g
|
||||
transform="matrix(0.972684,0,0,0.972684,193.06382,142.14148)"
|
||||
id="g254" /><g
|
||||
transform="matrix(0.972684,0,0,0.972684,193.06382,142.14148)"
|
||||
id="g256" /><g
|
||||
transform="matrix(0.972684,0,0,0.972684,193.06382,142.14148)"
|
||||
id="g258" /><g
|
||||
transform="matrix(0.972684,0,0,0.972684,193.06382,142.14148)"
|
||||
id="g260" /><g
|
||||
transform="matrix(0.972684,0,0,0.972684,193.06382,142.14148)"
|
||||
id="g262" /><g
|
||||
transform="matrix(0.972684,0,0,0.972684,193.06382,142.14148)"
|
||||
id="g264" /><g
|
||||
transform="matrix(0.972684,0,0,0.972684,193.06382,142.14148)"
|
||||
id="g266" /><g
|
||||
transform="matrix(0.972684,0,0,0.972684,193.06382,142.14148)"
|
||||
id="g268" /></svg>
|
||||
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 295 KiB |
BIN
assets/spotube-nightly-notWallpaper.png
Normal file
|
After Width: | Height: | Size: 1.4 MiB |
BIN
assets/spotube-nightly-rounded.png
Normal file
|
After Width: | Height: | Size: 892 KiB |
BIN
assets/spotube-nightly.png
Normal file
|
After Width: | Height: | Size: 763 KiB |
190
assets/spotube-nightly.svg
Normal file
|
After Width: | Height: | Size: 531 KiB |
|
Before Width: | Height: | Size: 90 KiB |
|
Before Width: | Height: | Size: 90 KiB |
|
Before Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 298 KiB |
1
drift_schemas/app_db/drift_schema_v5.json
Normal file
@ -2135,7 +2135,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-nightly";
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = nightly.entitlements;
|
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||
@ -2159,7 +2159,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-nightly";
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = nightly.entitlements;
|
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||
@ -2183,7 +2183,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-nightly";
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = nightly.entitlements;
|
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||
@ -2207,7 +2207,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-nightly";
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = nightly.entitlements;
|
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||
@ -2230,7 +2230,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-nightly";
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = nightly.entitlements;
|
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||
@ -2253,7 +2253,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-nightly";
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = nightly.entitlements;
|
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||
@ -2276,7 +2276,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-nightly";
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = nightly.entitlements;
|
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||
@ -2299,7 +2299,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-nightly";
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = nightly.entitlements;
|
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||
@ -2322,7 +2322,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-nightly";
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = nightly.entitlements;
|
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||
@ -2472,7 +2472,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-nightly";
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = nightly.entitlements;
|
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||
@ -2617,7 +2617,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-nightly";
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = nightly.entitlements;
|
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||
@ -2759,7 +2759,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-nightly";
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = nightly.entitlements;
|
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||
@ -2781,9 +2781,9 @@
|
||||
E612EC4A2D0F07AD0022720C /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
|
||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = AppIcon;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
@ -2824,9 +2824,9 @@
|
||||
E612EC4B2D0F07AD0022720C /* Debug-nightly */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
|
||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = AppIcon;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
@ -2867,9 +2867,9 @@
|
||||
E612EC4C2D0F07AD0022720C /* Debug-dev */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
|
||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = AppIcon;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
@ -2910,9 +2910,9 @@
|
||||
E612EC4D2D0F07AD0022720C /* Debug-stable */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
|
||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = AppIcon;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
@ -2953,9 +2953,9 @@
|
||||
E612EC4E2D0F07AD0022720C /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
|
||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = AppIcon;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
@ -2993,9 +2993,9 @@
|
||||
E612EC4F2D0F07AD0022720C /* Release-nightly */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
|
||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = AppIcon;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
@ -3033,9 +3033,9 @@
|
||||
E612EC502D0F07AD0022720C /* Release-dev */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
|
||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = AppIcon;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
@ -3073,9 +3073,9 @@
|
||||
E612EC512D0F07AD0022720C /* Release-stable */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
|
||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = AppIcon;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
@ -3113,9 +3113,9 @@
|
||||
E612EC522D0F07AD0022720C /* Profile */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
|
||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = AppIcon;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
@ -3153,9 +3153,9 @@
|
||||
E612EC532D0F07AD0022720C /* Profile-nightly */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
|
||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = AppIcon;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
@ -3193,9 +3193,9 @@
|
||||
E612EC542D0F07AD0022720C /* Profile-dev */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
|
||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = AppIcon;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
@ -3233,9 +3233,9 @@
|
||||
E612EC552D0F07AD0022720C /* Profile-stable */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
|
||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = AppIcon;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
|
||||
@ -1 +1 @@
|
||||
{"images":[{"size":"20x20","idiom":"iphone","filename":"AppIcon-20x20@2x.png","scale":"2x"},{"size":"20x20","idiom":"iphone","filename":"AppIcon-20x20@3x.png","scale":"3x"},{"size":"29x29","idiom":"iphone","filename":"AppIcon-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"iphone","filename":"AppIcon-29x29@2x.png","scale":"2x"},{"size":"29x29","idiom":"iphone","filename":"AppIcon-29x29@3x.png","scale":"3x"},{"size":"40x40","idiom":"iphone","filename":"AppIcon-40x40@2x.png","scale":"2x"},{"size":"40x40","idiom":"iphone","filename":"AppIcon-40x40@3x.png","scale":"3x"},{"size":"50x50","idiom":"ipad","filename":"AppIcon-50x50@1x.png","scale":"1x"},{"size":"50x50","idiom":"ipad","filename":"AppIcon-50x50@2x.png","scale":"2x"},{"size":"57x57","idiom":"iphone","filename":"AppIcon-57x57@1x.png","scale":"1x"},{"size":"57x57","idiom":"iphone","filename":"AppIcon-57x57@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"AppIcon-60x60@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"AppIcon-60x60@3x.png","scale":"3x"},{"size":"20x20","idiom":"ipad","filename":"AppIcon-20x20@1x.png","scale":"1x"},{"size":"20x20","idiom":"ipad","filename":"AppIcon-20x20@2x.png","scale":"2x"},{"size":"29x29","idiom":"ipad","filename":"AppIcon-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"ipad","filename":"AppIcon-29x29@2x.png","scale":"2x"},{"size":"40x40","idiom":"ipad","filename":"AppIcon-40x40@1x.png","scale":"1x"},{"size":"40x40","idiom":"ipad","filename":"AppIcon-40x40@2x.png","scale":"2x"},{"size":"72x72","idiom":"ipad","filename":"AppIcon-72x72@1x.png","scale":"1x"},{"size":"72x72","idiom":"ipad","filename":"AppIcon-72x72@2x.png","scale":"2x"},{"size":"76x76","idiom":"ipad","filename":"AppIcon-76x76@1x.png","scale":"1x"},{"size":"76x76","idiom":"ipad","filename":"AppIcon-76x76@2x.png","scale":"2x"},{"size":"83.5x83.5","idiom":"ipad","filename":"AppIcon-83.5x83.5@2x.png","scale":"2x"},{"size":"1024x1024","idiom":"ios-marketing","filename":"AppIcon-1024x1024@1x.png","scale":"1x"}],"info":{"version":1,"author":"xcode"}}
|
||||
{"images":[{"size":"20x20","idiom":"iphone","filename":"Icon-App-20x20@2x.png","scale":"2x"},{"size":"20x20","idiom":"iphone","filename":"Icon-App-20x20@3x.png","scale":"3x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@2x.png","scale":"2x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@3x.png","scale":"3x"},{"size":"40x40","idiom":"iphone","filename":"Icon-App-40x40@2x.png","scale":"2x"},{"size":"40x40","idiom":"iphone","filename":"Icon-App-40x40@3x.png","scale":"3x"},{"size":"57x57","idiom":"iphone","filename":"Icon-App-57x57@1x.png","scale":"1x"},{"size":"57x57","idiom":"iphone","filename":"Icon-App-57x57@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"Icon-App-60x60@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"Icon-App-60x60@3x.png","scale":"3x"},{"size":"20x20","idiom":"ipad","filename":"Icon-App-20x20@1x.png","scale":"1x"},{"size":"20x20","idiom":"ipad","filename":"Icon-App-20x20@2x.png","scale":"2x"},{"size":"29x29","idiom":"ipad","filename":"Icon-App-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"ipad","filename":"Icon-App-29x29@2x.png","scale":"2x"},{"size":"40x40","idiom":"ipad","filename":"Icon-App-40x40@1x.png","scale":"1x"},{"size":"40x40","idiom":"ipad","filename":"Icon-App-40x40@2x.png","scale":"2x"},{"size":"50x50","idiom":"ipad","filename":"Icon-App-50x50@1x.png","scale":"1x"},{"size":"50x50","idiom":"ipad","filename":"Icon-App-50x50@2x.png","scale":"2x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@1x.png","scale":"1x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@2x.png","scale":"2x"},{"size":"76x76","idiom":"ipad","filename":"Icon-App-76x76@1x.png","scale":"1x"},{"size":"76x76","idiom":"ipad","filename":"Icon-App-76x76@2x.png","scale":"2x"},{"size":"83.5x83.5","idiom":"ipad","filename":"Icon-App-83.5x83.5@2x.png","scale":"2x"},{"size":"1024x1024","idiom":"ios-marketing","filename":"Icon-App-1024x1024@1x.png","scale":"1x"}],"info":{"version":1,"author":"xcode"}}
|
||||
|
After Width: | Height: | Size: 280 KiB |
|
After Width: | Height: | Size: 1.0 KiB |
|
After Width: | Height: | Size: 3.0 KiB |
|
After Width: | Height: | Size: 5.3 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 5.1 KiB |
|
After Width: | Height: | Size: 9.2 KiB |
|
After Width: | Height: | Size: 3.0 KiB |
|
After Width: | Height: | Size: 8.2 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 4.1 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 4.9 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 6.9 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 7.6 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 23 KiB |
@ -94,6 +94,7 @@ abstract class FakeData {
|
||||
..trackNumber = 1
|
||||
..type = "type"
|
||||
..uri = "uri"
|
||||
..externalIds = externalIds
|
||||
..isPlayable = true
|
||||
..explicit = false
|
||||
..linkedFrom = trackLink;
|
||||
|
||||
@ -1,4 +1,3 @@
|
||||
import 'package:flutter/material.dart' show showModalBottomSheet;
|
||||
import 'package:shadcn_flutter/shadcn_flutter.dart';
|
||||
import 'package:shadcn_flutter/shadcn_flutter_extension.dart';
|
||||
import 'package:spotube/collections/spotube_icons.dart';
|
||||
@ -26,7 +25,7 @@ class AdaptiveMenuButton<T> extends MenuButton {
|
||||
|
||||
/// An adaptive widget that shows a [PopupMenuButton] when screen size is above
|
||||
/// or equal to 640px
|
||||
/// In smaller screen, a [IconButton] with a [showModalBottomSheet] is shown
|
||||
/// In smaller screen, a [IconButton] with a [openDrawer] is shown
|
||||
class AdaptivePopSheetList<T> extends StatelessWidget {
|
||||
final List<AdaptiveMenuButton<T>> Function(BuildContext context) items;
|
||||
final Widget? icon;
|
||||
@ -39,7 +38,7 @@ class AdaptivePopSheetList<T> extends StatelessWidget {
|
||||
|
||||
final Offset offset;
|
||||
|
||||
final ButtonVariance variance;
|
||||
final AbstractButtonStyle variance;
|
||||
|
||||
const AdaptivePopSheetList({
|
||||
super.key,
|
||||
@ -92,23 +91,23 @@ class AdaptivePopSheetList<T> extends StatelessWidget {
|
||||
// ),
|
||||
position: position,
|
||||
builder: (context) {
|
||||
return DropdownMenu(
|
||||
children: childrenModified(context),
|
||||
return WidgetStatesProvider.boundary(
|
||||
child: DropdownMenu(
|
||||
children: childrenModified(context),
|
||||
),
|
||||
);
|
||||
},
|
||||
).future;
|
||||
return;
|
||||
}
|
||||
|
||||
showModalBottomSheet(
|
||||
await openDrawer(
|
||||
context: context,
|
||||
enableDrag: true,
|
||||
draggable: true,
|
||||
showDragHandle: true,
|
||||
useRootNavigator: true,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: context.theme.borderRadiusMd,
|
||||
),
|
||||
backgroundColor: context.theme.colorScheme.card,
|
||||
position: OverlayPosition.bottom,
|
||||
borderRadius: context.theme.borderRadiusMd,
|
||||
transformBackdrop: false,
|
||||
builder: (context) {
|
||||
final children = childrenModified(context);
|
||||
return ListView.builder(
|
||||
@ -125,7 +124,7 @@ class AdaptivePopSheetList<T> extends StatelessWidget {
|
||||
onPressed: () {
|
||||
data.onPressed?.call(context);
|
||||
if (data.autoClose) {
|
||||
Navigator.of(context).pop();
|
||||
closeDrawer(context);
|
||||
}
|
||||
},
|
||||
leading: data.leading,
|
||||
|
||||
@ -13,7 +13,7 @@ class HeartButton extends HookConsumerWidget {
|
||||
final IconData? icon;
|
||||
final Color? color;
|
||||
final String? tooltip;
|
||||
final ButtonVariance variance;
|
||||
final AbstractButtonStyle variance;
|
||||
final ButtonSize size;
|
||||
const HeartButton({
|
||||
required this.isLiked,
|
||||
|
||||
@ -1,7 +1,6 @@
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:shadcn_flutter/shadcn_flutter.dart';
|
||||
import 'package:spotube/extensions/button_variance.dart';
|
||||
|
||||
class ShadcnWindowButton extends StatelessWidget {
|
||||
final Widget icon;
|
||||
@ -22,7 +21,7 @@ class ShadcnWindowButton extends StatelessWidget {
|
||||
height: 32,
|
||||
child: IconButton(
|
||||
variance: ButtonVariance.ghost.copyWith(
|
||||
decoration: (context, states) {
|
||||
decoration: (context, states, value) {
|
||||
final decoration = ButtonVariance.ghost.decoration(context, states)
|
||||
as BoxDecoration;
|
||||
if (hoverBackgroundColor != null &&
|
||||
|
||||
@ -74,6 +74,26 @@ class TrackPresentationActionsSection extends HookConsumerWidget {
|
||||
ref.watch(presentationStateProvider(options.collection).notifier);
|
||||
final selectedTracks = state.selectedTracks;
|
||||
|
||||
Future<void> actionDownloadTracks({
|
||||
required BuildContext context,
|
||||
required List<Track> tracks,
|
||||
required String action,
|
||||
}) async {
|
||||
final confirmed = audioSource == AudioSource.piped ||
|
||||
(await showDialog<bool>(
|
||||
context: context,
|
||||
builder: (context) {
|
||||
return const ConfirmDownloadDialog();
|
||||
},
|
||||
) ??
|
||||
false);
|
||||
if (confirmed != true) return;
|
||||
downloader.batchAddToQueue(tracks);
|
||||
notifier.deselectAllTracks();
|
||||
if (!context.mounted) return;
|
||||
showToastForAction(context, action, tracks.length);
|
||||
}
|
||||
|
||||
return AdaptivePopSheetList(
|
||||
tooltip: context.l10n.more_actions,
|
||||
headings: [
|
||||
@ -95,22 +115,12 @@ class TrackPresentationActionsSection extends HookConsumerWidget {
|
||||
|
||||
switch (action) {
|
||||
case "download":
|
||||
{
|
||||
final confirmed = audioSource == AudioSource.piped ||
|
||||
(await showDialog<bool?>(
|
||||
context: context,
|
||||
builder: (context) {
|
||||
return const ConfirmDownloadDialog();
|
||||
},
|
||||
) ??
|
||||
false);
|
||||
if (confirmed != true) return;
|
||||
downloader.batchAddToQueue(tracks);
|
||||
notifier.deselectAllTracks();
|
||||
if (!context.mounted) return;
|
||||
showToastForAction(context, action, tracks.length);
|
||||
break;
|
||||
}
|
||||
await actionDownloadTracks(
|
||||
context: context,
|
||||
tracks: tracks,
|
||||
action: action,
|
||||
);
|
||||
break;
|
||||
case "add-to-playlist":
|
||||
{
|
||||
if (context.mounted) {
|
||||
|
||||
@ -57,7 +57,7 @@ class TrackPresentationTopSection extends HookConsumerWidget {
|
||||
Tooltip(
|
||||
tooltip: TooltipContainer(
|
||||
child: Text(context.l10n.shuffle_playlist),
|
||||
),
|
||||
).call,
|
||||
child: IconButton.secondary(
|
||||
icon: isLoading
|
||||
? const Center(
|
||||
@ -73,7 +73,7 @@ class TrackPresentationTopSection extends HookConsumerWidget {
|
||||
Tooltip(
|
||||
tooltip: TooltipContainer(
|
||||
child: Text(context.l10n.add_to_queue),
|
||||
),
|
||||
).call,
|
||||
child: IconButton.secondary(
|
||||
icon: const Icon(SpotubeIcons.queueAdd),
|
||||
enabled: !isLoading && !isActive,
|
||||
@ -126,7 +126,7 @@ class TrackPresentationTopSection extends HookConsumerWidget {
|
||||
Tooltip(
|
||||
tooltip: TooltipContainer(
|
||||
child: Text(context.l10n.share),
|
||||
),
|
||||
).call,
|
||||
child: IconButton.outline(
|
||||
icon: const Icon(SpotubeIcons.share),
|
||||
size: ButtonSize.small,
|
||||
|
||||
@ -91,24 +91,14 @@ class TrackOptions extends HookConsumerWidget {
|
||||
) {
|
||||
/// showDialog doesn't work for some reason. So we have to
|
||||
/// manually push a Dialog Route in the Navigator to get it working
|
||||
Navigator.push(
|
||||
context,
|
||||
DialogRoute(
|
||||
alignment: Alignment.bottomCenter,
|
||||
transitionBuilder: (context, animation, secondaryAnimation, child) {
|
||||
return FadeTransition(opacity: animation, child: child);
|
||||
},
|
||||
context: context,
|
||||
barrierColor: Colors.black.withValues(alpha: 0.5),
|
||||
builder: (context) {
|
||||
return Center(
|
||||
child: PlaylistAddTrackDialog(
|
||||
tracks: [track],
|
||||
openFromPlaylist: playlistId,
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) {
|
||||
return PlaylistAddTrackDialog(
|
||||
tracks: [track],
|
||||
openFromPlaylist: playlistId,
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
@ -338,6 +328,7 @@ class TrackOptions extends HookConsumerWidget {
|
||||
}
|
||||
},
|
||||
icon: icon ?? const Icon(SpotubeIcons.moreHorizontal),
|
||||
variance: ButtonVariance.outline,
|
||||
headings: [
|
||||
Basic(
|
||||
leading: AspectRatio(
|
||||
|
||||
@ -5,7 +5,7 @@ import 'package:flutter/gestures.dart';
|
||||
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:shadcn_flutter/shadcn_flutter.dart';
|
||||
import 'package:shadcn_flutter/shadcn_flutter.dart' hide Consumer;
|
||||
import 'package:skeletonizer/skeletonizer.dart';
|
||||
import 'package:spotify/spotify.dart';
|
||||
import 'package:spotube/collections/routes.gr.dart';
|
||||
@ -17,7 +17,6 @@ import 'package:spotube/components/links/link_text.dart';
|
||||
import 'package:spotube/components/track_tile/track_options.dart';
|
||||
import 'package:spotube/components/ui/button_tile.dart';
|
||||
import 'package:spotube/extensions/artist_simple.dart';
|
||||
import 'package:spotube/extensions/button_variance.dart';
|
||||
import 'package:spotube/extensions/constrains.dart';
|
||||
import 'package:spotube/extensions/duration.dart';
|
||||
import 'package:spotube/extensions/image.dart';
|
||||
@ -108,7 +107,7 @@ class TrackTile extends HookConsumerWidget {
|
||||
? ButtonVariance.destructive
|
||||
: ButtonVariance.ghost)
|
||||
.copyWith(
|
||||
padding: (context, states) =>
|
||||
padding: (context, states, value) =>
|
||||
const EdgeInsets.symmetric(vertical: 8, horizontal: 0),
|
||||
),
|
||||
leading: Row(
|
||||
@ -229,7 +228,8 @@ class TrackTile extends HookConsumerWidget {
|
||||
Flexible(
|
||||
child: Button(
|
||||
style: ButtonVariance.link.copyWith(
|
||||
padding: (context, states) => EdgeInsets.zero,
|
||||
padding: (context, states, value) =>
|
||||
EdgeInsets.zero,
|
||||
),
|
||||
onPressed: () {
|
||||
context
|
||||
|
||||
@ -9,7 +9,7 @@ class ButtonTile extends StatelessWidget {
|
||||
final VoidCallback? onPressed;
|
||||
final VoidCallback? onLongPress;
|
||||
final bool selected;
|
||||
final ButtonVariance style;
|
||||
final AbstractButtonStyle style;
|
||||
final EdgeInsets? padding;
|
||||
|
||||
const ButtonTile({
|
||||
|
||||
@ -4,7 +4,9 @@ import 'dart:typed_data';
|
||||
import 'package:metadata_god/metadata_god.dart';
|
||||
import 'package:path/path.dart';
|
||||
import 'package:spotify/spotify.dart';
|
||||
import 'package:spotube/provider/spotify/spotify.dart';
|
||||
import 'package:spotube/services/audio_player/audio_player.dart';
|
||||
import 'package:spotube/services/logger/logger.dart';
|
||||
|
||||
extension TrackExtensions on Track {
|
||||
Track fromFile(
|
||||
@ -67,27 +69,40 @@ extension TrackExtensions on Track {
|
||||
}
|
||||
}
|
||||
|
||||
extension TrackSimpleExtensions on TrackSimple {
|
||||
Track asTrack(AlbumSimple album) {
|
||||
Track track = Track();
|
||||
track.name = name;
|
||||
track.album = album;
|
||||
track.artists = artists;
|
||||
track.availableMarkets = availableMarkets;
|
||||
track.discNumber = discNumber;
|
||||
track.durationMs = durationMs;
|
||||
track.explicit = explicit;
|
||||
track.externalUrls = externalUrls;
|
||||
track.href = href;
|
||||
track.id = id;
|
||||
track.isPlayable = isPlayable;
|
||||
track.linkedFrom = linkedFrom;
|
||||
track.name = name;
|
||||
track.previewUrl = previewUrl;
|
||||
track.trackNumber = trackNumber;
|
||||
track.type = type;
|
||||
track.uri = uri;
|
||||
return track;
|
||||
extension IterableTrackSimpleExtensions on Iterable<TrackSimple> {
|
||||
Future<List<Track>> asTracks(AlbumSimple album, ref) async {
|
||||
try {
|
||||
final spotify = ref.read(spotifyProvider);
|
||||
final tracks = await spotify.invoke(
|
||||
(api) => api.tracks.list(map((trackSimple) => trackSimple.id!).toList()));
|
||||
return tracks.toList();
|
||||
} catch (e, stack) {
|
||||
// Ignore errors and create the track locally
|
||||
AppLogger.reportError(e, stack);
|
||||
|
||||
List<Track> tracks = [];
|
||||
for (final trackSimple in this) {
|
||||
Track track = Track();
|
||||
track.album = album;
|
||||
track.name = trackSimple.name;
|
||||
track.artists = trackSimple.artists;
|
||||
track.availableMarkets = trackSimple.availableMarkets;
|
||||
track.discNumber = trackSimple.discNumber;
|
||||
track.durationMs = trackSimple.durationMs;
|
||||
track.explicit = trackSimple.explicit;
|
||||
track.externalUrls = trackSimple.externalUrls;
|
||||
track.href = trackSimple.href;
|
||||
track.id = trackSimple.id;
|
||||
track.isPlayable = trackSimple.isPlayable;
|
||||
track.linkedFrom = trackSimple.linkedFrom;
|
||||
track.previewUrl = trackSimple.previewUrl;
|
||||
track.trackNumber = trackSimple.trackNumber;
|
||||
track.type = trackSimple.type;
|
||||
track.uri = trackSimple.uri;
|
||||
tracks.add(track);
|
||||
}
|
||||
return tracks;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -62,7 +62,7 @@ class AppDatabase extends _$AppDatabase {
|
||||
AppDatabase() : super(_openConnection());
|
||||
|
||||
@override
|
||||
int get schemaVersion => 4;
|
||||
int get schemaVersion => 5;
|
||||
|
||||
@override
|
||||
MigrationStrategy get migration {
|
||||
@ -87,6 +87,33 @@ class AppDatabase extends _$AppDatabase {
|
||||
schema.preferencesTable.youtubeClientEngine,
|
||||
);
|
||||
},
|
||||
from4To5: (m, schema) async {
|
||||
final columnName = schema.preferencesTable.accentColorScheme
|
||||
.escapedNameFor(SqlDialect.sqlite);
|
||||
final columnNameOld =
|
||||
'"${schema.preferencesTable.accentColorScheme.name}_old"';
|
||||
final tableName = schema.preferencesTable.actualTableName;
|
||||
await customStatement(
|
||||
"ALTER TABLE $tableName "
|
||||
"RENAME COLUMN $columnName to $columnNameOld",
|
||||
);
|
||||
await customStatement(
|
||||
"ALTER TABLE $tableName "
|
||||
"ADD COLUMN $columnName TEXT NOT NULL DEFAULT 'Orange:0xFFf97315'",
|
||||
);
|
||||
await customStatement(
|
||||
"UPDATE $tableName "
|
||||
"SET $columnName = $columnNameOld",
|
||||
);
|
||||
await customStatement(
|
||||
"ALTER TABLE $tableName "
|
||||
"DROP COLUMN $columnNameOld",
|
||||
);
|
||||
await customStatement(
|
||||
"UPDATE $tableName "
|
||||
"SET $columnName = 'Orange:0xFFf97315' WHERE $columnName = 'Blue:0xFF2196F3'",
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@ -666,7 +666,7 @@ class $PreferencesTableTable extends PreferencesTable
|
||||
'accent_color_scheme', aliasedName, false,
|
||||
type: DriftSqlType.string,
|
||||
requiredDuringInsert: false,
|
||||
defaultValue: const Constant("Blue:0xFF2196F3"))
|
||||
defaultValue: const Constant("Orange:0xFFf97315"))
|
||||
.withConverter<SpotubeColor>(
|
||||
$PreferencesTableTable.$converteraccentColorScheme);
|
||||
static const VerificationMeta _layoutModeMeta =
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
import 'package:drift/internal/versioned_schema.dart' as i0;
|
||||
import 'package:drift/drift.dart' as i1;
|
||||
import 'package:drift/drift.dart';
|
||||
import 'package:shadcn_flutter/shadcn_flutter.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:spotify/spotify.dart';
|
||||
import 'package:spotube/models/database/database.dart';
|
||||
import 'package:spotube/services/sourced_track/enums.dart'; // ignore_for_file: type=lint,unused_import
|
||||
@ -1188,10 +1188,232 @@ i1.GeneratedColumn<String> _column_54(String aliasedName) =>
|
||||
i1.GeneratedColumn<String>('youtube_client_engine', aliasedName, false,
|
||||
type: i1.DriftSqlType.string,
|
||||
defaultValue: Constant(YoutubeClientEngine.youtubeExplode.name));
|
||||
|
||||
final class Schema5 extends i0.VersionedSchema {
|
||||
Schema5({required super.database}) : super(version: 5);
|
||||
@override
|
||||
late final List<i1.DatabaseSchemaEntity> entities = [
|
||||
authenticationTable,
|
||||
blacklistTable,
|
||||
preferencesTable,
|
||||
scrobblerTable,
|
||||
skipSegmentTable,
|
||||
sourceMatchTable,
|
||||
audioPlayerStateTable,
|
||||
playlistTable,
|
||||
playlistMediaTable,
|
||||
historyTable,
|
||||
lyricsTable,
|
||||
uniqueBlacklist,
|
||||
uniqTrackMatch,
|
||||
];
|
||||
late final Shape0 authenticationTable = Shape0(
|
||||
source: i0.VersionedTable(
|
||||
entityName: 'authentication_table',
|
||||
withoutRowId: false,
|
||||
isStrict: false,
|
||||
tableConstraints: [],
|
||||
columns: [
|
||||
_column_0,
|
||||
_column_1,
|
||||
_column_2,
|
||||
_column_3,
|
||||
],
|
||||
attachedDatabase: database,
|
||||
),
|
||||
alias: null);
|
||||
late final Shape1 blacklistTable = Shape1(
|
||||
source: i0.VersionedTable(
|
||||
entityName: 'blacklist_table',
|
||||
withoutRowId: false,
|
||||
isStrict: false,
|
||||
tableConstraints: [],
|
||||
columns: [
|
||||
_column_0,
|
||||
_column_4,
|
||||
_column_5,
|
||||
_column_6,
|
||||
],
|
||||
attachedDatabase: database,
|
||||
),
|
||||
alias: null);
|
||||
late final Shape12 preferencesTable = Shape12(
|
||||
source: i0.VersionedTable(
|
||||
entityName: 'preferences_table',
|
||||
withoutRowId: false,
|
||||
isStrict: false,
|
||||
tableConstraints: [],
|
||||
columns: [
|
||||
_column_0,
|
||||
_column_7,
|
||||
_column_8,
|
||||
_column_9,
|
||||
_column_10,
|
||||
_column_11,
|
||||
_column_12,
|
||||
_column_13,
|
||||
_column_14,
|
||||
_column_15,
|
||||
_column_55,
|
||||
_column_17,
|
||||
_column_18,
|
||||
_column_19,
|
||||
_column_20,
|
||||
_column_21,
|
||||
_column_22,
|
||||
_column_23,
|
||||
_column_24,
|
||||
_column_25,
|
||||
_column_26,
|
||||
_column_54,
|
||||
_column_27,
|
||||
_column_28,
|
||||
_column_29,
|
||||
_column_30,
|
||||
_column_31,
|
||||
_column_53,
|
||||
],
|
||||
attachedDatabase: database,
|
||||
),
|
||||
alias: null);
|
||||
late final Shape3 scrobblerTable = Shape3(
|
||||
source: i0.VersionedTable(
|
||||
entityName: 'scrobbler_table',
|
||||
withoutRowId: false,
|
||||
isStrict: false,
|
||||
tableConstraints: [],
|
||||
columns: [
|
||||
_column_0,
|
||||
_column_32,
|
||||
_column_33,
|
||||
_column_34,
|
||||
],
|
||||
attachedDatabase: database,
|
||||
),
|
||||
alias: null);
|
||||
late final Shape4 skipSegmentTable = Shape4(
|
||||
source: i0.VersionedTable(
|
||||
entityName: 'skip_segment_table',
|
||||
withoutRowId: false,
|
||||
isStrict: false,
|
||||
tableConstraints: [],
|
||||
columns: [
|
||||
_column_0,
|
||||
_column_35,
|
||||
_column_36,
|
||||
_column_37,
|
||||
_column_32,
|
||||
],
|
||||
attachedDatabase: database,
|
||||
),
|
||||
alias: null);
|
||||
late final Shape5 sourceMatchTable = Shape5(
|
||||
source: i0.VersionedTable(
|
||||
entityName: 'source_match_table',
|
||||
withoutRowId: false,
|
||||
isStrict: false,
|
||||
tableConstraints: [],
|
||||
columns: [
|
||||
_column_0,
|
||||
_column_37,
|
||||
_column_38,
|
||||
_column_39,
|
||||
_column_32,
|
||||
],
|
||||
attachedDatabase: database,
|
||||
),
|
||||
alias: null);
|
||||
late final Shape6 audioPlayerStateTable = Shape6(
|
||||
source: i0.VersionedTable(
|
||||
entityName: 'audio_player_state_table',
|
||||
withoutRowId: false,
|
||||
isStrict: false,
|
||||
tableConstraints: [],
|
||||
columns: [
|
||||
_column_0,
|
||||
_column_40,
|
||||
_column_41,
|
||||
_column_42,
|
||||
_column_43,
|
||||
],
|
||||
attachedDatabase: database,
|
||||
),
|
||||
alias: null);
|
||||
late final Shape7 playlistTable = Shape7(
|
||||
source: i0.VersionedTable(
|
||||
entityName: 'playlist_table',
|
||||
withoutRowId: false,
|
||||
isStrict: false,
|
||||
tableConstraints: [],
|
||||
columns: [
|
||||
_column_0,
|
||||
_column_44,
|
||||
_column_45,
|
||||
],
|
||||
attachedDatabase: database,
|
||||
),
|
||||
alias: null);
|
||||
late final Shape8 playlistMediaTable = Shape8(
|
||||
source: i0.VersionedTable(
|
||||
entityName: 'playlist_media_table',
|
||||
withoutRowId: false,
|
||||
isStrict: false,
|
||||
tableConstraints: [],
|
||||
columns: [
|
||||
_column_0,
|
||||
_column_46,
|
||||
_column_47,
|
||||
_column_48,
|
||||
_column_49,
|
||||
],
|
||||
attachedDatabase: database,
|
||||
),
|
||||
alias: null);
|
||||
late final Shape9 historyTable = Shape9(
|
||||
source: i0.VersionedTable(
|
||||
entityName: 'history_table',
|
||||
withoutRowId: false,
|
||||
isStrict: false,
|
||||
tableConstraints: [],
|
||||
columns: [
|
||||
_column_0,
|
||||
_column_32,
|
||||
_column_50,
|
||||
_column_51,
|
||||
_column_52,
|
||||
],
|
||||
attachedDatabase: database,
|
||||
),
|
||||
alias: null);
|
||||
late final Shape10 lyricsTable = Shape10(
|
||||
source: i0.VersionedTable(
|
||||
entityName: 'lyrics_table',
|
||||
withoutRowId: false,
|
||||
isStrict: false,
|
||||
tableConstraints: [],
|
||||
columns: [
|
||||
_column_0,
|
||||
_column_37,
|
||||
_column_52,
|
||||
],
|
||||
attachedDatabase: database,
|
||||
),
|
||||
alias: null);
|
||||
final i1.Index uniqueBlacklist = i1.Index('unique_blacklist',
|
||||
'CREATE UNIQUE INDEX unique_blacklist ON blacklist_table (element_type, element_id)');
|
||||
final i1.Index uniqTrackMatch = i1.Index('uniq_track_match',
|
||||
'CREATE UNIQUE INDEX uniq_track_match ON source_match_table (track_id, source_id, source_type)');
|
||||
}
|
||||
|
||||
i1.GeneratedColumn<String> _column_55(String aliasedName) =>
|
||||
i1.GeneratedColumn<String>('accent_color_scheme', aliasedName, false,
|
||||
type: i1.DriftSqlType.string,
|
||||
defaultValue: const Constant("Orange:0xFFf97315"));
|
||||
i0.MigrationStepWithVersion migrationSteps({
|
||||
required Future<void> Function(i1.Migrator m, Schema2 schema) from1To2,
|
||||
required Future<void> Function(i1.Migrator m, Schema3 schema) from2To3,
|
||||
required Future<void> Function(i1.Migrator m, Schema4 schema) from3To4,
|
||||
required Future<void> Function(i1.Migrator m, Schema5 schema) from4To5,
|
||||
}) {
|
||||
return (currentVersion, database) async {
|
||||
switch (currentVersion) {
|
||||
@ -1210,6 +1432,11 @@ i0.MigrationStepWithVersion migrationSteps({
|
||||
final migrator = i1.Migrator(database, schema);
|
||||
await from3To4(migrator, schema);
|
||||
return 4;
|
||||
case 4:
|
||||
final schema = Schema5(database: database);
|
||||
final migrator = i1.Migrator(database, schema);
|
||||
await from4To5(migrator, schema);
|
||||
return 5;
|
||||
default:
|
||||
throw ArgumentError.value('Unknown migration from $currentVersion');
|
||||
}
|
||||
@ -1220,10 +1447,12 @@ i1.OnUpgrade stepByStep({
|
||||
required Future<void> Function(i1.Migrator m, Schema2 schema) from1To2,
|
||||
required Future<void> Function(i1.Migrator m, Schema3 schema) from2To3,
|
||||
required Future<void> Function(i1.Migrator m, Schema4 schema) from3To4,
|
||||
required Future<void> Function(i1.Migrator m, Schema5 schema) from4To5,
|
||||
}) =>
|
||||
i0.VersionedSchema.stepByStepHelper(
|
||||
step: migrationSteps(
|
||||
from1To2: from1To2,
|
||||
from2To3: from2To3,
|
||||
from3To4: from3To4,
|
||||
from4To5: from4To5,
|
||||
));
|
||||
|
||||
@ -79,7 +79,7 @@ class PreferencesTable extends Table {
|
||||
TextColumn get closeBehavior => textEnum<CloseBehavior>()
|
||||
.withDefault(Constant(CloseBehavior.close.name))();
|
||||
TextColumn get accentColorScheme => text()
|
||||
.withDefault(const Constant("Blue:0xFF2196F3"))
|
||||
.withDefault(const Constant("Orange:0xFFf97315"))
|
||||
.map(const SpotubeColorConverter())();
|
||||
TextColumn get layoutMode =>
|
||||
textEnum<LayoutMode>().withDefault(Constant(LayoutMode.adaptive.name))();
|
||||
@ -130,7 +130,7 @@ class PreferencesTable extends Table {
|
||||
systemTitleBar: false,
|
||||
skipNonMusic: false,
|
||||
closeBehavior: CloseBehavior.close,
|
||||
accentColorScheme: SpotubeColor(Colors.blue.value, name: "Blue"),
|
||||
accentColorScheme: SpotubeColor(Colors.orange.value, name: "Orange"),
|
||||
layoutMode: LayoutMode.adaptive,
|
||||
locale: const Locale("system", "system"),
|
||||
market: Market.US,
|
||||
|
||||
@ -54,7 +54,7 @@ class AlbumCard extends HookConsumerWidget {
|
||||
|
||||
Future<List<Track>> fetchAllTrack() async {
|
||||
if (album.tracks != null && album.tracks!.isNotEmpty) {
|
||||
return album.tracks!.map((track) => track.asTrack(album)).toList();
|
||||
return album.tracks!.asTracks(album, ref);
|
||||
}
|
||||
await ref.read(albumTracksProvider(album).future);
|
||||
return ref.read(albumTracksProvider(album).notifier).fetchAll();
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
import 'package:auto_route/auto_route.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:shadcn_flutter/shadcn_flutter.dart';
|
||||
import 'package:shadcn_flutter/shadcn_flutter.dart' hide Consumer;
|
||||
import 'package:spotify/spotify.dart' hide Image;
|
||||
import 'package:spotube/collections/env.dart';
|
||||
import 'package:spotube/collections/routes.gr.dart';
|
||||
|
||||
@ -2,7 +2,7 @@ import 'package:auto_route/auto_route.dart';
|
||||
import 'package:auto_size_text/auto_size_text.dart';
|
||||
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:shadcn_flutter/shadcn_flutter.dart';
|
||||
import 'package:shadcn_flutter/shadcn_flutter.dart' hide Consumer;
|
||||
import 'package:sliding_up_panel/sliding_up_panel.dart';
|
||||
|
||||
import 'package:spotube/collections/assets.gen.dart';
|
||||
@ -132,7 +132,7 @@ class PlayerView extends HookConsumerWidget {
|
||||
Tooltip(
|
||||
tooltip: TooltipContainer(
|
||||
child: Text(context.l10n.details),
|
||||
),
|
||||
).call,
|
||||
child: IconButton.ghost(
|
||||
icon: const Icon(SpotubeIcons.info, size: 18),
|
||||
onPressed: currentTrack == null
|
||||
|
||||
@ -2,7 +2,7 @@ import 'package:auto_route/auto_route.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:shadcn_flutter/shadcn_flutter.dart';
|
||||
import 'package:shadcn_flutter/shadcn_flutter.dart' hide Consumer;
|
||||
import 'package:shadcn_flutter/shadcn_flutter_extension.dart';
|
||||
import 'package:spotube/collections/routes.gr.dart';
|
||||
|
||||
@ -82,7 +82,7 @@ class PlayerActions extends HookConsumerWidget {
|
||||
children: [
|
||||
if (showQueue)
|
||||
Tooltip(
|
||||
tooltip: TooltipContainer(child: Text(context.l10n.queue)),
|
||||
tooltip: TooltipContainer(child: Text(context.l10n.queue)).call,
|
||||
child: IconButton.ghost(
|
||||
icon: const Icon(SpotubeIcons.queue),
|
||||
enabled: playlist.activeTrack != null,
|
||||
@ -119,7 +119,8 @@ class PlayerActions extends HookConsumerWidget {
|
||||
if (!isLocalTrack)
|
||||
Tooltip(
|
||||
tooltip: TooltipContainer(
|
||||
child: Text(context.l10n.alternative_track_sources)),
|
||||
child: Text(context.l10n.alternative_track_sources),
|
||||
).call,
|
||||
child: IconButton.ghost(
|
||||
enabled: playlist.activeTrack != null,
|
||||
icon: const Icon(SpotubeIcons.alternativeRoute),
|
||||
@ -160,7 +161,8 @@ class PlayerActions extends HookConsumerWidget {
|
||||
else
|
||||
Tooltip(
|
||||
tooltip:
|
||||
TooltipContainer(child: Text(context.l10n.download_track)),
|
||||
TooltipContainer(child: Text(context.l10n.download_track))
|
||||
.call,
|
||||
child: IconButton.ghost(
|
||||
icon: Icon(
|
||||
isDownloaded ? SpotubeIcons.done : SpotubeIcons.download,
|
||||
|
||||
@ -3,7 +3,7 @@ import 'package:flutter_hooks/flutter_hooks.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:media_kit/media_kit.dart';
|
||||
import 'package:palette_generator/palette_generator.dart';
|
||||
import 'package:shadcn_flutter/shadcn_flutter.dart';
|
||||
import 'package:shadcn_flutter/shadcn_flutter.dart' hide Consumer;
|
||||
|
||||
import 'package:spotube/collections/spotube_icons.dart';
|
||||
import 'package:spotube/collections/intents.dart';
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:shadcn_flutter/shadcn_flutter.dart';
|
||||
import 'package:shadcn_flutter/shadcn_flutter.dart' hide Consumer;
|
||||
import 'package:sliding_up_panel/sliding_up_panel.dart';
|
||||
import 'package:spotube/collections/intents.dart';
|
||||
import 'package:spotube/collections/spotube_icons.dart';
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
import 'package:auto_route/auto_route.dart';
|
||||
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:shadcn_flutter/shadcn_flutter.dart';
|
||||
import 'package:shadcn_flutter/shadcn_flutter.dart' hide Consumer;
|
||||
import 'package:spotify/spotify.dart' hide Offset, Image;
|
||||
import 'package:spotube/collections/env.dart';
|
||||
import 'package:spotube/collections/routes.gr.dart';
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
import 'package:auto_route/auto_route.dart';
|
||||
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:shadcn_flutter/shadcn_flutter.dart';
|
||||
import 'package:shadcn_flutter/shadcn_flutter.dart' hide Consumer;
|
||||
import 'package:shadcn_flutter/shadcn_flutter_extension.dart';
|
||||
|
||||
import 'package:spotube/collections/assets.gen.dart';
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
import 'package:auto_size_text/auto_size_text.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:shadcn_flutter/shadcn_flutter.dart';
|
||||
import 'package:shadcn_flutter/shadcn_flutter.dart' hide Consumer;
|
||||
import 'package:skeletonizer/skeletonizer.dart';
|
||||
import 'package:spotube/collections/fake.dart';
|
||||
import 'package:spotube/collections/spotube_icons.dart';
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
import 'package:auto_route/auto_route.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:shadcn_flutter/shadcn_flutter.dart';
|
||||
import 'package:shadcn_flutter/shadcn_flutter.dart' hide Consumer;
|
||||
import 'package:shadcn_flutter/shadcn_flutter_extension.dart';
|
||||
import 'package:spotube/collections/routes.gr.dart';
|
||||
import 'package:spotube/collections/spotube_icons.dart';
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:shadcn_flutter/shadcn_flutter.dart';
|
||||
import 'package:shadcn_flutter/shadcn_flutter.dart' hide Consumer;
|
||||
import 'package:shadcn_flutter/shadcn_flutter_extension.dart';
|
||||
|
||||
import 'package:spotube/components/titlebar/titlebar.dart';
|
||||
|
||||
@ -2,7 +2,7 @@ import 'package:flutter_hooks/flutter_hooks.dart';
|
||||
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:palette_generator/palette_generator.dart';
|
||||
import 'package:shadcn_flutter/shadcn_flutter.dart';
|
||||
import 'package:shadcn_flutter/shadcn_flutter.dart' hide Consumer;
|
||||
import 'package:shadcn_flutter/shadcn_flutter_extension.dart';
|
||||
import 'package:spotube/collections/routes.gr.dart';
|
||||
import 'package:spotube/collections/spotube_icons.dart';
|
||||
|
||||
@ -125,28 +125,34 @@ class SearchPage extends HookConsumerWidget {
|
||||
child: TextField(
|
||||
autofocus: true,
|
||||
controller: controller,
|
||||
leading:
|
||||
const Icon(SpotubeIcons.search),
|
||||
textInputAction: TextInputAction.search,
|
||||
placeholder: Text(context.l10n.search),
|
||||
trailing: AnimatedCrossFade(
|
||||
duration:
|
||||
const Duration(milliseconds: 300),
|
||||
crossFadeState:
|
||||
controller.text.isNotEmpty
|
||||
features: [
|
||||
const InputFeature.leading(
|
||||
Icon(SpotubeIcons.search),
|
||||
),
|
||||
InputFeature.trailing(
|
||||
AnimatedCrossFade(
|
||||
duration: const Duration(
|
||||
milliseconds: 300),
|
||||
crossFadeState: controller
|
||||
.text.isNotEmpty
|
||||
? CrossFadeState.showFirst
|
||||
: CrossFadeState.showSecond,
|
||||
firstChild: IconButton.ghost(
|
||||
size: ButtonSize.small,
|
||||
icon:
|
||||
const Icon(SpotubeIcons.close),
|
||||
onPressed: () {
|
||||
controller.clear();
|
||||
},
|
||||
),
|
||||
secondChild: const SizedBox.square(
|
||||
dimension: 28),
|
||||
),
|
||||
firstChild: IconButton.ghost(
|
||||
size: ButtonSize.small,
|
||||
icon: const Icon(
|
||||
SpotubeIcons.close),
|
||||
onPressed: () {
|
||||
controller.clear();
|
||||
},
|
||||
),
|
||||
secondChild:
|
||||
const SizedBox.square(
|
||||
dimension: 28),
|
||||
),
|
||||
)
|
||||
],
|
||||
textInputAction: TextInputAction.search,
|
||||
placeholder: Text(context.l10n.search),
|
||||
onSubmitted: onSubmitted,
|
||||
),
|
||||
),
|
||||
|
||||
@ -11,7 +11,7 @@ import 'package:form_builder_validators/form_builder_validators.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:piped_client/piped_client.dart';
|
||||
import 'package:shadcn_flutter/shadcn_flutter.dart';
|
||||
import 'package:shadcn_flutter/shadcn_flutter.dart' hide Consumer;
|
||||
import 'package:spotube/collections/routes.gr.dart';
|
||||
import 'package:spotube/collections/spotube_icons.dart';
|
||||
import 'package:spotube/components/form/text_form_field.dart';
|
||||
@ -106,7 +106,7 @@ class SettingsPlaybackSection extends HookConsumerWidget {
|
||||
Tooltip(
|
||||
tooltip: TooltipContainer(
|
||||
child: Text(context.l10n.add_custom_url),
|
||||
),
|
||||
).call,
|
||||
child: IconButton.outline(
|
||||
icon: const Icon(SpotubeIcons.edit),
|
||||
size: ButtonSize.small,
|
||||
@ -261,7 +261,7 @@ class SettingsPlaybackSection extends HookConsumerWidget {
|
||||
Tooltip(
|
||||
tooltip: TooltipContainer(
|
||||
child: Text(context.l10n.add_custom_url),
|
||||
),
|
||||
).call,
|
||||
child: IconButton.outline(
|
||||
icon: const Icon(SpotubeIcons.edit),
|
||||
size: ButtonSize.small,
|
||||
|
||||
@ -128,7 +128,10 @@ class ServerPlaybackRoutes {
|
||||
.read(sourcedTrackProvider(SpotubeMedia(track)).notifier)
|
||||
.refreshStreamingUrl();
|
||||
|
||||
ref.read(activeSourcedTrackProvider.notifier).update(sourcedTrack);
|
||||
if (playlist.activeTrack?.id == sourcedTrack?.id &&
|
||||
sourcedTrack != null) {
|
||||
ref.read(activeSourcedTrackProvider.notifier).update(sourcedTrack);
|
||||
}
|
||||
|
||||
return await dio.get<Uint8List>(
|
||||
sourcedTrack!.url,
|
||||
@ -199,7 +202,10 @@ class ServerPlaybackRoutes {
|
||||
? activeSourcedTrack
|
||||
: await ref.read(sourcedTrackProvider(SpotubeMedia(track)).future);
|
||||
|
||||
ref.read(activeSourcedTrackProvider.notifier).update(sourcedTrack);
|
||||
if (playlist.activeTrack?.id == sourcedTrack?.id &&
|
||||
sourcedTrack != null) {
|
||||
ref.read(activeSourcedTrackProvider.notifier).update(sourcedTrack);
|
||||
}
|
||||
|
||||
final (bytes: audioBytes, response: res) =
|
||||
await streamTrack(sourcedTrack!, request.headers);
|
||||
|
||||
@ -33,7 +33,7 @@ class AlbumTracksNotifier extends AutoDisposeFamilyPaginatedAsyncNotifier<Track,
|
||||
final tracks = await spotify.invoke(
|
||||
(api) => api.albums.tracks(arg.id!).getPage(limit, offset),
|
||||
);
|
||||
final items = tracks.items?.map((e) => e.asTrack(arg)).toList() ?? [];
|
||||
final items = await tracks.items!.asTracks(arg, ref);
|
||||
|
||||
return (
|
||||
items: items,
|
||||
|
||||
@ -90,9 +90,9 @@ class UserPreferencesNotifier extends Notifier<PreferencesTableData> {
|
||||
Future<void> reset() async {
|
||||
final db = ref.read(databaseProvider);
|
||||
|
||||
final query = db.update(db.preferencesTable)..where((t) => t.id.equals(0));
|
||||
final query = db.update(db.preferencesTable);
|
||||
|
||||
await query.replace(PreferencesTableCompanion.insert());
|
||||
await query.replace(PreferencesTableCompanion.insert(id: const Value(0)));
|
||||
}
|
||||
|
||||
static Future<String> getMusicCacheDir() async {
|
||||
|
||||
@ -236,32 +236,75 @@ class YoutubeSourcedTrack extends SourcedTrack {
|
||||
.toList();
|
||||
}
|
||||
|
||||
static Future<List<YoutubeVideoInfo>> fetchFromIsrc({
|
||||
required Track track,
|
||||
required Ref ref,
|
||||
}) async {
|
||||
final isrcResults = <YoutubeVideoInfo>[];
|
||||
final isrc = track.externalIds?.isrc;
|
||||
if (isrc != null && isrc.isNotEmpty) {
|
||||
final searchedVideos =
|
||||
await ref.read(youtubeEngineProvider).searchVideos(isrc.toString());
|
||||
if (searchedVideos.isNotEmpty) {
|
||||
isrcResults.addAll(searchedVideos
|
||||
.map<YoutubeVideoInfo>(YoutubeVideoInfo.fromVideo)
|
||||
.map((YoutubeVideoInfo videoInfo) {
|
||||
final ytWords = videoInfo.title
|
||||
.toLowerCase()
|
||||
.replaceAll(RegExp(r'[^\p{L}\p{N}\p{Z}]+', unicode: true), '')
|
||||
.split(RegExp(r'\p{Z}+', unicode: true))
|
||||
.where((item) => item.isNotEmpty);
|
||||
final spWords = track.name!
|
||||
.toLowerCase()
|
||||
.replaceAll(RegExp(r'[^\p{L}\p{N}\p{Z}]+', unicode: true), '')
|
||||
.split(RegExp(r'\p{Z}+', unicode: true))
|
||||
.where((item) => item.isNotEmpty);
|
||||
// Single word and duration match with 3 second tolerance
|
||||
if (ytWords.any((word) => spWords.contains(word)) &&
|
||||
(videoInfo.duration - track.duration!)
|
||||
.abs().inMilliseconds <= 3000) {
|
||||
return videoInfo;
|
||||
}
|
||||
return null;
|
||||
})
|
||||
.whereType<YoutubeVideoInfo>()
|
||||
.toList());
|
||||
}
|
||||
}
|
||||
return isrcResults;
|
||||
}
|
||||
|
||||
static Future<List<SiblingType>> fetchSiblings({
|
||||
required Track track,
|
||||
required Ref ref,
|
||||
}) async {
|
||||
final links = await SongLinkService.links(track.id!);
|
||||
final ytLink = links.firstWhereOrNull((link) => link.platform == "youtube");
|
||||
final videoResults = <YoutubeVideoInfo>[];
|
||||
|
||||
if (ytLink?.url != null
|
||||
// allows to fetch siblings more results for already sourced track
|
||||
&&
|
||||
track is! SourcedTrack) {
|
||||
try {
|
||||
return [
|
||||
await toSiblingType(
|
||||
0,
|
||||
YoutubeVideoInfo.fromVideo(
|
||||
await ref.read(youtubeEngineProvider).getVideo(
|
||||
Uri.parse(ytLink!.url!).queryParameters["v"]!,
|
||||
),
|
||||
),
|
||||
ref,
|
||||
)
|
||||
];
|
||||
} on VideoUnplayableException catch (e, stack) {
|
||||
// Ignore this error and continue with the search
|
||||
AppLogger.reportError(e, stack);
|
||||
if (track is! SourcedTrack) {
|
||||
final isrcResults = await fetchFromIsrc(
|
||||
track: track,
|
||||
ref: ref,
|
||||
);
|
||||
|
||||
videoResults.addAll(isrcResults);
|
||||
|
||||
if (isrcResults.isEmpty) {
|
||||
final links = await SongLinkService.links(track.id!);
|
||||
final ytLink = links.firstWhereOrNull(
|
||||
(link) => link.platform == "youtube",
|
||||
);
|
||||
if (ytLink?.url != null) {
|
||||
try {
|
||||
videoResults.add(
|
||||
YoutubeVideoInfo.fromVideo(await ref
|
||||
.read(youtubeEngineProvider)
|
||||
.getVideo(Uri.parse(ytLink!.url!).queryParameters["v"]!)),
|
||||
);
|
||||
} on VideoUnplayableException catch (e, stack) {
|
||||
// Ignore this error and continue with the search
|
||||
AppLogger.reportError(e, stack);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -271,20 +314,27 @@ class YoutubeSourcedTrack extends SourcedTrack {
|
||||
await ref.read(youtubeEngineProvider).searchVideos(query);
|
||||
|
||||
if (ServiceUtils.onlyContainsEnglish(query)) {
|
||||
return await Future.wait(searchResults
|
||||
.map(YoutubeVideoInfo.fromVideo)
|
||||
.mapIndexed((index, info) => toSiblingType(index, info, ref)));
|
||||
videoResults
|
||||
.addAll(searchResults.map(YoutubeVideoInfo.fromVideo).toList());
|
||||
} else {
|
||||
videoResults.addAll(rankResults(
|
||||
searchResults.map(YoutubeVideoInfo.fromVideo).toList(),
|
||||
track,
|
||||
));
|
||||
}
|
||||
|
||||
final rankedSiblings = rankResults(
|
||||
searchResults.map(YoutubeVideoInfo.fromVideo).toList(),
|
||||
track,
|
||||
);
|
||||
|
||||
final seenIds = <String>{};
|
||||
int index = 0;
|
||||
return await Future.wait(
|
||||
rankedSiblings
|
||||
.mapIndexed((index, info) => toSiblingType(index, info, ref)),
|
||||
);
|
||||
videoResults.map((videoResult) async {
|
||||
// Deduplicate results
|
||||
if (!seenIds.contains(videoResult.id)) {
|
||||
seenIds.add(videoResult.id);
|
||||
return await toSiblingType(index++, videoResult, ref);
|
||||
}
|
||||
return null;
|
||||
}),
|
||||
).then((s) => s.whereType<SiblingType>().toList());
|
||||
}
|
||||
|
||||
@override
|
||||
|
||||
@ -32,6 +32,7 @@ function(APPLY_STANDARD_SETTINGS TARGET)
|
||||
target_compile_options(${TARGET} PRIVATE -Wall -Werror)
|
||||
target_compile_options(${TARGET} PRIVATE "$<$<NOT:$<CONFIG:Debug>>:-O3>")
|
||||
target_compile_definitions(${TARGET} PRIVATE "$<$<NOT:$<CONFIG:Debug>>:NDEBUG>")
|
||||
target_compile_options(${TARGET} PRIVATE -Wno-error=deprecated-declarations)
|
||||
endfunction()
|
||||
|
||||
set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter")
|
||||
|
||||
@ -168,7 +168,7 @@ EXTERNAL SOURCES:
|
||||
:path: Flutter/ephemeral/.symlinks/plugins/window_manager/macos
|
||||
|
||||
SPEC CHECKSUMS:
|
||||
app_links: 9028728e32c83a0831d9db8cf91c526d16cc5468
|
||||
app_links: afe860c55c7ef176cea7fb630a2b7d7736de591d
|
||||
audio_service: 0d9e4e25347bb3efb768f3b9f005911a81e587a7
|
||||
audio_session: 48ab6500f7a5e7c64363e206565a5dfe5a0c1441
|
||||
bonsoir_darwin: 29c7ccf356646118844721f36e1de4b61f6cbd0e
|
||||
|
||||
|
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 271 KiB |
|
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 9.9 KiB |
|
Before Width: | Height: | Size: 499 B After Width: | Height: | Size: 514 B |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.2 KiB |