Конвертировать Windows UNC путь в QUrl для Mac - PullRequest
1 голос
/ 08 октября 2019

Справочная информация: у меня есть база данных, в которой пути к видеофайлам хранятся в виде строк пути Windows UNC, например "\\ 11.22.33.44 \ path \ movie.mp4". (Формат Windows - устаревшая вещь, и я не могу принципиально изменить способ их хранения).

Сейчас я работаю над медиаплеером Python, использующим QMediaPlayer из PyQt5. В Windows все работает нормально, и:

self.mediaPlayer.setMedia(QMediaContent(QUrl.fromLocalFile(str(fileName))))

открывает файл с фильмом в проигрывателе.

Однако есть требование, чтобы это работало и на Mac, и яПроблемы с переводом пути Windows UNC в формат QUrl, который работает на Mac. Я пробовал различные os.path и pathlib примеры в Интернете, но ни один из них, кажется, не создает действительный путь, с которым QUrl.fromLocalFile будет работать. Я всегда бью Error: Failed to load media. Я получаю результаты типа "/11.22.33.44/file/movie.mp4", где в начале есть как обратный, так и обратный слеш, и тому подобное.

Я должен указать, что да, это сетевые пути, будучи отправленным методу fromLocalFile, но документация для QUrl утверждает, что он будет работать с сетевыми путями: https://doc.qt.io/qt-5/qurl.html#fromLocalFile-, поэтому я не думаю, что это должно быть проблемой?

Может кто-нибудь объяснить мне, как сделать эту работу? Я предполагаю, что Pathlib должен быть в состоянии использовать это, и я просто подхожу к нему неправильно.

(Этот вопрос НЕ является дубликатом Загрузка видео с использованием путей QMediaPlayer и UNC , потому что мой кодЯ работаю в Windows, и у меня другая проблема с путями, удобными для Mac.)

1 Ответ

0 голосов
/ 08 октября 2019

Я сомневаюсь, есть ли абсолютно надежный и переносимый способ сделать это для произвольного сетевого пути. Однако, если ваши UNC-пути Windows всегда имеют один и тот же формат, должно работать что-то вроде этого:

import platform
from PyQt5.QtCore import QUrl

def make_url(unc):
    if platform.system() == 'Windows':
        url = QUrl.fromLocalFile(unc)
    else:
        url = QUrl(unc.replace('\\', '/'))
        if platform.system() == 'Darwin':
            url.setScheme('smb')
    return url

print(make_url(r'\\11.22.33.44\path\movie.mp4'))

Или, если это не сработает, попробуйте:

def make_url(unc):
    if platform.system() != 'Windows':
        unc = unc.replace('\\', '/')
    return QUrl.fromLocalFile(unc)   

(NB: Я использую Linux, поэтому у меня нет возможности это проверить).

...