@@ -598,63 +598,77 @@ protected boolean setFilename(FILENAME_SOURCE source, DownloadLink link, String
598598 }
599599 }
600600
601- public String correctOrApplyFileNameExtension (final String filenameOrg , String newExtension , URLConnectionAdapter connection ) {
601+ public String correctOrApplyFileNameExtension (final String filenameArg , String newExtension , URLConnectionAdapter connection ) {
602602 final String newExtensionParam = newExtension ;
603603 if (connection != null ) {
604604 final String extensionFromConnection = getExtensionFromConnection (connection );
605605 if (extensionFromConnection != null ) {
606606 newExtension = extensionFromConnection ;
607607 }
608608 }
609- if (filenameOrg == null ) {
609+ if (filenameArg == null ) {
610610 return null ;
611611 } else if (StringUtils .isEmpty (newExtension )) {
612- return filenameOrg ;
612+ return filenameArg ;
613613 } else if (!newExtension .startsWith ("." )) {
614614 newExtension = "." + newExtension ;
615615 }
616616 if (!StringUtils .equalsIgnoreCase (newExtensionParam , newExtension )) {
617617 // call again with newExtension set
618- return correctOrApplyFileNameExtension (filenameOrg , newExtension , connection );
618+ return correctOrApplyFileNameExtension (filenameArg , newExtension , connection );
619+ }
620+ if (StringUtils .endsWithCaseInsensitive (filenameArg , newExtension )) {
621+ /* Filename already ends with target-extension. */
622+ return filenameArg ;
619623 }
620624 final CompiledFiletypeExtension filetypeNew = CompiledFiletypeFilter .getExtensionsFilterInterface (newExtension );
621- if (!filenameOrg .contains ("." )) {
625+ /* Fix ugly filenames that e.-g. end with " mp4" */
626+ String filename = filenameArg .replaceFirst ("(?i)" + Pattern .quote (newExtension .replace ("." , "" )) + "$" , "" ).trim ();
627+ if (filename .equals (filenameArg ) && filetypeNew != null ) {
628+ for (int length = 4 ; length >= 1 ; length --) {
629+ final String maybeExtension = new Regex (filename , "[^\\ .]([a-zA-Z0-9]{" + length + "})$" ).getMatch (0 );
630+ final CompiledFiletypeExtension maybeExtensionFileType = CompiledFiletypeFilter .getExtensionsFilterInterface (maybeExtension );
631+ if (maybeExtensionFileType != null && filetypeNew .isSameExtensionGroup (maybeExtensionFileType )) {
632+ // remove extension(without leading dot) of same ExtensionGroup as newExtension
633+ filename = filenameArg .replaceFirst ("(?i)" + Pattern .quote (maybeExtension ) + "$" , "" ).trim ();
634+ break ;
635+ }
636+ }
637+ }
638+ if (!filename .contains ("." )) {
622639 /* Filename doesn't contain an extension at all -> Add extension to filename. */
623- if (allowFileNameExtension (filenameOrg , null , filetypeNew )) {
624- return filenameOrg + newExtension ;
640+ if (allowFileNameExtension (filename , null , filetypeNew )) {
641+ return filename + newExtension ;
625642 } else {
626643 logger .info ("blocked new extension:" + newExtension + "|" + filetypeNew );
627- return filenameOrg ;
644+ return filename ;
628645 }
629- } else if (StringUtils .endsWithCaseInsensitive (filenameOrg , newExtension )) {
630- /* Filename already ends with target-extension. */
631- return filenameOrg ;
632646 } else if (filetypeNew == null ) {
633647 /* Unknown new filetype -> Do not touch given filename */
634648 logger .info ("unknown new extension:" + newExtension );
635- return filenameOrg ;
649+ return filename ;
636650 }
637- final int lastIndex = filenameOrg .lastIndexOf ("." );
638- final String currentFileExtension = lastIndex < filenameOrg .length () ? filenameOrg .substring (lastIndex ) : null ;
651+ final int lastIndex = filename .lastIndexOf ("." );
652+ final String currentFileExtension = lastIndex < filename .length () ? filename .substring (lastIndex ) : null ;
639653 if (StringUtils .isEmpty (currentFileExtension )) {
640- return filenameOrg ;
654+ return filename ;
641655 }
642656 final CompiledFiletypeExtension filetypeOld = CompiledFiletypeFilter .getExtensionsFilterInterface (currentFileExtension );
643657 if (filetypeOld == null ) {
644- if (allowFileNameExtension (filenameOrg , filetypeOld , filetypeNew )) {
645- return filenameOrg + newExtension ;
658+ if (allowFileNameExtension (filename , filetypeOld , filetypeNew )) {
659+ return filename + newExtension ;
646660 } else {
647661 logger .info ("blocked new extension:" + newExtension + "|" + filetypeNew );
648- return filenameOrg ;
662+ return filename ;
649663 }
650664 } else if (filetypeNew .isValidExtension (currentFileExtension )) {
651665 /* Filename already contains valid/alternative target-extension e.g. webm/mp4 or jpg/jpeg */
652- return filenameOrg ;
653- } else if (allowFileNameExtension (filenameOrg , filetypeOld , filetypeNew )) {
654- final String filenameWithoutExtension = filenameOrg .substring (0 , lastIndex );
666+ return filename ;
667+ } else if (allowFileNameExtension (filename , filetypeOld , filetypeNew )) {
668+ final String filenameWithoutExtension = filename .substring (0 , lastIndex );
655669 return filenameWithoutExtension + newExtension ;
656670 } else {
657- return filenameOrg ;
671+ return filename ;
658672 }
659673 }
660674
@@ -679,41 +693,56 @@ protected boolean allowFileNameExtension(String filenameOrg, CompiledFiletypeExt
679693 * Do not use this to replace a file extension with another one if you clearly know what to replace with what because this will auto
680694 * decide whether to replace or append the new extension!
681695 */
682- public String applyFilenameExtension (final String filenameOrg , String newExtension ) {
683- if (filenameOrg == null ) {
696+ public String applyFilenameExtension (final String filenameArg , String newExtension ) {
697+ if (filenameArg == null ) {
684698 return null ;
685699 } else if (StringUtils .isEmpty (newExtension )) {
686- return filenameOrg ;
687- } else if (!newExtension .startsWith ("." )) {
700+ return filenameArg ;
701+ }
702+ if (!newExtension .startsWith ("." )) {
688703 newExtension = "." + newExtension ;
689704 }
690- if (StringUtils .endsWithCaseInsensitive (filenameOrg , newExtension )) {
705+ if (StringUtils .endsWithCaseInsensitive (filenameArg , newExtension )) {
691706 /* Filename already contains target-extension. */
692- return filenameOrg ;
693- } else if (!filenameOrg .contains ("." )) {
707+ return filenameArg ;
708+ }
709+ final CompiledFiletypeExtension filetypeNew = CompiledFiletypeFilter .getExtensionsFilterInterface (newExtension );
710+ /* Fix ugly filenames that e.-g. end with " mp4" */
711+ String filename = filenameArg .replaceFirst ("(?i)" + Pattern .quote (newExtension .replace ("." , "" )) + "$" , "" ).trim ();
712+ if (filename .equals (filenameArg ) && filetypeNew != null ) {
713+ for (int length = 4 ; length >= 1 ; length --) {
714+ final String maybeExtension = new Regex (filename , "[^\\ .]([a-zA-Z0-9]{" + length + "})$" ).getMatch (0 );
715+ final CompiledFiletypeExtension maybeExtensionFileType = CompiledFiletypeFilter .getExtensionsFilterInterface (maybeExtension );
716+ if (maybeExtensionFileType != null && filetypeNew .isSameExtensionGroup (maybeExtensionFileType )) {
717+ // remove extension(without leading dot) of same ExtensionGroup as newExtension
718+ filename = filenameArg .replaceFirst ("(?i)" + Pattern .quote (maybeExtension ) + "$" , "" ).trim ();
719+ break ;
720+ }
721+ }
722+ }
723+ if (!filename .contains ("." )) {
694724 /* Filename has no extension at all -> Apply extension */
695- return filenameOrg + newExtension ;
725+ return filename + newExtension ;
696726 }
697- final int lastIndex = filenameOrg .lastIndexOf ("." );
698- final String currentFileExtension = lastIndex < filenameOrg .length () ? filenameOrg .substring (lastIndex ) : null ;
727+ final int lastIndex = filename .lastIndexOf ("." );
728+ final String currentFileExtension = lastIndex < filename .length () ? filename .substring (lastIndex ) : null ;
699729 final CompiledFiletypeExtension filetypeOld = CompiledFiletypeFilter .getExtensionsFilterInterface (currentFileExtension );
700730 if (filetypeOld == null ) {
701731 /* We don't know the type of the current/old file extension -> No "smart handling" possible -> Apply new extension */
702- return filenameOrg + newExtension ;
732+ return filename + newExtension ;
703733 }
704- final CompiledFiletypeExtension filetypeNew = CompiledFiletypeFilter .getExtensionsFilterInterface (newExtension );
705734 if (filetypeNew != null ) {
706735 if (filetypeNew .isValidExtension (currentFileExtension )) {
707736 /* Filename already contains valid/alternative target-extension e.g. webm/mp4 or jpg/jpeg */
708- return filenameOrg ;
737+ return filename ;
709738 } else if (filetypeNew .isSameExtensionGroup (filetypeOld )) {
710739 /* Same filetype (e.g. old is image, new is image) -> Replace old extension with new extension e.g. .png to .jpg */
711- final String filenameWithoutExtension = filenameOrg .substring (0 , lastIndex );
740+ final String filenameWithoutExtension = filename .substring (0 , lastIndex );
712741 return filenameWithoutExtension + newExtension ;
713742 }
714743 }
715744 /* Apply new extension */
716- return filenameOrg + newExtension ;
745+ return filename + newExtension ;
717746 }
718747
719748 protected boolean isConnectionOffline (Throwable e ) {
@@ -869,7 +898,6 @@ public static PluginEnvironment getPluginEnvironment() {
869898 return PluginEnvironment .UNKNOWN ;
870899 }
871900 }
872-
873901 }
874902
875903 protected final PluginEnvironment getPluginEnvironment () {
0 commit comments