Commit 575a7b46 authored by Andy Stewart's avatar Andy Stewart
Browse files

Move file type detect from python to elisp

parent 7dafaa31
Loading
Loading
Loading
Loading
+32 −5
Original line number Diff line number Diff line
@@ -110,6 +110,8 @@

(defvar eaf-first-start-url nil)

(defvar eaf-first-start-app-name nil)

(defvar eaf-title-length 30)

(defcustom eaf-name "*eaf*"
@@ -321,7 +323,7 @@ We need calcuate render allocation to make sure no black border around render co

(defun eaf-start-finish ()
  ;; Call `eaf-open-internal' after receive `start_finish' signal from server process.
  (eaf-open-internal eaf-first-start-url))
  (eaf-open-internal eaf-first-start-url eaf-first-start-app-name))

(dbus-register-signal
 :session "com.lazycat.eaf" "/com/lazycat/eaf"
@@ -366,11 +368,11 @@ We need calcuate render allocation to make sure no black border around render co
(add-hook 'pre-command-hook #'eaf-monitor-key-event)
(add-hook 'kill-buffer-hook #'eaf-monitor-buffer-kill)

(defun eaf-open-internal (url)
(defun eaf-open-internal (url app-name)
  (let* ((buffer (eaf-create-buffer url))
         buffer-result)
    (with-current-buffer buffer
      (setq buffer-result (eaf-call "new_buffer" buffer-id url)))
      (setq buffer-result (eaf-call "new_buffer" buffer-id url app-name)))
    (if (equal buffer-result "")
        ;; Switch to new buffer if buffer create successful.
        (switch-to-buffer buffer)
@@ -379,15 +381,40 @@ We need calcuate render allocation to make sure no black border around render co
      (message buffer-result))
    ))

(defun eaf-open (url)
(defun eaf-open (url &optional app-name)
  (interactive "FOpen with EAF: ")
  (unless app-name
    (cond ((string-equal url "eaf-demo")
           (setq app-name "demo"))
          ((string-equal url "eaf-camera")
           (setq app-name "camera"))
          ((file-exists-p url)
           (setq url (expand-file-name url))
           (setq extension-name (file-name-extension url))
           (cond ((member extension-name '("pdf" "xps" "oxps" "cbz" "epub" "fb2" "fbz"))
                  (setq app-name "pdfviewer"))
                 ((member extension-name '("md"))
                  (setq app-name "markdownpreviewer"))
                 ((member extension-name '("jpg" "png" "bmp"))
                  (setq app-name "imageviewer"))
                 ((member extension-name '("avi" "rmvb" "ogg" "mp4"))
                  (setq app-name "videoplayer"))))
          (t
           (setq app-name "browser")
           (unless (string-prefix-p "http" url)
             (setq url (concat "http://" url))))))
  (if (process-live-p eaf-process)
      ;; Call `eaf-open-internal' directly if server process has start.
      (eaf-open-internal url)
      (eaf-open-internal url app-name)
    ;; Record user input, and call `eaf-open-internal' after receive `start_finish' signal from server process.
    (setq eaf-first-start-url url)
    (setq eaf-first-start-app-name app-name)
    (eaf-start-process)))

(defun eaf-show-file-qrcode (url)
  (interactive "FShow file QR code: ")
  (eaf-open url "filetransfer"))

(provide 'eaf)

;;; eaf.el ends here
+5 −39
Original line number Diff line number Diff line
@@ -48,45 +48,11 @@ class EAF(dbus.service.Object):

        self.start_finish()

    @dbus.service.method(EAF_DBUS_NAME, in_signature="ss", out_signature="s")
    def new_buffer(self, buffer_id, url):
        if url == "eaf-demo":
            return self.create_app(buffer_id, url, "app.demo.buffer")
        elif url == "eaf-camera":
            return self.create_app(buffer_id, url, "app.camera.buffer")
        else:
            url = os.path.expanduser(url)

            if url.startswith("/"):
                if os.path.exists(url):
                    (_, extension) = os.path.splitext(url)

                    if extension in [".pdf", ".xps", ".oxps", ".cbz", ".epub", ".fb2", "fbz"]:
                        return self.create_app(buffer_id, url, "app.pdfviewer.buffer")
                    if extension in [".md"]:
                        return self.create_app(buffer_id, url, "app.markdownpreviewer.buffer")
                    else:
                        file_info = MediaInfo.parse(url)
                        if file_is_image(file_info):
                            return self.create_app(buffer_id, url, "app.imageviewer.buffer")
                        elif file_is_video(file_info):
                            return self.create_app(buffer_id, url, "app.videoplayer.buffer")
                        else:
                            return "Don't know how to open {0}".format(url)
                else:
                    return "Path {0} not exists.".format(url)
            else:
                from urllib.parse import urlparse
                result = urlparse(url)
                if len(result.scheme) != 0:
                    return self.create_app(buffer_id, result.geturl(), "app.browser.buffer")
                else:
                    result = urlparse("{0}:{1}".format("http", url))
                    if result.scheme != "":
                        return self.create_app(buffer_id, result.geturl(), "app.browser.buffer")
                    else:
                        return "{0} is not valid url".format(url)
        return ""
    @dbus.service.method(EAF_DBUS_NAME, in_signature="sss", out_signature="s")
    def new_buffer(self, buffer_id, url, app_name):
        # NOTE: We need use function str convert dbus.String to String,
        # otherwise some library will throw error, such as fitz library.
        return self.create_app(buffer_id, str(url), "app.{0}.buffer".format(str(app_name)))

    def create_app(self, buffer_id, url, module_path):
        if importlib.util.find_spec(module_path) is not None: