Skip to content

RenameFile: OSError 'File name too long' from doubled extension in long-filename truncation #767

Description

@garfolino

Plugin

RenameFile

Description

Renaming a scene whose generated filename exceeds max_filename_length (default 255) can produce a filename that is longer than the original and ends in a doubled extension (e.g. ....mp4.mp4), causing the OS rename to fail with OSError: [Errno 63] File name too long on macOS (and the equivalent ENAMETOOLONG elsewhere).

Root cause

In rename_scene() (renamefile.py), the truncate-and-hash fallback appends the file extension onto new_filenamebefore computing/appending the _+MD5-hash suffix, and doesn't reserve space in the length budget for that suffix:

iflen(new_filename) >max_filename_length:
extension_length=len(Path(original_file_path).suffix)
max_base_filename_length=max_filename_length-extension_lengthtruncated_filename=new_filename[:max_base_filename_length]
hash_suffix=hashlib.md5(new_filename.encode()).hexdigest()
new_filename=truncated_filename+'_'+hash_suffix+Path(original_file_path).suffixnewFilenameWithExt=new_filename+Path(original_file_path).suffix

Two bugs:

  1. max_base_filename_length only subtracts the extension length, not the _ + 32-char hash that gets appended afterward — so the "truncated" name can still exceed max_filename_length.
  2. Since new_filename already ends with the extension after truncation, the next line (newFilenameWithExt = new_filename + suffix) appends the extension a second time, producing a name like ....mp4.mp4 and pushing it well past the OS limit.

Reproduction (from a real log)

OSError: [Errno 63] File name too long: '.../Movie-name-(...)-[...].mp4' -> '.../Movie-name-(...)-[...Gagging_a68f3c2a62cef848afd6bb9ef0ff4fc6.mp4.mp4'

The resulting target filename is 292 characters (vs. the configured 255 limit) and ends in .mp4.mp4.

Additional issue

When the rename/move fails, the code logs a clear one-line error (stash.Error(exitMsg)) but then re-raises the OSError, which propagates to the plugin's top-level catch-all and dumps the full Python traceback to the log as well — burying the clear message under noise.


