music_player_graphql/schema/
mod.rs1use std::collections::HashMap;
2
3use anyhow::Error;
4use async_graphql::{Enum, MergedObject, MergedSubscription};
5use music_player_addons::{
6 airplay::Airplay, chromecast::Chromecast, dlna::Dlna, kodi::Kodi, local::Local, Browseable,
7 Player,
8};
9use music_player_types::types::Device;
10
11use self::{
12 devices::{DevicesMutation, DevicesQuery, DevicesSubscription},
13 library::{LibraryMutation, LibraryQuery},
14 mixer::{MixerMutation, MixerQuery},
15 playback::{PlaybackMutation, PlaybackQuery, PlaybackSubscription},
16 playlist::{PlaylistMutation, PlaylistQuery, PlaylistSubscription},
17 tracklist::{TracklistMutation, TracklistQuery, TracklistSubscription},
18};
19
20pub mod addons;
21pub mod core;
22pub mod devices;
23pub mod history;
24pub mod library;
25pub mod mixer;
26pub mod objects;
27pub mod playback;
28pub mod playlist;
29pub mod tracklist;
30
31#[derive(MergedObject, Default)]
32pub struct Query(
33 DevicesQuery,
34 LibraryQuery,
35 MixerQuery,
36 PlaybackQuery,
37 PlaylistQuery,
38 TracklistQuery,
39);
40
41#[derive(MergedObject, Default)]
42pub struct Mutation(
43 DevicesMutation,
44 LibraryMutation,
45 MixerMutation,
46 PlaybackMutation,
47 PlaylistMutation,
48 TracklistMutation,
49);
50
51#[derive(MergedSubscription, Default)]
52pub struct Subscription(
53 PlaybackSubscription,
54 PlaylistSubscription,
55 TracklistSubscription,
56 DevicesSubscription,
57);
58
59#[derive(Enum, Eq, PartialEq, Copy, Clone)]
60pub enum MutationType {
61 Created,
62 Cleared,
63 Deleted,
64 Renamed,
65 Moved,
66 Updated,
67}
68
69pub async fn connect_to(device: Device) -> Result<Option<Box<dyn Browseable + Send>>, Error> {
70 let mut local: Local = device.clone().into();
71 local.connect().await?;
72 Ok(Some(Box::new(local)))
73}
74
75pub enum PlayerType {
76 MusicPlayer,
77 Chromecast,
78 Airplay,
79 Kodi,
80 Dlna,
81}
82
83pub async fn connect_to_cast_device(
84 device: Device,
85 player_type: PlayerType,
86) -> Result<Option<Box<dyn Player + Send>>, Error> {
87 match player_type {
88 PlayerType::MusicPlayer => Local::new().connect_to_player(device).await,
89 PlayerType::Chromecast => Chromecast::connect(device),
90 PlayerType::Airplay => Airplay::new().connect(device),
91 PlayerType::Kodi => Kodi::new().connect_to_player(device),
92 PlayerType::Dlna => Dlna::connect_to_media_renderer(device),
93 }
94}