Skip to content

Instantly share code, notes, and snippets.

@alexmercerind
Created December 18, 2022 12:28
Show Gist options
  • Save alexmercerind/39e5d62dd73d7ff457ac7cc3144c0abd to your computer and use it in GitHub Desktop.
Save alexmercerind/39e5d62dd73d7ff457ac7cc3144c0abd to your computer and use it in GitHub Desktop.
đŸ‘€
%%{
  init: {
    'themeVariables': {
      'fontFamily': 'BlinkMacSystemFont, Segoe UI, Noto Sans, Helvetica, Arial, Apple Color Emoji, Segoe UI Emoji'
    }
  }
}%%
classDiagram

  Player *-- PlatformPlayer
  PlatformPlayer <|-- libmpv_Player
  PlatformPlayer <|-- xyz_Player
  PlatformPlayer *-- PlayerState
  PlatformPlayer *-- PlayerStreams
  PlatformPlayer o-- PlayerConfiguration

  libmpv_Player <.. NativeLibrary

  class Media {
    +Uri uri
    +dynamic extras
  }

  class Playlist {
    +List<Media> medias
    +index index
  }

  class PlayerConfiguration {
    + bool texture
    + bool osc
    + String vo
    + String title
    ... other platform-specific configurable values
  }

  class PlayerStreams {
    +Stream<Playlist> playlist
    +Stream<bool> isPlaying
    +Stream<bool> isCompleted
    +Stream<Duration> position
    +Stream<Duration> duration
    +Stream<double> volume
    +Stream<double> rate
    +Stream<double> pitch
    +Stream<bool> isBuffering
    +Stream<AudioParams> audioParams
    +Stream<double> audioBitrate
    +Stream<PlayerError> error
  }

  class PlayerState {
    +Playlist playlist
    +bool isPlaying
    +bool isCompleted
    +Duration position
    +Duration duration
    +double volume
    +double rate
    +double pitch
    +bool isBuffering
    +AudioParams audioParams
    +double audioBitrate
    +PlayerError error
  }

  class Player {
    +PlatformPlayer? platform

    +«get» PlayerState state
    +«get» PlayerStreams streams

    +«set» volume: double*
    +«set» rate: double*
    +«set» pitch: double*
    +«set» shuffle: bool*

    +open(playlist)
    +play()
    +pause()
    +playOrPause()
    +add(media)
    +remove(index)
    +next()
    +previous()
    +jump(index)
    +move(from, to)
    +seek(duration)
    +setPlaylistMode(playlistMode)
    +dispose()
  }

  class PlatformPlayer {
    +PlayerState state
    +PlayerStreams streams
    +PlayerConfiguration configuration

    +open(playlist)*
    +play()*
    +pause()*
    +playOrPause()*
    +add(media)*
    +remove(index)*
    +next()*
    +previous()*
    +jump(index)*
    +move(from, to)*
    +seek(duration)*
    +setPlaylistMode(playlistMode)*
    +dispose()*

    +«set» volume: double*
    +«set» rate: double*
    +«set» pitch: double*
    +«set» shuffle: bool*

    #StreamController<Playlist> playlistController
    #StreamController<bool> isPlayingController
    #StreamController<bool> isCompletedController
    #StreamController<Duration> positionController
    #StreamController<Duration> durationController
    #StreamController<double> volumeController
    #StreamController<double> rateController
    #StreamController<double> pitchController
    #StreamController<bool> isBufferingController
    #StreamController<PlayerError> errorController
    #StreamController<AudioParams> audioParamsController
    #StreamController<double?> audioBitrateController
  }

  class libmpv_Player {
    +open(playlist)
    +play()
    +pause()
    +playOrPause()
    +add(media)
    +remove(index)
    +next()
    +previous()
    +jump(index)
    +move(from, to)
    +seek(duration)
    +setPlaylistMode(playlistMode)
    +«set» volume: double
    +«set» rate: double
    +«set» pitch: double
    +«set» shuffle: bool
    +dispose()
  }

  class NativeLibrary {
    +find()$ String?
  }

  class xyz_Player {
    +open(playlist)
    +play()
    +pause()
    +playOrPause()
    +add(media)
    +remove(index)
    +next()
    +previous()
    +jump(index)
    +move(from, to)
    +seek(duration)
    +setPlaylistMode(playlistMode)
    +«set» volume: double
    +«set» rate: double
    +«set» pitch: double
    +«set» shuffle: bool
    +dispose()
  }

  Tagger *-- PlatformTagger
  PlatformTagger <|-- libmpv_Tagger
  PlatformTagger <|-- xyz_Tagger
  PlatformTagger o-- TaggerConfiguration

  libmpv_Tagger <.. NativeLibrary

  class TaggerMetadata {
    +Uri uri
    +String trackName
    +String albumName
    +int trackNumber
    +int discNumber
    +int albumLength
    +String albumArtistName
    +List<String> trackArtistNames
    +String authorName
    +String writerName
    +String year
    +String genre
    +String lyrics
    +DateTime timeAdded
    +Duration duration
    +int bitrate
    +dynamic data
  }

  class Tagger {
    +parse(media) Future<TaggerMetadata>
    +dispose()
  }

  class TaggerConfiguration {
    +bool verbose
    +String libmpv
    ... other platform-specific configurable values
  }

  class PlatformTagger {
    +TaggerConfiguration configuration

    +parse(media)* Future<TaggerMetadata>
    #serialize(data)* TaggerMetadata
    +dispose()*

    #splitArtistTag(tag) List<String>
    #splitDateTag(tag) String
    #parseInteger(value) int
  }

  class libmpv_Tagger {
    +parse(media) Future<TaggerMetadata>
    #serialize(data) TaggerMetadata
    +dispose()
  }

  class xyz_Tagger {
    +parse(media) Future<TaggerMetadata>
    #serialize(data) TaggerMetadata
    +dispose()
  }
Loading
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment