]> git.sur5r.net Git - minitube/blob - src/subscriptionimportview.cpp
New upstream version 3.8
[minitube] / src / subscriptionimportview.cpp
1 #include "subscriptionimportview.h"
2 #include "fontutils.h"
3 #include "iconutils.h"
4 #include "ytchannel.h"
5
6 #include "homeview.h"
7 #include "mainwindow.h"
8
9 QAction *SubscriptionImportView::buildAction(QWidget *parent) {
10     auto a = new QAction("Import subscriptions...", parent);
11     a->setMenuRole(QAction::ApplicationSpecificRole);
12     connect(a, &QAction::triggered, parent, [parent] {
13         auto dialog = new SubscriptionImportView(parent);
14         dialog->show();
15     });
16     return a;
17 }
18
19 SubscriptionImportView::SubscriptionImportView(QWidget *parent) : View(parent) {
20     auto layout = new QVBoxLayout(this);
21     layout->setSpacing(fontMetrics().xHeight() * 4);
22     layout->setAlignment(Qt::AlignCenter);
23
24     auto closeButton = new QToolButton();
25     closeButton->setIcon(IconUtils::icon("close"));
26     closeButton->setIconSize({32, 32});
27     closeButton->setShortcut(Qt::Key_Escape);
28     closeButton->setStyleSheet("border:0");
29     connect(closeButton, &QToolButton::clicked, this, [] { MainWindow::instance()->goBack(); });
30     layout->addWidget(closeButton, 0, Qt::AlignRight);
31
32     auto icon = new QLabel();
33     icon->setPixmap(IconUtils::icon("import").pixmap(128, 128));
34     layout->addWidget(icon, 0, Qt::AlignHCenter);
35
36     QString url = "https://takeout.google.com/takeout/custom/youtube";
37     QString msg =
38             "Follow these steps to import your YouTube subscriptions:<ul>"
39             "<li style='line-height:1.5'>Visit <a href='%1'>%2</a>"
40             "<li style='line-height:1.5'>Click <i>All YouTube data included</i>, deselect all "
41             "and select only subscriptions"
42             "<li style='line-height:1.5'>Download the zip file and extract it";
43     msg = msg.arg(url, "Google Takeout");
44     auto tip = new QLabel(msg);
45     tip->setOpenExternalLinks(true);
46     tip->setFont(FontUtils::medium());
47     layout->addWidget(tip);
48
49     auto button = new QPushButton("Open subscriptions.json");
50     button->setDefault(true);
51     connect(this, &View::didAppear, button, [button] { button->setFocus(); });
52     button->setFocus();
53     button->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
54     connect(button, &QPushButton::clicked, this, [this] {
55         auto dir = QStandardPaths::writableLocation(QStandardPaths::DownloadLocation);
56         QString fileName = QFileDialog::getOpenFileName(this, tr("Open subscriptions.json"), dir,
57                                                         tr("JSON Files (*.json)"));
58         if (!fileName.isEmpty()) {
59             auto w = MainWindow::instance();
60             QString msg;
61             QFile file(fileName);
62             if (file.open(QFile::ReadOnly)) {
63                 int count = 0;
64                 const auto array = QJsonDocument::fromJson(file.readAll()).array();
65                 for (const auto &i : array) {
66                     auto id = i["snippet"]["resourceId"]["channelId"].toString();
67                     qDebug() << "Subscribing to" << id;
68                     if (YTChannel::subscribe(id)) count++;
69                 }
70                 msg = tr("Subscribed to %n channel(s)", "", count);
71                 w->showHome();
72                 w->getHomeView()->showChannels();
73             } else
74                 msg = tr("Cannot open file");
75             if (!msg.isEmpty()) QTimer::singleShot(0, w, [w, msg] { w->showMessage(msg); });
76         }
77     });
78     layout->addWidget(button, 0, Qt::AlignHCenter);
79 }