zbjdonald / synology-drive-api

Synology drive api python wrapper.
MIT License
64 stars 16 forks source link

Copy fails when it is not a synology office file #18

Open alloant opened 1 year ago

alloant commented 1 year ago

Copy works well for synology office files like:

synd.copy("/mydrive/test.odoc","/mydrive/tests/test.odoc")

Always gives error for other files:

synd.copy("/mydrive/test.pdf","/mydrive/tests/test.pdf")

Using SYNO.SynologyDrive.Files in the code solve the issue for me, I don't know if this could be included/replace in files.py:

`def copy(self, source: str, dist: str) -> dict: """

    copy file or dir

    :param source : id:23333333333  or "'team-folders/folder2/'"

    :param dist: "'team-folders/folder2/temp.odoc'"

    """

    api_name = "SYNO.SynologyDrive.Files"

    endpoint = 'entry.cgi'

    distpath, distname = os.path.split(dist)

    params = {'api': api_name, 'version': 2, 'method': 'copy',

              'to_parent_folder': distpath, 'to_parent_name': distname,

              'conflict_action': 'autorename', 

              'files': f'["{source}"]'}

    return self.session.http_put(endpoint, params=params)

`

alloant commented 1 year ago

Still SYNO.Office.Node works better for Synology Office. I propose this solution:

    def copy(self, source: str, dist: str) -> dict:
        """
        copy file or dir
        :param source : id:23333333333  or "'team-folders/folder2/'"
        :param dist: "'team-folders/folder2/temp.odoc'"
        """
        distpath, distname = os.path.split(dist)
        ext = os.path.splitext(distname)[1]

        if ext in ['.odoc','osheet','oslides']:
            copy_office(source,dist)
        else:
            copy_drive(source,dist)

    def copy_office(self, source: str, dist: str) -> dict:
        """
        copy file or dir
        :param source : id:23333333333  or "'team-folders/folder2/'"
        :param dist: "'team-folders/folder2/temp.odoc'"
        """
        if source.isdigit():
            source = f"id:{source}"
        else:
            source = f"/{source}" if not source.startswith('/') else source

        endpoint = 'entry.cgi'
        distpath, distname = os.path.split(dist)
        api_name = "SYNO.Office.Node"
        params = {'api': api_name, 'version': 2, 'method': 'copy',
                  'to_parent_folder': distpath, 'dry_run': 'true', 'name': distname,
                  'title': distname[:distname.index('.')],
                  'files': f'["{source}"]'}
        return self.session.http_put(endpoint, params=params)

    def copy_drive(self, source: str, dist: str) -> dict:
        """
        copy file or dir
        :param source : id:23333333333  or "'team-folders/folder2/'"
        :param dist: "'team-folders/folder2/temp.odoc'"
        """
        if source.isdigit():
            source = f"id:{source}"
        else:
            source = f"/{source}" if not source.startswith('/') else source

        api_name = "SYNO.SynologyDrive.Files"
        endpoint = 'entry.cgi'
        distpath, distname = os.path.split(dist)
        params = {'api': api_name, 'version': 2, 'method': 'copy',
                  'to_parent_folder': distpath, 'to_parent_name': distname,
                  'conflict_action': 'autorename', 
                  'files': f'["{source}"]'}
        return self.session.http_put(endpoint, params=params)
zbjdonald commented 1 year ago

Still SYNO.Office.Node works better for Synology Office. I propose this solution:

    def copy(self, source: str, dist: str) -> dict:
        """
        copy file or dir
        :param source : id:23333333333  or "'team-folders/folder2/'"
        :param dist: "'team-folders/folder2/temp.odoc'"
        """
        distpath, distname = os.path.split(dist)
        ext = os.path.splitext(distname)[1]

        if ext in ['.odoc','osheet','oslides']:
            copy_office(source,dist)
        else:
            copy_drive(source,dist)

    def copy_office(self, source: str, dist: str) -> dict:
        """
        copy file or dir
        :param source : id:23333333333  or "'team-folders/folder2/'"
        :param dist: "'team-folders/folder2/temp.odoc'"
        """
        if source.isdigit():
            source = f"id:{source}"
        else:
            source = f"/{source}" if not source.startswith('/') else source

        endpoint = 'entry.cgi'
        distpath, distname = os.path.split(dist)
        api_name = "SYNO.Office.Node"
        params = {'api': api_name, 'version': 2, 'method': 'copy',
                  'to_parent_folder': distpath, 'dry_run': 'true', 'name': distname,
                  'title': distname[:distname.index('.')],
                  'files': f'["{source}"]'}
        return self.session.http_put(endpoint, params=params)

    def copy_drive(self, source: str, dist: str) -> dict:
        """
        copy file or dir
        :param source : id:23333333333  or "'team-folders/folder2/'"
        :param dist: "'team-folders/folder2/temp.odoc'"
        """
        if source.isdigit():
            source = f"id:{source}"
        else:
            source = f"/{source}" if not source.startswith('/') else source

        api_name = "SYNO.SynologyDrive.Files"
        endpoint = 'entry.cgi'
        distpath, distname = os.path.split(dist)
        params = {'api': api_name, 'version': 2, 'method': 'copy',
                  'to_parent_folder': distpath, 'to_parent_name': distname,
                  'conflict_action': 'autorename', 
                  'files': f'["{source}"]'}
        return self.session.http_put(endpoint, params=params)

Let me see.

1983shake commented 1 year ago

Still SYNO.Office.Node works better for Synology Office. I propose this solution:

    def copy(self, source: str, dist: str) -> dict:
        """
        copy file or dir
        :param source : id:23333333333  or "'team-folders/folder2/'"
        :param dist: "'team-folders/folder2/temp.odoc'"
        """
        distpath, distname = os.path.split(dist)
        ext = os.path.splitext(distname)[1]

        if ext in ['.odoc','osheet','oslides']:
            copy_office(source,dist)
        else:
            copy_drive(source,dist)

    def copy_office(self, source: str, dist: str) -> dict:
        """
        copy file or dir
        :param source : id:23333333333  or "'team-folders/folder2/'"
        :param dist: "'team-folders/folder2/temp.odoc'"
        """
        if source.isdigit():
            source = f"id:{source}"
        else:
            source = f"/{source}" if not source.startswith('/') else source

        endpoint = 'entry.cgi'
        distpath, distname = os.path.split(dist)
        api_name = "SYNO.Office.Node"
        params = {'api': api_name, 'version': 2, 'method': 'copy',
                  'to_parent_folder': distpath, 'dry_run': 'true', 'name': distname,
                  'title': distname[:distname.index('.')],
                  'files': f'["{source}"]'}
        return self.session.http_put(endpoint, params=params)

    def copy_drive(self, source: str, dist: str) -> dict:
        """
        copy file or dir
        :param source : id:23333333333  or "'team-folders/folder2/'"
        :param dist: "'team-folders/folder2/temp.odoc'"
        """
        if source.isdigit():
            source = f"id:{source}"
        else:
            source = f"/{source}" if not source.startswith('/') else source

        api_name = "SYNO.SynologyDrive.Files"
        endpoint = 'entry.cgi'
        distpath, distname = os.path.split(dist)
        params = {'api': api_name, 'version': 2, 'method': 'copy',
                  'to_parent_folder': distpath, 'to_parent_name': distname,
                  'conflict_action': 'autorename', 
                  'files': f'["{source}"]'}
        return self.session.http_put(endpoint, params=params)

Let me see.

请问这段代码能解决问题吗?