profile
viewpoint
If you are wondering where the data of this site comes from, please visit https://api.github.com/users/fracai/events. GitMemory does not store any data, but only uses NGINX to cache data for a period of time. The idea behind GitMemory is simply to give users a better reading experience.

fracai/zfs-rollup 27

A snapshot pruning script for ZFS, similar in behavior to Apple's TimeMachine. Keep hourly snapshots for the last day, daily for the last week, and weekly thereafter.

fracai/masterbizor 15

The Masterbizor is a command-line clone of The Rasterbator (http://homokaasu.org/rasterbator/). Originally made available at http://www.phong.org/masterbizor/, this fork includes several enhancements which equal and exceed those features available in the original Rasterbator.

fracai/dropship 2

Instantly transfer files between Dropbox accounts using only their hashes.

fracai/gntp-regrowl 1

Regrowl GNTP Messages to Other Machines over Network

fracai/handbrake-sync 1

A python script for re-encoding a directory structure of media to a mirrored output structure.

fracai/Backup-Bouncer 0

A metadata test suite for OS X backup tools

fracai/docx4j 0

JAXB-based Java library for Word docx, Powerpoint pptx, and Excel xlsx files

fracai/duplicacy 0

A new generation cloud backup tool

fracai/empty-git 0

An empty Git repository, perfect for cloning when you want to create a new repo and add files, but can't because the web interface doesn't allow that.

pull request commentakhilrex/podgrab

Send correct Content-Type for podcastitem

Just wanted to comment that I tested this branch and it does indeed enable Safari to playback the audio.

strlght

comment created time in 2 hours

PR opened akhilrex/podgrab

add show links to episode page

Adds links to the podcast page for each episode result on the filterable episodes page.

+9 -1

0 comment

1 changed file

pr created time in 4 days

create barnchfracai/podgrab

branch : episode_links

created branch time in 4 days

PR opened akhilrex/podgrab

Episode filters

Implements episode filters for "Download Status" with values "Deleted" and "Downloading". Implements episode filters for "Episode Type" with values "Regular" ("full" or blank in the database), "Bonus" (bonus), and "Trailer" (trailer).

+67 -26

0 comment

4 changed files

pr created time in 4 days

create barnchfracai/podgrab

branch : episode_filters

created branch time in 4 days

delete branch fracai/podgrab

delete branch : episode_filters

delete time in 4 days

create barnchfracai/podgrab

branch : episode_filters

created branch time in 4 days

PR opened akhilrex/podgrab

Refresh buttons

Adds "Refresh" buttons to the main and individual podcast pages and a "Refresh all" button to the settings page. These start a refresh of the individual feed or all feeds respectively.

+125 -8

0 comment

7 changed files

pr created time in 5 days

create barnchfracai/podgrab

branch : refresh_buttons

created branch time in 5 days

startedjorisschellekens/borb

started time in 7 days

startedMGessinger/trident

started time in 11 days

pull request commenttruenas/middleware

NAS-112038 / 12.0 / Rename non-builtin user/group if a builtin user/group with a same name should exist

https://jira.ixsystems.com/browse/NAS-112326

themylogin

comment created time in 13 days

pull request commenttruenas/middleware

NAS-112038 / 12.0 / Rename non-builtin user/group if a builtin user/group with a same name should exist

Agreed with all that, though I could have sworn there was indeed handling for existing media user/groups. I even think I remember looking at the code that checked if there was an existing group. Though maybe I'm misremembering that.

In any event, would it be useful for me to open a ticket regarding deprecating the media group?

themylogin

comment created time in 13 days

pull request commenttruenas/middleware

NAS-112038 / 12.0 / Rename non-builtin user/group if a builtin user/group with a same name should exist

@themylogin I agree that's reasonable and I should restrict my complaint more specifically to the media user/group that was introduced by FreeNAS/TrueNAS after I had already created those IDs and FreeNAS was previously happy to use those existing IDs.

themylogin

comment created time in 13 days

pull request commenttruenas/middleware

NAS-112038 / 12.0 / Rename non-builtin user/group if a builtin user/group with a same name should exist

@themylogin I'm really trying to understand this and I just ran a search and didn't find any such files. I also wouldn't expect there to be any give that it's a nologin user with no home directory. Sorry to be persistent, I really am just trying to educate myself about this.

themylogin

comment created time in 13 days

pull request commenttruenas/middleware

NAS-112038 / 12.0 / Rename non-builtin user/group if a builtin user/group with a same name should exist

Can you indulge me and explain why? For example, why is it important that the media user/group is 8675309?

themylogin

comment created time in 13 days

pull request commenttruenas/middleware

NAS-112038 / 12.0 / Rename non-builtin user/group if a builtin user/group with a same name should exist

There are choices though. The UID/GID can be changed. It can use the UID/GID of the existing user/group that I had created previously. Instead, this is going to change the name of a user and group that I already had, so the system can use a different ID for that user and group.

themylogin

comment created time in 13 days

pull request commenttruenas/middleware

NAS-112038 / 12.0 / Rename non-builtin user/group if a builtin user/group with a same name should exist

This PR is going to change the group name for a group that I've had for years, predating the introduction of that group as a builtin group. That seems somewhat user hostile.

themylogin

comment created time in 13 days

Pull request review commentnims11/IPod-Shuffle-4g

Podcast support

 def check_unicode(path):     ret_flag = False # True if there is a recognizable file within this level     for item in os.listdir(path):         if os.path.isfile(os.path.join(path, item)):-            if os.path.splitext(item)[1].lower() in audio_ext+list_ext:+            if os.path.splitext(item)[1].lower() in all_ext:

I figured it made sense to give that union a name and define it with the other lists.

I assume it's doing the extension check to avoid renaming any non-audio files. I'll note that while the code renames non-unicode files to avoid characters that can't be handled by the iPod Shuffle file system, there are some ascii characters that can't be handled as well. Specifically, any file with these characters can't be played: "*/:<>?|\. That might be useful to check for as well, but I figure those make sense in a different PR.

fracai

comment created time in 15 days

PullRequestReviewEvent
PullRequestReviewEvent

Pull request review commentnims11/IPod-Shuffle-4g

Podcast support

 import re import tempfile import signal+import enum+import functools  # External libraries try:     import mutagen except ImportError:     mutagen = None -audio_ext = (".mp3", ".m4a", ".m4b", ".m4p", ".aa", ".wav")-list_ext = (".pls", ".m3u")+class PlaylistType(enum.Enum):+    ALL_SONGS = 1+    NORMAL = 2+    PODCAST = 3+    AUDIOBOOK = 4++class FileType(enum.Enum):+    MP3 = (1, {'.mp3'})+    AAC = (2, {'.m4a', '.m4b', '.m4p', '.aa'})+    WAV = (4, {'.wav'})+    def __init__(self, filetype, extensions):+        self.filetype = filetype+        self.extensions = extensions++# collect all the supported audio extensions+audio_ext = functools.reduce(lambda j,k: j.union(k), map(lambda i: i.extensions, FileType))

Maybe I'm missing how to do this, but my attempts haven't succeeded and the examples I have seen for defining this as a static attribute involve extra lines. Also, given that it's right above two other lists of extensions, I don't think it's objectionable to have it outside the class.

fracai

comment created time in 15 days

PullRequestReviewEvent

Pull request review commentnims11/IPod-Shuffle-4g

Podcast support

 def construct(self, tracks):             playlist.populate(i)             construction = playlist.construct(tracks)             if playlist["number_of_songs"] > 0:-                if playlist["listtype"] == 3:+                if playlist["listtype"] == PlaylistType.PODCAST.value:

It can work, but while researching how to do so I came across reasons not to do so and I think it's clearer to directly compare the enum rather than mixing enums and ints.

fracai

comment created time in 15 days

starteddbohdan/structured-text-tools

started time in 18 days

push eventfracai/IPod-Shuffle-4g

Arno Hautala

commit sha aa740c22dc527daae4db87b054df5e2d72bb22ad

move podcast playlist detection to cover pls and m3u handling

view details

Arno Hautala

commit sha 299813bbaa1abb7245baad158e47a85cdf272bfb

use a default of 0xFFFF instead of 65535

view details

Arno Hautala

commit sha 622f55f62c8fdd6f994452f19e59a61caabc9368

better enum comparison

view details

Arno Hautala

commit sha c68063eeb72c6a780f779c36b40ef51d5bd16780

use the existing audio_ext set for checking file extensions

view details

push time in 25 days

PullRequestReviewEvent

Pull request review commentnims11/IPod-Shuffle-4g

Podcast support

 def construct(self, tracks):             playlist.populate(i)             construction = playlist.construct(tracks)             if playlist["number_of_songs"] > 0:-                if playlist["listtype"] == 3:+                if playlist["listtype"] == PlaylistType.PODCAST.value:

Sounds good. Actually, in researching how to make enums comparable to ints I came across reasons not to do so (enums aren't ints), but I can instead convert the listtype value to an enum. if PlaylistType(playlist["listtype"]) == PlaylistType.PODCAST I might like that better actually.

I like the FileType enum because it more tightly groups the file extensions with the FileType they go with and it adds consistency that the database values that are a limited range of values should be handled as those values.

fracai

comment created time in 25 days

Pull request review commentnims11/IPod-Shuffle-4g

Podcast support

 def set_master(self, tracks):         if self.playlist_voiceover and (Text2Speech.valid_tts['pico2wave'] or Text2Speech.valid_tts['espeak']):             self["dbid"] = hashlib.md5(b"masterlist").digest()[:8]             self.text_to_speech("All songs", self["dbid"], True)-        self["listtype"] = 1+        self.listtype = PlaylistType.ALL_SONGS

I created the class property self.listtype so I could set it to the enum value and then compare to the enum instead of converting to the .value. I'm not sure why I didn't do the same for the PlaylistHeader. I'd be inclined to make that one match with a new class property, rather than making this match by dropping it.

fracai

comment created time in 25 days

PullRequestReviewEvent