Пример #1
0
    def start_download(
        self,
        _url,
        res='720p',
        default_directory=os.path.join(str(Path.home()) + '/Music/')):
        """
        Main downloader to download files in the current directory.
        TODO: I can get the download url from the pytube and download it via
        TODO: urllib2 or something else. May be later.
        :param _url: str
        :param res: str
        :param default_directory: UNIX directory currently
        :return: bool | success or not
        """
        try:
            yt = YouTube(str(_url))
            yt.register_on_progress_callback(self.on_progress)
            yt.register_on_complete_callback(self.on_complete)
            if self.thumbnail_url is None:
                self.thumbnail_url = yt.thumbnail_url

            if self.is_audio:
                stream = yt.streams.filter(only_audio=True).first()
                if self._filename is None:
                    self._filename = safe_filename(
                        stream.player_config_args['title'])
                stream.download(filename=self._filename)
            else:
                all_streams = yt.streams.filter(file_extension='mp4',
                                                progressive=True).all()
                is_download = False
                if self._filename is None:
                    self._filename = safe_filename(
                        all_streams[0].player_config_args['title'])
                for stream in all_streams:
                    if stream.resolution == res:
                        stream.download(filename=self._filename)
                        is_download = True
                        break

                if not is_download:
                    print(
                        "[[ {} ]] video isn't available on the given resolution: {}"
                        .format(self._filename, res))
                    return False
            self.clean_up(default_directory)
            return True
        except KeyboardInterrupt as error:
            print(str(error))
            self.remove_errr_file()
            return False
        except BaseException as error:
            print(str(error))
            self.remove_errr_file()
            return False
Пример #2
0
 def make_filename(chat):
     if len(format) > 4: # Filename already given in format
         filename = os.path.join(path, format)
     else:
         filename = "Skype %s.%s" % (chat["title_long_lc"], format)
         filename = os.path.join(path, util.safe_filename(filename))
         filename = util.unique_path(filename)
     return filename
Пример #3
0
 def make_filename(chat):
     if len(format) > 4:  # Filename already given in format
         filename = os.path.join(path, format)
     else:
         filename = "Skype %s.%s" % (chat["title_long_lc"], format)
         filename = os.path.join(path, util.safe_filename(filename))
         filename = util.unique_path(filename)
     return filename
Пример #4
0
 def make_filename(chat):
     if len(format) > 4: # Filename already given in format
         filename = os.path.join(path, format)
     else:
         args = collections.defaultdict(str); args.update(chat)
         filename = "%s.%s" % (conf.ExportChatTemplate % args, format)
         filename = os.path.join(path, util.safe_filename(filename))
         filename = util.unique_path(filename)
     return filename
Пример #5
0
 def make_filename(chat):
     if len(format) > 4:  # Filename already given in format
         filename = os.path.join(path, format)
     else:
         args = collections.defaultdict(str)
         args.update(chat)
         filename = "%s.%s" % (conf.ExportChatTemplate % args, format)
         filename = os.path.join(path, util.safe_filename(filename))
         filename = util.unique_path(filename)
     return filename
Пример #6
0
def run_export(filenames, format):
    """Exports the specified databases in specified format."""
    dbs = [skypedata.SkypeDatabase(f) for f in filenames]
    is_xlsx_single = ("xlsx_single" == format)

    for db in dbs:
        formatargs = collections.defaultdict(str)
        formatargs["skypename"] = os.path.basename(db.filename)
        formatargs.update(db.account or {})
        basename = util.safe_filename(conf.ExportDbTemplate % formatargs)
        dbstr = "from %s " % db if len(dbs) != 1 else ""
        if is_xlsx_single:
            export_dir = os.getcwd()
            filename = util.unique_path("%s.xlsx" % basename)
        else:
            export_dir = util.unique_path(os.path.join(os.getcwd(), basename))
            filename = format
        target = filename if is_xlsx_single else export_dir
        try:
            print("Exporting as %s %sto %s." %
                  (format[:4].upper(), dbstr, target))
            chats = sorted(db.get_conversations(),
                           key=lambda x: x["title"].lower())
            db.get_conversations_stats(chats)
            bar_total = sum(c["message_count"] for c in chats)
            bartext = " Exporting %.*s.." % (30, db.filename)  # Enforce width
            bar = ProgressBar(max=bar_total, afterword=bartext)
            bar.start()
            result = export.export_chats(chats,
                                         export_dir,
                                         filename,
                                         db,
                                         progress=bar.update)
            files, count = result
            bar.stop()
            if count:
                bar.afterword = " Exported %s to %s. " % (db, target)
                bar.update(bar_total)
                print()
                log("Exported %s %sto %s as %s.", util.plural("chat", count),
                    dbstr, target, format)
            else:
                print("\nNo messages to export%s." %
                      ("" if len(dbs) == 1 else " from %s" % db))
                os.unlink(filename) if is_xlsx_single else os.rmdir(export_dir)
        except Exception as e:
            print("Error exporting chats: %s\n\n%s" %
                  (e, traceback.format_exc()))