Disclosure: this issue and the accompanying fix (PR to follow) were drafted with LLM (Claude) assistance, based on analysis of a real error log; reviewed and submitted by a human maintainer.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

    , 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
     blocks
    (function() {
    function addCopyButtons() {
    document.querySelectorAll('pre code').forEach(function(codeBlock) {
    if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
    codeBlock.parentElement.setAttribute('data-copy-added', 'true');
    var btn = document.createElement('button');
    btn.textContent = 'Copy';
    btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
    btn.onmouseover = function() { this.style.opacity = '1'; };
    btn.onmouseout = function() { this.style.opacity = '0.7'; };
    btn.onclick = function() {
    navigator.clipboard.writeText(codeBlock.textContent).then(function() {
    btn.textContent = 'Copied!';
    setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
    });
    };
    codeBlock.parentElement.style.position = 'relative';
    codeBlock.parentElement.appendChild(btn);
    });
    }
    addCopyButtons();
    // Re-run on dynamic content
    var observer = new MutationObserver(addCopyButtons);
    observer.observe(document.body, { childList: true, subtree: true });
    })();
    }
    } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
    })();
    (function(){
    try {
    var __m = "github.com";
    var __re = new RegExp('^' + "github\\.com" + '
    RenameFile: OSError 'File name too long' from doubled extension in long-filename truncation · Issue #767 · stashapp/CommunityScripts · GitHub
    Skip to content

    RenameFile: OSError 'File name too long' from doubled extension in long-filename truncation #767

    Description

    @garfolino

    Plugin

    RenameFile

    Description

    Renaming a scene whose generated filename exceeds max_filename_length (default 255) can produce a filename that is longer than the original and ends in a doubled extension (e.g. ....mp4.mp4), causing the OS rename to fail with OSError: [Errno 63] File name too long on macOS (and the equivalent ENAMETOOLONG elsewhere).

    Root cause

    In rename_scene() (renamefile.py), the truncate-and-hash fallback appends the file extension onto new_filenamebefore computing/appending the _+MD5-hash suffix, and doesn't reserve space in the length budget for that suffix:

    iflen(new_filename) >max_filename_length:
    extension_length=len(Path(original_file_path).suffix)
    max_base_filename_length=max_filename_length-extension_lengthtruncated_filename=new_filename[:max_base_filename_length]
    hash_suffix=hashlib.md5(new_filename.encode()).hexdigest()
    new_filename=truncated_filename+'_'+hash_suffix+Path(original_file_path).suffixnewFilenameWithExt=new_filename+Path(original_file_path).suffix

    Two bugs:

    1. max_base_filename_length only subtracts the extension length, not the _ + 32-char hash that gets appended afterward — so the "truncated" name can still exceed max_filename_length.
    2. Since new_filename already ends with the extension after truncation, the next line (newFilenameWithExt = new_filename + suffix) appends the extension a second time, producing a name like ....mp4.mp4 and pushing it well past the OS limit.

    Reproduction (from a real log)

    OSError: [Errno 63] File name too long: '.../Movie-name-(...)-[...].mp4' -> '.../Movie-name-(...)-[...Gagging_a68f3c2a62cef848afd6bb9ef0ff4fc6.mp4.mp4'
    

    The resulting target filename is 292 characters (vs. the configured 255 limit) and ends in .mp4.mp4.

    Additional issue

    When the rename/move fails, the code logs a clear one-line error (stash.Error(exitMsg)) but then re-raises the OSError, which propagates to the plugin's top-level catch-all and dumps the full Python traceback to the log as well — burying the clear message under noise.


    Disclosure: this issue and the accompanying fix (PR to follow) were drafted with LLM (Claude) assistance, based on analysis of a real error log; reviewed and submitted by a human maintainer.

    Metadata

    Metadata

    Assignees

    No one assigned

      Labels

      No labels
      No labels

      Type

      No type

      Projects

      No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' RenameFile: OSError 'File name too long' from doubled extension in long-filename truncation · Issue #767 · stashapp/CommunityScripts · GitHub
      Skip to content

      RenameFile: OSError 'File name too long' from doubled extension in long-filename truncation #767

      Description

      @garfolino

      Plugin

      RenameFile

      Description

      Renaming a scene whose generated filename exceeds max_filename_length (default 255) can produce a filename that is longer than the original and ends in a doubled extension (e.g. ....mp4.mp4), causing the OS rename to fail with OSError: [Errno 63] File name too long on macOS (and the equivalent ENAMETOOLONG elsewhere).

      Root cause

      In rename_scene() (renamefile.py), the truncate-and-hash fallback appends the file extension onto new_filenamebefore computing/appending the _+MD5-hash suffix, and doesn't reserve space in the length budget for that suffix:

      iflen(new_filename) >max_filename_length:
      extension_length=len(Path(original_file_path).suffix)
      max_base_filename_length=max_filename_length-extension_lengthtruncated_filename=new_filename[:max_base_filename_length]
      hash_suffix=hashlib.md5(new_filename.encode()).hexdigest()
      new_filename=truncated_filename+'_'+hash_suffix+Path(original_file_path).suffixnewFilenameWithExt=new_filename+Path(original_file_path).suffix

      Two bugs:

      1. max_base_filename_length only subtracts the extension length, not the _ + 32-char hash that gets appended afterward — so the "truncated" name can still exceed max_filename_length.
      2. Since new_filename already ends with the extension after truncation, the next line (newFilenameWithExt = new_filename + suffix) appends the extension a second time, producing a name like ....mp4.mp4 and pushing it well past the OS limit.

      Reproduction (from a real log)

      OSError: [Errno 63] File name too long: '.../Movie-name-(...)-[...].mp4' -> '.../Movie-name-(...)-[...Gagging_a68f3c2a62cef848afd6bb9ef0ff4fc6.mp4.mp4'
      

      The resulting target filename is 292 characters (vs. the configured 255 limit) and ends in .mp4.mp4.

      Additional issue

      When the rename/move fails, the code logs a clear one-line error (stash.Error(exitMsg)) but then re-raises the OSError, which propagates to the plugin's top-level catch-all and dumps the full Python traceback to the log as well — burying the clear message under noise.


      Disclosure: this issue and the accompanying fix (PR to follow) were drafted with LLM (Claude) assistance, based on analysis of a real error log; reviewed and submitted by a human maintainer.

      Metadata

      Metadata

      Assignees

      No one assigned

        Labels

        No labels
        No labels

        Type

        No type

        Projects

        No projects

        Milestone

        No milestone

        Relationships

        None yet

        Development

        No branches or pull requests

        Issue actions

        , 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' RenameFile: OSError 'File name too long' from doubled extension in long-filename truncation · Issue #767 · stashapp/CommunityScripts · GitHub
        Skip to content

        RenameFile: OSError 'File name too long' from doubled extension in long-filename truncation #767

        Description

        @garfolino

        Plugin

        RenameFile

        Description

        Renaming a scene whose generated filename exceeds max_filename_length (default 255) can produce a filename that is longer than the original and ends in a doubled extension (e.g. ....mp4.mp4), causing the OS rename to fail with OSError: [Errno 63] File name too long on macOS (and the equivalent ENAMETOOLONG elsewhere).

        Root cause

        In rename_scene() (renamefile.py), the truncate-and-hash fallback appends the file extension onto new_filenamebefore computing/appending the _+MD5-hash suffix, and doesn't reserve space in the length budget for that suffix:

        iflen(new_filename) >max_filename_length:
        extension_length=len(Path(original_file_path).suffix)
        max_base_filename_length=max_filename_length-extension_lengthtruncated_filename=new_filename[:max_base_filename_length]
        hash_suffix=hashlib.md5(new_filename.encode()).hexdigest()
        new_filename=truncated_filename+'_'+hash_suffix+Path(original_file_path).suffixnewFilenameWithExt=new_filename+Path(original_file_path).suffix

        Two bugs:

        1. max_base_filename_length only subtracts the extension length, not the _ + 32-char hash that gets appended afterward — so the "truncated" name can still exceed max_filename_length.
        2. Since new_filename already ends with the extension after truncation, the next line (newFilenameWithExt = new_filename + suffix) appends the extension a second time, producing a name like ....mp4.mp4 and pushing it well past the OS limit.

        Reproduction (from a real log)

        OSError: [Errno 63] File name too long: '.../Movie-name-(...)-[...].mp4' -> '.../Movie-name-(...)-[...Gagging_a68f3c2a62cef848afd6bb9ef0ff4fc6.mp4.mp4'
        

        The resulting target filename is 292 characters (vs. the configured 255 limit) and ends in .mp4.mp4.

        Additional issue

        When the rename/move fails, the code logs a clear one-line error (stash.Error(exitMsg)) but then re-raises the OSError, which propagates to the plugin's top-level catch-all and dumps the full Python traceback to the log as well — burying the clear message under noise.


        Disclosure: this issue and the accompanying fix (PR to follow) were drafted with LLM (Claude) assistance, based on analysis of a real error log; reviewed and submitted by a human maintainer.

        Metadata

        Metadata

        Assignees

        No one assigned

          Labels

          No labels
          No labels

          Type

          No type

          Projects

          No projects

          Milestone

          No milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' RenameFile: OSError 'File name too long' from doubled extension in long-filename truncation · Issue #767 · stashapp/CommunityScripts · GitHub
          Skip to content

          RenameFile: OSError 'File name too long' from doubled extension in long-filename truncation #767

          Description

          @garfolino

          Plugin

          RenameFile

          Description

          Renaming a scene whose generated filename exceeds max_filename_length (default 255) can produce a filename that is longer than the original and ends in a doubled extension (e.g. ....mp4.mp4), causing the OS rename to fail with OSError: [Errno 63] File name too long on macOS (and the equivalent ENAMETOOLONG elsewhere).

          Root cause

          In rename_scene() (renamefile.py), the truncate-and-hash fallback appends the file extension onto new_filenamebefore computing/appending the _+MD5-hash suffix, and doesn't reserve space in the length budget for that suffix:

          iflen(new_filename) >max_filename_length:
          extension_length=len(Path(original_file_path).suffix)
          max_base_filename_length=max_filename_length-extension_lengthtruncated_filename=new_filename[:max_base_filename_length]
          hash_suffix=hashlib.md5(new_filename.encode()).hexdigest()
          new_filename=truncated_filename+'_'+hash_suffix+Path(original_file_path).suffixnewFilenameWithExt=new_filename+Path(original_file_path).suffix

          Two bugs:

          1. max_base_filename_length only subtracts the extension length, not the _ + 32-char hash that gets appended afterward — so the "truncated" name can still exceed max_filename_length.
          2. Since new_filename already ends with the extension after truncation, the next line (newFilenameWithExt = new_filename + suffix) appends the extension a second time, producing a name like ....mp4.mp4 and pushing it well past the OS limit.

          Reproduction (from a real log)

          OSError: [Errno 63] File name too long: '.../Movie-name-(...)-[...].mp4' -> '.../Movie-name-(...)-[...Gagging_a68f3c2a62cef848afd6bb9ef0ff4fc6.mp4.mp4'
          

          The resulting target filename is 292 characters (vs. the configured 255 limit) and ends in .mp4.mp4.

          Additional issue

          When the rename/move fails, the code logs a clear one-line error (stash.Error(exitMsg)) but then re-raises the OSError, which propagates to the plugin's top-level catch-all and dumps the full Python traceback to the log as well — burying the clear message under noise.


          Disclosure: this issue and the accompanying fix (PR to follow) were drafted with LLM (Claude) assistance, based on analysis of a real error log; reviewed and submitted by a human maintainer.

          Metadata

          Metadata

          Assignees

          No one assigned

            Labels

            No labels
            No labels

            Type

            No type

            Projects

            No projects

            Milestone

            No milestone

            Relationships

            None yet

            Development

            No branches or pull requests

            Issue actions

            , 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' RenameFile: OSError 'File name too long' from doubled extension in long-filename truncation · Issue #767 · stashapp/CommunityScripts · GitHub
            Skip to content

            RenameFile: OSError 'File name too long' from doubled extension in long-filename truncation #767

            Description

            @garfolino

            Plugin

            RenameFile

            Description

            Renaming a scene whose generated filename exceeds max_filename_length (default 255) can produce a filename that is longer than the original and ends in a doubled extension (e.g. ....mp4.mp4), causing the OS rename to fail with OSError: [Errno 63] File name too long on macOS (and the equivalent ENAMETOOLONG elsewhere).

            Root cause

            In rename_scene() (renamefile.py), the truncate-and-hash fallback appends the file extension onto new_filenamebefore computing/appending the _+MD5-hash suffix, and doesn't reserve space in the length budget for that suffix:

            iflen(new_filename) >max_filename_length:
            extension_length=len(Path(original_file_path).suffix)
            max_base_filename_length=max_filename_length-extension_lengthtruncated_filename=new_filename[:max_base_filename_length]
            hash_suffix=hashlib.md5(new_filename.encode()).hexdigest()
            new_filename=truncated_filename+'_'+hash_suffix+Path(original_file_path).suffixnewFilenameWithExt=new_filename+Path(original_file_path).suffix

            Two bugs:

            1. max_base_filename_length only subtracts the extension length, not the _ + 32-char hash that gets appended afterward — so the "truncated" name can still exceed max_filename_length.
            2. Since new_filename already ends with the extension after truncation, the next line (newFilenameWithExt = new_filename + suffix) appends the extension a second time, producing a name like ....mp4.mp4 and pushing it well past the OS limit.

            Reproduction (from a real log)

            OSError: [Errno 63] File name too long: '.../Movie-name-(...)-[...].mp4' -> '.../Movie-name-(...)-[...Gagging_a68f3c2a62cef848afd6bb9ef0ff4fc6.mp4.mp4'
            

            The resulting target filename is 292 characters (vs. the configured 255 limit) and ends in .mp4.mp4.

            Additional issue

            When the rename/move fails, the code logs a clear one-line error (stash.Error(exitMsg)) but then re-raises the OSError, which propagates to the plugin's top-level catch-all and dumps the full Python traceback to the log as well — burying the clear message under noise.


            Disclosure: this issue and the accompanying fix (PR to follow) were drafted with LLM (Claude) assistance, based on analysis of a real error log; reviewed and submitted by a human maintainer.

            Metadata

            Metadata

            Assignees

            No one assigned

              Labels

              No labels
              No labels

              Type

              No type

              Projects

              No projects

              Milestone

              No milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); RenameFile: OSError 'File name too long' from doubled extension in long-filename truncation · Issue #767 · stashapp/CommunityScripts · GitHub
              Skip to content

              RenameFile: OSError 'File name too long' from doubled extension in long-filename truncation #767

              Description

              @garfolino

              Plugin

              RenameFile

              Description

              Renaming a scene whose generated filename exceeds max_filename_length (default 255) can produce a filename that is longer than the original and ends in a doubled extension (e.g. ....mp4.mp4), causing the OS rename to fail with OSError: [Errno 63] File name too long on macOS (and the equivalent ENAMETOOLONG elsewhere).

              Root cause

              In rename_scene() (renamefile.py), the truncate-and-hash fallback appends the file extension onto new_filenamebefore computing/appending the _+MD5-hash suffix, and doesn't reserve space in the length budget for that suffix:

              iflen(new_filename) >max_filename_length:
              extension_length=len(Path(original_file_path).suffix)
              max_base_filename_length=max_filename_length-extension_lengthtruncated_filename=new_filename[:max_base_filename_length]
              hash_suffix=hashlib.md5(new_filename.encode()).hexdigest()
              new_filename=truncated_filename+'_'+hash_suffix+Path(original_file_path).suffixnewFilenameWithExt=new_filename+Path(original_file_path).suffix

              Two bugs:

              1. max_base_filename_length only subtracts the extension length, not the _ + 32-char hash that gets appended afterward — so the "truncated" name can still exceed max_filename_length.
              2. Since new_filename already ends with the extension after truncation, the next line (newFilenameWithExt = new_filename + suffix) appends the extension a second time, producing a name like ....mp4.mp4 and pushing it well past the OS limit.

              Reproduction (from a real log)

              OSError: [Errno 63] File name too long: '.../Movie-name-(...)-[...].mp4' -> '.../Movie-name-(...)-[...Gagging_a68f3c2a62cef848afd6bb9ef0ff4fc6.mp4.mp4'
              

              The resulting target filename is 292 characters (vs. the configured 255 limit) and ends in .mp4.mp4.

              Additional issue

              When the rename/move fails, the code logs a clear one-line error (stash.Error(exitMsg)) but then re-raises the OSError, which propagates to the plugin's top-level catch-all and dumps the full Python traceback to the log as well — burying the clear message under noise.


              Disclosure: this issue and the accompanying fix (PR to follow) were drafted with LLM (Claude) assistance, based on analysis of a real error log; reviewed and submitted by a human maintainer.

              Metadata

              Metadata

              Assignees

              No one assigned

                Labels

                No labels
                No labels

                Type

                No type

                Projects

                No projects

                Milestone

                No milestone

                Relationships

                None yet

                Development

                No branches or pull requests

                Issue actions