music_player_graphql/schema/
mod.rs

1use 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}