Пример #7
0
def run_export(filenames, format):
    """Exports the specified databases in specified format."""
    dbs = [skypedata.SkypeDatabase(f) for f in filenames]
    is_xlsx_single = ("xlsx_single" == format)

    for db in dbs:
        formatargs = collections.defaultdict(str)
        formatargs["skypename"] = os.path.basename(db.filename)
        formatargs.update(db.account or {})
        basename = util.safe_filename(conf.ExportDbTemplate % formatargs)
        dbstr = "from %s " % db if len(dbs) != 1 else ""
        if is_xlsx_single:
            export_dir = os.getcwd()
            filename = util.unique_path("%s.xlsx" % basename)
        else:
            export_dir = util.unique_path(os.path.join(os.getcwd(), basename))
            filename = format
        target = filename if is_xlsx_single else export_dir
        try:
            print("Exporting as %s %sto %s." % 
                  (format[:4].upper(), dbstr, target))
            chats = sorted(db.get_conversations(),
                           key=lambda x: x["title"].lower())
            db.get_conversations_stats(chats)
            bar_total = sum(c["message_count"] for c in chats)
            bartext = " Exporting %.*s.." % (30, db.filename) # Enforce width
            bar = ProgressBar(max=bar_total, afterword=bartext)
            bar.start()
            result = export.export_chats(chats, export_dir, filename, db,
                                         progress=bar.update)
            files, count = result
            bar.stop()
            if count:
                bar.afterword = " Exported %s to %s. " % (db, target)
                bar.update(bar_total)
                print()
                log("Exported %s %sto %s as %s.", util.plural("chat", count),
                     dbstr, target, format)
            else:
                print("\nNo messages to export%s." %
                      ("" if len(dbs) == 1 else " from %s" % db))
                os.unlink(filename) if is_xlsx_single else os.rmdir(export_dir)
        except Exception as e:
            print("Error exporting chats: %s\n\n%s" % 
                  (e, traceback.format_exc()))
Пример #8
0
def run_export(filenames, format, chatnames, authornames, ask_password):
    """Exports the specified databases in specified format."""
    dbs = [skypedata.SkypeDatabase(f) for f in filenames]
    is_xlsx_single = ("xlsx_single" == format)

    for db in dbs:
        if (ask_password and db.id and conf.SharedImageAutoDownload
        and format.lower().endswith("html")):
            prompt = "Enter Skype password for '%s': " % db.id
            while not skypedata.SharedImageDownload.has_login(db.id):
                with warnings.catch_warnings():
                    warnings.simplefilter("ignore") # possible GetPassWarning
                    output(prompt, end="") # getpass output can raise errors
                    pw = getpass.getpass("", io.BytesIO())
                if not pw: continue # while
                try:
                    skypedata.SharedImageDownload.login(db.id, pw)
                except Exception as e:
                    log("Error signing in %s on Skype web.\n\n%s",
                        db.id, util.format_exc(e))
                    prompt = "%s\nEnter Skype password for '%s': " % (e, db.id)

        formatargs = collections.defaultdict(str)
        formatargs["skypename"] = os.path.basename(db.filename)
        formatargs.update(db.account or {})
        basename = util.safe_filename(conf.ExportDbTemplate % formatargs)
        dbstr = "from %s " % db if len(dbs) != 1 else ""
        if is_xlsx_single:
            export_dir = os.getcwd()
            filename = util.unique_path("%s.xlsx" % basename)
        else:
            export_dir = util.unique_path(os.path.join(os.getcwd(), basename))
            filename = format
        target = filename if is_xlsx_single else export_dir
        try:
            extras = [("", chatnames)] if chatnames else []
            extras += [(" with authors", authornames)] if authornames else []
            output("Exporting%s%s as %s %sto %s." % 
                  (" chats" if extras else "",
                   ",".join("%s like %s" % (x, y) for x, y in extras),
                   format[:4].upper(), dbstr, target))
            chats = sorted(db.get_conversations(chatnames, authornames),
                           key=lambda x: x["title"].lower())
            db.get_conversations_stats(chats)
            bar_total = sum(c["message_count"] for c in chats)
            bartext = " Exporting %.*s.." % (30, db.filename) # Enforce width
            bar = ProgressBar(max=bar_total, afterword=bartext)
            bar.start()
            result = export.export_chats(chats, export_dir, filename, db,
                                         progress=bar.update)
            files, count = result
            bar.stop()
            if count:
                bar.afterword = " Exported %s to %s. " % (db, target)
                bar.update(bar_total)
                output()
                log("Exported %s %sto %s as %s.", util.plural("chat", count),
                     dbstr, target, format)
            else:
                output("\nNo messages to export%s." %
                      ("" if len(dbs) == 1 else " from %s" % db))
                os.unlink(filename) if is_xlsx_single else os.rmdir(export_dir)
        except Exception as e:
            output("Error exporting chats: %s\n\n%s" % 
                  (e, traceback.format_exc()))
