# BendyStraw

An app for managing <strong>NewPipe</strong> databases.

<strong>BendyStraw</strong> imports [ NewPipeData-*.zip ] files and lets you:

<ul>
  <li>Open multiple [ zip ]s at the same time, so you can combine data from several devices</li>
  <li>[ Delete ] [ Copy ] [ Move ] [ Rename ] your custom playlists</li>
  <li>[ Delete ] [ Copy ] [ Move ] streams from one playlist to another</li>
  <li>[ Delete ] [ Copy ] [ Move ] channel subscriptions between databases</li>
  <li>[ Delete ] [ Copy ] [ Move ] remote (bookmarked) playlists</li>
  <li>Re-order playlists, sorting the streams by [ Title ], [ Channel ] or [ Length ] (just tap the column headings in the tables)</li>
  <li>Shuffle or reverse playlists</li>
  <li>Streams (audio/video) can be opened directly from <strong>BendyStraw</strong>, as the URLs are clickable
    <ul>
      <li>If you set video links (in your Android settings) to open in <strong>NewPipe</strong> you can make a split-screen view and jump around your playlists</li>
    </ul>
  </li>
  <li>Export playlist as raw text, for example to be used with <a href="https://github.com/yt-dlp/yt-dlp">yt-dlp</a></li>
  <li><strong>New!</strong> Import playlists from JSON (the button to do this is hidden by default, go to the settings menu to show it)</li>
  <li><strong>New!</strong> Open as a temporary YouTube playlist in your browser (the button to do this is hidden by default, go to the settings menu to show it)</li>
  <li>Dark/light themes</li>
</ul>

After editing simply export a new [ zip ] file, then import it back into <strong>NewPipe</strong>.



## Note about Permissions

On Android 13+, <strong>BendyStraw</strong> asks for the <em>manage external storage</em> permission, here's why:

<ul>
  <li>
    A typical use-case for this app is to open several [ zip ] files, concurrently, from multiple locations including [ Download ] directories (these files would be, for example, multiple <strong>NewPipe</strong> exports from multiple devices, which you want to combine).
  </li>
  <li>
    Each [ zip ] is extracted so that its contained [ newpipe.db ] SQLite database can be read/written while you are editing.
  </li>
  <li>
    After editing, the extracted files are written back to a new [ zip ], and/or overwrite the original [ zip ]s.
  </li>
</ul>


<strong>I aim to minimise the permissions I request in everything I build</strong>. Android 13 introduced changes to make doing what I decribed above difficult. I explored alternative methods requiring fewer permissions and felt that it compromised the user experience for my (as the app's first user) typical usage, making it more complicated and annoying.


I treat users as responsible human beings, so give you this info to allow you to make an informed choice. If you are not happy with this, you can:

<ul>
  <li>Choose not to grant the permission, and uninstall the app.</li>
  <li>
    Check the source code to see that I'm not doing anything nefarious, or ask somebody to check it for you (at time of writing, everything related to reading/writing files is in [ /lib/file_manager_widget.dart ]).
  </li>
  <li>
    Build the app yourself from the source using <strong>Flutter</strong>.
  </li>
</ul>
