CCExtractor / rutorrent-flutter

A ruTorrent-based client in Flutter
MIT License
126 stars 111 forks source link

Feature to Enable/Disable, Add, Edit and Delete RSS Filters #133

Open AbdulMalikDev opened 3 years ago

AbdulMalikDev commented 3 years ago

Current State

In the current state of the application, when the RSS Filter is either enabled or disabled, a message prompting the user to use the ruTorrent web interface to make the changes pops up as shown below.

RSS Filter Enable Disable

Furthermore, the option of adding, deleting or editing (existing) RSS Filters is not present.

Proposed Changes

  1. I would like to implement the feature of enabling and disabling the RSS Filters from the application itself.
  2. I would also like to implement an RSS Filter Edit Screen whose purpose will be to take user-input related to the RSS Filter (name, pattern, labels etc. )

Implementation

Enabling and Disabling RSS Filters

I will be using the RSS Plugin of the ruTorrent Web Interface to implement this feature. Implementing this feature would require changing the enabled integer in the RSS Filter object and making a POST request to the RSS plugin with the JSON form of the RSS Filter object (more on this below).

Add, Edit, Delete RSS Filters

Again the RSS Plugin will be used. A small catch here is, anytime any change is made to any of the filters, ALL (existing) filters have to be sent via the POST network call to the Plugin. If we attempt to send only the filter that has been changed, all other filters are deleted.

Now the issue with this approach is, a JSON object cannot contain two same keys for obvious reasons and the plugin was not accepting different JSON objects for different filters.

So we will use Content-Type: application/x-www-form-urlencoded to send the data after encoding all the existing RSS Filters in the application.

The one function that will implement both network implementations is given below.

/// Sets details of RSS Filters
  static setRSSFilter(Api api, List<RSSFilter> filters) async {

    // Set Headers
    Map<String, String> headers = {
      "Content-Type": "application/x-www-form-urlencoded"
    };
    headers.addAll(api.getAuthHeader());

    // Set mode of Query
    String queryString = "mode=setfilters&";

    // Encode and add all Filters to the query
    for (RSSFilter filter in filters ?? []) {
      queryString += Uri(queryParameters: filter.toJson()).query + "&";
    }

    // Execute the Network Call
    await api.ioClient
        .post(Uri.parse(api.rssPluginUrl), headers: headers, body: queryString);
  }

The video of the complete working of the proposed feature will be added in the feature PR.

PR #134

AbdulMalikDev commented 2 years ago

The project has been updated extensively in the last 2 years (check wiki for more info). The default branch is now the "main" branch.

If anyone wants to work on this feature you can simply apply this concept on the new "main" branch.