Пример #9
0
def run_export(filenames, format, chatnames, authornames, ask_password):
    """Exports the specified databases in specified format."""
    dbs = [skypedata.SkypeDatabase(f) for f in filenames]
    is_xlsx_single = ("xlsx_single" == format)

    for db in dbs:
        if (ask_password and db.id and conf.SharedImageAutoDownload
                and format.lower().endswith("html")):
            prompt = "Enter Skype password for '%s': " % db.id
            while not skypedata.SharedImageDownload.has_login(db.id):
                with warnings.catch_warnings():
                    warnings.simplefilter("ignore")  # possible GetPassWarning
                    output(prompt, end="")  # getpass output can raise errors
                    pw = getpass.getpass("", io.BytesIO())
                if not pw: continue  # while
                try:
                    skypedata.SharedImageDownload.login(db.id, pw)
                except Exception as e:
                    log("Error signing in %s on Skype web.\n\n%s", db.id,
                        util.format_exc(e))
                    prompt = "%s\nEnter Skype password for '%s': " % (e, db.id)

        formatargs = collections.defaultdict(str)
        formatargs["skypename"] = os.path.basename(db.filename)
        formatargs.update(db.account or {})
        basename = util.safe_filename(conf.ExportDbTemplate % formatargs)
        dbstr = "from %s " % db if len(dbs) != 1 else ""
        if is_xlsx_single:
            export_dir = os.getcwd()
            filename = util.unique_path("%s.xlsx" % basename)
        else:
            export_dir = util.unique_path(os.path.join(os.getcwd(), basename))
            filename = format
        target = filename if is_xlsx_single else export_dir
        try:
            extras = [("", chatnames)] if chatnames else []
            extras += [(" with authors", authornames)] if authornames else []
            output("Exporting%s%s as %s %sto %s." %
                   (" chats" if extras else "", ",".join(
                       "%s like %s" % (x, y)
                       for x, y in extras), format[:4].upper(), dbstr, target))
            chats = sorted(db.get_conversations(chatnames, authornames),
                           key=lambda x: x["title"].lower())
            db.get_conversations_stats(chats)
            bar_total = sum(c["message_count"] for c in chats)
            bartext = " Exporting %.*s.." % (30, db.filename)  # Enforce width
            bar = ProgressBar(max=bar_total, afterword=bartext)
            bar.start()
            result = export.export_chats(chats,
                                         export_dir,
                                         filename,
                                         db,
                                         progress=bar.update)
            files, count = result
            bar.stop()
            if count:
                bar.afterword = " Exported %s to %s. " % (db, target)
                bar.update(bar_total)
                output()
                log("Exported %s %sto %s as %s.", util.plural("chat", count),
                    dbstr, target, format)
            else:
                output("\nNo messages to export%s." %
                       ("" if len(dbs) == 1 else " from %s" % db))
                os.unlink(filename) if is_xlsx_single else os.rmdir(export_dir)
        except Exception as e:
            output("Error exporting chats: %s\n\n%s" %
                   (e, traceback.format_exc()))