#include #include #include #include #include "metadata.h" #include "dbus_client.h" #include "mpd_client.h" #define SONG_FLAG 0x0001 #define META_FLAG 0x0002 #define RUNNING_FLAG 0x0004 #define NEXT_FLAG 0x0008 #define PREV_FLAG 0x0010 #define PLAY_FLAG 0x0020 #define STOP_FLAG 0x0040 #define PLAYING_FLAG 0x0080 #define MPD_FLAG 0x0001 #define DBUS_FLAG 0x0002 void parseCommandLine( int argc, char **argv, size_t *requests, size_t *sources ) { for ( int i = 1; i < argc; i++ ) { if ( !strcmp( argv[i], "song" ) ) *requests |= SONG_FLAG; else if ( !strcmp( argv[i], "info" ) ) *requests |= META_FLAG; else if ( !strcmp( argv[i], "status" ) || !strcmp( argv[i], "running" ) ) *requests |= RUNNING_FLAG; else if ( !strcmp( argv[i], "playing" ) ) *requests |= PLAYING_FLAG; else if ( !strcmp( argv[i], "next" ) ) *requests |= NEXT_FLAG; else if ( !strcmp( argv[i], "prev" ) || !strcmp( argv[i], "previous" ) ) *requests |= PREV_FLAG; else if ( !strcmp( argv[i], "play" ) || !strcmp( argv[i], "pause" ) ) *requests |= PLAY_FLAG; else if ( !strcmp( argv[i], "stop" ) ) *requests |= STOP_FLAG; else if ( !strcmp( argv[i], "mpd" ) ) *sources |= MPD_FLAG; else if ( !strcmp( argv[i], "dbus" ) ) *sources |= DBUS_FLAG; } if ( *sources == 0 ) *sources = MPD_FLAG | DBUS_FLAG; } int main( int argc, char **argv ) { size_t requests = 0, sources = 0; int ret = EXIT_SUCCESS; parseCommandLine( argc, argv, &requests, &sources ); DBusConnection *dbus_connection = NULL; char **dbus_players = NULL; struct mpd_connection *mpd_connection = NULL; if ( sources & MPD_FLAG ) mpd_connection = mpdConnect( 6600 ); if ( sources & DBUS_FLAG ) { dbus_connection = dbusConnect(); dbus_players = dbusGetMediaPlayers( dbus_connection ); } if ( requests & SONG_FLAG || requests & META_FLAG ) { struct song_metadata song = { 0 }; if ( sources & MPD_FLAG && mpdRunning( mpd_connection ) ) { song = mpdGetSong( mpd_connection ); if ( requests & SONG_FLAG ) printSong( &song ); if ( requests & META_FLAG ) printMeta( &song ); } if ( sources & DBUS_FLAG ) { for ( char **player = dbus_players; *player; ++player ) { if ( !dbusRunning( dbus_connection, *player ) ) continue; song = dbusGetSong( dbus_connection, *player ); if ( requests & SONG_FLAG ) printSong( &song ); if ( requests & META_FLAG ) printMeta( &song ); } } freeSong( &song ); } if ( requests & RUNNING_FLAG ) { ret = EXIT_FAILURE; if ( sources & MPD_FLAG && mpdRunning( mpd_connection ) ) ret = EXIT_SUCCESS; if ( sources & DBUS_FLAG ) { for ( char **player = dbus_players; *player; ++player ) { if ( dbusRunning( dbus_connection, *player ) ) ret = EXIT_SUCCESS; } } } if ( requests & PLAYING_FLAG ) { ret = EXIT_FAILURE; if ( sources & MPD_FLAG && mpdPlaying( mpd_connection ) ) ret = EXIT_SUCCESS; if ( sources & DBUS_FLAG ) { for ( char **player = dbus_players; *player; ++player ) { if ( dbusPlaying( dbus_connection, *player ) ) ret = EXIT_SUCCESS; } } } if ( requests & NEXT_FLAG ) { if ( sources & MPD_FLAG ) mpdNext( mpd_connection ); if ( sources & DBUS_FLAG ) { for ( char **player = dbus_players; *player; ++player ) { dbusNext( dbus_connection, *player ); } } } if ( requests & PREV_FLAG ) { if ( sources & MPD_FLAG ) mpdPrev( mpd_connection ); if ( sources & DBUS_FLAG ) { for ( char **player = dbus_players; *player; ++player ) { dbusPrev( dbus_connection, *player ); } } } if ( requests & PLAY_FLAG ) { if ( sources & MPD_FLAG ) mpdPlayPause( mpd_connection ); if ( sources & DBUS_FLAG ) { for ( char **player = dbus_players; *player; ++player ) { dbusPlayPause( dbus_connection, *player ); } } } if ( requests & STOP_FLAG ) { if ( sources & MPD_FLAG ) mpdStop( mpd_connection ); if ( sources & DBUS_FLAG ) { for ( char **player = dbus_players; *player; ++player ) { dbusStop( dbus_connection, *player ); } } } if ( sources & DBUS_FLAG ) { dbusFreePlayers( dbus_players ); } if ( sources & MPD_FLAG ) { mpdDisconnect( mpd_connection ); } return ret; }