From 122d2da700c276b3d74ccbe9fbffb175c6faabb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20P=C3=A9rez?= Date: Thu, 26 May 2022 20:10:50 -0300 Subject: [PATCH] Fixed a package.json error --- android/app/src/main/AndroidManifest.xml | 10 +++ .../java/tech/logica10/soniclair/Globals.java | 20 ++++-- ...tObserver.java => IBroadcastObserver.java} | 2 +- .../logica10/soniclair/IMediaItemSource.java | 9 +++ .../tech/logica10/soniclair/MediaBrowser.java | 55 ++++++++++++++++ .../soniclair/MediaBrowserPlugin.java | 59 ++++++++++++++++++ .../soniclair/MediaSessionPlugin.java | 47 +------------- .../soniclair/SonicLairSessionCallbacks.java | 48 ++++++++++++++ .../res/drawable-hdpi/ic_stat_soniclair.png | Bin 0 -> 675 bytes .../res/drawable-mdpi/ic_stat_soniclair.png | Bin 0 -> 472 bytes .../res/drawable-xhdpi/ic_stat_soniclair.png | Bin 0 -> 982 bytes .../res/drawable-xxhdpi/ic_stat_soniclair.png | Bin 0 -> 1392 bytes .../drawable-xxxhdpi/ic_stat_soniclair.png | Bin 0 -> 2087 bytes build-pwa.ps1 | 2 + package-lock.json | 10 --- src/Components/Artist.tsx | 1 - src/Components/Home.tsx | 25 +++++--- src/Plugins/MediaBrowser.ts | 8 +++ 18 files changed, 226 insertions(+), 70 deletions(-) rename android/app/src/main/java/tech/logica10/soniclair/{BroadcastObserver.java => IBroadcastObserver.java} (66%) create mode 100644 android/app/src/main/java/tech/logica10/soniclair/IMediaItemSource.java create mode 100644 android/app/src/main/java/tech/logica10/soniclair/MediaBrowser.java create mode 100644 android/app/src/main/java/tech/logica10/soniclair/MediaBrowserPlugin.java create mode 100644 android/app/src/main/java/tech/logica10/soniclair/SonicLairSessionCallbacks.java create mode 100644 android/app/src/main/res/drawable-hdpi/ic_stat_soniclair.png create mode 100644 android/app/src/main/res/drawable-mdpi/ic_stat_soniclair.png create mode 100644 android/app/src/main/res/drawable-xhdpi/ic_stat_soniclair.png create mode 100644 android/app/src/main/res/drawable-xxhdpi/ic_stat_soniclair.png create mode 100644 android/app/src/main/res/drawable-xxxhdpi/ic_stat_soniclair.png create mode 100644 build-pwa.ps1 create mode 100644 src/Plugins/MediaBrowser.ts diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 59f7ae3..2a4f7c0 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -11,6 +11,16 @@ android:theme="@style/AppTheme" android:usesCleartextTraffic="true"> + + + + + + + + observers; + private List observers; + private ArrayList mediaItems; // Constructor // Here we will be creating private constructor // restricted to this class itself private Globals() { - observers = new ArrayList(); + mediaItems = new ArrayList(); + observers = new ArrayList(); } // Static method @@ -29,13 +33,21 @@ public class Globals { return single_instance; } - public static void RegisterObserver(BroadcastObserver observer){ + public static void RegisterObserver(IBroadcastObserver observer){ getInstance().observers.add(observer); } public static void NotifyObservers(String action){ - for (BroadcastObserver observer : getInstance().observers) { + for (IBroadcastObserver observer : getInstance().observers) { observer.update(action); } } + + public static ArrayList GetMediaItems(){ + return getInstance().mediaItems; + } + + public static void SetMediaItems(ArrayList mediaItemArray) { + getInstance().mediaItems = mediaItemArray; + } } diff --git a/android/app/src/main/java/tech/logica10/soniclair/BroadcastObserver.java b/android/app/src/main/java/tech/logica10/soniclair/IBroadcastObserver.java similarity index 66% rename from android/app/src/main/java/tech/logica10/soniclair/BroadcastObserver.java rename to android/app/src/main/java/tech/logica10/soniclair/IBroadcastObserver.java index b8d122b..6359680 100644 --- a/android/app/src/main/java/tech/logica10/soniclair/BroadcastObserver.java +++ b/android/app/src/main/java/tech/logica10/soniclair/IBroadcastObserver.java @@ -1,5 +1,5 @@ package tech.logica10.soniclair; -public interface BroadcastObserver { +public interface IBroadcastObserver { public void update(String action); } diff --git a/android/app/src/main/java/tech/logica10/soniclair/IMediaItemSource.java b/android/app/src/main/java/tech/logica10/soniclair/IMediaItemSource.java new file mode 100644 index 0000000..2448910 --- /dev/null +++ b/android/app/src/main/java/tech/logica10/soniclair/IMediaItemSource.java @@ -0,0 +1,9 @@ +package tech.logica10.soniclair; + +import android.media.browse.MediaBrowser; + +import java.util.ArrayList; + +public interface IMediaItemSource { + public ArrayList getItems(); +} diff --git a/android/app/src/main/java/tech/logica10/soniclair/MediaBrowser.java b/android/app/src/main/java/tech/logica10/soniclair/MediaBrowser.java new file mode 100644 index 0000000..20decf6 --- /dev/null +++ b/android/app/src/main/java/tech/logica10/soniclair/MediaBrowser.java @@ -0,0 +1,55 @@ +package tech.logica10.soniclair; + +import android.media.session.MediaSession; +import android.media.session.PlaybackState; +import android.os.Bundle; +import android.service.media.MediaBrowserService; +import android.text.TextUtils; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import java.util.ArrayList; +import java.util.List; + +public class MediaBrowser extends MediaBrowserService { + private static final String MY_MEDIA_ROOT_ID = "media_root_id"; + private static final String MY_EMPTY_MEDIA_ROOT_ID = "empty_root_id"; + + private MediaSession mediaSession; + private PlaybackState.Builder stateBuilder; + + @Override + public void onCreate() { + super.onCreate(); + + // Create a MediaSessionCompat + mediaSession = new MediaSession(MainActivity.context, "SONICLAIR"); + +// // Set an initial PlaybackState with ACTION_PLAY, so media buttons can start the player +// stateBuilder = new PlaybackState.Builder() +// .setActions( +// PlaybackStateCompat.ACTION_PLAY | +// PlaybackStateCompat.ACTION_PLAY_PAUSE); + mediaSession.setPlaybackState(stateBuilder.build()); + + // MySessionCallback() has methods that handle callbacks from a media controller + mediaSession.setCallback(new SonicLairSessionCallbacks()); + + // Set the session's token so that client activities can communicate with it. + setSessionToken(mediaSession.getSessionToken()); + } + + @Nullable + @Override + public BrowserRoot onGetRoot(@NonNull String clientPackageName, int clientUid, @Nullable Bundle rootHints) { + return new BrowserRoot("sonicLairRoot",null); + } + + @Override + public void onLoadChildren(@NonNull String parentMediaId, @NonNull Result> result) { + // Assume for example that the music catalog is already loaded/cached. + List mediaItems = Globals.GetMediaItems(); + result.sendResult(mediaItems); + } +} diff --git a/android/app/src/main/java/tech/logica10/soniclair/MediaBrowserPlugin.java b/android/app/src/main/java/tech/logica10/soniclair/MediaBrowserPlugin.java new file mode 100644 index 0000000..9d2c1a1 --- /dev/null +++ b/android/app/src/main/java/tech/logica10/soniclair/MediaBrowserPlugin.java @@ -0,0 +1,59 @@ +package tech.logica10.soniclair; + +import android.graphics.Bitmap; +import android.media.MediaDescription; +import android.media.browse.MediaBrowser; +import android.net.Uri; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.FutureTarget; +import com.getcapacitor.JSArray; +import com.getcapacitor.Plugin; +import com.getcapacitor.PluginCall; +import com.getcapacitor.PluginMethod; + +import org.json.JSONException; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutionException; + +public class MediaBrowserPlugin extends Plugin { + ArrayList mediaItems; + + @Override + public void load(){ + mediaItems = new ArrayList<>(); + } + + @PluginMethod + public void loadItems(PluginCall call) throws JSONException, ExecutionException, InterruptedException { + JSArray array = call.getArray("items"); + List itemArray = array.toList(); + ArrayList mediaItemArray = new ArrayList(); + MediaDescription.Builder builder = new MediaDescription.Builder(); + for(MediaItemJson item: itemArray){ + builder.setTitle(item.song); + builder.setSubtitle(String.format("by %s", item.artist)); + Uri albumArtUri = Uri.parse(item.albumArt); + FutureTarget futureBitmap = Glide.with(MainActivity.context) + .asBitmap() + .load(albumArtUri) + .submit(); + Bitmap albumArtBitmap = futureBitmap.get(); + builder.setIconBitmap(albumArtBitmap); + builder.setMediaId(item.id); + mediaItemArray.add(new MediaBrowser.MediaItem(builder.build(), MediaBrowser.MediaItem.FLAG_PLAYABLE)); + } + Globals.SetMediaItems(mediaItemArray); + } +} + +class MediaItemJson{ + public String artist; + public String album; + public String albumArt; + public String song; + public float duration; + public String id; +} \ No newline at end of file diff --git a/android/app/src/main/java/tech/logica10/soniclair/MediaSessionPlugin.java b/android/app/src/main/java/tech/logica10/soniclair/MediaSessionPlugin.java index 9d5b738..6850c73 100644 --- a/android/app/src/main/java/tech/logica10/soniclair/MediaSessionPlugin.java +++ b/android/app/src/main/java/tech/logica10/soniclair/MediaSessionPlugin.java @@ -12,7 +12,6 @@ import android.media.MediaMetadata; import android.media.session.MediaSession; import android.media.session.PlaybackState; import android.net.Uri; -import android.view.KeyEvent; import com.bumptech.glide.Glide; import com.bumptech.glide.request.FutureTarget; @@ -26,7 +25,7 @@ import java.util.Locale; import java.util.concurrent.ExecutionException; @CapacitorPlugin(name = "MediaSession") -public class MediaSessionPlugin extends Plugin implements BroadcastObserver { +public class MediaSessionPlugin extends Plugin implements IBroadcastObserver { private MediaSession mediaSession; private Notification.Style mediaStyle; @@ -105,6 +104,7 @@ public class MediaSessionPlugin extends Plugin implements BroadcastObserver { call.resolve(); } + @PluginMethod() public void pause(PluginCall call) { stateBuilder.setState(PlaybackState.STATE_PAUSED, PlaybackState.PLAYBACK_POSITION_UNKNOWN, 1); mediaSession.setPlaybackState(stateBuilder.build()); @@ -127,7 +127,7 @@ public class MediaSessionPlugin extends Plugin implements BroadcastObserver { metadataBuilder.putString(MediaMetadata.METADATA_KEY_ARTIST, call.getString("artist")); metadataBuilder.putString(MediaMetadata.METADATA_KEY_TITLE, call.getString("song")); mediaSession.setMetadata(metadataBuilder.build()); - notificationBuilder.setSmallIcon(R.mipmap.ic_launcher); + notificationBuilder.setSmallIcon(R.drawable.ic_stat_soniclair); notificationBuilder.setLargeIcon(albumArtBitmap); notificationBuilder.setContentTitle(call.getString("song")); notificationBuilder.setContentText(call.getString("album")); @@ -146,48 +146,7 @@ public class MediaSessionPlugin extends Plugin implements BroadcastObserver { } - private class SonicLairSessionCallbacks extends MediaSession.Callback { - @Override - public void onPlay() { - super.onPlay(); - Globals.NotifyObservers("SLPAUSE"); - } - public void onPause() { - super.onPause(); - Globals.NotifyObservers("SLPAUSE"); - } - - @Override - public void onSkipToNext() { - super.onSkipToNext(); - Globals.NotifyObservers("SLNEXT"); - } - - @Override - public void onSkipToPrevious() { - super.onSkipToPrevious(); - Globals.NotifyObservers("SLPREV"); - } - - @Override - public boolean onMediaButtonEvent(Intent mediaButtonIntent){ - KeyEvent ke = mediaButtonIntent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); - if (ke != null && ke.getAction() == KeyEvent.ACTION_DOWN) { - int keyCode = ke.getKeyCode(); - if(keyCode == KeyEvent.KEYCODE_MEDIA_PLAY || keyCode == KeyEvent.KEYCODE_MEDIA_PAUSE || keyCode == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE){ - Globals.NotifyObservers("SLPAUSE"); - } - else if(keyCode == KeyEvent.KEYCODE_MEDIA_NEXT){ - Globals.NotifyObservers("SLNEXT"); - } - else if(keyCode == KeyEvent.KEYCODE_MEDIA_PREVIOUS){ - Globals.NotifyObservers("SLPREV"); - } - } - return true; - } - } } diff --git a/android/app/src/main/java/tech/logica10/soniclair/SonicLairSessionCallbacks.java b/android/app/src/main/java/tech/logica10/soniclair/SonicLairSessionCallbacks.java new file mode 100644 index 0000000..15f25a2 --- /dev/null +++ b/android/app/src/main/java/tech/logica10/soniclair/SonicLairSessionCallbacks.java @@ -0,0 +1,48 @@ +package tech.logica10.soniclair; + +import android.content.Intent; +import android.media.session.MediaSession; +import android.view.KeyEvent; + +public class SonicLairSessionCallbacks extends MediaSession.Callback { + @Override + public void onPlay() { + super.onPlay(); + Globals.NotifyObservers("SLPAUSE"); + } + + public void onPause() { + super.onPause(); + Globals.NotifyObservers("SLPAUSE"); + } + + @Override + public void onSkipToNext() { + super.onSkipToNext(); + Globals.NotifyObservers("SLNEXT"); + } + + @Override + public void onSkipToPrevious() { + super.onSkipToPrevious(); + Globals.NotifyObservers("SLPREV"); + } + + @Override + public boolean onMediaButtonEvent(Intent mediaButtonIntent){ + KeyEvent ke = mediaButtonIntent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); + if (ke != null && ke.getAction() == KeyEvent.ACTION_DOWN) { + int keyCode = ke.getKeyCode(); + if(keyCode == KeyEvent.KEYCODE_MEDIA_PLAY || keyCode == KeyEvent.KEYCODE_MEDIA_PAUSE || keyCode == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE){ + Globals.NotifyObservers("SLPAUSE"); + } + else if(keyCode == KeyEvent.KEYCODE_MEDIA_NEXT){ + Globals.NotifyObservers("SLNEXT"); + } + else if(keyCode == KeyEvent.KEYCODE_MEDIA_PREVIOUS){ + Globals.NotifyObservers("SLPREV"); + } + } + return true; + } +} \ No newline at end of file diff --git a/android/app/src/main/res/drawable-hdpi/ic_stat_soniclair.png b/android/app/src/main/res/drawable-hdpi/ic_stat_soniclair.png new file mode 100644 index 0000000000000000000000000000000000000000..a220c3a2f485eb20dec2f2b27ef282fc521a2e62 GIT binary patch literal 675 zcmV;U0$lxxP)Px%T}ebiR9Hvtmd%S!VHn1Lm#-v}uP9Q&h=hgE6th7VQln%e3k!e4m=f8@lAWb2 zH6n>DEG%YfNv;|5G8`+kuyoUgs&07q7%awyy#2B^}8tm=|vu$o4+qD)0-~E$Mb%(MIu> zfNakI9sp~SB9DQMlD?OPY8B`>a4J*$jHI6QJKM{FEkHNWBk5H=;LylfQ$8#J6DhTTeggLrv$wWnNv|0Jrj!Kg2X+Bpk~vy4we6EYn7PRK3{1-`*(^yT zwvPhmflZR`m)iEW7Xj~}(9N<_(tz#gKbKP;>XvjR0BnCuI(c)A(e^Un6L1UYEFjI0 zq!nX%w)=qn$#eMUCa?h52880Vga;+P$<95lQ`?T-au-+vEG_^ODY2b*Na|0HiAO-R ziCQCa!;gKE4io`83|uG(l1_`=^#oX1<2b1|U6-Ug>EK@q*S86ny**V>2W}|_W(EkB}q~%ZU-AAJ&Wg2g=~j`V=apu4HLn9UDDn( zP&BMKi5rczP3*d+p(TxqQ~H9|bj5-nw1M)3YAe)MC{KaB_#baHx+P*Zeq;au002ov JPDHLkV1kTFEx-T( literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-mdpi/ic_stat_soniclair.png b/android/app/src/main/res/drawable-mdpi/ic_stat_soniclair.png new file mode 100644 index 0000000000000000000000000000000000000000..2fbd8e4b609a38b168d10e2bc7688f7bceb50af7 GIT binary patch literal 472 zcmV;}0Vn>6P)Px$l1W5CR7gwh)IX@sVH5}O&yh$`{%tOUMOd!Ipp>#%)RjTXDrFLxWFeC**pyjW z3}n0}QYOhlE*Wiv!qLg|*6+UWeZ4Iu3QJ`-T@d&?x(e?GaJFi)<`FW^TdrR`o^{9RsTl zo)#@whts$d5o>z^G{s!NwbsFKTmigCQTHA9aXcc{^aWUt*Nxky#L@*gfrBOCUKBND z+{MWyGM7Zp;U!8j)j_=~XdYXuqlox5h+Q;;%-n-hD0)T)hR-F-i1?A2Z&17O0SnlV z2e=p!Z$|(!v#NN4eG?YwA->|+7{A9j8WA;{Kbzc!+FhhROFGV{PRQAaxZMTVi>hqL zax!;fU$t|xFzDbG=7w%l>3;LS+^Y^i4f#eyobPoimebV=z(n?@PSJ0!@oO3FSbl^6 O0000Px&kV!;ARA@u(m|3W9a~Q^dk1?lACq;zhn1_%XA;*x6H)IH%a>J2akc5kqxIpG1 z7bq7>k_$4sK!l8|1B1| zXp#F*4`9|A>@(13pk)O55^5R1*6Mu*MupJ!#=zCUYDtf_4)ur&I?I6VeSv3ypMjGk zt?dFtCje~c-aCLxfPaANBwe$Z02~cG2`nj2{{);U>D3JlVuNSE_O`%Fz=0KK-vyRS z`esbuYy@nTKS}HAfb9an1;AavW)%ni1g?~HYt=E^+X2S_M*s%{n@Bor>HutS4!j5K zKEimSzZdWuumx}|umU(fP7mm;k+f{80BpyByMYTQ7=9f{HWKMAN1UArfaSn*LrQ1R z$6tZ(fE_1*>>hyaMDKp!dEgP?0pRorj-`Z-1D*x8A2|C5@FDOya1^kv^AfUs1#m+t zhc&<+l{y}VB>>I>(#V-o-tVE5D~X50&)x+;`g#RsaOtsyJJS;A3S9oo#!Gq+iC_9Gd~#8Izv@hX7BMncW1# z`;t-;>&5mxz(tiy67{#rZaA%EAmy4j#7apYjWRkCK;bqIm)ZP9jV(LOMrwYi!6@2( z4Vc6<(=$H;+W@y^#7fGy1u_mmB9X|1Vg6NP%Z>_CXvUp|ft~|g)+B|%*I})a-l+}1 z_Rhcuh4MDEx8QgtN$NNe%nL1#{id=y>{Zh5RmBAvu$?K9_w351Rysa^X);+YrC|Wl zupv}ickEEp>%&%$l=S7G;yeJh(=;yv2Q|HYO6TtdE|!#@{7=>cD6{_B^3SL#`P0}; z7TcMULT45LH~@GGNCW?$C2ZgnN!ix(GH?@ca!t?E=)1NUtu@UIJ(lSINLpdS!brtK%aq@5$H>(WdK{NFZvAp3nHKfK$$UKHUIzs07*qoM6N<$ Ef>Rd45C8xG literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_stat_soniclair.png b/android/app/src/main/res/drawable-xxhdpi/ic_stat_soniclair.png new file mode 100644 index 0000000000000000000000000000000000000000..45f9b45d9ca66fe87342b82c0b24d4c64d66a589 GIT binary patch literal 1392 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 literal 0 HcmV?d00001 diff --git a/build-pwa.ps1 b/build-pwa.ps1 new file mode 100644 index 0000000..42625d8 --- /dev/null +++ b/build-pwa.ps1 @@ -0,0 +1,2 @@ +npm run build +Copy-Item -Path "build/*" -Destination "../SonicLair-PWA/" -Recurse -Force diff --git a/package-lock.json b/package-lock.json index 69a44c8..2380b18 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1231,11 +1231,6 @@ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" }, - "@benestudioco/react-scrollfade": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@benestudioco/react-scrollfade/-/react-scrollfade-1.0.2.tgz", - "integrity": "sha512-mE/U+XV/IdoiSRaIfA6c+iTGxRV68FCy8w0cOKZgx3nJdYMdy7lUG7/W9ZL0gBPDyINTCUKzH0peBAwHTk3bpQ==" - }, "@capacitor/android": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/@capacitor/android/-/android-3.5.1.tgz", @@ -6302,11 +6297,6 @@ "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==" }, - "howler": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/howler/-/howler-2.2.3.tgz", - "integrity": "sha512-QM0FFkw0LRX1PR8pNzJVAY25JhIWvbKMBFM4gqk+QdV+kPXOhleWGCB6AiAF/goGjIHK2e/nIElplvjQwhr0jg==" - }, "hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", diff --git a/src/Components/Artist.tsx b/src/Components/Artist.tsx index 6e4602f..d40f80f 100644 --- a/src/Components/Artist.tsx +++ b/src/Components/Artist.tsx @@ -19,7 +19,6 @@ import AlbumCard from "./AlbumCard"; import "./Artist.scss"; import Loading from "./Loading"; import useAutoFill from "../Hooks/useAutoFill"; -import ScrollFade from '@benestudioco/react-scrollfade'; export default function Artist() { diff --git a/src/Components/Home.tsx b/src/Components/Home.tsx index 6e4036e..4870a12 100644 --- a/src/Components/Home.tsx +++ b/src/Components/Home.tsx @@ -1,24 +1,20 @@ -import { Link, useNavigate } from 'react-router-dom'; -import logo from '../logo.svg'; -import PlayTest from './PlayTest'; -import classnames from 'classnames'; -import { motion } from "framer-motion"; +import { useNavigate } from 'react-router-dom'; import { useContext, useEffect, useState } from 'react'; import GetTopAlbums from '../Api/GetTopAlbums'; import { AppContext } from '../AppContext'; -import { IAlbumArtistResponse, IAlbumSongResponse, IRandomSongsResponse } from '../Models/API/Responses/IArtistResponse'; +import { IAlbumArtistResponse, IAlbumSongResponse } from '../Models/API/Responses/IArtistResponse'; import AlbumCard from './AlbumCard'; import GetRandomSongs from '../Api/GetRandomSongs'; import RandomSongCard from './RandomSongCard'; -import { AutoSizer } from 'react-virtualized'; +import MediaBrowser from '../Plugins/MediaBrowser'; export default function Home() { - const navigate = useNavigate(); const [albumsFetched, setAlbumsFetched] = useState(false); const [albums, setAlbums] = useState([]); const [songsFetched, setSongsFetched] = useState(false); const [songs, setSongs] = useState([]); const { context } = useContext(AppContext); + useEffect(() => { if (albumsFetched) return; @@ -38,9 +34,18 @@ export default function Home() { const randomSongs = await GetRandomSongs(context); setSongs(randomSongs.randomSongs.song); setSongsFetched(true); + MediaBrowser.loadItems(randomSongs.randomSongs.song.map(s => { + return { + album: s.album, + artist: s.artist, + song: s.title, + duration: s.duration, + albumArt: "", + id: s.id + } + })); }; fetch(); - }, [songsFetched, context]); return ( @@ -53,7 +58,7 @@ export default function Home() {
{albums.map(s =>
- +
)} diff --git a/src/Plugins/MediaBrowser.ts b/src/Plugins/MediaBrowser.ts new file mode 100644 index 0000000..6bc457a --- /dev/null +++ b/src/Plugins/MediaBrowser.ts @@ -0,0 +1,8 @@ +import { registerPlugin } from '@capacitor/core'; + +export interface MediaBrowserPlugin { + loadItems(items: {albumArt:string, album: string, artist: string, duration: number, song: string, id:string}[]): Promise<{ status: string }> +} +const MediaBrowser = registerPlugin('MediaBrowser'); + +export default MediaBrowser; \ No newline at end of file