Mostly bug fixes.
- The search form at the top of results page has been revamped and made more meaningful. You can specify the number of results per search.
- The bug which causes the “older tweets” link in the footer to omit the location information has been fixed.
JAR executable (Linux/Mac/Windows) and APK installer (for Android) available at:
A bug led to the discovery new capabilities.
EmailTweetor (desktop version) has the ability to post multiple images in one tweet. When checking this capability, I found to my dismay that TweetsToRSS was displaying only the last image in any tweet. Instead of += in the for loop, I had been using just =, which made the previous image details to be overwritten. I further explored the API and discovered support for animated GIFs and videos. So, the changes are:
- Support for animated GIF images and videos.
- Fix for bug which caused only the last image in a tweet to be displayed.
- Fix for the bug (in Android) causing the locations.html file was displayed as raw HTML.
- Fix for the following error, which caused the whole request to be cancelled if just one tweet in the list sent by Twitter generated it:
404:The URI requested is invalid or the resource requested, such as a user, does not exists. Also returned when the requested format is not supported by the requested method. message – No status found with that ID. code – 144
Some bugs had crept in after I made possible to use the Twit.bin file from the desktop version. The empty space below the buttons has been replaced with a simple introduction to the app. The Twitter authentication screen temporarily saves the URL to clipboard so that the PIN can be generated outside the app (in a browser of choice).
I use TweetsToRSS to archive tweets in an email client. To ensure that I have access to all images even if an account is closed or a tweet is deleted by the account holder, I use the permanent offline images option.
The permanent offline image uses text encoding of the image and this is very time consuming. The original logic was also inefficient. It would download an image and encode it and then proceed to the next image. As a result, RSS readers took several minutes to receive a response to a feed request. My email client would timeout the connection to TweetsToRSS and failed to update my Twitter RSS feeds.
In this update, TweetsToRSS downloads and encodes all images (including profile pictures) simultaneously in background threads. This improves the response times to the requests from email client and the RSS feeds get update without fail.
This update can be downloaded from
TweetsToRSS has been built with the latest Twitter4J library and it now supports messages beyond the 140-character limit.
When a tweet has been quoted for a reply, the quote will have the bio of that account.
“com.vsubhash.bash.twitter-to-pdf.txt” is a Unix/Linux shell script for archiving all messages posted by a Twitter account in PDF format.
The command to use is:
bash com.vsubhash.bash.twitter-to-pdf.txt \ realDonaldTrump \ 4000 \ nojs
This code assumes that WKhtmlToPDF is available in /opt. Else, you need to update the script. WKhtmlToPDF uses konqueror browser under the hood. The good thing about it is that all HTML links are preserved.
|if [ $# -lt 2 ]; then|
|echo -e "The format is:\n\t\e[35m`basename $0` \e[35;1mtwitter-handle-or-hashtag number-of-tweets [nojs]\e[0m"|
|# A backup of all files will be available in this Logs directory|
|if [ ! -d ~/Logs ]; then|
|# Declare variables|
|# Initialize variables|
|let "iMaxPages = $2 / $iTweetsPerPage"|
|let "iRemainder = $2 % $iTweetsPerPage"|
|if [ $iRemainder -gt 0 ]; then|
|let "iMaxPages = iMaxPages + 1"|
|# shell script|
|if [ $# -eq 3 ]; then|
|# Create archives|
|for (( iPage=1; iPage $1-meta.txt|
|echo "InfoValue: Subhash TweetsToRSS (www.vsubhash.com)" >> $1-meta.txt|
|echo "InfoKey: Title" >> $1-meta.txt|
|echo "InfoValue: The complete Twitter archive of $1" >> $1-meta.txt|
|echo "InfoKey: Subject" >> $1-meta.txt|
|echo "InfoValue: Collection of all tweets from $1" >> $1-meta.txt|
|echo "InfoKey: Author" >> $1-meta.txt|
|echo "InfoValue: $1" >> $1-meta.txt|
|echo "InfoKey: Keywords" >> $1-meta.txt|
|echo "InfoValue: $1, twitter, tweets, archive" >> $1-meta.txt|
|pdftk Complete-Twitter-Archive-of-$1.pdf \|
|update_info $1-meta.txt \|
|if [ $# -eq 0 ]; then|
|notify-send "Twitter archive" "Completed for @$1"|
|notify-send "Twitter archive" "Error occurred for @$1"|
|if [ -f The-Complete-Twitter-Archive-of-$1.pdf ]; then|
|cp ./The-Complete-Twitter-Archive-of-$1.pdf ~/Desktop/The-Complete-Twitter-Archive-of-$1.pdf|
|if [ ! -d $1-backup ]; then|
|if [ -d $1-backup ]; then|
|mv -f $1-archive-*.pdf ./$1-backup|
|mv -f Complete-Twitter-Archive-of-$1.pdf ./$1-backup|
|mv -f $1-meta.txt ./$1-backup|
|mv ./The-Complete-Twitter-Archive-of-$1.pdf ./$1-backup|
Subhash Browser & Feed Reader v2018.04.29
The search function failed to find deleted articles. It also was I think unable to find articles where the search term appeared in the beginning of the title. Both bugs have been fixed.
As mentioned in the “Planned Obsolescence causes “This page requires some information that was not provided. Please …” article, TweetsToRSS for Android has been updated to accept Twit.bin files from the desktop version.
Google’s sneaky way of forcing you to upgrade your phone. It supported the HTTPS Everywhere campaign for non-altruistic reasons.
Many of my old Android devices are in good working condition – except the browser. The browser is unable to access many HTTPS websites. Google has made it impossible to update the CA certificate stores in Android devices knowing well this would render the devices unable to access websites using new SSL certificates. My LG phones has been quite a dog from the beginning. I have now decided to use it merely as a media player. Still, I wanted to see if TweetsToRSS would work. Hell no!
Subhash TweetsToRSS and EmailTweetor need authentication (a secret PIN generation) by Twitter. This is done using a browser app. When Google renders browser apps obsolete, there seems to be no way to authenticate these apps. No matter which browser you use, the Twitter PIN generation page throws the error “This page requires some information that was not provided. Please return to the site that sent you to this page and try again… it was probably an honest mistake.” Very misleading and uninformative.
- One way to avoid this problem is to email the Twitter authentication URL to a newer device or your desktop/laptop computer. Perform the authentication there and generate the PIN. Then type the PIN in your obsoleted device.
- For TweetsToRSS, I have provided another solution. Copy the Twit.bin generated by the desktop version and copy it to your storage device.
Account info includes tweet count, language & location.
A new check box is available in the search page to include/omit retweets. By default, retweets are now omitted from RSS feeds.
- Support for newer Android versions 5.1+ (Lollipop), Marshmallow (6.x), Nougat (7.x) and Oreo (8.x). (The Google Play download does not work with these Android versions.)
- Web Browser: Page loading progress bar has moved from the title bar to the address bar. This feature was required as the title bar can be disabled. When the Internet connection is slow you don’t know what is happening if the title bar is hidden.
- Feed Reader: When the Old button is enabled to display deleted articles, the Delete button will appear as an Undelete button on deleted articles. Now the functionality resembles the old Presto-based Opera browser’s Show Thrash functionality.
- Downloads: File renaming bugs have been fixed.
The support for newer Android versions did not require any special coding. I just needed to make it look like pre 5.1 app in the Android manifest file of the APK. In my over-enthusiasm for forward compatibility, I had declared support for these Android versions long before they were released. Now, Google Play will not allow the APK to pretend to be an older app.
I still use the Eclipse-based Motodev Studio to develop my Android apps. (Google has obsoleted support for Eclipse and has asked developers to move to the IntelliJ-based Android Studio. I don’t like the new IDE.) All my apps are based on Android 1.6 (Donut) for backward compatibility. I was able to use newer Android functionality using Java reflection abilities of my library AndroidWithoutStupid. I was unable to add compatibility to newer Android versions using the code route as Android uses another “compat” library. The manifest file route for compatibility was much more simpler and I had to go with it.
Google Play’s APK system has been made more complicated and I don’t want to deal with it. So, even TweetsToRSS will not be updated to Google Play and will be available as a download from vsubhash.com.