# 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>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>
