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