1 // ampache.cc
2 //
3 // Project: Ampache Browser Audacious Plugin
4 // License: GNU GPLv3
5 //
6 // Copyright (C) 2015-2016 Róbert Čerňanský and John Lindgren
7
8 #include <QWidget>
9
10 #include <libaudcore/audstrings.h>
11 #include <libaudcore/drct.h>
12 #include <libaudcore/i18n.h>
13 #include <libaudcore/runtime.h>
14 #include <libaudcore/plugin.h>
15 #include <libaudcore/playlist.h>
16 #include <libaudcore/vfs_async.h>
17
18 #include <ampache_browser/settings.h>
19 #include <ampache_browser/ampache_browser.h>
20 #include <ampache_browser/application_qt.h>
21
22 #define CFG_SECT "ampache_browser"
23
24 using NetworkCb = ampache_browser::ApplicationQt::NetworkRequestCb;
25 using UrlList = std::vector<std::string>;
26
27 class AmpacheBrowserPlugin: public GeneralPlugin
28 {
29 public:
30 static const char about[];
31
32 static constexpr PluginInfo pluginInfo = {
33 N_("Ampache Browser"),
34 PACKAGE,
35 about,
36 nullptr,
37 PluginQtOnly
38 };
39
AmpacheBrowserPlugin()40 constexpr AmpacheBrowserPlugin(): GeneralPlugin(pluginInfo, false) {}
41
42 void* get_qt_widget() override;
43 };
44
45 const char AmpacheBrowserPlugin::about[] =
46 N_("Ampache Browser for Audacious\n"
47 "http://ampache-browser.org/\n\n"
48 "Copyright (C) Róbert Čerňanský and John Lindgren\n"
49 "License: GNU GPLv3");
50
51 static SmartPtr<ampache_browser::ApplicationQt> s_app;
52
vfsAsyncCb(const char * url,const Index<char> & data,void * callback)53 static void vfsAsyncCb(const char* url, const Index<char>& data, void* callback)
54 {
55 if (s_app) // ignore callbacks after cleanup()
56 (*(NetworkCb*)callback)(url, data.begin(), data.len());
57 }
58
toAddItems(const UrlList & urls)59 static Index<PlaylistAddItem> toAddItems(const UrlList& urls)
60 {
61 Index<PlaylistAddItem> addItems;
62 for (auto& url: urls)
63 addItems.append(String(url.c_str()));
64
65 return addItems;
66 }
67
initSettings(ampache_browser::Settings & settings)68 static void initSettings(ampache_browser::Settings &settings)
69 {
70 static const std::string bool_settings[] = {
71 settings.USE_DEMO_SERVER
72 };
73
74 static const std::string str_settings[] = {
75 settings.SERVER_URL,
76 settings.USER_NAME,
77 settings.PASSWORD_HASH
78 };
79
80 auto verbosity = getenv("AMPACHE_BROWSER_PLUGIN_VERBOSITY");
81 settings.setInt(settings.LOGGING_VERBOSITY, verbosity ? str_to_int(verbosity) : 0);
82
83 for (auto& name: bool_settings)
84 settings.setBool(name, aud_get_bool(CFG_SECT, name.c_str()));
85 for (auto& name: str_settings)
86 settings.setString(name, (const char*)aud_get_str(CFG_SECT, name.c_str()));
87
88 settings.connectChanged([&settings]() {
89 for (auto& name: bool_settings)
90 aud_set_bool(CFG_SECT, name.c_str(), settings.getBool(name));
91 for (auto& name: str_settings)
92 aud_set_str(CFG_SECT, name.c_str(), settings.getString(name).c_str());
93 });
94 }
95
get_qt_widget()96 void* AmpacheBrowserPlugin::get_qt_widget()
97 {
98 s_app.capture(new ampache_browser::ApplicationQt);
99
100 s_app->setNetworkRequestFunction([](const std::string& url, NetworkCb& networkCb) {
101 vfs_async_file_get_contents(url.c_str(), vfsAsyncCb, &networkCb);
102 });
103
104 auto& browser = s_app->getAmpacheBrowser();
105
106 browser.connectPlay([](const UrlList& urls) {
107 aud_drct_pl_open_list(toAddItems(urls));
108 });
109
110 browser.connectCreatePlaylist([](const UrlList& urls) {
111 Playlist::new_playlist().insert_items(-1, toAddItems(urls), false);
112 });
113
114 browser.connectAddToPlaylist([](const UrlList& urls) {
115 Playlist::active_playlist().insert_items(-1, toAddItems(urls), false);
116 });
117
118 initSettings(s_app->getSettings());
119
120 s_app->run();
121 auto widget = s_app->getMainWidget();
122
123 QObject::connect(widget, &QObject::destroyed, [] {
124 s_app.clear();
125 });
126
127 return widget;
128 }
129
130 EXPORT AmpacheBrowserPlugin aud_plugin_instance;
131