]> git.sur5r.net Git - minitube/blob - src/subscriptionimportview.cpp
New upstream version 3.9.1
[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.csv");
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.csv"), dir,
57                                                         tr("YouTube data (*.csv *.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                 if (QFileInfo(fileName).suffix().toLower() == "csv") {
65                     int lineNumber = 1;
66                     while (!file.atEnd()) {
67                         QByteArray line = file.readLine();
68                         if (lineNumber > 1) {
69                             auto fields = line.split(',');
70                             auto id = fields.first();
71                             qDebug() << "Subscribing to" << id;
72                             if (YTChannel::subscribe(id)) count++;
73                         }
74                         lineNumber++;
75                     }
76                 } else {
77                     const auto array = QJsonDocument::fromJson(file.readAll()).array();
78                     for (const auto &i : array) {
79                         auto id = i["snippet"]["resourceId"]["channelId"].toString();
80                         qDebug() << "Subscribing to" << id;
81                         if (YTChannel::subscribe(id)) count++;
82                     }
83                 }
84                 msg = tr("Subscribed to %n channel(s)", "", count);
85                 w->showHome();
86                 w->getHomeView()->showChannels();
87             } else
88                 msg = tr("Cannot open file");
89             if (!msg.isEmpty()) QTimer::singleShot(0, w, [w, msg] { w->showMessage(msg); });
90         }
91     });
92     layout->addWidget(button, 0, Qt::AlignHCenter);
93 }