Compare commits

...

12 Commits

Author SHA1 Message Date
Chee Yee 785a073bce fixed issue parse apache2 httpd directory listing using docker image 2024-10-26 15:31:01 -07:00
Chee Yee a71bd1eb28 enchancements to install from url 2024-10-08 20:50:42 -07:00
Chee Yee 0a1420dd96 add support for myrient.erista.me website 2024-07-20 02:45:52 -07:00
Chee Yee dcdc1fc54b use spaces for separator, seems less overcrowded 2024-07-16 21:27:12 -07:00
Chee Yee 5c254589e6 Merge branch 'master' of github.com:cy33hc/ps4-ezremote-client 2024-07-16 20:59:32 -07:00
Chee Yee 2b25272379 display server url in the sites drop down to easily identify site 2024-07-16 20:59:23 -07:00
cy33hc 6b66d39eba Update README.md 2024-07-16 10:42:18 -07:00
Chee Yee b143c3e3c5 add archive org screenshot 2024-07-15 19:15:25 -07:00
Chee Yee c3cc6d5954 add screenshots for archive org retrieve download URL 2024-07-15 15:02:55 -07:00
Chee Yee cfcb420b9d add support for archive.org 2024-07-14 01:54:54 -07:00
Chee Yee 294455c735 add ability to use L2 button to navigate back to previous directory 2024-07-13 19:40:20 -07:00
Chee Yee 4ff119b34d fix crash on failed install split pkg 2024-07-03 09:12:49 -07:00
27 changed files with 1087 additions and 90 deletions
+4 -2
View File
@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.0)
cmake_minimum_required(VERSION 3.5)
project(ezremote_client)
@@ -25,8 +25,10 @@ add_executable(ezremote_client
source/http/httplib.cpp
source/clients/baseclient.cpp
source/clients/apache.cpp
source/clients/archiveorg.cpp
source/clients/ftpclient.cpp
source/clients/gdrive.cpp
source/clients/myrient.cpp
source/clients/iis.cpp
source/clients/nginx.cpp
source/clients/npxserve.cpp
@@ -67,7 +69,7 @@ add_executable(ezremote_client
add_self(ezremote_client)
add_pkg(ezremote_client ${CMAKE_SOURCE_DIR}/data "RMTC00001" "ezRemote Client" "01.27" 32 0)
add_pkg(ezremote_client ${CMAKE_SOURCE_DIR}/data "RMTC00001" "ezRemote Client" "01.30" 32 0)
target_link_libraries(ezremote_client
c
+8 -1
View File
@@ -81,7 +81,13 @@ To distinguish between FTP, SMB, NFS, WebDAV or HTTP, the URL must be prefix wit
```
- For Google Drive use the following URL for the server **https://drive.google.com**
<br />[Go to the following wiki for instructions on how to setup the app to connect to Google Drive]( https://github.com/cy33hc/ps4-ezremote-client/wiki/Setup-App-for-use-with-Google-Drive)
- For Internet Archive repos download URLs
- Only supports parsing of the download URL (ie the URL where you see a list of files). Example
| | | |
|----------|-----------|---|
| ![archive_org_screen1](https://github.com/user-attachments/assets/b129b6cf-b938-4d7c-a3fa-61e1c633c1f6) | ![archive_org_screen2](https://github.com/user-attachments/assets/646106d1-e60b-4b35-b153-3475182df968)| ![image](https://github.com/user-attachments/assets/cad94de8-a694-4ef5-92a8-b87468e30adb) |
Tested with following WebDAV server:
- **(Recommeded)** [Dufs](https://github.com/sigoden/dufs) - For hosting your own WebDAV server. (Recommended since this allow anonymous access which is required for Remote Package Install)
- [SFTPgo](https://github.com/drakkan/sftpgo) - For local hosted WebDAV server. Can also be used as a webdav frontend for Cloud Storage like AWS S3, Azure Blob or Google Storage.
@@ -136,6 +142,7 @@ Circle - Un-Select the file list to navigate to other widgets or Close Dialog wi
Square - Mark file(s)/folder(s) for Delete/Rename/Upload/Download
R1 - Navigate to the Remote list of files
L1 - Navigate to the Local list of files
L2 - To go up a directory from current directory
TouchPad Button - Exit Application (versions prior to 1.06)
Options Button - Exit Application (versions 1.06 and above)
```
Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

+1 -1
View File
@@ -113,7 +113,7 @@ STR_DOWNLOAD_INSTALL_MSG=تثبيت الحزمة عن بعد غير ممكن. ه
STR_CHECKING_REMOTE_SERVER_MSG=التحقق من الخادم البعيد لتثبيت الحزمة عن بعد.
STR_ENABLE_RPI=RPI
STR_ENABLE_RPI_FTP_SMB_MSG=يتيح هذا الخيار تثبيت الحزمة عن بُعد عبر خادم الويب المضمن.
STR_ENABLE_RPI_WEBDAV_MSG==يتيح هذا الخيار تثبيت الحزمة عن بُعد عبر خادم الويب المضمن.
STR_ENABLE_RPI_WEBDAV_MSG=يتيح هذا الخيار تثبيت الحزمة عن بُعد عبر خادم الويب المضمن.
STR_FILES=الملفات
STR_EDITOR=المحرر
STR_SAVE=حفظ
+6 -3
View File
@@ -112,8 +112,8 @@ STR_CANNOT_CONNECT_REMOTE_MSG=Remote HTTP Server not reachable.
STR_DOWNLOAD_INSTALL_MSG=Remote Package Install not possible. Would you like to download package and install instead?
STR_CHECKING_REMOTE_SERVER_MSG=Checking remote server for Remote Package Install.
STR_ENABLE_RPI=RPI
STR_ENABLE_RPI_FTP_SMB_MSG=This option enables Remote Package Installation via embedded Web Server.
STR_ENABLE_RPI_WEBDAV_MSG==This option enables Remote Package Installation via embedded Web Server.
STR_ENABLE_RPI_FTP_SMB_MSG=This option enables Remote Package Installation via embedded Web Server proxy.
STR_ENABLE_RPI_WEBDAV_MSG=This option enables Remote Package Installation via embedded Web Server proxy.
STR_FILES=Files
STR_EDITOR=Editor
STR_SAVE=Save
@@ -160,4 +160,7 @@ STR_LANGUAGE=Language
STR_TEMP_DIRECTORY=Temp Directory
STR_REALDEBRID=Real-Debrid
STR_BACKGROUND_INSTALL_INPROGRESS=Package install is running in the background. Don't close the app while install is in progress
STR_ENABLE_DISC_CACHE_MSG=Enable disk caching. Can improve package install speed in cases where connection to remote is slow
STR_ENABLE_DISC_CACHE_MSG=Enable disk caching. Can improve Remote Package Install speed in cases where connection to remote is slow, but breaks resuming of install
STR_ENABLE_ALLDEBRID_MSG=Install Via AllDebrid
STR_ENABLE_REALDEBRID_MSG=Install Via RealDebrid
STR_ENABLE_DISKCACHE_DESC=Enable Disk Cache
+74 -2
View File
@@ -25,7 +25,7 @@ STR_FILE=파일
STR_TYPE=종류
STR_NAME=이름
STR_SIZE=크기
STR_DATE=일시
STR_DATE=날짜
STR_NEW_FOLDER=새 폴더
STR_RENAME=이름 변경
STR_DELETE=삭제
@@ -39,7 +39,7 @@ STR_OVERWRITE=덮어쓰기
STR_DONT_OVERWRITE=덮어쓰기 금지
STR_ASK_FOR_CONFIRM=수락여부를 질문
STR_DONT_ASK_CONFIRM=수락여부를 묻지 않음
STR_ALLWAYS_USE_OPTION=다시 묻지 않고 항상 이 설정을 사용
STR_ALLWAYS_USE_OPTION=다시 묻지 않고 항상 이 설정을 사용
STR_ACTIONS=실행
STR_CONFIRM=확인
STR_OVERWRITE_OPTIONS=덮어쓰기 옵션
@@ -59,3 +59,75 @@ STR_FAIL_DEL_DIR_MSG=디렉토리 삭제에 실패하였습니다.
STR_DELETING=삭제 중
STR_FAIL_DEL_FILE_MSG=파일 삭제에 실패하였습니다.
STR_DELETED=삭제됨
STR_LINK=링크
STR_SHARE=공유
STR_FAILED=310 실패함
STR_FAIL_CREATE_LOCAL_FILE_MSG=310 로컬에서 파일을 만들기 실패함
STR_INSTALL=설치
STR_INSTALLING=설치 중
STR_INSTALL_SUCCESS=성공
STR_INSTALL_FAILED=실패함
STR_INSTALL_SKIPPED=건너뜀
STR_CHECK_HTTP_MSG=원격 HTTP 서버에 대한 연결 확인
STR_FAILED_HTTP_CHECK=HTTP 서버에 연결에 실패함
STR_REMOTE_NOT_HTTP=원격이 HTTP 서버가 아님
STR_INSTALL_FROM_DATA_MSG=패키지가 /data 또는 /mnt/usbX 폴더에 없음
STR_ALREADY_INSTALLED_MSG=패키지가 이미 설치되었음
STR_INSTALL_FROM_URL=URL에서 설치
STR_CANNOT_READ_PKG_HDR_MSG=패키지 헤더 정보를 읽을 수 없음
STR_FAVORITE_URLS=즐겨찾기 URL
STR_SLOT=슬롯
STR_EDIT=편집
STR_ONETIME_URL=한 번만 Url
STR_NOT_A_VALID_PACKAGE=유효하지 않은 패키지
STR_WAIT_FOR_INSTALL_MSG=패키지 설치가 완료되기를 기다리는 중
STR_FAIL_INSTALL_TMP_PKG_MSG=pkg 파일을 설치하지 못했습니다. tmp pkg를 수동으로 삭제하세요.
STR_AUTO_DELETE_TMP_PKG=설치 후 임시로 다운로드한 pkg 파일을 자동으로 삭제
STR_PROTOCOL_NOT_SUPPORTED=지원되지 않는 프로토콜
STR_COULD_NOT_RESOLVE_HOST=호스트 이름을 확인할 수 없음
STR_EXTRACT=압축 해제
STR_EXTRACTING=압축 해제 중
STR_FAILED_TO_EXTRACT=압축 해제 실패함
STR_EXTRACT_LOCATION=압축 해제 위치
STR_COMPRESS=압축
STR_ZIP_FILE_PATH=Zip 파일 이름
STR_COMPRESSING=압축 중
STR_ERROR_CREATE_ZIP=zip 파일을 만드는 동안 오류 발생
STR_UNSUPPORTED_FILE_FORMAT=지원되지 않는 압축 파일 형식
STR_CUT=잘라내기
STR_COPY=복사
STR_PASTE=붙여넣기
STR_MOVING=이동 중
STR_COPYING=복사 중
STR_FAIL_MOVE_MSG=파일 이동 실패함
STR_FAIL_COPY_MSG=파일 복사 실패함
STR_CANT_MOVE_TO_SUBDIR_MSG=상위 디렉토리를 하위 디렉토리로 이동할 수 없음
STR_CANT_COPY_TO_SUBDIR_MSG=상위 디렉토리를 하위 디렉토리로 복사할 수 없음
STR_UNSUPPORTED_OPERATION_MSG=지원되지 않는 작업
STR_HTTP_PORT=Http 포트
STR_REINSTALL_CONFIRM_MSG=콘텐츠가 이미 설치되었습니다. 설치를 계속할까요?
STR_REMOTE_NOT_SUPPORT_MSG=보호된 서버에서는 원격 패키지 설치가 지원되지 않습니다.
STR_CANNOT_CONNECT_REMOTE_MSG=원격 HTTP 서버에 연결할 수 없습니다.
STR_DOWNLOAD_INSTALL_MSG=원격 패키지 설치가 불가능합니다. 패키지를 다운로드하여 설치할까요?
STR_CHECKING_REMOTE_SERVER_MSG=원격 패키지 설치를 위해 원격 서버를 확인하고 있습니다.
STR_FILES=파일
STR_EDITOR=편집기
STR_SAVE=저장
STR_MAX_EDIT_FILE_SIZE_MSG=다음보다 큰 파일을 편집할 수 없음
STR_DELETE_LINE=선택한 줄 삭제
STR_INSERT_LINE=선택한 줄 아래에 삽입
STR_MODIFIED=수정됨
STR_FAIL_GET_TOKEN_MSG=다음에서 접속 토큰을 얻는데 실패함
STR_GET_TOKEN_SUCCESS_MSG=로그인에 성공했습니다. 브라우저를 닫고 애플리케이션으로 돌아갈 수 있음
STR_NEW_FILE=새 파일
STR_SETTINGS=설정
STR_GLOBAL=글로벌
STR_COPY_LINE=선택한 줄 복사
STR_PASTE_LINE=선택한 줄에 붙여넣기
STR_SHOW_HIDDEN_FILES=숨겨진 파일 표시
STR_SET_DEFAULT_DIRECTORY=기본 폴더 설정
STR_SET_DEFAULT_DIRECTORY_MSG=기본 디렉터리로 설정됨
STR_NFS_EXP_PATH_MISSING_MSG=URL에 NFS 내보내기 경로 없음
STR_FAIL_INIT_NFS_CONTEXT=NFS 컨텍스트를 초기화 실패함
STR_FAIL_MOUNT_NFS_MSG=NFS 공유를 마운트 실패함
STR_VIEW_IMAGE=이미지 보기
+94 -36
View File
@@ -1,75 +1,133 @@
STR_CONNECTION_SETTINGS=Bağlantı Ayarları
STR_SITE=Site
STR_LOCAL=Yerel
STR_REMOTE=Uzaktan
STR_REMOTE=Uzak
STR_MESSAGES=Mesajlar
STR_UPDATE_SOFTWARE=Yazılımı Güncelle
STR_CONNECT=Bağlan
STR_DISCONNECT=Bağlantıyı kes
STR_SEARCH=Ara
STR_DISCONNECT=Bağlantıyı Kes
STR_SEARCH=Arama
STR_REFRESH=Yenile
STR_SERVER=Sunucu
STR_USERNAME=Kullanıcı Adı
STR_PASSWORD=Şifre
STR_PASSWORD=Parola
STR_PORT=Port
STR_PASV=Pasv
STR_PASV=Pasif
STR_DIRECTORY=Dizin
STR_FILTER=Filtre
STR_YES=Evet
STR_NO=Hayır
STR_CANCEL=İptal
STR_CONTINUE=Devam
STR_CONTINUE=Devam Et
STR_CLOSE=Kapat
STR_FOLDER=Klasör
STR_FILE=Dosya
STR_TYPE=Tip
STR_TYPE=Tür
STR_NAME=Ad
STR_SIZE=Boyut
STR_DATE=Tarih
STR_NEW_FOLDER=Yeni Klasör
STR_RENAME=Yeniden Adlandır
STR_DELETE=Sil
STR_UPLOAD=Karşıya Yükle
STR_UPLOAD=Yükle
STR_DOWNLOAD=İndir
STR_SELECT_ALL=Tümünü Seç
STR_CLEAR_ALL=Tümünü Temizle
STR_UPLOADING=Karşıya Yükleniyor
STR_SELECT_ALL=Hepsini Seç
STR_CLEAR_ALL=Hepsini Temizle
STR_UPLOADING=Yükleniyor
STR_DOWNLOADING=İndiriliyor
STR_OVERWRITE=Üzerine yaz
STR_DONT_OVERWRITE=Üzerine yazma
STR_ASK_FOR_CONFIRM=Onaylamak için sor
STR_DONT_ASK_CONFIRM=Onaylamak için sorma
STR_ALLWAYS_USE_OPTION=Daima bu seçeneği kullan ve bir daha sorma
STR_ACTIONS=Eylemler
STR_OVERWRITE=Üzerine Yaz
STR_DONT_OVERWRITE=Üzerine Yazma
STR_ASK_FOR_CONFIRM=Onay İste
STR_DONT_ASK_CONFIRM=Onay İsteme
STR_ALLWAYS_USE_OPTION=Bu seçeneği her zaman kullan ve bir daha sorma
STR_ACTIONS=İşlemler
STR_CONFIRM=Onayla
STR_OVERWRITE_OPTIONS=Ayarların üzerine yaz
STR_OVERWRITE_OPTIONS=Üzerine Yazma Seçenekleri
STR_PROPERTIES=Özellikler
STR_PROGRESS=Durum
STR_PROGRESS=İlerleme
STR_UPDATES=Güncellemeler
STR_DEL_CONFIRM_MSG=Bu dosya(ları)/klasör(leri) silmek istediğinizden emin misiniz?
STR_CANCEL_ACTION_MSG=İptal ediliyor. Son lemin tamamlanması bekleniyor
STR_FAIL_UPLOAD_MSG=Dosya karşıya yükleme başarısız
STR_FAIL_DOWNLOAD_MSG=Dosya indirme başarısız
STR_FAIL_READ_LOCAL_DIR_MSG=Dizindeki içerikler okunamadı ya da öyle bir klasör yok
STR_CONNECTION_CLOSE_ERR_MSG=426 Bağlantı kesildi.
STR_REMOTE_TERM_CONN_MSG=426 Uzaktan Sunucu bağlantıyı kesti.
STR_FAIL_LOGIN_MSG=300 Giriş başarısız. Lütfen kullanıcı adınızı ve şifrenizi kontrol edin.
STR_CANCEL_ACTION_MSG=İptal ediliyor. Son eylemin tamamlanması bekleniyor
STR_FAIL_UPLOAD_MSG=Dosya yüklenemedi
STR_FAIL_DOWNLOAD_MSG=Dosya indirilemedi
STR_FAIL_READ_LOCAL_DIR_MSG=Yerel dizinin içeriği okunamadı veya klasör mevcut değil.
STR_CONNECTION_CLOSE_ERR_MSG=426 Bağlantı kapatıldı.
STR_REMOTE_TERM_CONN_MSG=426 Uzak Sunucu bağlantıyı sonlandırdı.
STR_FAIL_LOGIN_MSG=300 Giriş Başarısız. Lütfen kullanıcı adınızı veya şifrenizi kontrol edin.
STR_FAIL_TIMEOUT_MSG=426 Başarısız. Bağlantı zaman aşımına uğradı.
STR_FAIL_DEL_DIR_MSG=Dizin silme başarısız
STR_FAIL_DEL_DIR_MSG=Dizin silinemedi
STR_DELETING=Siliniyor
STR_FAIL_DEL_FILE_MSG=Dosya silme başarısız
STR_FAIL_DEL_FILE_MSG=Dosya silinemedi
STR_DELETED=Silindi
STR_LINK=Link
STR_LINK=Bağlantı
STR_SHARE=Paylaş
STR_FAILED=310 Başarısız
STR_FAIL_CREATE_LOCAL_FILE_MSG=310 Yerelde dosya oluşturulumu başarısız
STR_INSTALL=Yükle
STR_INSTALLING=Yükleniyor
STR_FAIL_CREATE_LOCAL_FILE_MSG=310 Yerelde dosya oluşturulamadı
STR_INSTALL=Kur
STR_INSTALLING=Kuruluyor
STR_INSTALL_SUCCESS=Başarılı
STR_INSTALL_FAILED=Başarısız
STR_INSTALL_SKIPPED=Atlandı
STR_CHECK_HTTP_MSG=Uzaktan HTTP Sunucusu bağlantısı kontrol ediliyor
STR_FAILED_HTTP_CHECK=HTTP Sunucusuna bağlantı başarısız
STR_REMOTE_NOT_HTTP=Uzaktaki HTTP Sunucusu değil
STR_INSTALL_FROM_DATA_MSG=Paket /data ya da /mnt/usbX dizininde değil
STR_CHECK_HTTP_MSG=Uzak HTTP Sunucusuna bağlantı kontrol ediliyor
STR_FAILED_HTTP_CHECK=HTTP Sunucusuna bağlanılamadı
STR_REMOTE_NOT_HTTP=Uzak bir HTTP Sunucusu değil
STR_INSTALL_FROM_DATA_MSG=Paket /data veya /mnt/usbX klasöründe değil
STR_ALREADY_INSTALLED_MSG=Paket zaten kurulu
STR_INSTALL_FROM_URL=URL'den Kur
STR_CANNOT_READ_PKG_HDR_MSG=Paket başlık bilgisi okunamadı
STR_FAVORITE_URLS=Favori URL'ler
STR_SLOT=Yuva
STR_EDIT=Düzenle
STR_ONETIME_URL=Tek Seferlik URL
STR_NOT_A_VALID_PACKAGE=Geçerli bir Paket değil
STR_WAIT_FOR_INSTALL_MSG=Paketin kurulmasının tamamlanması bekleniyor
STR_FAIL_INSTALL_TMP_PKG_MSG=Geçici paketin kurulumu başarısız. Lütfen geçici paketi manuel olarak silin
STR_AUTO_DELETE_TMP_PKG=Kurulumdan sonra geçici indirilen paketi otomatik olarak sil
STR_PROTOCOL_NOT_SUPPORTED=Protokol desteklenmiyor
STR_COULD_NOT_RESOLVE_HOST=Ana bilgisayar adı çözülemedi
STR_EXTRACT=Çıkart
STR_EXTRACTING=Çıkartılıyor
STR_FAILED_TO_EXTRACT=Çıkartma başarısız oldu
STR_EXTRACT_LOCATION=Çıkartılacak Konum
STR_COMPRESS=Sıkıştır
STR_ZIP_FILE_PATH=Zip Dosya Adı
STR_COMPRESSING=Sıkıştırılıyor
STR_ERROR_CREATE_ZIP=Zip oluşturulurken hata oluştu
STR_UNSUPPORTED_FILE_FORMAT=Desteklenmeyen sıkıştırılmış dosya formatı
STR_CUT=Kes
STR_COPY=Kopyala
STR_PASTE=Yapıştır
STR_MOVING=Taşınıyor
STR_COPYING=Kopyalanıyor
STR_FAIL_MOVE_MSG=Dosya taşınamadı
STR_FAIL_COPY_MSG=Dosya kopyalanamadı
STR_CANT_MOVE_TO_SUBDIR_MSG=Ana dizin alt dizinine taşınamaz
STR_CANT_COPY_TO_SUBDIR_MSG=Ana dizin alt dizinine kopyalanamaz
STR_UNSUPPORTED_OPERATION_MSG=Desteklenmeyen işlem
STR_HTTP_PORT=Http Portu
STR_REINSTALL_CONFIRM_MSG=İçerik zaten kurulu. Kuruluma devam etmek istiyor musunuz?
STR_REMOTE_NOT_SUPPORT_MSG=Korunan sunucular için uzak paket kurulumu desteklenmiyor.
STR_CANNOT_CONNECT_REMOTE_MSG=Uzak HTTP Sunucusuna bağlanılamıyor.
STR_DOWNLOAD_INSTALL_MSG=Uzak Paket Kurulumu mümkün değil. Paketi indirip kurmak ister misiniz?
STR_CHECKING_REMOTE_SERVER_MSG=Uzak Paket Kurulumu için uzak sunucu kontrol ediliyor.
STR_FILES=Dosyalar
STR_EDITOR=Düzenleyici
STR_SAVE=Kaydet
STR_MAX_EDIT_FILE_SIZE_MSG=Boyutu şu büyüklükten büyük dosyalar düzenlenemez
STR_DELETE_LINE=Seçili Satırı Sil
STR_INSERT_LINE=Seçili Satırın Altına Ekle
STR_MODIFIED=Değiştirildi
STR_FAIL_GET_TOKEN_MSG=Erişim token'ı alınamadı
STR_GET_TOKEN_SUCCESS_MSG=Giriş Başarılı. Tarayıcıyı kapatıp uygulamaya dönebilirsiniz
STR_NEW_FILE=Yeni Dosya
STR_SETTINGS=Ayarlar
STR_GLOBAL=Genel
STR_COPY_LINE=Seçili satırı kopyala
STR_PASTE_LINE=Seçili satıra yapıştır
STR_SHOW_HIDDEN_FILES=Gizli dosyaları göster
STR_SET_DEFAULT_DIRECTORY=Varsayılan Klasörü Ayarla
STR_SET_DEFAULT_DIRECTORY_MSG=varsayılan dizin olarak ayarlandı
STR_NFS_EXP_PATH_MISSING_MSG=URL'de NFS dışa aktarma yolu eksik
STR_FAIL_INIT_NFS_CONTEXT=NFS bağlamı başlatılamadı
STR_FAIL_MOUNT_NFS_MSG=NFS paylaşımı bağlanamadı
STR_VIEW_IMAGE=Görüntüyü Görüntüle
+133
View File
@@ -0,0 +1,133 @@
STR_CONNECTION_SETTINGS=Cài đặt kết nối
STR_SITE=Vị trí
STR_LOCAL=Thiết bị
STR_REMOTE=Máy đích
STR_MESSAGES=Tin nhắn
STR_UPDATE_SOFTWARE=Cập nhật phần mềm
STR_CONNECT=Kết nối
STR_DISCONNECT=Ngắt kết nối
STR_SEARCH=Tìm kiếm
STR_REFRESH=Làm mới
STR_SERVER=Máy chủ
STR_USERNAME=Tên đăng nhập
STR_PASSWORD=Mật khẩu
STR_PORT=Cổng
STR_PASV=Pasv
STR_DIRECTORY=Thư mục
STR_FILTER=Bộ lọc
STR_YES=Đồng ý
STR_NO=Không
STR_CANCEL=Hủy bỏ
STR_CONTINUE=Tiếp tục
STR_CLOSE=Đóng
STR_FOLDER=Thư mục
STR_FILE=Tập tin
STR_TYPE=Loại
STR_NAME=Tên
STR_SIZE=Kích thước
STR_DATE=Ngày tháng
STR_NEW_FOLDER=Thư mục mới
STR_RENAME=Đổi tên
STR_DELETE=Xóa
STR_UPLOAD=Tải lên
STR_DOWNLOAD=Tải xuống
STR_SELECT_ALL=Chọn tất cả
STR_CLEAR_ALL=Bỏ chọn tất cả
STR_UPLOADING=Đang tải lên
STR_DOWNLOADING=Đang tải xuống
STR_OVERWRITE=Ghi đè
STR_DONT_OVERWRITE=Không ghi đè
STR_ASK_FOR_CONFIRM=Hỏi xác nhận
STR_DONT_ASK_CONFIRM=Không hỏi xác nhận
STR_ALLWAYS_USE_OPTION=Luôn dùng tùy chọn này và không hỏi lại
STR_ACTIONS=Hành động
STR_CONFIRM=Xác nhận
STR_OVERWRITE_OPTIONS=Tùy chọn ghi đè
STR_PROPERTIES=Thuộc tính
STR_PROGRESS=Tiến trình
STR_UPDATES=Cập nhật
STR_DEL_CONFIRM_MSG=Bạn có chắc chắn muốn xóa (những) tập tin / thư mục này không?
STR_CANCEL_ACTION_MSG=Hủy bỏ. Chờ hành động cuối cùng hoàn tất.Canceling.
STR_FAIL_UPLOAD_MSG=Không thể tải file lên
STR_FAIL_DOWNLOAD_MSG=Không thể tải file
STR_FAIL_READ_LOCAL_DIR_MSG=Không đọc được nội dung của thư mục hoặc thư mục không tồn tại.
STR_CONNECTION_CLOSE_ERR_MSG=426 Kết nối đã đóng.
STR_REMOTE_TERM_CONN_MSG=426 Máy chủ đã ngắt kết nối.
STR_FAIL_LOGIN_MSG=300 Đăng nhập thất bại. Vui lòng kiểm tra lại tên đăng nhập hoặc mật khẩu.
STR_FAIL_TIMEOUT_MSG=426 Thất bại. Quá thời gian kết nối.
STR_FAIL_DEL_DIR_MSG=Không thể xóa thư mục
STR_DELETING=Đang xóa
STR_FAIL_DEL_FILE_MSG=Không thể xóa tập tin
STR_DELETED=Đã xóa
STR_LINK=Liên kết
STR_SHARE=Chia sẻ
STR_FAILED=310 Lỗi
STR_FAIL_CREATE_LOCAL_FILE_MSG=310 Không thể tạo file trên máy này
STR_INSTALL=Cài đặt
STR_INSTALLING=Đang cài đặt
STR_INSTALL_SUCCESS=Thành công
STR_INSTALL_FAILED=Thất bại
STR_INSTALL_SKIPPED=Bỏ qua
STR_CHECK_HTTP_MSG=Đang kiểm tra kết nối tới máy chủ HTTP
STR_FAILED_HTTP_CHECK=Không thể kết nối tới máy chủ HTTP
STR_REMOTE_NOT_HTTP=Máy đích không phải máy chủ HTTP
STR_INSTALL_FROM_DATA_MSG=Package không có trong thư mục /data hoặc /mnt/usbX
STR_ALREADY_INSTALLED_MSG=Package đã được cài đặt
STR_INSTALL_FROM_URL=Cài từ địa chỉ URL
STR_CANNOT_READ_PKG_HDR_MSG=Không thể đọc được thông tin header của package
STR_FAVORITE_URLS=URLs yêu thích
STR_SLOT=Vị trí
STR_EDIT=Sửa
STR_ONETIME_URL=Url một lần
STR_NOT_A_VALID_PACKAGE=Package không đúng
STR_WAIT_FOR_INSTALL_MSG=Đợi Package kết thúc cài đặt
STR_FAIL_INSTALL_TMP_PKG_MSG=Không thể cài file pkg. Vui lòng xóa tmp pkg thủ công
STR_AUTO_DELETE_TMP_PKG=Tự động xóa file pkg được tải về tạm thời sau khi cài xong
STR_PROTOCOL_NOT_SUPPORTED=Protocol không được hỗ trợ
STR_COULD_NOT_RESOLVE_HOST=Không thể phân giải tên máy chủ
STR_EXTRACT=Giải nén
STR_EXTRACTING=Đang giải nén
STR_FAILED_TO_EXTRACT=Giải nén thất bại
STR_EXTRACT_LOCATION=Vị trí giải nén
STR_COMPRESS=Nén
STR_ZIP_FILE_PATH=Tên file Zip
STR_COMPRESSING=Đang nén
STR_ERROR_CREATE_ZIP=Lỗi khi tạo file zip
STR_UNSUPPORTED_FILE_FORMAT=Phần mở rộng file không được hỗ trợ
STR_CUT=Cắt
STR_COPY=Sao chép
STR_PASTE=Dán
STR_MOVING=Đang di chuyển
STR_COPYING=Đang copy
STR_FAIL_MOVE_MSG=Không thể di chuyển file
STR_FAIL_COPY_MSG=Không thể sao chép file
STR_CANT_MOVE_TO_SUBDIR_MSG=Không thể di chuyển thư mục cha vào bên trong thư mục con
STR_CANT_COPY_TO_SUBDIR_MSG=Không thể sao chép thư mục cha vào bên trong thư mục con
STR_UNSUPPORTED_OPERATION_MSG=Hành động không được hỗ trợ
STR_HTTP_PORT=Cổng Http
STR_REINSTALL_CONFIRM_MSG=Nội dung đã được cài đặt. Bạn có muốn tiếp tục cài đặt không?
STR_REMOTE_NOT_SUPPORT_MSG=Cài đặt gói từ xa không được hỗ trợ cho các máy chủ được bảo vệ.
STR_CANNOT_CONNECT_REMOTE_MSG=Máy chủ HTTP đích không thể truy cập được.
STR_DOWNLOAD_INSTALL_MSG=Không thể cài đặt package từ xa. Bạn có muốn tải package xuống và cài đặt không?
STR_CHECKING_REMOTE_SERVER_MSG=Đang kiểm tra máy chủ đích để cài đặt package từ xa.
STR_FILES=Tập tin
STR_EDITOR=Trình soạn thảo
STR_SAVE=Lưu
STR_MAX_EDIT_FILE_SIZE_MSG=Không thể chỉnh sửa các tập tin lớn hơn
STR_DELETE_LINE=Xóa dòng đã chọn
STR_INSERT_LINE=Chèn bên dưới dòng đã chọn
STR_MODIFIED=Đã sửa đổi
STR_FAIL_GET_TOKEN_MSG=Không thể lấy được access token từ
STR_GET_TOKEN_SUCCESS_MSG=Đăng nhập thành công. Bạn có thể đóng trình duyệt và quay lại ứng dụng
STR_NEW_FILE=Tập tin mới
STR_SETTINGS=Cài đặt
STR_GLOBAL=Toàn cục
STR_COPY_LINE=Sao chép dòng đã chọn
STR_PASTE_LINE=Dán vào dòng đã chọn
STR_SHOW_HIDDEN_FILES=Hiển thị các tập tin ẩn
STR_SET_DEFAULT_DIRECTORY=Đặt thư mục mặc định
STR_SET_DEFAULT_DIRECTORY_MSG=đã được thiết lập làm thư mục mặc định
STR_NFS_EXP_PATH_MISSING_MSG=Đường dẫn NFS bị thiếu trong URL
STR_FAIL_INIT_NFS_CONTEXT=Không khởi tạo được ngữ cảnh NFS
STR_FAIL_MOUNT_NFS_MSG=Không thể mount NFS share
STR_PROMOTING=Promoting
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 165 KiB

+75 -7
View File
@@ -1,6 +1,7 @@
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <json-c/json.h>
#include <lexbor/html/parser.h>
#include <lexbor/dom/interfaces/element.h>
#include <minizip/unzip.h>
@@ -10,6 +11,8 @@
#include "clients/smbclient.h"
#include "clients/webdav.h"
#include "clients/apache.h"
#include "clients/archiveorg.h"
#include "clients/myrient.h"
#include "clients/nginx.h"
#include "clients/npxserve.h"
#include "clients/nfsclient.h"
@@ -17,6 +20,7 @@
#include "clients/rclone.h"
#include "clients/sftpclient.h"
#include "filehost/filehost.h"
#include "server/http_server.h"
#include "common.h"
#include "fs.h"
#include "config.h"
@@ -1106,7 +1110,7 @@ namespace Actions
}
}
void *InstallUrlPkgThread(void *argp)
void *InstallLocalUrlPkgThread(void *argp)
{
bytes_transfered = 0;
sceRtcGetCurrentTick(&prev_tick);
@@ -1117,10 +1121,10 @@ namespace Actions
OrbisTick tick;
sceRtcGetCurrentClockLocalTime(&now);
sceRtcGetTick(&now, &tick);
sprintf(filename, "%s/%lu.pkg", DATA_PATH, tick.mytick);
sprintf(filename, "%s/%lu.pkg", TMP_FOLDER_PATH, tick.mytick);
std::string full_url = std::string(install_pkg_url.url);
FileHost *filehost = FileHost::getFileHost(full_url);
FileHost *filehost = FileHost::getFileHost(full_url, install_pkg_url.enable_alldebrid, install_pkg_url.enable_realdebrid);
if (!filehost->IsValidUrl())
{
sprintf(status_message, "%s", lang_strings[STR_FAIL_TO_OBTAIN_GG_DL_MSG]);
@@ -1143,7 +1147,7 @@ namespace Actions
std::string host = full_url.substr(0, path_pos);
std::string path = full_url.substr(path_pos);
WebDAVClient tmp_client;
BaseClient tmp_client;
tmp_client.Connect(host.c_str(), install_pkg_url.username, install_pkg_url.password);
sprintf(activity_message, "%s URL to %s", lang_strings[STR_DOWNLOADING], filename);
@@ -1151,7 +1155,7 @@ namespace Actions
memset(&header, 0, s);
int ret = tmp_client.Size(path, &bytes_to_download);
if (!ret)
if (ret == 0)
{
sprintf(status_message, "%s - %s", lang_strings[STR_FAILED], lang_strings[STR_CANNOT_READ_PKG_HDR_MSG]);
tmp_client.Quit();
@@ -1161,7 +1165,7 @@ namespace Actions
}
file_transfering = 1;
int is_performed = tmp_client.Get(path, filename);
int is_performed = tmp_client.Get(filename, path);
if (is_performed == 0)
{
@@ -1214,10 +1218,70 @@ namespace Actions
return NULL;
}
void *InstallRpiUrlPkgThread(void *argp)
{
json_object *params = json_object_new_object();
json_object_object_add(params, "url", json_object_new_string(install_pkg_url.url));
json_object_object_add(params, "use_alldebrid", json_object_new_boolean(install_pkg_url.enable_alldebrid));
json_object_object_add(params, "use_realdebrid", json_object_new_boolean(install_pkg_url.enable_realdebrid));
json_object_object_add(params, "use_disk_cache", json_object_new_boolean(install_pkg_url.enable_disk_cache));
const char *params_str = json_object_to_json_string(params);
char host[128];
sprintf(host, "http://127.0.0.1:%d", http_server_port);
httplib::Client tmp_client(host);
tmp_client.set_keep_alive(true);
tmp_client.set_follow_location(true);
tmp_client.set_connection_timeout(30);
tmp_client.set_read_timeout(30);
tmp_client.enable_server_certificate_verification(false);
auto res = tmp_client.Post("/__local__/install_url", params_str, strlen(params_str), "application/json");
if (res != nullptr && HTTP_SUCCESS(res->status))
{
json_object *jobj = json_tokener_parse(res->body.c_str());
if (jobj != nullptr)
{
json_object *result = json_object_object_get(jobj, "result");
if (result != nullptr)
{
bool success = json_object_get_boolean(json_object_object_get(result, "success"));
if (!success)
{
const char* error_message = json_object_get_string(json_object_object_get(result, "error"));
sprintf(status_message, "%s", error_message);
activity_inprogess = false;
Windows::SetModalMode(false);
}
}
}
else
{
activity_inprogess = false;
Windows::SetModalMode(false);
}
}
else
{
activity_inprogess = false;
Windows::SetModalMode(false);
}
return NULL;
}
void InstallUrlPkg()
{
int res;
sprintf(status_message, "%s", "");
int res = pthread_create(&bk_activity_thid, NULL, InstallUrlPkgThread, NULL);
if (!install_pkg_url.enable_rpi)
res = pthread_create(&bk_activity_thid, NULL, InstallLocalUrlPkgThread, NULL);
else
res = pthread_create(&bk_activity_thid, NULL, InstallRpiUrlPkgThread, NULL);
if (res != 0)
{
activity_inprogess = false;
@@ -1246,6 +1310,10 @@ namespace Actions
remoteclient = new NpxServeClient();
else if (strcmp(remote_settings->http_server_type, HTTP_SERVER_RCLONE) == 0)
remoteclient = new RCloneClient();
else if (strcmp(remote_settings->http_server_type, HTTP_SERVER_ARCHIVEORG) == 0)
remoteclient = new ArchiveOrgClient();
else if (strcmp(remote_settings->http_server_type, HTTP_SERVER_MYRIENT) == 0)
remoteclient = new MyrientClient();
}
else if (strncmp(remote_settings->server, "webdavs://", 10) == 0 || strncmp(remote_settings->server, "webdav://", 9) == 0)
{
+2 -1
View File
@@ -99,7 +99,8 @@ namespace Actions
void InstallRemotePkgs();
void *InstallLocalPkgsThread(void *argp);
void InstallLocalPkgs();
void *InstallUrlPkgThread(void *argp);
void *InstallLocalUrlPkgThread(void *argp);
void *InstallRpiUrlPkgThread(void *argp);
void InstallUrlPkg();
void *KeepAliveThread(void *argp);
void *ExtractZipThread(void *argp);
+23 -10
View File
@@ -128,18 +128,31 @@ std::vector<DirEntry> ApacheClient::ListDir(const std::string &path)
tmp_string = std::string((const char *)value, value_len);
if (tmp_string.compare("td") == 0)
{
value = lxb_dom_node_text_content(node, &value_len);
// get the child <a> element
lxb_dom_node_t *a_node = NextChildElement(lxb_dom_interface_element(node));
if (a_node == nullptr) continue;
value = lxb_dom_element_local_name(lxb_dom_interface_element(a_node), &value_len);
tmp_string = std::string((const char *)value, value_len);
tmp_string = Util::Rtrim(tmp_string, "/");
sprintf(entry.name, "%s", tmp_string.c_str());
sprintf(entry.directory, "%s", path.c_str());
if (path.length() > 0 && path[path.length() - 1] == '/')
if (tmp_string.compare("a") == 0)
{
sprintf(entry.path, "%s%s", path.c_str(), entry.name);
}
else
{
sprintf(entry.path, "%s/%s", path.c_str(), entry.name);
value = lxb_dom_element_get_attribute(lxb_dom_interface_element(a_node), (const lxb_char_t *)"href", 4, &value_len);
tmp_string = std::string((const char *)value, value_len);
tmp_string = Util::Rtrim(tmp_string, "/");
tmp_string = BaseClient::UnEscape(tmp_string);
if (tmp_string.compare("..") != 0)
{
sprintf(entry.directory, "%s", path.c_str());
sprintf(entry.name, "%s", tmp_string.c_str());
if (path.length() > 0 && path[path.length() - 1] == '/')
{
sprintf(entry.path, "%s%s", path.c_str(), entry.name);
}
else
{
sprintf(entry.path, "%s/%s", path.c_str(), entry.name);
}
}
}
}
else continue; // not valid record
+239
View File
@@ -0,0 +1,239 @@
#include <lexbor/html/parser.h>
#include <lexbor/dom/interfaces/element.h>
#include <lexbor/dom/interfaces/node.h>
#include <fstream>
#include <map>
#include "common.h"
#include "clients/remote_client.h"
#include "clients/archiveorg.h"
#include "lang.h"
#include "util.h"
#include "system.h"
#include "windows.h"
using httplib::Client;
using httplib::Headers;
using httplib::Result;
static std::map<std::string, int> month_map = {{"Jan", 1}, {"Feb", 2}, {"Mar", 3}, {"Apr", 4}, {"May", 5}, {"Jun", 6}, {"Jul", 7}, {"Aug", 8}, {"Sep", 9}, {"Oct", 10}, {"Nov", 11}, {"Dec", 12}};
std::vector<DirEntry> ArchiveOrgClient::ListDir(const std::string &path)
{
std::vector<DirEntry> out;
DirEntry entry;
Util::SetupPreviousFolder(path, &entry);
out.push_back(entry);
std::string encoded_path = httplib::detail::encode_url(GetFullPath(path) + "/");
if (auto res = client->Get(encoded_path))
{
lxb_status_t status;
lxb_dom_attr_t *attr;
lxb_dom_element_t *table_element, *tr_element, *td_element;
lxb_html_document_t *document;
lxb_dom_collection_t *table_collection;
lxb_dom_collection_t *tr_collection;
lxb_dom_collection_t *td_collection;
std::string tmp_string;
const lxb_char_t *value;
size_t value_len;
document = lxb_html_document_create();
status = lxb_html_document_parse(document, (lxb_char_t *)res->body.c_str(), res->body.length());
if (status != LXB_STATUS_OK)
{
lxb_html_document_destroy(document);
goto finish;
}
table_collection = lxb_dom_collection_make(&document->dom_document, 1);
if (table_collection == NULL)
{
lxb_html_document_destroy(document);
goto finish;
}
tr_collection = lxb_dom_collection_make(&document->dom_document, 128);
if (tr_collection == NULL)
{
lxb_html_document_destroy(document);
goto finish;
}
status = lxb_dom_elements_by_tag_name(lxb_dom_interface_element(document->body),
table_collection, (const lxb_char_t *)"table", 5);
if (status != LXB_STATUS_OK)
{
lxb_dom_collection_destroy(tr_collection, true);
lxb_dom_collection_destroy(table_collection, true);
lxb_html_document_destroy(document);
goto finish;
}
if (lxb_dom_collection_length(table_collection) < 1)
{
lxb_dom_collection_destroy(tr_collection, true);
lxb_dom_collection_destroy(table_collection, true);
lxb_html_document_destroy(document);
goto finish;
}
for (size_t i = 0; i < lxb_dom_collection_length(table_collection); i++)
{
table_element = lxb_dom_collection_element(table_collection, i);
value = lxb_dom_element_class(table_element, &value_len);
tmp_string = std::string((const char *)value, value_len);
if (tmp_string.compare("directory-listing-table") == 0)
break;
table_element = nullptr;
}
if (table_element == nullptr)
{
lxb_dom_collection_destroy(tr_collection, true);
lxb_dom_collection_destroy(table_collection, true);
lxb_html_document_destroy(document);
goto finish;
}
status = lxb_dom_elements_by_tag_name(table_element,
tr_collection, (const lxb_char_t *)"tr", 2);
if (status != LXB_STATUS_OK && lxb_dom_collection_length(tr_collection) < 2)
{
lxb_dom_collection_destroy(tr_collection, true);
lxb_dom_collection_destroy(table_collection, true);
lxb_html_document_destroy(document);
goto finish;
}
// skip row 0 , since it has the previous folder header
for (size_t i = 2; i < lxb_dom_collection_length(tr_collection); i++)
{
DirEntry entry;
std::string title, aclass;
memset(&entry.modified, 0, sizeof(DateTime));
tr_element = lxb_dom_collection_element(tr_collection, i);
td_collection = lxb_dom_collection_make(&document->dom_document, 5);
status = lxb_dom_elements_by_tag_name(tr_element,
td_collection, (const lxb_char_t *)"td", 2);
if (status != LXB_STATUS_OK || lxb_dom_collection_length(td_collection) < 3)
{
lxb_dom_collection_destroy(td_collection, true);
lxb_dom_collection_destroy(tr_collection, true);
lxb_dom_collection_destroy(table_collection, true);
lxb_html_document_destroy(document);
goto finish;
}
// td0 contains the <a> tag
td_element = lxb_dom_collection_element(td_collection, 0);
lxb_dom_node_t *a_node = NextChildElement(td_element);
value = lxb_dom_element_local_name(lxb_dom_interface_element(a_node), &value_len);
tmp_string = std::string((const char *)value, value_len);
if (tmp_string.compare("a") != 0)
{
lxb_dom_collection_destroy(td_collection, true);
lxb_dom_collection_destroy(tr_collection, true);
lxb_dom_collection_destroy(table_collection, true);
lxb_html_document_destroy(document);
goto finish;
}
value = lxb_dom_element_get_attribute(lxb_dom_interface_element(a_node), (const lxb_char_t *)"href", 4, &value_len);
tmp_string = std::string((const char *)value, value_len);
if (tmp_string[tmp_string.length()-1] == '/')
tmp_string = tmp_string.substr(0, tmp_string.length()-1);
tmp_string = BaseClient::UnEscape(tmp_string);
sprintf(entry.name, "%s", tmp_string.c_str());
sprintf(entry.directory, "%s", path.c_str());
if (path.length() > 0 && path[path.length() - 1] == '/')
{
sprintf(entry.path, "%s%s", path.c_str(), entry.name);
}
else
{
sprintf(entry.path, "%s/%s", path.c_str(), entry.name);
}
// next td contains the date
td_element = lxb_dom_collection_element(td_collection, 1);
value = lxb_dom_node_text_content(NextChildTextNode(td_element), &value_len);
tmp_string = std::string((const char *)value, value_len);
std::vector<std::string> date_time = Util::Split(tmp_string, " ");
if (date_time.size() > 1)
{
std::vector<std::string> adate = Util::Split(date_time[0], "-");
if (adate.size() == 3)
{
entry.modified.day = atoi(adate[0].c_str());
entry.modified.month = month_map[adate[1]];
entry.modified.year = atoi(adate[2].c_str());
}
std::vector<std::string> atime = Util::Split(date_time[1], ":");
if (atime.size() == 2)
{
entry.modified.hours = atoi(atime[0].c_str());
entry.modified.minutes = atoi(atime[1].c_str());
}
}
// next td contains file size, if fize size is "-", then it's a directory
td_element = lxb_dom_collection_element(td_collection, 2);
value = lxb_dom_node_text_content(NextChildTextNode(td_element), &value_len);
tmp_string = std::string((const char *)value, value_len);
if (tmp_string.compare("-") == 0)
{
entry.isDir = true;
entry.selectable = true;
entry.file_size = 0;
sprintf(entry.display_size, "%s", lang_strings[STR_FOLDER]);
}
else
{
entry.isDir = false;
entry.selectable = true;
uint64_t multiplier = 0;
std::string size_formatted = tmp_string.substr(0, tmp_string.size()-1);
Util::ReplaceAll(size_formatted, ",", "");
float fsize = std::stof(size_formatted);
switch (tmp_string[tmp_string.size()-1]) {
case 'B':
multiplier = 1;
break;
case 'K':
multiplier = 1024;
break;
case 'M':
multiplier = 1048576;
break;
case 'G':
multiplier = 1073741824;
break;
default:
multiplier = 1;
}
entry.file_size = fsize * multiplier;
DirEntry::SetDisplaySize(&entry);
}
lxb_dom_collection_destroy(td_collection, true);
out.push_back(entry);
}
lxb_dom_collection_destroy(tr_collection, true);
lxb_dom_collection_destroy(table_collection, true);
lxb_html_document_destroy(document);
}
else
{
sprintf(this->response, "%s", httplib::to_string(res.error()).c_str());
return out;
}
finish:
return out;
}
+17
View File
@@ -0,0 +1,17 @@
#ifndef EZ_ARCHIVEORG_H
#define EZ_ARCHIVEORG_H
#include <string>
#include <vector>
#include "http/httplib.h"
#include "clients/remote_client.h"
#include "clients/baseclient.h"
#include "common.h"
class ArchiveOrgClient : public BaseClient
{
public:
std::vector<DirEntry> ListDir(const std::string &path);
};
#endif
+21
View File
@@ -90,6 +90,27 @@ int BaseClient::Size(const std::string &path, int64_t *size)
*size = atoll(content_length.c_str());
return 1;
}
else // Server doesn't support HEAD request. Try get range with 0 bytes and grab size from the response header
// example: Content-Range: bytes 0-10/4372785
{
Headers headers = {{"Range", "bytes=0-1"}};
if (auto range_res = client->Get(GetFullPath(path), headers))
{
if (HTTP_SUCCESS(range_res->status))
{
if (range_res->has_header("Content-Range"))
{
std::string range = range_res->get_header_value("Content-Range");
std::vector<std::string> range_parts = Util::Split(range, "/");
if (range_parts.size() == 2)
{
*size = atoll(range_parts[1].c_str());
return 1;
}
}
}
}
}
}
else
{
+241
View File
@@ -0,0 +1,241 @@
#include <lexbor/html/parser.h>
#include <lexbor/dom/interfaces/element.h>
#include <lexbor/dom/interfaces/node.h>
#include <fstream>
#include <map>
#include "common.h"
#include "clients/remote_client.h"
#include "clients/myrient.h"
#include "lang.h"
#include "util.h"
#include "system.h"
#include "windows.h"
using httplib::Client;
using httplib::Headers;
using httplib::Result;
static std::map<std::string, int> month_map = {{"Jan", 1}, {"Feb", 2}, {"Mar", 3}, {"Apr", 4}, {"May", 5}, {"Jun", 6}, {"Jul", 7}, {"Aug", 8}, {"Sep", 9}, {"Oct", 10}, {"Nov", 11}, {"Dec", 12}};
std::vector<DirEntry> MyrientClient::ListDir(const std::string &path)
{
std::vector<DirEntry> out;
DirEntry entry;
Util::SetupPreviousFolder(path, &entry);
out.push_back(entry);
std::string encoded_path = httplib::detail::encode_url(GetFullPath(path) + "/");
if (auto res = client->Get(encoded_path))
{
lxb_status_t status;
lxb_dom_attr_t *attr;
lxb_dom_element_t *table_element, *tr_element, *td_element;
lxb_html_document_t *document;
lxb_dom_collection_t *table_collection;
lxb_dom_collection_t *tr_collection;
lxb_dom_collection_t *td_collection;
std::string tmp_string;
const lxb_char_t *value;
size_t value_len;
document = lxb_html_document_create();
status = lxb_html_document_parse(document, (lxb_char_t *)res->body.c_str(), res->body.length());
if (status != LXB_STATUS_OK)
{
lxb_html_document_destroy(document);
goto finish;
}
table_collection = lxb_dom_collection_make(&document->dom_document, 1);
if (table_collection == NULL)
{
lxb_html_document_destroy(document);
goto finish;
}
tr_collection = lxb_dom_collection_make(&document->dom_document, 128);
if (tr_collection == NULL)
{
lxb_html_document_destroy(document);
goto finish;
}
status = lxb_dom_elements_by_tag_name(lxb_dom_interface_element(document->body),
table_collection, (const lxb_char_t *)"table", 5);
if (status != LXB_STATUS_OK)
{
lxb_dom_collection_destroy(tr_collection, true);
lxb_dom_collection_destroy(table_collection, true);
lxb_html_document_destroy(document);
goto finish;
}
if (lxb_dom_collection_length(table_collection) < 1)
{
lxb_dom_collection_destroy(tr_collection, true);
lxb_dom_collection_destroy(table_collection, true);
lxb_html_document_destroy(document);
goto finish;
}
for (size_t i = 0; i < lxb_dom_collection_length(table_collection); i++)
{
table_element = lxb_dom_collection_element(table_collection, i);
value = lxb_dom_element_id(table_element, &value_len);
tmp_string = std::string((const char *)value, value_len);
if (tmp_string.compare("list") == 0)
break;
table_element = nullptr;
}
if (table_element == nullptr)
{
lxb_dom_collection_destroy(tr_collection, true);
lxb_dom_collection_destroy(table_collection, true);
lxb_html_document_destroy(document);
goto finish;
}
status = lxb_dom_elements_by_tag_name(table_element,
tr_collection, (const lxb_char_t *)"tr", 2);
if (status != LXB_STATUS_OK && lxb_dom_collection_length(tr_collection) < 2)
{
lxb_dom_collection_destroy(tr_collection, true);
lxb_dom_collection_destroy(table_collection, true);
lxb_html_document_destroy(document);
goto finish;
}
// skip row 0 , since it has the previous folder header
for (size_t i = 2; i < lxb_dom_collection_length(tr_collection); i++)
{
DirEntry entry;
std::string title, aclass;
memset(&entry.modified, 0, sizeof(DateTime));
tr_element = lxb_dom_collection_element(tr_collection, i);
td_collection = lxb_dom_collection_make(&document->dom_document, 5);
status = lxb_dom_elements_by_tag_name(tr_element,
td_collection, (const lxb_char_t *)"td", 2);
if (status != LXB_STATUS_OK || lxb_dom_collection_length(td_collection) < 3)
{
lxb_dom_collection_destroy(td_collection, true);
lxb_dom_collection_destroy(tr_collection, true);
lxb_dom_collection_destroy(table_collection, true);
lxb_html_document_destroy(document);
goto finish;
}
// td0 contains the <a> tag
td_element = lxb_dom_collection_element(td_collection, 0);
lxb_dom_node_t *a_node = NextChildElement(td_element);
value = lxb_dom_element_local_name(lxb_dom_interface_element(a_node), &value_len);
tmp_string = std::string((const char *)value, value_len);
if (tmp_string.compare("a") != 0)
{
lxb_dom_collection_destroy(td_collection, true);
lxb_dom_collection_destroy(tr_collection, true);
lxb_dom_collection_destroy(table_collection, true);
lxb_html_document_destroy(document);
goto finish;
}
value = lxb_dom_element_get_attribute(lxb_dom_interface_element(a_node), (const lxb_char_t *)"href", 4, &value_len);
tmp_string = std::string((const char *)value, value_len);
if (tmp_string[tmp_string.length()-1] == '/')
tmp_string = tmp_string.substr(0, tmp_string.length()-1);
tmp_string = BaseClient::UnEscape(tmp_string);
sprintf(entry.name, "%s", tmp_string.c_str());
sprintf(entry.directory, "%s", path.c_str());
if (path.length() > 0 && path[path.length() - 1] == '/')
{
sprintf(entry.path, "%s%s", path.c_str(), entry.name);
}
else
{
sprintf(entry.path, "%s/%s", path.c_str(), entry.name);
}
// next td contains file size, if fize size is "-", then it's a directory
td_element = lxb_dom_collection_element(td_collection, 1);
value = lxb_dom_node_text_content(NextChildTextNode(td_element), &value_len);
tmp_string = std::string((const char *)value, value_len);
if (tmp_string.compare("-") == 0)
{
entry.isDir = true;
entry.selectable = true;
entry.file_size = 0;
sprintf(entry.display_size, "%s", lang_strings[STR_FOLDER]);
}
else
{
entry.isDir = false;
entry.selectable = true;
uint64_t multiplier = 1;
std::vector<std::string> fsize_parts = Util::Split(tmp_string, " ");
float fsize = std::stof(fsize_parts[0]);
if (fsize_parts.size() > 1)
{
switch (fsize_parts[1][0])
{
case 'K':
multiplier = 1024;
break;
case 'M':
multiplier = 1048576;
break;
case 'G':
multiplier = 1073741824;
break;
default:
multiplier = 1;
}
}
entry.file_size = fsize * multiplier;
DirEntry::SetDisplaySize(&entry);
}
// next td contains the date
td_element = lxb_dom_collection_element(td_collection, 2);
value = lxb_dom_node_text_content(NextChildTextNode(td_element), &value_len);
tmp_string = std::string((const char *)value, value_len);
std::vector<std::string> date_time = Util::Split(tmp_string, " ");
if (date_time.size() > 1)
{
std::vector<std::string> adate = Util::Split(date_time[0], "-");
if (adate.size() == 3)
{
entry.modified.day = atoi(adate[0].c_str());
entry.modified.month = month_map[adate[1]];
entry.modified.year = atoi(adate[2].c_str());
}
std::vector<std::string> atime = Util::Split(date_time[1], ":");
if (atime.size() == 2)
{
entry.modified.hours = atoi(atime[0].c_str());
entry.modified.minutes = atoi(atime[1].c_str());
}
}
lxb_dom_collection_destroy(td_collection, true);
out.push_back(entry);
}
lxb_dom_collection_destroy(tr_collection, true);
lxb_dom_collection_destroy(table_collection, true);
lxb_html_document_destroy(document);
}
else
{
sprintf(this->response, "%s", httplib::to_string(res.error()).c_str());
return out;
}
finish:
return out;
}
+17
View File
@@ -0,0 +1,17 @@
#ifndef EZ_MYRIENT_H
#define EZ_MYRIENT_H
#include <string>
#include <vector>
#include "http/httplib.h"
#include "clients/remote_client.h"
#include "clients/baseclient.h"
#include "common.h"
class MyrientClient : public BaseClient
{
public:
std::vector<DirEntry> ListDir(const std::string &path);
};
#endif
+5 -2
View File
@@ -152,14 +152,17 @@ namespace CONFIG
FS::MkDirs(DATA_PATH);
}
memset(&install_pkg_url, 0, sizeof(install_pkg_url));
install_pkg_url.enable_rpi = true;
sites = {"Site 1", "Site 2", "Site 3", "Site 4", "Site 5", "Site 6", "Site 7", "Site 8", "Site 9", "Site 10",
"Site 11", "Site 12", "Site 13", "Site 14", "Site 15", "Site 16", "Site 17", "Site 18", "Site 19", "Site 20"};
langs = { "Default", "Arabic", "Catalan", "Croatian", "Dutch", "English", "Euskera", "French", "Galego", "German", "Greek",
"Hungarian", "Indonesian", "Italiano", "Japanese", "Korean", "Polish", "Portuguese_BR", "Russian", "Romanian", "Ryukyuan", "Spanish", "Turkish",
"Simplified Chinese", "Traditional Chinese", "Thai", "Ukrainian"};
"Simplified Chinese", "Traditional Chinese", "Thai", "Ukrainian", "Vietnamese"};
http_servers = {HTTP_SERVER_APACHE, HTTP_SERVER_MS_IIS, HTTP_SERVER_NGINX, HTTP_SERVER_NPX_SERVE, HTTP_SERVER_RCLONE};
http_servers = {HTTP_SERVER_APACHE, HTTP_SERVER_MS_IIS, HTTP_SERVER_NGINX, HTTP_SERVER_NPX_SERVE, HTTP_SERVER_RCLONE, HTTP_SERVER_ARCHIVEORG, HTTP_SERVER_MYRIENT};
text_file_extensions = { ".txt", ".ini", ".log", ".json", ".xml", ".html", ".xhtml", ".conf", ".config" };
image_file_extensions = { ".bmp", ".jpg", ".jpeg", ".png", ".webp" };
+6
View File
@@ -82,6 +82,8 @@
#define HTTP_SERVER_NGINX "Nginx"
#define HTTP_SERVER_NPX_SERVE "Serve"
#define HTTP_SERVER_RCLONE "RClone"
#define HTTP_SERVER_ARCHIVEORG "Archive.org"
#define HTTP_SERVER_MYRIENT "Myrient"
#define MAX_EDIT_FILE_SIZE 32768
@@ -119,6 +121,10 @@ struct PackageUrlInfo
char url[512];
char username[33];
char password[25];
bool enable_alldebrid;
bool enable_realdebrid;
bool enable_disk_cache;
bool enable_rpi;
};
extern std::vector<std::string> sites;
+9
View File
@@ -84,6 +84,8 @@
#define BUTTON_RIGHT 0x00000020
#define BUTTON_UP 0x00000040
#define BUTTON_DOWN 0x00000080
#define BUTTON_C 0x00000100
#define BUTTON_D 0x00000200
static uint32_t previous_down = 0;
static int repeat_count = 0;
@@ -531,8 +533,15 @@ static void ImGui_ImplSDL2_UpdateGamepads()
down |= BUTTON_DOWN;
else if (SDL_GameControllerGetAxis(game_controller, SDL_CONTROLLER_AXIS_LEFTY) < -ANALOG_THRESHOLD)
down |= BUTTON_UP;
else if (SDL_GameControllerGetAxis(game_controller, SDL_CONTROLLER_AXIS_TRIGGERLEFT) > ANALOG_THRESHOLD)
down |= BUTTON_C;
else if (SDL_GameControllerGetAxis(game_controller, SDL_CONTROLLER_AXIS_TRIGGERRIGHT) > ANALOG_THRESHOLD)
down |= BUTTON_D;
uint32_t pressed = down & ~previous_down;
io.AddKeyEvent(ImGuiKey_C, (pressed & BUTTON_C) != 0);
io.AddKeyEvent(ImGuiKey_D, (pressed & BUTTON_D) != 0);
if (previous_down == down)
{
uint64_t delay = 300;
+4 -1
View File
@@ -172,8 +172,11 @@ char lang_strings[LANG_STRINGS_NUM][LANG_STR_SIZE] = {
"Temp Directory", // STR_TEMP_DIRECTORY
"Real-Debrid", // STR_REALDEBRID
"Package install is running in the background. Don't close the app while install is in progress", // STR_BACKGROUND_INSTALL_INPROGRESS
"Enable disk caching. Can improve package install speed in cases where connection to remote is slow", // STR_ENABLE_DISC_CACHE_MSG
"Enable disk caching. Can improve package install speed in cases where connection to remote is slow, but breaks resuming of install", // STR_ENABLE_DISC_CACHE_MSG
"DC", // STR_ENABLE_DISK_CACHE
"Install Via AllDebrid", // STR_ENABLE_ALLDEBRID_MSG
"Install Via RealDebrid", // STR_ENABLE_REALDEBRID_MSG
"Enable Disk Cache", // STR_ENABLE_DISKCACHE_DESC
};
bool needs_extended_font = false;
+5 -2
View File
@@ -167,7 +167,10 @@
FUNC(STR_REALDEBRID) \
FUNC(STR_BACKGROUND_INSTALL_INPROGRESS) \
FUNC(STR_ENABLE_DISC_CACHE_MSG) \
FUNC(STR_ENABLE_DISK_CACHE)
FUNC(STR_ENABLE_DISK_CACHE) \
FUNC(STR_ENABLE_ALLDEBRID_MSG) \
FUNC(STR_ENABLE_REALDEBRID_MSG) \
FUNC(STR_ENABLE_DISKCACHE_DESC)
#define GET_VALUE(x) x,
#define GET_STRING(x) #x,
@@ -177,7 +180,7 @@ enum
FOREACH_STR(GET_VALUE)
};
#define LANG_STRINGS_NUM 164
#define LANG_STRINGS_NUM 167
#define LANG_ID_SIZE 64
#define LANG_STR_SIZE 384
extern char lang_identifiers[LANG_STRINGS_NUM][LANG_ID_SIZE];
+10 -8
View File
@@ -139,41 +139,43 @@ void InitImgui()
sceSystemServiceParamGetInt( ORBIS_SYSTEM_SERVICE_PARAM_ID_LANG, &lang_idx );
lang = Util::Trim(lang, " ");
if (lang.compare("Korean") == 0 || (lang.empty() && lang_idx == ORBIS_SYSTEM_PARAM_LANG_KOREAN))
bool use_system_lang = lang.empty() || lang.compare("Default") == 0;
if (lang.compare("Korean") == 0 || (use_system_lang && lang_idx == ORBIS_SYSTEM_PARAM_LANG_KOREAN))
{
io.Fonts->AddFontFromFileTTF("/app0/assets/fonts/Roboto_ext.ttf", 26.0f, NULL, io.Fonts->GetGlyphRangesKorean());
}
else if (lang.compare("Simplified Chinese") == 0 || (lang.empty() && lang_idx == ORBIS_SYSTEM_PARAM_LANG_CHINESE_S))
else if (lang.compare("Simplified Chinese") == 0 || (use_system_lang && lang_idx == ORBIS_SYSTEM_PARAM_LANG_CHINESE_S))
{
ImFontConfig config;
config.OversampleH = 1;
config.OversampleV = 1;
io.Fonts->AddFontFromFileTTF("/app0/assets/fonts/Roboto_ext.ttf", 26.0f, &config, io.Fonts->GetGlyphRangesChineseFull());
}
else if (lang.compare("Traditional Chinese") == 0 || (lang.empty() && lang_idx == ORBIS_SYSTEM_PARAM_LANG_CHINESE_T))
else if (lang.compare("Traditional Chinese") == 0 || (use_system_lang && lang_idx == ORBIS_SYSTEM_PARAM_LANG_CHINESE_T))
{
ImFontConfig config;
config.OversampleH = 1;
config.OversampleV = 1;
io.Fonts->AddFontFromFileTTF("/app0/assets/fonts/Roboto_ext.ttf", 26.0f, &config, io.Fonts->GetGlyphRangesChineseFull());
}
else if (lang.compare("Japanese") == 0 || lang.compare("Ryukyuan") == 0 || (lang.empty() && lang_idx == ORBIS_SYSTEM_PARAM_LANG_JAPANESE))
else if (lang.compare("Japanese") == 0 || lang.compare("Ryukyuan") == 0 || (use_system_lang && lang_idx == ORBIS_SYSTEM_PARAM_LANG_JAPANESE))
{
io.Fonts->AddFontFromFileTTF("/app0/assets/fonts/Roboto_ext.ttf", 26.0f, NULL, io.Fonts->GetGlyphRangesJapanese());
}
else if (lang.compare("Thai") == 0 || (lang.empty() && lang_idx == ORBIS_SYSTEM_PARAM_LANG_THAI))
else if (lang.compare("Thai") == 0 || (use_system_lang && lang_idx == ORBIS_SYSTEM_PARAM_LANG_THAI))
{
io.Fonts->AddFontFromFileTTF("/app0/assets/fonts/Roboto_ext.ttf", 26.0f, NULL, io.Fonts->GetGlyphRangesThai());
}
else if (lang.compare("Vietnamese") == 0 || (lang.empty() && lang_idx == ORBIS_SYSTEM_PARAM_LANG_VIETNAMESE))
else if (lang.compare("Vietnamese") == 0 || (use_system_lang && lang_idx == ORBIS_SYSTEM_PARAM_LANG_VIETNAMESE))
{
io.Fonts->AddFontFromFileTTF("/app0/assets/fonts/Roboto_ext.ttf", 26.0f, NULL, io.Fonts->GetGlyphRangesVietnamese());
}
else if (lang.compare("Greek") == 0 || (lang.empty() && lang_idx == ORBIS_SYSTEM_PARAM_LANG_GREEK))
else if (lang.compare("Greek") == 0 || (use_system_lang && lang_idx == ORBIS_SYSTEM_PARAM_LANG_GREEK))
{
io.Fonts->AddFontFromFileTTF("/app0/assets/fonts/Roboto_ext.ttf", 26.0f, NULL, io.Fonts->GetGlyphRangesGreek());
}
else if (lang.compare("Arabic") == 0 || (lang.empty() && lang_idx == ORBIS_SYSTEM_PARAM_LANG_ARABIC))
else if (lang.compare("Arabic") == 0 || (use_system_lang && lang_idx == ORBIS_SYSTEM_PARAM_LANG_ARABIC))
{
io.Fonts->AddFontFromFileTTF("/app0/assets/fonts/Roboto_ext.ttf", 26.0f, NULL, arabic);
}
+9 -1
View File
@@ -10,6 +10,7 @@
#include "clients/nfsclient.h"
#include "clients/webdav.h"
#include "clients/apache.h"
#include "clients/archiveorg.h"
#include "clients/iis.h"
#include "clients/nginx.h"
#include "clients/npxserve.h"
@@ -249,6 +250,8 @@ namespace HttpServer
tmp_client = new NpxServeClient();
else if (strcmp(remote_settings->http_server_type, HTTP_SERVER_RCLONE) == 0)
tmp_client = new RCloneClient();
else if (strcmp(remote_settings->http_server_type, HTTP_SERVER_ARCHIVEORG) == 0)
tmp_client = new ArchiveOrgClient();
}
if (tmp_client->clientType() != CLIENT_TYPE_GOOGLE)
@@ -1174,6 +1177,12 @@ namespace HttpServer
SplitPkgInstallData *pkg_data = INSTALLER::GetSplitPkgInstallData(hash);
if (pkg_data == nullptr)
{
failed(res, 500, "Cannot resume split_inst");
return;
}
if (req.method == "HEAD")
{
res.status = 204;
@@ -1343,7 +1352,6 @@ namespace HttpServer
failed(res, 200, lang_strings[STR_FAIL_INSTALL_FROM_URL_MSG]);
activity_inprogess = false;
file_transfering = false;
free(install_data);
Windows::SetModalMode(false);
return;
}
+84 -13
View File
@@ -327,11 +327,13 @@ namespace Windows
if (ImGui::BeginCombo("##Site", display_site, ImGuiComboFlags_PopupAlignLeft | ImGuiComboFlags_HeightLargest | ImGuiComboFlags_NoArrowButton))
{
static char site_id[64];
static char site_display[512];
for (int n = 0; n < sites.size(); n++)
{
const bool is_selected = strcmp(sites[n].c_str(), last_site) == 0;
sprintf(site_id, "%s %d", lang_strings[STR_SITE], n + 1);
if (ImGui::Selectable(site_id, is_selected))
sprintf(site_display, "%s %d %s", lang_strings[STR_SITE], n + 1, site_settings[sites[n]].server);
if (ImGui::Selectable(site_display, is_selected))
{
sprintf(last_site, "%s", sites[n].c_str());
sprintf(display_site, "%s", site_id);
@@ -448,7 +450,7 @@ namespace Windows
}
if (ImGui::IsItemHovered())
{
ImGui::SetNextWindowSize(ImVec2(450, 70));
ImGui::SetNextWindowSize(ImVec2(450, 110));
ImGui::BeginTooltip();
ImGui::PushTextWrapPos(ImGui::GetCursorPos().x + 440);
ImGui::Text("%s", lang_strings[STR_ENABLE_RPI_FTP_SMB_MSG]);
@@ -467,9 +469,9 @@ namespace Windows
}
if (ImGui::IsItemHovered())
{
ImGui::SetNextWindowSize(ImVec2(450, 70));
ImGui::SetNextWindowSize(ImVec2(550, 110));
ImGui::BeginTooltip();
ImGui::PushTextWrapPos(ImGui::GetCursorPos().x + 440);
ImGui::PushTextWrapPos(ImGui::GetCursorPos().x + 540);
ImGui::Text("%s", lang_strings[STR_ENABLE_DISC_CACHE_MSG]);
ImGui::PopTextWrapPos();
ImGui::EndTooltip();
@@ -876,6 +878,23 @@ namespace Windows
ImGui::Columns(1);
ImGui::EndChild();
EndGroupPanel();
if (ImGui::IsKeyPressed(ImGuiKey_C) && !paused)
{
if (selected_browser & LOCAL_BROWSER)
{
selected_local_file = local_files[0];
selected_action = ACTION_CHANGE_LOCAL_DIRECTORY;
}
else if (selected_browser & REMOTE_BROWSER)
{
if (remoteclient != nullptr && remote_files.size() > 0)
{
selected_remote_file = remote_files[0];
selected_action = ACTION_CHANGE_REMOTE_DIRECTORY;
}
}
}
}
void StatusPanel()
@@ -1479,7 +1498,52 @@ namespace Windows
{
ImVec2 cur_pos = ImGui::GetCursorPos();
char id[128];
if (ImGui::Button(lang_strings[STR_ONETIME_URL], ImVec2(535, 0)))
ImGui::Checkbox("##enable_alldebrid_install_uril", &install_pkg_url.enable_alldebrid);
ImGui::SameLine();
ImGui::Text("%s", lang_strings[STR_ENABLE_ALLDEBRID_MSG]);
ImGui::SameLine();
ImGui::SetCursorPosX(ImGui::GetCursorPosX()+40);
ImGui::Checkbox("##enable_realdebrid_install_uril", &install_pkg_url.enable_realdebrid);
ImGui::SameLine();
ImGui::Text("%s", lang_strings[STR_ENABLE_REALDEBRID_MSG]);
ImGui::SameLine();
ImGui::SetCursorPosX(ImGui::GetCursorPosX()+40);
ImGui::Checkbox("##enable_rpi_install_url", &install_pkg_url.enable_rpi);
if (ImGui::IsItemHovered())
{
ImGui::SetNextWindowSize(ImVec2(550, 110));
ImGui::BeginTooltip();
ImGui::PushTextWrapPos(ImGui::GetCursorPos().x + 540);
ImGui::Text("%s", lang_strings[STR_ENABLE_RPI_WEBDAV_MSG]);
ImGui::PopTextWrapPos();
ImGui::EndTooltip();
}
ImGui::SameLine();
ImGui::Text("%s", lang_strings[STR_ENABLE_RPI]);
if (install_pkg_url.enable_rpi)
{
ImGui::SameLine();
ImGui::SetCursorPosX(ImGui::GetCursorPosX()+40);
ImGui::Checkbox("##enable_diskcache_install_uril", &install_pkg_url.enable_disk_cache);
if (ImGui::IsItemHovered())
{
ImGui::SetNextWindowSize(ImVec2(550, 110));
ImGui::BeginTooltip();
ImGui::PushTextWrapPos(ImGui::GetCursorPos().x + 540);
ImGui::Text("%s", lang_strings[STR_ENABLE_DISC_CACHE_MSG]);
ImGui::PopTextWrapPos();
ImGui::EndTooltip();
}
ImGui::SameLine();
ImGui::Text("%s", lang_strings[STR_ENABLE_DISKCACHE_DESC]);
}
ImGui::Separator();
if (ImGui::Button(lang_strings[STR_ONETIME_URL], ImVec2(1070, 0)))
{
ResetImeCallbacks();
sprintf(install_pkg_url.url, "%s", "");
@@ -1493,14 +1557,6 @@ namespace Windows
SetModalMode(false);
ImGui::CloseCurrentPopup();
}
ImGui::SameLine();
sprintf(id, "%s##favoriteurl", lang_strings[STR_CANCEL]);
if (ImGui::Button(id, ImVec2(535, 0)))
{
select_url_inprogress = false;
SetModalMode(false);
ImGui::CloseCurrentPopup();
}
ImGui::Separator();
for (int j = 0; j < MAX_FAVORITE_URLS; j++)
@@ -1548,6 +1604,13 @@ namespace Windows
}
}
if (ImGui::IsKeyPressed(ImGuiKey_GamepadFaceRight, false))
{
select_url_inprogress = false;
SetModalMode(false);
ImGui::CloseCurrentPopup();
}
ImGui::EndPopup();
}
}
@@ -2576,6 +2639,14 @@ namespace Windows
if (ime_result == IME_DIALOG_RESULT_FINISHED)
{
CONFIG::SetClientType(remote_settings);
if (strncasecmp(remote_settings->server, "https://archive.org/", 20) == 0)
{
sprintf(remote_settings->http_server_type, "%s", HTTP_SERVER_ARCHIVEORG);
}
else if (strncasecmp(remote_settings->server, "https://myrient.erista.me/", 26) == 0)
{
sprintf(remote_settings->http_server_type, "%s", HTTP_SERVER_MYRIENT);
}
}
}