1111
1212use OC \AppFramework \Bootstrap \Coordinator ;
1313use OC \SystemConfig ;
14- use OCP \Files \Conversion \ConversionMimeTuple ;
14+ use OCP \Files \Conversion \ConversionMimeProvider ;
1515use OCP \Files \Conversion \IConversionManager ;
1616use OCP \Files \Conversion \IConversionProvider ;
1717use OCP \Files \File ;
@@ -53,16 +53,28 @@ public function hasProviders(): bool {
5353 return !empty ($ context ->getFileConversionProviders ());
5454 }
5555
56- public function getMimeTypes (): array {
57- $ mimeTypes = [];
58-
59- foreach ($ this ->getProviders () as $ provider ) {
60- $ mimeTypes [] = $ provider ->getSupportedMimetypes ();
56+ public function getProviders (): array {
57+ $ providers = [];
58+ foreach ($ this ->getRegisteredProviders () as $ provider ) {
59+ $ providers = array_merge ($ providers , $ provider ->getSupportedMimeTypes ());
6160 }
61+ return $ providers ;
62+ }
63+
64+ /**
65+ * @param string $mime
66+ * @return list<ConversionMimeProvider>
67+ */
68+ private function getProvidersForMime (string $ mime ): array {
69+ $ mimeTypes = $ this ->getProviders ();
70+ $ filtered = array_filter (
71+ $ mimeTypes ,
72+ function (ConversionMimeProvider $ mimeProvider ) use ($ mime ) {
73+ return $ mimeProvider ->getFrom () === $ mime ;
74+ }
75+ );
6276
63- /** @var list<ConversionMimeTuple> */
64- $ mimeTypes = array_merge (...$ mimeTypes );
65- return $ mimeTypes ;
77+ return array_values ($ filtered );
6678 }
6779
6880 public function convert (File $ file , string $ targetMimeType , ?string $ destination = null ): string {
@@ -80,24 +92,36 @@ public function convert(File $file, string $targetMimeType, ?string $destination
8092 $ fileMimeType = $ file ->getMimetype ();
8193 $ validProvider = $ this ->getValidProvider ($ fileMimeType , $ targetMimeType );
8294
95+ $ targetExtension = '' ;
96+ foreach ($ this ->getProvidersForMime ($ fileMimeType ) as $ mimeProvider ) {
97+ if ($ mimeProvider ->getTo () === $ targetMimeType ) {
98+ $ targetExtension = $ mimeProvider ->getExtension ();
99+ break ;
100+ }
101+ }
102+
83103 if ($ validProvider !== null ) {
84104 $ convertedFile = $ validProvider ->convertFile ($ file , $ targetMimeType );
85105
86- if ($ destination !== null ) {
87- $ convertedFile = $ this ->writeToDestination ($ destination , $ convertedFile );
88- return $ convertedFile ->getPath ();
106+ // If destination not provided, we use the same path
107+ // as the original file, but with the new extension
108+ if ($ destination === null ) {
109+ $ basename = pathinfo ($ file ->getPath (), PATHINFO_FILENAME );
110+ $ parent = $ file ->getParent ();
111+ $ destination = $ parent ->getFullPath ($ basename . '. ' . $ targetExtension );
89112 }
90113
91- $ tmp = $ this ->tempManager ->getTemporaryFile ();
92- file_put_contents ($ tmp , $ convertedFile );
93-
94- return $ tmp ;
114+ $ convertedFile = $ this ->writeToDestination ($ destination , $ convertedFile );
115+ return $ convertedFile ->getPath ();
95116 }
96117
97118 throw new RuntimeException ('Could not convert file ' );
98119 }
99120
100- public function getProviders (): array {
121+ /**
122+ * @return IConversionProvider[]
123+ */
124+ private function getRegisteredProviders (): array {
101125 if (count ($ this ->providers ) > 0 ) {
102126 return $ this ->providers ;
103127 }
@@ -125,28 +149,29 @@ public function getProviders(): array {
125149 }
126150
127151 private function writeToDestination (string $ destination , mixed $ content ): File {
152+ if ($ this ->rootFolder ->nodeExists ($ destination )) {
153+ $ file = $ this ->rootFolder ->get ($ destination );
154+ $ parent = $ file ->getParent ();
155+ if (!$ parent ->isCreatable ()) {
156+ throw new GenericFileException ('Destination is not creatable ' );
157+ }
158+
159+ $ newName = $ parent ->getNonExistingName (basename ($ destination ));
160+ $ destination = $ parent ->getFullPath ($ newName );
161+ }
162+
128163 return $ this ->rootFolder ->newFile ($ destination , $ content );
129164 }
130165
131166 private function getValidProvider (string $ fileMimeType , string $ targetMimeType ): ?IConversionProvider {
132- $ validProvider = null ;
133- foreach ($ this ->getProviders () as $ provider ) {
134- $ suitableMimeTypes = array_filter (
135- $ provider ->getSupportedMimeTypes (),
136- function (ConversionMimeTuple $ mimeTuple ) use ($ fileMimeType , $ targetMimeType ) {
137- ['from ' => $ from , 'to ' => $ to ] = $ mimeTuple ->jsonSerialize ();
138-
139- $ supportsTargetMimeType = in_array ($ targetMimeType , array_column ($ to , 'mime ' ));
140- return ($ from === $ fileMimeType ) && $ supportsTargetMimeType ;
167+ foreach ($ this ->getRegisteredProviders () as $ provider ) {
168+ foreach ($ provider ->getSupportedMimeTypes () as $ mimeProvider ) {
169+ if ($ mimeProvider ->getFrom () === $ fileMimeType && $ mimeProvider ->getTo () === $ targetMimeType ) {
170+ return $ provider ;
141171 }
142- );
143-
144- if (!empty ($ suitableMimeTypes )) {
145- $ validProvider = $ provider ;
146- break ;
147172 }
148173 }
149-
150- return $ validProvider ;
174+
175+ return null ;
151176 }
152177}
0 commit comments