diff --git a/.gitmodules b/.gitmodules index 96a55b01..1e05bcc7 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "buildroot"] path = buildroot - url = https://github.com/buildroot/buildroot.git - branch = 2023.02.x + url = https://github.com/j1nx/buildroot.git + branch = ovos-2023.02.x diff --git a/Makefile b/Makefile index f028a53f..52f6e997 100644 --- a/Makefile +++ b/Makefile @@ -39,6 +39,12 @@ clean: menuconfig: $(MAKE) -C $(BUILDROOT) BR2_EXTERNAL=../$(BUILDROOT_EXTERNAL) menuconfig +linux-menuconfig: + $(MAKE) -C $(BUILDROOT) BR2_EXTERNAL=../$(BUILDROOT_EXTERNAL) linux-menuconfig + +busybox-menuconfig: + $(MAKE) -C $(BUILDROOT) BR2_EXTERNAL=../$(BUILDROOT_EXTERNAL) busybox-menuconfig + savedefconfig: $(MAKE) -C $(BUILDROOT) BR2_EXTERNAL=../$(BUILDROOT_EXTERNAL) savedefconfig diff --git a/buildroot-external/board/ovos/ova/grub-efi.cfg b/buildroot-external/board/ovos/ova/grub-efi.cfg index 1842456c..9db78cdb 100644 --- a/buildroot-external/board/ovos/ova/grub-efi.cfg +++ b/buildroot-external/board/ovos/ova/grub-efi.cfg @@ -2,5 +2,11 @@ set default="0" set timeout="3" menuentry "OpenVoiceOS" { - linux /bzImage root=PARTUUID=c0932a41-44cf-463b-8152-d43188553ed4 rootfstype=squashfs ro init=/sbin/pre-init fsck.repair=yes zram.enabled=1 zram.num_devices=4 console=ttyS0 consoleblank=0 loglevel=0 vt.global_cursor_default=0 audit=0 logo.nologo systemd.show_status=0 rootwait quiet + linux /bzImage root=PARTUUID=c0932a41-44cf-463b-8152-d43188553ed4 rootfstype=squashfs ro init=/sbin/pre-init fsck.repair=yes zram.enabled=1 zram.num_devices=3 console=tty1 cgroup_enable=cpuset cgroup_memory=1 audit=0 rootwait +} +menuentry "OpenVoiceOS SystemD Debug" { + linux /bzImage root=PARTUUID=c0932a41-44cf-463b-8152-d43188553ed4 rootfstype=squashfs ro init=/sbin/pre-init fsck.repair=yes zram.enabled=1 zram.num_devices=3 console=tty1 cgroup_enable=cpuset cgroup_memory=1 audit=0 rootwait systemd.log_level=debug +} +menuentry "OpenVoiceOS Recovery" { + linux /bzImage root=PARTUUID=c0932a41-44cf-463b-8152-d43188553ed4 rootfstype=squashfs ro init=/sbin/pre-init rootwait systemd.unit=rescue.target } diff --git a/buildroot-external/board/ovos/ova/rootfs-overlay/base/.empty b/buildroot-external/board/ovos/ova/rootfs-overlay/.empty similarity index 100% rename from buildroot-external/board/ovos/ova/rootfs-overlay/base/.empty rename to buildroot-external/board/ovos/ova/rootfs-overlay/.empty diff --git a/buildroot-external/busybox.config b/buildroot-external/busybox.config index a6133857..9d5c55d4 100644 --- a/buildroot-external/busybox.config +++ b/buildroot-external/busybox.config @@ -1,7 +1,7 @@ # # Automatically generated make config: don't edit # Busybox version: 1.36.0 -# Thu Apr 27 06:24:14 2023 +# Thu Jul 13 09:21:44 2023 # CONFIG_HAVE_DOT_CONFIG=y @@ -11,25 +11,25 @@ CONFIG_HAVE_DOT_CONFIG=y CONFIG_DESKTOP=y # CONFIG_EXTRA_COMPAT is not set # CONFIG_FEDORA_COMPAT is not set -CONFIG_INCLUDE_SUSv2=y +# CONFIG_INCLUDE_SUSv2 is not set CONFIG_LONG_OPTS=y CONFIG_SHOW_USAGE=y CONFIG_FEATURE_VERBOSE_USAGE=y -CONFIG_FEATURE_COMPRESS_USAGE=y +# CONFIG_FEATURE_COMPRESS_USAGE is not set CONFIG_LFS=y CONFIG_PAM=y CONFIG_FEATURE_DEVPTS=y CONFIG_FEATURE_UTMP=y CONFIG_FEATURE_WTMP=y -CONFIG_FEATURE_PIDFILE=y -CONFIG_PID_FILE_PATH="/run" +# CONFIG_FEATURE_PIDFILE is not set +CONFIG_PID_FILE_PATH="" CONFIG_BUSYBOX=y CONFIG_FEATURE_SHOW_SCRIPT=y CONFIG_FEATURE_INSTALLER=y # CONFIG_INSTALL_NO_USR is not set CONFIG_FEATURE_SUID=y -CONFIG_FEATURE_SUID_CONFIG=y -CONFIG_FEATURE_SUID_CONFIG_QUIET=y +# CONFIG_FEATURE_SUID_CONFIG is not set +# CONFIG_FEATURE_SUID_CONFIG_QUIET is not set # CONFIG_FEATURE_PREFER_APPLETS is not set CONFIG_BUSYBOX_EXEC_PATH="/proc/self/exe" # CONFIG_SELINUX is not set @@ -53,7 +53,7 @@ CONFIG_EXTRA_CFLAGS="" CONFIG_EXTRA_LDFLAGS="" CONFIG_EXTRA_LDLIBS="" # CONFIG_USE_PORTABLE_CODE is not set -CONFIG_STACK_OPTIMIZATION_386=y +# CONFIG_STACK_OPTIMIZATION_386 is not set CONFIG_STATIC_LIBGCC=y # @@ -105,27 +105,27 @@ CONFIG_MONOTONIC_SYSCALL=y CONFIG_IOCTL_HEX2STR_ERROR=y CONFIG_FEATURE_EDITING=y CONFIG_FEATURE_EDITING_MAX_LEN=1024 -# CONFIG_FEATURE_EDITING_VI is not set -CONFIG_FEATURE_EDITING_HISTORY=255 +CONFIG_FEATURE_EDITING_VI=y +CONFIG_FEATURE_EDITING_HISTORY=999 CONFIG_FEATURE_EDITING_SAVEHISTORY=y # CONFIG_FEATURE_EDITING_SAVE_ON_EXIT is not set CONFIG_FEATURE_REVERSE_SEARCH=y CONFIG_FEATURE_TAB_COMPLETION=y -CONFIG_FEATURE_USERNAME_COMPLETION=y +# CONFIG_FEATURE_USERNAME_COMPLETION is not set CONFIG_FEATURE_EDITING_FANCY_PROMPT=y CONFIG_FEATURE_EDITING_WINCH=y # CONFIG_FEATURE_EDITING_ASK_TERMINAL is not set -CONFIG_LOCALE_SUPPORT=y -CONFIG_UNICODE_SUPPORT=y -CONFIG_UNICODE_USING_LOCALE=y +# CONFIG_LOCALE_SUPPORT is not set +# CONFIG_UNICODE_SUPPORT is not set +# CONFIG_UNICODE_USING_LOCALE is not set # CONFIG_FEATURE_CHECK_UNICODE_IN_ENV is not set -CONFIG_SUBST_WCHAR=63 -CONFIG_LAST_SUPPORTED_WCHAR=767 -CONFIG_UNICODE_COMBINING_WCHARS=y -CONFIG_UNICODE_WIDE_WCHARS=y +CONFIG_SUBST_WCHAR=0 +CONFIG_LAST_SUPPORTED_WCHAR=0 +# CONFIG_UNICODE_COMBINING_WCHARS is not set +# CONFIG_UNICODE_WIDE_WCHARS is not set # CONFIG_UNICODE_BIDI_SUPPORT is not set # CONFIG_UNICODE_NEUTRAL_TABLE is not set -CONFIG_UNICODE_PRESERVE_BROKEN=y +# CONFIG_UNICODE_PRESERVE_BROKEN is not set # CONFIG_LOOP_CONFIGURE is not set # CONFIG_NO_LOOP_CONFIGURE is not set CONFIG_TRY_LOOP_CONFIGURE=y @@ -137,14 +137,14 @@ CONFIG_TRY_LOOP_CONFIGURE=y # # Archival Utilities # -CONFIG_FEATURE_SEAMLESS_XZ=y -CONFIG_FEATURE_SEAMLESS_LZMA=y -CONFIG_FEATURE_SEAMLESS_BZ2=y -CONFIG_FEATURE_SEAMLESS_GZ=y +# CONFIG_FEATURE_SEAMLESS_XZ is not set +# CONFIG_FEATURE_SEAMLESS_LZMA is not set +# CONFIG_FEATURE_SEAMLESS_BZ2 is not set +# CONFIG_FEATURE_SEAMLESS_GZ is not set # CONFIG_FEATURE_SEAMLESS_Z is not set -# CONFIG_AR is not set +CONFIG_AR=y # CONFIG_FEATURE_AR_LONG_FILENAMES is not set -# CONFIG_FEATURE_AR_CREATE is not set +CONFIG_FEATURE_AR_CREATE=y # CONFIG_UNCOMPRESS is not set CONFIG_GUNZIP=y CONFIG_ZCAT=y @@ -157,45 +157,45 @@ CONFIG_LZMA=y CONFIG_UNXZ=y CONFIG_XZCAT=y CONFIG_XZ=y -CONFIG_BZIP2=y -CONFIG_BZIP2_SMALL=8 +# CONFIG_BZIP2 is not set +CONFIG_BZIP2_SMALL=0 CONFIG_FEATURE_BZIP2_DECOMPRESS=y CONFIG_CPIO=y -CONFIG_FEATURE_CPIO_O=y -CONFIG_FEATURE_CPIO_P=y -CONFIG_FEATURE_CPIO_IGNORE_DEVNO=y -CONFIG_FEATURE_CPIO_RENUMBER_INODES=y -CONFIG_DPKG=y -CONFIG_DPKG_DEB=y +# CONFIG_FEATURE_CPIO_O is not set +# CONFIG_FEATURE_CPIO_P is not set +# CONFIG_FEATURE_CPIO_IGNORE_DEVNO is not set +# CONFIG_FEATURE_CPIO_RENUMBER_INODES is not set +# CONFIG_DPKG is not set +# CONFIG_DPKG_DEB is not set CONFIG_GZIP=y -CONFIG_FEATURE_GZIP_LONG_OPTIONS=y +# CONFIG_FEATURE_GZIP_LONG_OPTIONS is not set CONFIG_GZIP_FAST=0 # CONFIG_FEATURE_GZIP_LEVELS is not set CONFIG_FEATURE_GZIP_DECOMPRESS=y -CONFIG_LZOP=y -# CONFIG_UNLZOP is not set -# CONFIG_LZOPCAT is not set +# CONFIG_LZOP is not set +CONFIG_UNLZOP=y +CONFIG_LZOPCAT=y # CONFIG_LZOP_COMPR_HIGH is not set -CONFIG_RPM=y -CONFIG_RPM2CPIO=y +# CONFIG_RPM is not set +# CONFIG_RPM2CPIO is not set CONFIG_TAR=y CONFIG_FEATURE_TAR_LONG_OPTIONS=y CONFIG_FEATURE_TAR_CREATE=y -CONFIG_FEATURE_TAR_AUTODETECT=y +# CONFIG_FEATURE_TAR_AUTODETECT is not set CONFIG_FEATURE_TAR_FROM=y -CONFIG_FEATURE_TAR_OLDGNU_COMPATIBILITY=y -CONFIG_FEATURE_TAR_OLDSUN_COMPATIBILITY=y +# CONFIG_FEATURE_TAR_OLDGNU_COMPATIBILITY is not set +# CONFIG_FEATURE_TAR_OLDSUN_COMPATIBILITY is not set CONFIG_FEATURE_TAR_GNU_EXTENSIONS=y CONFIG_FEATURE_TAR_TO_COMMAND=y -CONFIG_FEATURE_TAR_UNAME_GNAME=y -CONFIG_FEATURE_TAR_NOPRESERVE_TIME=y +# CONFIG_FEATURE_TAR_UNAME_GNAME is not set +# CONFIG_FEATURE_TAR_NOPRESERVE_TIME is not set # CONFIG_FEATURE_TAR_SELINUX is not set CONFIG_UNZIP=y CONFIG_FEATURE_UNZIP_CDF=y CONFIG_FEATURE_UNZIP_BZIP2=y CONFIG_FEATURE_UNZIP_LZMA=y CONFIG_FEATURE_UNZIP_XZ=y -CONFIG_FEATURE_LZMA_FAST=y +# CONFIG_FEATURE_LZMA_FAST is not set # # Coreutils @@ -223,14 +223,14 @@ CONFIG_FEATURE_CATV=y CONFIG_CHGRP=y CONFIG_CHMOD=y CONFIG_CHOWN=y -CONFIG_FEATURE_CHOWN_LONG_OPTIONS=y +# CONFIG_FEATURE_CHOWN_LONG_OPTIONS is not set CONFIG_CHROOT=y CONFIG_CKSUM=y CONFIG_CRC32=y -CONFIG_COMM=y +# CONFIG_COMM is not set CONFIG_CP=y -CONFIG_FEATURE_CP_LONG_OPTIONS=y -CONFIG_FEATURE_CP_REFLINK=y +# CONFIG_FEATURE_CP_LONG_OPTIONS is not set +# CONFIG_FEATURE_CP_REFLINK is not set CONFIG_CUT=y CONFIG_FEATURE_CUT_REGEX=y CONFIG_DATE=y @@ -239,11 +239,11 @@ CONFIG_FEATURE_DATE_ISOFMT=y CONFIG_FEATURE_DATE_COMPAT=y CONFIG_DD=y CONFIG_FEATURE_DD_SIGNAL_HANDLING=y -CONFIG_FEATURE_DD_THIRD_STATUS_LINE=y +# CONFIG_FEATURE_DD_THIRD_STATUS_LINE is not set CONFIG_FEATURE_DD_IBS_OBS=y CONFIG_FEATURE_DD_STATUS=y CONFIG_DF=y -CONFIG_FEATURE_DF_FANCY=y +# CONFIG_FEATURE_DF_FANCY is not set CONFIG_FEATURE_SKIP_ROOTFS=y CONFIG_DIRNAME=y CONFIG_DOS2UNIX=y @@ -253,8 +253,8 @@ CONFIG_FEATURE_DU_DEFAULT_BLOCKSIZE_1K=y CONFIG_ECHO=y CONFIG_FEATURE_FANCY_ECHO=y CONFIG_ENV=y -CONFIG_EXPAND=y -CONFIG_UNEXPAND=y +# CONFIG_EXPAND is not set +# CONFIG_UNEXPAND is not set CONFIG_EXPR=y CONFIG_EXPR_MATH_SUPPORT_64=y CONFIG_FACTOR=y @@ -264,7 +264,7 @@ CONFIG_HEAD=y CONFIG_FEATURE_FANCY_HEAD=y CONFIG_HOSTID=y CONFIG_ID=y -CONFIG_GROUPS=y +# CONFIG_GROUPS is not set CONFIG_INSTALL=y CONFIG_FEATURE_INSTALL_LONG_OPTIONS=y CONFIG_LINK=y @@ -311,23 +311,23 @@ CONFIG_RM=y CONFIG_RMDIR=y CONFIG_SEQ=y CONFIG_SHRED=y -CONFIG_SHUF=y +# CONFIG_SHUF is not set CONFIG_SLEEP=y CONFIG_FEATURE_FANCY_SLEEP=y CONFIG_SORT=y CONFIG_FEATURE_SORT_BIG=y # CONFIG_FEATURE_SORT_OPTIMIZE_MEMORY is not set -CONFIG_SPLIT=y -CONFIG_FEATURE_SPLIT_FANCY=y -CONFIG_STAT=y -CONFIG_FEATURE_STAT_FORMAT=y -CONFIG_FEATURE_STAT_FILESYSTEM=y +# CONFIG_SPLIT is not set +# CONFIG_FEATURE_SPLIT_FANCY is not set +# CONFIG_STAT is not set +# CONFIG_FEATURE_STAT_FORMAT is not set +# CONFIG_FEATURE_STAT_FILESYSTEM is not set CONFIG_STTY=y -CONFIG_SUM=y +# CONFIG_SUM is not set CONFIG_SYNC=y -CONFIG_FEATURE_SYNC_FANCY=y -CONFIG_FSYNC=y -CONFIG_TAC=y +# CONFIG_FEATURE_SYNC_FANCY is not set +# CONFIG_FSYNC is not set +# CONFIG_TAC is not set CONFIG_TAIL=y CONFIG_FEATURE_FANCY_TAIL=y CONFIG_TEE=y @@ -336,7 +336,7 @@ CONFIG_TEST=y CONFIG_TEST1=y CONFIG_TEST2=y CONFIG_FEATURE_TEST_64=y -CONFIG_TIMEOUT=y +# CONFIG_TIMEOUT is not set CONFIG_TOUCH=y CONFIG_FEATURE_TOUCH_SUSV3=y CONFIG_TR=y @@ -357,10 +357,10 @@ CONFIG_BASE32=y CONFIG_BASE64=y CONFIG_UUENCODE=y CONFIG_WC=y -CONFIG_FEATURE_WC_LARGE=y +# CONFIG_FEATURE_WC_LARGE is not set CONFIG_WHO=y CONFIG_W=y -CONFIG_USERS=y +# CONFIG_USERS is not set CONFIG_WHOAMI=y CONFIG_YES=y @@ -371,11 +371,11 @@ CONFIG_CHVT=y CONFIG_CLEAR=y CONFIG_DEALLOCVT=y CONFIG_DUMPKMAP=y -CONFIG_FGCONSOLE=y -CONFIG_KBD_MODE=y +# CONFIG_FGCONSOLE is not set +# CONFIG_KBD_MODE is not set CONFIG_LOADFONT=y -CONFIG_SETFONT=y -CONFIG_FEATURE_SETFONT_TEXTUAL_MAP=y +# CONFIG_SETFONT is not set +# CONFIG_FEATURE_SETFONT_TEXTUAL_MAP is not set CONFIG_DEFAULT_SETFONT_DIR="" # @@ -389,10 +389,10 @@ CONFIG_RESET=y CONFIG_RESIZE=y CONFIG_FEATURE_RESIZE_PRINT=y CONFIG_SETCONSOLE=y -CONFIG_FEATURE_SETCONSOLE_LONG_OPTIONS=y +# CONFIG_FEATURE_SETCONSOLE_LONG_OPTIONS is not set CONFIG_SETKEYCODES=y CONFIG_SETLOGCONS=y -CONFIG_SHOWKEY=y +# CONFIG_SHOWKEY is not set # # Debian Utilities @@ -400,10 +400,10 @@ CONFIG_SHOWKEY=y CONFIG_PIPE_PROGRESS=y CONFIG_RUN_PARTS=y CONFIG_FEATURE_RUN_PARTS_LONG_OPTIONS=y -CONFIG_FEATURE_RUN_PARTS_FANCY=y -# CONFIG_START_STOP_DAEMON is not set -# CONFIG_FEATURE_START_STOP_DAEMON_LONG_OPTIONS is not set -# CONFIG_FEATURE_START_STOP_DAEMON_FANCY is not set +# CONFIG_FEATURE_RUN_PARTS_FANCY is not set +CONFIG_START_STOP_DAEMON=y +CONFIG_FEATURE_START_STOP_DAEMON_LONG_OPTIONS=y +CONFIG_FEATURE_START_STOP_DAEMON_FANCY=y CONFIG_WHICH=y # @@ -418,18 +418,18 @@ CONFIG_RUN_INIT=y # Editors # CONFIG_AWK=y -CONFIG_FEATURE_AWK_LIBM=y +# CONFIG_FEATURE_AWK_LIBM is not set CONFIG_FEATURE_AWK_GNU_EXTENSIONS=y CONFIG_CMP=y CONFIG_DIFF=y -CONFIG_FEATURE_DIFF_LONG_OPTIONS=y +# CONFIG_FEATURE_DIFF_LONG_OPTIONS is not set CONFIG_FEATURE_DIFF_DIR=y -CONFIG_ED=y +# CONFIG_ED is not set CONFIG_PATCH=y CONFIG_SED=y CONFIG_VI=y CONFIG_FEATURE_VI_MAX_LEN=4096 -# CONFIG_FEATURE_VI_8BIT is not set +CONFIG_FEATURE_VI_8BIT=y CONFIG_FEATURE_VI_COLON=y CONFIG_FEATURE_VI_COLON_EXPAND=y CONFIG_FEATURE_VI_YANKMARK=y @@ -465,7 +465,7 @@ CONFIG_FEATURE_FIND_EXECUTABLE=y CONFIG_FEATURE_FIND_XDEV=y CONFIG_FEATURE_FIND_MAXDEPTH=y CONFIG_FEATURE_FIND_NEWER=y -CONFIG_FEATURE_FIND_INUM=y +# CONFIG_FEATURE_FIND_INUM is not set CONFIG_FEATURE_FIND_SAMEFILE=y CONFIG_FEATURE_FIND_EXEC=y CONFIG_FEATURE_FIND_EXEC_PLUS=y @@ -477,18 +477,18 @@ CONFIG_FEATURE_FIND_PAREN=y CONFIG_FEATURE_FIND_SIZE=y CONFIG_FEATURE_FIND_PRUNE=y CONFIG_FEATURE_FIND_QUIT=y -CONFIG_FEATURE_FIND_DELETE=y +# CONFIG_FEATURE_FIND_DELETE is not set CONFIG_FEATURE_FIND_EMPTY=y CONFIG_FEATURE_FIND_PATH=y CONFIG_FEATURE_FIND_REGEX=y # CONFIG_FEATURE_FIND_CONTEXT is not set -CONFIG_FEATURE_FIND_LINKS=y +# CONFIG_FEATURE_FIND_LINKS is not set CONFIG_GREP=y CONFIG_EGREP=y CONFIG_FGREP=y CONFIG_FEATURE_GREP_CONTEXT=y CONFIG_XARGS=y -CONFIG_FEATURE_XARGS_SUPPORT_CONFIRMATION=y +# CONFIG_FEATURE_XARGS_SUPPORT_CONFIRMATION is not set CONFIG_FEATURE_XARGS_SUPPORT_QUOTES=y CONFIG_FEATURE_XARGS_SUPPORT_TERMOPT=y CONFIG_FEATURE_XARGS_SUPPORT_ZERO_TERM=y @@ -511,7 +511,7 @@ CONFIG_TELINIT_PATH="" CONFIG_INIT=y CONFIG_LINUXRC=y CONFIG_FEATURE_USE_INITTAB=y -# CONFIG_FEATURE_KILL_REMOVED is not set +CONFIG_FEATURE_KILL_REMOVED=y CONFIG_FEATURE_KILL_DELAY=0 CONFIG_FEATURE_INIT_SCTTY=y CONFIG_FEATURE_INIT_SYSLOG=y @@ -524,31 +524,31 @@ CONFIG_FEATURE_INIT_MODIFY_CMDLINE=y # Login/Password Management Utilities # CONFIG_FEATURE_SHADOWPASSWDS=y -CONFIG_USE_BB_PWD_GRP=y -CONFIG_USE_BB_SHADOW=y -CONFIG_USE_BB_CRYPT=y -CONFIG_USE_BB_CRYPT_SHA=y -CONFIG_ADD_SHELL=y -CONFIG_REMOVE_SHELL=y +# CONFIG_USE_BB_PWD_GRP is not set +# CONFIG_USE_BB_SHADOW is not set +# CONFIG_USE_BB_CRYPT is not set +# CONFIG_USE_BB_CRYPT_SHA is not set +# CONFIG_ADD_SHELL is not set +# CONFIG_REMOVE_SHELL is not set CONFIG_ADDGROUP=y -CONFIG_FEATURE_ADDUSER_TO_GROUP=y +# CONFIG_FEATURE_ADDUSER_TO_GROUP is not set CONFIG_ADDUSER=y # CONFIG_FEATURE_CHECK_NAMES is not set CONFIG_LAST_ID=60000 CONFIG_FIRST_SYSTEM_ID=100 CONFIG_LAST_SYSTEM_ID=999 CONFIG_CHPASSWD=y -CONFIG_FEATURE_DEFAULT_PASSWD_ALGO="des" +CONFIG_FEATURE_DEFAULT_PASSWD_ALGO="sha512" CONFIG_CRYPTPW=y CONFIG_MKPASSWD=y CONFIG_DELUSER=y CONFIG_DELGROUP=y -CONFIG_FEATURE_DEL_USER_FROM_GROUP=y +# CONFIG_FEATURE_DEL_USER_FROM_GROUP is not set CONFIG_GETTY=y CONFIG_LOGIN=y -CONFIG_LOGIN_SESSION_AS_CHILD=y -CONFIG_LOGIN_SCRIPTS=y -CONFIG_FEATURE_NOLOGIN=y +# CONFIG_LOGIN_SESSION_AS_CHILD is not set +# CONFIG_LOGIN_SCRIPTS is not set +# CONFIG_FEATURE_NOLOGIN is not set CONFIG_FEATURE_SECURETTY=y CONFIG_PASSWD=y CONFIG_FEATURE_PASSWD_WEAK_CHECK=y @@ -565,26 +565,26 @@ CONFIG_VLOCK=y CONFIG_CHATTR=y CONFIG_FSCK=y CONFIG_LSATTR=y -CONFIG_TUNE2FS=y +# CONFIG_TUNE2FS is not set # # Linux Module Utilities # -CONFIG_MODPROBE_SMALL=y -CONFIG_DEPMOD=y -CONFIG_INSMOD=y -CONFIG_LSMOD=y +# CONFIG_MODPROBE_SMALL is not set +# CONFIG_DEPMOD is not set +# CONFIG_INSMOD is not set +# CONFIG_LSMOD is not set # CONFIG_FEATURE_LSMOD_PRETTY_2_6_OUTPUT is not set -CONFIG_MODINFO=y -CONFIG_MODPROBE=y +# CONFIG_MODINFO is not set +# CONFIG_MODPROBE is not set # CONFIG_FEATURE_MODPROBE_BLACKLIST is not set -CONFIG_RMMOD=y +# CONFIG_RMMOD is not set # # Options common to multiple modutils # -CONFIG_FEATURE_CMDLINE_MODULE_OPTIONS=y -CONFIG_FEATURE_MODPROBE_SMALL_CHECK_ALREADY_LOADED=y +# CONFIG_FEATURE_CMDLINE_MODULE_OPTIONS is not set +# CONFIG_FEATURE_MODPROBE_SMALL_CHECK_ALREADY_LOADED is not set # CONFIG_FEATURE_2_4_MODULES is not set # CONFIG_FEATURE_INSMOD_VERSION_CHECKING is not set # CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS is not set @@ -595,26 +595,26 @@ CONFIG_FEATURE_MODPROBE_SMALL_CHECK_ALREADY_LOADED=y # CONFIG_FEATURE_INSMOD_TRY_MMAP is not set # CONFIG_FEATURE_MODUTILS_ALIAS is not set # CONFIG_FEATURE_MODUTILS_SYMBOLS is not set -CONFIG_DEFAULT_MODULES_DIR="/lib/modules" -CONFIG_DEFAULT_DEPMOD_FILE="modules.dep" +CONFIG_DEFAULT_MODULES_DIR="" +CONFIG_DEFAULT_DEPMOD_FILE="" # # Linux System Utilities # -CONFIG_ACPID=y -CONFIG_FEATURE_ACPID_COMPAT=y -CONFIG_BLKDISCARD=y +# CONFIG_ACPID is not set +# CONFIG_FEATURE_ACPID_COMPAT is not set +# CONFIG_BLKDISCARD is not set CONFIG_BLKID=y -CONFIG_FEATURE_BLKID_TYPE=y -CONFIG_BLOCKDEV=y -CONFIG_CAL=y +# CONFIG_FEATURE_BLKID_TYPE is not set +# CONFIG_BLOCKDEV is not set +# CONFIG_CAL is not set CONFIG_CHRT=y CONFIG_DMESG=y CONFIG_FEATURE_DMESG_PRETTY=y CONFIG_EJECT=y -CONFIG_FEATURE_EJECT_SCSI=y +# CONFIG_FEATURE_EJECT_SCSI is not set CONFIG_FALLOCATE=y -CONFIG_FATATTR=y +# CONFIG_FATATTR is not set CONFIG_FBSET=y CONFIG_FEATURE_FBSET_FANCY=y CONFIG_FEATURE_FBSET_READMODE=y @@ -628,135 +628,131 @@ CONFIG_FEATURE_FDISK_WRITABLE=y # CONFIG_FEATURE_OSF_LABEL is not set CONFIG_FEATURE_GPT_LABEL=y CONFIG_FEATURE_FDISK_ADVANCED=y -CONFIG_FINDFS=y +# CONFIG_FINDFS is not set CONFIG_FLOCK=y CONFIG_FDFLUSH=y CONFIG_FREERAMDISK=y -CONFIG_FSCK_MINIX=y +# CONFIG_FSCK_MINIX is not set CONFIG_FSFREEZE=y CONFIG_FSTRIM=y CONFIG_GETOPT=y CONFIG_FEATURE_GETOPT_LONG=y CONFIG_HEXDUMP=y -CONFIG_HD=y +# CONFIG_HD is not set CONFIG_XXD=y CONFIG_HWCLOCK=y -# CONFIG_FEATURE_HWCLOCK_ADJTIME_FHS is not set -CONFIG_IONICE=y +CONFIG_FEATURE_HWCLOCK_ADJTIME_FHS=y +# CONFIG_IONICE is not set CONFIG_IPCRM=y CONFIG_IPCS=y CONFIG_LAST=y -CONFIG_FEATURE_LAST_FANCY=y +# CONFIG_FEATURE_LAST_FANCY is not set CONFIG_LOSETUP=y CONFIG_LSPCI=y CONFIG_LSUSB=y CONFIG_MDEV=y CONFIG_FEATURE_MDEV_CONF=y CONFIG_FEATURE_MDEV_RENAME=y -CONFIG_FEATURE_MDEV_RENAME_REGEXP=y +# CONFIG_FEATURE_MDEV_RENAME_REGEXP is not set CONFIG_FEATURE_MDEV_EXEC=y -CONFIG_FEATURE_MDEV_LOAD_FIRMWARE=y +# CONFIG_FEATURE_MDEV_LOAD_FIRMWARE is not set CONFIG_FEATURE_MDEV_DAEMON=y CONFIG_MESG=y CONFIG_FEATURE_MESG_ENABLE_ONLY_GROUP=y CONFIG_MKE2FS=y -CONFIG_MKFS_EXT2=y -CONFIG_MKFS_MINIX=y -CONFIG_FEATURE_MINIX2=y +# CONFIG_MKFS_EXT2 is not set +# CONFIG_MKFS_MINIX is not set +# CONFIG_FEATURE_MINIX2 is not set # CONFIG_MKFS_REISER is not set CONFIG_MKDOSFS=y -CONFIG_MKFS_VFAT=y +# CONFIG_MKFS_VFAT is not set CONFIG_MKSWAP=y -CONFIG_FEATURE_MKSWAP_UUID=y +# CONFIG_FEATURE_MKSWAP_UUID is not set CONFIG_MORE=y -CONFIG_MOUNT=y -CONFIG_FEATURE_MOUNT_FAKE=y -CONFIG_FEATURE_MOUNT_VERBOSE=y +# CONFIG_MOUNT is not set +# CONFIG_FEATURE_MOUNT_FAKE is not set +# CONFIG_FEATURE_MOUNT_VERBOSE is not set # CONFIG_FEATURE_MOUNT_HELPERS is not set -CONFIG_FEATURE_MOUNT_LABEL=y +# CONFIG_FEATURE_MOUNT_LABEL is not set # CONFIG_FEATURE_MOUNT_NFS is not set -CONFIG_FEATURE_MOUNT_CIFS=y -CONFIG_FEATURE_MOUNT_FLAGS=y -CONFIG_FEATURE_MOUNT_FSTAB=y -CONFIG_FEATURE_MOUNT_OTHERTAB=y +# CONFIG_FEATURE_MOUNT_CIFS is not set +# CONFIG_FEATURE_MOUNT_FLAGS is not set +# CONFIG_FEATURE_MOUNT_FSTAB is not set +# CONFIG_FEATURE_MOUNT_OTHERTAB is not set CONFIG_MOUNTPOINT=y -CONFIG_NOLOGIN=y -CONFIG_NOLOGIN_DEPENDENCIES=y -CONFIG_NSENTER=y +# CONFIG_NOLOGIN is not set +# CONFIG_NOLOGIN_DEPENDENCIES is not set +# CONFIG_NSENTER is not set CONFIG_PIVOT_ROOT=y CONFIG_RDATE=y -CONFIG_RDEV=y +# CONFIG_RDEV is not set CONFIG_READPROFILE=y CONFIG_RENICE=y -CONFIG_REV=y -CONFIG_RTCWAKE=y -CONFIG_SCRIPT=y -CONFIG_SCRIPTREPLAY=y -CONFIG_SETARCH=y -CONFIG_LINUX32=y -CONFIG_LINUX64=y +# CONFIG_REV is not set +# CONFIG_RTCWAKE is not set +# CONFIG_SCRIPT is not set +# CONFIG_SCRIPTREPLAY is not set +# CONFIG_SETARCH is not set +# CONFIG_LINUX32 is not set +# CONFIG_LINUX64 is not set CONFIG_SETPRIV=y CONFIG_FEATURE_SETPRIV_DUMP=y CONFIG_FEATURE_SETPRIV_CAPABILITIES=y CONFIG_FEATURE_SETPRIV_CAPABILITY_NAMES=y CONFIG_SETSID=y -CONFIG_SWAPON=y -CONFIG_FEATURE_SWAPON_DISCARD=y -CONFIG_FEATURE_SWAPON_PRI=y -CONFIG_SWAPOFF=y -CONFIG_FEATURE_SWAPONOFF_LABEL=y +# CONFIG_SWAPON is not set +# CONFIG_FEATURE_SWAPON_DISCARD is not set +# CONFIG_FEATURE_SWAPON_PRI is not set +# CONFIG_SWAPOFF is not set +# CONFIG_FEATURE_SWAPONOFF_LABEL is not set CONFIG_SWITCH_ROOT=y -CONFIG_TASKSET=y -CONFIG_FEATURE_TASKSET_FANCY=y -CONFIG_FEATURE_TASKSET_CPULIST=y +# CONFIG_TASKSET is not set +# CONFIG_FEATURE_TASKSET_FANCY is not set +# CONFIG_FEATURE_TASKSET_CPULIST is not set CONFIG_UEVENT=y -CONFIG_UMOUNT=y -CONFIG_FEATURE_UMOUNT_ALL=y -CONFIG_UNSHARE=y -CONFIG_WALL=y - -# -# Common options for mount/umount -# -CONFIG_FEATURE_MOUNT_LOOP=y -CONFIG_FEATURE_MOUNT_LOOP_CREATE=y +# CONFIG_UMOUNT is not set +# CONFIG_FEATURE_UMOUNT_ALL is not set +# CONFIG_UNSHARE is not set +# CONFIG_WALL is not set +# CONFIG_FEATURE_MOUNT_LOOP is not set +# CONFIG_FEATURE_MOUNT_LOOP_CREATE is not set # CONFIG_FEATURE_MTAB_SUPPORT is not set CONFIG_VOLUMEID=y # # Filesystem/Volume identification # -CONFIG_FEATURE_VOLUMEID_BCACHE=y -CONFIG_FEATURE_VOLUMEID_BTRFS=y -CONFIG_FEATURE_VOLUMEID_CRAMFS=y +# CONFIG_FEATURE_VOLUMEID_BCACHE is not set +# CONFIG_FEATURE_VOLUMEID_BTRFS is not set +# CONFIG_FEATURE_VOLUMEID_CRAMFS is not set CONFIG_FEATURE_VOLUMEID_EROFS=y CONFIG_FEATURE_VOLUMEID_EXFAT=y CONFIG_FEATURE_VOLUMEID_EXT=y CONFIG_FEATURE_VOLUMEID_F2FS=y CONFIG_FEATURE_VOLUMEID_FAT=y -CONFIG_FEATURE_VOLUMEID_HFS=y -CONFIG_FEATURE_VOLUMEID_ISO9660=y -CONFIG_FEATURE_VOLUMEID_JFS=y -CONFIG_FEATURE_VOLUMEID_LFS=y -CONFIG_FEATURE_VOLUMEID_LINUXRAID=y -CONFIG_FEATURE_VOLUMEID_LINUXSWAP=y -CONFIG_FEATURE_VOLUMEID_LUKS=y +# CONFIG_FEATURE_VOLUMEID_HFS is not set +# CONFIG_FEATURE_VOLUMEID_ISO9660 is not set +# CONFIG_FEATURE_VOLUMEID_JFS is not set +# CONFIG_FEATURE_VOLUMEID_LFS is not set +# CONFIG_FEATURE_VOLUMEID_LINUXRAID is not set +# CONFIG_FEATURE_VOLUMEID_LINUXSWAP is not set +# CONFIG_FEATURE_VOLUMEID_LUKS is not set CONFIG_FEATURE_VOLUMEID_MINIX=y -CONFIG_FEATURE_VOLUMEID_NILFS=y -CONFIG_FEATURE_VOLUMEID_NTFS=y -CONFIG_FEATURE_VOLUMEID_OCFS2=y -CONFIG_FEATURE_VOLUMEID_REISERFS=y -CONFIG_FEATURE_VOLUMEID_ROMFS=y -CONFIG_FEATURE_VOLUMEID_SQUASHFS=y -CONFIG_FEATURE_VOLUMEID_SYSV=y +# CONFIG_FEATURE_VOLUMEID_NILFS is not set +# CONFIG_FEATURE_VOLUMEID_NTFS is not set +# CONFIG_FEATURE_VOLUMEID_OCFS2 is not set +# CONFIG_FEATURE_VOLUMEID_REISERFS is not set +# CONFIG_FEATURE_VOLUMEID_ROMFS is not set +# CONFIG_FEATURE_VOLUMEID_SQUASHFS is not set +# CONFIG_FEATURE_VOLUMEID_SYSV is not set CONFIG_FEATURE_VOLUMEID_UBIFS=y -CONFIG_FEATURE_VOLUMEID_UDF=y -CONFIG_FEATURE_VOLUMEID_XFS=y +# CONFIG_FEATURE_VOLUMEID_UDF is not set +# CONFIG_FEATURE_VOLUMEID_XFS is not set # # Miscellaneous Utilities # -CONFIG_ADJTIMEX=y +# CONFIG_ADJTIMEX is not set CONFIG_ASCII=y # CONFIG_BBCONFIG is not set # CONFIG_FEATURE_COMPRESS_BBCONFIG is not set @@ -766,24 +762,24 @@ CONFIG_FEATURE_DC_BIG=y # CONFIG_FEATURE_DC_LIBM is not set CONFIG_FEATURE_BC_INTERACTIVE=y CONFIG_FEATURE_BC_LONG_OPTIONS=y -CONFIG_BEEP=y -CONFIG_FEATURE_BEEP_FREQ=4000 -CONFIG_FEATURE_BEEP_LENGTH_MS=30 -CONFIG_CHAT=y -CONFIG_FEATURE_CHAT_NOFAIL=y +# CONFIG_BEEP is not set +CONFIG_FEATURE_BEEP_FREQ=0 +CONFIG_FEATURE_BEEP_LENGTH_MS=0 +# CONFIG_CHAT is not set +# CONFIG_FEATURE_CHAT_NOFAIL is not set # CONFIG_FEATURE_CHAT_TTY_HIFI is not set -CONFIG_FEATURE_CHAT_IMPLICIT_CR=y -CONFIG_FEATURE_CHAT_SWALLOW_OPTS=y -CONFIG_FEATURE_CHAT_SEND_ESCAPES=y -CONFIG_FEATURE_CHAT_VAR_ABORT_LEN=y -CONFIG_FEATURE_CHAT_CLR_ABORT=y -CONFIG_CONSPY=y -CONFIG_CROND=y -CONFIG_FEATURE_CROND_D=y -CONFIG_FEATURE_CROND_CALL_SENDMAIL=y -CONFIG_FEATURE_CROND_SPECIAL_TIMES=y +# CONFIG_FEATURE_CHAT_IMPLICIT_CR is not set +# CONFIG_FEATURE_CHAT_SWALLOW_OPTS is not set +# CONFIG_FEATURE_CHAT_SEND_ESCAPES is not set +# CONFIG_FEATURE_CHAT_VAR_ABORT_LEN is not set +# CONFIG_FEATURE_CHAT_CLR_ABORT is not set +# CONFIG_CONSPY is not set +# CONFIG_CROND is not set +# CONFIG_FEATURE_CROND_D is not set +# CONFIG_FEATURE_CROND_CALL_SENDMAIL is not set +# CONFIG_FEATURE_CROND_SPECIAL_TIMES is not set CONFIG_FEATURE_CROND_DIR="/var/spool/cron" -# CONFIG_CRONTAB is not set +CONFIG_CRONTAB=y # CONFIG_DEVFSD is not set # CONFIG_DEVFSD_MODLOAD is not set # CONFIG_DEVFSD_FG_NP is not set @@ -797,47 +793,47 @@ CONFIG_DEVMEM=y # CONFIG_FLASHCP is not set CONFIG_HDPARM=y CONFIG_FEATURE_HDPARM_GET_IDENTITY=y -CONFIG_FEATURE_HDPARM_HDIO_SCAN_HWIF=y -CONFIG_FEATURE_HDPARM_HDIO_UNREGISTER_HWIF=y -CONFIG_FEATURE_HDPARM_HDIO_DRIVE_RESET=y -CONFIG_FEATURE_HDPARM_HDIO_TRISTATE_HWIF=y -CONFIG_FEATURE_HDPARM_HDIO_GETSET_DMA=y +# CONFIG_FEATURE_HDPARM_HDIO_SCAN_HWIF is not set +# CONFIG_FEATURE_HDPARM_HDIO_UNREGISTER_HWIF is not set +# CONFIG_FEATURE_HDPARM_HDIO_DRIVE_RESET is not set +# CONFIG_FEATURE_HDPARM_HDIO_TRISTATE_HWIF is not set +# CONFIG_FEATURE_HDPARM_HDIO_GETSET_DMA is not set CONFIG_HEXEDIT=y -# CONFIG_I2CGET is not set -# CONFIG_I2CSET is not set -# CONFIG_I2CDUMP is not set -# CONFIG_I2CDETECT is not set -# CONFIG_I2CTRANSFER is not set +CONFIG_I2CGET=y +CONFIG_I2CSET=y +CONFIG_I2CDUMP=y +CONFIG_I2CDETECT=y +CONFIG_I2CTRANSFER=y # CONFIG_INOTIFYD is not set CONFIG_LESS=y CONFIG_FEATURE_LESS_MAXLINES=9999999 CONFIG_FEATURE_LESS_BRACKETS=y CONFIG_FEATURE_LESS_FLAGS=y CONFIG_FEATURE_LESS_TRUNCATE=y -CONFIG_FEATURE_LESS_MARKS=y +# CONFIG_FEATURE_LESS_MARKS is not set CONFIG_FEATURE_LESS_REGEXP=y -CONFIG_FEATURE_LESS_WINCH=y -CONFIG_FEATURE_LESS_ASK_TERMINAL=y +# CONFIG_FEATURE_LESS_WINCH is not set +# CONFIG_FEATURE_LESS_ASK_TERMINAL is not set CONFIG_FEATURE_LESS_DASHCMD=y -CONFIG_FEATURE_LESS_LINENUMS=y +# CONFIG_FEATURE_LESS_LINENUMS is not set CONFIG_FEATURE_LESS_RAW=y CONFIG_FEATURE_LESS_ENV=y CONFIG_LSSCSI=y CONFIG_MAKEDEVS=y # CONFIG_FEATURE_MAKEDEVS_LEAF is not set CONFIG_FEATURE_MAKEDEVS_TABLE=y -CONFIG_MAN=y +# CONFIG_MAN is not set CONFIG_MICROCOM=y CONFIG_MIM=y CONFIG_MT=y -CONFIG_NANDWRITE=y -CONFIG_NANDDUMP=y +# CONFIG_NANDWRITE is not set +# CONFIG_NANDDUMP is not set CONFIG_PARTPROBE=y -CONFIG_RAIDAUTORUN=y -CONFIG_READAHEAD=y -CONFIG_RFKILL=y +# CONFIG_RAIDAUTORUN is not set +# CONFIG_READAHEAD is not set +# CONFIG_RFKILL is not set CONFIG_RUNLEVEL=y -CONFIG_RX=y +# CONFIG_RX is not set CONFIG_SEEDRNG=y CONFIG_SETFATTR=y CONFIG_SETSERIAL=y @@ -845,15 +841,15 @@ CONFIG_STRINGS=y CONFIG_TIME=y CONFIG_TREE=y CONFIG_TS=y -CONFIG_TTYSIZE=y -CONFIG_UBIATTACH=y -CONFIG_UBIDETACH=y -CONFIG_UBIMKVOL=y -CONFIG_UBIRMVOL=y -CONFIG_UBIRSVOL=y -CONFIG_UBIUPDATEVOL=y +# CONFIG_TTYSIZE is not set +# CONFIG_UBIATTACH is not set +# CONFIG_UBIDETACH is not set +# CONFIG_UBIMKVOL is not set +# CONFIG_UBIRMVOL is not set +# CONFIG_UBIRSVOL is not set +# CONFIG_UBIUPDATEVOL is not set CONFIG_UBIRENAME=y -CONFIG_VOLNAME=y +# CONFIG_VOLNAME is not set CONFIG_WATCHDOG=y # CONFIG_FEATURE_WATCHDOG_OPEN_TWICE is not set @@ -870,48 +866,48 @@ CONFIG_FEATURE_HWIB=y # CONFIG_FEATURE_TLS_SHA1 is not set CONFIG_ARP=y CONFIG_ARPING=y -CONFIG_BRCTL=y -CONFIG_FEATURE_BRCTL_FANCY=y -CONFIG_FEATURE_BRCTL_SHOW=y +# CONFIG_BRCTL is not set +# CONFIG_FEATURE_BRCTL_FANCY is not set +# CONFIG_FEATURE_BRCTL_SHOW is not set CONFIG_DNSD=y CONFIG_ETHER_WAKE=y -CONFIG_FTPD=y -CONFIG_FEATURE_FTPD_WRITE=y -CONFIG_FEATURE_FTPD_ACCEPT_BROKEN_LIST=y -CONFIG_FEATURE_FTPD_AUTHENTICATION=y -CONFIG_FTPGET=y -CONFIG_FTPPUT=y -CONFIG_FEATURE_FTPGETPUT_LONG_OPTIONS=y +# CONFIG_FTPD is not set +# CONFIG_FEATURE_FTPD_WRITE is not set +# CONFIG_FEATURE_FTPD_ACCEPT_BROKEN_LIST is not set +# CONFIG_FEATURE_FTPD_AUTHENTICATION is not set +# CONFIG_FTPGET is not set +# CONFIG_FTPPUT is not set +# CONFIG_FEATURE_FTPGETPUT_LONG_OPTIONS is not set CONFIG_HOSTNAME=y CONFIG_DNSDOMAINNAME=y -CONFIG_HTTPD=y -CONFIG_FEATURE_HTTPD_PORT_DEFAULT=80 -CONFIG_FEATURE_HTTPD_RANGES=y -CONFIG_FEATURE_HTTPD_SETUID=y -CONFIG_FEATURE_HTTPD_BASIC_AUTH=y -CONFIG_FEATURE_HTTPD_AUTH_MD5=y -CONFIG_FEATURE_HTTPD_CGI=y -CONFIG_FEATURE_HTTPD_CONFIG_WITH_SCRIPT_INTERPR=y -CONFIG_FEATURE_HTTPD_SET_REMOTE_PORT_TO_ENV=y -CONFIG_FEATURE_HTTPD_ENCODE_URL_STR=y -CONFIG_FEATURE_HTTPD_ERROR_PAGES=y -CONFIG_FEATURE_HTTPD_PROXY=y -CONFIG_FEATURE_HTTPD_GZIP=y -CONFIG_FEATURE_HTTPD_ETAG=y -CONFIG_FEATURE_HTTPD_LAST_MODIFIED=y -CONFIG_FEATURE_HTTPD_DATE=y -CONFIG_FEATURE_HTTPD_ACL_IP=y +# CONFIG_HTTPD is not set +CONFIG_FEATURE_HTTPD_PORT_DEFAULT=0 +# CONFIG_FEATURE_HTTPD_RANGES is not set +# CONFIG_FEATURE_HTTPD_SETUID is not set +# CONFIG_FEATURE_HTTPD_BASIC_AUTH is not set +# CONFIG_FEATURE_HTTPD_AUTH_MD5 is not set +# CONFIG_FEATURE_HTTPD_CGI is not set +# CONFIG_FEATURE_HTTPD_CONFIG_WITH_SCRIPT_INTERPR is not set +# CONFIG_FEATURE_HTTPD_SET_REMOTE_PORT_TO_ENV is not set +# CONFIG_FEATURE_HTTPD_ENCODE_URL_STR is not set +# CONFIG_FEATURE_HTTPD_ERROR_PAGES is not set +# CONFIG_FEATURE_HTTPD_PROXY is not set +# CONFIG_FEATURE_HTTPD_GZIP is not set +# CONFIG_FEATURE_HTTPD_ETAG is not set +# CONFIG_FEATURE_HTTPD_LAST_MODIFIED is not set +# CONFIG_FEATURE_HTTPD_DATE is not set +# CONFIG_FEATURE_HTTPD_ACL_IP is not set CONFIG_IFCONFIG=y CONFIG_FEATURE_IFCONFIG_STATUS=y CONFIG_FEATURE_IFCONFIG_SLIP=y CONFIG_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ=y CONFIG_FEATURE_IFCONFIG_HW=y -CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS=y -CONFIG_IFENSLAVE=y -CONFIG_IFPLUGD=y +# CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS is not set +# CONFIG_IFENSLAVE is not set +# CONFIG_IFPLUGD is not set CONFIG_IFUP=y CONFIG_IFDOWN=y -CONFIG_IFUPDOWN_IFSTATE_PATH="/run/ifstate" +CONFIG_IFUPDOWN_IFSTATE_PATH="/var/run/ifstate" CONFIG_FEATURE_IFUPDOWN_IP=y CONFIG_FEATURE_IFUPDOWN_IPV4=y CONFIG_FEATURE_IFUPDOWN_IPV6=y @@ -924,77 +920,77 @@ CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_TIME=y CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DAYTIME=y CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_CHARGEN=y # CONFIG_FEATURE_INETD_RPC is not set -CONFIG_IP=y -CONFIG_IPADDR=y -CONFIG_IPLINK=y -CONFIG_IPROUTE=y -CONFIG_IPTUNNEL=y -CONFIG_IPRULE=y -CONFIG_IPNEIGH=y -CONFIG_FEATURE_IP_ADDRESS=y -CONFIG_FEATURE_IP_LINK=y -CONFIG_FEATURE_IP_ROUTE=y -CONFIG_FEATURE_IP_ROUTE_DIR="/etc/iproute2" -CONFIG_FEATURE_IP_TUNNEL=y -CONFIG_FEATURE_IP_RULE=y -CONFIG_FEATURE_IP_NEIGH=y +# CONFIG_IP is not set +# CONFIG_IPADDR is not set +# CONFIG_IPLINK is not set +# CONFIG_IPROUTE is not set +# CONFIG_IPTUNNEL is not set +# CONFIG_IPRULE is not set +# CONFIG_IPNEIGH is not set +# CONFIG_FEATURE_IP_ADDRESS is not set +# CONFIG_FEATURE_IP_LINK is not set +# CONFIG_FEATURE_IP_ROUTE is not set +CONFIG_FEATURE_IP_ROUTE_DIR="" +# CONFIG_FEATURE_IP_TUNNEL is not set +# CONFIG_FEATURE_IP_RULE is not set +# CONFIG_FEATURE_IP_NEIGH is not set # CONFIG_FEATURE_IP_RARE_PROTOCOLS is not set -CONFIG_IPCALC=y -CONFIG_FEATURE_IPCALC_LONG_OPTIONS=y -CONFIG_FEATURE_IPCALC_FANCY=y -CONFIG_FAKEIDENTD=y +# CONFIG_IPCALC is not set +# CONFIG_FEATURE_IPCALC_LONG_OPTIONS is not set +# CONFIG_FEATURE_IPCALC_FANCY is not set +# CONFIG_FAKEIDENTD is not set CONFIG_NAMEIF=y -CONFIG_FEATURE_NAMEIF_EXTENDED=y -CONFIG_NBDCLIENT=y -CONFIG_NC=y +# CONFIG_FEATURE_NAMEIF_EXTENDED is not set +# CONFIG_NBDCLIENT is not set +# CONFIG_NC is not set # CONFIG_NETCAT is not set -CONFIG_NC_SERVER=y -CONFIG_NC_EXTRA=y -CONFIG_NC_110_COMPAT=y +# CONFIG_NC_SERVER is not set +# CONFIG_NC_EXTRA is not set +# CONFIG_NC_110_COMPAT is not set CONFIG_NETSTAT=y -CONFIG_FEATURE_NETSTAT_WIDE=y -CONFIG_FEATURE_NETSTAT_PRG=y +# CONFIG_FEATURE_NETSTAT_WIDE is not set +# CONFIG_FEATURE_NETSTAT_PRG is not set CONFIG_NSLOOKUP=y CONFIG_FEATURE_NSLOOKUP_BIG=y CONFIG_FEATURE_NSLOOKUP_LONG_OPTIONS=y -CONFIG_NTPD=y -CONFIG_FEATURE_NTPD_SERVER=y -CONFIG_FEATURE_NTPD_CONF=y -CONFIG_FEATURE_NTP_AUTH=y +# CONFIG_NTPD is not set +# CONFIG_FEATURE_NTPD_SERVER is not set +# CONFIG_FEATURE_NTPD_CONF is not set +# CONFIG_FEATURE_NTP_AUTH is not set CONFIG_PING=y -CONFIG_PING6=y +# CONFIG_PING6 is not set CONFIG_FEATURE_FANCY_PING=y -CONFIG_PSCAN=y +# CONFIG_PSCAN is not set CONFIG_ROUTE=y -CONFIG_SLATTACH=y -CONFIG_SSL_CLIENT=y +# CONFIG_SLATTACH is not set +# CONFIG_SSL_CLIENT is not set CONFIG_TC=y CONFIG_FEATURE_TC_INGRESS=y -CONFIG_TCPSVD=y -CONFIG_UDPSVD=y +# CONFIG_TCPSVD is not set +# CONFIG_UDPSVD is not set CONFIG_TELNET=y CONFIG_FEATURE_TELNET_TTYPE=y CONFIG_FEATURE_TELNET_AUTOLOGIN=y CONFIG_FEATURE_TELNET_WIDTH=y -CONFIG_TELNETD=y -CONFIG_FEATURE_TELNETD_STANDALONE=y -CONFIG_FEATURE_TELNETD_PORT_DEFAULT=23 -CONFIG_FEATURE_TELNETD_INETD_WAIT=y +# CONFIG_TELNETD is not set +# CONFIG_FEATURE_TELNETD_STANDALONE is not set +CONFIG_FEATURE_TELNETD_PORT_DEFAULT=0 +# CONFIG_FEATURE_TELNETD_INETD_WAIT is not set CONFIG_TFTP=y -CONFIG_FEATURE_TFTP_PROGRESS_BAR=y +# CONFIG_FEATURE_TFTP_PROGRESS_BAR is not set CONFIG_FEATURE_TFTP_HPA_COMPAT=y -CONFIG_TFTPD=y +# CONFIG_TFTPD is not set CONFIG_FEATURE_TFTP_GET=y CONFIG_FEATURE_TFTP_PUT=y CONFIG_FEATURE_TFTP_BLOCKSIZE=y # CONFIG_TFTP_DEBUG is not set -CONFIG_TLS=y +# CONFIG_TLS is not set CONFIG_TRACEROUTE=y -CONFIG_TRACEROUTE6=y -CONFIG_FEATURE_TRACEROUTE_VERBOSE=y -CONFIG_FEATURE_TRACEROUTE_USE_ICMP=y -CONFIG_TUNCTL=y -CONFIG_FEATURE_TUNCTL_UG=y +# CONFIG_TRACEROUTE6 is not set +# CONFIG_FEATURE_TRACEROUTE_VERBOSE is not set +# CONFIG_FEATURE_TRACEROUTE_USE_ICMP is not set +# CONFIG_TUNCTL is not set +# CONFIG_FEATURE_TUNCTL_UG is not set CONFIG_VCONFIG=y CONFIG_WGET=y CONFIG_FEATURE_WGET_LONG_OPTIONS=y @@ -1002,37 +998,37 @@ CONFIG_FEATURE_WGET_STATUSBAR=y CONFIG_FEATURE_WGET_FTP=y CONFIG_FEATURE_WGET_AUTHENTICATION=y CONFIG_FEATURE_WGET_TIMEOUT=y -CONFIG_FEATURE_WGET_HTTPS=y -CONFIG_FEATURE_WGET_OPENSSL=y -CONFIG_WHOIS=y -CONFIG_ZCIP=y -CONFIG_UDHCPD=y +# CONFIG_FEATURE_WGET_HTTPS is not set +# CONFIG_FEATURE_WGET_OPENSSL is not set +# CONFIG_WHOIS is not set +# CONFIG_ZCIP is not set +# CONFIG_UDHCPD is not set # CONFIG_FEATURE_UDHCPD_BASE_IP_ON_MAC is not set -CONFIG_FEATURE_UDHCPD_WRITE_LEASES_EARLY=y -CONFIG_DHCPD_LEASES_FILE="/var/lib/misc/udhcpd.leases" -CONFIG_DUMPLEASES=y -CONFIG_DHCPRELAY=y +# CONFIG_FEATURE_UDHCPD_WRITE_LEASES_EARLY is not set +CONFIG_DHCPD_LEASES_FILE="" +# CONFIG_DUMPLEASES is not set +# CONFIG_DHCPRELAY is not set CONFIG_UDHCPC=y CONFIG_FEATURE_UDHCPC_ARPING=y CONFIG_FEATURE_UDHCPC_SANITIZEOPT=y CONFIG_UDHCPC_DEFAULT_SCRIPT="/usr/share/udhcpc/default.script" -CONFIG_UDHCPC6_DEFAULT_SCRIPT="/usr/share/udhcpc/default6.script" -CONFIG_UDHCPC6=y -CONFIG_FEATURE_UDHCPC6_RFC3646=y -CONFIG_FEATURE_UDHCPC6_RFC4704=y -CONFIG_FEATURE_UDHCPC6_RFC4833=y -CONFIG_FEATURE_UDHCPC6_RFC5970=y +CONFIG_UDHCPC6_DEFAULT_SCRIPT="" +# CONFIG_UDHCPC6 is not set +# CONFIG_FEATURE_UDHCPC6_RFC3646 is not set +# CONFIG_FEATURE_UDHCPC6_RFC4704 is not set +# CONFIG_FEATURE_UDHCPC6_RFC4833 is not set +# CONFIG_FEATURE_UDHCPC6_RFC5970 is not set # # Common options for DHCP applets # CONFIG_UDHCPC_DEFAULT_INTERFACE="eth0" # CONFIG_FEATURE_UDHCP_PORT is not set -CONFIG_UDHCP_DEBUG=2 +CONFIG_UDHCP_DEBUG=0 CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS=80 CONFIG_FEATURE_UDHCP_RFC3397=y CONFIG_FEATURE_UDHCP_8021Q=y -CONFIG_IFUPDOWN_UDHCPC_CMD_OPTIONS="-R -n" +CONFIG_IFUPDOWN_UDHCPC_CMD_OPTIONS="-t1 -A3 -b -R -O search -O staticroutes" # # Print Utilities @@ -1044,74 +1040,74 @@ CONFIG_IFUPDOWN_UDHCPC_CMD_OPTIONS="-R -n" # # Mail Utilities # -CONFIG_FEATURE_MIME_CHARSET="us-ascii" -CONFIG_MAKEMIME=y +CONFIG_FEATURE_MIME_CHARSET="" +# CONFIG_MAKEMIME is not set # CONFIG_POPMAILDIR is not set # CONFIG_FEATURE_POPMAILDIR_DELIVERY is not set -CONFIG_REFORMIME=y -CONFIG_FEATURE_REFORMIME_COMPAT=y -CONFIG_SENDMAIL=y +# CONFIG_REFORMIME is not set +# CONFIG_FEATURE_REFORMIME_COMPAT is not set +# CONFIG_SENDMAIL is not set # # Process Utilities # -CONFIG_FEATURE_FAST_TOP=y -CONFIG_FEATURE_SHOW_THREADS=y +# CONFIG_FEATURE_FAST_TOP is not set +# CONFIG_FEATURE_SHOW_THREADS is not set CONFIG_FREE=y CONFIG_FUSER=y -CONFIG_IOSTAT=y +# CONFIG_IOSTAT is not set CONFIG_KILL=y CONFIG_KILLALL=y CONFIG_KILLALL5=y CONFIG_LSOF=y -CONFIG_MPSTAT=y -CONFIG_NMETER=y -CONFIG_PGREP=y -CONFIG_PKILL=y +# CONFIG_MPSTAT is not set +# CONFIG_NMETER is not set +# CONFIG_PGREP is not set +# CONFIG_PKILL is not set CONFIG_PIDOF=y CONFIG_FEATURE_PIDOF_SINGLE=y CONFIG_FEATURE_PIDOF_OMIT=y -CONFIG_PMAP=y -CONFIG_POWERTOP=y -CONFIG_FEATURE_POWERTOP_INTERACTIVE=y +# CONFIG_PMAP is not set +# CONFIG_POWERTOP is not set +# CONFIG_FEATURE_POWERTOP_INTERACTIVE is not set CONFIG_PS=y # CONFIG_FEATURE_PS_WIDE is not set # CONFIG_FEATURE_PS_LONG is not set CONFIG_FEATURE_PS_TIME=y # CONFIG_FEATURE_PS_UNUSUAL_SYSTEMS is not set CONFIG_FEATURE_PS_ADDITIONAL_COLUMNS=y -CONFIG_PSTREE=y -CONFIG_PWDX=y -CONFIG_SMEMCAP=y +# CONFIG_PSTREE is not set +# CONFIG_PWDX is not set +# CONFIG_SMEMCAP is not set CONFIG_BB_SYSCTL=y CONFIG_TOP=y CONFIG_FEATURE_TOP_INTERACTIVE=y CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE=y CONFIG_FEATURE_TOP_CPU_GLOBAL_PERCENTS=y -CONFIG_FEATURE_TOP_SMP_CPU=y -CONFIG_FEATURE_TOP_DECIMALS=y -CONFIG_FEATURE_TOP_SMP_PROCESS=y -CONFIG_FEATURE_TOPMEM=y +# CONFIG_FEATURE_TOP_SMP_CPU is not set +# CONFIG_FEATURE_TOP_DECIMALS is not set +# CONFIG_FEATURE_TOP_SMP_PROCESS is not set +# CONFIG_FEATURE_TOPMEM is not set CONFIG_UPTIME=y -CONFIG_FEATURE_UPTIME_UTMP_SUPPORT=y +# CONFIG_FEATURE_UPTIME_UTMP_SUPPORT is not set CONFIG_WATCH=y # # Runit Utilities # -CONFIG_CHPST=y -CONFIG_SETUIDGID=y -CONFIG_ENVUIDGID=y -CONFIG_ENVDIR=y -CONFIG_SOFTLIMIT=y -CONFIG_RUNSV=y -CONFIG_RUNSVDIR=y +# CONFIG_CHPST is not set +# CONFIG_SETUIDGID is not set +# CONFIG_ENVUIDGID is not set +# CONFIG_ENVDIR is not set +# CONFIG_SOFTLIMIT is not set +# CONFIG_RUNSV is not set +# CONFIG_RUNSVDIR is not set # CONFIG_FEATURE_RUNSVDIR_LOG is not set -CONFIG_SV=y -CONFIG_SV_DEFAULT_SERVICE_DIR="/var/service" +# CONFIG_SV is not set +CONFIG_SV_DEFAULT_SERVICE_DIR="" CONFIG_SVC=y CONFIG_SVOK=y -CONFIG_SVLOGD=y +# CONFIG_SVLOGD is not set # CONFIG_CHCON is not set # CONFIG_GETENFORCE is not set # CONFIG_GETSEBOOL is not set @@ -1147,7 +1143,7 @@ CONFIG_ASH_ALIAS=y CONFIG_ASH_RANDOM_SUPPORT=y CONFIG_ASH_EXPAND_PRMT=y CONFIG_ASH_IDLE_TIMEOUT=y -CONFIG_ASH_MAIL=y +# CONFIG_ASH_MAIL is not set CONFIG_ASH_ECHO=y CONFIG_ASH_PRINTF=y CONFIG_ASH_TEST=y @@ -1155,43 +1151,43 @@ CONFIG_ASH_SLEEP=y CONFIG_ASH_HELP=y CONFIG_ASH_GETOPTS=y CONFIG_ASH_CMDCMD=y -CONFIG_CTTYHACK=y -CONFIG_HUSH=y -CONFIG_SHELL_HUSH=y -CONFIG_HUSH_BASH_COMPAT=y -CONFIG_HUSH_BRACE_EXPANSION=y +# CONFIG_CTTYHACK is not set +# CONFIG_HUSH is not set +# CONFIG_SHELL_HUSH is not set +# CONFIG_HUSH_BASH_COMPAT is not set +# CONFIG_HUSH_BRACE_EXPANSION is not set # CONFIG_HUSH_BASH_SOURCE_CURDIR is not set -CONFIG_HUSH_LINENO_VAR=y -CONFIG_HUSH_INTERACTIVE=y -CONFIG_HUSH_SAVEHISTORY=y -CONFIG_HUSH_JOB=y -CONFIG_HUSH_TICK=y -CONFIG_HUSH_IF=y -CONFIG_HUSH_LOOPS=y -CONFIG_HUSH_CASE=y -CONFIG_HUSH_FUNCTIONS=y -CONFIG_HUSH_LOCAL=y -CONFIG_HUSH_RANDOM_SUPPORT=y -CONFIG_HUSH_MODE_X=y -CONFIG_HUSH_ECHO=y -CONFIG_HUSH_PRINTF=y -CONFIG_HUSH_TEST=y -CONFIG_HUSH_HELP=y -CONFIG_HUSH_EXPORT=y -CONFIG_HUSH_EXPORT_N=y -CONFIG_HUSH_READONLY=y -CONFIG_HUSH_KILL=y -CONFIG_HUSH_WAIT=y -CONFIG_HUSH_COMMAND=y -CONFIG_HUSH_TRAP=y -CONFIG_HUSH_TYPE=y -CONFIG_HUSH_TIMES=y -CONFIG_HUSH_READ=y -CONFIG_HUSH_SET=y -CONFIG_HUSH_UNSET=y -CONFIG_HUSH_ULIMIT=y -CONFIG_HUSH_UMASK=y -CONFIG_HUSH_GETOPTS=y +# CONFIG_HUSH_LINENO_VAR is not set +# CONFIG_HUSH_INTERACTIVE is not set +# CONFIG_HUSH_SAVEHISTORY is not set +# CONFIG_HUSH_JOB is not set +# CONFIG_HUSH_TICK is not set +# CONFIG_HUSH_IF is not set +# CONFIG_HUSH_LOOPS is not set +# CONFIG_HUSH_CASE is not set +# CONFIG_HUSH_FUNCTIONS is not set +# CONFIG_HUSH_LOCAL is not set +# CONFIG_HUSH_RANDOM_SUPPORT is not set +# CONFIG_HUSH_MODE_X is not set +# CONFIG_HUSH_ECHO is not set +# CONFIG_HUSH_PRINTF is not set +# CONFIG_HUSH_TEST is not set +# CONFIG_HUSH_HELP is not set +# CONFIG_HUSH_EXPORT is not set +# CONFIG_HUSH_EXPORT_N is not set +# CONFIG_HUSH_READONLY is not set +# CONFIG_HUSH_KILL is not set +# CONFIG_HUSH_WAIT is not set +# CONFIG_HUSH_COMMAND is not set +# CONFIG_HUSH_TRAP is not set +# CONFIG_HUSH_TYPE is not set +# CONFIG_HUSH_TIMES is not set +# CONFIG_HUSH_READ is not set +# CONFIG_HUSH_SET is not set +# CONFIG_HUSH_UNSET is not set +# CONFIG_HUSH_ULIMIT is not set +# CONFIG_HUSH_UMASK is not set +# CONFIG_HUSH_GETOPTS is not set # CONFIG_HUSH_MEMLEAK is not set # @@ -1204,28 +1200,24 @@ CONFIG_FEATURE_SH_EXTRA_QUIET=y # CONFIG_FEATURE_SH_STANDALONE is not set # CONFIG_FEATURE_SH_NOFORK is not set CONFIG_FEATURE_SH_READ_FRAC=y -CONFIG_FEATURE_SH_HISTFILESIZE=y +# CONFIG_FEATURE_SH_HISTFILESIZE is not set CONFIG_FEATURE_SH_EMBEDDED_SCRIPTS=y # # System Logging Utilities # CONFIG_KLOGD=y - -# -# klogd should not be used together with syslog to kernel printk buffer -# CONFIG_FEATURE_KLOGD_KLOGCTL=y CONFIG_LOGGER=y -CONFIG_LOGREAD=y -CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING=y +# CONFIG_LOGREAD is not set +# CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING is not set CONFIG_SYSLOGD=y CONFIG_FEATURE_ROTATE_LOGFILE=y CONFIG_FEATURE_REMOTE_LOG=y -CONFIG_FEATURE_SYSLOGD_DUP=y -CONFIG_FEATURE_SYSLOGD_CFG=y +# CONFIG_FEATURE_SYSLOGD_DUP is not set +# CONFIG_FEATURE_SYSLOGD_CFG is not set # CONFIG_FEATURE_SYSLOGD_PRECISE_TIMESTAMPS is not set CONFIG_FEATURE_SYSLOGD_READ_BUFFER_SIZE=256 -CONFIG_FEATURE_IPC_SYSLOG=y -CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE=16 -CONFIG_FEATURE_KMSG_SYSLOG=y +# CONFIG_FEATURE_IPC_SYSLOG is not set +CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE=0 +# CONFIG_FEATURE_KMSG_SYSLOG is not set diff --git a/buildroot-external/configs/ova_64_defconfig b/buildroot-external/configs/ova_64_defconfig new file mode 100644 index 00000000..46ecbbb2 --- /dev/null +++ b/buildroot-external/configs/ova_64_defconfig @@ -0,0 +1,243 @@ +BR2_x86_64=y +BR2_PACKAGE_GLIBC_UTILS=y +BR2_BINUTILS_VERSION_2_39_X=y +BR2_GCC_VERSION_12_X=y +BR2_TOOLCHAIN_BUILDROOT_CXX=y +BR2_DL_DIR="../../downloads" +BR2_OPTIMIZE_2=y +BR2_ENABLE_LTO=y +BR2_GLOBAL_PATCH_DIR="../buildroot-patches/" +BR2_FORCE_HOST_BUILD=y +BR2_SSP_REGULAR=y +BR2_TARGET_GENERIC_HOSTNAME="OpenVoiceOS" +BR2_TARGET_GENERIC_ISSUE="Welcome to OpenVoiceOS" +BR2_TARGET_GENERIC_PASSWD_SHA512=y +BR2_INIT_SYSTEMD=y +# BR2_TARGET_ENABLE_ROOT_LOGIN is not set +BR2_SYSTEM_BIN_SH_BASH=y +# BR2_TARGET_GENERIC_GETTY is not set +# BR2_TARGET_GENERIC_REMOUNT_ROOTFS_RW is not set +BR2_SYSTEM_DHCP="eth0" +# BR2_ENABLE_LOCALE_PURGE is not set +BR2_GENERATE_LOCALE="en_US.UTF-8" +BR2_SYSTEM_ENABLE_NLS=y +BR2_ROOTFS_USERS_TABLES="$(BR2_EXTERNAL)/user_table.txt" +BR2_ROOTFS_OVERLAY="$(BR2_EXTERNAL)/rootfs-overlay $(BR2_EXTERNAL)/board/ovos/ova/rootfs-overlay" +BR2_ROOTFS_POST_BUILD_SCRIPT="$(BR2_EXTERNAL)/board/ovos/ova/post-build.sh" +BR2_ROOTFS_POST_IMAGE_SCRIPT="$(BR2_EXTERNAL)/board/ovos/ova/post-image.sh" +BR2_ROOTFS_POST_SCRIPT_ARGS="--ova" +BR2_LINUX_KERNEL=y +BR2_LINUX_KERNEL_CUSTOM_VERSION=y +BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.1.37" +BR2_LINUX_KERNEL_DEFCONFIG="x86_64" +BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES="$(BR2_EXTERNAL)/kernel/ovos.config $(BR2_EXTERNAL)/kernel/device-drivers.config $(BR2_EXTERNAL)/kernel/docker.config $(BR2_EXTERNAL)/board/ovos/ova/kernel.config" +BR2_LINUX_KERNEL_LZ4=y +BR2_LINUX_KERNEL_NEEDS_HOST_OPENSSL=y +BR2_LINUX_KERNEL_NEEDS_HOST_LIBELF=y +BR2_PACKAGE_LINUX_TOOLS_HV=y +BR2_PACKAGE_LINUX_TOOLS_HV_KVP_DAEMON=y +BR2_PACKAGE_LINUX_TOOLS_HV_FCOPY_DAEMON=y +BR2_PACKAGE_LINUX_TOOLS_HV_VSS_DAEMON=y +BR2_PACKAGE_BUSYBOX_CONFIG="$(BR2_EXTERNAL)/busybox.config" +BR2_PACKAGE_ALSA_UTILS=y +BR2_PACKAGE_ALSA_UTILS_ALSACONF=y +BR2_PACKAGE_ALSA_UTILS_ACONNECT=y +BR2_PACKAGE_ALSA_UTILS_ALSALOOP=y +BR2_PACKAGE_ALSA_UTILS_ALSAUCM=y +BR2_PACKAGE_ALSA_UTILS_ALSATPLG=y +BR2_PACKAGE_ALSA_UTILS_AMIDI=y +BR2_PACKAGE_ALSA_UTILS_AMIXER=y +BR2_PACKAGE_ALSA_UTILS_APLAY=y +BR2_PACKAGE_ALSA_UTILS_APLAYMIDI=y +BR2_PACKAGE_ALSA_UTILS_ARECORDMIDI=y +BR2_PACKAGE_ALSA_UTILS_ASEQDUMP=y +BR2_PACKAGE_ALSA_UTILS_ASEQNET=y +BR2_PACKAGE_ALSA_UTILS_BAT=y +BR2_PACKAGE_ALSA_UTILS_IECSET=y +BR2_PACKAGE_ALSA_UTILS_SPEAKER_TEST=y +BR2_PACKAGE_PIPEWIRE=y +BR2_PACKAGE_BZIP2=y +BR2_PACKAGE_GZIP=y +BR2_PACKAGE_LZIP=y +BR2_PACKAGE_P7ZIP=y +BR2_PACKAGE_UNRAR=y +BR2_PACKAGE_UNZIP=y +BR2_PACKAGE_XZ=y +BR2_PACKAGE_ZIP=y +BR2_PACKAGE_LSOF=y +BR2_PACKAGE_MEMSTAT=y +BR2_PACKAGE_NMON=y +BR2_PACKAGE_BINUTILS=y +BR2_PACKAGE_CHECK=y +BR2_PACKAGE_DIFFUTILS=y +BR2_PACKAGE_FINDUTILS=y +BR2_PACKAGE_GIT_CRYPT=y +BR2_PACKAGE_GREP=y +BR2_PACKAGE_JO=y +BR2_PACKAGE_JQ=y +BR2_PACKAGE_LIBTOOL=y +BR2_PACKAGE_PATCH=y +BR2_PACKAGE_DOSFSTOOLS=y +BR2_PACKAGE_DOSFSTOOLS_FATLABEL=y +BR2_PACKAGE_DOSFSTOOLS_FSCK_FAT=y +BR2_PACKAGE_DOSFSTOOLS_MKFS_FAT=y +BR2_PACKAGE_E2FSPROGS=y +BR2_PACKAGE_E2FSPROGS_E2IMAGE=y +BR2_PACKAGE_E2FSPROGS_FUSE2FS=y +BR2_PACKAGE_E2FSPROGS_RESIZE2FS=y +BR2_PACKAGE_FUSE_OVERLAYFS=y +BR2_PACKAGE_NFS_UTILS=y +BR2_PACKAGE_NTFS_3G=y +BR2_PACKAGE_SQUASHFS=y +# BR2_PACKAGE_SQUASHFS_GZIP is not set +BR2_PACKAGE_SQUASHFS_LZ4=y +BR2_PACKAGE_LINUX_FIRMWARE=y +BR2_PACKAGE_LINUX_FIRMWARE_I915=y +BR2_PACKAGE_LINUX_FIRMWARE_IBT=y +BR2_PACKAGE_LINUX_FIRMWARE_QUALCOMM_6174A_BT=y +BR2_PACKAGE_LINUX_FIRMWARE_RTL_87XX_BT=y +BR2_PACKAGE_LINUX_FIRMWARE_RTL_88XX_BT=y +BR2_PACKAGE_LINUX_FIRMWARE_IWLWIFI_22000=y +BR2_PACKAGE_LINUX_FIRMWARE_IWLWIFI_22260=y +BR2_PACKAGE_LINUX_FIRMWARE_IWLWIFI_3160=y +BR2_PACKAGE_LINUX_FIRMWARE_IWLWIFI_3168=y +BR2_PACKAGE_LINUX_FIRMWARE_IWLWIFI_3945=y +BR2_PACKAGE_LINUX_FIRMWARE_IWLWIFI_4965=y +BR2_PACKAGE_LINUX_FIRMWARE_IWLWIFI_5000=y +BR2_PACKAGE_LINUX_FIRMWARE_IWLWIFI_6000G2A=y +BR2_PACKAGE_LINUX_FIRMWARE_IWLWIFI_6000G2B=y +BR2_PACKAGE_LINUX_FIRMWARE_IWLWIFI_7260=y +BR2_PACKAGE_LINUX_FIRMWARE_IWLWIFI_7265D=y +BR2_PACKAGE_LINUX_FIRMWARE_IWLWIFI_8000C=y +BR2_PACKAGE_LINUX_FIRMWARE_IWLWIFI_8265=y +BR2_PACKAGE_LINUX_FIRMWARE_IWLWIFI_9XXX=y +BR2_PACKAGE_LINUX_FIRMWARE_MEDIATEK_MT7601U=y +BR2_PACKAGE_LINUX_FIRMWARE_RALINK_RT73=y +BR2_PACKAGE_LINUX_FIRMWARE_RALINK_RT2XX=y +BR2_PACKAGE_LINUX_FIRMWARE_RTL_81XX=y +BR2_PACKAGE_LINUX_FIRMWARE_BNX2X=y +BR2_PACKAGE_LINUX_FIRMWARE_RTL_8169=y +BR2_PACKAGE_LINUX_FIRMWARE_USB_SERIAL_TI=y +BR2_PACKAGE_CRYPTSETUP=y +BR2_PACKAGE_GPTFDISK=y +BR2_PACKAGE_GPTFDISK_GDISK=y +BR2_PACKAGE_GPTFDISK_SGDISK=y +BR2_PACKAGE_GPTFDISK_CGDISK=y +BR2_PACKAGE_GVFS=y +BR2_PACKAGE_PARTED=y +BR2_PACKAGE_USB_MODESWITCH_DATA=y +BR2_PACKAGE_LUA=y +BR2_PACKAGE_ALSA_PLUGINS=y +BR2_PACKAGE_LIBSNDFILE=y +BR2_PACKAGE_PORTAUDIO=y +BR2_PACKAGE_SPEEX=y +BR2_PACKAGE_SPEEXDSP=y +BR2_PACKAGE_WEBRTC_AUDIO_PROCESSING=y +BR2_PACKAGE_LIBARCHIVE=y +BR2_PACKAGE_LZO=y +BR2_PACKAGE_CA_CERTIFICATES=y +BR2_PACKAGE_LIBGPGME=y +BR2_PACKAGE_LIBSSH2=y +BR2_PACKAGE_LIBOPENSSL_BIN=y +BR2_PACKAGE_LIBOPENSSL_ENGINES=y +BR2_PACKAGE_LIBLOCKFILE=y +BR2_PACKAGE_LIBNFS=y +BR2_PACKAGE_LIBSYSFS=y +BR2_PACKAGE_LOCKDEV=y +BR2_PACKAGE_PHYSFS=y +BR2_PACKAGE_WIREPLUMBER=y +BR2_PACKAGE_LIBGUDEV=y +BR2_PACKAGE_LIBYAML=y +BR2_PACKAGE_YAJL=y +BR2_PACKAGE_LIBCURL=y +BR2_PACKAGE_LIBCURL_CURL=y +BR2_PACKAGE_LIBNDP=y +BR2_PACKAGE_LIBUNISTRING=y +BR2_PACKAGE_PCRE2=y +BR2_PACKAGE_BLUEZ_TOOLS=y +BR2_PACKAGE_BLUEZ5_UTILS=y +BR2_PACKAGE_BLUEZ5_UTILS_OBEX=y +BR2_PACKAGE_BLUEZ5_UTILS_CLIENT=y +BR2_PACKAGE_BLUEZ5_UTILS_MONITOR=y +BR2_PACKAGE_BLUEZ5_UTILS_TOOLS_HID2HCI=y +BR2_PACKAGE_CRDA=y +BR2_PACKAGE_IPROUTE2=y +BR2_PACKAGE_IW=y +BR2_PACKAGE_NET_TOOLS=y +BR2_PACKAGE_OPENSSH=y +# BR2_PACKAGE_OPENSSH_SANDBOX is not set +BR2_PACKAGE_WGET=y +BR2_PACKAGE_WIRELESS_TOOLS=y +BR2_PACKAGE_WPA_SUPPLICANT=y +BR2_PACKAGE_WPA_SUPPLICANT_WEXT=y +BR2_PACKAGE_WPA_SUPPLICANT_AP_SUPPORT=y +BR2_PACKAGE_WPA_SUPPLICANT_MESH_NETWORKING=y +BR2_PACKAGE_WPA_SUPPLICANT_AUTOSCAN=y +BR2_PACKAGE_WPA_SUPPLICANT_HOTSPOT=y +BR2_PACKAGE_WPA_SUPPLICANT_DEBUG_SYSLOG=y +BR2_PACKAGE_WPA_SUPPLICANT_WPA3=y +BR2_PACKAGE_WPA_SUPPLICANT_CLI=y +BR2_PACKAGE_WPA_SUPPLICANT_WPA_CLIENT_SO=y +BR2_PACKAGE_WPA_SUPPLICANT_PASSPHRASE=y +BR2_PACKAGE_WPA_SUPPLICANT_DBUS=y +BR2_PACKAGE_CATATONIT=y +BR2_PACKAGE_FILE=y +BR2_PACKAGE_SCREEN=y +BR2_PACKAGE_SUDO=y +BR2_PACKAGE_TIME=y +BR2_PACKAGE_TINI=y +BR2_PACKAGE_WHICH=y +BR2_PACKAGE_ATTR=y +BR2_PACKAGE_DOCKER_CLI_BUILDX=y +BR2_PACKAGE_DOCKER_COMPOSE=y +BR2_PACKAGE_DOCKER_ENGINE=y +BR2_PACKAGE_DOCKER_ENGINE_EXPERIMENTAL=y +BR2_PACKAGE_EFIBOOTMGR=y +BR2_PACKAGE_HTOP=y +BR2_PACKAGE_OPENVMTOOLS=y +BR2_PACKAGE_PROCPS_NG=y +BR2_PACKAGE_SHADOW=y +BR2_PACKAGE_SHADOW_SHADOWGRP=y +BR2_PACKAGE_SHADOW_ACCOUNT_TOOLS_SETUID=y +BR2_PACKAGE_SHADOW_UTMPX=y +BR2_PACKAGE_SHADOW_SUBORDINATE_IDS=y +# BR2_PACKAGE_SYSTEMD_PSTORE is not set +BR2_PACKAGE_SYSTEMD_FIRSTBOOT=y +BR2_PACKAGE_SYSTEMD_HIBERNATE=y +# BR2_PACKAGE_SYSTEMD_HWDB is not set +BR2_PACKAGE_SYSTEMD_LOGIND=y +BR2_PACKAGE_SYSTEMD_OOMD=y +BR2_PACKAGE_SYSTEMD_RANDOMSEED=y +BR2_PACKAGE_SYSTEMD_REPART=y +BR2_PACKAGE_SYSTEMD_RFKILL=y +# BR2_PACKAGE_SYSTEMD_VCONSOLE is not set +BR2_PACKAGE_TAR=y +BR2_PACKAGE_UTIL_LINUX_HWCLOCK=y +BR2_PACKAGE_UTIL_LINUX_KILL=y +BR2_PACKAGE_UTIL_LINUX_LOGGER=y +BR2_PACKAGE_UTIL_LINUX_LOGIN=y +BR2_PACKAGE_UTIL_LINUX_LSMEM=y +BR2_PACKAGE_UTIL_LINUX_MESG=y +BR2_PACKAGE_UTIL_LINUX_MORE=y +BR2_PACKAGE_UTIL_LINUX_NOLOGIN=y +BR2_PACKAGE_UTIL_LINUX_PARTX=y +BR2_PACKAGE_UTIL_LINUX_SU=y +BR2_PACKAGE_UTIL_LINUX_ZRAMCTL=y +BR2_PACKAGE_LESS=y +BR2_PACKAGE_NANO=y +BR2_PACKAGE_VIM=y +BR2_TARGET_ROOTFS_SQUASHFS=y +BR2_TARGET_ROOTFS_SQUASHFS4_LZ4=y +# BR2_TARGET_ROOTFS_TAR is not set +BR2_TARGET_GRUB2=y +BR2_TARGET_GRUB2_X86_64_EFI=y +BR2_TARGET_GRUB2_BUILTIN_MODULES_EFI="boot linux ext2 fat squash4 part_msdos part_gpt normal efi_gop regexp loadenv echo cat test configfile" +BR2_TARGET_GRUB2_INSTALL_TOOLS=y +BR2_PACKAGE_HOST_DOSFSTOOLS=y +BR2_PACKAGE_HOST_E2FSPROGS=y +BR2_PACKAGE_HOST_GENIMAGE=y +BR2_PACKAGE_HOST_MKPASSWD=y +BR2_PACKAGE_HOST_MTOOLS=y +BR2_PACKAGE_HOST_PKGCONF=y +BR2_PACKAGE_GROWDISK_SERVICE=y +BR2_PACKAGE_HOSTNAME_SERVICE=y diff --git a/buildroot-external/kernel/docker.config b/buildroot-external/kernel/docker.config new file mode 100644 index 00000000..72cdd9d6 --- /dev/null +++ b/buildroot-external/kernel/docker.config @@ -0,0 +1,85 @@ +CONFIG_POSIX_MQUEUE=y +CONFIG_CFQ_GROUP_IOSCHED=y +CONFIG_CFS_BANDWIDTH=y +CONFIG_FAIR_GROUP_SCHED=y +CONFIG_NET_SCHED=y +# CONFIG_RT_GROUP_SCHED is not set + +CONFIG_CGROUPS=y +CONFIG_HUGETLB_PAGE=y +CONFIG_BLK_CGROUP=y +CONFIG_BLK_DEV_THROTTLING=y +CONFIG_CGROUP_SCHED=y +CONFIG_CGROUP_PIDS=y +CONFIG_CGROUP_FREEZER=y +CONFIG_CGROUP_HUGETLB=y +CONFIG_CGROUP_DEVICE=y +CONFIG_CGROUP_CPUACCT=y +CONFIG_CGROUP_PERF=y +CONFIG_CGROUP_HUGETLB=y +CONFIG_NET_CLS_CGROUP=y +CONFIG_CGROUP_NET_PRIO=y +CONFIG_CGROUP_BPF=y +CONFIG_BPF_SYSCALL=y + +CONFIG_MEMCG=y +CONFIG_MEMCG_SWAP=y + +CONFIG_NAMESPACES=y +CONFIG_USER_NS=y +CONFIG_PID_NS=y +CONFIG_IPC_NS=y +CONFIG_UTS_NS=y + +CONFIG_NETDEVICES=y +CONFIG_DUMMY=m +CONFIG_MACVLAN=m +CONFIG_IPVLAN=m +CONFIG_VXLAN=m + +CONFIG_INET=y +CONFIG_IPV6=y +CONFIG_INET_ESP=m +CONFIG_INET_XFRM_MODE_TRANSPORT=m +CONFIG_NETCONSOLE=y +CONFIG_VETH=y +CONFIG_NETFILTER=y +CONFIG_NF_CONNTRACK=y +CONFIG_NF_NAT=y +CONFIG_NF_NAT_NEEDED=y +CONFIG_NF_CONNTRACK_IPV4=y +CONFIG_IP6_NF_IPTABLES=y +CONFIG_IP6_NF_FILTER=y +CONFIG_IP6_NF_MANGLE=y +CONFIG_IP6_NF_NAT=y +CONFIG_NETFILTER_ADVANCED=y +CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=y +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y +CONFIG_NETFILTER_XT_MATCH_IPVS=y +CONFIG_IP_VS=y +CONFIG_IP_VS_RR=y +CONFIG_IP_VS_NFCT=y +CONFIG_IP_NF_IPTABLES=y +CONFIG_IP_NF_FILTER=y +CONFIG_IP_NF_NAT=y +CONFIG_IP_NF_TARGET_MASQUERADE=y +CONFIG_IP_NF_TARGET_REDIRECT=y +CONFIG_BRIDGE=y +CONFIG_BRIDGE_NETFILTER=y +CONFIG_XFRM=m +CONFIG_XFRM_USER=m +CONFIG_XFRM_ALGO=m +CONFIG_NET_L3_MASTER_DEV=y + +CONFIG_EXT4_FS=y +CONFIG_EXT4_FS_POSIX_ACL=y +CONFIG_EXT4_FS_SECURITY=y +CONFIG_OVERLAY_FS=y +CONFIG_OVERLAY_FS_METACOPY=y + +CONFIG_CRYPTO_CCM=m +CONFIG_CRYPTO_GCM=m +CONFIG_CRYPTO_CMAC=m +CONFIG_CRYPTO_ARC4=m + +CONFIG_DEVPTS_MULTIPLE_INSTANCES=y diff --git a/buildroot-external/kernel/ovos.config b/buildroot-external/kernel/ovos.config index b4f6f74c..550e49a4 100644 --- a/buildroot-external/kernel/ovos.config +++ b/buildroot-external/kernel/ovos.config @@ -30,8 +30,10 @@ CONFIG_SQUASHFS_LZ4=y CONFIG_BTRFS_FS=m CONFIG_OVERLAY_FS=y -CONFIG_SECCOMP=y -CONFIG_SECCOMP_FILTER=y +# CONFIG_SECCOMP is not set +# CONFIG_AUDIT is not set +# CONFIG_SECURITY is not set +# CONFIG_SECURITY_SELINUX is not set CONFIG_CRYPTO=y CONFIG_CRYPTO_LZ4=y diff --git a/buildroot-external/rootfs-overlay/base/etc/NetworkManager/NetworkManager.conf b/buildroot-external/rootfs-overlay/base/etc/NetworkManager/NetworkManager.conf deleted file mode 100644 index 5bf05ed4..00000000 --- a/buildroot-external/rootfs-overlay/base/etc/NetworkManager/NetworkManager.conf +++ /dev/null @@ -1,22 +0,0 @@ -[main] -dns=default -plugins=keyfile -autoconnect-retries-default=0 -rc-manager=file - -[keyfile] -unmanaged-devices=type:tun;type:veth - -[logging] -backend=journal - -[connection] -connection.mdns=2 -connection.llmnr=2 - -[connectivity] -uri=http://nmcheck.gnome.org/check_network_status.txt -interval=300 - -[device] -wifi.scan-rand-mac-address=no diff --git a/buildroot-external/rootfs-overlay/base/etc/NetworkManager/conf.d/polkit.conf b/buildroot-external/rootfs-overlay/base/etc/NetworkManager/conf.d/polkit.conf deleted file mode 100644 index 11095ae0..00000000 --- a/buildroot-external/rootfs-overlay/base/etc/NetworkManager/conf.d/polkit.conf +++ /dev/null @@ -1,2 +0,0 @@ -[main] -auth-polkit=true diff --git a/buildroot-external/rootfs-overlay/base/etc/NetworkManager/conf.d/wifi-powersave-off.conf b/buildroot-external/rootfs-overlay/base/etc/NetworkManager/conf.d/wifi-powersave-off.conf deleted file mode 100644 index 21aeabdd..00000000 --- a/buildroot-external/rootfs-overlay/base/etc/NetworkManager/conf.d/wifi-powersave-off.conf +++ /dev/null @@ -1,3 +0,0 @@ -[connection] -# Values are 0 (use default), 1 (ignore/don't touch), 2 (disable) or 3 (enable). -wifi.powersave = 2 diff --git a/buildroot-external/rootfs-overlay/base/etc/NetworkManager/system-connections/default b/buildroot-external/rootfs-overlay/base/etc/NetworkManager/system-connections/default deleted file mode 100644 index c80c0e77..00000000 --- a/buildroot-external/rootfs-overlay/base/etc/NetworkManager/system-connections/default +++ /dev/null @@ -1,11 +0,0 @@ -[connection] -id=OpenVoiceOS default -uuid=554628d6-8290-3dea-90c1-9b3b108dc19c -type=802-3-ethernet - -[ipv4] -method=auto - -[ipv6] -addr-gen-mode=stable-privacy -method=auto diff --git a/buildroot-external/rootfs-overlay/base/etc/asound.conf b/buildroot-external/rootfs-overlay/base/etc/asound.conf deleted file mode 100644 index 23e1f11e..00000000 --- a/buildroot-external/rootfs-overlay/base/etc/asound.conf +++ /dev/null @@ -1,14 +0,0 @@ -# Use PulseAudio by default -pcm.!default { - type pulse - fallback "sysdefault" - hint { - show on - description "Default ALSA Output (currently PulseAudio Sound Server)" - } -} - -ctl.!default { - type pulse - fallback "sysdefault" -} diff --git a/buildroot-external/rootfs-overlay/base/etc/mycroft/mycroft.conf b/buildroot-external/rootfs-overlay/base/etc/mycroft/mycroft.conf deleted file mode 100644 index 97128e01..00000000 --- a/buildroot-external/rootfs-overlay/base/etc/mycroft/mycroft.conf +++ /dev/null @@ -1,78 +0,0 @@ -{ - "ready_settings": ["setup", "skills"], - "confirm_listening": true, - "play_wav_cmdline": "paplay %1", - "play_mp3_cmdline": "mpg123 %1", - "ipc_path": "/dev/shm/mycroft/ipc/", - "network_tests": { - "ip_url": "https://api.ipify.org", - "dns_primary": "1.1.1.1", - "dns_secondary": "8.8.8.8", - "web_url": "http://nmcheck.gnome.org/check_network_status.txt", - "web_url_secondary": "https://checkonline.home-assistant.io/online.txt", - "captive_portal_url": "http://nmcheck.gnome.org/check_network_status.txt", - "captive_portal_text": "NetworkManager is online" - }, - "gui": { - "extension": "smartspeaker", - "idle_display_skill": "skill-ovos-homescreen.openvoiceos" - }, - "PHAL": { - "ovos-PHAL-plugin-system": {"sudo": false} - }, - "listener": { - "mute_during_output": false, - "instant_listen": true, - "VAD": { - "module": "ovos-vad-plugin-webrtcvad", - "ovos-vad-plugin-webrtcvad": {"vad_mode": 3} - }, - "retry_mic_init" : false - }, - "hotwords": { - "hey_mycroft": { - "module": "ovos-precise-lite", - "model": "~/.local/share/precise-lite/wakewords/en/hey_mycroft.tflite", - "sensitivity": 0.5, - "trigger_level": 3, - "expected_duration": 3 - } - }, - "stt": { - "fallback_module": "" - }, - "tts": { - "module": "ovos-tts-plugin-mimic3-server", - "fallback_module": "ovos-tts-plugin-mimic", - "ovos-tts-plugin-mimic3-server": { - "voice": "en_UK/apope_low" - } - }, - "skills": { - "wait_for_internet": true, - "autogen_meta": false - }, - "Audio": { - "backends": { - "OCP": { - "type": "ovos_common_play", - "manage_external_players": true, - "active": true, - "youtube_backend": "youtube-dl", - "ydl_backend": "auto" - }, - "vlc": { - "type": "ovos_vlc", - "active": true - }, - "simple": { - "type": "ovos_audio_simple", - "active": true - } - } - }, - "log_level": "INFO", - "logs": { - "path": "/var/log/mycroft" - } -} diff --git a/buildroot-external/rootfs-overlay/base/etc/polkit-1/rules.d/50-org.freedesktop.NetworkManager.rules b/buildroot-external/rootfs-overlay/base/etc/polkit-1/rules.d/50-org.freedesktop.NetworkManager.rules deleted file mode 100644 index 4b50cf88..00000000 --- a/buildroot-external/rootfs-overlay/base/etc/polkit-1/rules.d/50-org.freedesktop.NetworkManager.rules +++ /dev/null @@ -1,8 +0,0 @@ -/* give group 'network' rights to change settings */ -/* taken from https://wiki.archlinux.org/index.php/NetworkManager#Set_up_PolicyKit_permissions */ - -polkit.addRule(function(action, subject) { - if (action.id.indexOf("org.freedesktop.NetworkManager.") == 0 && subject.isInGroup("network")) { - return polkit.Result.YES; - } -}); diff --git a/buildroot-external/rootfs-overlay/base/etc/samba/smb.conf b/buildroot-external/rootfs-overlay/base/etc/samba/smb.conf deleted file mode 100644 index aa1b577b..00000000 --- a/buildroot-external/rootfs-overlay/base/etc/samba/smb.conf +++ /dev/null @@ -1,45 +0,0 @@ -[global] -workgroup = OPENVOICEOS -netbios name = OVOS -log file = /var/log/samba/log.%m -max log size = 1000 -logging = file -panic action = /usr/share/samba/panic-action %d -server role = standalone server -obey pam restrictions = yes -unix password sync = yes -passwd program = /usr/bin/passwd %u -passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* . -pam password change = yes -map to guest = bad user -usershare allow guests = yes - -[Pictures] -path = /home/mycroft/Pictures -public = yes -guest only = yes -writable = yes -force create mode = 0666 -force directory mode = 0777 -browseable = yes -force user = mycroft - -[Documents] -path = /home/mycroft/Documents -public = yes -guest only = yes -writable = yes -force create mode = 0666 -force directory mode = 0777 -browseable = yes -force user = mycroft - -[Music] -path = /home/mycroft/Music -public = yes -guest only = yes -writable = yes -force create mode = 0666 -force directory mode = 0777 -browseable = yes -force user = mycroft diff --git a/buildroot-external/rootfs-overlay/base/etc/shairport-sync.conf b/buildroot-external/rootfs-overlay/base/etc/shairport-sync.conf deleted file mode 100644 index 3d9b7b69..00000000 --- a/buildroot-external/rootfs-overlay/base/etc/shairport-sync.conf +++ /dev/null @@ -1,6 +0,0 @@ -general = { - name = "OpenVoiceOS"; - output_backend = "pa"; - dbus_service_bus = "session"; - mpris_service_bus = "session"; -}; diff --git a/buildroot-external/rootfs-overlay/base/etc/systemd/system/default.target b/buildroot-external/rootfs-overlay/base/etc/systemd/system/default.target deleted file mode 120000 index 670edd0e..00000000 --- a/buildroot-external/rootfs-overlay/base/etc/systemd/system/default.target +++ /dev/null @@ -1 +0,0 @@ -../../../usr/lib/systemd/system/ovos.target \ No newline at end of file diff --git a/buildroot-external/rootfs-overlay/base/etc/tmpfiles.d/pulse.conf b/buildroot-external/rootfs-overlay/base/etc/tmpfiles.d/pulse.conf deleted file mode 100644 index 18fdf6df..00000000 --- a/buildroot-external/rootfs-overlay/base/etc/tmpfiles.d/pulse.conf +++ /dev/null @@ -1,3 +0,0 @@ -d /run/pulse 755 pulse pulse -d /run/pulse/.config 755 pulse pulse -d /run/pulse/.config/pulse 755 pulse pulse diff --git a/buildroot-external/rootfs-overlay/base/etc/usbmount/usbmount.conf b/buildroot-external/rootfs-overlay/base/etc/usbmount/usbmount.conf deleted file mode 100644 index 43c25316..00000000 --- a/buildroot-external/rootfs-overlay/base/etc/usbmount/usbmount.conf +++ /dev/null @@ -1,53 +0,0 @@ -# Configuration file for the usbmount package, which mounts removable -# storage devices when they are plugged in and unmounts them when they -# are removed. - -# Change to zero to disable usbmount -ENABLED=1 - -# Mountpoints: These directories are eligible as mointpoints for -# removable storage devices. A newly plugged in device is mounted on -# the first directory in this list that exists and on which nothing is -# mounted yet. -MOUNTPOINTS="/media/usb0 /media/usb1 /media/usb2 /media/usb3 - /media/usb4 /media/usb5 /media/usb6 /media/usb7" - -# Filesystem types: removable storage devices are only mounted if they -# contain a filesystem type which is in this list. -FILESYSTEMS="vfat ntfs ext2 ext3 ext4 hfsplus exfat f2fs" - -############################################################################# -# WARNING! # -# # -# The "sync" option may not be a good choice to use with flash drives, as # -# it forces a greater amount of writing operating on the drive. This makes # -# the writing speed considerably lower and also leads to a faster wear out # -# of the disk. # -# # -# If you omit it, don't forget to use the command "sync" to synchronize the # -# data on your disk before removing the drive or you may experience data # -# loss. # -# # -# It is highly recommended that you use the pumount command (as a regular # -# user) before unplugging the device. It makes calling the "sync" command # -# and mounting with the sync option unnecessary---this is similar to other # -# operating system's "safely disconnect the device" option. # -############################################################################# -# Mount options: Options passed to the mount command with the -o flag. -# See the warning above regarding removing "sync" from the options. -MOUNTOPTIONS="noexec,nodev,noatime,nodiratime" - -# Filesystem type specific mount options: This variable contains a space -# separated list of strings, each which the form "-fstype=TYPE,OPTIONS". -# -# If a filesystem with a type listed here is mounted, the corresponding -# options are appended to those specificed in the MOUNTOPTIONS variable. -# -# For example, "-fstype=vfat,gid=floppy,dmask=0007,fmask=0117" would add -# the options "gid=floppy,dmask=0007,fmask=0117" when a vfat filesystem -# is mounted. -FS_MOUNTOPTIONS="fstype=vfat,utf8,uid=1000,gid=1000,umask=022 -fstype=ntfs-3g,nls=utf8,uid=1000,gid=1000,umask=022" - -# If set to "yes", more information will be logged via the syslog -# facility. -VERBOSE=no diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.config/json_database/mycroft_backend.json b/buildroot-external/rootfs-overlay/base/home/mycroft/.config/json_database/mycroft_backend.json deleted file mode 100644 index 89a65411..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.config/json_database/mycroft_backend.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "stt": { "module": "google"}, - "backend_port": 6712, - "geolocate": true, - "override_location": false, - "api_version": "v1", - "data_path": "~", - "record_utterances": false, - "record_wakewords": false, - "wolfram_key": "Y7R353-9HQAAL8KKA", - "owm_key": "28fed22898afd4717ce5a1535da1f78c" -} diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.config/shairport-sync/shairport-sync.conf b/buildroot-external/rootfs-overlay/base/home/mycroft/.config/shairport-sync/shairport-sync.conf deleted file mode 100644 index 3d9b7b69..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.config/shairport-sync/shairport-sync.conf +++ /dev/null @@ -1,6 +0,0 @@ -general = { - name = "OpenVoiceOS"; - output_backend = "pa"; - dbus_service_bus = "session"; - mpris_service_bus = "session"; -}; diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.config/spotifyd/spotifyd.conf b/buildroot-external/rootfs-overlay/base/home/mycroft/.config/spotifyd/spotifyd.conf deleted file mode 100644 index 4ec60812..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.config/spotifyd/spotifyd.conf +++ /dev/null @@ -1,90 +0,0 @@ -[spotifyd] -# Your Spotify account name. -#username = "username" - -# Your Spotify account password. -#password = "password" - -# A command that gets executed and can be used to -# retrieve your password. -# The command should return the password on stdout. -# -# This is an alternative to the `password` field. Both -# can't be used simultaneously. -#password_cmd = "command_that_writes_password_to_stdout" - -# If set to true, `spotifyd` tries to look up your -# password in the system's password storage. -# -# This is an alternative to the `password` field. Both -# can't be used simultaneously. -#use_keyring = true - -# -# If set to true, `spotifyd` tries to bind to the session dbus -# and expose MPRIS controls. When running headless, without a dbus session, -# then set this to false to avoid binding errors -# -use_mpris = true - -# The audio backend used to play the your music. To get -# a list of possible backends, run `spotifyd --help`. -backend = "pulseaudio" - -# The alsa audio device to stream audio to. To get a -# list of valid devices, run `aplay -L`, -#device = "alsa_audio_device" # omit for macOS - -# The alsa control device. By default this is the same -# name as the `device` field. -#control = "alsa_audio_device" # omit for macOS - -# The alsa mixer used by `spotifyd`. -#mixer = "PCM" - -# The volume controller. Each one behaves different to -# volume increases. For possible values, run -# `spotifyd --help`. -#volume_controller = "alsa" # use softvol for macOS - -# A command that gets executed in your shell after each song changes. -#on_song_change_hook = "command_to_run_on_playback_events" - -# The name that gets displayed under the connect tab on -# official clients. Spaces are not allowed! -device_name = "OpenVoiceOS" - -# The audio bitrate. 96, 160 or 320 kbit/s -#bitrate = 160 - -# The directory used to cache audio data. This setting can save -# a lot of bandwidth when activated, as it will avoid re-downloading -# audio files when replaying them. -# -# Note: The file path does not get expanded. Environment variables and -# shell placeholders like $HOME or ~ don't work! -#cache_path = "cache_directory" - -# If set to true, audio data does NOT get cached. -#no_audio_cache = true - -# Volume on startup between 0 and 100 -# NOTE: This variable's type will change in v0.4, to a number (instead of string) -#initial_volume = "90" - -# If set to true, enables volume normalisation between songs. -#volume_normalisation = true - -# The normalisation pregain that is applied for each song. -#normalisation_pregain = -10 - -# The port `spotifyd` uses to announce its service over the network. -zeroconf_port = 57621 - -# The proxy `spotifyd` will use to connect to spotify. -#proxy = "http://proxy.example.org:8080" - -# The displayed device type in Spotify clients. -# Can be unknown, computer, tablet, smartphone, speaker, t_v, -# a_v_r (Audio/Video Receiver), s_t_b (Set-Top Box), and audio_dongle. -device_type = "speaker" diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.config/systemd/user/default.target.wants/kdeconnectd.service b/buildroot-external/rootfs-overlay/base/home/mycroft/.config/systemd/user/default.target.wants/kdeconnectd.service deleted file mode 120000 index 42c11023..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.config/systemd/user/default.target.wants/kdeconnectd.service +++ /dev/null @@ -1 +0,0 @@ -../../../../../../usr/lib/systemd/user/kdeconnectd.service \ No newline at end of file diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.config/systemd/user/default.target.wants/mycroft.service b/buildroot-external/rootfs-overlay/base/home/mycroft/.config/systemd/user/default.target.wants/mycroft.service deleted file mode 120000 index 6f7df584..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.config/systemd/user/default.target.wants/mycroft.service +++ /dev/null @@ -1 +0,0 @@ -../../../../../../usr/lib/systemd/user/mycroft.service \ No newline at end of file diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.config/systemd/user/default.target.wants/pulseaudio.service b/buildroot-external/rootfs-overlay/base/home/mycroft/.config/systemd/user/default.target.wants/pulseaudio.service deleted file mode 120000 index b8bfcc31..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.config/systemd/user/default.target.wants/pulseaudio.service +++ /dev/null @@ -1 +0,0 @@ -../../../../../../usr/lib/systemd/user/pulseaudio.service \ No newline at end of file diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.config/systemd/user/default.target.wants/shairport-sync.service b/buildroot-external/rootfs-overlay/base/home/mycroft/.config/systemd/user/default.target.wants/shairport-sync.service deleted file mode 120000 index 39bbea79..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.config/systemd/user/default.target.wants/shairport-sync.service +++ /dev/null @@ -1 +0,0 @@ -../../../../../../usr/lib/systemd/user/shairport-sync.service \ No newline at end of file diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.config/systemd/user/default.target.wants/spotifyd.service b/buildroot-external/rootfs-overlay/base/home/mycroft/.config/systemd/user/default.target.wants/spotifyd.service deleted file mode 120000 index d56b0cfd..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.config/systemd/user/default.target.wants/spotifyd.service +++ /dev/null @@ -1 +0,0 @@ -../../../../../../usr/lib/systemd/user/spotifyd.service \ No newline at end of file diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.config/systemd/user/mycroft.service.wants/mycroft-audio.service b/buildroot-external/rootfs-overlay/base/home/mycroft/.config/systemd/user/mycroft.service.wants/mycroft-audio.service deleted file mode 120000 index a23e08bb..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.config/systemd/user/mycroft.service.wants/mycroft-audio.service +++ /dev/null @@ -1 +0,0 @@ -../../../../../../usr/lib/systemd/user/mycroft-audio.service \ No newline at end of file diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.config/systemd/user/mycroft.service.wants/mycroft-messagebus.service b/buildroot-external/rootfs-overlay/base/home/mycroft/.config/systemd/user/mycroft.service.wants/mycroft-messagebus.service deleted file mode 120000 index a7b459ce..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.config/systemd/user/mycroft.service.wants/mycroft-messagebus.service +++ /dev/null @@ -1 +0,0 @@ -../../../../../../usr/lib/systemd/user/mycroft-messagebus.service \ No newline at end of file diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.config/systemd/user/mycroft.service.wants/mycroft-phal.service b/buildroot-external/rootfs-overlay/base/home/mycroft/.config/systemd/user/mycroft.service.wants/mycroft-phal.service deleted file mode 120000 index fc7fdc5a..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.config/systemd/user/mycroft.service.wants/mycroft-phal.service +++ /dev/null @@ -1 +0,0 @@ -../../../../../../usr/lib/systemd/user/mycroft-phal.service \ No newline at end of file diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.config/systemd/user/mycroft.service.wants/mycroft-skills.service b/buildroot-external/rootfs-overlay/base/home/mycroft/.config/systemd/user/mycroft.service.wants/mycroft-skills.service deleted file mode 120000 index 1027d626..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.config/systemd/user/mycroft.service.wants/mycroft-skills.service +++ /dev/null @@ -1 +0,0 @@ -../../../../../../usr/lib/systemd/user/mycroft-skills.service \ No newline at end of file diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.config/systemd/user/mycroft.service.wants/mycroft-voice.service b/buildroot-external/rootfs-overlay/base/home/mycroft/.config/systemd/user/mycroft.service.wants/mycroft-voice.service deleted file mode 120000 index 7a66555f..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.config/systemd/user/mycroft.service.wants/mycroft-voice.service +++ /dev/null @@ -1 +0,0 @@ -../../../../../../usr/lib/systemd/user/mycroft-voice.service \ No newline at end of file diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.config/systemd/user/sockets.target.wants/pulseaudio.socket b/buildroot-external/rootfs-overlay/base/home/mycroft/.config/systemd/user/sockets.target.wants/pulseaudio.socket deleted file mode 120000 index 76333250..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.config/systemd/user/sockets.target.wants/pulseaudio.socket +++ /dev/null @@ -1 +0,0 @@ -../../../../../../usr/lib/systemd/user/pulseaudio.socket \ No newline at end of file diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/colour-0.1.5.dist-info/DESCRIPTION.rst b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/colour-0.1.5.dist-info/DESCRIPTION.rst deleted file mode 100644 index 8b36b412..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/colour-0.1.5.dist-info/DESCRIPTION.rst +++ /dev/null @@ -1,606 +0,0 @@ -====== -Colour -====== - -.. image:: http://img.shields.io/pypi/v/colour.svg?style=flat - :target: https://pypi.python.org/pypi/colour/ - :alt: Latest PyPI version - -.. image:: https://img.shields.io/pypi/l/gitchangelog.svg?style=flat - :target: https://github.com/vaab/gitchangelog/blob/master/LICENSE - :alt: License - -.. image:: https://img.shields.io/pypi/pyversions/gitchangelog.svg?style=flat - :target: https://pypi.python.org/pypi/gitchangelog/ - :alt: Compatible python versions - -.. image:: http://img.shields.io/pypi/dm/colour.svg?style=flat - :target: https://pypi.python.org/pypi/colour/ - :alt: Number of PyPI downloads - -.. image:: http://img.shields.io/travis/vaab/colour/master.svg?style=flat - :target: https://travis-ci.org/vaab/colour/ - :alt: Travis CI build status - -.. image:: https://img.shields.io/appveyor/ci/vaab/colour.svg - :target: https://ci.appveyor.com/project/vaab/colour/branch/master - :alt: Appveyor CI build status - -.. image:: http://img.shields.io/codecov/c/github/vaab/colour.svg?style=flat - :target: https://codecov.io/gh/vaab/colour/ - :alt: Test coverage - - -Converts and manipulates common color representation (RGB, HSL, web, ...) - - -Feature -======= - -- Damn simple and pythonic way to manipulate color representation (see - examples below) - -- Full conversion between RGB, HSL, 6-digit hex, 3-digit hex, human color - -- One object (``Color``) or bunch of single purpose function (``rgb2hex``, - ``hsl2rgb`` ...) - -- ``web`` format that use the smallest representation between - 6-digit (e.g. ``#fa3b2c``), 3-digit (e.g. ``#fbb``), fully spelled - color (e.g. ``white``), following `W3C color naming`_ for compatible - CSS or HTML color specifications. - -- smooth intuitive color scale generation choosing N color gradients. - -- can pick colors for you to identify objects of your application. - - -.. _W3C color naming: http://www.w3.org/TR/css3-color/#svg-color - - -Installation -============ - -You don't need to download the GIT version of the code as ``colour`` is -available on the PyPI. So you should be able to run:: - - pip install colour - -If you have downloaded the GIT sources, then you could add the ``colour.py`` -directly to one of your ``site-packages`` (thanks to a symlink). Or install -the current version via traditional:: - - python setup.py install - -And if you don't have the GIT sources but would like to get the latest -master or branch from github, you could also:: - - pip install git+https://github.com/vaab/colour - -Or even select a specific revision (branch/tag/commit):: - - pip install git+https://github.com/vaab/colour@master - - -Usage -===== - -To get complete demo of each function, please read the source code which is -heavily documented and provide a lot of examples in doctest format. - -Here is a reduced sample of a common usage scenario: - - -Instantiation -------------- - -Let's create blue color:: - - >>> from colour import Color - >>> c = Color("blue") - >>> c - - -Please note that all of these are equivalent examples to create the red color:: - - Color("red") ## human, web compatible representation - Color(red=1) ## default amount of blue and green is 0.0 - Color("blue", hue=0) ## hue of blue is 0.66, hue of red is 0.0 - Color("#f00") ## standard 3 hex digit web compatible representation - Color("#ff0000") ## standard 6 hex digit web compatible representation - Color(hue=0, saturation=1, luminance=0.5) - Color(hsl=(0, 1, 0.5)) ## full 3-uple HSL specification - Color(rgb=(1, 0, 0)) ## full 3-uple RGB specification - Color(Color("red")) ## recursion doesn't break object - - -Reading values --------------- - -Several representations are accessible:: - - >>> c.hex - '#00f' - >>> c.hsl # doctest: +ELLIPSIS - (0.66..., 1.0, 0.5) - >>> c.rgb - (0.0, 0.0, 1.0) - -And their different parts are also independently accessible, as the different -amount of red, blue, green, in the RGB format:: - - >>> c.red - 0.0 - >>> c.blue - 1.0 - >>> c.green - 0.0 - -Or the hue, saturation and luminance of the HSL representation:: - - >>> c.hue # doctest: +ELLIPSIS - 0.66... - >>> c.saturation - 1.0 - >>> c.luminance - 0.5 - -A note on the ``.hex`` property, it'll return the smallest valid value -when possible. If you are only interested by the long value, use -``.hex_l``:: - - >>> c.hex_l - '#0000ff' - - -Modifying color objects ------------------------ - -All of these properties are read/write, so let's add some red to this color:: - - >>> c.red = 1 - >>> c - - -We might want to de-saturate this color:: - - >>> c.saturation = 0.5 - >>> c - - -And of course, the string conversion will give the web representation which is -human, or 3-digit, or 6-digit hex representation depending which is usable:: - - >>> "%s" % c - '#bf40bf' - - >>> c.luminance = 1 - >>> "%s" % c - 'white' - - -Ranges of colors ----------------- - -You can get some color scale of variation between two ``Color`` objects quite -easily. Here, is the color scale of the rainbow between red and blue:: - - >>> red = Color("red") - >>> blue = Color("blue") - >>> list(red.range_to(blue, 5)) - [, , , , ] - -Or the different amount of gray between black and white:: - - >>> black = Color("black") - >>> white = Color("white") - >>> list(black.range_to(white, 6)) - [, , , , , ] - - -If you have to create graphical representation with color scale -between red and green ('lime' color is full green):: - - >>> lime = Color("lime") - >>> list(red.range_to(lime, 5)) - [, , , , ] - -Notice how naturally, the yellow is displayed in human format and in -the middle of the scale. And that the quite unusual (but compatible) -'chartreuse' color specification has been used in place of the -hexadecimal representation. - - -Color comparison ----------------- - -Sane default -~~~~~~~~~~~~ - -Color comparison is a vast subject. However, it might seem quite straightforward for -you. ``Colour`` uses a configurable default way of comparing color that might suit -your needs:: - - >>> Color("red") == Color("#f00") == Color("blue", hue=0) - True - -The default comparison algorithm focuses only on the "web" representation which is -equivalent to comparing the long hex representation (e.g. #FF0000) or to be more -specific, it is equivalent to compare the amount of red, green, and blue composition -of the RGB representation, each of these value being quantized to a 256 value scale. - -This default comparison is a practical and convenient way to measure the actual -color equivalence on your screen, or in your video card memory. - -But this comparison wouldn't make the difference between a black red, and a -black blue, which both are black:: - - >>> black_red = Color("red", luminance=0) - >>> black_blue = Color("blue", luminance=0) - - >>> black_red == black_blue - True - - -Customization -~~~~~~~~~~~~~ - -But, this is not the sole way to compare two colors. As I'm quite lazy, I'm providing -you a way to customize it to your needs. Thus:: - - >>> from colour import RGB_equivalence, HSL_equivalence - >>> black_red = Color("red", luminance=0, equality=HSL_equivalence) - >>> black_blue = Color("blue", luminance=0, equality=HSL_equivalence) - - >>> black_red == black_blue - False - -As you might have already guessed, the sane default is ``RGB_equivalence``, so:: - - >>> black_red = Color("red", luminance=0, equality=RGB_equivalence) - >>> black_blue = Color("blue", luminance=0, equality=RGB_equivalence) - - >>> black_red == black_blue - True - -Here's how you could implement your unique comparison function:: - - >>> saturation_equivalence = lambda c1, c2: c1.saturation == c2.saturation - >>> red = Color("red", equality=saturation_equivalence) - >>> blue = Color("blue", equality=saturation_equivalence) - >>> white = Color("white", equality=saturation_equivalence) - - >>> red == blue - True - >>> white == red - False - -Note: When comparing 2 colors, *only* the equality function *of the first -color will be used*. Thus:: - - >>> black_red = Color("red", luminance=0, equality=RGB_equivalence) - >>> black_blue = Color("blue", luminance=0, equality=HSL_equivalence) - - >>> black_red == black_blue - True - -But reverse operation is not equivalent !:: - - >>> black_blue == black_red - False - - -Equality to non-Colour objects -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -As a side note, whatever your custom equality function is, it won't be -used if you compare to anything else than a ``Colour`` instance:: - - >>> red = Color("red", equality=lambda c1, c2: True) - >>> blue = Color("blue", equality=lambda c1, c2: True) - -Note that these instances would compare as equal to any other color:: - - >>> red == blue - True - -But on another non-Colour object:: - - >>> red == None - False - >>> red != None - True - -Actually, ``Colour`` instances will, politely enough, leave -the other side of the equality have a chance to decide of the output, -(by executing its own ``__eq__``), so:: - - >>> class OtherColorImplem(object): - ... def __init__(self, color): - ... self.color = color - ... def __eq__(self, other): - ... return self.color == other.web - - >>> alien_red = OtherColorImplem("red") - >>> red == alien_red - True - >>> blue == alien_red - False - -And inequality (using ``__ne__``) are also polite:: - - >>> class AnotherColorImplem(OtherColorImplem): - ... def __ne__(self, other): - ... return self.color != other.web - - >>> new_alien_red = AnotherColorImplem("red") - >>> red != new_alien_red - False - >>> blue != new_alien_red - True - - -Picking arbitrary color for a python object -------------------------------------------- - -Basic Usage -~~~~~~~~~~~ - -Sometimes, you just want to pick a color for an object in your application -often to visually identify this object. Thus, the picked color should be the -same for same objects, and different for different object:: - - >>> foo = object() - >>> bar = object() - - >>> Color(pick_for=foo) # doctest: +ELLIPSIS - - >>> Color(pick_for=foo) == Color(pick_for=foo) - True - >>> Color(pick_for=foo) == Color(pick_for=bar) - False - -Of course, although there's a tiny probability that different strings yield the -same color, most of the time, different inputs will produce different colors. - -Advanced Usage -~~~~~~~~~~~~~~ - -You can customize your color picking algorithm by providing a ``picker``. A -``picker`` is a callable that takes an object, and returns something that can -be instantiated as a color by ``Color``:: - - >>> my_picker = lambda obj: "red" if isinstance(obj, int) else "blue" - >>> Color(pick_for=3, picker=my_picker, pick_key=None) - - >>> Color(pick_for="foo", picker=my_picker, pick_key=None) - - -You might want to use a particular picker, but enforce how the picker will -identify two object as the same (or not). So there's a ``pick_key`` attribute -that is provided and defaults as equivalent of ``hash`` method and if hash is -not supported by your object, it'll default to the ``str`` of your object salted -with the class name. - -Thus:: - - >>> class MyObj(str): pass - >>> my_obj_color = Color(pick_for=MyObj("foo")) - >>> my_str_color = Color(pick_for="foo") - >>> my_obj_color == my_str_color - False - -Please make sure your object is hashable or "stringable" before using the -``RGB_color_picker`` picking mechanism or provide another color picker. Nearly -all python object are hashable by default so this shouldn't be an issue (e.g. -instances of ``object`` and subclasses are hashable). - -Neither ``hash`` nor ``str`` are perfect solution. So feel free to use -``pick_key`` at ``Color`` instantiation time to set your way to identify -objects, for instance:: - - >>> a = object() - >>> b = object() - >>> Color(pick_for=a, pick_key=id) == Color(pick_for=b, pick_key=id) - False - -When choosing a pick key, you should closely consider if you want your color -to be consistent between runs (this is NOT the case with the last example), -or consistent with the content of your object if it is a mutable object. - -Default value of ``pick_key`` and ``picker`` ensures that the same color will -be attributed to same object between different run on different computer for -most python object. - - -Color factory -------------- - -As you might have noticed, there are few attributes that you might want to see -attached to all of your colors as ``equality`` for equality comparison support, -or ``picker``, ``pick_key`` to configure your object color picker. - -You can create a customized ``Color`` factory thanks to the ``make_color_factory``:: - - >>> from colour import make_color_factory, HSL_equivalence, RGB_color_picker - - >>> get_color = make_color_factory( - ... equality=HSL_equivalence, - ... picker=RGB_color_picker, - ... pick_key=str, - ... ) - -All color created thanks to ``CustomColor`` class instead of the default one -would get the specified attributes by default:: - - >>> black_red = get_color("red", luminance=0) - >>> black_blue = get_color("blue", luminance=0) - -Of course, these are always instances of ``Color`` class:: - - >>> isinstance(black_red, Color) - True - -Equality was changed from normal defaults, so:: - - >>> black_red == black_blue - False - -This because the default equivalence of ``Color`` was set to -``HSL_equivalence``. - - -Contributing -============ - -Any suggestion or issue is welcome. Push request are very welcome, -please check out the guidelines. - - -Push Request Guidelines ------------------------ - -You can send any code. I'll look at it and will integrate it myself in -the code base and leave you as the author. This process can take time and -it'll take less time if you follow the following guidelines: - -- check your code with PEP8 or pylint. Try to stick to 80 columns wide. -- separate your commits per smallest concern. -- each commit should pass the tests (to allow easy bisect) -- each functionality/bugfix commit should contain the code, tests, - and doc. -- prior minor commit with typographic or code cosmetic changes are - very welcome. These should be tagged in their commit summary with - ``!minor``. -- the commit message should follow gitchangelog rules (check the git - log to get examples) -- if the commit fixes an issue or finished the implementation of a - feature, please mention it in the summary. - -If you have some questions about guidelines which is not answered here, -please check the current ``git log``, you might find previous commit that -would show you how to deal with your issue. - - -License -======= - -Copyright (c) 2012-2017 Valentin Lab. - -Licensed under the `BSD License`_. - -.. _BSD License: http://raw.github.com/vaab/colour/master/LICENSE - -Changelog -========= - - -0.1.4 (2017-04-19) ------------------- - -Fix -~~~ -- ``rgb2hsl`` would produce invalid hsl triplet when red, blue, green - component would be all very close to ``1.0``. (fixes #30) [Valentin - Lab] - - Typically, saturation would shoot out of range 0.0..1.0. That could then - lead to exceptions being casts afterwards when trying to reconvert this - HSL triplet to RGB values. - - -0.1.3 (2017-04-08) ------------------- - -Fix -~~~ -- Unexpected behavior with ``!=`` operator. (fixes #26) [Valentin Lab] -- Added mention of the ``hex_l`` property. (fixes #27) [Valentin Lab] - - -0.1.2 (2015-09-15) ------------------- - -Fix -~~~ -- Support for corner case 1-wide ``range_to`` color scale. (fixes #18) - [Valentin Lab] - - -0.1.1 (2015-03-29) ------------------- - -Fix -~~~ -- Avoid casting an exception when comparing to non-``Colour`` instances. - (fixes #14) [Riziq Sayegh] - - -0.0.6 (2014-11-18) ------------------- - -New -~~~ -- Provide all missing *2* function by combination with other existing - ones (fixes #13). [Valentin Lab] -- Provide full access to any color name in HSL, RGB, HEX convenience - instances. [Valentin Lab] - - Now you can call ``colour.HSL.cyan``, or ``colour.HEX.red`` for a direct encoding of - ``human`` colour labels to the 3 representations. - - -0.0.5 (2013-09-16) ------------------- - -New -~~~ -- Color names are case insensitive. [Chris Priest] - - The color-name structure have their names capitalized. And color names - that are made of only one word will be displayed lowercased. - -Fix -~~~ -- Now using W3C color recommandation. [Chris Priest] - - Was using X11 color scheme before, which is slightly different from - W3C web color specifications. -- Inconsistency in licence information (removed GPL mention). (fixes #8) - [Valentin Lab] -- Removed ``gitchangelog`` from ``setup.py`` require list. (fixes #9) - [Valentin Lab] - - -0.0.4 (2013-06-21) ------------------- - -New -~~~ -- Added ``make_color_factory`` to customize some common color - attributes. [Valentin Lab] -- Pick color to identify any python object (fixes #6) [Jonathan Ballet] -- Equality support between colors, customizable if needed. (fixes #3) - [Valentin Lab] - - -0.0.3 (2013-06-19) ------------------- - -New -~~~ -- Colour is now compatible with python3. [Ryan Leckey] - - -0.0.1 (2012-06-11) ------------------- -- First import. [Valentin Lab] - -TODO -==== - -- ANSI 16-color and 256-color escape sequence generation -- YUV, HSV, CMYK support - - - diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/colour-0.1.5.dist-info/INSTALLER b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/colour-0.1.5.dist-info/INSTALLER deleted file mode 100644 index a1b589e3..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/colour-0.1.5.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/colour-0.1.5.dist-info/LICENSE.txt b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/colour-0.1.5.dist-info/LICENSE.txt deleted file mode 100644 index c4ed93bd..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/colour-0.1.5.dist-info/LICENSE.txt +++ /dev/null @@ -1,23 +0,0 @@ -Copyright (c) 2012-2017, Valentin Lab -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/colour-0.1.5.dist-info/METADATA b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/colour-0.1.5.dist-info/METADATA deleted file mode 100644 index ce2ad8ad..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/colour-0.1.5.dist-info/METADATA +++ /dev/null @@ -1,630 +0,0 @@ -Metadata-Version: 2.0 -Name: colour -Version: 0.1.5 -Summary: converts and manipulates various color representation (HSL, RVB, web, X11, ...) -Home-page: http://github.com/vaab/colour -Author: Valentin LAB -Author-email: valentin.lab@kalysto.org -License: BSD 3-Clause License -Platform: UNKNOWN -Classifier: Programming Language :: Python -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Development Status :: 3 - Alpha -Classifier: License :: OSI Approved :: BSD License -Classifier: Intended Audience :: Developers -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.3 -Classifier: Programming Language :: Python :: 3.4 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: 3.6 -Provides-Extra: test -Requires-Dist: nose; extra == 'test' - -====== -Colour -====== - -.. image:: http://img.shields.io/pypi/v/colour.svg?style=flat - :target: https://pypi.python.org/pypi/colour/ - :alt: Latest PyPI version - -.. image:: https://img.shields.io/pypi/l/gitchangelog.svg?style=flat - :target: https://github.com/vaab/gitchangelog/blob/master/LICENSE - :alt: License - -.. image:: https://img.shields.io/pypi/pyversions/gitchangelog.svg?style=flat - :target: https://pypi.python.org/pypi/gitchangelog/ - :alt: Compatible python versions - -.. image:: http://img.shields.io/pypi/dm/colour.svg?style=flat - :target: https://pypi.python.org/pypi/colour/ - :alt: Number of PyPI downloads - -.. image:: http://img.shields.io/travis/vaab/colour/master.svg?style=flat - :target: https://travis-ci.org/vaab/colour/ - :alt: Travis CI build status - -.. image:: https://img.shields.io/appveyor/ci/vaab/colour.svg - :target: https://ci.appveyor.com/project/vaab/colour/branch/master - :alt: Appveyor CI build status - -.. image:: http://img.shields.io/codecov/c/github/vaab/colour.svg?style=flat - :target: https://codecov.io/gh/vaab/colour/ - :alt: Test coverage - - -Converts and manipulates common color representation (RGB, HSL, web, ...) - - -Feature -======= - -- Damn simple and pythonic way to manipulate color representation (see - examples below) - -- Full conversion between RGB, HSL, 6-digit hex, 3-digit hex, human color - -- One object (``Color``) or bunch of single purpose function (``rgb2hex``, - ``hsl2rgb`` ...) - -- ``web`` format that use the smallest representation between - 6-digit (e.g. ``#fa3b2c``), 3-digit (e.g. ``#fbb``), fully spelled - color (e.g. ``white``), following `W3C color naming`_ for compatible - CSS or HTML color specifications. - -- smooth intuitive color scale generation choosing N color gradients. - -- can pick colors for you to identify objects of your application. - - -.. _W3C color naming: http://www.w3.org/TR/css3-color/#svg-color - - -Installation -============ - -You don't need to download the GIT version of the code as ``colour`` is -available on the PyPI. So you should be able to run:: - - pip install colour - -If you have downloaded the GIT sources, then you could add the ``colour.py`` -directly to one of your ``site-packages`` (thanks to a symlink). Or install -the current version via traditional:: - - python setup.py install - -And if you don't have the GIT sources but would like to get the latest -master or branch from github, you could also:: - - pip install git+https://github.com/vaab/colour - -Or even select a specific revision (branch/tag/commit):: - - pip install git+https://github.com/vaab/colour@master - - -Usage -===== - -To get complete demo of each function, please read the source code which is -heavily documented and provide a lot of examples in doctest format. - -Here is a reduced sample of a common usage scenario: - - -Instantiation -------------- - -Let's create blue color:: - - >>> from colour import Color - >>> c = Color("blue") - >>> c - - -Please note that all of these are equivalent examples to create the red color:: - - Color("red") ## human, web compatible representation - Color(red=1) ## default amount of blue and green is 0.0 - Color("blue", hue=0) ## hue of blue is 0.66, hue of red is 0.0 - Color("#f00") ## standard 3 hex digit web compatible representation - Color("#ff0000") ## standard 6 hex digit web compatible representation - Color(hue=0, saturation=1, luminance=0.5) - Color(hsl=(0, 1, 0.5)) ## full 3-uple HSL specification - Color(rgb=(1, 0, 0)) ## full 3-uple RGB specification - Color(Color("red")) ## recursion doesn't break object - - -Reading values --------------- - -Several representations are accessible:: - - >>> c.hex - '#00f' - >>> c.hsl # doctest: +ELLIPSIS - (0.66..., 1.0, 0.5) - >>> c.rgb - (0.0, 0.0, 1.0) - -And their different parts are also independently accessible, as the different -amount of red, blue, green, in the RGB format:: - - >>> c.red - 0.0 - >>> c.blue - 1.0 - >>> c.green - 0.0 - -Or the hue, saturation and luminance of the HSL representation:: - - >>> c.hue # doctest: +ELLIPSIS - 0.66... - >>> c.saturation - 1.0 - >>> c.luminance - 0.5 - -A note on the ``.hex`` property, it'll return the smallest valid value -when possible. If you are only interested by the long value, use -``.hex_l``:: - - >>> c.hex_l - '#0000ff' - - -Modifying color objects ------------------------ - -All of these properties are read/write, so let's add some red to this color:: - - >>> c.red = 1 - >>> c - - -We might want to de-saturate this color:: - - >>> c.saturation = 0.5 - >>> c - - -And of course, the string conversion will give the web representation which is -human, or 3-digit, or 6-digit hex representation depending which is usable:: - - >>> "%s" % c - '#bf40bf' - - >>> c.luminance = 1 - >>> "%s" % c - 'white' - - -Ranges of colors ----------------- - -You can get some color scale of variation between two ``Color`` objects quite -easily. Here, is the color scale of the rainbow between red and blue:: - - >>> red = Color("red") - >>> blue = Color("blue") - >>> list(red.range_to(blue, 5)) - [, , , , ] - -Or the different amount of gray between black and white:: - - >>> black = Color("black") - >>> white = Color("white") - >>> list(black.range_to(white, 6)) - [, , , , , ] - - -If you have to create graphical representation with color scale -between red and green ('lime' color is full green):: - - >>> lime = Color("lime") - >>> list(red.range_to(lime, 5)) - [, , , , ] - -Notice how naturally, the yellow is displayed in human format and in -the middle of the scale. And that the quite unusual (but compatible) -'chartreuse' color specification has been used in place of the -hexadecimal representation. - - -Color comparison ----------------- - -Sane default -~~~~~~~~~~~~ - -Color comparison is a vast subject. However, it might seem quite straightforward for -you. ``Colour`` uses a configurable default way of comparing color that might suit -your needs:: - - >>> Color("red") == Color("#f00") == Color("blue", hue=0) - True - -The default comparison algorithm focuses only on the "web" representation which is -equivalent to comparing the long hex representation (e.g. #FF0000) or to be more -specific, it is equivalent to compare the amount of red, green, and blue composition -of the RGB representation, each of these value being quantized to a 256 value scale. - -This default comparison is a practical and convenient way to measure the actual -color equivalence on your screen, or in your video card memory. - -But this comparison wouldn't make the difference between a black red, and a -black blue, which both are black:: - - >>> black_red = Color("red", luminance=0) - >>> black_blue = Color("blue", luminance=0) - - >>> black_red == black_blue - True - - -Customization -~~~~~~~~~~~~~ - -But, this is not the sole way to compare two colors. As I'm quite lazy, I'm providing -you a way to customize it to your needs. Thus:: - - >>> from colour import RGB_equivalence, HSL_equivalence - >>> black_red = Color("red", luminance=0, equality=HSL_equivalence) - >>> black_blue = Color("blue", luminance=0, equality=HSL_equivalence) - - >>> black_red == black_blue - False - -As you might have already guessed, the sane default is ``RGB_equivalence``, so:: - - >>> black_red = Color("red", luminance=0, equality=RGB_equivalence) - >>> black_blue = Color("blue", luminance=0, equality=RGB_equivalence) - - >>> black_red == black_blue - True - -Here's how you could implement your unique comparison function:: - - >>> saturation_equivalence = lambda c1, c2: c1.saturation == c2.saturation - >>> red = Color("red", equality=saturation_equivalence) - >>> blue = Color("blue", equality=saturation_equivalence) - >>> white = Color("white", equality=saturation_equivalence) - - >>> red == blue - True - >>> white == red - False - -Note: When comparing 2 colors, *only* the equality function *of the first -color will be used*. Thus:: - - >>> black_red = Color("red", luminance=0, equality=RGB_equivalence) - >>> black_blue = Color("blue", luminance=0, equality=HSL_equivalence) - - >>> black_red == black_blue - True - -But reverse operation is not equivalent !:: - - >>> black_blue == black_red - False - - -Equality to non-Colour objects -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -As a side note, whatever your custom equality function is, it won't be -used if you compare to anything else than a ``Colour`` instance:: - - >>> red = Color("red", equality=lambda c1, c2: True) - >>> blue = Color("blue", equality=lambda c1, c2: True) - -Note that these instances would compare as equal to any other color:: - - >>> red == blue - True - -But on another non-Colour object:: - - >>> red == None - False - >>> red != None - True - -Actually, ``Colour`` instances will, politely enough, leave -the other side of the equality have a chance to decide of the output, -(by executing its own ``__eq__``), so:: - - >>> class OtherColorImplem(object): - ... def __init__(self, color): - ... self.color = color - ... def __eq__(self, other): - ... return self.color == other.web - - >>> alien_red = OtherColorImplem("red") - >>> red == alien_red - True - >>> blue == alien_red - False - -And inequality (using ``__ne__``) are also polite:: - - >>> class AnotherColorImplem(OtherColorImplem): - ... def __ne__(self, other): - ... return self.color != other.web - - >>> new_alien_red = AnotherColorImplem("red") - >>> red != new_alien_red - False - >>> blue != new_alien_red - True - - -Picking arbitrary color for a python object -------------------------------------------- - -Basic Usage -~~~~~~~~~~~ - -Sometimes, you just want to pick a color for an object in your application -often to visually identify this object. Thus, the picked color should be the -same for same objects, and different for different object:: - - >>> foo = object() - >>> bar = object() - - >>> Color(pick_for=foo) # doctest: +ELLIPSIS - - >>> Color(pick_for=foo) == Color(pick_for=foo) - True - >>> Color(pick_for=foo) == Color(pick_for=bar) - False - -Of course, although there's a tiny probability that different strings yield the -same color, most of the time, different inputs will produce different colors. - -Advanced Usage -~~~~~~~~~~~~~~ - -You can customize your color picking algorithm by providing a ``picker``. A -``picker`` is a callable that takes an object, and returns something that can -be instantiated as a color by ``Color``:: - - >>> my_picker = lambda obj: "red" if isinstance(obj, int) else "blue" - >>> Color(pick_for=3, picker=my_picker, pick_key=None) - - >>> Color(pick_for="foo", picker=my_picker, pick_key=None) - - -You might want to use a particular picker, but enforce how the picker will -identify two object as the same (or not). So there's a ``pick_key`` attribute -that is provided and defaults as equivalent of ``hash`` method and if hash is -not supported by your object, it'll default to the ``str`` of your object salted -with the class name. - -Thus:: - - >>> class MyObj(str): pass - >>> my_obj_color = Color(pick_for=MyObj("foo")) - >>> my_str_color = Color(pick_for="foo") - >>> my_obj_color == my_str_color - False - -Please make sure your object is hashable or "stringable" before using the -``RGB_color_picker`` picking mechanism or provide another color picker. Nearly -all python object are hashable by default so this shouldn't be an issue (e.g. -instances of ``object`` and subclasses are hashable). - -Neither ``hash`` nor ``str`` are perfect solution. So feel free to use -``pick_key`` at ``Color`` instantiation time to set your way to identify -objects, for instance:: - - >>> a = object() - >>> b = object() - >>> Color(pick_for=a, pick_key=id) == Color(pick_for=b, pick_key=id) - False - -When choosing a pick key, you should closely consider if you want your color -to be consistent between runs (this is NOT the case with the last example), -or consistent with the content of your object if it is a mutable object. - -Default value of ``pick_key`` and ``picker`` ensures that the same color will -be attributed to same object between different run on different computer for -most python object. - - -Color factory -------------- - -As you might have noticed, there are few attributes that you might want to see -attached to all of your colors as ``equality`` for equality comparison support, -or ``picker``, ``pick_key`` to configure your object color picker. - -You can create a customized ``Color`` factory thanks to the ``make_color_factory``:: - - >>> from colour import make_color_factory, HSL_equivalence, RGB_color_picker - - >>> get_color = make_color_factory( - ... equality=HSL_equivalence, - ... picker=RGB_color_picker, - ... pick_key=str, - ... ) - -All color created thanks to ``CustomColor`` class instead of the default one -would get the specified attributes by default:: - - >>> black_red = get_color("red", luminance=0) - >>> black_blue = get_color("blue", luminance=0) - -Of course, these are always instances of ``Color`` class:: - - >>> isinstance(black_red, Color) - True - -Equality was changed from normal defaults, so:: - - >>> black_red == black_blue - False - -This because the default equivalence of ``Color`` was set to -``HSL_equivalence``. - - -Contributing -============ - -Any suggestion or issue is welcome. Push request are very welcome, -please check out the guidelines. - - -Push Request Guidelines ------------------------ - -You can send any code. I'll look at it and will integrate it myself in -the code base and leave you as the author. This process can take time and -it'll take less time if you follow the following guidelines: - -- check your code with PEP8 or pylint. Try to stick to 80 columns wide. -- separate your commits per smallest concern. -- each commit should pass the tests (to allow easy bisect) -- each functionality/bugfix commit should contain the code, tests, - and doc. -- prior minor commit with typographic or code cosmetic changes are - very welcome. These should be tagged in their commit summary with - ``!minor``. -- the commit message should follow gitchangelog rules (check the git - log to get examples) -- if the commit fixes an issue or finished the implementation of a - feature, please mention it in the summary. - -If you have some questions about guidelines which is not answered here, -please check the current ``git log``, you might find previous commit that -would show you how to deal with your issue. - - -License -======= - -Copyright (c) 2012-2017 Valentin Lab. - -Licensed under the `BSD License`_. - -.. _BSD License: http://raw.github.com/vaab/colour/master/LICENSE - -Changelog -========= - - -0.1.4 (2017-04-19) ------------------- - -Fix -~~~ -- ``rgb2hsl`` would produce invalid hsl triplet when red, blue, green - component would be all very close to ``1.0``. (fixes #30) [Valentin - Lab] - - Typically, saturation would shoot out of range 0.0..1.0. That could then - lead to exceptions being casts afterwards when trying to reconvert this - HSL triplet to RGB values. - - -0.1.3 (2017-04-08) ------------------- - -Fix -~~~ -- Unexpected behavior with ``!=`` operator. (fixes #26) [Valentin Lab] -- Added mention of the ``hex_l`` property. (fixes #27) [Valentin Lab] - - -0.1.2 (2015-09-15) ------------------- - -Fix -~~~ -- Support for corner case 1-wide ``range_to`` color scale. (fixes #18) - [Valentin Lab] - - -0.1.1 (2015-03-29) ------------------- - -Fix -~~~ -- Avoid casting an exception when comparing to non-``Colour`` instances. - (fixes #14) [Riziq Sayegh] - - -0.0.6 (2014-11-18) ------------------- - -New -~~~ -- Provide all missing *2* function by combination with other existing - ones (fixes #13). [Valentin Lab] -- Provide full access to any color name in HSL, RGB, HEX convenience - instances. [Valentin Lab] - - Now you can call ``colour.HSL.cyan``, or ``colour.HEX.red`` for a direct encoding of - ``human`` colour labels to the 3 representations. - - -0.0.5 (2013-09-16) ------------------- - -New -~~~ -- Color names are case insensitive. [Chris Priest] - - The color-name structure have their names capitalized. And color names - that are made of only one word will be displayed lowercased. - -Fix -~~~ -- Now using W3C color recommandation. [Chris Priest] - - Was using X11 color scheme before, which is slightly different from - W3C web color specifications. -- Inconsistency in licence information (removed GPL mention). (fixes #8) - [Valentin Lab] -- Removed ``gitchangelog`` from ``setup.py`` require list. (fixes #9) - [Valentin Lab] - - -0.0.4 (2013-06-21) ------------------- - -New -~~~ -- Added ``make_color_factory`` to customize some common color - attributes. [Valentin Lab] -- Pick color to identify any python object (fixes #6) [Jonathan Ballet] -- Equality support between colors, customizable if needed. (fixes #3) - [Valentin Lab] - - -0.0.3 (2013-06-19) ------------------- - -New -~~~ -- Colour is now compatible with python3. [Ryan Leckey] - - -0.0.1 (2012-06-11) ------------------- -- First import. [Valentin Lab] - -TODO -==== - -- ANSI 16-color and 256-color escape sequence generation -- YUV, HSV, CMYK support - - - diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/colour-0.1.5.dist-info/RECORD b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/colour-0.1.5.dist-info/RECORD deleted file mode 100644 index 351a0ed4..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/colour-0.1.5.dist-info/RECORD +++ /dev/null @@ -1,11 +0,0 @@ -colour-0.1.5.dist-info/DESCRIPTION.rst,sha256=hPBkXALLft1zfCftLr--oylXrhnxFIXvRVk3ga--bK8,17325 -colour-0.1.5.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -colour-0.1.5.dist-info/LICENSE.txt,sha256=jwhqMkd7-dP7p3VMptM6CpLlsx0DZfmEdg3GigdOQng,1304 -colour-0.1.5.dist-info/METADATA,sha256=1dIO3yNuvoAan1hBE9_y766TbXs9cKRjEuIUI92nUhE,18273 -colour-0.1.5.dist-info/RECORD,, -colour-0.1.5.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -colour-0.1.5.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110 -colour-0.1.5.dist-info/metadata.json,sha256=OviC7TmmKwtRUjauJE5IrjD9kyga_JzrCUZQri6L1xo,1090 -colour-0.1.5.dist-info/top_level.txt,sha256=XKC-SRGJZMW4pzXxl1NWLlZYzRFz7JuWiOJSkQfrWOE,7 -colour.py,sha256=GNhLVa29gX2sIT4h79BbnyEJeZDa7uSRt49Cz1zJL_U,28693 -colour.pyc,, diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/colour-0.1.5.dist-info/WHEEL b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/colour-0.1.5.dist-info/WHEEL deleted file mode 100644 index 8b6dd1b5..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/colour-0.1.5.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.29.0) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/colour-0.1.5.dist-info/metadata.json b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/colour-0.1.5.dist-info/metadata.json deleted file mode 100644 index dde02cd3..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/colour-0.1.5.dist-info/metadata.json +++ /dev/null @@ -1 +0,0 @@ -{"classifiers": ["Programming Language :: Python", "Topic :: Software Development :: Libraries :: Python Modules", "Development Status :: 3 - Alpha", "License :: OSI Approved :: BSD License", "Intended Audience :: Developers", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6"], "extensions": {"python.details": {"contacts": [{"email": "valentin.lab@kalysto.org", "name": "Valentin LAB", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst", "license": "LICENSE.txt"}, "project_urls": {"Home": "http://github.com/vaab/colour"}}}, "extras": ["test"], "generator": "bdist_wheel (0.29.0)", "license": "BSD 3-Clause License", "metadata_version": "2.0", "name": "colour", "run_requires": [{"extra": "test", "requires": ["nose"]}], "summary": "converts and manipulates various color representation (HSL, RVB, web, X11, ...)", "version": "0.1.5"} \ No newline at end of file diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/colour-0.1.5.dist-info/top_level.txt b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/colour-0.1.5.dist-info/top_level.txt deleted file mode 100644 index b0d95faa..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/colour-0.1.5.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -colour diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/colour.py b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/colour.py deleted file mode 100644 index 1bd48e82..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/colour.py +++ /dev/null @@ -1,1124 +0,0 @@ -# -*- coding: utf-8 -*- -"""Color Library - -.. :doctest: - -This module defines several color formats that can be converted to one or -another. - -Formats -------- - -HSL: - 3-uple of Hue, Saturation, Lightness all between 0.0 and 1.0 - -RGB: - 3-uple of Red, Green, Blue all between 0.0 and 1.0 - -HEX: - string object beginning with '#' and with red, green, blue value. - This format accept color in 3 or 6 value ex: '#fff' or '#ffffff' - -WEB: - string object that defaults to HEX representation or human if possible - -Usage ------ - -Several function exists to convert from one format to another. But all -function are not written. So the best way is to use the object Color. - -Please see the documentation of this object for more information. - -.. note:: Some constants are defined for convenience in HSL, RGB, HEX - -""" - -from __future__ import with_statement, print_function - -import hashlib -import re -import sys - - -## -## Some Constants -## - -## Soften inequalities and some rounding issue based on float -FLOAT_ERROR = 0.0000005 - - -RGB_TO_COLOR_NAMES = { - (0, 0, 0): ['Black'], - (0, 0, 128): ['Navy', 'NavyBlue'], - (0, 0, 139): ['DarkBlue'], - (0, 0, 205): ['MediumBlue'], - (0, 0, 255): ['Blue'], - (0, 100, 0): ['DarkGreen'], - (0, 128, 0): ['Green'], - (0, 139, 139): ['DarkCyan'], - (0, 191, 255): ['DeepSkyBlue'], - (0, 206, 209): ['DarkTurquoise'], - (0, 250, 154): ['MediumSpringGreen'], - (0, 255, 0): ['Lime'], - (0, 255, 127): ['SpringGreen'], - (0, 255, 255): ['Cyan', 'Aqua'], - (25, 25, 112): ['MidnightBlue'], - (30, 144, 255): ['DodgerBlue'], - (32, 178, 170): ['LightSeaGreen'], - (34, 139, 34): ['ForestGreen'], - (46, 139, 87): ['SeaGreen'], - (47, 79, 79): ['DarkSlateGray', 'DarkSlateGrey'], - (50, 205, 50): ['LimeGreen'], - (60, 179, 113): ['MediumSeaGreen'], - (64, 224, 208): ['Turquoise'], - (65, 105, 225): ['RoyalBlue'], - (70, 130, 180): ['SteelBlue'], - (72, 61, 139): ['DarkSlateBlue'], - (72, 209, 204): ['MediumTurquoise'], - (75, 0, 130): ['Indigo'], - (85, 107, 47): ['DarkOliveGreen'], - (95, 158, 160): ['CadetBlue'], - (100, 149, 237): ['CornflowerBlue'], - (102, 205, 170): ['MediumAquamarine'], - (105, 105, 105): ['DimGray', 'DimGrey'], - (106, 90, 205): ['SlateBlue'], - (107, 142, 35): ['OliveDrab'], - (112, 128, 144): ['SlateGray', 'SlateGrey'], - (119, 136, 153): ['LightSlateGray', 'LightSlateGrey'], - (123, 104, 238): ['MediumSlateBlue'], - (124, 252, 0): ['LawnGreen'], - (127, 255, 0): ['Chartreuse'], - (127, 255, 212): ['Aquamarine'], - (128, 0, 0): ['Maroon'], - (128, 0, 128): ['Purple'], - (128, 128, 0): ['Olive'], - (128, 128, 128): ['Gray', 'Grey'], - (132, 112, 255): ['LightSlateBlue'], - (135, 206, 235): ['SkyBlue'], - (135, 206, 250): ['LightSkyBlue'], - (138, 43, 226): ['BlueViolet'], - (139, 0, 0): ['DarkRed'], - (139, 0, 139): ['DarkMagenta'], - (139, 69, 19): ['SaddleBrown'], - (143, 188, 143): ['DarkSeaGreen'], - (144, 238, 144): ['LightGreen'], - (147, 112, 219): ['MediumPurple'], - (148, 0, 211): ['DarkViolet'], - (152, 251, 152): ['PaleGreen'], - (153, 50, 204): ['DarkOrchid'], - (154, 205, 50): ['YellowGreen'], - (160, 82, 45): ['Sienna'], - (165, 42, 42): ['Brown'], - (169, 169, 169): ['DarkGray', 'DarkGrey'], - (173, 216, 230): ['LightBlue'], - (173, 255, 47): ['GreenYellow'], - (175, 238, 238): ['PaleTurquoise'], - (176, 196, 222): ['LightSteelBlue'], - (176, 224, 230): ['PowderBlue'], - (178, 34, 34): ['Firebrick'], - (184, 134, 11): ['DarkGoldenrod'], - (186, 85, 211): ['MediumOrchid'], - (188, 143, 143): ['RosyBrown'], - (189, 183, 107): ['DarkKhaki'], - (192, 192, 192): ['Silver'], - (199, 21, 133): ['MediumVioletRed'], - (205, 92, 92): ['IndianRed'], - (205, 133, 63): ['Peru'], - (208, 32, 144): ['VioletRed'], - (210, 105, 30): ['Chocolate'], - (210, 180, 140): ['Tan'], - (211, 211, 211): ['LightGray', 'LightGrey'], - (216, 191, 216): ['Thistle'], - (218, 112, 214): ['Orchid'], - (218, 165, 32): ['Goldenrod'], - (219, 112, 147): ['PaleVioletRed'], - (220, 20, 60): ['Crimson'], - (220, 220, 220): ['Gainsboro'], - (221, 160, 221): ['Plum'], - (222, 184, 135): ['Burlywood'], - (224, 255, 255): ['LightCyan'], - (230, 230, 250): ['Lavender'], - (233, 150, 122): ['DarkSalmon'], - (238, 130, 238): ['Violet'], - (238, 221, 130): ['LightGoldenrod'], - (238, 232, 170): ['PaleGoldenrod'], - (240, 128, 128): ['LightCoral'], - (240, 230, 140): ['Khaki'], - (240, 248, 255): ['AliceBlue'], - (240, 255, 240): ['Honeydew'], - (240, 255, 255): ['Azure'], - (244, 164, 96): ['SandyBrown'], - (245, 222, 179): ['Wheat'], - (245, 245, 220): ['Beige'], - (245, 245, 245): ['WhiteSmoke'], - (245, 255, 250): ['MintCream'], - (248, 248, 255): ['GhostWhite'], - (250, 128, 114): ['Salmon'], - (250, 235, 215): ['AntiqueWhite'], - (250, 240, 230): ['Linen'], - (250, 250, 210): ['LightGoldenrodYellow'], - (253, 245, 230): ['OldLace'], - (255, 0, 0): ['Red'], - (255, 0, 255): ['Magenta', 'Fuchsia'], - (255, 20, 147): ['DeepPink'], - (255, 69, 0): ['OrangeRed'], - (255, 99, 71): ['Tomato'], - (255, 105, 180): ['HotPink'], - (255, 127, 80): ['Coral'], - (255, 140, 0): ['DarkOrange'], - (255, 160, 122): ['LightSalmon'], - (255, 165, 0): ['Orange'], - (255, 182, 193): ['LightPink'], - (255, 192, 203): ['Pink'], - (255, 215, 0): ['Gold'], - (255, 218, 185): ['PeachPuff'], - (255, 222, 173): ['NavajoWhite'], - (255, 228, 181): ['Moccasin'], - (255, 228, 196): ['Bisque'], - (255, 228, 225): ['MistyRose'], - (255, 235, 205): ['BlanchedAlmond'], - (255, 239, 213): ['PapayaWhip'], - (255, 240, 245): ['LavenderBlush'], - (255, 245, 238): ['Seashell'], - (255, 248, 220): ['Cornsilk'], - (255, 250, 205): ['LemonChiffon'], - (255, 250, 240): ['FloralWhite'], - (255, 250, 250): ['Snow'], - (255, 255, 0): ['Yellow'], - (255, 255, 224): ['LightYellow'], - (255, 255, 240): ['Ivory'], - (255, 255, 255): ['White'] -} - -## Building inverse relation -COLOR_NAME_TO_RGB = dict( - (name.lower(), rgb) - for rgb, names in RGB_TO_COLOR_NAMES.items() - for name in names) - - -LONG_HEX_COLOR = re.compile(r'^#[0-9a-fA-F]{6}$') -SHORT_HEX_COLOR = re.compile(r'^#[0-9a-fA-F]{3}$') - - -class C_HSL: - - def __getattr__(self, value): - label = value.lower() - if label in COLOR_NAME_TO_RGB: - return rgb2hsl(tuple(v / 255. for v in COLOR_NAME_TO_RGB[label])) - raise AttributeError("%s instance has no attribute %r" - % (self.__class__, value)) - - -HSL = C_HSL() - - -class C_RGB: - """RGB colors container - - Provides a quick color access. - - >>> from colour import RGB - - >>> RGB.WHITE - (1.0, 1.0, 1.0) - >>> RGB.BLUE - (0.0, 0.0, 1.0) - - >>> RGB.DONOTEXISTS # doctest: +ELLIPSIS - Traceback (most recent call last): - ... - AttributeError: ... has no attribute 'DONOTEXISTS' - - """ - - def __getattr__(self, value): - return hsl2rgb(getattr(HSL, value)) - - -class C_HEX: - """RGB colors container - - Provides a quick color access. - - >>> from colour import HEX - - >>> HEX.WHITE - '#fff' - >>> HEX.BLUE - '#00f' - - >>> HEX.DONOTEXISTS # doctest: +ELLIPSIS - Traceback (most recent call last): - ... - AttributeError: ... has no attribute 'DONOTEXISTS' - - """ - - def __getattr__(self, value): - return rgb2hex(getattr(RGB, value)) - -RGB = C_RGB() -HEX = C_HEX() - - -## -## Conversion function -## - -def hsl2rgb(hsl): - """Convert HSL representation towards RGB - - :param h: Hue, position around the chromatic circle (h=1 equiv h=0) - :param s: Saturation, color saturation (0=full gray, 1=full color) - :param l: Ligthness, Overhaul lightness (0=full black, 1=full white) - :rtype: 3-uple for RGB values in float between 0 and 1 - - Hue, Saturation, Range from Lightness is a float between 0 and 1 - - Note that Hue can be set to any value but as it is a rotation - around the chromatic circle, any value above 1 or below 0 can - be expressed by a value between 0 and 1 (Note that h=0 is equiv - to h=1). - - This algorithm came from: - http://www.easyrgb.com/index.php?X=MATH&H=19#text19 - - Here are some quick notion of HSL to RGB conversion: - - >>> from colour import hsl2rgb - - With a lightness put at 0, RGB is always rgbblack - - >>> hsl2rgb((0.0, 0.0, 0.0)) - (0.0, 0.0, 0.0) - >>> hsl2rgb((0.5, 0.0, 0.0)) - (0.0, 0.0, 0.0) - >>> hsl2rgb((0.5, 0.5, 0.0)) - (0.0, 0.0, 0.0) - - Same for lightness put at 1, RGB is always rgbwhite - - >>> hsl2rgb((0.0, 0.0, 1.0)) - (1.0, 1.0, 1.0) - >>> hsl2rgb((0.5, 0.0, 1.0)) - (1.0, 1.0, 1.0) - >>> hsl2rgb((0.5, 0.5, 1.0)) - (1.0, 1.0, 1.0) - - With saturation put at 0, the RGB should be equal to Lightness: - - >>> hsl2rgb((0.0, 0.0, 0.25)) - (0.25, 0.25, 0.25) - >>> hsl2rgb((0.5, 0.0, 0.5)) - (0.5, 0.5, 0.5) - >>> hsl2rgb((0.5, 0.0, 0.75)) - (0.75, 0.75, 0.75) - - With saturation put at 1, and lightness put to 0.5, we can find - normal full red, green, blue colors: - - >>> hsl2rgb((0 , 1.0, 0.5)) - (1.0, 0.0, 0.0) - >>> hsl2rgb((1 , 1.0, 0.5)) - (1.0, 0.0, 0.0) - >>> hsl2rgb((1.0/3 , 1.0, 0.5)) - (0.0, 1.0, 0.0) - >>> hsl2rgb((2.0/3 , 1.0, 0.5)) - (0.0, 0.0, 1.0) - - Of course: - >>> hsl2rgb((0.0, 2.0, 0.5)) # doctest: +ELLIPSIS - Traceback (most recent call last): - ... - ValueError: Saturation must be between 0 and 1. - - And: - >>> hsl2rgb((0.0, 0.0, 1.5)) # doctest: +ELLIPSIS - Traceback (most recent call last): - ... - ValueError: Lightness must be between 0 and 1. - - """ - h, s, l = [float(v) for v in hsl] - - if not (0.0 - FLOAT_ERROR <= s <= 1.0 + FLOAT_ERROR): - raise ValueError("Saturation must be between 0 and 1.") - if not (0.0 - FLOAT_ERROR <= l <= 1.0 + FLOAT_ERROR): - raise ValueError("Lightness must be between 0 and 1.") - - if s == 0: - return l, l, l - - if l < 0.5: - v2 = l * (1.0 + s) - else: - v2 = (l + s) - (s * l) - - v1 = 2.0 * l - v2 - - r = _hue2rgb(v1, v2, h + (1.0 / 3)) - g = _hue2rgb(v1, v2, h) - b = _hue2rgb(v1, v2, h - (1.0 / 3)) - - return r, g, b - - -def rgb2hsl(rgb): - """Convert RGB representation towards HSL - - :param r: Red amount (float between 0 and 1) - :param g: Green amount (float between 0 and 1) - :param b: Blue amount (float between 0 and 1) - :rtype: 3-uple for HSL values in float between 0 and 1 - - This algorithm came from: - http://www.easyrgb.com/index.php?X=MATH&H=19#text19 - - Here are some quick notion of RGB to HSL conversion: - - >>> from colour import rgb2hsl - - Note that if red amount is equal to green and blue, then you - should have a gray value (from black to white). - - - >>> rgb2hsl((1.0, 1.0, 1.0)) # doctest: +ELLIPSIS - (..., 0.0, 1.0) - >>> rgb2hsl((0.5, 0.5, 0.5)) # doctest: +ELLIPSIS - (..., 0.0, 0.5) - >>> rgb2hsl((0.0, 0.0, 0.0)) # doctest: +ELLIPSIS - (..., 0.0, 0.0) - - If only one color is different from the others, it defines the - direct Hue: - - >>> rgb2hsl((0.5, 0.5, 1.0)) # doctest: +ELLIPSIS - (0.66..., 1.0, 0.75) - >>> rgb2hsl((0.2, 0.1, 0.1)) # doctest: +ELLIPSIS - (0.0, 0.33..., 0.15...) - - Having only one value set, you can check that: - - >>> rgb2hsl((1.0, 0.0, 0.0)) - (0.0, 1.0, 0.5) - >>> rgb2hsl((0.0, 1.0, 0.0)) # doctest: +ELLIPSIS - (0.33..., 1.0, 0.5) - >>> rgb2hsl((0.0, 0.0, 1.0)) # doctest: +ELLIPSIS - (0.66..., 1.0, 0.5) - - Regression check upon very close values in every component of - red, green and blue: - - >>> rgb2hsl((0.9999999999999999, 1.0, 0.9999999999999994)) - (0.0, 0.0, 0.999...) - - Of course: - - >>> rgb2hsl((0.0, 2.0, 0.5)) # doctest: +ELLIPSIS - Traceback (most recent call last): - ... - ValueError: Green must be between 0 and 1. You provided 2.0. - - And: - >>> rgb2hsl((0.0, 0.0, 1.5)) # doctest: +ELLIPSIS - Traceback (most recent call last): - ... - ValueError: Blue must be between 0 and 1. You provided 1.5. - - """ - r, g, b = [float(v) for v in rgb] - - for name, v in {'Red': r, 'Green': g, 'Blue': b}.items(): - if not (0 - FLOAT_ERROR <= v <= 1 + FLOAT_ERROR): - raise ValueError("%s must be between 0 and 1. You provided %r." - % (name, v)) - - vmin = min(r, g, b) ## Min. value of RGB - vmax = max(r, g, b) ## Max. value of RGB - diff = vmax - vmin ## Delta RGB value - - vsum = vmin + vmax - - l = vsum / 2 - - if diff < FLOAT_ERROR: ## This is a gray, no chroma... - return (0.0, 0.0, l) - - ## - ## Chromatic data... - ## - - ## Saturation - if l < 0.5: - s = diff / vsum - else: - s = diff / (2.0 - vsum) - - dr = (((vmax - r) / 6) + (diff / 2)) / diff - dg = (((vmax - g) / 6) + (diff / 2)) / diff - db = (((vmax - b) / 6) + (diff / 2)) / diff - - if r == vmax: - h = db - dg - elif g == vmax: - h = (1.0 / 3) + dr - db - elif b == vmax: - h = (2.0 / 3) + dg - dr - - if h < 0: h += 1 - if h > 1: h -= 1 - - return (h, s, l) - - -def _hue2rgb(v1, v2, vH): - """Private helper function (Do not call directly) - - :param vH: rotation around the chromatic circle (between 0..1) - - """ - - while vH < 0: vH += 1 - while vH > 1: vH -= 1 - - if 6 * vH < 1: return v1 + (v2 - v1) * 6 * vH - if 2 * vH < 1: return v2 - if 3 * vH < 2: return v1 + (v2 - v1) * ((2.0 / 3) - vH) * 6 - - return v1 - - -def rgb2hex(rgb, force_long=False): - """Transform RGB tuple to hex RGB representation - - :param rgb: RGB 3-uple of float between 0 and 1 - :rtype: 3 hex char or 6 hex char string representation - - Usage - ----- - - >>> from colour import rgb2hex - - >>> rgb2hex((0.0,1.0,0.0)) - '#0f0' - - Rounding try to be as natural as possible: - - >>> rgb2hex((0.0,0.999999,1.0)) - '#0ff' - - And if not possible, the 6 hex char representation is used: - - >>> rgb2hex((0.23,1.0,1.0)) - '#3bffff' - - >>> rgb2hex((0.0,0.999999,1.0), force_long=True) - '#00ffff' - - """ - - hx = ''.join(["%02x" % int(c * 255 + 0.5 - FLOAT_ERROR) - for c in rgb]) - - if not force_long and hx[0::2] == hx[1::2]: - hx = ''.join(hx[0::2]) - - return "#%s" % hx - - -def hex2rgb(str_rgb): - """Transform hex RGB representation to RGB tuple - - :param str_rgb: 3 hex char or 6 hex char string representation - :rtype: RGB 3-uple of float between 0 and 1 - - >>> from colour import hex2rgb - - >>> hex2rgb('#00ff00') - (0.0, 1.0, 0.0) - - >>> hex2rgb('#0f0') - (0.0, 1.0, 0.0) - - >>> hex2rgb('#aaa') # doctest: +ELLIPSIS - (0.66..., 0.66..., 0.66...) - - >>> hex2rgb('#aa') # doctest: +ELLIPSIS - Traceback (most recent call last): - ... - ValueError: Invalid value '#aa' provided for rgb color. - - """ - - try: - rgb = str_rgb[1:] - - if len(rgb) == 6: - r, g, b = rgb[0:2], rgb[2:4], rgb[4:6] - elif len(rgb) == 3: - r, g, b = rgb[0] * 2, rgb[1] * 2, rgb[2] * 2 - else: - raise ValueError() - except: - raise ValueError("Invalid value %r provided for rgb color." - % str_rgb) - - return tuple([float(int(v, 16)) / 255 for v in (r, g, b)]) - - -def hex2web(hex): - """Converts HEX representation to WEB - - :param rgb: 3 hex char or 6 hex char string representation - :rtype: web string representation (human readable if possible) - - WEB representation uses X11 rgb.txt to define conversion - between RGB and english color names. - - Usage - ===== - - >>> from colour import hex2web - - >>> hex2web('#ff0000') - 'red' - - >>> hex2web('#aaaaaa') - '#aaa' - - >>> hex2web('#abc') - '#abc' - - >>> hex2web('#acacac') - '#acacac' - - """ - dec_rgb = tuple(int(v * 255) for v in hex2rgb(hex)) - if dec_rgb in RGB_TO_COLOR_NAMES: - ## take the first one - color_name = RGB_TO_COLOR_NAMES[dec_rgb][0] - ## Enforce full lowercase for single worded color name. - return color_name if len(re.sub(r"[^A-Z]", "", color_name)) > 1 \ - else color_name.lower() - - # Hex format is verified by hex2rgb function. And should be 3 or 6 digit - if len(hex) == 7: - if hex[1] == hex[2] and \ - hex[3] == hex[4] and \ - hex[5] == hex[6]: - return '#' + hex[1] + hex[3] + hex[5] - return hex - - -def web2hex(web, force_long=False): - """Converts WEB representation to HEX - - :param rgb: web string representation (human readable if possible) - :rtype: 3 hex char or 6 hex char string representation - - WEB representation uses X11 rgb.txt to define conversion - between RGB and english color names. - - Usage - ===== - - >>> from colour import web2hex - - >>> web2hex('red') - '#f00' - - >>> web2hex('#aaa') - '#aaa' - - >>> web2hex('#foo') # doctest: +ELLIPSIS - Traceback (most recent call last): - ... - AttributeError: '#foo' is not in web format. Need 3 or 6 hex digit. - - >>> web2hex('#aaa', force_long=True) - '#aaaaaa' - - >>> web2hex('#aaaaaa') - '#aaaaaa' - - >>> web2hex('#aaaa') # doctest: +ELLIPSIS - Traceback (most recent call last): - ... - AttributeError: '#aaaa' is not in web format. Need 3 or 6 hex digit. - - >>> web2hex('pinky') # doctest: +ELLIPSIS - Traceback (most recent call last): - ... - ValueError: 'pinky' is not a recognized color. - - And color names are case insensitive: - - >>> Color('RED') - - - """ - if web.startswith('#'): - if (LONG_HEX_COLOR.match(web) or - (not force_long and SHORT_HEX_COLOR.match(web))): - return web.lower() - elif SHORT_HEX_COLOR.match(web) and force_long: - return '#' + ''.join([("%s" % (t, )) * 2 for t in web[1:]]) - raise AttributeError( - "%r is not in web format. Need 3 or 6 hex digit." % web) - - web = web.lower() - if web not in COLOR_NAME_TO_RGB: - raise ValueError("%r is not a recognized color." % web) - - ## convert dec to hex: - - return rgb2hex([float(int(v)) / 255 for v in COLOR_NAME_TO_RGB[web]], - force_long) - - -## Missing functions conversion - -hsl2hex = lambda x: rgb2hex(hsl2rgb(x)) -hex2hsl = lambda x: rgb2hsl(hex2rgb(x)) -rgb2web = lambda x: hex2web(rgb2hex(x)) -web2rgb = lambda x: hex2rgb(web2hex(x)) -web2hsl = lambda x: rgb2hsl(web2rgb(x)) -hsl2web = lambda x: rgb2web(hsl2rgb(x)) - - -def color_scale(begin_hsl, end_hsl, nb): - """Returns a list of nb color HSL tuples between begin_hsl and end_hsl - - >>> from colour import color_scale - - >>> [rgb2hex(hsl2rgb(hsl)) for hsl in color_scale((0, 1, 0.5), - ... (1, 1, 0.5), 3)] - ['#f00', '#0f0', '#00f', '#f00'] - - >>> [rgb2hex(hsl2rgb(hsl)) - ... for hsl in color_scale((0, 0, 0), - ... (0, 0, 1), - ... 15)] # doctest: +ELLIPSIS - ['#000', '#111', '#222', ..., '#ccc', '#ddd', '#eee', '#fff'] - - Of course, asking for negative values is not supported: - - >>> color_scale((0, 1, 0.5), (1, 1, 0.5), -2) - Traceback (most recent call last): - ... - ValueError: Unsupported negative number of colors (nb=-2). - - """ - - if nb < 0: - raise ValueError( - "Unsupported negative number of colors (nb=%r)." % nb) - - step = tuple([float(end_hsl[i] - begin_hsl[i]) / nb for i in range(0, 3)]) \ - if nb > 0 else (0, 0, 0) - - def mul(step, value): - return tuple([v * value for v in step]) - - def add_v(step, step2): - return tuple([v + step2[i] for i, v in enumerate(step)]) - - return [add_v(begin_hsl, mul(step, r)) for r in range(0, nb + 1)] - - -## -## Color Pickers -## - -def RGB_color_picker(obj): - """Build a color representation from the string representation of an object - - This allows to quickly get a color from some data, with the - additional benefit that the color will be the same as long as the - (string representation of the) data is the same:: - - >>> from colour import RGB_color_picker, Color - - Same inputs produce the same result:: - - >>> RGB_color_picker("Something") == RGB_color_picker("Something") - True - - ... but different inputs produce different colors:: - - >>> RGB_color_picker("Something") != RGB_color_picker("Something else") - True - - In any case, we still get a ``Color`` object:: - - >>> isinstance(RGB_color_picker("Something"), Color) - True - - """ - - ## Turn the input into a by 3-dividable string. SHA-384 is good because it - ## divides into 3 components of the same size, which will be used to - ## represent the RGB values of the color. - digest = hashlib.sha384(str(obj).encode('utf-8')).hexdigest() - - ## Split the digest into 3 sub-strings of equivalent size. - subsize = int(len(digest) / 3) - splitted_digest = [digest[i * subsize: (i + 1) * subsize] - for i in range(3)] - - ## Convert those hexadecimal sub-strings into integer and scale them down - ## to the 0..1 range. - max_value = float(int("f" * subsize, 16)) - components = ( - int(d, 16) ## Make a number from a list with hex digits - / max_value ## Scale it down to [0.0, 1.0] - for d in splitted_digest) - - return Color(rgb2hex(components)) ## Profit! - - -def hash_or_str(obj): - try: - return hash((type(obj).__name__, obj)) - except TypeError: - ## Adds the type name to make sure two object of different type but - ## identical string representation get distinguished. - return type(obj).__name__ + str(obj) - - -## -## All purpose object -## - -class Color(object): - """Abstraction of a color object - - Color object keeps information of a color. It can input/output to different - format (HSL, RGB, HEX, WEB) and their partial representation. - - >>> from colour import Color, HSL - - >>> b = Color() - >>> b.hsl = HSL.BLUE - - Access values - ------------- - - >>> b.hue # doctest: +ELLIPSIS - 0.66... - >>> b.saturation - 1.0 - >>> b.luminance - 0.5 - - >>> b.red - 0.0 - >>> b.blue - 1.0 - >>> b.green - 0.0 - - >>> b.rgb - (0.0, 0.0, 1.0) - >>> b.hsl # doctest: +ELLIPSIS - (0.66..., 1.0, 0.5) - >>> b.hex - '#00f' - - Change values - ------------- - - Let's change Hue toward red tint: - - >>> b.hue = 0.0 - >>> b.hex - '#f00' - - >>> b.hue = 2.0/3 - >>> b.hex - '#00f' - - In the other way round: - - >>> b.hex = '#f00' - >>> b.hsl - (0.0, 1.0, 0.5) - - Long hex can be accessed directly: - - >>> b.hex_l = '#123456' - >>> b.hex_l - '#123456' - >>> b.hex - '#123456' - - >>> b.hex_l = '#ff0000' - >>> b.hex_l - '#ff0000' - >>> b.hex - '#f00' - - Convenience - ----------- - - >>> c = Color('blue') - >>> c - - >>> c.hue = 0 - >>> c - - - >>> c.saturation = 0.0 - >>> c.hsl # doctest: +ELLIPSIS - (..., 0.0, 0.5) - >>> c.rgb - (0.5, 0.5, 0.5) - >>> c.hex - '#7f7f7f' - >>> c - - - >>> c.luminance = 0.0 - >>> c - - - >>> c.hex - '#000' - - >>> c.green = 1.0 - >>> c.blue = 1.0 - >>> c.hex - '#0ff' - >>> c - - - >>> c = Color('blue', luminance=0.75) - >>> c - - - >>> c = Color('red', red=0.5) - >>> c - - - >>> print(c) - #7f0000 - - You can try to query unexisting attributes: - - >>> c.lightness # doctest: +ELLIPSIS - Traceback (most recent call last): - ... - AttributeError: 'lightness' not found - - TODO: could add HSV, CMYK, YUV conversion. - -# >>> b.hsv -# >>> b.value -# >>> b.cyan -# >>> b.magenta -# >>> b.yellow -# >>> b.key -# >>> b.cmyk - - - Recursive init - -------------- - - To support blind conversion of web strings (or already converted object), - the Color object supports instantiation with another Color object. - - >>> Color(Color(Color('red'))) - - - Equality support - ---------------- - - Default equality is RGB hex comparison: - - >>> Color('red') == Color('blue') - False - >>> Color('red') == Color('red') - True - >>> Color('red') != Color('blue') - True - >>> Color('red') != Color('red') - False - - But this can be changed: - - >>> saturation_equality = lambda c1, c2: c1.luminance == c2.luminance - >>> Color('red', equality=saturation_equality) == Color('blue') - True - - - Subclassing support - ------------------- - - You should be able to subclass ``Color`` object without any issues:: - - >>> class Tint(Color): - ... pass - - And keep the internal API working:: - - >>> Tint("red").hsl - (0.0, 1.0, 0.5) - - """ - - _hsl = None ## internal representation - - def __init__(self, color=None, - pick_for=None, picker=RGB_color_picker, pick_key=hash_or_str, - **kwargs): - - if pick_key is None: - pick_key = lambda x: x - - if pick_for is not None: - color = picker(pick_key(pick_for)) - - if isinstance(color, Color): - self.web = color.web - else: - self.web = color if color else 'black' - - self.equality = RGB_equivalence - - for k, v in kwargs.items(): - setattr(self, k, v) - - def __getattr__(self, label): - if label.startswith("get_"): - raise AttributeError("'%s' not found" % label) - try: - return getattr(self, 'get_' + label)() - except AttributeError: - raise AttributeError("'%s' not found" % label) - - def __setattr__(self, label, value): - if label not in ["_hsl", "equality"]: - fc = getattr(self, 'set_' + label) - fc(value) - else: - self.__dict__[label] = value - - ## - ## Get - ## - - def get_hsl(self): - return tuple(self._hsl) - - def get_hex(self): - return rgb2hex(self.rgb) - - def get_hex_l(self): - return rgb2hex(self.rgb, force_long=True) - - def get_rgb(self): - return hsl2rgb(self.hsl) - - def get_hue(self): - return self.hsl[0] - - def get_saturation(self): - return self.hsl[1] - - def get_luminance(self): - return self.hsl[2] - - def get_red(self): - return self.rgb[0] - - def get_green(self): - return self.rgb[1] - - def get_blue(self): - return self.rgb[2] - - def get_web(self): - return hex2web(self.hex) - - ## - ## Set - ## - - def set_hsl(self, value): - self._hsl = list(value) - - def set_rgb(self, value): - self.hsl = rgb2hsl(value) - - def set_hue(self, value): - self._hsl[0] = value - - def set_saturation(self, value): - self._hsl[1] = value - - def set_luminance(self, value): - self._hsl[2] = value - - def set_red(self, value): - _, g, b = self.rgb - self.rgb = (value, g, b) - - def set_green(self, value): - r, _, b = self.rgb - self.rgb = (r, value, b) - - def set_blue(self, value): - r, g, _ = self.rgb - self.rgb = (r, g, value) - - def set_hex(self, value): - self.rgb = hex2rgb(value) - - set_hex_l = set_hex - - def set_web(self, value): - self.hex = web2hex(value) - - ## range of color generation - - def range_to(self, value, steps): - for hsl in color_scale(self._hsl, Color(value).hsl, steps - 1): - yield Color(hsl=hsl) - - ## - ## Convenience - ## - - def __str__(self): - return "%s" % self.web - - def __repr__(self): - return "" % self.web - - def __eq__(self, other): - if isinstance(other, Color): - return self.equality(self, other) - return NotImplemented - - if sys.version_info[0] == 2: - ## Note: intended to be a backport of python 3 behavior - def __ne__(self, other): - equal = self.__eq__(other) - return equal if equal is NotImplemented else not equal - - -RGB_equivalence = lambda c1, c2: c1.hex_l == c2.hex_l -HSL_equivalence = lambda c1, c2: c1._hsl == c2._hsl - - -def make_color_factory(**kwargs_defaults): - - def ColorFactory(*args, **kwargs): - new_kwargs = kwargs_defaults.copy() - new_kwargs.update(kwargs) - return Color(*args, **new_kwargs) - return ColorFactory diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu-0.0.2.dist-info/INSTALLER b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu-0.0.2.dist-info/INSTALLER deleted file mode 100644 index a1b589e3..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu-0.0.2.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu-0.0.2.dist-info/METADATA b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu-0.0.2.dist-info/METADATA deleted file mode 100644 index 88a01645..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu-0.0.2.dist-info/METADATA +++ /dev/null @@ -1,18 +0,0 @@ -Metadata-Version: 2.1 -Name: deezeridu -Version: 0.0.2 -Summary: Downloads songs, albums or playlists from deezer -Home-page: https://github.com/OpenJarbas/deezeridu -Author: An0nimia -License: CC BY-NC-SA 4.0 -Platform: UNKNOWN -Requires-Python: >=3.8 -Description-Content-Type: text/markdown -Requires-Dist: mutagen -Requires-Dist: pycryptodomex -Requires-Dist: requests -Requires-Dist: tqdm -Requires-Dist: json-database (>=0.5.6) - -UNKNOWN - diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu-0.0.2.dist-info/RECORD b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu-0.0.2.dist-info/RECORD deleted file mode 100644 index ace5fd9c..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu-0.0.2.dist-info/RECORD +++ /dev/null @@ -1,34 +0,0 @@ -deezeridu-0.0.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -deezeridu-0.0.2.dist-info/METADATA,sha256=JBjeAZnVtVZvYgmfElDjDUGdS9EjEwqxaiJGE541aH8,430 -deezeridu-0.0.2.dist-info/RECORD,, -deezeridu-0.0.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -deezeridu-0.0.2.dist-info/WHEEL,sha256=g4nMs7d-Xl9-xC9XovUrsDHGXt-FT0E17Yqo92DEfvY,92 -deezeridu-0.0.2.dist-info/top_level.txt,sha256=5OOrodHgvewBBzVAiYzCWOzPv55J_lxWSYD_H86uoaM,27 -deezeridu/__init__.py,sha256=JLrWou6ghlPaCCvudqUMt0WLXNAYcLMkgd6ALyff4xY,9462 -deezeridu/__init__.pyc,, -deezeridu/api.py,sha256=YRdBnqu4KMgDFyXM1Zutlkux-tREtq10-tkPdssB8Tc,6116 -deezeridu/api.pyc,, -deezeridu/download.py,sha256=RH9JgXWiKMx3vWeAOL44kG4AjmTUHnaWwAG88_isdCs,16473 -deezeridu/download.pyc,, -deezeridu/download_utils.py,sha256=fpJJvy5WCYR3jeN23yLZ73_nametlWNUTH5kEePAGeQ,1850 -deezeridu/download_utils.pyc,, -deezeridu/exceptions.py,sha256=FyXJME7bFs0MpksfHDtbStdegMyTu3I5_V_ttPYsCmA,2152 -deezeridu/exceptions.pyc,, -deezeridu/gateway.py,sha256=Hv2gqK3qaKFMiJIPbHF98eTbKU4WL_zMSuuxOR0DhGY,7321 -deezeridu/gateway.pyc,, -deezeridu/models/__init__.py,sha256=MKWdOOYUJVhWjWAUvk7wEm5jC88QCRIFK5oHbDePIKw,138 -deezeridu/models/__init__.pyc,, -deezeridu/models/album.py,sha256=mcaZDyZQNhpPyNpHzkYZt05u0oZJLJFiOIDBoHM_vnI,504 -deezeridu/models/album.pyc,, -deezeridu/models/playlist.py,sha256=z37DLc6-lQiXthtJz0kAwxTG3wlc8ZosiL9aRo0VpLk,220 -deezeridu/models/playlist.pyc,, -deezeridu/models/preferences.py,sha256=UOl-6T9tgXueV_kG5qboF_G4I-Znrne6ctZ8km9OoXw,424 -deezeridu/models/preferences.pyc,, -deezeridu/models/track.py,sha256=ePJ60dobaI141N-BtIP83jUr8MxOgTU1xyQ665w5rVQ,1644 -deezeridu/models/track.pyc,, -deezeridu/settings.py,sha256=ZOURy_oQ-lWQWe41Oyx-ED1wpz9zZBidnQgFpf13XWg,571 -deezeridu/settings.pyc,, -deezeridu/taggers.py,sha256=-iPciR31q9qNrF_QXo3fPmaUCMxoWr8bP_DY3RS9_Zg,4359 -deezeridu/taggers.pyc,, -deezeridu/utils.py,sha256=L9PxpvqbfEUMccFBvy1B1fplsm7cU9uU_TKV5HnxNuM,5432 -deezeridu/utils.pyc,, diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu-0.0.2.dist-info/WHEEL b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu-0.0.2.dist-info/WHEEL deleted file mode 100644 index b552003f..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu-0.0.2.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.34.2) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu-0.0.2.dist-info/top_level.txt b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu-0.0.2.dist-info/top_level.txt deleted file mode 100644 index 9c99b201..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu-0.0.2.dist-info/top_level.txt +++ /dev/null @@ -1,2 +0,0 @@ -deezeridu -deezeridu/models diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/__init__.py b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/__init__.py deleted file mode 100644 index 7eb5ebb1..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/__init__.py +++ /dev/null @@ -1,301 +0,0 @@ -#!/usr/bin/python3 - -from .api import API -from .gateway import Gateway -from .download import ( - TrackDownloader, AlbumDownloader, PlaylistDownloader, - DownloaderJob -) - -from .utils import ( - create_zip, get_ids, link_is_valid, - what_kind, convert_to_date -) -from .exceptions import ( - InvalidLink, TrackNotFound, - NoDataApi, AlbumNotFound, CredentialsMissing -) -from .models import ( - Track, Album, Playlist, - Preferences -) -from json_database import JsonConfigXDG - - -class Deezer: - def __init__( - self, - arl=None, - email=None, - password=None - ): - if arl: - self.__gw_api = Gateway(arl=arl) - else: - if not email or not password: - creds = JsonConfigXDG("deezer", subfolder="deezeridu") - email = creds.get("email") - password = creds.get("password") - if not email or not password: - raise CredentialsMissing - self.__gw_api = Gateway( - email=email, - password=password - ) - - self.__api = API() - self.__download_job = DownloaderJob(self.__api, self.__gw_api) - - def download_track( - self, link_track, - output_dir, - quality_download="MP3_320", - recursive_quality=False, - recursive_download=False, - not_interface=False, - method_save=2 - ) -> Track: - - link_is_valid(link_track) - ids = get_ids(link_track) - - try: - song_metadata = self.__api.tracking(ids) - except NoDataApi: - infos = self.__gw_api.get_song_data(ids) - - if not "FALLBACK" in infos: - raise TrackNotFound(link_track) - - ids = infos['FALLBACK']['SNG_ID'] - song_metadata = self.__api.tracking(ids) - - preferences = Preferences() - - preferences.link = link_track - preferences.song_metadata = song_metadata - preferences.quality_download = quality_download - preferences.output_dir = output_dir - preferences.ids = ids - preferences.recursive_quality = recursive_quality - preferences.recursive_download = recursive_download - preferences.not_interface = not_interface - preferences.method_save = method_save - - track = TrackDownloader(preferences, self.__download_job).dw() - - return track - - def download_album( - self, link_album, - output_dir, - quality_download="MP3_320", - recursive_quality=False, - recursive_download=False, - not_interface=False, - make_zip=False, - method_save=2 - ) -> Album: - - link_is_valid(link_album) - ids = get_ids(link_album) - - try: - album_json = self.__api.get_album(ids) - except NoDataApi: - raise AlbumNotFound(link_album) - - song_metadata = { - "music": [], - "artist": [], - "tracknum": [], - "discnum": [], - "bpm": [], - "duration": [], - "isrc": [], - "gain": [], - "album": album_json['title'], - "label": album_json['label'], - "year": convert_to_date(album_json['release_date']), - "upc": album_json['upc'], - "nb_tracks": album_json['nb_tracks'] - } - - genres = [] - - if "genres" in album_json: - for a in album_json['genres']['data']: - genres.append(a['name']) - - song_metadata['genre'] = " & ".join(genres) - ar_album = [] - - for a in album_json['contributors']: - if a['role'] == "Main": - ar_album.append(a['name']) - - song_metadata['ar_album'] = " & ".join(ar_album) - sm_items = song_metadata.items() - - for track in album_json['tracks']['data']: - c_ids = track['id'] - detas = self.__api.tracking(c_ids, album=True) - - for key, item in sm_items: - if type(item) is list: - song_metadata[key].append(detas[key]) - - preferences = Preferences() - - preferences.link = link_album - preferences.song_metadata = song_metadata - preferences.quality_download = quality_download - preferences.output_dir = output_dir - preferences.ids = ids - preferences.json_data = album_json - preferences.recursive_quality = recursive_quality - preferences.recursive_download = recursive_download - preferences.not_interface = not_interface - preferences.method_save = method_save - preferences.make_zip = make_zip - - album = AlbumDownloader(preferences, self.__download_job).dw() - - return album - - def download_playlist( - self, link_playlist, - output_dir, - quality_download="MP3_320", - recursive_quality=False, - recursive_download=False, - not_interface=False, - make_zip=False, - method_save=2 - ) -> Playlist: - - link_is_valid(link_playlist) - ids = get_ids(link_playlist) - - song_metadata = [] - playlist_json = self.__api.get_playlist(ids) - - for track in playlist_json['tracks']['data']: - c_ids = track['id'] - - try: - c_song_metadata = self.__api.tracking(c_ids) - except NoDataApi: - infos = self.__gw_api.get_song_data(c_ids) - - if not "FALLBACK" in infos: - c_song_metadata = f"{track['title']} - {track['artist']['name']}" - else: - c_song_metadata = self.__api.tracking(c_ids) - - song_metadata.append(c_song_metadata) - - preferences = Preferences() - - preferences.link = link_playlist - preferences.song_metadata = song_metadata - preferences.quality_download = quality_download - preferences.output_dir = output_dir - preferences.ids = ids - preferences.json_data = playlist_json - preferences.recursive_quality = recursive_quality - preferences.recursive_download = recursive_download - preferences.not_interface = not_interface - preferences.method_save = method_save - preferences.make_zip = make_zip - - playlist = PlaylistDownloader(preferences, self.__download_job).dw() - - return playlist - - def download_artist_toptracks( - self, link_artist, - output_dir, - quality_download="MP3_320", - recursive_quality=False, - recursive_download=False, - not_interface=False - ): - - link_is_valid(link_artist) - ids = get_ids(link_artist) - - playlist_json = self.__api.get_artist_top_tracks(ids)['data'] - - names = [ - self.download_track( - track['link'], output_dir, - quality_download, recursive_quality, - recursive_download, not_interface - ) - - for track in playlist_json - ] - return Playlist(names) - - def download( - self, link, - output_dir, - quality_download="MP3_320", - recursive_quality=False, - recursive_download=False, - not_interface=False, - make_zip=False, - method_save=2 - ): - - link_is_valid(link) - link = what_kind(link) - - if "first_result/" in link or "track/" in link: - return self.download_track( - link, - output_dir=output_dir, - quality_download=quality_download, - recursive_quality=recursive_quality, - recursive_download=recursive_download, - not_interface=not_interface, - method_save=2 - ) - elif "album/" in link: - return self.download_album( - link, - output_dir=output_dir, - quality_download=quality_download, - recursive_quality=recursive_quality, - recursive_download=recursive_download, - not_interface=not_interface, - make_zip=make_zip, - method_save=2 - ) - elif "artist/" in link: - return self.download_artist_toptracks( - link, - output_dir=output_dir, - quality_download=quality_download, - recursive_quality=recursive_quality, - recursive_download=recursive_download, - not_interface=not_interface - ) - - elif "playlist/" in link: - return self.download_playlist( - link, - output_dir=output_dir, - quality_download=quality_download, - recursive_quality=recursive_quality, - recursive_download=recursive_download, - not_interface=not_interface, - make_zip=make_zip, - method_save=2 - ) - - smart.type = "playlist" - smart._playlist = playlist - - raise InvalidLink(link) diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/__init__.pyc b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/__init__.pyc deleted file mode 100644 index 5b8ff879..00000000 Binary files a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/__init__.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/api.py b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/api.py deleted file mode 100644 index dceb243f..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/api.py +++ /dev/null @@ -1,212 +0,0 @@ -#!/usr/bin/python3 - -from time import sleep - -from requests import get as req_get - -from .settings import header -from .utils import artist_sort, convert_to_date -from .exceptions import ( - NoDataApi, QuotaExceeded, TrackNotFound -) - - -class API: - def __init__(self): - self.__api_link = "https://api.deezer.com/" - self.__cover = "https://e-cdns-images.dzcdn.net/images/cover/%s/{}-000000-80-0-0.jpg" - - def __get_api(self, url, quota_exceeded=False): - json = req_get(url, headers=header).json() - - if "error" in json: - if json['error']['message'] == "no data": - raise NoDataApi("No data avalaible :(") - - elif json['error']['message'] == "Quota limit exceeded": - if not quota_exceeded: - sleep(0.8) - json = self.__get_api(url, True) - else: - raise QuotaExceeded - - return json - - def get_chart(self, index=0): - url = f"{self.__api_link}chart/{index}" - infos = self.__get_api(url) - return infos - - def get_track(self, ids): - url = f"{self.__api_link}track/{ids}" - infos = self.__get_api(url) - return infos - - def get_album(self, ids): - url = f"{self.__api_link}album/{ids}" - infos = self.__get_api(url) - return infos - - def get_playlist(self, ids): - url = f"{self.__api_link}playlist/{ids}" - infos = self.__get_api(url) - return infos - - def get_artist(self, ids): - url = f"{self.__api_link}artist/{ids}" - infos = self.__get_api(url) - return infos - - def get_artist_top_tracks(self, ids, limit=25): - url = f"{self.__api_link}artist/{ids}/top?limit={limit}" - infos = self.__get_api(url) - return infos - - def get_artist_top_albums(self, ids, limit=25): - url = f"{self.__api_link}artist/{ids}/albums?limit={limit}" - infos = self.__get_api(url) - return infos - - def get_artist_related(self, ids): - url = f"{self.__api_link}artist/{ids}/related" - infos = self.__get_api(url) - return infos - - def get_artist_radio(self, ids): - url = f"{self.__api_link}artist/{ids}/radio" - infos = self.__get_api(url) - return infos - - def get_artist_top_playlists(self, ids, limit=25): - url = f"{self.__api_link}artist/{ids}/playlists?limit={limit}" - infos = self.__get_api(url) - return infos - - def search(self, query): - url = f"{self.__api_link}search/?q={query}" - infos = self.__get_api(url) - - if infos['total'] == 0: - raise NoDataApi(query) - - return infos - - def search_track(self, query): - url = f"{self.__api_link}search/track/?q={query}" - infos = self.__get_api(url) - - if infos['total'] == 0: - raise NoDataApi(query) - - return infos - - def search_album(self, query): - url = f"{self.__api_link}search/album/?q={query}" - infos = self.__get_api(url) - - if infos['total'] == 0: - raise NoDataApi(query) - - return infos - - def search_playlist(self, query): - url = f"{self.__api_link}search/playlist/?q={query}" - infos = self.__get_api(url) - - if infos['total'] == 0: - raise NoDataApi(query) - - return infos - - def search_artist(self, query): - url = f"{self.__api_link}search/artist/?q={query}" - infos = self.__get_api(url) - - if infos['total'] == 0: - raise NoDataApi(query) - - return infos - - def not_found(self, song, title): - try: - data = self.search_track(song)['data'] - except NoDataApi: - raise TrackNotFound(song) - - ids = None - - for track in data: - if ( - track['title'] == title - ) or ( - title in track['title_short'] - ): - ids = track['id'] - break - - if not ids: - raise TrackNotFound(song) - - return str(ids) - - def get_img_url(self, md5_image, size="1200x1200"): - cover = self.__cover.format(size) - image_url = cover % md5_image - return image_url - - def choose_img(self, md5_image, size="1200x1200"): - image_url = self.get_img_url(md5_image, size) - image = req_get(image_url).content - - if len(image) == 13: - image_url = self.get_img_url("", size) - image = req_get(image_url).content - - return image - - def tracking(self, ids, album=False): - datas = {} - json_track = self.get_track(ids) - - if not album: - album_ids = json_track['album']['id'] - json_album = self.get_album(album_ids) - genres = [] - - if "genres" in json_album: - for genre in json_album['genres']['data']: - genres.append(genre['name']) - - datas['genre'] = " & ".join(genres) - ar_album = [] - - for contributor in json_album['contributors']: - if contributor['role'] == "Main": - ar_album.append(contributor['name']) - - datas['ar_album'] = " & ".join(ar_album) - datas['album'] = json_album['title'] - datas['label'] = json_album['label'] - datas['upc'] = json_album['upc'] - datas['nb_tracks'] = json_album['nb_tracks'] - - datas['music'] = json_track['title'] - array = [] - - for contributor in json_track['contributors']: - if contributor['name'] != "": - array.append(contributor['name']) - - array.append( - json_track['artist']['name'] - ) - - datas['artist'] = artist_sort(array) - datas['tracknum'] = json_track['track_position'] - datas['discnum'] = json_track['disk_number'] - datas['year'] = convert_to_date(json_track['release_date']) - datas['bpm'] = json_track['bpm'] - datas['duration'] = json_track['duration'] - datas['isrc'] = json_track['isrc'] - datas['gain'] = json_track['gain'] - return datas diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/api.pyc b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/api.pyc deleted file mode 100644 index 3bfa8e93..00000000 Binary files a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/api.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/download.py b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/download.py deleted file mode 100644 index 974c5396..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/download.py +++ /dev/null @@ -1,519 +0,0 @@ -#!/usr/bin/python3 - -from copy import deepcopy -from os.path import isfile - -from tqdm import tqdm - -from .api import API -from .gateway import Gateway -from .settings import qualities -from .download_utils import decryptfile, gen_song_hash -from .taggers import write_tags, check_track -from .utils import ( - set_path, trasform_sync_lyric, - create_zip, check_track_ids, - check_track_md5, check_track_token -) -from .exceptions import ( - TrackNotFound, NoRightOnMedia, QualityNotFound -) -from .models import ( - Track, Album, Playlist, - Preferences, -) - - -class DownloaderJob: - def __init__( - self, - api: API, - gw_api: Gateway - ) -> None: - - self.api = api - self.gw_api = gw_api - - def __get_url( - self, - c_track: Track, - quality_download: str - ) -> dict: - - c_md5, c_media_version = check_track_md5(c_track) - c_ids = check_track_ids(c_track) - n_quality = qualities[quality_download]['n_quality'] - - c_song_hash = gen_song_hash( - c_md5, n_quality, - c_ids, c_media_version - ) - - c_media_url = self.gw_api.get_song_url(c_md5[0], c_song_hash) - - c_media_json = { - "media": [ - { - "sources": [ - { - "url": c_media_url - } - ] - } - ] - } - - return c_media_json - - def check_sources( - self, - infos_dw: list, - quality_download: str - ) -> list: - - tracks_token = [ - check_track_token(c_track) - for c_track in infos_dw - ] - - try: - medias = self.gw_api.get_medias_url(tracks_token, quality_download) - - for a in range( - len(medias) - ): - if "errors" in medias[a]: - c_media_json = self.__get_url(infos_dw[a], - quality_download) - medias[a] = c_media_json - else: - if not medias[a]['media']: - c_media_json = self.__get_url(infos_dw[a], - quality_download) - medias[a] = c_media_json - except NoRightOnMedia: - medias = [] - - for c_track in infos_dw: - c_media_json = self.__get_url(c_track, quality_download) - medias.append(c_media_json) - - return medias - - -class Downloader: - def __init__( - self, - infos_dw: dict, - preferences: Preferences, - download_job: DownloaderJob, - ) -> None: - - self.__download_job = download_job - self.__api = download_job.api - self.__gw_api = download_job.gw_api - - self.__infos_dw = infos_dw - - self.__ids = preferences.ids - self.__link = preferences.link - self.__output_dir = preferences.output_dir - self.__method_save = preferences.method_save - self.__song_metadata = preferences.song_metadata - self.__not_interface = preferences.not_interface - self.__quality_download = preferences.quality_download - self.__recursive_quality = preferences.recursive_quality - self.__recursive_download = preferences.recursive_download - - self.__c_quality = qualities[self.__quality_download] - self.__set_quality() - self.__set_song_path() - - def __set_quality(self) -> None: - self.__file_format = self.__c_quality['f_format'] - self.__song_quality = self.__c_quality['s_quality'] - - def __set_song_path(self) -> None: - self.__song_path = set_path( - self.__song_metadata, - self.__output_dir, - self.__song_quality, - self.__file_format, - self.__method_save - ) - - def __write_track(self) -> None: - self.__set_song_path() - - self.__c_track = Track( - self.__song_metadata, self.__song_path, - self.__file_format, self.__song_quality, - self.__link, self.__ids - ) - - def easy_dw(self) -> Track: - pic = self.__infos_dw['ALB_PICTURE'] - image = self.__api.choose_img(pic) - self.__song_metadata['image'] = image - song = f"{self.__song_metadata['music']} - {self.__song_metadata['artist']}" - - if not self.__not_interface: - print(f"Downloading: {song}") - - try: - self.download_try() - except TrackNotFound: - try: - ids = self.__api.not_found(song, self.__song_metadata['music']) - self.__infos_dw = self.__gw_api.get_song_data(ids) - - media = self.__download_job.check_sources( - [self.__infos_dw], self.__quality_download - ) - - self.__infos_dw['media_url'] = media[0] - self.download_try() - except TrackNotFound: - self.__c_track = Track( - self.__song_metadata, - None, None, - None, None, None, - ) - - self.__c_track.success = False - - self.__c_track.md5_image = pic - - return self.__c_track - - def download_try(self) -> Track: - self.__c_track = Track( - self.__song_metadata, self.__song_path, - self.__file_format, self.__song_quality, - self.__link, self.__ids - ) - - if isfile(self.__song_path): - if check_track(self.__c_track): - return self.__c_track - - media_list = self.__infos_dw['media_url']['media'] - song_link = media_list[0]['sources'][0]['url'] - - try: - crypted_audio = self.__gw_api.song_exist(song_link) - except TrackNotFound: - song = self.__song_metadata['music'] - artist = self.__song_metadata['artist'] - msg = f"\n⚠ The {song} - {artist} can't be downloaded in {self.__quality_download} quality :( ⚠\n" - - if not self.__recursive_quality: - raise QualityNotFound(msg=msg) - - print(msg) - - for c_quality in qualities: - if self.__quality_download == c_quality: - continue - - print( - f"🛈 Trying to download {song} - {artist} in {c_quality}") - - media = self.__download_job.check_sources( - [self.__infos_dw], c_quality - ) - - self.__infos_dw['media_url'] = media[0] - c_media = self.__infos_dw['media_url'] - media_list = c_media['media'] - song_link = media_list[0]['sources'][0]['url'] - - try: - crypted_audio = self.__gw_api.song_exist(song_link) - self.__c_quality = qualities[c_quality] - self.__set_quality() - break - except TrackNotFound: - if c_quality == "MP3_128": - raise TrackNotFound("Error with this song", - self.__link) - - self.__write_track() - c_crypted_audio = crypted_audio.iter_content(2048) - c_ids = check_track_ids(self.__infos_dw) - self.__c_track.set_fallback_ids(c_ids) - - decryptfile( - c_crypted_audio, c_ids, self.__song_path - ) - - self.__add_more_tags() - write_tags(self.__c_track) - - return self.__c_track - - def __add_more_tags(self) -> None: - contributors = self.__infos_dw['SNG_CONTRIBUTORS'] - - if "author" in contributors: - self.__song_metadata['author'] = " & ".join( - contributors['author'] - ) - else: - self.__song_metadata['author'] = "" - - if "composer" in contributors: - self.__song_metadata['composer'] = " & ".join( - contributors['composer'] - ) - else: - self.__song_metadata['composer'] = "" - - if "lyricist" in contributors: - self.__song_metadata['lyricist'] = " & ".join( - contributors['lyricist'] - ) - else: - self.__song_metadata['lyricist'] = "" - - if "composerlyricist" in contributors: - self.__song_metadata['composer'] = " & ".join( - contributors['composerlyricist'] - ) - else: - self.__song_metadata['composerlyricist'] = "" - - if "version" in self.__infos_dw: - self.__song_metadata['version'] = self.__infos_dw['VERSION'] - else: - self.__song_metadata['version'] = "" - - self.__song_metadata['lyric'] = "" - self.__song_metadata['copyright'] = "" - self.__song_metadata['lyricist'] = "" - self.__song_metadata['lyric_sync'] = [] - - if self.__infos_dw['LYRICS_ID'] != 0: - need = self.__gw_api.get_lyric(self.__ids) - - if "LYRICS_SYNC_JSON" in need: - self.__song_metadata['lyric_sync'] = trasform_sync_lyric( - need['LYRICS_SYNC_JSON'] - ) - - self.__song_metadata['lyric'] = need['LYRICS_TEXT'] - self.__song_metadata['copyright'] = need['LYRICS_COPYRIGHTS'] - self.__song_metadata['lyricist'] = need['LYRICS_WRITERS'] - - -class TrackDownloader: - def __init__( - self, - preferences: Preferences, - download_job: DownloaderJob - ) -> None: - self.__download_job = download_job - self.__gw_api = download_job.gw_api - - self.__preferences = preferences - self.__ids = self.__preferences.ids - self.__song_metadata = self.__preferences.song_metadata - self.__quality_download = self.__preferences.quality_download - - def dw(self) -> Track: - infos_dw = self.__gw_api.get_song_data(self.__ids) - - media = self.__download_job.check_sources( - [infos_dw], self.__quality_download - ) - - infos_dw['media_url'] = media[0] - - track = Downloader( - infos_dw, self.__preferences, self.__download_job, - ).easy_dw() - - if not track.success: - song = f"{self.__song_metadata['music']} - {self.__song_metadata['artist']}" - error_msg = f"Cannot download {song}" - - raise TrackNotFound(message=error_msg) - - return track - - -class AlbumDownloader: - def __init__( - self, - preferences: Preferences, - download_job: DownloaderJob - ) -> None: - - self.__api = download_job.api - self.__download_job = download_job - self.__gw_api = download_job.gw_api - - self.__preferences = preferences - self.__ids = self.__preferences.ids - self.__make_zip = self.__preferences.make_zip - self.__output_dir = self.__preferences.output_dir - self.__method_save = self.__preferences.method_save - self.__song_metadata = self.__preferences.song_metadata - self.__not_interface = self.__preferences.not_interface - self.__quality_download = self.__preferences.quality_download - - self.__song_metadata_items = self.__song_metadata.items() - - def dw(self) -> Album: - infos_dw = self.__gw_api.get_album_data(self.__ids)['data'] - md5_image = infos_dw[0]['ALB_PICTURE'] - image = self.__api.choose_img(md5_image) - self.__song_metadata['image'] = image - - album = Album(self.__ids) - album.image = image - album.md5_image = md5_image - album.nb_tracks = self.__song_metadata['nb_tracks'] - album.album_name = self.__song_metadata['album'] - album.upc = self.__song_metadata['upc'] - tracks = album.tracks - - medias = self.__download_job.check_sources( - infos_dw, self.__quality_download - ) - - c_song_metadata = {} - - for key, item in self.__song_metadata_items: - if type(item) is not list: - c_song_metadata[key] = self.__song_metadata[key] - - t = tqdm( - range( - len(infos_dw) - ), - desc=c_song_metadata['album'], - disable=self.__not_interface - ) - - for a in t: - for key, item in self.__song_metadata_items: - if type(item) is list: - c_song_metadata[key] = self.__song_metadata[key][a] - - c_infos_dw = infos_dw[a] - c_infos_dw['media_url'] = medias[a] - song = f"{c_song_metadata['music']} - {c_song_metadata['artist']}" - t.set_description_str(song) - c_preferences = deepcopy(self.__preferences) - c_preferences.song_metadata = c_song_metadata - c_preferences.ids = c_infos_dw['SNG_ID'] - - try: - track = Downloader( - c_infos_dw, c_preferences, self.__download_job - ).download_try() - - tracks.append(track) - except TrackNotFound: - try: - ids = self.__api.not_found(song, c_song_metadata['music']) - c_song_data = self.__gw_api.get_song_data(ids) - - c_media = self.__download_job.check_sources( - [c_song_data], self.__quality_download - ) - - c_infos_dw['media_url'] = c_media[0] - - track = Downloader( - c_infos_dw, c_preferences, self.__download_job - ).download_try() - - tracks.append(track) - except TrackNotFound: - track = Track( - c_song_metadata, - None, None, - None, None, None, - ) - - track.success = False - tracks.append(track) - print(f"Track not found: {song} :(") - continue - - if self.__make_zip: - song_quality = tracks[0].quality - - zip_name = create_zip( - tracks, - output_dir=self.__output_dir, - song_metadata=self.__song_metadata, - song_quality=song_quality, - method_save=self.__method_save - ) - - album.zip_path = zip_name - - return album - - -class PlaylistDownloader: - def __init__( - self, - preferences: Preferences, - download_job: DownloaderJob - ) -> None: - - self.__download_job = download_job - self.__gw_api = download_job.gw_api - - self.__preferences = preferences - self.__ids = self.__preferences.ids - self.__json_data = preferences.json_data - self.__make_zip = self.__preferences.make_zip - self.__output_dir = self.__preferences.output_dir - self.__song_metadata = self.__preferences.song_metadata - self.__quality_download = self.__preferences.quality_download - - def dw(self) -> Playlist: - infos_dw = self.__gw_api.get_playlist_data(self.__ids)['data'] - - playlist = Playlist() - tracks = playlist.tracks - - medias = self.__download_job.check_sources( - infos_dw, self.__quality_download - ) - - for c_infos_dw, c_media, c_song_metadata in zip( - infos_dw, medias, self.__song_metadata - ): - c_infos_dw['media_url'] = c_media - c_preferences = deepcopy(self.__preferences) - c_preferences.ids = c_infos_dw['SNG_ID'] - c_preferences.song_metadata = c_song_metadata - c_song_metadata = c_preferences.song_metadata - - if type(c_song_metadata) is str: - print(f"Track not found {c_song_metadata} :(") - continue - - track = Downloader( - c_infos_dw, c_preferences, self.__download_job - ).easy_dw() - - if not track.success: - song = f"{c_song_metadata['music']} - {c_song_metadata['artist']}" - print(f"Cannot download {song}") - - tracks.append(track) - - if self.__make_zip: - playlist_title = self.__json_data['title'] - zip_name = f"{self.__output_dir}/{playlist_title} [playlist {self.__ids}]" - create_zip(tracks, zip_name=zip_name) - playlist.zip_path = zip_name - - return playlist diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/download.pyc b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/download.pyc deleted file mode 100644 index 4cdc1247..00000000 Binary files a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/download.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/download_utils.py b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/download_utils.py deleted file mode 100644 index e6e588a3..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/download_utils.py +++ /dev/null @@ -1,99 +0,0 @@ -#!/usr/bin/python3 - -from binascii import ( - a2b_hex as __a2b_hex, - b2a_hex as __b2a_hex -) -from hashlib import md5 as __md5 - -from Cryptodome.Cipher.AES import ( - new as __newAES, - MODE_ECB as __MODE_ECB -) -from Cryptodome.Cipher.Blowfish import ( - new as __newBlowfish, - MODE_CBC as __MODE_CBC -) - -__secret_key = "g4el58wc0zvf9na1" -__secret_key2 = b"jo6aey6haid2Teih" -__idk = __a2b_hex("0001020304050607") - - -def md5hex(data: str): - hashed = __md5( - data.encode() - ).hexdigest() - - return hashed - - -def gen_song_hash(md5, quality, ids, media): - data = b"\xa4".join( - a.encode() - for a in [ - md5, quality, ids, media - ] - ) - - hashed = ( - __md5(data) - .hexdigest() - .encode() - ) - - data = b"\xa4".join( - [hashed, data] - ) + b"\xa4" - - if len(data) % 16: - data += b"\x00" * (16 - len(data) % 16) - - c = __newAES(__secret_key2, __MODE_ECB) - - media_url = __b2a_hex( - c.encrypt(data) - ).decode() - - return media_url - - -def __calcbfkey(songid): - h = md5hex(songid) - - bfkey = "".join( - chr( - ord(h[i]) ^ ord(h[i + 16]) ^ ord(__secret_key[i]) - ) - - for i in range(16) - ) - - return bfkey - - -def __blowfishDecrypt(data, key): - c = __newBlowfish( - key.encode(), __MODE_CBC, __idk - ) - - return c.decrypt(data) - - -def decryptfile(content, key, name): - key = __calcbfkey(key) - decrypted_audio = open(name, "wb") - seg = 0 - - for data in content: - if ( - (seg % 3) == 0 - ) and ( - len(data) == 2048 - ): - data = __blowfishDecrypt(data, key) - - decrypted_audio.write(data) - seg += 1 - - decrypted_audio.close() diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/download_utils.pyc b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/download_utils.pyc deleted file mode 100644 index 0ce8205f..00000000 Binary files a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/download_utils.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/exceptions.py b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/exceptions.py deleted file mode 100644 index 06ec131a..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/exceptions.py +++ /dev/null @@ -1,87 +0,0 @@ -#!/usr/bin/python3 - -class TrackNotFound(Exception): - def __init__(self, url=None, message=None): - self.url = url - - if not message: - self.message = f"Track {self.url} not found :(" - else: - self.message = message - - super().__init__(self.message) - - -class AlbumNotFound(Exception): - def __init__(self, url=None): - self.url = url - self.msg = f"Album {self.url} not found :(" - super().__init__(self.msg) - - -class InvalidLink(Exception): - def __init__(self, url): - self.url = url - self.msg = f"Invalid Link {self.url} :(" - super().__init__(self.msg) - - -class QuotaExceeded(Exception): - def __init__(self, message=None): - if not message: - self.message = "TOO MUCH REQUESTS LIMIT YOURSELF !!! :)" - - super().__init__(self.message) - - -class QualityNotFound(Exception): - def __init__(self, quality=None, msg=None): - self.quality = quality - - if not msg: - self.msg = ( - f"The {quality} quality doesn't exist :)\ - \nThe qualities have to be FLAC or MP3_320 or MP3_256 or MP3_128" - ) - else: - self.msg = msg - - super().__init__(self.msg) - - -class NoRightOnMedia(Exception): - def __init__(self, msg): - self.msg = msg - super().__init__(msg) - - -class NoDataApi(Exception): - def __init__(self, message): - super().__init__(message) - - -class BadCredentials(Exception): - def __init__( - self, - arl=None, - email=None, - password=None, - msg=None - ): - if msg: - self.msg = msg - else: - self.arl = arl - self.email = email - self.password = password - - if arl: - self.msg = f"Wrong token: {arl} :(" - else: - self.msg = f"Wrong credentials email: {self.email}, password: {self.password}" - - super().__init__(self.msg) - - -class CredentialsMissing(Exception): - """ Deezer credentials not set! """ \ No newline at end of file diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/exceptions.pyc b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/exceptions.pyc deleted file mode 100644 index e9617646..00000000 Binary files a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/exceptions.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/gateway.py b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/gateway.py deleted file mode 100644 index 57d3cb74..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/gateway.py +++ /dev/null @@ -1,279 +0,0 @@ -#!/usr/bin/python3 - -from requests import Session -from requests import ( - get as req_get, - post as req_post -) - -from .settings import qualities -from .download_utils import md5hex -from .exceptions import ( - BadCredentials, TrackNotFound, NoRightOnMedia -) - -client_id = "172365" -client_secret = "fb0bec7ccc063dab0417eb7b0d847f34" -try_link = "https://api.deezer.com/platform/generic/track/3135556" - - -class Gateway: - def __init__( - self, - arl=None, - email=None, - password=None - ): - self.__req = Session() - self.__arl = arl - self.__email = email - self.__password = password - self.__token = "null" - self.__get_lyric = "song.getLyrics" - self.__get_song_data = "song.getData" - self.__get_user_getArl = "user.getArl" - self.__get_page_track = "deezer.pageTrack" - self.__get_user_data = "deezer.getUserData" - self.__get_album_data = "song.getListByAlbum" - self.__get_playlist_data = "playlist.getSongs" - self.__get_media_url = "https://media.deezer.com/v1/get_url" - self.__get_auth_token_url = "https://api.deezer.com/auth/token" - self.__private_api_link = "https://www.deezer.com/ajax/gw-light.php" - self.__song_server = "https://e-cdns-proxy-{}.dzcdn.net/mobile/1/{}" - self.__refresh_token() - - def __login(self): - if ( - (not self.__arl) and - (not self.__email) and - (not self.__password) - ): - msg = f"NO LOGIN STUFF INSERTED :)))" - - raise BadCredentials(msg=msg) - - if self.__arl: - self.__req.cookies['arl'] = self.__arl - else: - self.__get_arl() - - def __get_arl(self): - access_token = self.__get_access_token() - - c_headers = { - "Authorization": f"Bearer {access_token}" - } - - self.__req.get(try_link, headers=c_headers).json() - arl = self.__get_api(self.__get_user_getArl) - self.__req.cookies.get("sid") - self.__arl = arl - - def __get_access_token(self): - password = md5hex(self.__password) - - request_hash = md5hex( - "".join( - [ - client_id, self.__email, password, client_secret - ] - ) - ) - - params = { - "app_id": client_id, - "login": self.__email, - "password": password, - "hash": request_hash - } - - results = req_get(self.__get_auth_token_url, params=params).json() - - if "error" in results: - raise BadCredentials( - email=self.__email, - password=self.__password - ) - - access_token = results['access_token'] - - return access_token - - def __cool_api(self): - guest_sid = self.__req.cookies.get("sid") - url = "https://api.deezer.com/1.0/gateway.php" - - params = { - 'api_key': "4VCYIJUCDLOUELGD1V8WBVYBNVDYOXEWSLLZDONGBBDFVXTZJRXPR29JRLQFO6ZE", - 'sid': guest_sid, - 'input': '3', - 'output': '3', - 'method': 'song_getData' - } - - json = {'sng_id': 302127} - - json = req_post(url, params=params, json=json).json() - print(json) - - def __get_api( - self, method, - json_data=None - ): - params = { - "api_version": "1.0", - "api_token": self.__token, - "input": "3", - "method": method - } - - results = self.__req.post( - self.__private_api_link, - params=params, - json=json_data - ).json()['results'] - - if not results: - self.__refresh_token() - self.__get_api(method, json_data) - - return results - - def get_user(self): - data = self.__get_api(self.__get_user_data) - return data - - def __refresh_token(self): - self.__req.cookies.clear_session_cookies() - - if not self.amIlog(): - self.__login() - self.am_I_log() - - data = self.get_user() - self.__token = data['checkForm'] - self.__license_token = self.__get_license_token() - - def __get_license_token(self): - data = self.get_user() - license_token = data['USER']['OPTIONS']['license_token'] - - return license_token - - def amIlog(self): - data = self.get_user() - user_id = data['USER']['USER_ID'] - is_logged = False - - if user_id != 0: - is_logged = True - - return is_logged - - def am_I_log(self): - if not self.amIlog(): - raise BadCredentials(arl=self.__arl) - - def get_song_data(self, ids): - json_data = { - "sng_id": ids - } - - infos = self.__get_api(self.__get_song_data, json_data) - - return infos - - def get_album_data(self, ids): - json_data = { - "alb_id": ids, - "nb": -1 - } - - infos = self.__get_api(self.__get_album_data, json_data) - - return infos - - def get_lyric(self, ids): - json_data = { - "sng_id": ids - } - - infos = self.__get_api(self.__get_lyric, json_data) - - return infos - - def get_playlist_data(self, ids): - json_data = { - "playlist_id": ids, - "nb": -1 - } - - infos = self.__get_api(self.__get_playlist_data, json_data) - - return infos - - def get_page_track(self, ids): - json_data = { - "sng_id": ids - } - - infos = self.__get_api(self.__get_page_track, json_data) - - return infos - - def get_song_url(self, n, song_hash): - song_url = self.__song_server.format(n, song_hash) - - return song_url - - def song_exist(self, song_url): - crypted_audio = req_get(song_url) - - if len(crypted_audio.content) == 0: - raise TrackNotFound - - return crypted_audio - - def get_medias_url(self, tracks_token, quality): - others_qualities = [] - - for c_quality in qualities: - if c_quality == quality: - continue - - c_quality_set = { - "cipher": "BF_CBC_STRIPE", - "format": c_quality - } - - others_qualities.append(c_quality_set) - - json_data = { - "license_token": self.__license_token, - "media": [ - { - "type": "FULL", - "formats": [ - { - "cipher": "BF_CBC_STRIPE", - "format": quality - } - ] # + others_qualities - } - ], - "track_tokens": tracks_token - } - - infos = req_post( - self.__get_media_url, - json=json_data - ).json() - - if "errors" in infos: - msg = infos['errors'][0]['message'] - - raise NoRightOnMedia(msg) - - medias = infos['data'] - - return medias diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/gateway.pyc b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/gateway.pyc deleted file mode 100644 index 2d88d0fa..00000000 Binary files a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/gateway.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/models/__init__.py b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/models/__init__.py deleted file mode 100644 index 2c9ae656..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/models/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/python3 - -from .album import Album -from .playlist import Playlist -from .preferences import Preferences -from .track import Track diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/models/__init__.pyc b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/models/__init__.pyc deleted file mode 100644 index 6fc502e6..00000000 Binary files a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/models/__init__.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/models/album.py b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/models/album.py deleted file mode 100644 index 8556cad9..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/models/album.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/python3 - - -class Album: - def __init__(self, ids: int) -> None: - self.__t_list = [] - self.zip_path = None - self.image = None - self.album_quality = None - self.md5_image = None - self.ids = ids - self.nb_tracks = None - self.album_name = None - self.upc = None - self.__set_album_md5() - - @property - def tracks(self): - return self.__t_list - - def __set_album_md5(self): - self.album_md5 = f"album/{self.ids}" diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/models/album.pyc b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/models/album.pyc deleted file mode 100644 index 1d1c9dec..00000000 Binary files a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/models/album.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/models/playlist.py b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/models/playlist.py deleted file mode 100644 index c6c302c4..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/models/playlist.py +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/python3 - - -class Playlist: - def __init__(self, tracklist=None) -> None: - self.__t_list = tracklist or [] - self.zip_path = None - - @property - def tracks(self): - return self.__t_list diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/models/playlist.pyc b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/models/playlist.pyc deleted file mode 100644 index 962e68f0..00000000 Binary files a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/models/playlist.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/models/preferences.py b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/models/preferences.py deleted file mode 100644 index e042ad72..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/models/preferences.py +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/python3 - -class Preferences: - def __init__(self) -> None: - self.link = None - self.song_metadata = None - self.quality_download = None - self.output_dir = None - self.ids = None - self.json_data = None - self.recursive_quality = None - self.recursive_download = None - self.not_interface = None - self.method_save = None - self.make_zip = None diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/models/preferences.pyc b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/models/preferences.pyc deleted file mode 100644 index 2b51983a..00000000 Binary files a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/models/preferences.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/models/track.py b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/models/track.py deleted file mode 100644 index 91b372a8..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/models/track.py +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/python3 -from tempfile import gettempdir -from os.path import isfile - - -class Track: - def __init__( - self, - tags: dict, - song_path: str, - file_format: str, - quality: str, - link: str, - ids: int - ) -> None: - self.tags = tags - self.__set_tags() - self.song_name = f"{self.music} - {self.artist}" - self.song_path = song_path - self.file_format = file_format - self.quality = quality - self.link = link - self.ids = ids - self.md5_image = None - self.success = True - self.__set_track_md5() - - @property - def image_path(self): - path = self.song_path + ".jpg" - if not isfile(path): - try: - with open(path, "wb") as f: - f.write(self.tags["image"]) - except: - pass - return path - - @property - def track_info(self): - return { - "title": self.tags.get("music") or self.song_name, - "url": self.link, - "album": self.tags.get("album"), - "genre": self.tags.get("genre"), - "artist": self.tags.get("artist"), - "duration": self.tags.get("duration", 0) - } - - def __set_tags(self): - for tag, value in self.tags.items(): - setattr( - self, tag, value - ) - - def __set_track_md5(self): - self.track_md5 = f"track/{self.ids}" - - def set_fallback_ids(self, fallback_ids): - self.fallback_ids = fallback_ids - self.fallback_track_md5 = f"track/{self.fallback_ids}" diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/models/track.pyc b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/models/track.pyc deleted file mode 100644 index 72f8e839..00000000 Binary files a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/models/track.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/settings.py b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/settings.py deleted file mode 100644 index f90df9a6..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/settings.py +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/python3 - -header = { - "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0", - "Accept-Language": "en-US;q=0.5,en;q=0.3" -} - -method_saves = ["0", "1", "2"] - -qualities = { - "FLAC": { - "n_quality": "9", - "f_format": ".flac", - "s_quality": "FLAC" - }, - - "MP3_320": { - "n_quality": "3", - "f_format": ".mp3", - "s_quality": "320" - }, - - "MP3_128": { - "n_quality": "1", - "f_format": ".mp3", - "s_quality": "128" - } -} diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/settings.pyc b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/settings.pyc deleted file mode 100644 index bfc4ad6b..00000000 Binary files a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/settings.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/taggers.py b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/taggers.py deleted file mode 100644 index c91f6580..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/taggers.py +++ /dev/null @@ -1,228 +0,0 @@ -#!/usr/bin/python3 - -from mutagen.flac import FLAC, Picture -from mutagen.id3 import ( - ID3NoHeaderError, - ID3, APIC, USLT, SYLT, - COMM, TSRC, TRCK, TIT2, - TLEN, TEXT, TCON, TALB, TBPM, - TPE1, TYER, TDAT, TPOS, TPE2, - TPUB, TCOP, TXXX, TCOM, IPLS -) - -from .models.track import Track - - -def __write_flac(song, data): - tag = FLAC(song) - tag.delete() - images = Picture() - images.type = 3 - images.data = data['image'] - tag.clear_pictures() - tag.add_picture(images) - tag['lyrics'] = data['lyric'] - tag['artist'] = data['artist'] - tag['title'] = data['music'] - tag[ - 'date'] = f"{data['year'].year}/{data['year'].month}/{data['year'].day}" - tag['album'] = data['album'] - tag['tracknumber'] = f"{data['tracknum']}" - tag['discnumber'] = f"{data['discnum']}" - tag['genre'] = data['genre'] - tag['albumartist'] = data['ar_album'] - tag['author'] = data['author'] - tag['composer'] = data['composer'] - tag['copyright'] = data['copyright'] - tag['bpm'] = f"{data['bpm']}" - tag['length'] = f"{data['duration']}" - tag['organization'] = data['label'] - tag['isrc'] = data['isrc'] - tag['lyricist'] = data['lyricist'] - tag['version'] = data['version'] - tag.save() - - -def __write_mp3(song, data): - try: - audio = ID3(song) - audio.delete() - except ID3NoHeaderError: - audio = ID3() - - audio.add( - APIC( - mime="image/jpeg", - type=3, - desc="album front cover", - data=data['image'] - ) - ) - - audio.add( - COMM( - lang="eng", - desc="my comment", - text="DO NOT USE FOR YOUR OWN EARNING" - ) - ) - - audio.add( - USLT( - text=data['lyric'] - ) - ) - - audio.add( - SYLT( - type=1, - format=2, - desc="sync lyric song", - text=data['lyric_sync'] - ) - ) - - audio.add( - TSRC( - text=data['isrc'] - ) - ) - - audio.add( - TRCK( - text=f"{data['tracknum']}/{data['nb_tracks']}" - ) - ) - - audio.add( - TIT2( - text=data['music'] - ) - ) - - audio.add( - TLEN( - text=f"{data['duration']}" - ) - ) - - audio.add( - TEXT( - text=data['lyricist'] - ) - ) - - audio.add( - TCON( - text=data['genre'] - ) - ) - - audio.add( - TALB( - text=data['album'] - ) - ) - - audio.add( - TBPM( - text=f"{data['bpm']}" - ) - ) - - audio.add( - TPE1( - text=data['artist'] - ) - ) - - audio.add( - TYER( - text=f"{data['year'].year}" - ) - ) - - audio.add( - TDAT( - text=f"{data['year'].day}{data['year'].month}" - ) - ) - - audio.add( - TPOS( - text=f"{data['discnum']}/{data['discnum']}" - ) - ) - - audio.add( - TPE2( - text=data['ar_album'] - ) - ) - - audio.add( - TPUB( - text=data['label'] - ) - ) - - audio.add( - TCOP( - text=data['copyright'] - ) - ) - - audio.add( - TXXX( - desc="REPLAYGAIN_TRACK_GAIN", - text=f"{data['gain']}" - ) - ) - - audio.add( - TCOM( - text=data['composer'] - ) - ) - - audio.add( - IPLS( - people=[data['author']] - ) - ) - - audio.save(song, v2_version=3) - - -def write_tags(track: Track): - song = track.song_path - song_metadata = track.tags - f_format = track.file_format - - if f_format == ".flac": - __write_flac(song, song_metadata) - else: - __write_mp3(song, song_metadata) - - -def check_track(track: Track): - song = track.song_path - f_format = track.file_format - is_ok = False - - if f_format == ".flac": - tags = FLAC(song) - else: - try: - tags = ID3(song) - except ID3NoHeaderError: - return is_ok - - l_tags = len( - tags.keys() - ) - - if l_tags > 15: - is_ok = True - - return is_ok diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/taggers.pyc b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/taggers.pyc deleted file mode 100644 index 28d93f9c..00000000 Binary files a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/taggers.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/utils.py b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/utils.py deleted file mode 100644 index 6c19c5b6..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/utils.py +++ /dev/null @@ -1,228 +0,0 @@ -#!/usr/bin/python3 - -from datetime import datetime -from os import makedirs -from os.path import ( - isdir, basename, join -) -from urllib.parse import urlparse -from zipfile import ZipFile, ZIP_DEFLATED - -from requests import get as req_get - -from .settings import header -from .exceptions import InvalidLink - - -def link_is_valid(link): - netloc = urlparse(link).netloc - - if not any( - c_link == netloc - for c_link in ["www.deezer.com", "deezer.com", "deezer.page.link"] - ): - raise InvalidLink(link) - - -def get_ids(link): - parsed = urlparse(link) - path = parsed.path - ids = path.split("/")[-1] - return ids - - -def request(url): - thing = req_get(url, headers=header) - return thing - - -def artist_sort(array): - if len(array) > 1: - for a in array: - for b in array: - if a in b and a != b: - array.remove(b) - - array = list( - dict.fromkeys(array) - ) - - artists = " & ".join(array) - return artists - - -def __check_dir(directory): - if not isdir(directory): - makedirs(directory) - - -def check_track_md5(infos: dict): - if "FALLBACK" in infos: - song_md5 = infos['FALLBACK']['MD5_ORIGIN'] - version = infos['FALLBACK']['MEDIA_VERSION'] - else: - song_md5 = infos['MD5_ORIGIN'] - version = infos['MEDIA_VERSION'] - - return song_md5, version - - -def check_track_token(infos: dict): - if "FALLBACK" in infos: - track_token = infos['FALLBACK']['TRACK_TOKEN'] - else: - track_token = infos['TRACK_TOKEN'] - - return track_token - - -def check_track_ids(infos: dict): - if "FALLBACK" in infos: - ids = infos['FALLBACK']['SNG_ID'] - else: - ids = infos['SNG_ID'] - - return ids - - -def __var_excape(string): - string = ( - string - .replace("\\", "") - .replace("/", "") - .replace(":", "") - .replace("*", "") - .replace("?", "") - .replace("\"", "") - .replace("<", "") - .replace(">", "") - .replace("|", "") - .replace("&", "") - ) - - return string - - -def convert_to_date(date): - if date == "0000-00-00": - date = "0001-01-01" - - date = datetime.strptime(date, "%Y-%m-%d") - return date - - -def what_kind(link): - url = request(link).url - return url - - -def __get_dir(song_metadata, output_dir, method_save): - album = __var_excape(song_metadata['album']) - artist = __var_excape(song_metadata['ar_album']) - upc = song_metadata['upc'] - - if method_save == 0: - song_dir = f"{album} [{upc}]" - - elif method_save == 1: - song_dir = f"{album} - {artist}" - - elif method_save == 2: - song_dir = f"{album} - {artist} [{upc}]" - - song_dir = song_dir[:255] - final_dir = join(output_dir, song_dir) - final_dir += "/" - return final_dir - - -def set_path( - song_metadata, output_dir, - song_quality, file_format, method_save -): - album = __var_excape(song_metadata['album']) - artist = __var_excape(song_metadata['artist']) - music = __var_excape(song_metadata['music']) - - if method_save == 0: - discnum = song_metadata['discnumber'] - tracknum = song_metadata['tracknumber'] - song_name = f"{album} CD {discnum} TRACK {tracknum}" - - elif method_save == 1: - song_name = f"{music} - {artist}" - - elif method_save == 2: - isrc = song_metadata['isrc'] - song_name = f"{music} - {artist} [{isrc}]" - - song_dir = __get_dir(song_metadata, output_dir, method_save) - __check_dir(song_dir) - - l_encoded = len( - song_name.encode() - ) - - if l_encoded > 242: - n_tronc = l_encoded - 242 - n_tronc = len(song_name) - n_tronc - else: - n_tronc = 242 - - song_path = f"{song_dir}{song_name[:n_tronc]}" - song_path += f" ({song_quality}){file_format}" - - return song_path - - -def create_zip( - tracks: [], - output_dir=None, - song_metadata=None, - song_quality=None, - method_save=0, - zip_name=None -): - if not zip_name: - album = __var_excape(song_metadata['album']) - song_dir = __get_dir(song_metadata, output_dir, method_save) - - if method_save == 0: - zip_name = f"{song_dir}{album} ({song_quality})" - - elif method_save == 1: - artist = __var_excape(song_metadata['ar_album']) - zip_name = f"{song_dir}{album} - {artist} ({song_quality})" - - elif method_save == 2: - artist = __var_excape(song_metadata['ar_album']) - upc = song_metadata['upc'] - zip_name = f"{song_dir}{album} - {artist} {upc} ({song_quality})" - - zip_name += ".zip" - z = ZipFile(zip_name, "w", ZIP_DEFLATED) - - for track in tracks: - if not track.success: - continue - - c_song_path = track.song_path - song_path = basename(c_song_path) - z.write(c_song_path, song_path) - - z.close() - return zip_name - - -def trasform_sync_lyric(lyric): - sync_array = [] - - for a in lyric: - if "milliseconds" in a: - arr = ( - a['line'], int(a['milliseconds']) - ) - - sync_array.append(arr) - - return sync_array diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/utils.pyc b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/utils.pyc deleted file mode 100644 index 8b512551..00000000 Binary files a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/deezeridu/utils.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp-0.7.0.dist-info/DESCRIPTION.rst b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp-0.7.0.dist-info/DESCRIPTION.rst deleted file mode 100644 index e1187231..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp-0.7.0.dist-info/DESCRIPTION.rst +++ /dev/null @@ -1,3 +0,0 @@ -UNKNOWN - - diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp-0.7.0.dist-info/INSTALLER b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp-0.7.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e3..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp-0.7.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp-0.7.0.dist-info/METADATA b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp-0.7.0.dist-info/METADATA deleted file mode 100644 index ab9ad784..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp-0.7.0.dist-info/METADATA +++ /dev/null @@ -1,16 +0,0 @@ -Metadata-Version: 2.0 -Name: py-bandcamp -Version: 0.7.0 -Summary: bandcamp data scrapper -Home-page: https://github.com/OpenJarbas/py_bandcamp -Author: jarbasAI -Author-email: jarbasai@mailfence.com -License: Apache2 -Platform: UNKNOWN -Requires-Dist: beautifulsoup4 -Requires-Dist: requests -Requires-Dist: requests-cache - -UNKNOWN - - diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp-0.7.0.dist-info/RECORD b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp-0.7.0.dist-info/RECORD deleted file mode 100644 index 23048aef..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp-0.7.0.dist-info/RECORD +++ /dev/null @@ -1,16 +0,0 @@ -py_bandcamp-0.7.0.dist-info/DESCRIPTION.rst,sha256=OCTuuN6LcWulhHS3d5rfjdsQtW22n7HENFRh6jC6ego,10 -py_bandcamp-0.7.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -py_bandcamp-0.7.0.dist-info/METADATA,sha256=v64yE1qTYkPrI6J2MtCwmVQdOOZbFHrdr5vQC5guAmk,324 -py_bandcamp-0.7.0.dist-info/RECORD,, -py_bandcamp-0.7.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -py_bandcamp-0.7.0.dist-info/WHEEL,sha256=rNo05PbNqwnXiIHFsYm0m22u4Zm6YJtugFG2THx4w3g,92 -py_bandcamp-0.7.0.dist-info/metadata.json,sha256=N3uWHAUUKCiP03daPAIJfc8j6sUY8GyWfXM1r4KBukg,512 -py_bandcamp-0.7.0.dist-info/top_level.txt,sha256=bbnj4Boxiv1B7Bo1GHfc5_jVs9p4egzSunq5FQtaCsQ,12 -py_bandcamp/__init__.py,sha256=NI84FGwg_EouRuSqRp4JsO5MvSKbuizjOzXsWlNo_R0,9801 -py_bandcamp/__init__.pyc,, -py_bandcamp/models.py,sha256=bCz1oNwDEioNvMAzy8mVmX6bX7NhcjYVKew1_ncsajI,10877 -py_bandcamp/models.pyc,, -py_bandcamp/session.py,sha256=j3KLPYMn5YV6rgZNNT9MFpLJJ374HBY0f3SDnTUPnjA,101 -py_bandcamp/session.pyc,, -py_bandcamp/utils.py,sha256=k5tJESDviwz5wJawRqFR-99TOcYLwilUFInPfoa19oU,2076 -py_bandcamp/utils.pyc,, diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp-0.7.0.dist-info/WHEEL b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp-0.7.0.dist-info/WHEEL deleted file mode 100644 index bb7f7dba..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp-0.7.0.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.29.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp-0.7.0.dist-info/metadata.json b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp-0.7.0.dist-info/metadata.json deleted file mode 100644 index 87db0791..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp-0.7.0.dist-info/metadata.json +++ /dev/null @@ -1 +0,0 @@ -{"extensions": {"python.details": {"contacts": [{"email": "jarbasai@mailfence.com", "name": "jarbasAI", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://github.com/OpenJarbas/py_bandcamp"}}}, "extras": [], "generator": "bdist_wheel (0.29.0)", "license": "Apache2", "metadata_version": "2.0", "name": "py-bandcamp", "run_requires": [{"requires": ["beautifulsoup4", "requests", "requests-cache"]}], "summary": "bandcamp data scrapper", "version": "0.7.0"} \ No newline at end of file diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp-0.7.0.dist-info/top_level.txt b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp-0.7.0.dist-info/top_level.txt deleted file mode 100644 index e7c573ec..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp-0.7.0.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -py_bandcamp diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp/__init__.py b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp/__init__.py deleted file mode 100644 index 8e84106f..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp/__init__.py +++ /dev/null @@ -1,248 +0,0 @@ -from py_bandcamp.models import * -from py_bandcamp.session import SESSION as requests -from py_bandcamp.utils import extract_ldjson_blob, get_props, extract_blob, \ - get_stream_data - - -class BandCamp: - @staticmethod - def tags(tag_list=True): - data = extract_blob("https://bandcamp.com/tags") - tags = {"genres": data["signup_params"]["genres"], - "subgenres": data["signup_params"]["subgenres"]} - if not tag_list: - return tags - tag_list = [] - for genre in tags["subgenres"]: - tag_list.append(genre) - tag_list += [sub["norm_name"] for sub in tags["subgenres"][genre]] - return tag_list - - @classmethod - def search_tag(cls, tag, page=1, pop_date=1): - tag = tag.strip().replace(" ", "-").lower() - if tag not in cls.tags(): - return [] - params = {"page": page, "sort_field": pop_date} - url = 'http://bandcamp.com/tag/' + str(tag) - data = extract_blob(url, params=params) - - related_tags = [{"name": t["norm_name"], "score": t["relation"]} - for t in data["hub"].pop("related_tags")] - - collections, dig_deeper = data["hub"].pop("tabs") - dig_deeper = dig_deeper["dig_deeper"]["results"] - collections = collections["collections"] - - _to_remove = ['custom_domain', 'custom_domain_verified', "item_type", - 'packages', 'slug_text', 'subdomain', 'is_preorder', - 'item_id', 'num_comments', 'tralbum_id', 'band_id', - 'tralbum_type', 'tag_id', 'audio_track_id'] - - for c in collections: - if c["name"] == "bc_dailys": - continue - for result in c["items"]: - result["image"] = "https://f4.bcbits.com/img/a{art_id}_1.jpg". \ - format(art_id=result.pop("art_id")) - for _ in _to_remove: - if _ in result: - result.pop(_) - result["related_tags"] = related_tags - result["collection"] = c["name"] - if "tralbum_url" in result: - result["album_url"] = result.pop("tralbum_url") - # TODO featured track object - yield BandcampTrack(result, parse=False) - - for k in dig_deeper: - for result in dig_deeper[k]["items"]: - for _ in _to_remove: - if _ in result: - result.pop(_) - result["related_tags"] = related_tags - result["collection"] = "dig_deeper" - if "tralbum_url" in result: - result["album_url"] = result.pop("tralbum_url") - # TODO featured track object - yield BandcampTrack(result, parse=False) - - @classmethod - def search_albums(cls, album_name): - for album in cls.search(album_name, albums=True, tracks=False, - artists=False, labels=False): - yield album - - @classmethod - def search_tracks(cls, track_name): - for t in cls.search(track_name, albums=False, tracks=True, - artists=False, labels=False): - yield t - - @classmethod - def search_artists(cls, artist_name): - for a in cls.search(artist_name, albums=False, tracks=False, - artists=True, labels=False): - yield a - - @classmethod - def search_labels(cls, label_name): - for a in cls.search(label_name, albums=False, tracks=False, - artists=False, labels=True): - yield a - - @classmethod - def search(cls, name, page=1, albums=True, tracks=True, artists=True, - labels=False): - params = {"page": page, "q": name} - response = requests.get('http://bandcamp.com/search', params=params) - html_doc = response.content - soup = BeautifulSoup(html_doc, 'html.parser') - - seen = [] - for item in soup.find_all("li", class_="searchresult"): - item_type = item.find('div', - class_='itemtype').text.strip().lower() - if item_type == "album" and albums: - data = cls._parse_album(item) - elif item_type == "track" and tracks: - data = cls._parse_track(item) - elif item_type == "artist" and artists: - data = cls._parse_artist(item) - elif item_type == "label" and labels: - data = cls._parse_label(item) - else: - continue - # data["type"] = type - yield data - seen.append(data) - if not len(seen): - return # no more pages - for item in cls.search(name, page=page + 1, albums=albums, - tracks=tracks, artists=artists, - labels=labels): - if item in seen: - return # duplicate data, fail safe out of loops - yield item - - @staticmethod - def get_track_lyrics(track_url): - track_page = requests.get(track_url) - track_soup = BeautifulSoup(track_page.text, 'html.parser') - track_lyrics = track_soup.find("div", {"class": "lyricsText"}) - if track_lyrics: - return track_lyrics.text - return "lyrics unavailable" - - @classmethod - def get_streams(cls, urls): - if not isinstance(urls, list): - urls = [urls] - direct_links = [cls.get_stream_url(url) for url in urls] - return direct_links - - @classmethod - def get_stream_url(cls, url): - data = get_stream_data(url) - print(data) - for p in data['additionalProperty']: - if p['name'] == 'file_mp3-128': - return p["value"] - return url - - @staticmethod - def _parse_label(item): - art = item.find("div", {"class": "art"}).find("img") - if art: - art = art["src"] - name = item.find('div', class_='heading').text.strip() - url = item.find( - 'div', class_='heading').find('a')['href'].split("?")[0] - location = item.find('div', class_='subhead').text.strip() - try: - tags = item.find( - 'div', class_='tags').text.replace("tags:", "").split(",") - tags = [t.strip().lower() for t in tags] - except: # sometimes missing - tags = [] - - data = {"name": name, "location": location, - "tags": tags, "url": url, "image": art - } - return BandcampLabel(data) - - @staticmethod - def _parse_artist(item): - name = item.find('div', class_='heading').text.strip() - url = item.find( - 'div', class_='heading').find('a')['href'].split("?")[0] - genre = item.find( - 'div', class_='genre').text.strip().replace("genre: ", "") - location = item.find('div', class_='subhead').text.strip() - try: - tags = item.find( - 'div', class_='tags').text.replace("tags:", "").split(",") - tags = [t.strip().lower() for t in tags] - except: # sometimes missing - tags = [] - art = item.find("div", {"class": "art"}).find("img")["src"] - - data = {"name": name, "genre": genre, "location": location, - "tags": tags, "url": url, "image": art, "albums": [] - } - return BandcampArtist(data) - - @staticmethod - def _parse_track(item): - track_name = item.find('div', class_='heading').text.strip() - url = item.find( - 'div', class_='heading').find('a')['href'].split("?")[0] - album_name, artist = item.find( - 'div', class_='subhead').text.strip().split("by") - album_name = album_name.strip().replace("from ", "") - artist = artist.strip() - released = item.find( - 'div', class_='released').text.strip().replace("released ", "") - try: - tags = item.find( - 'div', class_='tags').text.replace("tags:", "").split(",") - tags = [t.strip().lower() for t in tags] - except: # sometimes missing - tags = [] - - art = item.find("div", {"class": "art"}).find("img")["src"] - data = {"track_name": track_name, "released": released, "url": url, - "tags": tags, "album_name": album_name, "artist": artist, - "image": art - } - return BandcampTrack(data) - - @staticmethod - def _parse_album(item): - art = item.find("div", {"class": "art"}).find("img")["src"] - album_name = item.find('div', class_='heading').text.strip() - url = item.find( - 'div', class_='heading').find('a')['href'].split("?")[0] - length = item.find('div', class_='length').text.strip() - tracks, minutes = length.split(",") - tracks = tracks.replace(" tracks", "").replace(" track", "").strip() - minutes = minutes.replace(" minutes", "").strip() - released = item.find( - 'div', class_='released').text.strip().replace("released ", "") - tags = item.find( - 'div', class_='tags').text.replace("tags:", "").split(",") - tags = [t.strip().lower() for t in tags] - artist = item.find("div", {"class": "subhead"}).text.strip() - if artist.startswith("by "): - artist = artist[3:] - data = {"album_name": album_name, - "length": length, - "minutes": minutes, - "url": url, - "image": art, - "artist": artist, - "track_number": tracks, - "released": released, - "tags": tags - } - return BandcampAlbum(data, scrap=False) diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp/__init__.pyc b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp/__init__.pyc deleted file mode 100644 index 259acc06..00000000 Binary files a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp/__init__.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp/models.py b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp/models.py deleted file mode 100644 index d7df7e15..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp/models.py +++ /dev/null @@ -1,406 +0,0 @@ -from bs4 import BeautifulSoup -from py_bandcamp.session import SESSION as requests -from py_bandcamp.utils import extract_ldjson_blob, get_props - - -class BandcampTrack: - def __init__(self, data, parse=True): - self._url = data.get("url") - self._data = data or {} - self._page_data = {} - if parse: - self.parse_page() - if not self.url: - raise ValueError("bandcamp url is not set") - - def parse_page(self): - self._page_data = self.get_track_data(self.url) - return self._page_data - - @staticmethod - def from_url(url): - return BandcampTrack({"url": url}) - - @property - def url(self): - return self._url or self.data.get("url") - - @property - def album(self): - return self.get_album(self.url) - - @property - def artist(self): - return self.get_artist(self.url) - - @property - def data(self): - for k, v in self._page_data.items(): - self._data[k] = v - return self._data - - @property - def title(self): - return self.data.get("title") or self.data.get("name") or \ - self.url.split("/")[-1] - - @property - def image(self): - return self.data.get("image") - - @property - def track_num(self): - return self.data.get("tracknum") - - @property - def duration(self): - return self.data.get("duration_secs") or 0 - - @property - def stream(self): - return self.data.get("file_mp3-128") - - @staticmethod - def get_album(url): - data = extract_ldjson_blob(url, clean=True) - if data.get('inAlbum'): - return BandcampAlbum({ - "title": data['inAlbum'].get('name'), - "url": data['inAlbum'].get('id', url).split("#")[0], - 'type': data['inAlbum'].get("type"), - }) - - @staticmethod - def get_artist(url): - data = extract_ldjson_blob(url, clean=True) - d = data.get("byArtist") - if d: - return BandcampArtist({ - "title": d.get('name'), - "url": d.get('id', url).split("#")[0], - 'genre': d.get('genre'), - "artist_type": d.get('type') - }, scrap=False) - return None - - @staticmethod - def get_track_data(url): - data = extract_ldjson_blob(url, clean=True) - kwords = data.get('keywords', "") - if isinstance(kwords, str): - kwords = kwords.split(", ") - track = { - 'dateModified': data.get('dateModified'), - 'datePublished': data.get('datePublished'), - "url": data.get('id') or url, - "title": data.get("name"), - "type": data.get("type"), - 'image': data.get('image'), - 'keywords': kwords - } - for k, v in get_props(data).items(): - track[k] = v - return track - - def __repr__(self): - return self.__class__.__name__ + ":" + self.title - - def __str__(self): - return self.url - - -class BandcampAlbum: - def __init__(self, data, scrap=True): - self._url = data.get("url") - self._data = data or {} - self._page_data = {} - if scrap: - self.scrap() - if not self.url: - raise ValueError("bandcamp url is not set") - - def scrap(self): - self._page_data = self.get_album_data(self.url) - return self._page_data - - @staticmethod - def from_url(url): - return BandcampAlbum({"url": url}) - - @property - def image(self): - return self.data.get("image") - - @property - def url(self): - return self._url or self.data.get("url") - - @property - def title(self): - return self.data.get("title") or self.data.get("name") or \ - self.url.split("/")[-1] - - @property - def releases(self): - return self.get_releases(self.url) - - @property - def artist(self): - return self.get_artist(self.url) - - @property - def keywords(self): - return self.data.get("keywords") or [] - - @property - def tracks(self): - return self.get_tracks(self.url) - - @property - def featured_track(self): - if not len(self.tracks): - return None - num = self.data.get('featured_track_num', 1) or 1 - return self.tracks[int(num) - 1] - - @property - def comments(self): - return self.get_comments(self.url) - - @property - def data(self): - for k, v in self._page_data.items(): - self._data[k] = v - return self._data - - @staticmethod - def get_releases(url): - data = extract_ldjson_blob(url, clean=True) - releases = [] - for d in data.get("albumRelease", []): - release = { - "description": d.get("description"), - 'image': d.get('image'), - "title": d.get('name'), - "url": d.get('id', url).split("#")[0], - 'format': d.get('musicReleaseFormat'), - } - releases.append(release) - return releases - - @staticmethod - def get_artist(url): - data = extract_ldjson_blob(url, clean=True) - d = data.get("byArtist") - if d: - return BandcampArtist({ - "description": d.get("description"), - 'image': d.get('image'), - "title": d.get('name'), - "url": d.get('id', url).split("#")[0], - 'genre': d.get('genre'), - "artist_type": d.get('type') - }, scrap=False) - return None - - @staticmethod - def get_tracks(url): - data = extract_ldjson_blob(url, clean=True) - if not data.get("track"): - return [] - - data = data['track'] - - tracks = [] - - for d in data.get('itemListElement', []): - d = d['item'] - track = { - "title": d.get('name'), - "url": d.get('id') or url, - 'type': d.get('type'), - } - for k, v in get_props(d).items(): - track[k] = v - tracks.append(BandcampTrack(track, parse=False)) - return tracks - - @staticmethod - def get_comments(url): - data = extract_ldjson_blob(url, clean=True) - comments = [] - for d in data.get("comment", []): - comment = { - "text": d["text"], - 'image': d["author"].get("image"), - "author": d["author"]["name"] - } - comments.append(comment) - return comments - - @staticmethod - def get_album_data(url): - data = extract_ldjson_blob(url, clean=True) - props = get_props(data) - kwords = data.get('keywords', "") - if isinstance(kwords, str): - kwords = kwords.split(", ") - return { - 'dateModified': data.get('dateModified'), - 'datePublished': data.get('datePublished'), - 'description': data.get('description'), - "url": data.get('id') or url, - "title": data.get("name"), - "type": data.get("type"), - "n_tracks": data.get('numTracks'), - 'image': data.get('image'), - 'featured_track_num': props.get('featured_track_num'), - 'keywords': kwords - } - - def __repr__(self): - return self.__class__.__name__ + ":" + self.title - - def __str__(self): - return self.url - - -class BandcampLabel: - def __init__(self, data, scrap=True): - self._url = data.get("url") - self._data = data or {} - self._page_data = {} - if scrap: - self.scrap() - if not self.url: - raise ValueError("bandcamp url is not set") - - def scrap(self): - self._page_data = {} # TODO - return self._page_data - - @staticmethod - def from_url(url): - return BandcampTrack({"url": url}) - - @property - def url(self): - return self._url or self.data.get("url") - - @property - def data(self): - for k, v in self._page_data.items(): - self._data[k] = v - return self._data - - @property - def name(self): - return self.data.get("title") or self.data.get("name") or \ - self.url.split("/")[-1] - - @property - def location(self): - return self.data.get("location") - - @property - def tags(self): - return self.data.get("tags") or [] - - @property - def image(self): - return self.data.get("image") - - def __repr__(self): - return self.__class__.__name__ + ":" + self.name - - def __str__(self): - return self.url - - -class BandcampArtist: - def __init__(self, data, scrap=True): - self._url = data.get("url") - self._data = data or {} - self._page_data = {} - if scrap: - self.scrap() - - def scrap(self): - self._page_data = {} # TODO - return self._page_data - - @property - def featured_album(self): - return BandcampAlbum.from_url(self.url + "/releases") - - @property - def featured_track(self): - if not self.featured_album: - return None - return self.featured_album.featured_track - - @staticmethod - def get_albums(url): - albums = [] - soup = BeautifulSoup(requests.get(url).text, "html.parser") - for album in soup.find_all("a"): - album_url = album.find("p", {"class": "title"}) - if album_url: - title = album_url.text.strip() - art = album.find("div", {"class": "art"}).find("img")["src"] - album_url = url + album["href"] - album = BandcampAlbum({"album_name": title, - "image": art, - "url": album_url}) - albums.append(album) - return albums - - @property - def albums(self): - return self.get_albums(self.url) - - @staticmethod - def from_url(url): - return BandcampTrack({"url": url}) - - @property - def url(self): - return self._url or self.data.get("url") - - @property - def data(self): - for k, v in self._page_data.items(): - self._data[k] = v - return self._data - - @property - def name(self): - return self.data.get("title") or self.data.get("name") or \ - self.url.split("/")[-1] - - @property - def location(self): - return self.data.get("location") - - @property - def genre(self): - return self.data.get("genre") - - @property - def tags(self): - return self.data.get("tags") or [] - - @property - def image(self): - return self.data.get("image") - - def __repr__(self): - return self.__class__.__name__ + ":" + self.name - - def __str__(self): - return self.url - - def __eq__(self, other): - if str(self) == str(other): - return True - return False diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp/models.pyc b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp/models.pyc deleted file mode 100644 index b72e39d9..00000000 Binary files a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp/models.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp/session.py b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp/session.py deleted file mode 100644 index c966bb2c..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp/session.py +++ /dev/null @@ -1,3 +0,0 @@ -import requests_cache - -SESSION = requests_cache.CachedSession(expire_after=5 * 60, backend="memory") diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp/session.pyc b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp/session.pyc deleted file mode 100644 index 5bd0daff..00000000 Binary files a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp/session.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp/utils.py b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp/utils.py deleted file mode 100644 index 4d81447c..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp/utils.py +++ /dev/null @@ -1,77 +0,0 @@ -import json - -from py_bandcamp.session import SESSION as requests - - -def extract_blob(url, params=None): - blob = requests.get(url, params=params).text - for b in blob.split("data-blob='")[1:]: - json_blob = b.split("'")[0] - return json.loads(json_blob) - for b in blob.split("data-blob=\"")[1:]: - json_blob = b.split("\"")[0].replace(""", '"') - return json.loads(json_blob) - - -def extract_ldjson_blob(url, clean=False): - txt_string = requests.get(url).text - - json_blob = txt_string. \ - split('")[0] - - data = json.loads(json_blob) - - def _clean_list(l): - for idx, v in enumerate(l): - if isinstance(v, dict): - l[idx] = _clean_dict(v) - if isinstance(v, list): - l[idx] = _clean_list(v) - return l - - def _clean_dict(d): - clean = {} - for k, v in d.items(): - if isinstance(v, dict): - v = _clean_dict(v) - if isinstance(v, list): - v = _clean_list(v) - k = k.replace("@", "") - clean[k] = v - return clean - - if clean: - return _clean_dict(data) - return data - - -def get_props(d, props=None): - props = props or [] - data = {} - for p in d['additionalProperty']: - if p['name'] in props or not props: - data[p['name']] = p['value'] - return data - - -def get_stream_data(url): - data = extract_ldjson_blob(url) - artist_data = data['byArtist'] - album_data = data['inAlbum'] - kws = data["keywords"] - if isinstance(kws, str): - kws = kws.split(", ") - result = { - "categories": data["@type"], - 'album_name': album_data['name'], - 'artist': artist_data['name'], - 'image': data['image'], - "title": data['name'], - "url": url, - "tags": kws + data.get("tags", []) - } - for p in data['additionalProperty']: - if p['name'] == 'file_mp3-128': - result["stream"] = p["value"] - return result diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp/utils.pyc b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp/utils.pyc deleted file mode 100644 index eec5fbb8..00000000 Binary files a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/py_bandcamp/utils.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/webcolors-1.12.dist-info/INSTALLER b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/webcolors-1.12.dist-info/INSTALLER deleted file mode 100644 index a1b589e3..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/webcolors-1.12.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/webcolors-1.12.dist-info/LICENSE b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/webcolors-1.12.dist-info/LICENSE deleted file mode 100644 index e4190ba6..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/webcolors-1.12.dist-info/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -Copyright (c) 2008-2022, James Bennett -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of the author nor the names of other - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/webcolors-1.12.dist-info/METADATA b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/webcolors-1.12.dist-info/METADATA deleted file mode 100644 index 71d37fb8..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/webcolors-1.12.dist-info/METADATA +++ /dev/null @@ -1,64 +0,0 @@ -Metadata-Version: 2.1 -Name: webcolors -Version: 1.12 -Summary: A library for working with color names and color values formats defined by HTML and CSS. -Home-page: https://github.com/ubernostrum/webcolors -Author: James Bennett -Author-email: james@b-list.org -License: BSD 3-Clause -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Topic :: Utilities -Requires-Python: >=3.7 -License-File: LICENSE - -.. -*-restructuredtext-*- - -.. image:: https://github.com/ubernostrum/webcolors/workflows/CI/badge.svg - :alt: CI status image - :target: https://github.com/ubernostrum/webcolors/actions?query=workflow%3ACI - -``webcolors`` is a module for working with HTML/CSS color definitions. - -Support is included for normalizing and converting between the -following formats (RGB colorspace only; conversion to/from HSL can be -handled by the ``colorsys`` module in the Python standard library): - -* Specification-defined color names - -* Six-digit hexadecimal - -* Three-digit hexadecimal - -* Integer ``rgb()`` triplet - -* Percentage ``rgb()`` triplet - -For example: - -.. code-block:: python - - >>> import webcolors - >>> webcolors.hex_to_name(u'#daa520') - u'goldenrod' - -Implementations are also provided for the HTML5 color parsing and -serialization algorithms. For example, parsing the infamous -"chucknorris" string into an rgb() triplet: - -.. code-block:: python - - >>> import webcolors - >>> webcolors.html5_parse_legacy_color(u'chucknorris') - HTML5SimpleColor(red=192, green=0, blue=0) - -Full documentation is `available online `_. diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/webcolors-1.12.dist-info/RECORD b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/webcolors-1.12.dist-info/RECORD deleted file mode 100644 index 74f4296c..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/webcolors-1.12.dist-info/RECORD +++ /dev/null @@ -1,9 +0,0 @@ -webcolors-1.12.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -webcolors-1.12.dist-info/LICENSE,sha256=ii0_r1bvLUKXO599sXarGslRtQGkmhx7s0ACbx5NxIk,1523 -webcolors-1.12.dist-info/METADATA,sha256=56Xnd_OybLPtSNbCG8SixpiFKH0lqki7ihJWET3Ea_o,2049 -webcolors-1.12.dist-info/RECORD,, -webcolors-1.12.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -webcolors-1.12.dist-info/WHEEL,sha256=_NOXIqFgOaYmlm9RJLPQZ13BJuEIrp5jx5ptRD5uh3Y,92 -webcolors-1.12.dist-info/top_level.txt,sha256=HUENGOTrUyEUebL1YSZy2ROMReykfiyMzSB-mSi72_4,10 -webcolors.py,sha256=OFDSm2rv4D0Jh1qhIOCLTy3g_8SpKfWNByWbnPmPYbk,25487 -webcolors.pyc,, diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/webcolors-1.12.dist-info/WHEEL b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/webcolors-1.12.dist-info/WHEEL deleted file mode 100644 index 4eeaea1f..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/webcolors-1.12.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.32.3) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/webcolors-1.12.dist-info/top_level.txt b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/webcolors-1.12.dist-info/top_level.txt deleted file mode 100644 index 2ff3d436..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/webcolors-1.12.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -webcolors diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/webcolors.py b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/webcolors.py deleted file mode 100644 index 7738ebdc..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/webcolors.py +++ /dev/null @@ -1,781 +0,0 @@ -""" -Utility functions for working with the color names and color value -formats defined by the HTML and CSS specifications for use in -documents on the Web. - -See documentation (in docs/ directory of source distribution) for -details of the supported formats, conventions and conversions. - -""" - -import re -import string -from typing import NamedTuple, Tuple, Union - -__version__ = "1.11.1" - - -def _reversedict(d: dict) -> dict: - """ - Internal helper for generating reverse mappings; given a - dictionary, returns a new dictionary with keys and values swapped. - - """ - return {value: key for key, value in d.items()} - - -HEX_COLOR_RE = re.compile(r"^#([a-fA-F0-9]{3}|[a-fA-F0-9]{6})$") - -HTML4 = "html4" -CSS2 = "css2" -CSS21 = "css21" -CSS3 = "css3" - -SUPPORTED_SPECIFICATIONS = (HTML4, CSS2, CSS21, CSS3) - -SPECIFICATION_ERROR_TEMPLATE = "{{spec}} is not a supported specification for color name lookups; \ -supported specifications are: {supported}.".format( - supported=",".join(SUPPORTED_SPECIFICATIONS) -) - -IntegerRGB = NamedTuple("IntegerRGB", [("red", int), ("green", int), ("blue", int)]) -PercentRGB = NamedTuple("PercentRGB", [("red", str), ("green", str), ("blue", str)]) -HTML5SimpleColor = NamedTuple( - "HTML5SimpleColor", [("red", int), ("green", int), ("blue", int)] -) - -IntTuple = Union[IntegerRGB, HTML5SimpleColor, Tuple[int, int, int]] -PercentTuple = Union[PercentRGB, Tuple[str, str, str]] - - -# Mappings of color names to normalized hexadecimal color values. -################################################################# - -# The HTML 4 named colors. -# -# The canonical source for these color definitions is the HTML 4 -# specification: -# -# http://www.w3.org/TR/html401/types.html#h-6.5 -# -# The file tests/definitions.py in the source distribution of this -# module downloads a copy of the HTML 4 standard and parses out the -# color names to ensure the values below are correct. -HTML4_NAMES_TO_HEX = { - "aqua": "#00ffff", - "black": "#000000", - "blue": "#0000ff", - "fuchsia": "#ff00ff", - "green": "#008000", - "gray": "#808080", - "lime": "#00ff00", - "maroon": "#800000", - "navy": "#000080", - "olive": "#808000", - "purple": "#800080", - "red": "#ff0000", - "silver": "#c0c0c0", - "teal": "#008080", - "white": "#ffffff", - "yellow": "#ffff00", -} - -# CSS 2 used the same list as HTML 4. -CSS2_NAMES_TO_HEX = HTML4_NAMES_TO_HEX - -# CSS 2.1 added orange. -CSS21_NAMES_TO_HEX = {"orange": "#ffa500", **HTML4_NAMES_TO_HEX} - -# The CSS 3/SVG named colors. -# -# The canonical source for these color definitions is the SVG -# specification's color list (which was adopted as CSS 3's color -# definition): -# -# http://www.w3.org/TR/SVG11/types.html#ColorKeywords -# -# CSS 3 also provides definitions of these colors: -# -# http://www.w3.org/TR/css3-color/#svg-color -# -# SVG provides the definitions as RGB triplets. CSS 3 provides them -# both as RGB triplets and as hexadecimal. Since hex values are more -# common in real-world HTML and CSS, the mapping below is to hex -# values instead. The file tests/definitions.py in the source -# distribution of this module downloads a copy of the CSS 3 color -# module and parses out the color names to ensure the values below are -# correct. -CSS3_NAMES_TO_HEX = { - "aliceblue": "#f0f8ff", - "antiquewhite": "#faebd7", - "aqua": "#00ffff", - "aquamarine": "#7fffd4", - "azure": "#f0ffff", - "beige": "#f5f5dc", - "bisque": "#ffe4c4", - "black": "#000000", - "blanchedalmond": "#ffebcd", - "blue": "#0000ff", - "blueviolet": "#8a2be2", - "brown": "#a52a2a", - "burlywood": "#deb887", - "cadetblue": "#5f9ea0", - "chartreuse": "#7fff00", - "chocolate": "#d2691e", - "coral": "#ff7f50", - "cornflowerblue": "#6495ed", - "cornsilk": "#fff8dc", - "crimson": "#dc143c", - "cyan": "#00ffff", - "darkblue": "#00008b", - "darkcyan": "#008b8b", - "darkgoldenrod": "#b8860b", - "darkgray": "#a9a9a9", - "darkgrey": "#a9a9a9", - "darkgreen": "#006400", - "darkkhaki": "#bdb76b", - "darkmagenta": "#8b008b", - "darkolivegreen": "#556b2f", - "darkorange": "#ff8c00", - "darkorchid": "#9932cc", - "darkred": "#8b0000", - "darksalmon": "#e9967a", - "darkseagreen": "#8fbc8f", - "darkslateblue": "#483d8b", - "darkslategray": "#2f4f4f", - "darkslategrey": "#2f4f4f", - "darkturquoise": "#00ced1", - "darkviolet": "#9400d3", - "deeppink": "#ff1493", - "deepskyblue": "#00bfff", - "dimgray": "#696969", - "dimgrey": "#696969", - "dodgerblue": "#1e90ff", - "firebrick": "#b22222", - "floralwhite": "#fffaf0", - "forestgreen": "#228b22", - "fuchsia": "#ff00ff", - "gainsboro": "#dcdcdc", - "ghostwhite": "#f8f8ff", - "gold": "#ffd700", - "goldenrod": "#daa520", - "gray": "#808080", - "grey": "#808080", - "green": "#008000", - "greenyellow": "#adff2f", - "honeydew": "#f0fff0", - "hotpink": "#ff69b4", - "indianred": "#cd5c5c", - "indigo": "#4b0082", - "ivory": "#fffff0", - "khaki": "#f0e68c", - "lavender": "#e6e6fa", - "lavenderblush": "#fff0f5", - "lawngreen": "#7cfc00", - "lemonchiffon": "#fffacd", - "lightblue": "#add8e6", - "lightcoral": "#f08080", - "lightcyan": "#e0ffff", - "lightgoldenrodyellow": "#fafad2", - "lightgray": "#d3d3d3", - "lightgrey": "#d3d3d3", - "lightgreen": "#90ee90", - "lightpink": "#ffb6c1", - "lightsalmon": "#ffa07a", - "lightseagreen": "#20b2aa", - "lightskyblue": "#87cefa", - "lightslategray": "#778899", - "lightslategrey": "#778899", - "lightsteelblue": "#b0c4de", - "lightyellow": "#ffffe0", - "lime": "#00ff00", - "limegreen": "#32cd32", - "linen": "#faf0e6", - "magenta": "#ff00ff", - "maroon": "#800000", - "mediumaquamarine": "#66cdaa", - "mediumblue": "#0000cd", - "mediumorchid": "#ba55d3", - "mediumpurple": "#9370db", - "mediumseagreen": "#3cb371", - "mediumslateblue": "#7b68ee", - "mediumspringgreen": "#00fa9a", - "mediumturquoise": "#48d1cc", - "mediumvioletred": "#c71585", - "midnightblue": "#191970", - "mintcream": "#f5fffa", - "mistyrose": "#ffe4e1", - "moccasin": "#ffe4b5", - "navajowhite": "#ffdead", - "navy": "#000080", - "oldlace": "#fdf5e6", - "olive": "#808000", - "olivedrab": "#6b8e23", - "orange": "#ffa500", - "orangered": "#ff4500", - "orchid": "#da70d6", - "palegoldenrod": "#eee8aa", - "palegreen": "#98fb98", - "paleturquoise": "#afeeee", - "palevioletred": "#db7093", - "papayawhip": "#ffefd5", - "peachpuff": "#ffdab9", - "peru": "#cd853f", - "pink": "#ffc0cb", - "plum": "#dda0dd", - "powderblue": "#b0e0e6", - "purple": "#800080", - "red": "#ff0000", - "rosybrown": "#bc8f8f", - "royalblue": "#4169e1", - "saddlebrown": "#8b4513", - "salmon": "#fa8072", - "sandybrown": "#f4a460", - "seagreen": "#2e8b57", - "seashell": "#fff5ee", - "sienna": "#a0522d", - "silver": "#c0c0c0", - "skyblue": "#87ceeb", - "slateblue": "#6a5acd", - "slategray": "#708090", - "slategrey": "#708090", - "snow": "#fffafa", - "springgreen": "#00ff7f", - "steelblue": "#4682b4", - "tan": "#d2b48c", - "teal": "#008080", - "thistle": "#d8bfd8", - "tomato": "#ff6347", - "turquoise": "#40e0d0", - "violet": "#ee82ee", - "wheat": "#f5deb3", - "white": "#ffffff", - "whitesmoke": "#f5f5f5", - "yellow": "#ffff00", - "yellowgreen": "#9acd32", -} - - -# Mappings of normalized hexadecimal color values to color names. -################################################################# - -HTML4_HEX_TO_NAMES = _reversedict(HTML4_NAMES_TO_HEX) - -CSS2_HEX_TO_NAMES = HTML4_HEX_TO_NAMES - -CSS21_HEX_TO_NAMES = _reversedict(CSS21_NAMES_TO_HEX) - -CSS3_HEX_TO_NAMES = _reversedict(CSS3_NAMES_TO_HEX) - -# CSS3 defines both 'gray' and 'grey', as well as defining either -# variant for other related colors like 'darkgray'/'darkgrey'. For a -# 'forward' lookup from name to hex, this is straightforward, but a -# 'reverse' lookup from hex to name requires picking one spelling. -# -# The way in which _reversedict() generates the reverse mappings will -# pick a spelling based on the ordering of dictionary keys, which -# varies according to the version and implementation of Python in use, -# and in some Python versions is explicitly not to be relied on for -# consistency. So here we manually pick a single spelling that will -# consistently be returned. Since 'gray' was the only spelling -# supported in HTML 4, CSS1, and CSS2, 'gray' and its varients are -# chosen. -CSS3_HEX_TO_NAMES["#a9a9a9"] = "darkgray" -CSS3_HEX_TO_NAMES["#2f4f4f"] = "darkslategray" -CSS3_HEX_TO_NAMES["#696969"] = "dimgray" -CSS3_HEX_TO_NAMES["#808080"] = "gray" -CSS3_HEX_TO_NAMES["#d3d3d3"] = "lightgray" -CSS3_HEX_TO_NAMES["#778899"] = "lightslategray" -CSS3_HEX_TO_NAMES["#708090"] = "slategray" - - -# Normalization functions. -################################################################# - - -def normalize_hex(hex_value: str) -> str: - """ - Normalize a hexadecimal color value to 6 digits, lowercase. - - """ - match = HEX_COLOR_RE.match(hex_value) - if match is None: - raise ValueError( - "'{}' is not a valid hexadecimal color value.".format(hex_value) - ) - hex_digits = match.group(1) - if len(hex_digits) == 3: - hex_digits = "".join(2 * s for s in hex_digits) - return "#{}".format(hex_digits.lower()) - - -def _normalize_integer_rgb(value: int) -> int: - """ - Internal normalization function for clipping integer values into - the permitted range (0-255, inclusive). - - """ - return 0 if value < 0 else 255 if value > 255 else value - - -def normalize_integer_triplet(rgb_triplet: IntTuple) -> IntegerRGB: - """ - Normalize an integer ``rgb()`` triplet so that all values are - within the range 0-255 inclusive. - - """ - return IntegerRGB._make(_normalize_integer_rgb(value) for value in rgb_triplet) - - -def _normalize_percent_rgb(value: str) -> str: - """ - Internal normalization function for clipping percent values into - the permitted range (0%-100%, inclusive). - - """ - value = value.split("%")[0] - percent = float(value) if "." in value else int(value) - - return "0%" if percent < 0 else "100%" if percent > 100 else "{}%".format(percent) - - -def normalize_percent_triplet(rgb_triplet: PercentTuple) -> PercentRGB: - """ - Normalize a percentage ``rgb()`` triplet so that all values are - within the range 0%-100% inclusive. - - """ - return PercentRGB._make(_normalize_percent_rgb(value) for value in rgb_triplet) - - -# Conversions from color names to various formats. -################################################################# - - -def name_to_hex(name: str, spec: str = CSS3) -> str: - """ - Convert a color name to a normalized hexadecimal color value. - - The optional keyword argument ``spec`` determines which - specification's list of color names will be used. The default is - CSS3. - - When no color of that name exists in the given specification, - ``ValueError`` is raised. - - """ - if spec not in SUPPORTED_SPECIFICATIONS: - raise ValueError(SPECIFICATION_ERROR_TEMPLATE.format(spec=spec)) - normalized = name.lower() - hex_value = { - CSS2: CSS2_NAMES_TO_HEX, - CSS21: CSS21_NAMES_TO_HEX, - CSS3: CSS3_NAMES_TO_HEX, - HTML4: HTML4_NAMES_TO_HEX, - }[spec].get(normalized) - if hex_value is None: - raise ValueError( - "'{name}' is not defined as a named color in {spec}".format( - name=name, spec=spec - ) - ) - return hex_value - - -def name_to_rgb(name: str, spec: str = CSS3) -> IntegerRGB: - """ - Convert a color name to a 3-tuple of integers suitable for use in - an ``rgb()`` triplet specifying that color. - - """ - return hex_to_rgb(name_to_hex(name, spec=spec)) - - -def name_to_rgb_percent(name: str, spec: str = CSS3) -> PercentRGB: - """ - Convert a color name to a 3-tuple of percentages suitable for use - in an ``rgb()`` triplet specifying that color. - - """ - return rgb_to_rgb_percent(name_to_rgb(name, spec=spec)) - - -# Conversions from hexadecimal color values to various formats. -################################################################# - - -def hex_to_name(hex_value: str, spec: str = CSS3) -> str: - """ - Convert a hexadecimal color value to its corresponding normalized - color name, if any such name exists. - - The optional keyword argument ``spec`` determines which - specification's list of color names will be used. The default is - CSS3. - - When no color name for the value is found in the given - specification, ``ValueError`` is raised. - - """ - if spec not in SUPPORTED_SPECIFICATIONS: - raise ValueError(SPECIFICATION_ERROR_TEMPLATE.format(spec=spec)) - normalized = normalize_hex(hex_value) - name = { - CSS2: CSS2_HEX_TO_NAMES, - CSS21: CSS21_HEX_TO_NAMES, - CSS3: CSS3_HEX_TO_NAMES, - HTML4: HTML4_HEX_TO_NAMES, - }[spec].get(normalized) - if name is None: - raise ValueError("'{}' has no defined color name in {}".format(hex_value, spec)) - return name - - -def hex_to_rgb(hex_value: str) -> IntegerRGB: - """ - Convert a hexadecimal color value to a 3-tuple of integers - suitable for use in an ``rgb()`` triplet specifying that color. - - """ - int_value = int(normalize_hex(hex_value)[1:], 16) - return IntegerRGB(int_value >> 16, int_value >> 8 & 0xFF, int_value & 0xFF) - - -def hex_to_rgb_percent(hex_value: str) -> PercentRGB: - """ - Convert a hexadecimal color value to a 3-tuple of percentages - suitable for use in an ``rgb()`` triplet representing that color. - - """ - return rgb_to_rgb_percent(hex_to_rgb(hex_value)) - - -# Conversions from integer rgb() triplets to various formats. -################################################################# - - -def rgb_to_name(rgb_triplet: IntTuple, spec: str = CSS3) -> str: - """ - Convert a 3-tuple of integers, suitable for use in an ``rgb()`` - color triplet, to its corresponding normalized color name, if any - such name exists. - - The optional keyword argument ``spec`` determines which - specification's list of color names will be used. The default is - CSS3. - - If there is no matching name, ``ValueError`` is raised. - - """ - return hex_to_name(rgb_to_hex(normalize_integer_triplet(rgb_triplet)), spec=spec) - - -def rgb_to_hex(rgb_triplet: IntTuple) -> str: - """ - Convert a 3-tuple of integers, suitable for use in an ``rgb()`` - color triplet, to a normalized hexadecimal value for that color. - - """ - return "#{:02x}{:02x}{:02x}".format(*normalize_integer_triplet(rgb_triplet)) - - -def rgb_to_rgb_percent(rgb_triplet: IntTuple) -> PercentRGB: - """ - Convert a 3-tuple of integers, suitable for use in an ``rgb()`` - color triplet, to a 3-tuple of percentages suitable for use in - representing that color. - - This function makes some trade-offs in terms of the accuracy of - the final representation; for some common integer values, - special-case logic is used to ensure a precise result (e.g., - integer 128 will always convert to '50%', integer 32 will always - convert to '12.5%'), but for all other values a standard Python - ``float`` is used and rounded to two decimal places, which may - result in a loss of precision for some values. - - """ - # In order to maintain precision for common values, - # special-case them. - specials = { - 255: "100%", - 128: "50%", - 64: "25%", - 32: "12.5%", - 16: "6.25%", - 0: "0%", - } - return PercentRGB._make( - specials.get(d, "{:.02f}%".format(d / 255.0 * 100)) - for d in normalize_integer_triplet(rgb_triplet) - ) - - -# Conversions from percentage rgb() triplets to various formats. -################################################################# - - -def rgb_percent_to_name(rgb_percent_triplet: PercentTuple, spec: str = CSS3) -> str: - """ - Convert a 3-tuple of percentages, suitable for use in an ``rgb()`` - color triplet, to its corresponding normalized color name, if any - such name exists. - - The optional keyword argument ``spec`` determines which - specification's list of color names will be used. The default is - CSS3. - - If there is no matching name, ``ValueError`` is raised. - - """ - return rgb_to_name( - rgb_percent_to_rgb(normalize_percent_triplet(rgb_percent_triplet)), spec=spec - ) - - -def rgb_percent_to_hex(rgb_percent_triplet: PercentTuple) -> str: - """ - Convert a 3-tuple of percentages, suitable for use in an ``rgb()`` - color triplet, to a normalized hexadecimal color value for that - color. - - """ - return rgb_to_hex( - rgb_percent_to_rgb(normalize_percent_triplet(rgb_percent_triplet)) - ) - - -def _percent_to_integer(percent: str) -> int: - """ - Internal helper for converting a percentage value to an integer - between 0 and 255 inclusive. - - """ - return int(round(float(percent.split("%")[0]) / 100 * 255)) - - -def rgb_percent_to_rgb(rgb_percent_triplet: PercentTuple) -> IntegerRGB: - """ - Convert a 3-tuple of percentages, suitable for use in an ``rgb()`` - color triplet, to a 3-tuple of integers suitable for use in - representing that color. - - Some precision may be lost in this conversion. See the note - regarding precision for ``rgb_to_rgb_percent()`` for details. - - """ - return IntegerRGB._make( - map(_percent_to_integer, normalize_percent_triplet(rgb_percent_triplet)) - ) - - -# HTML5 color algorithms. -################################################################# - -# These functions are written in a way that may seem strange to -# developers familiar with Python, because they do not use the most -# efficient or idiomatic way of accomplishing their tasks. This is -# because, for compliance, these functions are written as literal -# translations into Python of the algorithms in HTML5. -# -# For ease of understanding, the relevant steps of the algorithm from -# the standard are included as comments interspersed in the -# implementation. - - -def html5_parse_simple_color(input: str) -> HTML5SimpleColor: - """ - Apply the simple color parsing algorithm from section 2.4.6 of - HTML5. - - """ - # 1. Let input be the string being parsed. - # - # 2. If input is not exactly seven characters long, then return an - # error. - if not isinstance(input, str) or len(input) != 7: - raise ValueError( - "An HTML5 simple color must be a Unicode string " - "exactly seven characters long." - ) - - # 3. If the first character in input is not a U+0023 NUMBER SIGN - # character (#), then return an error. - if not input.startswith("#"): - raise ValueError( - "An HTML5 simple color must begin with the " "character '#' (U+0023)." - ) - - # 4. If the last six characters of input are not all ASCII hex - # digits, then return an error. - if not all(c in string.hexdigits for c in input[1:]): - raise ValueError( - "An HTML5 simple color must contain exactly six ASCII hex digits." - ) - - # 5. Let result be a simple color. - # - # 6. Interpret the second and third characters as a hexadecimal - # number and let the result be the red component of result. - # - # 7. Interpret the fourth and fifth characters as a hexadecimal - # number and let the result be the green component of result. - # - # 8. Interpret the sixth and seventh characters as a hexadecimal - # number and let the result be the blue component of result. - # - # 9. Return result. - return HTML5SimpleColor( - int(input[1:3], 16), int(input[3:5], 16), int(input[5:7], 16) - ) - - -def html5_serialize_simple_color(simple_color: IntTuple) -> str: - """ - Apply the serialization algorithm for a simple color from section - 2.4.6 of HTML5. - - """ - red, green, blue = simple_color - - # 1. Let result be a string consisting of a single "#" (U+0023) - # character. - result = "#" - - # 2. Convert the red, green, and blue components in turn to - # two-digit hexadecimal numbers using lowercase ASCII hex - # digits, zero-padding if necessary, and append these numbers - # to result, in the order red, green, blue. - format_string = "{:02x}" - result += format_string.format(red) - result += format_string.format(green) - result += format_string.format(blue) - - # 3. Return result, which will be a valid lowercase simple color. - return result - - -def html5_parse_legacy_color(input: str) -> HTML5SimpleColor: - """ - Apply the legacy color parsing algorithm from section 2.4.6 of - HTML5. - - """ - # 1. Let input be the string being parsed. - if not isinstance(input, str): - raise ValueError( - "HTML5 legacy color parsing requires a Unicode string as input." - ) - - # 2. If input is the empty string, then return an error. - if input == "": - raise ValueError("HTML5 legacy color parsing forbids empty string as a value.") - - # 3. Strip leading and trailing whitespace from input. - input = input.strip() - - # 4. If input is an ASCII case-insensitive match for the string - # "transparent", then return an error. - if input.lower() == "transparent": - raise ValueError('HTML5 legacy color parsing forbids "transparent" as a value.') - - # 5. If input is an ASCII case-insensitive match for one of the - # keywords listed in the SVG color keywords section of the CSS3 - # Color specification, then return the simple color - # corresponding to that keyword. - keyword_hex = CSS3_NAMES_TO_HEX.get(input.lower()) - if keyword_hex is not None: - return html5_parse_simple_color(keyword_hex) - - # 6. If input is four characters long, and the first character in - # input is a "#" (U+0023) character, and the last three - # characters of input are all ASCII hex digits, then run these - # substeps: - if ( - len(input) == 4 - and input.startswith("#") - and all(c in string.hexdigits for c in input[1:]) - ): - # 1. Let result be a simple color. - # - # 2. Interpret the second character of input as a hexadecimal - # digit; let the red component of result be the resulting - # number multiplied by 17. - # - # 3. Interpret the third character of input as a hexadecimal - # digit; let the green component of result be the resulting - # number multiplied by 17. - # - # 4. Interpret the fourth character of input as a hexadecimal - # digit; let the blue component of result be the resulting - # number multiplied by 17. - result = HTML5SimpleColor( - int(input[1], 16) * 17, int(input[2], 16) * 17, int(input[3], 16) * 17 - ) - - # 5. Return result. - return result - - # 7. Replace any characters in input that have a Unicode code - # point greater than U+FFFF (i.e. any characters that are not - # in the basic multilingual plane) with the two-character - # string "00". - input = "".join("00" if ord(c) > 0xFFFF else c for c in input) - - # 8. If input is longer than 128 characters, truncate input, - # leaving only the first 128 characters. - if len(input) > 128: - input = input[:128] - - # 9. If the first character in input is a "#" (U+0023) character, - # remove it. - if input.startswith("#"): - input = input[1:] - - # 10. Replace any character in input that is not an ASCII hex - # digit with the character "0" (U+0030). - input = "".join(c if c in string.hexdigits else "0" for c in input) - - # 11. While input's length is zero or not a multiple of three, - # append a "0" (U+0030) character to input. - while (len(input) == 0) or (len(input) % 3 != 0): - input += "0" - - # 12. Split input into three strings of equal length, to obtain - # three components. Let length be the length of those - # components (one third the length of input). - length = int(len(input) / 3) - red = input[:length] - green = input[length : length * 2] - blue = input[length * 2 :] - - # 13. If length is greater than 8, then remove the leading - # length-8 characters in each component, and let length be 8. - if length > 8: - red, green, blue = (red[length - 8 :], green[length - 8 :], blue[length - 8 :]) - length = 8 - - # 14. While length is greater than two and the first character in - # each component is a "0" (U+0030) character, remove that - # character and reduce length by one. - while (length > 2) and (red[0] == "0" and green[0] == "0" and blue[0] == "0"): - red, green, blue = (red[1:], green[1:], blue[1:]) - length -= 1 - - # 15. If length is still greater than two, truncate each - # component, leaving only the first two characters in each. - if length > 2: - red, green, blue = (red[:2], green[:2], blue[:2]) - - # 16. Let result be a simple color. - # - # 17. Interpret the first component as a hexadecimal number; let - # the red component of result be the resulting number. - # - # 18. Interpret the second component as a hexadecimal number; let - # the green component of result be the resulting number. - # - # 19. Interpret the third component as a hexadecimal number; let - # the blue component of result be the resulting number. - # - # 20. Return result. - return HTML5SimpleColor(int(red, 16), int(green, 16), int(blue, 16)) diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/youtube_search-2.1.2.dist-info/INSTALLER b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/youtube_search-2.1.2.dist-info/INSTALLER deleted file mode 100644 index a1b589e3..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/youtube_search-2.1.2.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/youtube_search-2.1.2.dist-info/LICENSE b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/youtube_search-2.1.2.dist-info/LICENSE deleted file mode 100644 index ad096495..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/youtube_search-2.1.2.dist-info/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2019 joe tats - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/youtube_search-2.1.2.dist-info/METADATA b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/youtube_search-2.1.2.dist-info/METADATA deleted file mode 100644 index 29ca82a0..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/youtube_search-2.1.2.dist-info/METADATA +++ /dev/null @@ -1,44 +0,0 @@ -Metadata-Version: 2.1 -Name: youtube-search -Version: 2.1.2 -Summary: Perform YouTube video searches without the API -Home-page: https://github.com/joetats/youtube_search -Author: Joe Tatusko -Author-email: tatuskojc@gmail.com -License: MIT -Classifier: License :: OSI Approved :: MIT License -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Description-Content-Type: text/markdown -License-File: LICENSE -Requires-Dist: requests - -# youtube_search - -Python function for searching for youtube videos to avoid using their heavily rate-limited API - -To avoid using the API, this uses the form on the youtube homepage and scrapes the resulting page. - -## Example Usage - -For a basic search (and all of the current functionality), you can use the search tool as follows: - -```pip install youtube-search``` - -```python -from youtube_search import YoutubeSearch - -results = YoutubeSearch('search terms', max_results=10).to_json() - -print(results) - -# returns a json string - -######################################## - -results = YoutubeSearch('search terms', max_results=10).to_dict() - -print(results) -# returns a dictionary -``` diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/youtube_search-2.1.2.dist-info/RECORD b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/youtube_search-2.1.2.dist-info/RECORD deleted file mode 100644 index d7252b3e..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/youtube_search-2.1.2.dist-info/RECORD +++ /dev/null @@ -1,9 +0,0 @@ -youtube_search-2.1.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -youtube_search-2.1.2.dist-info/LICENSE,sha256=zVjZaKVVhb_CGuoJOu5bqSpnhbqyTJlpz-LNi_6eqD0,1065 -youtube_search-2.1.2.dist-info/METADATA,sha256=wEWvppkKB-B7DeOSj2BSxXRurMUpNdWkteSIopw51Xo,1197 -youtube_search-2.1.2.dist-info/RECORD,, -youtube_search-2.1.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -youtube_search-2.1.2.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92 -youtube_search-2.1.2.dist-info/top_level.txt,sha256=a9m0vWREPPFPH9ghqteiTbDyIOTXrXickQ3rb4SZtRQ,15 -youtube_search/__init__.py,sha256=DoUp4KBhq9WeNp531X1zfVTYkF5WZ6BzG_fbxQRehHc,2834 -youtube_search/__init__.pyc,, diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/youtube_search-2.1.2.dist-info/WHEEL b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/youtube_search-2.1.2.dist-info/WHEEL deleted file mode 100644 index becc9a66..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/youtube_search-2.1.2.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.37.1) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/youtube_search-2.1.2.dist-info/top_level.txt b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/youtube_search-2.1.2.dist-info/top_level.txt deleted file mode 100644 index 31eedf6f..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/youtube_search-2.1.2.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -youtube_search diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/youtube_search/__init__.py b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/youtube_search/__init__.py deleted file mode 100644 index ae3ab21d..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/youtube_search/__init__.py +++ /dev/null @@ -1,65 +0,0 @@ -import requests -import urllib.parse -import json - - -class YoutubeSearch: - def __init__(self, search_terms: str, max_results=None): - self.search_terms = search_terms - self.max_results = max_results - self.videos = self._search() - - def _search(self): - encoded_search = urllib.parse.quote_plus(self.search_terms) - BASE_URL = "https://youtube.com" - url = f"{BASE_URL}/results?search_query={encoded_search}" - response = requests.get(url).text - while "ytInitialData" not in response: - response = requests.get(url).text - results = self._parse_html(response) - if self.max_results is not None and len(results) > self.max_results: - return results[: self.max_results] - return results - - def _parse_html(self, response): - results = [] - start = ( - response.index("ytInitialData") - + len("ytInitialData") - + 3 - ) - end = response.index("};", start) + 1 - json_str = response[start:end] - data = json.loads(json_str) - - for contents in data["contents"]["twoColumnSearchResultsRenderer"]["primaryContents"]["sectionListRenderer"]["contents"]: - for video in contents["itemSectionRenderer"]["contents"]: - res = {} - if "videoRenderer" in video.keys(): - video_data = video.get("videoRenderer", {}) - res["id"] = video_data.get("videoId", None) - res["thumbnails"] = [thumb.get("url", None) for thumb in video_data.get("thumbnail", {}).get("thumbnails", [{}]) ] - res["title"] = video_data.get("title", {}).get("runs", [[{}]])[0].get("text", None) - res["long_desc"] = video_data.get("descriptionSnippet", {}).get("runs", [{}])[0].get("text", None) - res["channel"] = video_data.get("longBylineText", {}).get("runs", [[{}]])[0].get("text", None) - res["duration"] = video_data.get("lengthText", {}).get("simpleText", 0) - res["views"] = video_data.get("viewCountText", {}).get("simpleText", 0) - res["publish_time"] = video_data.get("publishedTimeText", {}).get("simpleText", 0) - res["url_suffix"] = video_data.get("navigationEndpoint", {}).get("commandMetadata", {}).get("webCommandMetadata", {}).get("url", None) - results.append(res) - - if results: - return results - return results - - def to_dict(self, clear_cache=True): - result = self.videos - if clear_cache: - self.videos = "" - return result - - def to_json(self, clear_cache=True): - result = json.dumps({"videos": self.videos}) - if clear_cache: - self.videos = "" - return result diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/youtube_search/__init__.pyc b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/youtube_search/__init__.pyc deleted file mode 100644 index 340dfd75..00000000 Binary files a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/lib/python3.11/site-packages/youtube_search/__init__.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/json_database/AndloSkillList.jsondb b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/json_database/AndloSkillList.jsondb deleted file mode 100644 index f0df647c..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/json_database/AndloSkillList.jsondb +++ /dev/null @@ -1,45319 +0,0 @@ -{ - "AndloSkillList": [ - { - "created": "2018-01-27T10:15:07Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-09T23:15:13Z", - "authorname": "JarbasSkills", - "skillname": "", - "foldername": "skill-node-red.JarbasSkills", - "name": "", - "url": "https://github.com/JarbasSkills/skill-node-red", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [], - "platforms": [ - "all" - ], - "stars": 20 - }, - { - "created": "2020-03-09T13:59:19Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-03-09T15:59:37Z", - "authorname": "JoergZ2", - "skillname": "Mycroft Mqtt Comm", - "foldername": "mycroft-mqtt-comm-skill.JoergZ2", - "name": "Mycroft Mqtt Comm", - "url": "https://github.com/JoergZ2/mycroft-mqtt-comm-skill", - "category": "IoT", - "description": "This is a first attempt to establish a general communication with an mqtt broker. the goal is to control iot devices as freely as possible. the focus is on the transmission of spoken orders (e.g. switching operations) and not so much on voice playback. This project is just started and on progress. At present it is not yet applicable.", - "short_description": "Gemeral communication with a mqttbroker", - "branch": "master", - "examples": [ - "Schalte den schalter an.", - "Schalte den schalter aus.", - "Schalte die pumpe an.", - "Schalte die pumpe aus." - ], - "tags": [ - "IoT", - "Mqtt" - ], - "platforms": [ - "all" - ], - "stars": 0 - }, - { - "created": "2020-10-08T11:33:36Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-08T12:47:32Z", - "authorname": "krisgesling", - "skillname": "Make GET Request", - "foldername": "make-get-request-skill.krisgesling", - "name": "Make GET Request", - "url": "https://github.com/krisgesling/make-get-request-skill", - "category": "IoT", - "description": "In your Skill settings at https://home.mycroft.ai you can define the url to make a request to and optionally a parameter to be added to the request. You must also set an utterance that you will say to trigger the request. You may also choose to enter custom responses to be spoken if the request succeeds or fails.\n\nIf the url and trigger phrase are not available in Skill settings, you will not be able to trigger this Skill.", - "short_description": "A configurable Skill for making simple GET requests", - "branch": "master", - "examples": [ - "{Configurable in Skill settings}" - ], - "tags": [ - "IoT" - ], - "platforms": [ - "all" - ], - "stars": 0 - }, - { - "created": "2020-08-27T14:43:05Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-09-28T15:26:08Z", - "authorname": "emphasize", - "skillname": "[Mycroft-Picroft] Moonlight Embedded", - "foldername": "moonlight-embedded-skill.emphasize", - "name": "[Mycroft-Picroft] Moonlight Embedded", - "url": "https://github.com/emphasize/moonlight-embedded-skill", - "category": "Entertainment", - "description": "Moonlight takes advantage of the nvidea gamestream protocol (hence nvidea hardware has to run on your windows desktop). with nvidea geforce experience set up you can stream your libraries from steam, epic, .... and essentially every program which is running on your computer.", - "short_description": "Pre-Alpha Opensource implementation of nvidia's gamestream that allows you to stream games (programs i.g.) from gfe compatible computers", - "branch": "master", - "examples": [ - "Moonlight, load app_in_list from host.", - "Moonlight, connect me to host.", - "Moonlight, load app_in_list.", - "Quit moonlight.", - "Pair my moonlight.", - "Moonlight, set host to.", - "Moonlight, set monitor to 1080." - ], - "tags": [ - "Desktop", - "Remote", - "Gaming", - "Stream", - "Media", - "Entertainment", - "Epic", - "Streaming" - ], - "platforms": [ - "all" - ], - "stars": 0 - }, - { - "created": "2020-03-26T19:41:12Z", - "archived": false, - "license": null, - "modified": "2020-03-26T19:41:59Z", - "authorname": "derkodde", - "skillname": "Bible Reader Skill", - "foldername": "bible-reader-skill.derkodde", - "name": "Bible Reader Skill", - "url": "https://github.com/derkodde/bible-reader-skill", - "category": "Daily", - "description": "You can let mycroft read custom bible verses to you. you can also hear compleat chapters. you can save your favourite verses to the random verse list.", - "short_description": "Read random verses or chapters from the bible", - "branch": "master", - "examples": [ - "Read a bible verse.", - "Read a chapter in the new testament.", - "Read john 4 in the bible.", - "Whats the current bible version?", - "Which bible versions are available." - ], - "tags": [ - "Bible", - "Daily", - "Entertainment", - "Reading", - "Information" - ], - "platforms": [ - "all" - ], - "stars": 0 - }, - { - "created": "2020-06-30T15:54:32Z", - "archived": false, - "license": "mit", - "modified": "2020-07-04T01:56:44Z", - "authorname": "gnicolas31", - "skillname": "YouTube", - "foldername": "mycroft-youtube.gnicolas31", - "name": "YouTube", - "url": "https://github.com/gnicolas31/mycroft-youtube", - "category": "Entertainment", - "description": "Does a basic search on YouTube, and plays the first result as audio.\n\nBased on the I Heart Radio and Tunein skills by johnbartkiw.\n\nThis is still untidy, but the basic functionality works.\n\nThis project is a fork from the aweosme mcdruid work that can be found here :\nhttps://gitlab.com/mcdruid/mycroft-youtube-audio\n\nI want this plugin only to load few chill music, so if u want it just download it bro ! :)", - "short_description": "Play audio from YouTube", - "branch": "develop", - "examples": [ - "Play Hendrix (on|with|using) youtube.", - "Play Midnight in Harlem.", - "Play Clapton Crossroads.", - "Stop." - ], - "tags": [ - "Entertainment", - "music", - "youtube", - "streaming", - "stream", - "audio" - ], - "platforms": [ - "all" - ], - "stars": 0 - }, - { - "created": "2020-01-02T10:53:30Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-01-03T20:14:10Z", - "authorname": "kalyaninagaraj", - "skillname": "Google AIY Voicehat", - "foldername": "google-aiy-voicehat-skill.kalyaninagaraj", - "name": "Google AIY Voicehat", - "url": "https://github.com/kalyaninagaraj/google-aiy-voicehat-skill", - "category": "IoT", - "description": "This skill roughly follows @andlo's code outline for the\nexcellent picroft-google-aiy-voicekit skill. It provides\nthe same functionality but uses the gpiozero library\ninstead of RPi.GPIO to operate the button-led combo\nconnected to the voicehat.\n\nAdditionally, an extended button press\n(> 7 seconds) forces a Linux shutdown.\n\nThe idea is to test gpiozero's ability to handle switch\nbounce when polling for a button press; RPi.GPIO doesn't\nregister hold times too well.", - "short_description": "Enables the button and led on the Google AIY voicehat", - "branch": "master", - "examples": [], - "tags": [ - "Google", - "IoT", - "Mycroft", - "voicehat", - "AI", - "AIY" - ], - "platforms": [ - "all" - ], - "stars": 0 - }, - { - "created": "2020-07-10T08:56:57Z", - "archived": false, - "license": "agpl-3.0", - "modified": "2020-07-23T09:24:06Z", - "authorname": "hughwilliams94", - "skillname": "Radio Browser", - "foldername": "radio-browser-skill.hughwilliams94", - "name": "Radio Browser", - "url": "https://github.com/hughwilliams94/radio-browser-skill", - "category": "Music", - "description": "This skill searches for radio stations and genres on http://www.radio-browser.info and plays them using Mycroft's Common Play Framework. It uses the [pyradios](https://github.com/andreztz/pyradios) library to interface with the radio-browser.info [API](https://api.radio-browser.info/).", - "short_description": "Find and play stations from radio-browser.info", - "branch": "master", - "examples": [ - "Play BBC Radio 4.", - "Play Classic FM.", - "Put BBC Badio 1 on.", - "Play a jazz station." - ], - "tags": [ - "Music", - "news", - "Audio", - "music", - "bbc", - "\\radio", - "Daily", - "Media", - "Entertainment", - "Information" - ], - "platforms": [ - "all" - ], - "stars": 0 - }, - { - "created": "2020-07-03T17:48:50Z", - "archived": false, - "license": "mit", - "modified": "2020-07-10T17:07:37Z", - "authorname": "elarion83", - "skillname": "YouTube", - "foldername": "nico-youtube.elarion83", - "name": "YouTube", - "url": "https://github.com/elarion83/nico-youtube", - "category": "Entertainment", - "description": "Does a basic search on YouTube, and plays the first result as audio.\n\nBased on the I Heart Radio and Tunein skills by johnbartkiw.\n\nThis is still untidy, but the basic functionality works.\n\nThis project is a fork from the awesome mcdruid work that can be found here :\nhttps://gitlab.com/mcdruid/mycroft-youtube-audio\n\nI want this plugin only to load few chill music, so if u want it just download it bro ! (when it will be finished meh) :)", - "short_description": "Play audio from YouTube", - "branch": "master", - "examples": [ - "Play Hendrix (on|with|using) youtube.", - "Play Midnight in Harlem.", - "Play Clapton Crossroads.", - "Stop." - ], - "tags": [ - "Entertainment", - "music", - "youtube", - "streaming", - "stream", - "audio" - ], - "platforms": [ - "all" - ], - "stars": 0 - }, - { - "created": "2020-07-06T08:39:50Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-07-10T18:43:15Z", - "authorname": "JarbasSkills", - "skillname": "TTS control skill", - "foldername": "skill-tts-control.JarbasSkills", - "name": "TTS control skill", - "url": "https://github.com/JarbasSkills/skill-tts-control", - "category": null, - "description": "", - "short_description": "Allows to change or retrieve info about Text to Speech by voice", - "branch": "master", - "examples": [ - "What is the current voice?", - "Available voice engines.", - "Text to speech demo.", - "Change voice to alan pope.", - "Change voice to kusal.", - "Change voice to google.", - "Change voice to alan black.", - "Change voice to female.", - "Change voice to richard.", - "Change voice to amazon.", - "Change voice to whisper." - ], - "tags": [], - "platforms": [ - "all" - ], - "stars": 0 - }, - { - "created": "2020-05-14T20:49:18Z", - "archived": false, - "license": "mit", - "modified": "2020-06-04T02:06:53Z", - "authorname": "jandrovins", - "skillname": "Yeelight", - "foldername": "yeelight-skill.jandrovins", - "name": "Yeelight", - "url": "https://github.com/jandrovins/yeelight-skill", - "category": "IoT", - "description": "This skill is used to manage a yeelight color bulb 2 using mycroft and yeelight library (https://gitlab.com/stavros/python-yeelight).", - "short_description": "Manages yeelight", - "branch": "master", - "examples": [ - "How is my bulb.", - "Is my bulb on.", - "What is the color of my bulb?", - "What is the intensity of my bulb?", - "What is the mode of my bulb?", - "Is my bulb off.", - "When was the bulb turned on?", - "Set my bulb intensity to percent.", - "Set my bulb to flow.", - "Turn off my bulb.", - "Turn on my bulb.", - "Turn my bulb into " - ], - "tags": [ - "Bulb", - "IoT", - "Daily", - "Yeelight" - ], - "platforms": [ - "all" - ], - "stars": 0 - }, - { - "created": "2020-06-05T01:31:12Z", - "archived": false, - "license": null, - "modified": "2020-08-11T16:47:39Z", - "authorname": "mmarta002", - "skillname": "", - "foldername": "skill-npr-one.mmarta002", - "name": "", - "url": "https://github.com/mmarta002/skill-npr-one", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [], - "platforms": [ - "all" - ], - "stars": 1 - }, - { - "created": "2020-04-08T16:48:53Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-05-18T18:27:45Z", - "authorname": "santidearribas", - "skillname": "Daisy", - "foldername": "daisy-skill.santidearribas", - "name": "Daisy", - "url": "https://github.com/santidearribas/daisy-skill", - "category": "Information", - "description": "This skill enable sthe user to.", - "short_description": "Daisy skill used to send questions to the user and return answers to the daisy-db", - "branch": "master", - "examples": [ - "Hi daisy.", - "Do i have any questions today.", - "Whats my location?" - ], - "tags": [ - "Information" - ], - "platforms": [ - "all" - ], - "stars": 0 - }, - { - "created": "2020-06-09T17:54:47Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-06-10T16:53:22Z", - "authorname": "JarbasSkills", - "skillname": "", - "foldername": "skill-8fact.JarbasSkills", - "name": "", - "url": "https://github.com/JarbasSkills/skill-8fact", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [], - "platforms": [ - "all" - ], - "stars": 1 - }, - { - "created": "2020-08-26T14:41:51Z", - "archived": false, - "license": null, - "modified": "2020-08-26T14:47:50Z", - "authorname": "kareemserry", - "skillname": "Lights", - "foldername": "lights_skill.kareemserry", - "name": "Lights", - "url": "https://github.com/kareemserry/lights_skill", - "category": "IoT", - "description": "Just turns on or off the light.", - "short_description": "Turns on or off the light", - "branch": "master", - "examples": [ - "Lights.", - "Turn on the lights.", - "Turn off the lights.", - "Toggle lights.", - "Switch lights.", - "Turn off light one.", - "Turn on light one.", - "Switch light one.", - "Switch light twwo.", - "Switch light two.", - "Turn on light two.", - "Turn off light two.", - "Get the lights." - ], - "tags": [ - "IoT" - ], - "platforms": [ - "all" - ], - "stars": 0 - }, - { - "created": "2020-07-16T15:43:57Z", - "archived": false, - "license": "mit", - "modified": "2020-07-16T16:16:12Z", - "authorname": "elarion83", - "skillname": "Description", - "foldername": "nico-soundcloud.elarion83", - "name": "Description", - "url": "https://github.com/elarion83/nico-soundcloud", - "category": "Entertainment", - "description": "Only load few musics from soundcloud.", - "short_description": "", - "branch": "master", - "examples": [ - "Soundcloud." - ], - "tags": [ - "Entertainment", - "soundcloud", - "music", - "streaming", - "stream", - "audio" - ], - "platforms": [ - "all" - ], - "stars": 0 - }, - { - "created": "2020-03-08T14:14:04Z", - "archived": false, - "license": null, - "modified": "2020-03-08T17:19:49Z", - "authorname": "feua", - "skillname": "Storyteller", - "foldername": "storyteller-skill.feua", - "name": "Storyteller", - "url": "https://github.com/feua/storyteller-skill", - "category": "Entertainment", - "description": "", - "short_description": "Tells short classic stories for children", - "branch": "master", - "examples": [ - "Tell me a story.", - "Why don't you tell me a story.", - "Please, tell me a story.", - "Will you tell me a story.", - "Read a story for me.", - "Read a story for me, please." - ], - "tags": [ - "Tale", - "Story", - "Entertainment", - "Storyteller", - "Storytelling", - "Tales", - "Fable", - "Fables", - "Media", - "audio,", - "daily" - ], - "platforms": [ - "all" - ], - "stars": 0 - }, - { - "created": "2020-08-06T17:13:02Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-08-07T01:06:42Z", - "authorname": "JarbasSkills", - "skillname": "Futurism Cartoons", - "foldername": "skill-futurism-cartoons.JarbasSkills", - "name": "Futurism Cartoons", - "url": "https://github.com/JarbasSkills/skill-futurism-cartoons", - "category": "Entertainment", - "description": "Comics from [futurism cartoons](https://www.instagram.com/futurismcartoons/)\n\nCan be used as idle screen for mark2\n\n\n![](gui.png)\n![](gui2.png)", - "short_description": "![](logo.png)", - "branch": "master", - "examples": [ - "Show me the latest futurism comic.", - "Random futurism cartoon.", - "How many futurism comics." - ], - "tags": [ - "-", - "mark2", - "comics", - "idle", - "Entertainment", - "screen", - "bigscreen" - ], - "platforms": [ - "all" - ], - "stars": 0 - }, - { - "created": "2020-03-25T17:44:08Z", - "archived": false, - "license": null, - "modified": "2020-04-02T11:00:13Z", - "authorname": "derkodde", - "skillname": "Shell Starter", - "foldername": "raspotify-starter-skill.derkodde", - "name": "Shell Starter", - "url": "https://github.com/derkodde/raspotify-starter-skill", - "category": "IoT", - "description": "This script executes custom shell scripts. In the moment it starts and stops raspotify.\nhttps://github.com/dtcooper/Raspotify\nYou will have to config raspotify manually here in /etc/default/raspotify\n- Give it a device name and set it in the spotify skill\n- set password and spotify user.", - "short_description": "Execute custom shell scripts", - "branch": "master", - "examples": [ - "Start Raspotifi Service.", - "Restart Raspotify client.", - "Kill raspotify.", - "Stop raspotify client." - ], - "tags": [ - "IoT", - "Scripts", - "Cmd", - "Bash", - "Shell", - "Configuration", - "Productivity" - ], - "platforms": [ - "all" - ], - "stars": 0 - }, - { - "created": "2020-08-06T18:13:30Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-08-08T14:13:33Z", - "authorname": "gras64", - "skillname": "Car Control Example", - "foldername": "car-control-example-skill.gras64", - "name": "Car Control Example", - "url": "https://github.com/gras64/car-control-example-skill", - "category": "Daily", - "description": "The skill was used as an interface for controlling the electronics in a car. It only contains the basic code without an API. obd2 or airplay would be conceivable, depending on the vehicle, the api commands must be set up.", - "short_description": "With this mycroft skill you can control things in the car such as air conditioning, lights, wipers, cruise control and LED lighting", - "branch": "master", - "examples": [ - "Switch light on.", - "How much battery capacity I have left.", - "Make everything dark.", - "Interior lighting in red.", - "Deactivate low beam.", - "Cruise control to 100 km/h.", - "Start charging.", - "Stop loading.", - "Set temperature to 20.", - "Make you colder.", - "Temperature increase.", - "Delete cruise control.", - "Speed up wipers.", - "Slow down wipers.", - "Disable wipers.", - "Aktivate wipers." - ], - "tags": [ - "Daily" - ], - "platforms": [ - "all" - ], - "stars": 0 - }, - { - "created": "2020-05-06T23:15:21Z", - "archived": false, - "license": "lgpl-3.0", - "modified": "2020-05-12T11:42:30Z", - "authorname": "stratus-ss", - "skillname": "mycroft-recipe-helper-skill", - "foldername": "mycroft-recipe-helper-skill.stratus-ss", - "name": "mycroft-recipe-helper-skill", - "url": "https://github.com/stratus-ss/mycroft-recipe-helper-skill", - "category": null, - "description": "This skill is designed to be a helper when dealing with recipes. It will convert between both imperial and metric values. It will also give you the weight of butter based on cups, tablespoons and teaspoons.\n\n*NOTE* This skill does not deal with kilograms at the current time as this is not a common measurement unit in home cooking.", - "short_description": "", - "branch": "master", - "examples": [ - "How much does {OldUnit} of butter weigh in {NewUnit}", - "Convert {OldUnit} to {NewUnit}", - "What is {OldUnit} in {NewUnit}?", - "ML to Litres.", - "ML to Cups.", - "ML to Pints.", - "ML to Fluid Ounces.", - "Cups to mL.", - "Cups to Litres.", - "Litres to Cups.", - "Litres to Pints.", - "Litres to Fluid Ounces.", - "Pints to mL.", - "Pints to Litres.", - "Fluid Ounces to mL.", - "Fluid Ounces to Litres.", - "Ounces to Grams.", - "Ounces to Pounds.", - "Pounds to Grams.", - "Pounds to Ounces.", - "Grams to Ounces.", - "Grams to Pounds.", - "Celsius to Fahrenheit.", - "Fahrenheit to Celsius." - ], - "tags": [], - "platforms": [ - "all" - ], - "stars": 0 - }, - { - "created": "2020-06-08T22:15:45Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-06-25T15:51:33Z", - "authorname": "gravesjohnr", - "skillname": "Todoist", - "foldername": "todoist-skill.gravesjohnr", - "name": "Todoist", - "url": "https://github.com/gravesjohnr/todoist-skill", - "category": "Productivity", - "description": "Interaces with the todoist application to add items to project lists. this was created to replace wunderlist.", - "short_description": "Add items to todoist (https://todoist.com) project lists", - "branch": "master", - "examples": [ - "Add milk to list safeway.", - "Add paper towels to list costco.", - "Add notebook paper to list walmart.", - "Add flowers to list home depot." - ], - "tags": [ - "Wunderlist", - "manager", - "Todoist", - "List", - "Productivity" - ], - "platforms": [ - "all" - ], - "stars": 0 - }, - { - "created": "2020-03-18T01:58:10Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-03-21T15:29:39Z", - "authorname": "wildmountainfarms", - "skillname": "PVOutput", - "foldername": "pvoutput-mycroft.wildmountainfarms", - "name": "PVOutput", - "url": "https://github.com/wildmountainfarms/pvoutput-mycroft", - "category": "IoT", - "description": "With this skill, you can ask Mycroft for the status of your solar panel system.\nThis retrieves data from https://pvoutput.org. You can ask it for today's\nenergy generation or last week's energy consumption.\n\nRecommended to be used with [SolarThing](https://github.com/wildmountainfarms/solarthing), which can upload data to PVOutput.\nThere are also [numerous other programs](https://github.com/topics/pvoutput) that can upload data to PVOutput.\n\nThis requires you to set up an account on https://pvoutput.org to get an API key.", - "short_description": "Informs you about energy generation and consumption", - "branch": "master", - "examples": [ - "How much energy have the panels produced today?", - "How much energy have I used today?", - "How much energy was produced yesterday?", - "How much energy was generated last month?", - "How much energy have I used this year?", - "How much power am I using right now?", - "How much power are the solar panels generating?", - "What was my peak power?" - ], - "tags": [ - "IoT", - "Energy", - "PVOutput", - "SolarPower", - "Productivity" - ], - "platforms": [ - "all" - ], - "stars": 0 - }, - { - "created": "2020-05-29T12:27:16Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-05-29T18:57:11Z", - "authorname": "Tasty213", - "skillname": "Bbc Radio", - "foldername": "bbc-radio-skill.Tasty213", - "name": "Bbc Radio", - "url": "https://github.com/Tasty213/bbc-radio-skill", - "category": "Music", - "description": "Streams bbc radio from the internet live to the mycroft device. the user is able to select between all the bbc radio stations including 1, 1x, 2, 3, 4 fm, 4 lw, 4x, 5 live, 5 live sports extra, 6 music, asian network. note that this service may only be available in the uk due to licensing reasons will update when more certain in the meantime this skill is only to be used in the uk. user can also pause and stop the radio, if paused then it will only mute the stream and will not pick up where left off.", - "short_description": "Plays live radio from the bbc (only available in the uk)", - "branch": "master", - "examples": [ - "Play bbc radio 1.", - "Play bbc radio 2.", - "Play bbc radio 3.", - "Play bbc radio 4.", - "Play bbc radio 5.", - "Pause radio.", - "Stop radio." - ], - "tags": [ - "Bbc,", - "Music", - "Audio", - "bbc", - "radio", - "Radio", - "radio," - ], - "platforms": [ - "all" - ], - "stars": 0 - }, - { - "created": "2020-04-19T19:06:02Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-04-22T03:12:58Z", - "authorname": "hayatae", - "skillname": "Gale Home Assistant", - "foldername": "gale-home-assistant-skill.hayatae", - "name": "Gale Home Assistant", - "url": "https://github.com/hayatae/gale-home-assistant-skill", - "category": "IoT", - "description": "Command everything!", - "short_description": "Manages gale's home assistant", - "branch": "master", - "examples": [ - "Set basement 10%" - ], - "tags": [ - "IoT" - ], - "platforms": [ - "all" - ], - "stars": 0 - }, - { - "created": "2020-05-29T13:29:19Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-06-08T22:40:23Z", - "authorname": "JarbasSkills", - "skillname": "", - "foldername": "skill-template.JarbasSkills", - "name": "", - "url": "https://github.com/JarbasSkills/skill-template", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [], - "platforms": [ - "all" - ], - "stars": 0 - }, - { - "created": "2020-07-25T16:51:40Z", - "archived": false, - "license": null, - "modified": "2020-09-27T14:51:13Z", - "authorname": "eodas", - "skillname": "PiAI Pi AI (Pi AI) - INTERNET OF THINGS (IoT) :: Internet of Things Drools-jBPM Expert System using Pi AI Tron AI-IoTBPMServer", - "foldername": "Pi_AI.eodas", - "name": "PiAI Pi AI (Pi AI) - INTERNET OF THINGS (IoT) :: Internet of Things Drools-jBPM Expert System using Pi AI Tron AI-IoTBPMServer", - "url": "https://github.com/eodas/Pi_AI", - "category": "IoT", - "description": "This Skill demonstrates how to interact with the Raspberry Pi GPIO pins using a Mycroft Skill. This Skill shows both reading data from a GPIO port (detecting a button press) and writing data to the port (illuminating an LED).\n\n### Preparation\n\n[You will need to first install the GPIO libraries for Picroft, and add some additional permissions](https://mycroft.ai/documentation/picroft/#using-the-gpio-pins-on-the-raspberry-pi-3).\n\n### Installing from the `makefile`\n\n* Change the Makefile IP address for the RPi installation to the IP address of your RPi.\n\nThat is, edit the file `makefile` using your favorite editor like `nano` or `vi`.\n\nThe line you will need to change is `scp -r * pi@192.168.205.115:/opt/mycroft/skills/skill-gpio`.\n\nChange this to have the IP address of your RPi.\n\n* Create the folder ```/opt/mycroft/skills/skill-gpio``` on the RPi for the installer.\n\nYou can do this by using the command `mkdir /opt/mycroft/skills/skill-gpio`\n\n* Build the code using the `makefile`. ```make install.pi```\n\n### Notes\n\nIf the LED blinking is too fast, it will be difficult to get a command to execute because there will be a voice response when the the LED turns off and on. Turn the blinking to a lower frequency to be able to execute commands.", - "short_description": "", - "branch": "master", - "examples": [ - "Turn Device on.", - "Turn Device off.", - "Blink Device.", - "Device status." - ], - "tags": [ - "IoT", - "GPIO", - "RPi" - ], - "platforms": [ - "platform_mark1", - "platform_picroft" - ], - "stars": 0 - }, - { - "created": "2020-05-03T03:08:23Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-05-03T03:12:44Z", - "authorname": "zanderWK", - "skillname": "", - "foldername": "Mycroft-ZANews.zanderWK", - "name": "", - "url": "https://github.com/zanderWK/Mycroft-ZANews", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [], - "platforms": [ - "all" - ], - "stars": 0 - }, - { - "created": "2020-07-06T01:19:42Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-08T11:59:05Z", - "authorname": "AnneArundelMedical", - "skillname": "Aamc Covid", - "foldername": "aamc-covid-skill.AnneArundelMedical", - "name": "Aamc Covid", - "url": "https://github.com/AnneArundelMedical/aamc-covid-skill", - "category": "Information", - "description": "Guides patients through the covid proning protocol. Communicates patient status to the nursing station (not implemented yet).", - "short_description": "Interacts with patients", - "branch": "master", - "examples": [ - "Start proning." - ], - "tags": [ - "Information" - ], - "platforms": [ - "all" - ], - "stars": 0 - }, - { - "created": "2020-03-15T02:13:47Z", - "archived": false, - "license": null, - "modified": "2020-03-15T14:24:50Z", - "authorname": "MYesca", - "skillname": "Biobio", - "foldername": "biobio-skill.MYesca", - "name": "Biobio", - "url": "https://github.com/MYesca/biobio-skill", - "category": "Entertainment", - "description": "This skill is meant to be used along with a custom enclosure made for an old matrix printer from the 80's. requires an orangepi and some parallel port circuitry.", - "short_description": "Plot the user's biorythm in the old printer", - "branch": "master", - "examples": [ - "Draw my biorythm.", - "How is my health?", - "How are my powers?", - "Plot my bio." - ], - "tags": [ - "Printer", - "Emilia", - "Iot", - "Entertainment" - ], - "platforms": [ - "all" - ], - "stars": 0 - }, - { - "created": "2020-08-10T16:30:20Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-08-10T17:19:59Z", - "authorname": "JarbasSkills", - "skillname": "Mouse Jiggler", - "foldername": "skill-mouse-jiggler.JarbasSkills", - "name": "Mouse Jiggler", - "url": "https://github.com/JarbasSkills/skill-mouse-jiggler", - "category": "Configuration", - "description": "A Mouse Jiggler prevents your computer from going to sleep while you work or play.\n\nThis skill creates constant mouse activity so your computer won't go idle and trigger screen savers or sleep mode—eliminating the need to log in repeatedly.\n\n![](https://raw.githubusercontent.com/OpenJarbas/jiggle/master/xkcd.png)", - "short_description": "Mouse Jiggler prevents your computer from going to sleep", - "branch": "master", - "examples": [ - "Start mouse activity.", - "Stop mouse activity.", - "Enable mouse jiggler.", - "Disable mouse jiggler." - ], - "tags": [ - "configuration", - "Configuration" - ], - "platforms": [ - "all" - ], - "stars": 0 - }, - { - "created": "2020-05-03T17:13:20Z", - "archived": false, - "license": "mit", - "modified": "2020-06-01T14:07:38Z", - "authorname": "samtherussell", - "skillname": "Tesla Powerwall Connector", - "foldername": "tesla-powerwall-mycroft-skill.samtherussell", - "name": "Tesla Powerwall Connector", - "url": "https://github.com/samtherussell/tesla-powerwall-mycroft-skill", - "category": "IoT", - "description": "", - "short_description": "Reports tesla powerwall battery stats", - "branch": "master", - "examples": [ - "How full is the battery.", - "How much electricty is the house using.", - "How much power are the solar panels generating.", - "How much energy is the grid supplying." - ], - "tags": [ - "IoT", - "Battery", - "Powerwall", - "Tesla" - ], - "platforms": [ - "all" - ], - "stars": 0 - }, - { - "created": "2020-10-18T03:40:40Z", - "archived": false, - "license": "mit", - "modified": "2020-10-18T04:24:37Z", - "authorname": "kbrtny", - "skillname": "Robot", - "foldername": "robot_skill.kbrtny", - "name": "Robot", - "url": "https://github.com/kbrtny/robot_skill", - "category": "Transport", - "description": "Works with a robot over websockets to command it.", - "short_description": "Commands a home robot", - "branch": "main", - "examples": [ - "Robot, go to the living room.", - "Send the robot to the bedroom.", - "Bring the robot to the kitchen.", - "Gemab, get me a beer.", - "Gemab, bring this to the nursery.", - "Where is the robot?", - "Where is gemab?", - "Bring me my wallet." - ], - "tags": [ - "Control", - "Robot", - "Transport" - ], - "platforms": [ - "all" - ], - "stars": 0 - }, - { - "created": "2020-05-18T15:17:14Z", - "archived": false, - "license": null, - "modified": "2020-05-19T14:14:44Z", - "authorname": "forslund", - "skillname": "Common query skills", - "foldername": "common-query-tutorial.forslund", - "name": "Common query skills", - "url": "https://github.com/forslund/common-query-tutorial", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [ - "Query-tutorial))" - ], - "tags": [], - "platforms": [ - "all" - ], - "stars": 0 - }, - { - "created": "2020-03-27T03:19:00Z", - "archived": false, - "license": "mit", - "modified": "2020-03-27T04:52:05Z", - "authorname": "jamesmf", - "skillname": "Workout Timer", - "foldername": "mycroft-workout-skill.jamesmf", - "name": "Workout Timer", - "url": "https://github.com/jamesmf/mycroft-workout-skill", - "category": "Daily", - "description": "This skill walks you through a timed workout that you can customize with your settings.", - "short_description": "Walks you through a customizable home workout", - "branch": "master", - "examples": [ - "Start workout.", - "Begin workout.", - "Start workout timer." - ], - "tags": [ - "Workout", - "Fitness", - "Daily", - "Productivity" - ], - "platforms": [ - "all" - ], - "stars": 0 - }, - { - "created": "2020-04-17T12:35:01Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-05-18T18:53:46Z", - "authorname": "Peyos", - "skillname": "Wake On Lan", - "foldername": "wake-on-lan-skill.Peyos", - "name": "Wake On Lan", - "url": "https://github.com/Peyos/wake-on-lan-skill", - "category": "Productivity", - "description": "This skill sends a Magic Packet to one of the configured devices to boot it up from hibernation. Wake on Lan has to be active in the receiving device.", - "short_description": "Sends a Magic Packet to the configured device", - "branch": "master", - "examples": [ - "Boot my computer.", - "Wake up my computer." - ], - "tags": [ - "lan", - "Boot", - "Wake", - "on", - "Productivity", - "Computer" - ], - "platforms": [ - "all" - ], - "stars": 0 - }, - { - "created": "2020-08-30T15:41:52Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-08-30T16:54:27Z", - "authorname": "b4ldr", - "skillname": "Hamertime", - "foldername": "hamertime-skill.b4ldr", - "name": "Hamertime", - "url": "https://github.com/b4ldr/hamertime-skill", - "category": "Entertainment", - "description": "Play a song when a specific keywoard is spoken.", - "short_description": "Play a song when a specific keywoard is spoken", - "branch": "master", - "examples": [ - "Hammertime.", - "Stop hammertime.", - "Yu can't touch this." - ], - "tags": [ - "Music", - "Entertainment" - ], - "platforms": [ - "all" - ], - "stars": 0 - }, - { - "created": "2020-09-04T19:45:23Z", - "archived": false, - "license": null, - "modified": "2020-09-04T19:47:52Z", - "authorname": "AIIX", - "skillname": "", - "foldername": "thequizgame.AIIX", - "name": "", - "url": "https://github.com/AIIX/thequizgame", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [], - "platforms": [ - "all" - ], - "stars": 0 - }, - { - "created": "2020-08-11T00:02:19Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-08-11T00:30:22Z", - "authorname": "renayo", - "skillname": "Shakespeare Insult", - "foldername": "shakespeareinsult-skill.renayo", - "name": "Shakespeare Insult", - "url": "https://github.com/renayo/shakespeareinsult-skill", - "category": "Entertainment", - "description": "Insult me like Shakespeare.", - "short_description": "Insult me like Shakespeare", - "branch": "master", - "examples": [ - "Insult me like Shakespeare." - ], - "tags": [ - "Insult", - "Entertainment" - ], - "platforms": [ - "all" - ], - "stars": 0 - }, - { - "created": "2020-08-05T22:43:35Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-08-06T02:20:07Z", - "authorname": "renayo", - "skillname": "Iching", - "foldername": "iching-skill.renayo", - "name": "Iching", - "url": "https://github.com/renayo/iching-skill", - "category": "Entertainment", - "description": "Quickly call up a randomized hexagram from the I Ching to further stimulate thought.", - "short_description": "Offers randomized selection from the I Ching", - "branch": "master", - "examples": [ - "Iching.", - "Eching." - ], - "tags": [ - "Answer", - "Random", - "Entertainment", - "Oracle" - ], - "platforms": [ - "all" - ], - "stars": 0 - }, - { - "created": "2020-05-11T18:06:49Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-09-06T18:57:52Z", - "authorname": "davimk", - "skillname": "Led Ring", - "foldername": "led-ring.davimk", - "name": "Led Ring", - "url": "https://github.com/davimk/led-ring", - "category": "Configuration", - "description": "Sends commands to matrix voice everloop led ring driver.", - "short_description": "Controls matrix voice everloop led ring", - "branch": "master", - "examples": [], - "tags": [ - "Led", - "Matrix", - "everloop", - "ring", - "Configuration", - "voice", - "Everloop" - ], - "platforms": [ - "all" - ], - "stars": 0 - }, - { - "created": "2020-04-30T20:02:42Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-05-22T22:35:01Z", - "authorname": "BrownKnight", - "skillname": "Web Music Control", - "foldername": "web-music-control-skill.BrownKnight", - "name": "Web Music Control", - "url": "https://github.com/BrownKnight/web-music-control-skill", - "category": "Entertainment", - "description": "Sends commands to a locally hosted web-based music player. designed for use with a local apple music web client which uses musickitjs.", - "short_description": "Controls a local web-based music player, such as a apple music web client", - "branch": "master", - "examples": [ - "Play before you go.", - "Play the song before you go.", - "Play songs by lewis capaldi.", - "Play my car playlist.", - "Play the playlist car.", - "Play before you go by lewis capaldi.", - "Play the song before you go by lewis capaldi.", - "Play something.", - "Play anything.", - "Play my calm playlist.", - "Play my car playlist.", - "Play the playlist car." - ], - "tags": [ - "Apple", - "Music", - "Iot", - "Web", - "music", - "Control", - "Entertainment", - "audio" - ], - "platforms": [ - "all" - ], - "stars": 0 - }, - { - "created": "2020-08-10T03:39:07Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-09-22T05:49:58Z", - "authorname": "renayo", - "skillname": "Nvc", - "foldername": "nvc-skill.renayo", - "name": "Nvc", - "url": "https://github.com/renayo/nvc-skill", - "category": "Productivity", - "description": "This skill is based on the work of Marshall Rosenberg, PhD; particularly his book titled \"Nonviolent Communication: a Language of Life\" (third edition).\n\nNonviolent communication is a well-established body of social and communication strategies that \"integrate consciousness, language, communication, and means of influence to increase our ability to live with choice, meaning, and connection; connect empathetically with self and others to have more satisfying relationships; and sharing of resources so everybody is able to benefit.\"", - "short_description": "Uses principles of nonviolent communication to help you structure your thinking and communicate better", - "branch": "master", - "examples": [ - "Lets communicate.", - "Let's communicate.", - "Compassionate communication.", - "Nonviolent communication.", - "Nvc.", - "Communication quote." - ], - "tags": [ - "Efficiency", - "Communication", - "Productivity", - "Psychology" - ], - "platforms": [ - "all" - ], - "stars": 1 - }, - { - "created": "2017-04-05T22:56:27Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-06T00:24:27Z", - "authorname": "MycroftAI", - "skillname": "Hello World", - "foldername": "skill-hello-world", - "name": "Hello World", - "url": "https://github.com/MycroftAI/skill-hello-world", - "category": "Configuration", - "description": "This is a basic Hello Word Skill that takes an _Utterance_ from the user and provides a voice response - a _Dialog_. This Skill demonstrates the basic directory and file structure of a Mycroft Skill, and is a good first Skill to study if you are interested in developing Skills for the Mycroft ecosystem.\n\nIf you want to write **Skills** for Mycroft, Documentation is available:\n[Mycroft Skills Kit](https://mycroft.ai/documentation/skills/msk/)\n * [Developing a new Skill](https://mycroft.ai/documentation/skills/introduction-developing-skills/)\n * [Skill Settings](https://mycroft.ai/documentation/skills/skill-settings/)\n * [Automatic testing of your Mycroft Skill](https://mycroft.ai/documentation/skills/automatic-testing/)\n * [Skill Acceptance Process](https://mycroft.ai/documentation/skills/skills-acceptance-process/)\n * [Mycroft Skills Manager](https://mycroft.ai/documentation/msm/)\n * [Mycroft Message Bus](https://mycroft.ai/documentation/message-bus/)", - "short_description": "Introductory Skill so that Skill Authors can see how a Mycroft Skill is put together", - "branch": "20.08", - "examples": [ - "Hello world.", - "How are you?", - "Thank you.", - "Hello world", - "Thank you" - ], - "tags": [ - "first-skill", - "helloworld", - "Configuration", - "hello", - "greeting", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 10, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/smile.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Hello World Skill", - "android_handler": "skill-hello-world.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-09-07T19:37:21Z", - "archived": false, - "license": "epl-2.0", - "modified": "2020-07-13T10:04:02Z", - "authorname": "openhab", - "skillname": "openHAB", - "foldername": "openhab-mycroft", - "name": "openHAB", - "url": "https://github.com/openhab/openhab-mycroft", - "category": "IoT", - "description": "This skill adds [openHAB](http://www.openhab.org/) support to [Mycroft](https://mycroft.ai).\nThe skill takes advantage of the openHAB REST API, so it works both with the v1.x and v2.x of openHAB.\n\nIn order to make openHAB Items accessible to Mycroft, they need to be [tagged](https://www.openhab.org/addons/integrations/homekit/).\nDevice names recognized by Mycroft are matched against openHAB Item Labels.\n\nThe above examples would all work with the following set of openHAB Item definitons:\n\n```java\nColor DiningroomLight \"Diningroom Light\" (gKitchen) [ \"Lighting\" ] {channel=\"hue:0200:1:bloom1:color\"}\nColor KitchenLight \"Kitchen Light\" (gKitchen) [ \"Lighting\" ] {channel=\"hue:0200:1:bloom1:color\"}\nSwitch GoodNight \"Good Night\"[ \"Switchable\" ]\n\nNumber MqttID1Temperature \"Bedroom Temperature\" [ \"CurrentTemperature\" ] {mqtt=\"<[mosquitto:mysensors/SI/1/1/1/0/0:state:default]\"}\nNumber MqttID1Humidity \"Bedroom Humidity\" [ \"CurrentHumidity\" ] {mqtt=\"<[mosquitto:mysensors/SI/1/0/1/0/1:state:default]\"}\n\nGroup gThermostat \"Main Thermostat\" [ \"gMainThermostat\" ]\nNumber MainThermostatCurrentTemp \"Main Thermostat Current Temperature\" (gMainThermostat) [ \"CurrentTemperature\" ]\nNumber MainThermostatTargetTemperature \"Main Thermostat Target Temperature\" (gMainThermostat) [ \"TargetTemperature\" ]\nString MainThermostatHeatingCoolingMode \"Main Thermostat Heating/Cooling Mode\" (gMainThermostat) [ \"homekit:HeatingCoolingMode\" ]\n```\n\nIf items are modified in openHAB, a refresh in Mycroft is needed by the command:\n\n\nIf you've forgotten what items have been identified, you can ask Mycroft:\n*Hey Mycroft, refresh openhab items*\n * *Hey Mycroft, list openhab items*", - "short_description": "This skill adds openHAB support to Mycroft.", - "branch": "master", - "examples": [ - "Turn on Diningroom Light.", - "Switch off Kitchen Light.", - "Put on Good Night.", - "What is Good Night status?", - "What is the status of Good Night?", - "Set Diningroom to 50 percent.", - "Dim Kitchen.", - "Bright Kitchen.", - "Dim Kitchen by 20 percent.", - "What's Bedroom temperature?", - "Tell me the temperature of Bedroom.", - "What's the Bedroom humidity?", - "I'd like to know the humidity of Bedroom.", - "Adjust Main Thermostat to 21 degrees.", - "Regulate Main Thermostat to 20 degrees.", - "Decrease Main Thermostat by 2 degrees.", - "Increase Main Thermostat by 1 degrees.", - "What is Main Thermostat is regulated to?", - "How the Main Thermostat tuned to?", - "Hey Mycroft, turn on Diningroom Light", - "Hey Mycroft, switch off Kitchen Light", - "Hey Mycroft, put on Good Night", - "Hey Mycroft, what is Good Night status?", - "Hey Mycroft, what is the status of Good Night?", - "Hey Mycroft, set Diningroom to 50 percent", - "Hey Mycroft, dim Kitchen", - "Hey Mycroft, bright Kitchen", - "Hey Mycroft, dim Kitchen by 20 percent", - "Hey Mycroft, what's Bedroom temperature?", - "Hey Mycroft, tell me the temperature of Bedroom", - "Hey Mycroft, what's the Bedroom humidity?", - "Hey Mycroft, I'd like to know the humidity of Bedroom", - "Hey Mycroft, adjust Main Thermostat to 21 degrees", - "Hey Mycroft, regulate Main Thermostat to 20 degrees", - "Hey Mycroft, decrease Main Thermostat by 2 degrees", - "Hey Mycroft, increase Main Thermostat by 1 degrees", - "Hey Mycroft, what is Main Thermostat is regulated to?", - "Hey Mycroft, how the Main Thermostat tuned to?" - ], - "tags": [ - "IoT", - "opensource", - "openHAB", - "smarthome", - "Automation", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 17, - "icon": "https://www.openhab.org/openhab-logo-square.png", - "credits": [ - "@mortommy" - ], - "categories": [ - "IoT" - ], - "requirements": { - "python": [ - "requests>=2.10.0\r", - "rapidfuzz==0.7.6" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Openhab Mycroft Skill", - "android_handler": "openhab-mycroft.openhab.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-08-02T15:15:44Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-23T18:23:26Z", - "authorname": "forslund", - "skillname": "Play Spotify", - "foldername": "spotify-skill", - "name": "Play Spotify", - "url": "https://github.com/forslund/spotify-skill", - "category": "Music", - "description": "Stream your favorite music from the popular Spotify music service. Spotify\nPremium users can search and play tracks from their own playlists or the huge\nSpotify music library.\n\nYou can also control your Mycroft device using the Spotify Connect system.\nSo play DJ on your phone while listening on Mycroft!\n\n### This skill doesn't do any playback\nThis skill works with the Spotify Connect protocol to interact with Spotify devices, but doesn't perform any playback itself. If you want playback on the hosting Mycroft device, you'll need to set up a player yourself.\n\nFor Picroft users, [raspotify](https://github.com/dtcooper/raspotify) is a good choice.\n\nInstall it and then make changes to `/etc/default/raspotify.conf` as follows\n\n\n`DEVICE_NAME=\"\"\n\n\n`OPTIONS=\"--username --password \"`\n\n\nYou make sound work with raspotify you may need to edit `/lib/systemd/system/raspotify.service` and there change `User` and `Group` from `raspotify`to `pi`.\n\n\nFor desktop users the official spotify player works well.\n\nThe exception to this is the Mark-1 which is shipped with a spotify player library.\n\n### Authorization:\nThis Skill uses two different methods of authentication. Both need to be filled in correctly for the **Skill** to function correctly.\n\n#### Personal Access Token\n\n##### Creating access token\nFrom the [Spotify developer dashboard](https://developer.spotify.com/dashboard/)\n\n1. Click \"CREATE AN APP\"\n1. Fill out the create application form\n1. Click on the new app and choose EDIT SETTINGS\n1. Under Redirect URIs add `https://localhost:8888`\n\nMore info can be found [here](https://developer.spotify.com/documentation/general/guides/app-settings/).\n\n##### Connecting spotify skill\nAfter installing `mycroft-spotify`, from the mycroft-core folder run the auth.py script in the mycroft-spotify folder\n\n```\nsource venv-activate.sh\npython /opt/mycroft/skills/mycroft-spotify.forslund/auth.py\n```\n\nThe script will try to guide you through connecting a developer account to the skill and store the credentials locally.\n\n#### Username and password to authenticate a Mycroft device\nIn addition to account details, Mycroft needs to be authorized as a **device** for Spotify. To do this, we use your username and password for Spotify. These must be entered as well, or you will receive an error message like:\n\n`I couldn't find any Spotify devices. This skill requires a Spotify Premium account to work properly.`\n\nwhen you try to use the **Skill** on a Mycroft device.\n\nIf you log in to Spotify using Facebook, your password will be your _Facebook_ password, but your Spotify device username. You can get your Spotify device username [here](https://www.spotify.com/us/account/set-device-password/).\n\n_NOTE: You MUST have a Premium Spotify account to use this **Skill**. It will NOT work with a free Spotify account._\nIt is recommended to set the DEVICE_NAME to the name of the Mycroft unit (as registered at home.mycroft.ai) for automatic identification:\n * set your Spotify username and password under OPTIONS", - "short_description": "Listen to music from your Spotify Premium music account.", - "branch": "20.08", - "examples": [ - "What Spotify devices are available?", - "Play discover weekly.", - "Play Hello Nasty on Spotify.", - "Play something by Covenant.", - "Play the album Hello Nasty on Spotify.", - "Play my liked songs.", - "Play discover weekly", - "Play Hello Nasty on Spotify", - "Play something by Covenant", - "Play the album Hello Nasty on Spotify", - "Play my liked songs" - ], - "tags": [ - "music", - "spotify", - "Music", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 44, - "icon": "https://rawcdn.githack.com/forslund/spotify-skill/05c19c0fba8a4af150c6eb8cf2e955d59ac83d15/Spotify_Icon.png", - "credits": [ - "@forslund\nThe Mycroft devs" - ], - "categories": [ - "Music" - ], - "requirements": { - "python": [ - "spotipy==2.17.1" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Spotify Skill", - "android_handler": "spotify-skill.forslund.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-04-04T17:49:49Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-21T10:36:40Z", - "authorname": "MycroftAI", - "skillname": "Weather", - "foldername": "skill-weather", - "name": "Weather", - "url": "https://github.com/MycroftAI/skill-weather", - "category": "Daily", - "description": "Get weather conditions, forecasts, expected precipitation and more! By default it will tell\nyou about your default location, or you can ask for other cities around the world. \n\nCurrent conditions and weather forecasts come from [Open Weather Map](https://openweathermap.org).\n\nFor **enclosures** with screen support, conditions are briefly shown using visemes.\n\nThe temperature is shown in Celsius or Fahrenheit depending on the preferences set in your [https://home.mycroft.ai](https://home.mycroft.ai) account.", - "short_description": "Weather conditions and forecasts", - "branch": "20.08", - "examples": [ - "What is the weather?", - "What is the forecast tomorrow?", - "What is the weather going to be like Tuesday?", - "What is the weather in Houston?", - "When will it rain next?", - "How windy is it?", - "What's the humidity?", - "Is it going to snow?", - "What's the temperature?" - ], - "tags": [ - "humidity", - "forecast", - "temperature", - "Daily", - "snow", - "rain", - "weather", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 11, - "icon": "https://rawgithub.com/FortAwesome/Font-Awesome/master/svgs/solid/sun.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Daily" - ], - "requirements": { - "python": [ - "pyowm==2.6.1", - "requests>=2.13.0", - "multi-key-dict==2.0.3" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Weather Skill", - "android_handler": "skill-weather.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2016-12-21T04:49:19Z", - "archived": false, - "license": "unknown", - "modified": "2020-07-25T15:39:29Z", - "authorname": "augustnmonteiro", - "skillname": "mycroft-youtube", - "foldername": "mycroft-youtube", - "name": "mycroft-youtube", - "url": "https://github.com/augustnmonteiro/mycroft-youtube", - "category": null, - "description": "A skill to play youtube", - "short_description": "A skill to play youtube", - "branch": "master", - "examples": [ - "Say." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 12, - "requirements": { - "python": [ - "python-firebase>=1.2", - "requests>=1.1" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Youtube Skill", - "android_handler": "mycroft-youtube.augustnmonteiro.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-04-04T17:47:50Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-06T00:23:18Z", - "authorname": "MycroftAI", - "skillname": "Mycroft's Background", - "foldername": "skill-personal", - "name": "Mycroft's Background", - "url": "https://github.com/MycroftAI/skill-personal", - "category": "Entertainment", - "description": "Ask about the \"birth\" and parentage of Mycroft and get a taste of the community\nwho is fostering this open source artificial intelligence.", - "short_description": "Learn history and personality of Mycroft", - "branch": "20.08", - "examples": [ - "When were you created?", - "What are you?", - "Where were you born?", - "Who made you?", - "Do you even rhyme?" - ], - "tags": [ - "Entertainment", - "personality", - "persona", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 4, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/smile-wink.svg", - "credits": [ - "Mycroft AI (@MycroftAI)\n\nPoem penned by community member Jelmer Prins" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Personal Skill", - "android_handler": "skill-personal.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-05-31T01:18:43Z", - "archived": false, - "license": "lgpl-3.0", - "modified": "2019-01-07T09:51:53Z", - "authorname": "eClarity", - "skillname": "Home Assistant Skill for Mycroft", - "foldername": "mycroft-homeassistant", - "name": "Home Assistant Skill for Mycroft", - "url": "https://github.com/eClarity/mycroft-homeassistant", - "category": null, - "description": "based off the original code from https://github.com/BongoEADGC6/mycroft-home-assistant, spun off my own version since they seem to be inactive.\n\nThis is a skill to add [Home Assistant](https://home-assistant.io) support to\n[Mycroft](https://mycroft.ai). Currently is supports turning on and off several\nentity types (`light`, `switch`, `scene`, `groups` and `input_boolean`).", - "short_description": "based off the original code from https://github.com/BongoEADGC6/mycroft-home-assistant, spun off my own version since they seem to be inactive.", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "fuzzywuzzy==0.14.0", - "requests>=2.10.0", - "python-Levenshtein==0.12.0" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Homeassistant Skill", - "android_handler": "mycroft-homeassistant.eclarity.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-01-08T18:40:39Z", - "archived": false, - "license": "mit", - "modified": "2018-10-17T13:32:47Z", - "authorname": "ethanaward", - "skillname": "Pandora", - "foldername": "pianobar-skill", - "name": "Pandora", - "url": "https://github.com/ethanaward/pianobar-skill", - "category": null, - "description": "Pandora provides dynamically generated internet radio streams. Streams are\ninfluenced by the the traits of the music played and the songs you like\nor skip.\n\nUsing this skill does require a [Pandora.com](https://pandora.com) account.\nSign-up is free with ad-supported streams.\n\nThis skill should work with Mycroft version 0.9.1 +", - "short_description": "", - "branch": "master", - "examples": [ - "Play Pandora.", - "Play Today's Hits Radio on Pandora.", - "Skip this song.", - "Next station.", - "Next song.", - "Pause Pandora.", - "Resume Pandora.", - "List my stations.", - "Next station.", - "Change station to Today's Top Hits on Pandora.", - "Play Pandora", - "Play Today's Hits Radio on Pandora", - "Skip this song", - "Next station", - "Next song", - "Pause Pandora", - "Resume Pandora", - "List my stations", - "Next station", - "Change station to Today's Top Hits on Pandora" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 11, - "credits": [ - "Mycroft AI" - ], - "requirements": { - "python": [ - "fuzzywuzzy==0.15.0" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Pianobar Skill", - "android_handler": "pianobar-skill.ethanaward.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-04-04T17:44:09Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-21T16:15:21Z", - "authorname": "MycroftAI", - "skillname": "Set alarms", - "foldername": "skill-alarm", - "name": "Set alarms", - "url": "https://github.com/MycroftAI/skill-alarm", - "category": "Daily", - "description": "Set a single use alarm, daily alarms, or weekly recurring alarms.\n\n You can choose from five different alarm sounds:\n * Constant Beep\n * Four rapid beeps\n * Escalating beeps\n * Alarm bell\n * Gentle chimes", - "short_description": "Set alarms with Mycroft", - "branch": "20.08", - "examples": [ - "Set an alarm for 9:30 am.", - "Set an alarm.", - "Set an alarm for weekdays at 7 in the morning.", - "Set an alarm for 9 pm July 14th.", - "Set an alarm for 8:00 am on Mondays.", - "Set an alarm for 8:00 am every Tuesday.", - "Set an alarm for 10:00 am on the weekends.", - "Are any alarms set?", - "Cancel my 10:00 am alarm.", - "Snooze for 30 minutes.", - "Set an alarm for 9:30 am", - "Set an alarm (Mycroft will prompt for more information)", - "Set an alarm for weekdays at 7 in the morning", - "Set an alarm for 9 pm July 14th", - "Set an alarm for 8:00 am on Mondays", - "Set an alarm for 8:00 am every Tuesday", - "Set an alarm for 10:00 am on the weekends", - "Cancel my 10:00 am alarm", - "Snooze for 30 minutes" - ], - "tags": [ - "alarm", - "Daily", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 5, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/clock.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Daily" - ], - "requirements": { - "python": [ - "pyalsaaudio" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Alarm Skill", - "android_handler": "skill-alarm.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-04-05T22:57:13Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-07T16:43:16Z", - "authorname": "MycroftAI", - "skillname": "Pairing", - "foldername": "skill-pairing", - "name": "Pairing", - "url": "https://github.com/MycroftAI/skill-pairing", - "category": "Configuration", - "description": "The default backend to provide services for Mycroft users is\n [Home](https://home.mycroft.ai/). Pairing a device with Home provides access\n to privacy-protecting Speech to Text, Wolfram Alpha and other such services,\n as well as easy configuration for all your Mycroft devices.", - "short_description": "Connect your device to the Mycroft server - [Home](https://home.mycroft.ai/)", - "branch": "20.08", - "examples": [ - "Pair my device.", - "Pair my device (happens automatically on first run if not paired already)" - ], - "tags": [ - "system", - "Configuration", - "connectivity", - "pairing", - "pair", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 3, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/handshake.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Pairing Skill", - "android_handler": "skill-pairing.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-04-04T17:47:30Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-16T05:34:15Z", - "authorname": "MycroftAI", - "skillname": "Latest news", - "foldername": "skill-npr-news", - "name": "Latest news", - "url": "https://github.com/MycroftAI/skill-npr-news", - "category": "Daily", - "description": "Play the latest news from an RSS audio feed. Your device location will be used to provide a local feed from your country if available. Otherwise, the National Public Radio (NPR)\nHourly News will be used. You can also choose your own default or add a custom audio feed at: [home.mycroft.ai](https://home.mycroft.ai/#/skill).\n\nSupported stations include:\nAssociated Press (AP) Hourly Radio News\n * [AU] ABC News Australia\n * [BE] VRT Nieuws\n * [CA] CBC News\n * [DE] DLF\n * [DE] WDR\n * [FI] YLE\n * [SE] Ekot\n * [UK] BBC News\n * [US] Fox News\n * [US] NPR News Now\n * [US] PBS NewsHour", - "short_description": "Listen to the latest news report from your favorite broadcast", - "branch": "20.08", - "examples": [ - "Play the news.", - "Play the BBC news.", - "Tell me the news.", - "What's the news?", - "Restart news.", - "Play the news", - "Play the BBC news", - "Tell me the news", - "Restart news" - ], - "tags": [ - "headlines", - "news", - "Information", - "Daily", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 6, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/newspaper.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Daily", - "Information" - ], - "requirements": { - "python": [ - "bs4==4.9.0", - "feedparser~=6.0.0" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Npr News Skill", - "android_handler": "skill-npr-news.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2016-11-21T09:24:07Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-11T04:56:33Z", - "authorname": "jamiehoward430", - "skillname": "MQTT for MycroftAI", - "foldername": "mycroft-mymqtt", - "name": "MQTT for MycroftAI", - "url": "https://github.com/jamiehoward430/mycroft-mymqtt", - "category": "IoT", - "description": "Currently it will publish the action to a topic built from the commands said, for example\nsay hey mycroft, turn the light on and mycroft will publish on to light/turn.\n * say hey mycroft, switch the tv on and mycroft will publish on to tv/switch.", - "short_description": "This is a skill written for mycroft to publish commands over an mqtt broker for home automation or any other purpose.", - "branch": "master", - "examples": [ - "Command vacuum to return home.", - "Turn the light on.", - "Switch the tv on." - ], - "tags": [ - "IoT", - "mqtt", - "no-license" - ], - "platforms": [ - "platform_picroft", - "platform_plasmoid" - ], - "stars": 12, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "@jamiehoward430" - ], - "categories": [ - "IoT" - ], - "requirements": { - "python": [ - "paho-mqtt" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Mymqtt Skill", - "android_handler": "mycroft-mymqtt.jamiehoward430.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-04-05T22:57:44Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-07T16:41:23Z", - "authorname": "MycroftAI", - "skillname": "Volume Control", - "foldername": "skill-volume", - "name": "Volume Control", - "url": "https://github.com/MycroftAI/skill-volume", - "category": "Configuration", - "description": "Control the volume of Mycroft with verbal commands or by spinning the physical\nbutton on a Mark 1.", - "short_description": "Control the volume of your system", - "branch": "20.08", - "examples": [ - "Turn up the volume.", - "Decrease the audio.", - "Mute audio.", - "Set volume to 5.", - "Set volume to 75 percent.", - "Turn up the volume", - "Decrease the audio", - "Mute audio", - "Set volume to 5", - "Set volume to 75 percent" - ], - "tags": [ - "sound", - "volume", - "system", - "Configuration", - "volume-control", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 5, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/volume-down.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [ - "pyalsaaudio" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Volume Skill", - "android_handler": "skill-volume.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-04-05T22:57:02Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-06T00:23:55Z", - "authorname": "MycroftAI", - "skillname": "Naptime", - "foldername": "skill-naptime", - "name": "Naptime", - "url": "https://github.com/MycroftAI/skill-naptime", - "category": "Daily", - "description": "Tell Mycroft to sleep when you don't want to be disturbed in any way.\nThis stops all calls to Speech to Text system, guaranteeing your voice won't\nbe sent anywhere on an accidental activation.\n\nWhen sleeping, Mycroft will only listen locally for the phrase \"Hey Mycroft,\nwake up\". Otherwise the system will be totally silent and won't bother you.\n\nOn a Mark 1 this also dims the eyes.", - "short_description": "Put Mycroft to sleep when you don't want to be disturbed", - "branch": "20.02", - "examples": [ - "Go to sleep.", - "Nap time.", - "Wake up.", - "Go to sleep", - "Nap time", - "Wake up" - ], - "tags": [ - "naptime", - "do-not-disturb", - "sleep", - "donotdisturb", - "Configuration", - "Daily", - "nap", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 3, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/bed.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Daily", - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Naptime Skill", - "android_handler": "skill-naptime.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-04-05T22:57:26Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-26T02:49:04Z", - "authorname": "MycroftAI", - "skillname": "Installer", - "foldername": "skill-installer", - "name": "Installer", - "url": "https://github.com/MycroftAI/skill-installer", - "category": "Configuration", - "description": "Add and remove Skills using your voice or from the [Marketplace](https://market.mycroft.ai).\nYou can also assist skill authors in testing new versions of their skills by\nusing \"install prevew version\" to gain access to skills still under development\nand testing. If you do this, please be consicious the skill may be in an\nunstable development state and report issues to the author appropriately.\n\nYou can also install Skills that are not officially released by entering the\nSkill's GitHub repository URL in the [Installer's web user interface](https://home.mycroft.ai/#/skill).\n\nSkills are ultimately installed using the [Mycroft Skill Manager (msm)](https://mycroft.ai/documentation/msm). If verbally installing, Mycroft will speak a list of possible matches for\nambiguous names -- just pick the skill you want from the list read to you.", - "short_description": "Add and remove Mycroft Skills", - "branch": "20.08", - "examples": [ - "Install coin flip.", - "Install the preview version of coin flip.", - "Uninstall coin flip.", - "Remove coin flip.", - "Download custom skill.", - "Install coin flip", - "Install the preview version of coin flip ", - "Uninstall coin flip", - "Remove coin flip", - "Download custom skill" - ], - "tags": [ - "msm", - "install", - "download", - "add-skill", - "system", - "Configuration", - "skill", - "skills", - "installer", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 6, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/download.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [ - "msm" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Installer Skill", - "android_handler": "skill-installer.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-04-04T17:48:40Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-07T16:46:32Z", - "authorname": "MycroftAI", - "skillname": "Speak", - "foldername": "skill-speak", - "name": "Speak", - "url": "https://github.com/MycroftAI/skill-speak", - "category": "Entertainment", - "description": "Turn Mycroft into a parrot. Speak a phrase and listen to it repeated in Mycroft's selected voice.", - "short_description": "Make Mycroft repeat whatever you want", - "branch": "20.08", - "examples": [ - "Say Goodnight, Gracie.", - "Repeat Once upon a midnight dreary, while I pondered, weak and weary, Over many a quaint and curious volume of forgotten lore.", - "Speak I can say anything you'd like!", - "say Goodnight, Gracie", - "repeat Once upon a midnight dreary, while I pondered, weak and weary, Over many a quaint and curious volume of forgotten lore", - "speak I can say anything you'd like!" - ], - "tags": [ - "system", - "Entertainment", - "speak", - "repeat", - "say", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 4, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/bullhorn.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Speak Skill", - "android_handler": "skill-speak.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-04-04T17:48:56Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-07T16:48:07Z", - "authorname": "MycroftAI", - "skillname": "Spelling", - "foldername": "skill-spelling", - "name": "Spelling", - "url": "https://github.com/MycroftAI/skill-spelling", - "category": "Information", - "description": "Mycroft can spell any word which is understood by speech-to-text. The proper spelling is pronounced on all platforms, as well as displayed by devices such as the Mark 1.", - "short_description": "Let Mycroft help you spell words", - "branch": "20.08", - "examples": [ - "How do you spell aardvark?", - "Spell succotash.", - "How do you spell bureacracy?", - "Spell omnipotence.", - "Spell succotash", - "Spell omnipotence" - ], - "tags": [ - "spelling", - "spell", - "Information", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 5, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/book-reader.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Information" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Spelling Skill", - "android_handler": "skill-spelling.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-04-26T16:23:59Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-06T00:22:44Z", - "authorname": "MycroftAI", - "skillname": "Singing", - "foldername": "skill-singing", - "name": "Singing", - "url": "https://github.com/MycroftAI/skill-singing", - "category": "Entertainment", - "description": "Mycroft will speak the lyrics to a random pop music song using text to speech.", - "short_description": "Mycroft sings lyrics to some popular songs", - "branch": "20.08", - "examples": [ - "Sing.", - "Sing" - ], - "tags": [ - "lyrics", - "music", - "sing", - "Entertainment", - "singing", - "song", - "texttospeech", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 5, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/laugh-beam.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Singing Skill", - "android_handler": "skill-singing.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-11-15T02:55:51Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-07T16:43:57Z", - "authorname": "MycroftAI", - "skillname": "Unknown Handler", - "foldername": "fallback-unknown", - "name": "Unknown Handler", - "url": "https://github.com/MycroftAI/fallback-unknown", - "category": "Configuration", - "description": "Mycroft doesn't know how to do or answer everything (yet). This _fallback_ is how Mycroft lets you know that, unfortunately, it can't help with what you said.\n\nBut wait, there is still hope! Mycroft is working to get smarter with help from friends. For who have selected to [Opt In to the Open Dataset](https://home.mycroft.ai/#/setting/basic#opendataset), these missed phrases are aggregated and analyzed to help identify what the world _wants_ their voice assistant to do that it can't yet. So if millions of people start asking for guava growing tips, we'll promote this as an idea to be handled as a default Skill.", - "short_description": "Capture unrecognized _Utterances_", - "branch": "20.08", - "examples": [ - "How do I make my guava blue?", - "I need a pizza.", - "Show me the money.", - "I need a pizza", - "Show me the money" - ], - "tags": [ - "Configuration", - "fallback", - "system", - "unknown", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 3, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/question.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Fallback Unknown Skill", - "android_handler": "fallback-unknown.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2016-12-02T04:46:29Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-07-18T20:25:27Z", - "authorname": "ChristopherRogers1991", - "skillname": "Mycroft Hue", - "foldername": "mycroft-hue", - "name": "Mycroft Hue", - "url": "https://github.com/ChristopherRogers1991/mycroft-hue", - "category": null, - "description": "Turn your Phillips Hue lights on/off, activate scenes, adjust brightness/color temperature, etc.", - "short_description": "", - "branch": "master", - "examples": [ - "Turn on my lights.", - "Set my lights to tropical twilight.", - "Turn the lights down.", - "Decrease the color temperature of the lights.", - "Turn on my lights", - "Set my lights to tropical twilight", - "Turn the lights down", - "Decrease the color temperature of the lights" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 10, - "credits": [ - "@ChristopherRogers1991", - "@WillJMurphy", - "@gras64", - "@VilterPD" - ], - "requirements": { - "python": [ - "phue==1.0" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Hue Skill", - "android_handler": "mycroft-hue.christopherrogers1991.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-11-24T04:26:15Z", - "archived": false, - "license": "unknown", - "modified": "2020-09-30T16:43:52Z", - "authorname": "normandmickey", - "skillname": "internet radio", - "foldername": "skill-internet-radio", - "name": "internet radio", - "url": "https://github.com/normandmickey/skill-internet-radio", - "category": null, - "description": "Play internet radio stations using Mycroft.\nManage your station URLs at home.mycroft.ai -> Skills.", - "short_description": "", - "branch": "master", - "examples": [ - "Internet radio.", - "Web radio.", - "Play some music.", - "Rock radio.", - "Play rock radio.", - "Listen to rock radio.", - "Country radio.", - "Play country radio.", - "Listen to country radio.", - "Classical radio.", - "Play classical radio.", - "Listen to classical radio.", - "Jazz radio.", - "Play jazz radio.", - "Listen to jazz radio.", - "Top 40 radio.", - "Play top 40 radio.", - "Listen to top 40 radio.", - "Christmas radio.", - "Play christmas radio.", - "Listen to christmas radio.", - "Favorite radio.", - "Play favorite radio.", - "Listen to favorite radio.", - "Psytube web radio.", - "Drum and bass web radio.", - "Techno radio.", - "Minimal techno radio.", - "Techno radio.", - "Play goa psy trance.", - "Listen to progressive psy trance.", - "internet radio", - "web radio", - "play some music", - "rock radio", - "play rock radio", - "listen to rock radio", - "country radio", - "play country radio", - "listen to country radio", - "classical radio", - "play classical radio", - "listen to classical radio", - "jazz radio", - "play jazz radio", - "listen to jazz radio", - "top 40 radio", - "play top 40 radio", - "listen to top 40 radio", - "christmas radio", - "play christmas radio", - "listen to christmas radio", - "favorite radio", - "play favorite radio", - "listen to favorite radio", - "psytube web radio", - "drum and bass web radio", - "techno radio", - "minimal techno radio", - "techno radio", - "play goa psy trance", - "listen to progressive psy trance" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 9, - "credits": [ - "Norman Moore" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Internet Radio Skill", - "android_handler": "skill-internet-radio.normandmickey.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-11-03T17:19:10Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-21T05:37:59Z", - "authorname": "MycroftAI", - "skillname": "Timer", - "foldername": "mycroft-timer", - "name": "Timer", - "url": "https://github.com/MycroftAI/mycroft-timer", - "category": "Daily", - "description": "Use Mycroft when your hands are messy or you need more that the one timer in your kitchen. Multiple timers are easy to set and track with conversational interactions.\n\nOn a Mark 1 you'll see visual feedback as the timer runs, and you can use\nthe top button to stop the beeping once a timer expires.", - "short_description": "Set named timers for cooking, watering plants, brewing tea and more.", - "branch": "20.08", - "examples": [ - "Start a timer for 30 seconds.", - "Set a timer for 1 minute.", - "Set a timer for 3 hours called turkey.", - "Start a timer.", - "Cancel the timer.", - "How long is left on the timer?", - "How long is left on the turkey timer?", - "Mute the timer.", - "Start a timer for 30 seconds", - "Set a timer for 1 minute", - "Set a timer for 3 hours called turkey", - "Start a timer (will be prompted)", - "Cancel the timer", - "Mute the timer (once triggered)" - ], - "tags": [ - "timer", - "Daily", - "kitchen-timer", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 5, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/stopwatch.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Daily" - ], - "requirements": { - "python": [ - "num2words" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Timer Skill", - "android_handler": "mycroft-timer.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-04-05T22:57:33Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-26T02:47:48Z", - "authorname": "MycroftAI", - "skillname": "System", - "foldername": "skill-stop", - "name": "System", - "url": "https://github.com/MycroftAI/skill-stop", - "category": "Configuration", - "description": "Provides verbal interfaces for basic framework interactions, such as the\n\"Stop\" command. Also provide interface to control physical Mycroft hardware.\n\nNOTE: This Skill is a little unusual in that it really doesn't do anything\ndirectly, rather it emits messages for the device creator to capture.", - "short_description": "General system control", - "branch": "20.08", - "examples": [ - "Stop.", - "Reboot.", - "Turn off.", - "Allow remote login.", - "Configure wifi.", - "Stop", - "Reboot", - "Turn off", - "Allow remote login", - "Configure wifi" - ], - "tags": [ - "Configuration", - "system", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 5, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/cog.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Stop Skill", - "android_handler": "skill-stop.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-03-11T12:49:46Z", - "archived": false, - "license": "mit", - "modified": "2019-12-26T14:50:33Z", - "authorname": "treussart", - "skillname": "", - "foldername": "domoticz_skill", - "name": "", - "url": "https://github.com/treussart/domoticz_skill", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 8, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Domoticz_Skill Skill", - "android_handler": "domoticz_skill.treussart.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-04-04T17:44:41Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-26T07:05:14Z", - "authorname": "MycroftAI", - "skillname": "Audio Recorder", - "foldername": "skill-audio-record", - "name": "Audio Recorder", - "url": "https://github.com/MycroftAI/skill-audio-record", - "category": "Configuration", - "description": "This Skill records audio from the microphone and allows you to play back that recording. This Skill is particularly useful when trying to diagnose microphone issues, because it allows you to \"hear\" what Mycroft is hearing.", - "short_description": "Record and playback audio", - "branch": "20.08", - "examples": [ - "Start recording.", - "Start recording for 40 minutes.", - "Play the recording.", - "Erase recording.", - "Start recording", - "Start recording for 40 minutes", - "Play the recording", - "Erase recording" - ], - "tags": [ - "audio", - "microphone", - "Configuration", - "configuration", - "record", - "record-audio", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 5, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/microphone.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [ - "psutil>=5.2.1" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Audio Record Skill", - "android_handler": "skill-audio-record.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-04-04T17:50:02Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-26T02:43:37Z", - "authorname": "MycroftAI", - "skillname": "Wikipedia", - "foldername": "skill-wiki", - "name": "Wikipedia", - "url": "https://github.com/MycroftAI/skill-wiki", - "category": "Information", - "description": "Query [Wikipedia](https://www.wikipedia.org) for answers to all your questions. Get just a summary, or ask for more to get in-depth information.\n \n This Skill uses the [Wikimedia API](https://en.wikipedia.org/w/api.php).", - "short_description": "Wikipedia", - "branch": "20.08", - "examples": [ - "Tell me about Elon Musk.", - "Tell me about beans.", - "Tell me something random.", - "Check Wikipedia for beans.", - "Tell me about the Pembroke Welsh Corgi.", - "Search for chocolate.", - "More information.", - "Tell me More.", - "Tell me about Elon Musk", - "Tell me about beans", - "Tell me something random", - "Check Wikipedia for beans", - "Tell me about the Pembroke Welsh Corgi", - "Search for chocolate", - "More information (followup after an initial summary)", - "Tell me More (followup after an initial summary)" - ], - "tags": [ - "wiki", - "query", - "wikipedia", - "encyclopedia", - "Information", - "general-knowledge", - "question", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 12, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/brands/wikipedia-w.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Information" - ], - "requirements": { - "python": [ - "wikipedia==1.4.0" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Wiki Skill", - "android_handler": "skill-wiki.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-08-01T15:33:43Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-07T16:50:02Z", - "authorname": "MycroftAI", - "skillname": "Wolfram Alpha", - "foldername": "fallback-wolfram-alpha", - "name": "Wolfram Alpha", - "url": "https://github.com/MycroftAI/fallback-wolfram-alpha", - "category": "Information", - "description": "Ask general-knowledge queries of your Mycroft device. If no other Skills can handle the _Intent_, [Wolfram Alpha](https://wolframalpha.com) will be queried\nto see if it can find an answer. You'll be surprised by how much it knows!\n\nFor deeper exploration, you can also request the sources behind the answer. An email will be sent to your registered account linking you to all the details within Wolfram Alpha's website.", - "short_description": "Use Wolfram Alpha for general knowledge questions", - "branch": "20.08", - "examples": [ - "How tall is Mount Everest?", - "When was The Rocky Horror Picture Show released?", - "What is Madonna's real name?", - "What's 18 times 4?", - "How many inches in a meter?", - "Send me the source on that.", - "Send me the source on that" - ], - "tags": [ - "information", - "query", - "Information", - "general-knowledge", - "fallback", - "wolfram-alpha", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 7, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/question.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Information" - ], - "requirements": { - "python": [ - "wolframalpha==3.0", - "mtranslate", - "requests>=2.13.0" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Fallback Wolfram Alpha Skill", - "android_handler": "fallback-wolfram-alpha.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-11-26T15:48:44Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-05-10T00:51:51Z", - "authorname": "CarstenAgerskov", - "skillname": "The Cows Lists", - "foldername": "skill-the-cows-lists", - "name": "The Cows Lists", - "url": "https://github.com/CarstenAgerskov/skill-the-cows-lists", - "category": null, - "description": "This skill adds [Remember The Milk](https://www.rememberthemilk.com/) support to [Mycroft](https://mycroft.ai/).\nThe skill use Remember The Milk's [rest interface](https://www.rememberthemilk.com/services/api/).\nThe purpose if the skill is to allow operations suited for a voice interface. It is not an attempt to cover all functionality of remember the milk.\n\nAn authentication flow must be executed before other operations can be\ndone, see section [Configuration](##Configuration)\nSome advice on installation can be found in section [Installation](##Installation)\n\n### The dialog\nThe cows lists work with lists and tasks. When you mention a list or a task in a command to the cows lists,\nit will be remenbered for a short time (2 minutes). The task or list is said to be in context. Whthin this time, further commands to the cows list will refer to the list and/or task in context.\nFor instance:\n\n* You: \"Hey Mycroft, find bananas on the grocery list\"\n* Mycroft: \"I found bananas on list grocery\"\n* You: \"Hey Mycroft, complete it\"\n* Mycroft: \"bananas on list grocery was marked complete\"\n* You: \"Hey Mycroft, read the list\"\n* Mycroft: \"List grocery has 3 tasks on it, potatos, apples, oranges\"\n* You: \"Hey Mycroft, complete oranges\"\n* Mycroft: \"oranges on list grocery was marked complete\"\n\nSome commands support special dialogs. For instance\n* You: \"Hey Mycroft, add bananas to the grocery list\"\n* Mycroft: \"bananas was added to list grocery\"\n* You: \"Hey Mycroft, add oranges\"\n* Mycroft: \"oranges, anything else?\"\n* You: \"appels\"\n* Mycroft: \"apples, anything else?\"\n* You: \"potatos\"\n* Mycroft: \"potatos, anything else?\"\n* You: \"no\"\n* Mycroft: \"okay, the tasks are added to list grocery\"\n\nThe skill will try to recognize mispronounced list or task names, for example:\n* You: \"Hey Mycroft, find call back on my bin box list\"\n* Mycroft: \"I can't find a list called bin box, do you want to use the list inbox instead?\"\n* You: \"yes\"\n* Mycroft: \"I did not find call back, but i did find call home on list inbox\"\n\n\n#### Commands\nThis section lists all available commands.\n\nIn general, for all operations below, you can substitute \"my\" list with \"the\" list, i.e. \"add milk to the grocery list\" and \"add milk to my grocery list\" are both valid.\n\nBe careful about using the word 'list' when you name the lists in Remember The Milk. For instance, the skill can handle a list called 'grocery' OR a list called 'grocery list', but if you have BOTH, the skill will only find the 'grocery list'.\n\n#### Add a task\nFor example:\n* \"Hey Mycroft, add milk to my grocery list\"\n* \"Hey Mycroft, add remember to call home to list Inbox\"\n\nThe skill is using Remember The Milk [\"smart add\"](https://www.rememberthemilk.com/help/?ctx=basics.smartadd.whatis.) For example:\n\n* \"Hey Mycroft, add remember to call home tomorrow at 9 to list Inbox\"\n\nwill add a task called \"remember to call home\" to the Remember The Milk's Inbox, and set the due date to tomorrow at 9. See also the due command later in this section.\n\n#### Complete task\nComplete a task on a list, the operation can be undone within 2 minutes:\n* You: \"Hey Mycroft, complete call home on my personal list\"\n* Mycroft: \"Call home on list personal was marked complete\"\n* You: \"Hey Mycroft, restore\"\n* Mycroft: \"I have restored call home on list personal again\"\n\n#### Complete all tasks on a list\nComplete all tasks on a list, this operation may take a while if there are many tasks. The operation can be undone within 2 minutes:\n* You: \"Hey Mycroft, complete all tasks on my grocery list\"\n* Mycroft: \"3 tasks on list grocery was marked complete\"\n* You: \"Hey Mycroft, restore\"\n* Mycroft: \"I have restored 3 tasks on list grocery again\"\n\nTo keep processing time down, a maximum of 40 tasks can be deleted for each complete list command. The\nRTM api has a rate limit of 1 call per second, 40 tasks will take approximately 40 seconds to complete.\nIf you use the Mycroft \"stop\" command during processing, it may not be possible to undo the operation.\n\n#### Due tasks\nFind out what tasks are due. Due date can be one of: \"now, yesterday, today, tomorrow, monday, tuesday, wedensday, thursday, friday, saturday, sunday\"\n\n* You: \"Hey Mycroft, what is on my inbox list today\"\n* Mycroft: \"List inbox has 2 tasks on it, call home, go fishing\"\n\n* You: \"Hey Mycroft, add go fishing today to the inbox list\"\n* Mycroft: \"go fishing today was added to list inbox\"\n* You: \"Hey Mycroft, what is due today\"\n* Mycroft: \"List inbox has 1 task on it, that are due today, go fishing\"\n\n#### Find task on list\nFind a task on a list:\n* You: \"Hey Mycroft, find milk on my grocery list\"\n* Mycroft: \"I found milk on list grocery\"\n\n#### Read list\nRead the tasks on a list:\n* You: \"Hey Mycroft, read list inbox\"\n* Mycroft: \"List inbox has 2 tasks on it, call home, go fishing\"\n\n#### Undo\nIf an operation makes changes to your lists or tasks, it can be undone within 2 minutes, for example:\n\n* You: \"Hey Mycroft, add call home to list inbox\"\n* Mycroft: \"call home was added to list inbox\"\n* You: \"Hey Mycroft, undo\"\n* Mycroft: \"I have removed call home from list inbox again\"\n\nThe words \"undo\", \"revert\", \"roll back\" and \"restore\" can be used\n\n#### Report an error\nIn case of a technical error, the cows lists will ask you if you want a mail with the details. Answer yes, and you will receive a mail from Mycroft with further details on how to report the issue, and all the details about the error.\nYou receive the mail, it is not sent the skill developer. The mail contains detalis about how to report the error to the skill developer,\nand you decide what information to put in the issue report.\n\nOther issues that are not caught as describe above, can be reported as well, on https://github.com/CarstenAgerskov/skill-the-cows-lists/issues.", - "short_description": "", - "branch": "master", - "examples": [ - "Add milk to my grocery list.", - "Add remember to call home tomorrow at 9 to list Inbox.", - "Hey Mycroft, add milk to my grocery list", - "Hey Mycroft, add remember to call home tomorrow at 9 to list Inbox" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 14, - "credits": [ - "Carsten Agerskov (https://github.com/CarstenAgerskov)" - ], - "requirements": { - "python": [ - "fuzzywuzzy", - "python-Levenshtein" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "The Cows Lists Skill", - "android_handler": "skill-the-cows-lists.carstenagerskov.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-01-02T20:56:57Z", - "archived": false, - "license": "unknown", - "modified": "2020-01-23T20:59:41Z", - "authorname": "jcasoft", - "skillname": "", - "foldername": "GoogleCalendarSkill", - "name": "", - "url": "https://github.com/jcasoft/GoogleCalendarSkill", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 9, - "requirements": { - "python": [ - "oauth2client==3.0.0", - "httplib2", - "apiclient ", - "tzlocal", - "google-api-python-client " - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Googlecalendarskill Skill", - "android_handler": "GoogleCalendarSkill.jcasoft.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-08-09T13:10:38Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-03-01T14:05:27Z", - "authorname": "forslund", - "skillname": "AIML Chatbot", - "foldername": "fallback-aiml", - "name": "AIML Chatbot", - "url": "https://github.com/forslund/fallback-aiml", - "category": "Entertainment", - "description": "The fallback leverages the [Alice chatbot](https://www.chatbots.org/chatbot/a.l.i.c.e/) to create some fun interactions. Phrases not explicitly handled by other skills will be run by the chatbot, so nearly every interaction will have _some_ response. But be warned, Mycroft might become a bit obnoxious...\n\nThe AIML takes up a considerable amount of memory so the skill is disabled by default. To enable go to Skillsettings under home.mycroft.ai\n\nThis is based on the original work of [JarbasAI](https://github.com/JarbasAI) with updates from all over the Mycroft community.", - "short_description": "Give Mycroft some sass with AIML!", - "branch": "19.08", - "examples": [ - "Do you like ice cream.", - "Do you like dogs.", - "I have a jump rope.", - "Do you like ice cream", - "Do you like dogs", - "I have a jump rope" - ], - "tags": [ - "aiml", - "Entertainment", - "chatbot", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 7, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "@jarbasal\n@nielstron\n@EazyAlvaro\n@forslund" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [ - "aiml" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Fallback Aiml Skill", - "android_handler": "fallback-aiml.forslund.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-04-05T22:56:14Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-21T16:28:18Z", - "authorname": "MycroftAI", - "skillname": "Device Configuration", - "foldername": "skill-configuration", - "name": "Device Configuration", - "url": "https://github.com/MycroftAI/skill-configuration", - "category": "Configuration", - "description": "User and device settings from [home.mycroft.ai](https://home.mycroft.ai) are\nsynchronized with your Devices. This Skill performs that synchronization and\nallows you to check your settings.\n\nYou can also change the technology used to perform Wake Word spotting. This is\nthe system that wakes the device up when you say \"Hey Mycroft\".", - "short_description": "Synchronize your Device Settings with [Home](https://home.mycroft.ai).", - "branch": "20.08", - "examples": [ - "Configuration update.", - "Update config.", - "What's your location?", - "What's your name?", - "What's the current Listener?", - "Set the Listener to Precise.", - "Set the Listener to default.", - "Configuration update", - "Update config", - "What's the current Listener? (for advanced debugging)", - "Set the Listener to Precise (for advanced debugging)", - "Set the Listener to default (for advanced debugging)" - ], - "tags": [ - "update-config", - "system", - "Configuration", - "config", - "configuration", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 3, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/cogs.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [ - "requests>=2.13.0", - "humanhash3" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Configuration Skill", - "android_handler": "skill-configuration.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-04-04T17:45:00Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-26T02:39:52Z", - "authorname": "MycroftAI", - "skillname": "Date and Time", - "foldername": "skill-date-time", - "name": "Date and Time", - "url": "https://github.com/MycroftAI/skill-date-time", - "category": "Daily", - "description": "Get the local time or time for major cities around the world. Times\nare given in 12-hour (2:30 pm) or 24-hour format (14:30) based on the\nTime Format setting at [Home](https://home.mycroft.ai/#/setting/basic)\n\nTime can optionally be shown on a display, like a digital clock. See\nthe [Skill Setting](https://home.mycroft.ai/#/skill).", - "short_description": "Get the time, date, day of the week", - "branch": "20.08", - "examples": [ - "What time is it?", - "What time is it in Paris?", - "Show me the time.", - "What's the date?", - "Tell me the day of the week.", - "What day is Memorial Day 2020?", - "Show me the time", - "Tell me the day of the week" - ], - "tags": [ - "time", - "clock", - "world-time", - "date-time", - "Daily", - "world-clock", - "date", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 4, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/calendar.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Daily" - ], - "requirements": { - "python": [ - "holidays", - "timezonefinder", - "pytz==2017.2", - "geocoder", - "tzlocal==1.3" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Date Time Skill", - "android_handler": "skill-date-time.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-04-04T17:49:31Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-06T00:20:43Z", - "authorname": "MycroftAI", - "skillname": "Stock Prices", - "foldername": "skill-stock", - "name": "Stock Prices", - "url": "https://github.com/MycroftAI/skill-stock", - "category": "Information", - "description": "Using the [Financial Modeling Prep](https://financialmodelingprep.com/developer/docs/) API, you can ask Mycroft to get the current price of stocks.", - "short_description": "Provides current stock prices", - "branch": "20.08", - "examples": [ - "Stock price of Google.", - "Trading at Google.", - "Stock price of Google", - "Trading at Google" - ], - "tags": [ - "financial", - "stock-market", - "Information", - "stocks", - "stock-prices", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 3, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/money-check-alt.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Information" - ], - "requirements": { - "python": [ - "requests>=2.13.0" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Stock Skill", - "android_handler": "skill-stock.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-12-04T17:41:52Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-26T07:06:45Z", - "authorname": "MycroftAI", - "skillname": "Mycroft Mark 1", - "foldername": "mycroft-mark-1", - "name": "Mycroft Mark 1", - "url": "https://github.com/MycroftAI/mycroft-mark-1", - "category": "Configuration", - "description": "The Mycroft Mark 1 has several unique capabilities which this Skill lets you control.\n\n### Eye Color\nThe Mark 1 has beautiful eyes -- and you get to pick their color! Set them to\na named color (\"blue\", \"magenta\", \"teal\", etc) or any color using RGB values.\nPleas see the [color](https://github.com/MycroftAI/mycroft-mark-1/blob/dev/dialog/en-us/colors.value)\nlist for more options\n\n### Faceplate Brightness\nSet the faceplate to a specific brightness, or allow it to automatically adjust\nits brightness level to dim at night.", - "short_description": "Customize your Mark 1", - "branch": "20.08", - "examples": [ - "Set your eye color to pink.", - "Change your eye color to the default.", - "Set a custom eye color.", - "Turn on auto brightness.", - "Change to low brightness.", - "Dim to 50%", - "Set your eye color to pink", - "Change your eye color to the default", - "Set a custom eye color (you'll be prompted for values)", - "Turn on auto brightness", - "Change to low brightness" - ], - "tags": [ - "mark1", - "settings", - "system", - "Configuration", - "configuration", - "no-license" - ], - "platforms": [ - "platform_mark1" - ], - "stars": 3, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/cog.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [ - "arrow==0.12.0", - "astral==1.4" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Mark 1 Skill", - "android_handler": "mycroft-mark-1.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-04-04T17:46:27Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-06T00:34:50Z", - "authorname": "MycroftAI", - "skillname": "Jokes", - "foldername": "skill-joke", - "name": "Jokes", - "url": "https://github.com/MycroftAI/skill-joke", - "category": "Entertainment", - "description": "Brighten your day with a little humor. This draws on the jokes collected by the [PyJokes project](https://github.com/pyjokes/pyjokes) to give you a chuckle.\n \n The joke categories are:\n * Neutral -- jokes that are safe for work, kids or your grandmother\n * Chuck Norris -- jokes only a geek can love\n \n _WARNING: Laughter is not guaranteed, but eye rolls are likely._", - "short_description": "Let Mycroft brighten your day with a little humor", - "branch": "20.08", - "examples": [ - "Make me laugh.", - "Tell me a joke.", - "Tell me a Chuck Norris joke.", - "How about a neutral joke.", - "Make me laugh", - "Tell me a joke", - "Tell me a Chuck Norris joke", - "How about a neutral joke" - ], - "tags": [ - "humour", - "joke", - "Entertainment", - "funny", - "humor", - "jokes", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 3, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/laugh.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [ - "pyjokes==0.6.0" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Joke Skill", - "android_handler": "skill-joke.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-01-26T06:49:16Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-09-14T16:47:51Z", - "authorname": "forslund", - "skillname": "Usage", - "foldername": "cmd_skill", - "name": "Usage", - "url": "https://github.com/forslund/cmd_skill", - "category": null, - "description": "This is a very old skill so it uses the now depricated skill config in mycroft.conf.\nThe skill can be configured to run scripts from easily pronouncable human utterances, such as \"generate report\" by adding the following to the `~/.mycroft/mycroft.conf`\n\n```json\n\"CmdSkill\": {\n\"alias\": {\n\"generate report\": \"/home/forslund/scripts/generate_report.sh\"\n}\n}\n```\n\n(The config needs to be valid json so be careful). The config usually contains a\n\nThe configuration above will launch `/home/forslund/scripts/generate_report.sh` when the second utterance under usage is invoked.", - "short_description": "", - "branch": "master", - "examples": [ - "Launch command echo TEST*", - "", - "Run script generate report*", - "" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 8, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Cmd_Skill Skill", - "android_handler": "cmd_skill.forslund.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-07-11T20:08:03Z", - "archived": false, - "license": "unknown", - "modified": "2020-04-08T15:11:15Z", - "authorname": "eClarity", - "skillname": "Mycroft AI Chromecast Skill - WIP", - "foldername": "skill-chromecast", - "name": "Mycroft AI Chromecast Skill - WIP", - "url": "https://github.com/eClarity/skill-chromecast", - "category": null, - "description": "A skill to connect with and control a chromecast device connected to the same local network as Mycroft.\n\nThis skill is a work in progress and should be considered pre-alpha. The play media feature is currently hardcoded for testing purposes since it requires a URL.", - "short_description": "A skill to connect with and control a chromecast device connected to the same local network as Mycroft.", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 8, - "requirements": { - "python": [ - "pychromecast" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Chromecast Skill", - "android_handler": "skill-chromecast.eclarity.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-12-13T06:06:46Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-26T02:44:20Z", - "authorname": "MycroftAI", - "skillname": "Support", - "foldername": "skill-support", - "name": "Support", - "url": "https://github.com/MycroftAI/skill-support", - "category": "Configuration", - "description": "This Skill generates a package with debugging information and emails it to the email address registered in your [home.mycroft.ai](https://home.mycroft.ai) account. This package can be used for debugging issues yourself, or alternatively it can be emailed to Mycroft to create a support request. \n\nThe package contains all of your `mycroft-core` logs on the Device, and information about active Skills and Intents at the time the support request was generated. \n\nThis uses the [0x0.st](https://0x0.st/) service for storing the debugging information.", - "short_description": "Capture information for Mycroft support", - "branch": "20.08", - "examples": [ - "Create a support ticket.", - "You're not working!", - "Send me debug info.", - "Create a support ticket", - "Send me debug info" - ], - "tags": [ - "support-request", - "assistance", - "help", - "system", - "Configuration", - "support", - "troubleshooting", - "logs", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "icon": "https://rawgit.com/FortAwesome/Font-Awesome/master/svgs/solid/life-ring.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [ - "pyopenssl" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Support Skill", - "android_handler": "skill-support.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-10-05T19:02:46Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-06T00:21:49Z", - "authorname": "MycroftAI", - "skillname": "Version Checker", - "foldername": "skill-version-checker", - "name": "Version Checker", - "url": "https://github.com/MycroftAI/skill-version-checker", - "category": "Configuration", - "description": "Report the version of your Mycroft install (`mycroft-core`) and of the platform you are running on - ie \n> Mycroft Mark 1, version 18.2.13 beta", - "short_description": "Report the version of your Mycroft", - "branch": "20.08", - "examples": [ - "Check version.", - "What version are you running?", - "What's your platform build?", - "Check version", - "What's your platform build? " - ], - "tags": [ - "versioning", - "platform", - "system", - "Configuration", - "build", - "version", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/code-branch.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Version Checker Skill", - "android_handler": "skill-version-checker.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-01-18T14:58:04Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-10-23T09:16:47Z", - "authorname": "AIIX", - "skillname": "Krunner Search", - "foldername": "krunner-search-skill", - "name": "Krunner Search", - "url": "https://github.com/AIIX/krunner-search-skill", - "category": "Productivity", - "description": "Search for files, images, music, documents locally using the powerful Krunner Plasma desktop feature, also see your recent documents or files and user other plugins like calculate etc", - "short_description": "Krunner enables users to search their local desktop for files, images, recent documents, bookmarks and utilize other krunner plugins.", - "branch": "master", - "examples": [ - "Search this computer for 'Filename/Application.", - "Display recent documents.", - "Search the computer for bookmarks.", - "Calculate 2 plus 2.", - "Hey Mycroft, search this computer for 'Filename/Application' ", - "Hey Mycroft, display recent documents", - "Hey Mycroft, search the computer for bookmarks", - "Hey Mycroft, calculate 2 plus 2" - ], - "tags": [ - "plasma", - "search", - "krunner", - "desktop", - "documents", - "kde", - "Productivity", - "recent", - "control", - "bookmarks", - "no-license" - ], - "platforms": [ - "platform_plasmoid" - ], - "stars": 9, - "icon": "https://rawgithub.com/FortAwesome/Font-Awesome/master/advanced-options/raw-svg/solid/search.svg", - "credits": [ - "Aditya Mehra (@AIIX)" - ], - "categories": [ - "Productivity" - ], - "requirements": { - "python": [ - "dbus-python" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Krunner Search Skill", - "android_handler": "krunner-search-skill.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-06-28T03:11:46Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-08-25T08:44:14Z", - "authorname": "eClarity", - "skillname": "skill-autogui", - "foldername": "skill-autogui", - "name": "skill-autogui", - "url": "https://github.com/eClarity/skill-autogui", - "category": null, - "description": "A Mycroft AI skill to enable keyboard and mouse manipulation via voice command using Autogui", - "short_description": "A Mycroft AI skill to enable keyboard and mouse manipulation via voice command using Autogui", - "branch": "master", - "examples": [ - "Type Mycroft is awesome.", - "Press enter.", - "Scroll up 10 clicks.", - "Scroll down 10 clicks.", - "Scroll right 10 clicks - Linux only.", - "Hold down key.", - "Release down key.", - "Screen resolution.", - "type Mycroft is awesome", - "press enter", - "scroll up 10 clicks", - "scroll down 10 clicks", - "scroll right 10 clicks - Linux only", - "hold down key", - "release down key", - "screen resolution" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 9, - "requirements": { - "python": [ - "pyautogui", - "python-xlib", - "num2words" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Autogui Skill", - "android_handler": "skill-autogui.eclarity.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2016-10-28T05:52:28Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-01-19T08:24:16Z", - "authorname": "forslund", - "skillname": "", - "foldername": "mopidy_skill", - "name": "", - "url": "https://github.com/forslund/mopidy_skill", - "category": "Music", - "description": "Mopidy is an extensible stand alone music server handling music libraries and remote services alike. This skill interfaces with the server through the REST api.\n\n### Mycroft Setup\n\nMycroft needs to be pointed to the mopidy server, this is easily done using the skill settings page on Mycroft-Home. By default it will try to connect to a mopidy server on localhost.\n\n### Mopidy Setup\n\nI recommend using the official [mopidy install guide](https://docs.mopidy.com/en/latest/installation/) to get the software for your specific system.\n\nIn addition to the base installation of mopidy the skill REQUIRES the local-mysql plugin to fetch the metadata from the local library and should be able to use the data from the `mopidy-gmusic` plugin.\n\nMopidy configuration is complex and this description will only touch the areas that are relevant for the skill. Mopidy settings are made in *~/.config/mopidy/mopidy.conf* for a desktop install and under */etc/mopidy/mopidy.conf* for picroft/Mark-1 (if it doesn't exist it needs to be created).\n\nThis readme only covers the basics, for more details check out the official documentation at https://www.mopidy.com\n\n#### Local music\n\nFor playing music from the local file system or file share check under the heading\n\n` [local] `\n\nand make sure the following config options are set according to your system\n\n```\nenabled = true\nlibrary = sqlite\nmedia_dir = PATH_TO_YOUR_MUSIC\n```\n\nafter this is done scan the local collection by running\n\n` mopidy local scan `", - "short_description": "Play music via your Mopidy Server", - "branch": "master", - "examples": [ - "Play Armikrog OST.", - "Play something by Terry Scott Taylor.", - "Play rock music.", - "play Armikrog OST", - "play something by Terry Scott Taylor", - "play rock music" - ], - "tags": [ - "music", - "Music", - "mopidy", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 13, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/music.svg", - "credits": [ - "@forslund" - ], - "categories": [ - "Music" - ], - "requirements": { - "python": [ - "fuzzywuzzy", - "python-levenshtein" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mopidy_Skill Skill", - "android_handler": "mopidy_skill.forslund.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-04-04T17:45:25Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-06T00:36:58Z", - "authorname": "MycroftAI", - "skillname": "Desktop Launcher", - "foldername": "skill-desktop-launcher", - "name": "Desktop Launcher", - "url": "https://github.com/MycroftAI/skill-desktop-launcher", - "category": "Productivity", - "description": "Launch applications on the Linux desktop, and close them when done.", - "short_description": "Desktop Launcher", - "branch": "19.08", - "examples": [ - "Open Firefox.", - "Search Mycroft in Amazon.", - "Close Firefox.", - "Open Firefox", - "Search Mycroft in Amazon", - "Close Firefox" - ], - "tags": [ - "Productivity", - "desktop-launch", - "desktop-launcher", - "desktop", - "no-license" - ], - "platforms": [ - "platform_plasmoid" - ], - "stars": 6, - "icon": "https://rawgithub.com/FortAwesome/Font-Awesome/master/svgs/solid/spinner.svg", - "credits": [ - "" - ], - "categories": [ - "Productivity" - ], - "requirements": { - "python": [ - "pygobject" - ], - "system": { - "apt-get": "libcairo-dev" - }, - "skill": [] - }, - "android": { - "android_icon": null, - "android_name": "Desktop Launcher Skill", - "android_handler": "skill-desktop-launcher.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-04-04T17:48:05Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-07T16:45:30Z", - "authorname": "MycroftAI", - "skillname": "Set reminders", - "foldername": "skill-reminder", - "name": "Set reminders", - "url": "https://github.com/MycroftAI/skill-reminder", - "category": "Daily", - "description": "Flexible reminder Skill, allowing you to set single and repeating reminders for tasks. The reminders are set on the Device, and have no external dependencies.", - "short_description": "Set single and repeating reminders for tasks", - "branch": "20.08", - "examples": [ - "Set a reminder every day to take my vitamin pill.", - "Remind me to put the garbage out at 8pm.", - "Remind me to walk the dog in an hour.", - "Set a reminder every Friday at 2pm.", - "Remind me to stretch in 10 minutes.", - "Set a reminder every day to take my vitamin pill", - "Remind me to put the garbage out at 8pm", - "Remind me to walk the dog in an hour", - "Set a reminder every Friday at 2pm", - "Remind me to stretch in 10 minutes" - ], - "tags": [ - "reminder", - "Daily", - "reminders", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 8, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/bell.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Daily" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Reminder Skill", - "android_handler": "skill-reminder.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-08-03T22:32:49Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-09-03T05:33:06Z", - "authorname": "MycroftAI", - "skillname": "Release Test", - "foldername": "skill-release-test", - "name": "Release Test", - "url": "https://github.com/MycroftAI/skill-release-test", - "category": "Configuration", - "description": "When a new release is being tested, this skill is installed to verify the\ninstallation mechanism functions properly. Additionally, the following line\nis edited to verify that the skill update process occurs as intended.\n\nTest line: 2018/10/23 23:14", - "short_description": "Tool used by Mycroft internal Quality Assurance team when validating a new `mycroft-core` release", - "branch": "20.08", - "examples": [ - "Run the release test (should respond with 'Test passed')", - "Release test.", - "Release test" - ], - "tags": [ - "testing", - "qa", - "Configuration", - "release", - "ci", - "quality-assurance", - "cd", - "release-test", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 4, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/check-double.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Release Test Skill", - "android_handler": "skill-release-test.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-04-04T17:46:10Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-06T00:25:53Z", - "authorname": "MycroftAI", - "skillname": "Device IP Address", - "foldername": "skill-ip", - "name": "Device IP Address", - "url": "https://github.com/MycroftAI/skill-ip", - "category": "Configuration", - "description": "Retrieve the [IP address](https://en.wikipedia.org/wiki/IP_address), also known as the \"network address\" of the Device and respond verbally to the user, and if the Device supports it, display the IP address.", - "short_description": "Network connection information", - "branch": "20.08", - "examples": [ - "What's your network address?", - "What's your IP address?", - "Tell me your IP address.", - "Tell me your network address.", - "What network are you connected to?", - "Tell me your IP address", - "Tell me your network address" - ], - "tags": [ - "network", - "network-address", - "system", - "Configuration", - "IPaddress", - "IP-address", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 4, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/info-circle.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [ - "ifaddr" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Ip Skill", - "android_handler": "skill-ip.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2016-06-25T19:32:16Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-06-23T12:44:25Z", - "authorname": "Cadair", - "skillname": "Kodi Skill for Mycroft AI", - "foldername": "mycroft-kodi", - "name": "Kodi Skill for Mycroft AI", - "url": "https://github.com/Cadair/mycroft-kodi", - "category": null, - "description": "This is an attempt to create a skill for the new [MycroftAI](https://mycroft.ai) which can search for, play and control Kodi instances via Kodi's JSON-RPC API.\n\nThis uses [kodipydent](https://github.com/haikuginger/kodipydent) to interface with the Kodi JSON-RPC interface.", - "short_description": "This is an attempt to create a skill for the new [MycroftAI](https://mycroft.ai) which can search for, play and control Kodi instances via Kodi's JSON-RPC API.", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 17, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Kodi Skill", - "android_handler": "mycroft-kodi.cadair.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-10-04T01:13:51Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-07T16:47:11Z", - "authorname": "MycroftAI", - "skillname": "DuckDuckGo", - "foldername": "fallback-duckduckgo", - "name": "DuckDuckGo", - "url": "https://github.com/MycroftAI/fallback-duckduckgo", - "category": "Information", - "description": "Query DuckDuckGo as a fallback when no other Skill can answer the question.\n\nUses the [DuckDuckGo API](https://duckduckgo.com/api) to provide information.", - "short_description": "Use DuckDuckGo to answer questions", - "branch": "20.08", - "examples": [ - "Who is George Washington?", - "What is plasma?", - "Who's Madonna?" - ], - "tags": [ - "searchengine", - "duckduckgo", - "query", - "Information", - "fallback", - "search-engine", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 5, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/search.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Information" - ], - "requirements": { - "python": [ - "ddg3" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Fallback Duckduckgo Skill", - "android_handler": "fallback-duckduckgo.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-03-28T05:17:09Z", - "archived": false, - "license": "mit", - "modified": "2020-02-03T10:12:58Z", - "authorname": "trungdn", - "skillname": "MusicSkill", - "foldername": "mycroft-music-skill", - "name": "MusicSkill", - "url": "https://github.com/trungdn/mycroft-music-skill", - "category": null, - "description": "This skill illustrates a very simple general music player. It works by downloading\nmusic files from youtube (1st result, can be tunned) and playing with Cvlc\n\nIts intended to be a cheap way to play anything without any account (eg. spotify) or having a music library on disk", - "short_description": "This skill illustrates a very simple general music player. It works by downloading", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Music Skill", - "android_handler": "mycroft-music-skill.trungdn.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2016-05-30T05:21:23Z", - "archived": false, - "license": "isc", - "modified": "2018-07-07T19:26:24Z", - "authorname": "k3yb0ardn1nja", - "skillname": "Kodi Remote Control Skill for Mycroft", - "foldername": "mycroft-skill-kodi", - "name": "Kodi Remote Control Skill for Mycroft", - "url": "https://github.com/k3yb0ardn1nja/mycroft-skill-kodi", - "category": null, - "description": "Mycroft skill to provide integration to Kodi (XBMC). Enables\nthe user to Play or Pause the currently playing video via voice\ncommands made to mycroft.", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 7, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Kodi Skill", - "android_handler": "mycroft-skill-kodi.k3yb0ardn1nja.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-06-14T11:25:44Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-06T00:27:48Z", - "authorname": "MycroftAI", - "skillname": "Playback Control", - "foldername": "skill-playback-control", - "name": "Playback Control", - "url": "https://github.com/MycroftAI/skill-playback-control", - "category": "Music", - "description": "This Skill doesn't do anything by itself, but it provides an important common\nlanguage for audio playback skills. By handling simple phrases like\n'pause', this one Skill can turn around and rebroadcast the [messagebus](https://mycroft.ai/documentation/message-bus/)\ncommand `mycroft.audio.service.pause`, allowing several music services to share\ncommon terminology such as \"pause\".\n\nAdditionally, this implements the common Play handler. This allows playback\nservices to negotiate which is best suited to play back a specific request.\nThis capability is used by the [Spotify](https://github.com/forslund/spotify-skill) and [Pandora](https://github.com/mycroftai/pianobar-skill) Skills, among others.", - "short_description": "Common playback control system", - "branch": "20.08", - "examples": [ - "Play my summer playlist.", - "Play Pandora.", - "Pause.", - "Resume.", - "Next song.", - "Next track.", - "Previous track.", - "Previous song.", - "Play my summer playlist", - "Play Pandora", - "Pause", - "Resume", - "Next song", - "Next track", - "Previous track", - "Previous song" - ], - "tags": [ - "music", - "resume", - "system", - "Music", - "next", - "pause", - "play", - "playback", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/play.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Music" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Playback Control Skill", - "android_handler": "skill-playback-control.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-07-26T12:48:39Z", - "archived": false, - "license": "epl-1.0", - "modified": "2018-01-28T16:23:17Z", - "authorname": "mortommy", - "skillname": "openHAB skill for Mycroft", - "foldername": "mycroft-skill-openhab", - "name": "openHAB skill for Mycroft", - "url": "https://github.com/mortommy/mycroft-skill-openhab", - "category": null, - "description": "This skill adds [openHAB](http://www.openhab.org/) support to [Mycroft](https://mycroft.ai).\nThe skill takes advantage of the openHAB REST API, so it works both with the v1.x and v2.x of openHAB. \n\nSome sample voice commands are:\n*Hey Mycroft, turn on Diningroom Light*\n * *Hey Mycroft, switch off Kitchen Light*\n * *Hey Mycroft, put on Good Night*\n * *Hey Mycroft, set Diningroom to 50 percent*\n * *Hey Mycroft, dim Kitchen*\n * *Hey Mycroft, brighten Kitchen*\n * *Hey Mycroft, dim Kitchen by 20 percent*\n * *Hey Mycroft, what's Bedroom temperature?*\n * *Hey Mycroft, what's Bedroom humidity?*\n * *Hey Mycroft, adjust Main Thermostat to 21 degrees*\n * *Hey Mycroft, regulate Main Thermostat to 20 degrees*\n * *Hey Mycroft, decrease Main Thermostat by 2 degrees*\n * *Hey Mycroft, increase Main Thermostat by 1 degrees*\n * *Hey Mycroft, what is Main Thermostat regulated to?*\n * *Hey Mycroft, what is Main Thermostat tuned to?*", - "short_description": "This skill adds [openHAB](http://www.openhab.org/) support to [Mycroft](https://mycroft.ai).", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 6, - "requirements": { - "python": [ - "requests>=2.10.0\r", - "fuzzywuzzy==0.14.0\r", - "python-Levenshtein==0.12.0" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Openhab Skill", - "android_handler": "mycroft-skill-openhab.mortommy.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2016-09-25T11:51:25Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-08-22T04:12:56Z", - "authorname": "forslund", - "skillname": "", - "foldername": "gcalendar_skill", - "name": "", - "url": "https://github.com/forslund/gcalendar_skill", - "category": "Daily", - "description": "Fetches scheduled events from Google Calendar and supports the basics for adding events to the calendar.", - "short_description": "Check your google calendar appointments.", - "branch": "master", - "examples": [ - "What's next on my calendar?", - "What's on my calendar on thursday?", - "Add have fun to my calendar at 7 in the evening on saturday.", - "What's next on my calendar", - "What's on my calendar on thursday", - "Add have fun to my calendar at 7 in the evening on saturday" - ], - "tags": [ - "calendar", - "Daily", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 15, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/ calendar.svg", - "credits": [ - "@forslund" - ], - "categories": [ - "Daily" - ], - "requirements": { - "python": [ - "apiclient", - "oauth2client", - "google-api-python-client", - "httplib2" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Gcalendar_Skill Skill", - "android_handler": "gcalendar_skill.forslund.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-01-21T15:38:30Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-05-06T09:02:20Z", - "authorname": "AIIX", - "skillname": "Plasma User Control", - "foldername": "plasma-user-control-skill", - "name": "Plasma User Control", - "url": "https://github.com/AIIX/plasma-user-control-skill", - "category": "Productivity", - "description": "This skill integrates Plasma 5 Desktop Internals with Mycroft which enables users to Lock Screen, Switch Users, Logout, Control Brightness, Control Panel Positions, Control Klipper, Control Work-spaces, Control Compositor, Add Widgets on Plasma Desktop, Add Widgets on Plasma Panel / Desktop, Give System Summary.", - "short_description": "Enables users to Lock Screen, Switch Users, Logout, Control Brightness, Control Panel Positions, Control Klipper, Control Workspaces, Control Compisitor, Add Widgets on Plasma Desktop.", - "branch": "master", - "examples": [ - "Lock screen.", - "Switch current user.", - "Logout of the current session.", - "Increase the brightness.", - "Decrease the brightness.", - "Move panel to top/bottom/left/right.", - "Add widget to desktop 'widgetname.", - "Add widget to panel 'widgetname.", - "Touchpad Enable / Disable.", - "Show clipper.", - "Clear clipboard.", - "Add panel to the top/bottom/left/right.", - "Give me information about this system.", - "Hey Mycroft lock screen", - "Hey Mycroft switch current user", - "Hey Mycroft logout of the current session", - "Hey Mycroft increase the brightness", - "Hey Mycroft decrease the brightness", - "Hey Mycroft move panel to top/bottom/left/right", - "Hey Mycroft Add widget to desktop 'widgetname'", - "Hey Mycroft Add widget to panel 'widgetname'", - "Hey Mycroft Touchpad Enable / Disable", - "Hey Mycroft show clipper", - "Hey Mycroft clear clipboard", - "Hey Mycroft Add panel to the top/bottom/left/right", - "Hey Mycroft Give me information about this system" - ], - "tags": [ - "information", - "plasma", - "system", - "desktop", - "Productivity", - "kde", - "lockscreen", - "brightness", - "clipboard", - "widget", - "panel", - "no-license" - ], - "platforms": [ - "platform_plasmoid" - ], - "stars": 6, - "icon": "https://rawgithub.com/FortAwesome/Font-Awesome/master/advanced-options/raw-svg/solid/microchip.svg", - "credits": [ - "Aix (@AIIX)" - ], - "categories": [ - "Productivity" - ], - "requirements": { - "python": [ - "dbus-python" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Plasma User Control Skill", - "android_handler": "plasma-user-control-skill.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-03-04T22:33:40Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-07-06T21:49:30Z", - "authorname": "JarbasSkills", - "skillname": "skill-parrot", - "foldername": "skill-parrot", - "name": "Parrot Skill", - "url": "https://github.com/JarbasSkills/skill-parrot", - "category": "Entertainment", - "description": "Turn Mycroft into a parrot. Speak a phrase and listen to it repeated in Mycroft's selected voice.\n\n \"Hey Mycroft, start parrot\"\n \"hello\"\n hello\n \"what\"\n what\n \"who are you\"\n who are you\n \"Stop parrot\"\n\nAlso provides an idle screen with parrot images and a random previous STT transcription\n\nNOTES:\nThis will blacklist and replace the functionality of [MycroftAI/skill-speak](https://github.com/MycroftAI/skill-speak), see [Issue#24](https://github.com/MycroftAI/skill-speak/issues/24)\n * This will blacklist and replace the functionality of [MatthewScholefield/skill-repeat-recent](https://github.com/MatthewScholefield/skill-repeat-recent)\n * When asking to repeat what was previously said source is taken into consideration, if you ask in cli, gui, hivemind or STT response will vary accordingly, ie. using voice satellite wont respond with STT from device, only same source is taken into consideration\n * Previous transcriptions are not persisted to disk", - "short_description": "Turn Mycroft into a echoing parrot!", - "branch": "v0.2.1", - "examples": [ - "Say Goodnight, Gracie.", - "Repeat Once upon a midnight dreary, while I pondered, weak and weary, Over many a quaint and curious volume of forgotten lore.", - "Speak I can say anything you'd like!", - "Repeat what you just said.", - "Repeat that.", - "Can you repeat that?", - "What did I just say?", - "Tell me what I just said.", - "Start parrot.", - "Stop parrot.", - "say Goodnight, Gracie", - "repeat Once upon a midnight dreary, while I pondered, weak and weary, Over many a quaint and curious volume of forgotten lore", - "speak I can say anything you'd like!", - "Repeat what you just said", - "Repeat that", - "start parrot", - "stop parrot", - "repeat everything you hear", - "stop repeating me" - ], - "tags": [ - "Template", - "Debug", - "parrot", - "converse", - "Entertainment", - "Tutorial", - "echo", - "no-license" - ], - "platforms": [ - "all", - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "stars": 3, - "icon": "https://github.com/JarbasSkills/skill-parrot/icon.png", - "credits": [ - "JarbasAl", - "[MatthewScholefield/skill-repeat-recent](https://github.com/MatthewScholefield/skill-repeat-recent)" - ], - "categories": [ - "Entertainment" - ], - "logo": "https://raw.githubusercontent.com/JarbasSkills/skill-parrot/master/logo.png", - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": "https://raw.githubusercontent.com/JarbasSkills/skill-parrot/master/res/icon/icon.png", - "android_name": "Parrot Skill", - "android_handler": "skill-parrot.jarbasskills.home" - }, - "desktop": { - "Terminal": "false", - "Type": "Application", - "Name": "Parrot", - "Exec": "mycroft-gui-app --hideTextInput --skill=skill-parrot.jarbasskills.home", - "Icon": "icon.png", - "Categories": "VoiceApp", - "StartupNotify": "false", - "X-DBUS-StartupType": "None", - "X-KDE-StartupNotify": "false" - }, - "desktopFile": false, - "systemDeps": false - }, - { - "created": "2017-03-05T18:10:49Z", - "archived": false, - "license": "unknown", - "modified": "2020-04-09T10:19:15Z", - "authorname": "JarbasAl", - "skillname": "dictation", - "foldername": "skill-dictation", - "name": "dictation", - "url": "https://github.com/JarbasAl/skill-dictation", - "category": null, - "description": "Char-rnn auto complete for human + machine writing included.", - "short_description": "", - "branch": "master", - "examples": [ - "Start dictation.", - "Once upon a time.", - "Auto complete.", - "End dictation.", - "start dictation", - "once upon a time", - "auto complete", - "end dictation" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 7, - "credits": [ - "JarbasAI" - ], - "requirements": { - "python": [ - "yagmail" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Dictation Skill", - "android_handler": "skill-dictation.jarbasal.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-04-10T19:54:54Z", - "archived": false, - "license": "unknown", - "modified": "2018-01-02T18:31:24Z", - "authorname": "amcgee7", - "skillname": "picroft example skill gpio Readme", - "foldername": "picroft_example_skill_gpio", - "name": "picroft example skill gpio Readme", - "url": "https://github.com/amcgee7/picroft_example_skill_gpio", - "category": null, - "description": "This is a skill for picroft that will interact with the GPIO", - "short_description": "This is a skill for picroft that will interact with the GPIO", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Picroft_Example_Skill_Gpio Skill", - "android_handler": "picroft_example_skill_gpio.amcgee7.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2016-09-30T21:58:45Z", - "archived": false, - "license": "unknown", - "modified": "2017-01-02T21:37:06Z", - "authorname": "jcasoft", - "skillname": "", - "foldername": "GoogleCalendar-Skill", - "name": "", - "url": "https://github.com/jcasoft/GoogleCalendar-Skill", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 4, - "requirements": { - "python": [ - "oauth2client==3.0.0", - "httplib2", - "apiclient ", - "tzlocal", - "google-api-python-client " - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Googlecalendar Skill", - "android_handler": "GoogleCalendar-Skill.jcasoft.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-12-10T10:04:12Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-06T00:29:07Z", - "authorname": "MycroftAI", - "skillname": "Wink IoT", - "foldername": "skill-wink-iot", - "name": "Wink IoT", - "url": "https://github.com/MycroftAI/skill-wink-iot", - "category": "IoT", - "description": "Interact with your smart home using the [Wink system](https://www.wink.com/). Wink hubs can work with virtually any brand of lights, including [Philips Hue](https://www2.meethue.com/en-us), [GE](https://www.gelighting.com/), [Sylvania](https://www.sylvania.com/en-us/Pages/default.aspx), [Cree](https://creebulb.com/connected), and many more. Use Mycroft to easily interact with nearby lights and light groups you create within the Wink ecosystem.\n\nYour can easily find the right light or lights based on the names of lights and groups. The Mycroft device's Name (set at [Home](https://home.mycroft.ai/) -- check by asking \"what is your name?\")\ncan be used to find lights and/or groups with begin with that same name. For example, if your Mycroft device's location is set to 'Kitchen' and you say \"Turn on the light\", lights with the following names would be turned on:\n\nIt will NOT turn on a light called \"Porch off the kitchen\".\n\nYou can also include the light/group name in your request, along with intensity words, such as: `bright`, `dim`, `full`, `half`, `completely`, `partially`\nKitchen\n * Kitchen sink\n * Kitchen fan (group consisting of 'Fan 1', 'Fan 2', 'Fan 3')", - "short_description": "Control lights and switches connected to a Wink Hub", - "branch": "20.08", - "examples": [ - "Flip on the light.", - "Turn on the bedroom lights dimly.", - "Dim the lights.", - "Switch off the light.", - "Raise the light in the kitchen.", - "Dimmer (conversationally)", - "Brighter (conversationally)", - "Flip on the light", - "Turn on the bedroom lights dimly", - "Dim the lights", - "Switch off the light", - "Raise the light in the kitchen" - ], - "tags": [ - "wink", - "smart-home", - "IoT", - "home-automation", - "smarthome", - "lightbulb", - "winkhub", - "light", - "LED", - "iot", - "lighting", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/lightbulb.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "IoT" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Wink Iot Skill", - "android_handler": "skill-wink-iot.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2016-08-12T15:19:03Z", - "archived": false, - "license": "unlicense", - "modified": "2018-04-01T01:08:48Z", - "authorname": "dmp1ce", - "skillname": "Mycroft bitcoin price skill", - "foldername": "mycroft-bitcoinprice-skill", - "name": "Mycroft bitcoin price skill", - "url": "https://github.com/dmp1ce/mycroft-bitcoinprice-skill", - "category": null, - "description": "> You: \"Hey Mycroft, what is the bitcoin price?\"\n\n> Mycroft: \"600 USD is the bitcoin daily average price.\"", - "short_description": "> You: \"Hey Mycroft, what is the bitcoin price?\"", - "branch": "master", - "examples": [ - "Compose up -d.", - "Compose exec mycroft bash." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Bitcoinprice Skill", - "android_handler": "mycroft-bitcoinprice-skill.dmp1ce.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-01-21T14:14:48Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-09-02T06:20:45Z", - "authorname": "AIIX", - "skillname": "Plasma Activites", - "foldername": "plasma-activities-skill", - "name": "Plasma Activites", - "url": "https://github.com/AIIX/plasma-activities-skill", - "category": "Productivity", - "description": "This skill integrates plasma-shell activities with mycroft which enables users to control their desktop activities via voice on the go, users can create activities, switch, remove, stop and display activities on their desktops.", - "short_description": "Control Your Plasmashell Activities", - "branch": "master", - "examples": [ - "Create new activity 'Activity Name.", - "Show current Activities.", - "Kill activity 'Activity Name.", - "Switch to activity 'Activity Name.", - "Remove activity 'Activity Name.", - "create new activity 'Activity Name'", - "show current Activities", - "kill activity 'Activity Name'", - "switch to activity 'Activity Name'", - "remove activity 'Activity Name'" - ], - "tags": [ - "activities", - "plasma", - "desktop", - "Productivity", - "kde", - "switch", - "control", - "no-license" - ], - "platforms": [ - "platform_plasmoid" - ], - "stars": 4, - "icon": "https://rawgithub.com/FortAwesome/Font-Awesome/master/advanced-options/raw-svg/solid/chalkboard-teacher.svg", - "credits": [ - "@AIIX" - ], - "categories": [ - "Productivity" - ], - "requirements": { - "python": [ - "dbus-python", - "dbus-python " - ], - "system": { - "all": "libdbus-1-dev libdbus-glib-1-dev" - }, - "skill": [] - }, - "android": { - "android_icon": null, - "android_name": "Plasma Activities Skill", - "android_handler": "plasma-activities-skill.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-09-22T05:02:43Z", - "archived": false, - "license": "unknown", - "modified": "2019-11-21T18:17:17Z", - "authorname": "JarbasAl", - "skillname": "Easter Eggs", - "foldername": "skill_easter_eggs", - "name": "Easter Eggs", - "url": "https://github.com/JarbasAl/skill_easter_eggs", - "category": null, - "description": "Some funny things for mycroft, mostly quotes from movies.", - "short_description": "", - "branch": "master", - "examples": [ - "Current stardate.", - "Open the pod bay doors.", - "First law of robotics.", - "How to play rock_paper_scissors_lizard_spock.", - "How many languages do you speak.", - "Do you like portal.", - "What would duke nukem say?", - "What would HAL 9000 say?", - "What would arnold say?", - "What would glados say?", - "What would bender say?" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 6, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Skill_Easter_Eggs Skill", - "android_handler": "skill_easter_eggs.jarbasal.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-05-15T20:31:48Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-03-03T18:15:03Z", - "authorname": "Skills-And-Translations", - "skillname": "mycroft-clementine-player-plasma-skill", - "foldername": "mycroft-clementine-skill", - "name": "mycroft-clementine-player-plasma-skill", - "url": "https://github.com/Skills-And-Translations/mycroft-clementine-skill", - "category": null, - "description": "This skill integrates clementine Music Player with Mycroft which enables users to Play Local Music.\n\nIt is forked by the mycroft-amarok-player-plasma-skill and works in a similiar way.\n\nIt could be that the plugin make conflicts with the amarok-one cause of same commands, so you propaply have to deceide what skill you want to need.\n\nThe clementine-project is also for exploring the mechanisms and libs of mycroft personaly, so i also want to extend it. Ideas are welcome.\n\n#### Installation of skill:\n\n#### Installation of requirements:\n##### Fedora: \n\n##### Kubuntu / KDE Neon: \n\n##### For other distributions:\n\n##### How To Use: \n###### Play Music/Song\n\n###### Pause Music/Song\n\n###### Stop Music/Song\n\n###### Next Song\n\n###### Previous Song\n\n###### Jump forward\n\n###### Jump backward\nDownload or Clone Git\n * Create /opt/mycroft/skills folder if it does not exist\n * Extract Downloaded Skill into a folder. mycroft-clementine-player-plasma-skill. (Clone does not require this step)\n * Copy the mycroft-internals-plasma-skill folder to /opt/mycroft/skills/ folder\n * sudo dnf install dbus-python\n * sudo dnf install python-psutil\n * From terminal: cp -R /usr/lib64/python2.7/site-packages/dbus* /home/$USER/.virtualenvs/mycroft/lib/python2.7/site-packages/\n * From terminal: cp /usr/lib64/python2.7/site-packages/_dbus* /home/$USER/.virtualenvs/mycroft/lib/python2.7/site-packages/\n * sudo apt install python-psutil\n * sudo apt install python-dbus\n * From terminal: cp -R /usr/lib/python2.7/dist-packages/dbus* /home/$USER/.virtualenvs/mycroft/lib/python2.7/site-packages/\n * From terminal: cp /usr/lib/python2.7/dist-packages/_dbus* /home/$USER/.virtualenvs/mycroft/lib/python2.7/site-packages/\n * Python Dbus and Python Psutil package is required and copying the Python Dbus folder and lib from your system python install over to /home/$USER/.virtualenvs/mycroft/lib/python2.7/site-packages/.\n * Hey Mycroft, play music\n * Hey Mycroft, play song\n * Hey Mycroft, pause music\n * Hey Mycroft, pause song\n * Hey Mycroft, stop music\n * Hey Mycroft, stop song\n * Hey Mycroft, next song\n * Hey Mycroft, previous song\n * Hey Mycroft, jump 3 songs forward\n * Hey Mycroft, go 8 forward\n * Hey Mycroft, jump 10 songs back\n * Hey Mycroft, go 4 backward\n * Hey Mycroft, go 22 back", - "short_description": "This skill integrates clementine Music Player with Mycroft which enables users to Play Local Music.", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Clementine Skill", - "android_handler": "mycroft-clementine-skill.skills-and-translations.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-04-17T00:04:18Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2018-05-14T22:51:32Z", - "authorname": "chrison999", - "skillname": "mycroft-skill-lets-talk", - "foldername": "mycroft-skill-lets-talk", - "name": "mycroft-skill-lets-talk", - "url": "https://github.com/chrison999/mycroft-skill-lets-talk", - "category": null, - "description": "A skill for MycroftAI that replies to various greetings", - "short_description": "A skill for MycroftAI that replies to various greetings", - "branch": "master", - "examples": [ - "Good morning.", - "Good afternoon.", - "Good evening.", - "Good night." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Lets Talk Skill", - "android_handler": "mycroft-skill-lets-talk.chrison999.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-04-04T17:45:40Z", - "archived": false, - "license": "unknown", - "modified": "2020-09-17T12:44:20Z", - "authorname": "MycroftAI", - "skillname": "Dial Call Skill", - "foldername": "skill-dial-call", - "name": "Dial Call Skill", - "url": "https://github.com/MycroftAI/skill-dial-call", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [ - "Call Mycroft.", - "call Mycroft" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Dial Call Skill", - "android_handler": "skill-dial-call.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-02-17T18:45:39Z", - "archived": false, - "license": "mit", - "modified": "2019-06-10T21:07:35Z", - "authorname": "nogre", - "skillname": "Network Ping", - "foldername": "ping-skill", - "name": "Network Ping", - "url": "https://github.com/nogre/ping-skill", - "category": "IoT", - "description": "This is a 3rd party skill that uses keywords to get either a server's ping time or status via ICMP echo requests. This can be used to check that a server is responding correctly. Alternatively, one can use this to send simple HTTP GET requests to a server to start or stop services. By using the Network Ping Skill, custom commands can be created for webhook-enabled online services.\n\nFor instance, saying, *Mycroft: Send a Ping to network node Google* garners a reply of `Pinged in 9.03 milliseconds.`\n\nIf a keyword is set to get the server response, then Mycroft will reply, `Server says: OK 200`, or ` Bad Gateway 502`, et cetera.\n\n---\n\nConfiguration of network node aliases is stored in a text file, `hosts.txt`, with one \"keyword,setting,URL\" per line:\n\n google,0,https://google.com\n \nThis line will tell the Ping Skill that **google** is the keyword, **0** is for a *Ping* response and then the URL to ping. Alternatively, this\n\n linux,1,https://linux.com\n \nwill respond to the **linux** keyword and return the server *Status* of `linux.com`, because of the **1** after the keyword.\n\nIf you are running server software that can respond to GET requests, such as [Huginn](https://github.com/cantino/huginn), or there is a webservice without a prepackaged Mycroft skill that accepts webhooks, then a line like\n\n hug, 1, https://www.HuginnDomain.com/users/1/web_requests/2/supersecretstring?service=start\n\nand the corresponding settings on the remote end will make the Ping Skill into a basic remote control. Saying *Mycroft: Send a Ping Hug* will load that URL, which will execute code on the server. Mycroft will reply, in the case of Huginn with a default Webhook Agent, with the custom server response, `Event Created 201`, to confirm the instruction was received and followed.", - "short_description": "Send network pings (a.k.a. ICMP echo requests) to internet nodes", - "branch": "master", - "examples": [ - "Send a Ping to network node Google.", - "Send ICMP echo to ten dot zero dot zero dot thirty.", - "Send ping to dns name mycroft dot AI.", - "Send a Ping to network node Google", - "Send ICMP echo to ten dot zero dot zero dot thirty", - "Send ping to dns name mycroft dot AI" - ], - "tags": [ - "ping", - "network", - "IoT", - "utility", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/satellite-dish.svg", - "credits": [ - "@nogre @jrwarwick" - ], - "categories": [ - "IoT" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Ping Skill", - "android_handler": "ping-skill.nogre.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-11-11T22:47:05Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2018-05-18T06:49:22Z", - "authorname": "ofosos", - "skillname": "Deutschlandfunk player", - "foldername": "deutschlandfunk-skill", - "name": "Deutschlandfunk player", - "url": "https://github.com/ofosos/deutschlandfunk-skill", - "category": null, - "description": "Play Deutschlandfunk streams and query schedule.", - "short_description": "", - "branch": "master", - "examples": [ - "Play dlf nova.", - "Play dlf.", - "Play dlf culture.", - "What's on dlf?", - "Hey Mycroft, play dlf nova", - "Hey Mycroft, play dlf", - "Hey Mycroft, play dlf culture", - "Hey Mycroft, what's on dlf" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "@ofosos" - ], - "requirements": { - "python": [ - "beautifulsoup4", - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Deutschlandfunk Skill", - "android_handler": "deutschlandfunk-skill.ofosos.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-03-30T18:32:40Z", - "archived": false, - "license": "unknown", - "modified": "2020-09-26T11:13:57Z", - "authorname": "CloneMMDDCVII", - "skillname": "systemSkill-Mycroft-core-Skill-", - "foldername": "systemSkill-Mycroft-core-Skill-", - "name": "systemSkill-Mycroft-core-Skill-", - "url": "https://github.com/CloneMMDDCVII/systemSkill-Mycroft-core-Skill-", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 5, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Systemskill Mycroft Core Skill", - "android_handler": "systemSkill-Mycroft-core-Skill-.clonemmddcvii.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-05-04T22:20:05Z", - "archived": false, - "license": "apache-2.0", - "modified": "2019-01-10T03:48:24Z", - "authorname": "MycroftAI", - "skillname": "Mark 1 Demo", - "foldername": "skill-mark1-demo", - "name": "Mark 1 Demo", - "url": "https://github.com/MycroftAI/skill-mark1-demo", - "category": "Configuration", - "description": "The Mycroft Mark 1 menu which appears when you press and hold the top button\nhas a 'DEMO' option. This Skill implements a simple mode which can be used\nto draw attention at trade shows, stores, etc.\n\nThe demo starts with the unit's eyes dancing around. Every 2 minutes it will\nsing a song. The singing is synched to the clock, so multiple units can form\na chorus.\n\nYou can stop the demo by pressing the top button or saying \"Stop\".", - "short_description": "Showcase the capabilities of the Mark 1", - "branch": "20.08", - "examples": [ - "Stop - ends the DEMO.", - "Stop - ends the DEMO" - ], - "tags": [ - "showcase", - "demonstration", - "Configuration", - "demo", - "no-license" - ], - "platforms": [ - "platform_mark1" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/chalkboard-teacher.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mark1 Demo Skill", - "android_handler": "skill-mark1-demo.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-06-17T17:43:17Z", - "archived": false, - "license": "mit", - "modified": "2019-08-06T02:02:42Z", - "authorname": "Friday811", - "skillname": "skill-dice skill", - "foldername": "skill-dice", - "name": "skill-dice skill", - "url": "https://github.com/Friday811/skill-dice", - "category": null, - "description": "Dice rolling skill for the mycroft assistant.\nThis skill rolls dice in RPG notation.\n\nCommand syntax:\n - _wake word_ roll 3d6\n - _wake word_ roll three six-sided dice", - "short_description": "Dice rolling skill for the mycroft assistant.", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 3, - "requirements": { - "python": [ - "mycroft==0.1.0", - "adapt==0.1", - "adapt_parser==0.3.0" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Dice Skill", - "android_handler": "skill-dice.friday811.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-07-02T18:20:50Z", - "archived": false, - "license": "mit", - "modified": "2020-02-14T22:36:26Z", - "authorname": "eClarity", - "skillname": "Realtime Object Recognition Skill", - "foldername": "skill-realtime-object-recognition", - "name": "Realtime Object Recognition Skill", - "url": "https://github.com/eClarity/skill-realtime-object-recognition", - "category": null, - "description": "A real-time object recognition skill for Mycroft AI using [Google's TensorFlow Object Detection API](https://github.com/tensorflow/models/tree/master/object_detection) and [OpenCV](http://opencv.org/).\n\nThis skill is a proof of concept to use tensorflow and openCV to provide realtime object recognition using the default webcam as a source. So far it's only been tested on Ubuntu, and since it's resource heavy may be laggy or not work on less powerful machines running Mycroft.\n\nHopefully this is just a start and with optimization and further development this skill will provide a concept to create more skills around object recognition", - "short_description": "A real-time object recognition skill for Mycroft AI using [Google's TensorFlow Object Detection API](https://github.com/tensorflow/models/tree/master/object_detection) and [OpenCV](http://opencv.org/).", - "branch": "master", - "examples": [ - "View Objects.", - "View Objects" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 4, - "requirements": { - "python": [ - "imutils", - "opencv-python", - "tensorflow>=1.2" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Realtime Object Recognition Skill", - "android_handler": "skill-realtime-object-recognition.eclarity.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-01-05T17:26:13Z", - "archived": false, - "license": "unknown", - "modified": "2019-04-12T08:11:56Z", - "authorname": "jcasoft", - "skillname": "", - "foldername": "TranslateSkill", - "name": "", - "url": "https://github.com/jcasoft/TranslateSkill", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 5, - "requirements": { - "python": [ - "lxml ", - "unidecode", - "unicodedata2", - "mtranslate " - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Translateskill Skill", - "android_handler": "TranslateSkill.jcasoft.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-10-23T10:58:49Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-03-01T15:05:01Z", - "authorname": "forslund", - "skillname": "Zork", - "foldername": "white-house-adventure", - "name": "Zork", - "url": "https://github.com/forslund/white-house-adventure", - "category": "Entertainment", - "description": "Zork is one of the classic text based adventure games from an era before high-end graphics circuits, instead it runs on the graphics hardware of your mind!\n\nExplore the white house, the forest surrounding it and the hidden kingdom below it. Moving this from the text domain to the voice domain makes for a curiously engaging experience and if nothing else a fun couple of minutes.\n\nThe skill utilizes the excellent Frotz (http://frotz.sourceforge.net/) Z-Machine interpreter and the Zork data files are from infocom-if (http://infocom-if.org/index2.html).\n\n*Be ware of Grues....*", - "short_description": "Play the adventure game Zork", - "branch": "master", - "examples": [ - "Play zork.", - "Quit zork.", - "Open mailbox.", - "play zork", - "quit zork", - "open mailbox" - ], - "tags": [ - "Entertainment", - "port", - "game", - "adventure", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 6, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/door-open.svg", - "credits": [ - "@forslund" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "White House Adventure Skill", - "android_handler": "white-house-adventure.forslund.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-03-29T19:16:53Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2017-07-17T06:58:53Z", - "authorname": "forslund", - "skillname": "RSS Feed Reader", - "foldername": "rss_skill", - "name": "RSS Feed Reader", - "url": "https://github.com/forslund/rss_skill", - "category": null, - "description": "A skill allowing Mycroft to fetch and read headlines and article summaries.", - "short_description": "", - "branch": "master", - "examples": [ - "What are the latest headlines from slashdot.org?", - "Read about elon musk's new project.", - "Hey Mycroft, what are the latest headlines from slashdot.org", - "Hey Mycroft, read about elon musk's new project" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 3, - "credits": [ - "Åke Forslund" - ], - "requirements": { - "python": [ - "nltk==3.2.2" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Rss_Skill Skill", - "android_handler": "rss_skill.forslund.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-09-11T18:51:52Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-04-25T17:24:38Z", - "authorname": "wligtenberg", - "skillname": "coin flip", - "foldername": "coin-flip-skill", - "name": "coin flip", - "url": "https://github.com/wligtenberg/coin-flip-skill", - "category": null, - "description": "Flip a virtual coin by saying \"hey Mycroft, flip a coin\".\nIt will then randomly choose between heads and tails.\n\nTo get this done we need\n- A sound effect for the coin flip\n- Randomly pick between heads or tails\n- Speak the result.", - "short_description": "", - "branch": "master", - "examples": [ - "Flip a coin.", - "flip a coin" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 3, - "credits": [ - "Willem Ligtenberg @wligtenberg" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Coin Flip Skill", - "android_handler": "coin-flip-skill.wligtenberg.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-03-04T14:09:37Z", - "archived": false, - "license": "unknown", - "modified": "2019-11-14T08:44:48Z", - "authorname": "BongoEADGC6", - "skillname": "Traffic Skill for Mycroft", - "foldername": "mycroft-traffic", - "name": "Traffic Skill for Mycroft", - "url": "https://github.com/BongoEADGC6/mycroft-traffic", - "category": null, - "description": "[![Stories in Ready](https://badge.waffle.io/BongoEADGC6/mycroft-traffic.svg?label=ready&title=Ready)](http://waffle.io/BongoEADGC6/mycroft-traffic) [![Build Status](https://travis-ci.org/BongoEADGC6/mycroft-traffic.svg?branch=master)](https://travis-ci.org/BongoEADGC6/mycroft-traffic)\n\nThis is a skill to query travel times to points of interest (POIs) for\n[Mycroft](https://mycroft.ai).", - "short_description": "[![Stories in Ready](https://badge.waffle.io/BongoEADGC6/mycroft-traffic.svg?label=ready&title=Ready)](http://waffle.io/BongoEADGC6/mycroft-traffic) [![Build Status](https://travis-ci.org/BongoEADGC6/mycroft-traffic.svg?branch=master)](https://travis-ci.org/BongoEADGC6/mycroft-traffic)", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "requirements": { - "python": [ - "googlemaps==2.5.1", - "requests>=2.4.0" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Traffic Skill", - "android_handler": "mycroft-traffic.bongoeadgc6.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2016-10-02T14:22:06Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-10-21T14:06:28Z", - "authorname": "forslund", - "skillname": "MPD Playback", - "foldername": "mpd_skill", - "name": "MPD Playback", - "url": "https://github.com/forslund/mpd_skill", - "category": "Music", - "description": "The skill retreivs all listable albums, artists and genres and can play each of these. Also pausing and resuming is possible along with stop and skipping tracks.", - "short_description": "Connect and control media players over the MPD protocol", - "branch": "master", - "examples": [ - "Play Beastie Boys.", - "Play some rock music.", - "play Beastie Boys", - "play some rock music" - ], - "tags": [ - "music", - "mpd", - "Music", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 8, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/headphones.svg", - "credits": [ - "@forslund" - ], - "categories": [ - "Music" - ], - "requirements": { - "python": [ - "fuzzywuzzy==0.15.0", - "python-mpd2==3.0.1", - "python-levenshtein" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mpd_Skill Skill", - "android_handler": "mpd_skill.forslund.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2016-06-23T14:20:35Z", - "archived": false, - "license": "gpl-2.0", - "modified": "2017-07-28T12:03:57Z", - "authorname": "the7erm", - "skillname": "mycroft-skill-jupiter-broadcasting", - "foldername": "mycroft-skill-jupiter-broadcasting", - "name": "mycroft-skill-jupiter-broadcasting", - "url": "https://github.com/the7erm/mycroft-skill-jupiter-broadcasting", - "category": null, - "description": "My 2nd attempt at creating a mycroft skill", - "short_description": "My 2nd attempt at creating a mycroft skill", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 8, - "requirements": { - "python": [ - "feedcache==1.4.1", - "feedparser==5.2.1" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Jupiter Broadcasting Skill", - "android_handler": "mycroft-skill-jupiter-broadcasting.the7erm.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2016-10-20T22:54:45Z", - "archived": false, - "license": "unknown", - "modified": "2019-03-19T21:37:22Z", - "authorname": "jcasoft", - "skillname": "", - "foldername": "GoogleGmail-Skill", - "name": "", - "url": "https://github.com/jcasoft/GoogleGmail-Skill", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 7, - "requirements": { - "python": [ - "oauth2client==3.0.0", - "httplib2", - "apiclient ", - "tzlocal", - "google-api-python-client " - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Googlegmail Skill", - "android_handler": "GoogleGmail-Skill.jcasoft.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2016-10-25T23:15:19Z", - "archived": false, - "license": "mit", - "modified": "2016-10-25T23:16:19Z", - "authorname": "ethanaward", - "skillname": "PROJECT_NAME skill", - "foldername": "demo_skill", - "name": "PROJECT_NAME skill", - "url": "https://github.com/ethanaward/demo_skill", - "category": null, - "description": "This skill illustrates a very simple MP3 music player. It works by loading\nMP3 files from the /mp3 subfolder using the format: song_title.mp3", - "short_description": "This skill illustrates a very simple MP3 music player. It works by loading", - "branch": "master", - "examples": [ - "Attribution - No Derivative Works.", - "Nd/3.0/legalcode." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Demo_Skill Skill", - "android_handler": "demo_skill.ethanaward.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2016-06-25T09:06:00Z", - "archived": false, - "license": "gpl-2.0", - "modified": "2018-03-18T01:06:57Z", - "authorname": "the7erm", - "skillname": "mycroft-skill-podcast", - "foldername": "mycroft-skill-podcast", - "name": "mycroft-skill-podcast", - "url": "https://github.com/the7erm/mycroft-skill-podcast", - "category": null, - "description": "My 3rd attempt at creating a mycroft skill.\n\nThis is a 3rd party skill that can either reside in `~/.mycroft/third_party_skills/` or `/opt/mycroft/third_party` .\n\nThis skill is based on the [Jupiter Broadcasting Skill](https://github.com/the7erm/mycroft-skill-jupiter-broadcasting).", - "short_description": "My 3rd attempt at creating a mycroft skill.", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 6, - "requirements": { - "python": [ - "feedcache==1.4.1", - "feedparser==5.2.1" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Podcast Skill", - "android_handler": "mycroft-skill-podcast.the7erm.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-07-06T07:25:41Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-01-02T19:17:00Z", - "authorname": "ChristopherRogers1991", - "skillname": "mycroft-irsend", - "foldername": "mycroft-irsend", - "name": "mycroft-irsend", - "url": "https://github.com/ChristopherRogers1991/mycroft-irsend", - "category": null, - "description": "A Mycroft skill for issuing [irsend](http://www.lirc.org/html/irsend.html) commands", - "short_description": "A Mycroft skill for issuing [irsend](http://www.lirc.org/html/irsend.html) commands", - "branch": "master", - "examples": [ - "- Run this if you've added remotes to lirc, and want Mycroft to pick them up (otherwise they will be picked up on restart)" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 5, - "requirements": { - "python": [ - "py_irsend==1.0.1" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Irsend Skill", - "android_handler": "mycroft-irsend.christopherrogers1991.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-01-31T06:19:30Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-05-06T09:01:08Z", - "authorname": "AIIX", - "skillname": "Plasma-KDE-Connect-Skill", - "foldername": "plasma-kde-connect-skill", - "name": "Plasma-KDE-Connect-Skill", - "url": "https://github.com/AIIX/plasma-kde-connect-skill", - "category": null, - "description": "Control your KDE-Connect connected devices with actions such as:\n- Find My Phone\n- Ping My Phone\n- Browse Phone Files\n- Dictate and Send an SMS to Your Google Contacts.", - "short_description": "", - "branch": "master", - "examples": [ - "Find my phone.", - "Ping my phone.", - "Show phone files.", - "Send sms to 'contactname.", - "Hey Mycroft, find my phone", - "Hey Mycroft, ping my phone", - "Hey Mycroft, show phone files", - "Hey Mycroft, send sms to 'contactname'" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 6, - "credits": [ - "Aix (Aix.m@outlook.com)" - ], - "requirements": { - "python": [ - "dbus-python ", - "xmltodict", - "google-api-python-client" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Plasma Kde Connect Skill", - "android_handler": "plasma-kde-connect-skill.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2016-08-03T17:45:31Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-06-23T17:46:55Z", - "authorname": "penrods", - "skillname": "Wink", - "foldername": "Wink", - "name": "Wink", - "url": "https://github.com/penrods/Wink", - "category": null, - "description": "Mycroft Skill to control IoT devices via the Wink API\n\nTest", - "short_description": "Mycroft Skill to control IoT devices via the Wink API", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Wink Skill", - "android_handler": "Wink.penrods.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2016-06-19T00:57:32Z", - "archived": false, - "license": "gpl-2.0", - "modified": "2018-12-30T23:18:28Z", - "authorname": "the7erm", - "skillname": "mycroft-skill-diagnostics", - "foldername": "mycroft-skill-diagnostics", - "name": "mycroft-skill-diagnostics", - "url": "https://github.com/the7erm/mycroft-skill-diagnostics", - "category": null, - "description": "| Intent | Example Keyphrase | Function | Output |\n|-------------|-------------------------------------------|--------------------------------------------|-------------------------------------------------------------------------------------------------------------------|\n| Cpu | Mycroft, what is the current cpu percent? | Get the current cpu percentage. | The cpu is currently running at 10%. I'm working hard on <list of processes> |\n| Diagnostics | Mycroft, run diagnostics. | Run external script | One moment while I run the diagnostics script. <Whatever is printed to stdout of the diagnostics script.> |\n| Drive space | Mycroft, how's my hard drive space? | List drive partitions & their space | / has 52.3 Gig free it's used 71.7%
/home/erm/disk2 has 758.9 Gig free it's used 58.6% |\n| Public Ip | Mycroft, what is my public IP? | Gets all the ip addresses from all nics | This computer has the following lan IP addresses 192.168.1.116 and your public IP is [censored] |\n| Uptime | Mycroft, what's your uptime? | Run `uptime -r` and get the output | I have been up 2 days, 18 hours, 2 minutes |", - "short_description": "| Intent | Example Keyphrase | Function | Output |", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 4, - "requirements": { - "python": [ - "setproctitle==1.1.10" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Diagnostics Skill", - "android_handler": "mycroft-skill-diagnostics.the7erm.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-07-01T01:39:17Z", - "archived": false, - "license": "unknown", - "modified": "2017-07-01T01:40:40Z", - "authorname": "lachendeKatze", - "skillname": "skill-iss-location", - "foldername": "skill-iss-location", - "name": "skill-iss-location", - "url": "https://github.com/lachendeKatze/skill-iss-location", - "category": null, - "description": "My Mycroft Skill 001\n\nThis skill allows Mycroft to tell you where the International Space Station(ISS) in orbit\nrealtive to the Earth in latitude and longitude. It uses reverse geocoding to translate these\ncoordinates into the conntry or body of water it is over.\n\nTo get this done we need\n - Python 2.7\n - Python libraries: json, urllib2\n - That\n - The other thing", - "short_description": "My Mycroft Skill 001", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "urllib2", - "json" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Iss Location Skill", - "android_handler": "skill-iss-location.lachendekatze.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-05-19T19:16:38Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2017-09-15T11:28:24Z", - "authorname": "eClarity", - "skillname": "TheMovieDB.org skill", - "foldername": "skill-tmdb", - "name": "TheMovieDB.org skill", - "url": "https://github.com/eClarity/skill-tmdb", - "category": null, - "description": "* Edit __init__.py to add your Tmdb api key *\n\ntmdb = TMDb(api_key=\"your api key goes here\", debug=False, lang=\"en\")", - "short_description": "", - "branch": "master", - "examples": [ - "Find upcoming movies.", - "What movies are now playing?", - "Tell me about robin williams.", - "Find overview for The Matrix.", - "Find popular shows.", - "find upcoming movies", - "What movies are now playing", - "tell me about robin williams", - "find overview for The Matrix", - "find popular shows" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 3, - "requirements": { - "python": [ - "tmdbv3api" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Tmdb Skill", - "android_handler": "skill-tmdb.eclarity.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-02-27T07:53:56Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2018-04-17T10:00:32Z", - "authorname": "Nold360", - "skillname": "", - "foldername": "mycroft_skill-take_picture", - "name": "", - "url": "https://github.com/Nold360/mycroft_skill-take_picture", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft_Skill Take_Picture Skill", - "android_handler": "mycroft_skill-take_picture.nold360.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-01-13T16:00:25Z", - "archived": false, - "license": "unknown", - "modified": "2018-02-13T15:11:46Z", - "authorname": "jcasoft", - "skillname": "", - "foldername": "GoogleGmailSkill", - "name": "", - "url": "https://github.com/jcasoft/GoogleGmailSkill", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 3, - "requirements": { - "python": [ - "oauth2client==3.0.0", - "httplib2", - "apiclient ", - "tzlocal", - "google-api-python-client " - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Googlegmailskill Skill", - "android_handler": "GoogleGmailSkill.jcasoft.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-01-26T06:18:52Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-08-30T16:34:33Z", - "authorname": "forslund", - "skillname": "", - "foldername": "event_skill", - "name": "", - "url": "https://github.com/forslund/event_skill", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 7, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Event_Skill Skill", - "android_handler": "event_skill.forslund.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2016-09-23T15:22:23Z", - "archived": false, - "license": "unknown", - "modified": "2018-06-06T16:13:22Z", - "authorname": "jcasoft", - "skillname": "", - "foldername": "PushbulletSkill", - "name": "", - "url": "https://github.com/jcasoft/PushbulletSkill", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 4, - "requirements": { - "python": [ - "Pillow", - "pushbullet.py" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Pushbulletskill Skill", - "android_handler": "PushbulletSkill.jcasoft.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-12-20T00:37:23Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-11-19T22:53:11Z", - "authorname": "Dark5ide", - "skillname": "ESP8266 skill", - "foldername": "skill-esp8266", - "name": "ESP8266 skill", - "url": "https://github.com/Dark5ide/skill-esp8266", - "category": null, - "description": "This Skill has been created for the makers and hackers who want to build their own home automation system based on ESP8266. The purpose of this Skill is to be able to use Mycroft to send commands to all ESP8266s on the local network. The communication protocol can be selected (Websocket, MQTT, http GET).", - "short_description": "", - "branch": "master", - "examples": [ - "_Hey Mycroft, can you switch on the mood lamp ?_", - "_Hey Mycroft, can you turn off the TV ?_" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 6, - "credits": [ - "Dark5ide" - ], - "requirements": { - "python": [ - "websocket-client-py3>=0.15.0", - "paho-mqtt>=1.2" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Esp8266 Skill", - "android_handler": "skill-esp8266.dark5ide.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-07-28T01:12:41Z", - "archived": false, - "license": "apache-2.0", - "modified": "2019-07-02T22:43:26Z", - "authorname": "TREE-Ind", - "skillname": "Voice Recognition Skill Using Tensorflow - WIP", - "foldername": "skill-voice-recognition", - "name": "Voice Recognition Skill Using Tensorflow - WIP", - "url": "https://github.com/TREE-Ind/skill-voice-recognition", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [ - "Who are you speaking to?", - "Who are you speaking to" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 5, - "requirements": { - "python": [ - "tensorflow", - "tflearn" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Voice Recognition Skill", - "android_handler": "skill-voice-recognition.tree-ind.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-06-19T16:43:49Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-07-30T14:32:28Z", - "authorname": "martymulligan", - "skillname": "WeMo Skill", - "foldername": "skill-wemo", - "name": "WeMo Skill", - "url": "https://github.com/martymulligan/skill-wemo", - "category": null, - "description": "Control your wemo devices with voice commands.", - "short_description": "", - "branch": "master", - "examples": [ - "Discover my devices.", - "Turn on kitchen lights.", - "Turn off kitchen lights.", - "List my devices.", - "Toggle kitchen lights.", - "discover my devices", - "turn on kitchen lights", - "turn off kitchen lights", - "list my devices", - "toggle kitchen lights" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 5, - "credits": [ - "Marty Mulligan @martymulligan" - ], - "requirements": { - "python": [ - "pywemo" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Wemo Skill", - "android_handler": "skill-wemo.martymulligan.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-07-03T19:30:30Z", - "archived": false, - "license": "unknown", - "modified": "2018-08-16T18:39:29Z", - "authorname": "gerlachry", - "skillname": "Mycroft Todoist skill", - "foldername": "skill-todoist", - "name": "Mycroft Todoist skill", - "url": "https://github.com/gerlachry/skill-todoist", - "category": null, - "description": "Uses https://developer.todoist.com/?python#api-overviewapi APIs for creating tasks under a project.", - "short_description": "Uses https://developer.todoist.com/?python#api-overviewapi APIs for creating tasks under a project.", - "branch": "master", - "examples": [ - "Add milk to grocery list.", - "Add mowing lawn to outside list.", - "Add study Python to personal project.", - "add milk to grocery list", - "add mowing lawn to outside list", - "add study Python to personal project" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 3, - "requirements": { - "python": [ - "urllib3==1.21.1", - "requests==2.18.1", - "websocket-client==0.32.0", - "six==1.10.0", - "idna==2.5", - "mustache==0.1.4", - "configobj==5.0.6", - "mycroft-skills-sdk==0.1.20", - "pyee==1.0.1", - "chardet==3.0.4", - "todoist-python==7.0.17", - "certifi==2017.4.17", - "adapt-parser==0.2.1" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Todoist Skill", - "android_handler": "skill-todoist.gerlachry.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-11-03T21:57:23Z", - "archived": false, - "license": "mit", - "modified": "2019-10-21T20:06:59Z", - "authorname": "jrwarwick", - "skillname": "JIRA Agent", - "foldername": "jrwarwick-jira-agent-skill", - "name": "JIRA Agent", - "url": "https://github.com/jrwarwick/jrwarwick-jira-agent-skill", - "category": null, - "description": "Once configured to connect to your on-premises Atlassian JIRA server with Service Desk installed and with a dedicated service agent account (i.e., an ordinary JIRA user login with membership in the jira-servicedesk-users group, dedicated to the device), Mycroft will be able to answer some simple questions about open issues and allow you to raise a new issue through a dialogue. Your IT service desk will now be staffed even when you are at lunch. Or service desk technicians can send Mycroft to department status meetings on their behalf. Mycroft can be a part of your technical support team.", - "short_description": "", - "branch": "master", - "examples": [ - "How many JIRA issues are open?", - "How many JIRA issues are overdue?", - "JIRA status report!", - "_planned for future:", - "What is the most urgent service desk issue?", - "What is the status for service desk issue 22333?", - "How can I contact help desk staff?", - "Mycroft, how many JIRA issues are open?", - "Mycroft, how many JIRA issues are overdue?", - "Mycroft, JIRA status report!", - "_planned for future: Mycroft, raise a new JIRA service request for computer monitor replacement_", - "Mycroft, what is the most urgent service desk issue?", - "Mycroft, what is the status for service desk issue 22333?", - "Mycroft, how can I contact help desk staff?" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 3, - "credits": [ - "Justin Warwick\n\nhttps://github.com/MycroftAIhttps://mycroft.ai/\n\nhttps://github.com/pycontribs/jirahttps://pypi.python.org/pypi/jira/\n\nhttps://www.atlassian.com/software/jira" - ], - "requirements": { - "python": [ - "jira", - "pbr", - "python-dateutil" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Jrwarwick Jira Agent Skill", - "android_handler": "jrwarwick-jira-agent-skill.jrwarwick.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-08-11T15:14:30Z", - "archived": false, - "license": "unknown", - "modified": "2019-01-16T22:29:45Z", - "authorname": "JarbasAl", - "skillname": "Location Tracker Skill", - "foldername": "skill-location-tracker", - "name": "Location Tracker Skill", - "url": "https://github.com/JarbasAl/skill-location-tracker", - "category": null, - "description": "Updates device location, the mycroft home location configuration remains\nunchanged\n\n* gives you privacy (regarding mycroft.home)\n* skills that need location still work ( date time and weather correct by default, unified new selects correct feed)\n* fully configurable\n\nCurrent localization sources:\n\n* wifi geo - [google geolocation service](https://developers.google.com/maps/documentation/geolocation/get-api-key)\n* ip api - https://ipapi.co/json/\n* local ip database - https://dev.maxmind.com/geoip/legacy/geolite/", - "short_description": "", - "branch": "master", - "examples": [ - "Current location.", - "Activate location tracking.", - "Deactivate location tracking.", - "Update location.", - "Where am i?", - "Location is wrong." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 4, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Location Tracker Skill", - "android_handler": "skill-location-tracker.jarbasal.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-05-22T10:17:33Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-07-23T16:22:30Z", - "authorname": "Nold360", - "skillname": "mycroft-skill_email", - "foldername": "mycroft-skill_email", - "name": "mycroft-skill_email", - "url": "https://github.com/Nold360/mycroft-skill_email", - "category": null, - "description": "Simple Mycroft skill to check for new E-Mails using IMAP", - "short_description": "Simple Mycroft skill to check for new E-Mails using IMAP", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 3, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Skill_Email Skill", - "android_handler": "mycroft-skill_email.nold360.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-04-16T21:39:02Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-04-12T19:16:55Z", - "authorname": "chrison999", - "skillname": "mycroft-skill-cbc-news", - "foldername": "mycroft-skill-cbc-news", - "name": "mycroft-skill-cbc-news", - "url": "https://github.com/chrison999/mycroft-skill-cbc-news", - "category": null, - "description": "A skill my MycroftAI that plays the latest cbc (Canadian Broadcasting\nCorporation) news", - "short_description": "A skill my MycroftAI that plays the latest cbc (Canadian Broadcasting", - "branch": "master", - "examples": [ - "Cbc news.", - "Tell me cbc news.", - "Listen to cbc news.", - "Not* a bug with." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Cbc News Skill", - "android_handler": "mycroft-skill-cbc-news.chrison999.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-12-06T20:48:15Z", - "archived": false, - "license": "mit", - "modified": "2019-02-08T16:56:19Z", - "authorname": "MatthewScholefield", - "skillname": "Question Learner #", - "foldername": "skill-question-learner", - "name": "Question Learner", - "url": "https://github.com/MatthewScholefield/skill-question-learner", - "category": null, - "description": "This skill learns arbitrary data the user defines", - "short_description": "This skill learns arbitrary data the user defines", - "branch": "master", - "examples": [ - "What is my name?", - "What is my granmother's name?" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 7, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Question Learner Skill", - "android_handler": "skill-question-learner.matthewscholefield.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-10-05T08:38:57Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2018-05-10T15:52:02Z", - "authorname": "AIIX", - "skillname": "Audio-control-plasma", - "foldername": "audio-control-plasma", - "name": "Audio-control-plasma", - "url": "https://github.com/AIIX/audio-control-plasma", - "category": null, - "description": "#### Installation of skill:\n* Download or Clone Git (run: git clone https://github.com/AIIX/audio-control-plasma inside /opt/mycroft/skills)\n* Create /opt/mycroft/skills folder if it does not exist\n* Extract Downloaded Skill into a folder. \"audio-control-plasma\". (Clone does not require this step)\n* Copy the audio-control-plasma folder to /opt/mycroft/skills/ folder\n\n#### Installation of requirements:\n##### Fedora:\n- sudo dnf install dbus-python\n- From terminal: cp -R /usr/lib64/python2.7/site-packages/dbus* /home/$USER/.virtualenvs/mycroft/lib/python2.7/site-packages/\n- From terminal: cp /usr/lib64/python2.7/site-packages/_dbus* /home/$USER/.virtualenvs/mycroft/lib/python2.7/site-packages/\n\n##### Kubuntu / KDE Neon:\n- sudo apt install python-dbus\n- From terminal: cp -R /usr/lib/python2.7/dist-packages/dbus* /home/$USER/.virtualenvs/mycroft/lib/python2.7/site-packages/\n- From terminal: cp /usr/lib/python2.7/dist-packages/_dbus* /home/$USER/.virtualenvs/mycroft/lib/python2.7/site-packages/\n\n* For other distributions:\n- Python Dbus package is required and copying the Python Dbus folder and lib from your system python install over to /home/$USER/.virtualenvs/mycroft/lib/python2.7/site-packages/.", - "short_description": "", - "branch": "master", - "examples": [ - "Increase the volume.", - "Increase volume.", - "Increase to maximum volume.", - "Maximum volume.", - "Decrease the volume.", - "Decrease volume.", - "Decrease to minimum volume.", - "Minimum volume.", - "Increase the microphone volume.", - "Increase microphone volume.", - "Increase microphone to maximum volume.", - "Maximum microphone volume.", - "Decrease the microphone volume.", - "Decrease microphone volume.", - "Decrease microphone to minimum volume.", - "Minimum microphone volume.", - "Hey Mycroft, increase the volume ", - "Hey Mycroft, increase volume ", - "Hey Mycroft, decrease the volume ", - "Hey Mycroft, decrease volume " - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "credits": [ - "(AIX) Aditya Mehra" - ], - "requirements": { - "python": [ - "dbus-python" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Audio Control Plasma Skill", - "android_handler": "audio-control-plasma.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-08-24T23:10:37Z", - "archived": false, - "license": "agpl-3.0", - "modified": "2019-12-22T21:23:16Z", - "authorname": "skeledrew", - "skillname": "Brain Skill", - "foldername": "brain-skill", - "name": "Brain Skill", - "url": "https://github.com/skeledrew/brain-skill", - "category": null, - "description": "Essentially [Tasker](http://tasker.dinglisch.net/) for [Mycroft AI](https://mycroft.ai/), to help automate ALL THE THINGS. 'nuff said. NB: This is an early work in progress.", - "short_description": "", - "branch": "master", - "examples": [ - "Announce I have so much potential.", - "Brain scan.", - "Echo whatever you want it to", - "Test to see if anything went wrong that was caught", - "Reload abilities", - "Eye actions", - "Check core version", - "Create thought chains in settings.json to execute multiple abilities at a single keyword/phrase (will be voice automated soon)", - "[^] Mark 1 enclosure specific" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 4, - "credits": [ - "skeledrew" - ], - "requirements": { - "python": [ - "pexpect", - "colour", - "future" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Brain Skill", - "android_handler": "brain-skill.skeledrew.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2016-06-29T13:26:42Z", - "archived": false, - "license": "gpl-2.0", - "modified": "2019-02-08T17:21:28Z", - "authorname": "the7erm", - "skillname": "mycroft-skill-simple-media-controls", - "foldername": "mycroft-skill-simple-media-controls", - "name": "mycroft-skill-simple-media-controls", - "url": "https://github.com/the7erm/mycroft-skill-simple-media-controls", - "category": null, - "description": "This is a 3rd party skill that adds simple media controls, play, pause, prev, next mapped to shell commands. This will allow you to use whatever program you like as long as you can write a script.\n\nIf you're looking for a good mpg123/spotify/mopidy mycroft skill try this one https://github.com/forslund/mycroft-media-skills\n\nI prefer to to use [fmp](https://github.com/the7erm/fmp-pg) and just wanted to write a dumb wrapper to run a script that did most of the heavy lifting.\n\nThe commands are simple.\n\n mycroft play\n\n During testing mycroft misunderstood the word pause a lot.\n mycroft pause\n paws\n posh\n pawn\n polish\n boss\n cars\n\n mycroft next\n\n mycroft previous\n\n mycroft what's playing?\n what is playing?\n what am I listening to?\n what is this song?\n what is this file?\n who is this?\n what band is this?", - "short_description": "This is a 3rd party skill that adds simple media controls, play, pause, prev, next mapped to shell commands. This will allow you to use whatever program you like as long as you can write a script.", - "branch": "master", - "examples": [ - "[", - "[" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Simple Media Controls Skill", - "android_handler": "mycroft-skill-simple-media-controls.the7erm.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-06-06T19:36:04Z", - "archived": false, - "license": "unknown", - "modified": "2018-11-01T18:28:28Z", - "authorname": "AIIX", - "skillname": "unsplash-wallpaper-plasma-skill", - "foldername": "unsplash-wallpaper-plasma-skill", - "name": "", - "url": "https://github.com/AIIX/unsplash-wallpaper-plasma-skill", - "category": null, - "description": "This skill allows users to use unsplash images as wallpapers based on their category of choice (nature, sports, aircrafts, etc) on the plasma desktop.\n\n#### Installation of skill:\n\n#### Installation of requirements:\n##### Fedora: \n\n##### Kubuntu / KDE Neon: \n\n\n##### How To Use:\nDownload or Clone Git\n * Create /opt/mycroft/skills folder if it does not exist\n * Extract Downloaded Skill into a folder. unsplash-wallpaper-plasma-skill. (Clone does not require this step)\n * Copy the unsplash-wallpaper-plasma-skill folder to /opt/mycroft/skills/ folder\n * sudo dnf install dbus-python\n * From terminal: cp -R /usr/lib64/python2.7/site-packages/dbus* /home/$USER/.virtualenvs/mycroft/lib/python2.7/site-packages/\n * From terminal: cp /usr/lib64/python2.7/site-packages/_dbus* /home/$USER/.virtualenvs/mycroft/lib/python2.7/site-packages/\n * sudo apt install python-dbus\n * From terminal: cp -R /usr/lib/python2.7/dist-packages/dbus* /home/$USER/.virtualenvs/mycroft/lib/python2.7/site-packages/\n * From terminal: cp /usr/lib/python2.7/dist-packages/_dbus* /home/$USER/.virtualenvs/mycroft/lib/python2.7/site-packages/\n * For other distributions:\n * Python Dbus and Python Psutil package is required and copying the Python Dbus folder and lib from your system python install over to /home/$USER/.virtualenvs/mycroft/lib/python2.7/site-packages/.\n * Hey Mycroft, change wallpaper type aircrafts\n * Hey Mycroft, change wallpaper abstract\n * Hey Mycroft, new wallpaper type nature\n * Hey Mycroft, new wallpaper sports ", - "short_description": "This skill allows users to use unsplash images as wallpapers based on their category of choice (nature, sports, aircrafts, etc) on the plasma desktop.", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Unsplash Wallpaper Plasma Skill", - "android_handler": "unsplash-wallpaper-plasma-skill.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-10-12T14:00:50Z", - "archived": false, - "license": "unknown", - "modified": "2018-04-14T16:05:38Z", - "authorname": "ldevalbray", - "skillname": "Mycroft-Social-Network-Manager", - "foldername": "mycroft-social-network-manager", - "name": "Mycroft-Social-Network-Manager", - "url": "https://github.com/ldevalbray/mycroft-social-network-manager", - "category": null, - "description": "Mycroft-Social-Network-Manager is a *skill* developped for [Mycroft][mycroftwebsite]\n\n### Description\n\n> It permits the user to manage his social networks\n> (for now, Twitter and Facebook)\n> through Mycroft personal assistant\n> WITH YOUR VOICE !\n\n### Usage\n\nThanks to Mycroft-Social-Network-Manager, you can interact with Mycroft in such ways :\n\n*The following works with both **Twitter and Facebook**, the skill will ask you on which social network you want to perform the action ! (Facebook, Twitter or Facebook and Twitter | both)*\n\n >Login\n\n >Logout\n >Message [message_text] to [friend_name]\n\n >Send [message_text] to [friend_name]\n \n >Text [message_text] to [friend_name]\n >Post [message_text] \n\n >Publish [message_text] \n >Share [message_text] to [friend_name]\n\n*The following works with **Facebook** only*\n\n >Comment [message_text] on [friend_name] profile picture\n\n >Comment [message_text] on [friend_name] pic\n \n >Comment [message_text] on [friend_name] photo\n\n >Like the profile picture of [friend_name]\n\n >Like the pic of [friend_name]\n \n >Like the photo of [friend_name]\n\n >How many friends do I have on Facebook ?\n\n*The following works with **Twitter** only*\n\n >Retweet [friend_name] \n\n >Get the last tweet of [friend_name]\n\n\n### Installation\n\nMycroft-Social-Network-Manager requires [Mycroft-core](https://mycroft.ai/get-started/) to run.\n\nIn order to install the skill :\n\n```sh\n$ cd mycroft-core/msm/\n$ ./msm install https://github.com/ldevalbray/mycroft-social-network-manager\n```\n\nInstalling Mycroft-Social-Network-Manager skill should automatically install [browser_service](https://github.com/JarbasAl/browser_service), another skill that you'll need to run Mycroft-Social-Network-Manager. \n\nHowever, browser_service should be made into a priority skill in the mycroft config file :\n\n```sh\n$ cd mycroft-core/mycroft/configuration/\n```\n\nOpen the **mycroft.conf** file with your favourite text editor\n\n```sh\n // General skill values\n \"skills\": {\n ...\n // priority skills to be loaded first\n \"priority_skills\": [\"skill-pairing\", \"browser_service\"],\n ...\n },\n```\n\n### Requirements\n\nIn order to run the skill you will need to create two apps, one on Facebook and one on Twitter.\n\nOnce this done, you will need to configure **facebook login module** on the facebook app and configure it for **devices** (Activate \"\nLogin from Devices\" in your Facebook Login settings).\n\nThen, all what's left to do is enter those informations in [Mycroft Home](https://home.mycroft.ai/)\n\n```sh\n {\n \"name\": \"LoginFB\",\n \"fields\": [\n {\n \"name\": \"FacebookEmail\",\n \"type\": \"email\",\n \"label\": \"Email\",\n \"value\": \"\"\n },\n {\n \"name\": \"FacebookPassword\",\n \"type\": \"password\",\n \"label\": \"Password\",\n \"value\": \"\"\n },\n {\n \"name\": \"fbAppAccessToken\",\n \"type\": \"text\",\n \"label\": \"Facebook App Access Token\",\n \"value\": \"\"\n }\n ]\n },\n {\n \"name\": \"LoginTW\",\n \"fields\": [\n {\n \"name\": \"TwitterEmail\" ,\n \"type\": \"email\",\n \"label\": \"Email\",\n \"value\": \"\"\n },\n {\n \"name\": \"TwitterPassword\",\n \"type\": \"password\",\n \"label\": \"Password\",\n \"value\": \"\"\n },\n {\n \"name\": \"TwitterPhoneNumber\",\n \"type\": \"text\",\n \"label\": \"Phone Number\",\n \"value\": \"\"\n },\n {\n \"name\": \"twConsumerKey\",\n \"type\": \"text\",\n \"label\": \"Twitter App Consumer Key\",\n \"value\": \"\"\n },\n {\n \"name\": \"twConsumerSecret\",\n \"type\": \"text\",\n \"label\": \"Twitter App Consumer Secret\",\n \"value\": \"\"\n }\n ]\n }\n\n```\n\nNOTE : The **Facebook App Access Token** is your app id concatenated with your client token (can be found in the app advanced settings) : **[your_app_id|client_Token]**\n\nIn order for the skill to fully work, all those informations should be entered.\n\n### Testing\n\nFor testing, we use [Mycroft automatic testing](https://mycroft.ai/documentation/skills/automatic-testing/).\nAll the tests are in *mycroft-social-network-manager/test/intent/*\n\nIn order to test the skill, you will need to **switch branch** on Mycroft-core to [feature/carstens-skill-tester](https://github.com/MycroftAI/mycroft-core/tree/feature/carstens-skill-tester)\n\n```sh\ngit checkout origin/feature/carstens-skill-tester\n```\n\n(You'll maybe need to redo the changes to **mycroft.conf** we've done in the master/dev branch about the priority skills --> see *Instalation*)\n\nThen, **go to** *mycroft-core/test/integrationtests/skills/*, **start** *Mycroft virtualenv* and **run** *skill_developers_testrunner.py*\n\n```sh\ncd /test/integrationtests/skills/\nworkon mycroft\npython skill_developers_testrunner.py\n```\n\nThis should run the tests\n\n### Tech\n\nMycroft-Social-Network-Manager uses a number of open source projects and languages to work properly:\n\n\nAnd of course Mycroft-Social-Network-Manager itself is open source with a [public repository][public-repo] on GitHub.\n\n\n\n [mycroftwebsite]: \n [public-repo]:\nLogin to twitter and facebook\n * Logout from twitter and facebook ( !! Be careful with the use of logout, it will erase the facebook and twitter app access tokens you have entered in Mycroft Home !! )\n * Send a message to a friend\n * Post / tweet something on your wall\n * Post / tweet something to a friend's wall (tags the friend in your tweet on Tweeter)\n * Comment something on a friend profile picture\n * Like a friend profile picture\n * Know your number of friends of Facebook\n * Retweet the last tweet of a friend\n * Reads the last tweet of a friend\n * [Python] - The Mycroft language\n * [python-twitter] - A Twitter SDK made for Python\n * [Facebook SDK for Python] - A Facebook SDK made for Python\n * [Selenium] - Using selenium threw a Mycroft skill called browser_service\n * [fbchat] - Library that uses Selenium to send messages to facebook friends\n * [Levenshtein] - In order to compare Strings", - "short_description": "Mycroft-Social-Network-Manager is a *skill* developped for [Mycroft][mycroftwebsite]", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "requirements": { - "python": [ - "oauth2", - "python-levenshtein", - "git+https://github.com/JarbasAl/mycroft_jarbas_utils", - "requests", - "fbchat", - "python-twitter", - "facebook-sdk", - "datetime" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Social Network Manager Skill", - "android_handler": "mycroft-social-network-manager.ldevalbray.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-10-24T16:17:12Z", - "archived": false, - "license": "unknown", - "modified": "2018-02-27T08:08:55Z", - "authorname": "tjoen", - "skillname": "Dutch Radio skill", - "foldername": "skill-dutch-radio", - "name": "Dutch Radio skill", - "url": "https://github.com/tjoen/skill-dutch-radio", - "category": null, - "description": "This skill streams radio from urls.\nChange the csv to add or change channels in to your own language.\n\nAdd or change urls with streams you like from http://www.hendrikjansen.nl/henk/streaming.html\n\nIt is based upon https://github.com/forslund/mycroft-media-skills/tree/master/swedishradio", - "short_description": "This skill streams radio from urls.", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Dutch Radio Skill", - "android_handler": "skill-dutch-radio.tjoen.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-11-22T04:00:13Z", - "archived": false, - "license": "unknown", - "modified": "2017-12-15T09:27:07Z", - "authorname": "WeltgeistNull", - "skillname": "OBD-II Skill for Mycroft AI", - "foldername": "skill-obd2-codes", - "name": "OBD-II Skill for Mycroft AI", - "url": "https://github.com/WeltgeistNull/skill-obd2-codes", - "category": null, - "description": "by Weltgeist, November-21-2017\n\nThis skill will give Mycroft knowledge about OBD-II PID codes. It is intended to help you diagonse your vehicle. This use case of this skill may change in the future.\n\nThis is part of a broader project to bring Mycroft into the automotive world.", - "short_description": "by Weltgeist, November-21-2017", - "branch": "master", - "examples": [ - "2 code?" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Obd2 Codes Skill", - "android_handler": "skill-obd2-codes.weltgeistnull.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-11-21T20:14:49Z", - "archived": false, - "license": "apache-2.0", - "modified": "2018-05-29T00:11:12Z", - "authorname": "edguy3", - "skillname": "AsteriskCliSkill", - "foldername": "AsteriskCliSkill", - "name": "AsteriskCliSkill", - "url": "https://github.com/edguy3/AsteriskCliSkill", - "category": null, - "description": "This skill provides a connection to an asterisk manager interface such \nthat incoming caller id names will be vocalized by mycroft. \n\nCan also ask \"Who was the last caller\" or \"who is calling\" to review the previous caller.", - "short_description": "This skill provides a connection to an asterisk manager interface such ", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "requirements": { - "python": [ - "websocket-client ", - "asterisk-ami " - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Asteriskcliskill Skill", - "android_handler": "AsteriskCliSkill.edguy3.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-07-11T04:49:58Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-12-18T05:03:33Z", - "authorname": "AIIX", - "skillname": "clarifai-image-recognition-skill", - "foldername": "clarifai-image-recognition-skill", - "name": "clarifai-image-recognition-skill", - "url": "https://github.com/AIIX/clarifai-image-recognition-skill", - "category": null, - "description": "This skill enables Image Recognition for Mycroft based on Clarifai's free Image Recognition api.\n\n#### Installation of skill:\n\n#### Installation of requirements:\n\n##### How To Use: \n\n###### Note: To use your own API Key / Secret Key Pairs make the change in __init__.py.\nDownload or Clone Git\n * Create /opt/mycroft/skills folder if it does not exist\n * Extract Downloaded Skill into a folder. clarifai-image-recognition-skill. (Clone does not require this step)\n * Copy the clarifai-image-recognition-skill folder to /opt/mycroft/skills/ folder\n * pip install clarifai\n * search image url {URL}", - "short_description": "This skill enables Image Recognition for Mycroft based on Clarifai's free Image Recognition api.", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "requirements": { - "python": [ - "clarifai " - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Clarifai Image Recognition Skill", - "android_handler": "clarifai-image-recognition-skill.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-10-17T23:38:17Z", - "archived": false, - "license": "unknown", - "modified": "2018-06-12T10:23:27Z", - "authorname": "reginaneon", - "skillname": "CaffeineWiz", - "foldername": "CaffeineWiz", - "name": "CaffeineWiz", - "url": "https://github.com/reginaneon/CaffeineWiz", - "category": null, - "description": "The skill provides the functionality to inform the user of the caffeine content of the requested\ndrink. Multiple drinks in a row are possible.\n\nSample skill flow:\n\n- Hey Mycroft, tell me caffeine content of *drink*? / how much caffeine is in *drink*?\n- The drink {{drink}} has {{caffeine_content}} milligrams of caffeine in {{drink_size}} ounces.\nSay how about caffeine content of another drink or say goodbye.\n- Goodbye / that's all / we're done\n- Goodbye. Stay caffeinated!\n\nor -\n\n- How about caffeine content of *drink*?\n- The drink {{drink}} has {{caffeine_content}} milligrams of caffeine in {{drink_size}} ounces.", - "short_description": "", - "branch": "master", - "examples": [ - "Tell me caffeine content of *drink*?", - "How much caffeine is in *drink*?", - "tell me caffeine content of *drink*? ", - "how much caffeine is in *drink*?" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "reginaneon\nguydaniels\ngras64" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Caffeinewiz Skill", - "android_handler": "CaffeineWiz.reginaneon.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-05-20T11:31:22Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2017-06-10T19:41:28Z", - "authorname": "Skills-And-Translations", - "skillname": "mycroft-calculate-skill", - "foldername": "mycroft-calculate-skill", - "name": "mycroft-calculate-skill", - "url": "https://github.com/Skills-And-Translations/mycroft-calculate-skill", - "category": null, - "description": "This skill is very in a beginn! Joining welcomed.\n\nThe sense of this skill is the following: At the moment, when you ask \"whats 1 + 1\", the wolfram alpha-search-engine will give you kind of fallback-response.\n\nCalculating math's is no problem for python, so why not doing this stuff on mycroft's cpu itself?\n\nShould\n\n\n#### Installation of skill:\n\n\n##### How To Use: \n###### Plus and minus\n\n###### divide\n\n###### constants\n\n###### functions\nsave response-time\n * allow offline query (due to speech to text, for the only real offline-scenario you have to chat)\n * Download or Clone Git\n * Create /opt/mycroft/skills folder if it does not exist\n * Copy the mycroft-calculate-skill folder to /opt/mycroft/skills/ folder\n * Hey Mycroft, calc 1 + 1\n * Hey Mycroft, calculate 3 - 5\n * Hey Mycroft, divide 3 with 3\n * Hey Mycroft, divide 9 through 2\n * Hey Mycroft, what is pi\n * Hey Mycroft, whats pi\n * Hey Mycroft, square of 3\n * Hey Mycroft, square of 9", - "short_description": "This skill is very in a beginn! Joining welcomed.", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Calculate Skill", - "android_handler": "mycroft-calculate-skill.skills-and-translations.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-11-28T13:32:40Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2017-12-08T08:54:08Z", - "authorname": "AIIX", - "skillname": "KDE-Kate-Control", - "foldername": "kde-kate-control", - "name": "KDE-Kate-Control", - "url": "https://github.com/AIIX/kde-kate-control", - "category": null, - "description": "#### Installation of skill:\n* Download or Clone Git (run: git clone https://github.com/AIIX/kde-kate-control inside /opt/mycroft/skills)\n* Create /opt/mycroft/skills folder if it does not exist\n* Extract Downloaded Skill into a folder. \"kde-kate-control\". (Clone does not require this step)\n* Copy the kde-kate-control folder to /opt/mycroft/skills/ folder\n\n#### Installation of requirements:\n##### Fedora:\n- sudo dnf install dbus-python\n- From terminal: cp -R /usr/lib64/python2.7/site-packages/dbus* /home/$USER/.virtualenvs/mycroft/lib/python2.7/site-packages/\n- From terminal: cp /usr/lib64/python2.7/site-packages/_dbus* /home/$USER/.virtualenvs/mycroft/lib/python2.7/site-packages/\n\n##### Ubuntu / KDE Neon:\n- sudo apt install python-dbus\n- From terminal: cp -R /usr/lib/python2.7/dist-packages/dbus* /home/$USER/.virtualenvs/mycroft/lib/python2.7/site-packages/\n- From terminal: cp /usr/lib/python2.7/dist-packages/_dbus* /home/$USER/.virtualenvs/mycroft/lib/python2.7/site-packages/\n\n* For other distributions:\n- Python Dbus package is required and copying the Python Dbus folder and lib from your system python install over to /home/$USER/.virtualenvs/mycroft/lib/python2.7/site-packages/.", - "short_description": "", - "branch": "master", - "examples": [ - "Create new file.", - "Close file.", - "Save documents.", - "Goto next tab.", - "Goto previous tab.", - "Split view horizontally.", - "Split view vertically.", - "Goto next view.", - "Goto previous view.", - "Show config.", - "Hey Mycroft, create new file ", - "Hey Mycroft, close file ", - "Hey Mycroft, save documents ", - "Hey Mycroft, goto next tab ", - "Hey Mycroft, goto previous tab ", - "Hey Mycroft, split view horizontally ", - "Hey Mycroft, split view vertically ", - "Hey Mycroft, goto next view ", - "Hey Mycroft, goto previous view ", - "Hey Mycroft, show config " - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "(AIX) Aditya Mehra" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Kde Kate Control Skill", - "android_handler": "kde-kate-control.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2016-09-05T03:48:15Z", - "archived": false, - "license": "unknown", - "modified": "2018-03-25T16:24:56Z", - "authorname": "praxeo", - "skillname": "mycroft_spaceflightnow_skill", - "foldername": "mycroft_spaceflightnow_skill", - "name": "mycroft_spaceflightnow_skill", - "url": "https://github.com/praxeo/mycroft_spaceflightnow_skill", - "category": null, - "description": "A skill that lets Mycroft answer the question, \"When is the next space launch?\" He does this by scraping the page at SpaceflightNow.com/launch-schedule", - "short_description": "A skill that lets Mycroft answer the question, \"When is the next space launch?\" He does this by scraping the page at SpaceflightNow.com/launch-schedule", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft_Spaceflightnow_Skill Skill", - "android_handler": "mycroft_spaceflightnow_skill.praxeo.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-10-31T12:00:04Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2017-10-31T12:02:05Z", - "authorname": "AIIX", - "skillname": "KDE-Konversation-Control", - "foldername": "kde-konversation-control", - "name": "KDE-Konversation-Control", - "url": "https://github.com/AIIX/kde-konversation-control", - "category": null, - "description": "#### Installation of skill:\n* Download or Clone Git (run: git clone https://github.com/AIIX/kde-konversation-control inside /opt/mycroft/skills)\n* Create /opt/mycroft/skills folder if it does not exist\n* Extract Downloaded Skill into a folder. \"kde-konversation-control\". (Clone does not require this step)\n* Copy the kde-konversation-control folder to /opt/mycroft/skills/ folder\n\n#### Installation of requirements:\n##### Fedora:\n- sudo dnf install dbus-python\n- From terminal: cp -R /usr/lib64/python2.7/site-packages/dbus* /home/$USER/.virtualenvs/mycroft/lib/python2.7/site-packages/\n- From terminal: cp /usr/lib64/python2.7/site-packages/_dbus* /home/$USER/.virtualenvs/mycroft/lib/python2.7/site-packages/\n\n##### Ubuntu / KDE Neon:\n- sudo apt install python-dbus\n- From terminal: cp -R /usr/lib/python2.7/dist-packages/dbus* /home/$USER/.virtualenvs/mycroft/lib/python2.7/site-packages/\n- From terminal: cp /usr/lib/python2.7/dist-packages/_dbus* /home/$USER/.virtualenvs/mycroft/lib/python2.7/site-packages/\n\n* For other distributions:\n- Python Dbus package is required and copying the Python Dbus folder and lib from your system python install over to /home/$USER/.virtualenvs/mycroft/lib/python2.7/site-packages/.", - "short_description": "", - "branch": "master", - "examples": [ - "Show Konversation.", - "Quit Konversation.", - "Show Konversation Server List.", - "Manage Konversation Identity.", - "Hey Mycroft, Show Konversation ", - "Hey Mycroft, Quit Konversation ", - "Hey Mycroft, Show Konversation Server List ", - "Hey Mycroft, Manage Konversation Identity " - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "(AIX) Aditya Mehra" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Kde Konversation Control Skill", - "android_handler": "kde-konversation-control.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-06-01T17:52:55Z", - "archived": false, - "license": "unknown", - "modified": "2017-06-02T05:21:31Z", - "authorname": "eClarity", - "skillname": "Allergy Tracker Skill for Mycroft", - "foldername": "skill-pollen", - "name": "Allergy Tracker Skill for Mycroft", - "url": "https://github.com/eClarity/skill-pollen", - "category": null, - "description": "Based off of another allergy scraper that no longer works.\n\nThis is a skill to add https://weather.com/ allergy tracker support to\n[Mycroft](https://mycroft.ai). Currently you can ask for breathing comfort level and allergen levels", - "short_description": "Based off of another allergy scraper that no longer works.", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [ - "beautifulsoup" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Pollen Skill", - "android_handler": "skill-pollen.eclarity.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-10-23T18:14:29Z", - "archived": false, - "license": "apache-2.0", - "modified": "2017-10-23T18:15:28Z", - "authorname": "TREE-Ind", - "skillname": "calculator", - "foldername": "calculator-skill", - "name": "calculator", - "url": "https://github.com/TREE-Ind/calculator-skill", - "category": null, - "description": "This skill provides a way to perform interactive and running calculations by voice.", - "short_description": "", - "branch": "master", - "examples": [ - "Do some math.", - "Say first number: 4.", - "Say second number: 5.", - "Say operation: add.", - "Say next operation: add 50.", - "do some math", - "say first number: 4", - "say second number: 5", - "say operation: add", - "say next operation: add 50" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "TREE Industries" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Calculator Skill", - "android_handler": "calculator-skill.tree-ind.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-03-04T14:09:02Z", - "archived": false, - "license": "lgpl-3.0", - "modified": "2018-07-02T12:16:07Z", - "authorname": "BongoEADGC6", - "skillname": "Home Assistant Skill for Mycroft", - "foldername": "mycroft-home-assistant", - "name": "Home Assistant Skill for Mycroft", - "url": "https://github.com/BongoEADGC6/mycroft-home-assistant", - "category": null, - "description": "Due to my lack of time, this project has been taken up by https://github.com/btotharye/mycroft-homeassistant and is now the upstream repo. \n\nThis is a skill to add [Home Assistant](https://home-assistant.io) support to\n[Mycroft](https://mycroft.ai). Currently is supports turning on and off several\nentity types (`light`, `switch`, `scene` and `input_boolean`).", - "short_description": "Due to my lack of time, this project has been taken up by https://github.com/btotharye/mycroft-homeassistant and is now the upstream repo. ", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [ - "fuzzywuzzy==0.14.0", - "requests>=2.10.0", - "python-Levenshtein==0.12.0" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Home Assistant Skill", - "android_handler": "mycroft-home-assistant.bongoeadgc6.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-07-06T23:43:08Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2017-11-22T13:10:50Z", - "authorname": "ChristopherRogers1991", - "skillname": "mycroft-speedtest", - "foldername": "mycroft-speedtest", - "name": "mycroft-speedtest", - "url": "https://github.com/ChristopherRogers1991/mycroft-speedtest", - "category": null, - "description": "A Mycroft skill for running speedtests", - "short_description": "A Mycroft skill for running speedtests", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [ - "pyspeedtest" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Speedtest Skill", - "android_handler": "mycroft-speedtest.christopherrogers1991.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-07-06T13:29:28Z", - "archived": false, - "license": "apache-2.0", - "modified": "2017-07-06T13:39:47Z", - "authorname": "lowel0", - "skillname": "MQTT for MycroftAI", - "foldername": "mycroft-mymqtt", - "name": "MQTT for MycroftAI", - "url": "https://github.com/lowel0/mycroft-mymqtt", - "category": null, - "description": "This is a skill written for mycroft to publish commands over an mqtt broker for home automation or any other purpose.\nRevised from \"git clone https://github.com/jamiehoward430/mycroft-mymqtt.git\"", - "short_description": "This is a skill written for mycroft to publish commands over an mqtt broker for home automation or any other purpose.", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Mymqtt Skill", - "android_handler": "mycroft-mymqtt.lowel0.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-11-16T13:08:15Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2018-07-21T17:12:08Z", - "authorname": "AIIX", - "skillname": "plasma-mycroft-applet-control", - "foldername": "plasma-mycroft-applet-control", - "name": "plasma-mycroft-applet-control", - "url": "https://github.com/AIIX/plasma-mycroft-applet-control", - "category": null, - "description": "Control and Navigate Plasma-Mycroft Plasmoid and Additional Internal Functions.", - "short_description": "", - "branch": "master", - "examples": [ - "Show widget.", - "Show skills.", - "Show installable skills.", - "Hey Mycroft, show widget", - "Hey Mycroft, show skills", - "Hey Mycroft, show installable skills" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Aix" - ], - "requirements": { - "python": [ - "python-xlib", - "dbus-python" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Plasma Mycroft Applet Control Skill", - "android_handler": "plasma-mycroft-applet-control.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-08-29T21:46:47Z", - "archived": false, - "license": "lgpl-3.0", - "modified": "2017-08-29T21:50:21Z", - "authorname": "deevrek", - "skillname": "Home Assistant Skill for Mycroft", - "foldername": "homeassistant-skill", - "name": "Home Assistant Skill for Mycroft", - "url": "https://github.com/deevrek/homeassistant-skill", - "category": null, - "description": "[![Stories in Ready](https://badge.waffle.io/btotharye/mycroft-homeassistant.svg?label=ready&title=Ready)](http://waffle.io/btotharye/mycroft-homeassistant)\n\nbased off the original code from https://github.com/BongoEADGC6/mycroft-home-assistant, spun off my own version since they seem to be inactive.\n\nThis is a skill to add [Home Assistant](https://home-assistant.io) support to\n[Mycroft](https://mycroft.ai). Currently is supports turning on and off several\nentity types (`light`, `switch`, `scene`, `groups` and `input_boolean`).", - "short_description": "[![Stories in Ready](https://badge.waffle.io/btotharye/mycroft-homeassistant.svg?label=ready&title=Ready)](http://waffle.io/btotharye/mycroft-homeassistant)", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "fuzzywuzzy==0.14.0", - "python-Levenshtein==0.12.0" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Homeassistant Skill", - "android_handler": "homeassistant-skill.deevrek.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-07-03T16:24:57Z", - "archived": false, - "license": "apache-2.0", - "modified": "2018-08-29T18:29:59Z", - "authorname": "MycroftAI", - "skillname": "Platform Patch", - "foldername": "skill-platform-patch", - "name": "Platform Patch", - "url": "https://github.com/MycroftAI/skill-platform-patch", - "category": "Configuration", - "description": "Some of the earliest shipping Mark 1 devices require this platform patch in order to begin automatically updating. \n\nYou can tell if you need the patch by following this guide:\n\n```\nHey Mycroft, install version checker\n\"Attempting to install\"\n```\n(wait a minute)\n```\nHey Mycroft, what version are you running?\n\"I'm runing mycroft-core version 0.8.19\"\n```\nIf your version is less than 0.9.0, you should install this platform patch.", - "short_description": "Updates original Mark 1 devices so they can upgrade to the latest version of Mycroft.", - "branch": "master", - "examples": [ - "Install platform patch.", - "install platform patch" - ], - "tags": [ - "mark1", - "patch", - "Configuration", - "mycroft-mark1", - "update", - "platform-patch", - "no-license" - ], - "platforms": [ - "platform_mark1" - ], - "stars": 1, - "icon": "https://rawgithub.com/FortAwesome/Font-Awesome/master/advanced-options/raw-svg/solid/cog.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Platform Patch Skill", - "android_handler": "skill-platform-patch.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-05-23T00:23:54Z", - "archived": false, - "license": "unknown", - "modified": "2018-09-11T21:41:28Z", - "authorname": "gregmccoy", - "skillname": "Mycroft Slack Skill - Under development", - "foldername": "skill-slack", - "name": "Mycroft Slack Skill - Under development", - "url": "https://github.com/gregmccoy/skill-slack", - "category": null, - "description": "Warning it is very buggy right now use at your own risk\n\nUse Mycroft as a bot on slack and use mycroft to send messages over slack. Mycroft will reply to messages over slack.", - "short_description": "Warning it is very buggy right now use at your own risk", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Slack Skill", - "android_handler": "skill-slack.gregmccoy.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-04-16T23:45:20Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2018-02-01T19:35:33Z", - "authorname": "chrison999", - "skillname": "mycroft-skill-fox-news", - "foldername": "mycroft-skill-fox-news", - "name": "mycroft-skill-fox-news", - "url": "https://github.com/chrison999/mycroft-skill-fox-news", - "category": null, - "description": "A skill for MycroftAI that plays the latest fox news.", - "short_description": "A skill for MycroftAI that plays the latest fox news.", - "branch": "master", - "examples": [ - "Fox news please.", - "Tell me fox news.", - "I want to listen to fox news.", - "Play fox news." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Fox News Skill", - "android_handler": "mycroft-skill-fox-news.chrison999.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2016-07-12T07:13:23Z", - "archived": false, - "license": "apache-2.0", - "modified": "2018-08-18T22:40:01Z", - "authorname": "cbenning", - "skillname": "kodi-skill", - "foldername": "kodi-skill", - "name": "kodi-skill", - "url": "https://github.com/cbenning/kodi-skill", - "category": null, - "description": "A Mycroft skill which facilitates the controlling of a remote (or local) kodi instance through voice commands", - "short_description": "A Mycroft skill which facilitates the controlling of a remote (or local) kodi instance through voice commands", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Kodi Skill", - "android_handler": "kodi-skill.cbenning.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-05-31T01:21:52Z", - "archived": false, - "license": "mit", - "modified": "2018-05-18T10:13:31Z", - "authorname": "eClarity", - "skillname": "Twitter skill", - "foldername": "mycroft-twitter-skill", - "name": "Twitter skill", - "url": "https://github.com/eClarity/mycroft-twitter-skill", - "category": null, - "description": "Currently skill gets the follower count of the user that is specified in the mycroft.conf file. It also gets the current amount of followers for the president.", - "short_description": "Currently skill gets the follower count of the user that is specified in the mycroft.conf file. It also gets the current amount of followers for the president.", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "tweepy" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Twitter Skill", - "android_handler": "mycroft-twitter-skill.eclarity.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-05-30T19:58:53Z", - "archived": false, - "license": "unknown", - "modified": "2017-07-03T13:52:50Z", - "authorname": "eClarity", - "skillname": "Open States Skill for Mycroft", - "foldername": "skill-openstates", - "name": "Open States Skill for Mycroft", - "url": "https://github.com/eClarity/skill-openstates", - "category": null, - "description": "based off the OpenStates.org python library\n\nThis is a skill to add [Open States](https://openstates.org/) support to\n[Mycroft](https://mycroft.ai). This skill currently supports searching for bills by state, Retrieving a list of state senators and house member by state, search committees by state, search districts by state. Get information on a legislator via name search. Some of the retrieved information is still in a rough state, and will be improved over time.", - "short_description": "based off the OpenStates.org python library", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [ - "pyopenstates", - "us" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Openstates Skill", - "android_handler": "skill-openstates.eclarity.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2016-05-26T00:29:22Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2016-05-26T00:34:38Z", - "authorname": "jaevans", - "skillname": "FortuneSkill", - "foldername": "mycroft-fortuneskill", - "name": "FortuneSkill", - "url": "https://github.com/jaevans/mycroft-fortuneskill", - "category": null, - "description": "This is just a simple [Mycroft](https://mycroft.ai) skill that reads the output of the `fortune` program. My first attempt to learn the `skill-sdk`.\n\n`fortune-mod` must be installed for the skill to work. There's not currently any error checking, or interaction beyond starting the skill.", - "short_description": "This is just a simple [Mycroft](https://mycroft.ai) skill that reads the output of the `fortune` program. My first attempt to learn the `skill-sdk`.", - "branch": "master", - "examples": [ - "Tell me my fortune.", - "Read me a fortune.", - "Tell my fortune.", - "Tell me a fortune.", - "Mycroft, tell me my fortune", - "Mycroft, read me a fortune", - "Mycroft, tell my fortune", - "Mycroft, tell me a fortune" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Fortuneskill Skill", - "android_handler": "mycroft-fortuneskill.jaevans.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-02-27T06:43:50Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2017-02-27T06:47:05Z", - "authorname": "Nold360", - "skillname": "", - "foldername": "mycroft_skill-drive_servos", - "name": "", - "url": "https://github.com/Nold360/mycroft_skill-drive_servos", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft_Skill Drive_Servos Skill", - "android_handler": "mycroft_skill-drive_servos.nold360.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-07-18T00:38:39Z", - "archived": false, - "license": "unknown", - "modified": "2017-07-20T03:25:25Z", - "authorname": "akailash", - "skillname": "Open News Skill (for Mycroft AI)", - "foldername": "skill-open-news", - "name": "Open News Skill (for Mycroft AI)", - "url": "https://github.com/akailash/skill-open-news", - "category": null, - "description": "This skill makes Mycroft read out news from one the available sources. Currently the news sources supported are:\n\n*Note: This is assuming, Mycroft is already installed with all its requirements. If it is not installed already please refer to https://mycroft.ai/ or https://github.com/MycroftAI/mycroft-core*\n\nTo install this skill use one of the methods listed below.\nGoogle\n * Reddit\n * BBC\n * Fox\n * CNN\n * Reuters", - "short_description": "This skill makes Mycroft read out news from one the available sources. Currently the news sources supported are:", - "branch": "master", - "examples": [ - "Headlines from google india about sushma.", - "Headlines from google about chuck norris.", - "Google headlines.", - "Headlines from reddit about sushma swaraj.", - "headlines from google india about sushma", - "headlines from google about chuck norris", - "google headlines", - "headlines from reddit about sushma swaraj" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [ - "pycountry==17.5.14", - "feedparser==5.2.1" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Open News Skill", - "android_handler": "skill-open-news.akailash.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-03-31T19:11:19Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-05-06T09:02:58Z", - "authorname": "AIIX", - "skillname": "Amarok-Player-Skill", - "foldername": "amarok-player-skill", - "name": "Amarok-Player-Skill", - "url": "https://github.com/AIIX/amarok-player-skill", - "category": null, - "description": "#### Installation of skill:\n* Download or Clone Git\n* Create /opt/mycroft/skills folder if it does not exist\n* Extract Downloaded Skill into a folder. \"amarok-player-skill\". (Clone does not require this step)\n* Copy the amarok-player-skill folder to /opt/mycroft/skills/ folder\n\n#### Installation of requirements:\n##### Fedora:\n- sudo dnf install dbus-python\n- sudo dnf install python-psutil\n- From terminal: cp -R /usr/lib64/python2.7/site-packages/dbus* /home/$USER/.virtualenvs/mycroft/lib/python2.7/site-packages/\n- From terminal: cp /usr/lib64/python2.7/site-packages/_dbus* /home/$USER/.virtualenvs/mycroft/lib/python2.7/site-packages/\n\n##### Kubuntu / KDE Neon:\n- sudo apt install python-psutil\n- sudo apt install python-dbus\n- From terminal: cp -R /usr/lib/python2.7/dist-packages/dbus* /home/$USER/.virtualenvs/mycroft/lib/python2.7/site-packages/\n- From terminal: cp /usr/lib/python2.7/dist-packages/_dbus* /home/$USER/.virtualenvs/mycroft/lib/python2.7/site-packages/\n\n* For other distributions:\n- Python Dbus and Python Psutil package is required and copying the Python Dbus folder and lib from your system python install over to /home/$USER/.virtualenvs/mycroft/lib/python2.7/site-packages/.", - "short_description": "", - "branch": "master", - "examples": [ - "Amarok play music.", - "Amarok stop music.", - "Amarok next song.", - "Amarok previous song.", - "Amarok pause music/song.", - "Amarok play music", - "Amarok stop music", - "Amarok next song", - "Amarok previous song", - "Amarok pause music/song" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "Aix [Github: https://github.com/AIIX]" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Amarok Player Skill", - "android_handler": "amarok-player-skill.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-11-07T22:40:47Z", - "archived": false, - "license": "unknown", - "modified": "2017-11-22T21:47:37Z", - "authorname": "NeonGeckoCom", - "skillname": "skill-keep-transcriptions", - "foldername": "skill-keep-transcriptions", - "name": "skill-keep-transcriptions", - "url": "https://github.com/NeonGeckoCom/skill-keep-transcriptions", - "category": null, - "description": "This skill allows the user to modify their audio and text recording permissions. Audio and text files are written to /var/log/mycroft.", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "NeonGeckoInc" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Keep Transcriptions Skill", - "android_handler": "skill-keep-transcriptions.neongeckocom.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-12-21T18:32:52Z", - "archived": false, - "license": "unknown", - "modified": "2017-12-21T21:15:47Z", - "authorname": "danielquinn", - "skillname": "mycroft-evil-laugh", - "foldername": "mycroft-evil-laugh", - "name": "mycroft-evil-laugh", - "url": "https://github.com/danielquinn/mycroft-evil-laugh", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Evil Laugh Skill", - "android_handler": "mycroft-evil-laugh.danielquinn.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-04-18T05:51:48Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2017-07-21T07:17:35Z", - "authorname": "chrison999", - "skillname": "mycroft-skill-bitcoin-enhanced", - "foldername": "mycroft-skill-bitcoin-enhanced", - "name": "mycroft-skill-bitcoin-enhanced", - "url": "https://github.com/chrison999/mycroft-skill-bitcoin-enhanced", - "category": null, - "description": "A skill for MycroftAI that querys various bitcoin statistics.", - "short_description": "A skill for MycroftAI that querys various bitcoin statistics.", - "branch": "master", - "examples": [ - "--------- | ------- |", - "--------- | ------- |", - "--------- | ------- |", - "Hour Average Price.", - "--------- | ------- |", - "Hour Volume.", - "--------- | ------- |" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Bitcoin Enhanced Skill", - "android_handler": "mycroft-skill-bitcoin-enhanced.chrison999.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-08-29T21:52:06Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2017-10-16T21:33:49Z", - "authorname": "deevrek", - "skillname": "Kodi Skill for Mycroft AI", - "foldername": "kodi-skill", - "name": "Kodi Skill for Mycroft AI", - "url": "https://github.com/deevrek/kodi-skill", - "category": null, - "description": "This is an attempt to create a skill for the new [MycroftAI](https://mycroft.ai) which can search for, play and control Kodi instances via Kodi's JSON-RPC API.\n\nThis uses [kodipydent](https://github.com/haikuginger/kodipydent) to interface with the Kodi JSON-RPC interface.", - "short_description": "This is an attempt to create a skill for the new [MycroftAI](https://mycroft.ai) which can search for, play and control Kodi instances via Kodi's JSON-RPC API.", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Kodi Skill", - "android_handler": "kodi-skill.deevrek.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-11-08T20:35:32Z", - "archived": false, - "license": "unknown", - "modified": "2018-06-01T17:09:52Z", - "authorname": "Pisklya", - "skillname": "", - "foldername": "Translate-Skill", - "name": "", - "url": "https://github.com/Pisklya/Translate-Skill", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Translate Skill", - "android_handler": "Translate-Skill.pisklya.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-03-15T18:44:03Z", - "archived": false, - "license": "unknown", - "modified": "2017-03-15T18:45:30Z", - "authorname": "marksev1", - "skillname": "Pushetta skill", - "foldername": "Mycroft-Pushetta-skill", - "name": "Pushetta skill", - "url": "https://github.com/marksev1/Mycroft-Pushetta-skill", - "category": null, - "description": "A simple skill for sending push notifications to one channel with Pushetta. Maybe in the future I will implement support for multiple channels.", - "short_description": "A simple skill for sending push notifications to one channel with Pushetta. Maybe in the future I will implement support for multiple channels.", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Pushetta Skill", - "android_handler": "Mycroft-Pushetta-skill.marksev1.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-08-30T23:25:06Z", - "archived": false, - "license": "unknown", - "modified": "2017-08-30T23:26:51Z", - "authorname": "deevrek", - "skillname": "mycroft-haskill-abstract", - "foldername": "mycroft-haskill-abstract", - "name": "mycroft-haskill-abstract", - "url": "https://github.com/deevrek/mycroft-haskill-abstract", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Haskill Abstract Skill", - "android_handler": "mycroft-haskill-abstract.deevrek.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-10-06T23:43:39Z", - "archived": false, - "license": "apache-2.0", - "modified": "2017-10-07T00:41:43Z", - "authorname": "purserj", - "skillname": "Angry Beanie", - "foldername": "mycroft-angrybeanie", - "name": "Angry Beanie", - "url": "https://github.com/purserj/mycroft-angrybeanie", - "category": null, - "description": "### Installing\n\nGo to your skills directory (ie /opt/mycroft/skills)\n\ngit clone https://github.com/purserj/mycroft-angrybeanie.git\n\ncd into mycroft-angrybeanie\n\npip -r requirements.txt.", - "short_description": "", - "branch": "master", - "examples": [ - "Get Angry Beanie shows or Get Angry Beanie podcasts - Returns list of podcasts available.", - "Angry beanie list episodes for [SHOW_NAME] - list last 10 episodes of the show.", - "Play the latest episode for [SHOW_NAME] - play the latest episode for the show.", - "Get Angry Beanie shows or Get Angry Beanie podcasts - Returns list of podcasts available", - "Angry beanie list episodes for [SHOW_NAME] - list last 10 episodes of the show", - "play the latest episode for [SHOW_NAME] - play the latest episode for the show" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "James Purser" - ], - "requirements": { - "python": [ - "feedparser" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Angrybeanie Skill", - "android_handler": "mycroft-angrybeanie.purserj.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-07-04T15:10:04Z", - "archived": false, - "license": "mit", - "modified": "2018-05-23T21:49:15Z", - "authorname": "guilhembn", - "skillname": "Mycroft-Slack-skill", - "foldername": "Mycroft-Slack-skill", - "name": "Mycroft-Slack-skill", - "url": "https://github.com/guilhembn/Mycroft-Slack-skill", - "category": null, - "description": "Mycroft will speak with Slack !\n\nThis skill allows to send messages on Slack\n\nTo get this done we need\n - Add the app `Incoming Webhooks` to the team wanted on Slack.\n - Add `\"SlackSkill\": {\n \"incoming_webhook_url\": \"TXXXXXXXX/BXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXX\"\n }` in the [mycroft config file](https://docs.mycroft.ai/skills.and.features/config) (Replace with the end of the URL provided by the incoming webhook app)", - "short_description": "Mycroft will speak with Slack !", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [ - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Slack Skill", - "android_handler": "Mycroft-Slack-skill.guilhembn.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-10-07T16:52:54Z", - "archived": false, - "license": "unknown", - "modified": "2017-10-07T16:59:20Z", - "authorname": "chris-mcawesome12", - "skillname": "mycroft-skill-todoist", - "foldername": "mycroft-skill-todoist", - "name": "mycroft-skill-todoist", - "url": "https://github.com/chris-mcawesome12/mycroft-skill-todoist", - "category": null, - "description": "use mycroft to add tasks to todoist", - "short_description": "use mycroft to add tasks to todoist", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Todoist Skill", - "android_handler": "mycroft-skill-todoist.chris-mcawesome12.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-11-10T21:24:39Z", - "archived": false, - "license": "unknown", - "modified": "2017-11-10T21:39:18Z", - "authorname": "NeonGeckoCom", - "skillname": "skill-skip-wake-words-control", - "foldername": "skill-skip-wake-words-control", - "name": "skill-skip-wake-words-control", - "url": "https://github.com/NeonGeckoCom/skill-skip-wake-words-control", - "category": null, - "description": "Skill, which works using Mycroft-core with NeonGeckoCom modifications, provides the user with the functionality to choose between continuous audio recording, which would not require wake words for Mycroft to work, and the \"standard\" mode, where the wake word \"Hey Mycroft\" is required.\n\nNote: This skill would not proceed without the clear confirmation of the command from the user by asking \"Should I stop skipping wake words?\" and expecting a positive answer.", - "short_description": "", - "branch": "master", - "examples": [ - "Start skipping wake words.", - "Stop skipping wake words.", - "Start skipping wake words", - "Stop skipping wake words" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "NeonGeckoInc" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Skip Wake Words Control Skill", - "android_handler": "skill-skip-wake-words-control.neongeckocom.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-10-06T16:09:56Z", - "archived": false, - "license": "unknown", - "modified": "2017-10-06T21:56:43Z", - "authorname": "skeledrew", - "skillname": "Mycroft Math Skill", - "foldername": "math-skill", - "name": "Mycroft Math Skill", - "url": "https://github.com/skeledrew/math-skill", - "category": null, - "description": "A calculator that can be \"infinitely\" extended, using the abilities template.", - "short_description": "", - "branch": "master", - "examples": [ - "Calculate three plus twenty.", - "Calculate the square root of 100.", - "calculate three plus twenty", - "calculate the square root of 100" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "skeledrew" - ], - "requirements": { - "python": [ - "future" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Math Skill", - "android_handler": "math-skill.skeledrew.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-07-18T15:34:34Z", - "archived": false, - "license": "unknown", - "modified": "2017-07-18T15:38:01Z", - "authorname": "chris-mcawesome12", - "skillname": "mycroft", - "foldername": "mycroft2", - "name": "mycroft", - "url": "https://github.com/chris-mcawesome12/mycroft2", - "category": null, - "description": "A skill to add some personality and comunication with Mycroft", - "short_description": "A skill to add some personality and comunication with Mycroft", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft2 Skill", - "android_handler": "mycroft2.chris-mcawesome12.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-02-16T03:00:36Z", - "archived": false, - "license": "unknown", - "modified": "2017-02-17T18:37:50Z", - "authorname": "eClarity", - "skillname": "mycroft-small-talk-skill", - "foldername": "mycroft-small-talk-skill", - "name": "mycroft-small-talk-skill", - "url": "https://github.com/eClarity/mycroft-small-talk-skill", - "category": null, - "description": "A skill for the Mycroft AI Assistant that enables responses for some everyday conversation", - "short_description": "A skill for the Mycroft AI Assistant that enables responses for some everyday conversation", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Small Talk Skill", - "android_handler": "mycroft-small-talk-skill.eclarity.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-12-13T13:24:52Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2017-12-13T13:26:22Z", - "authorname": "whohlfeld", - "skillname": "Radio player", - "foldername": "radio-Skill", - "name": "Radio player", - "url": "https://github.com/whohlfeld/radio-Skill", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [ - "Play the radio.", - "What's on the radio?", - "Hey Mycroft, play the radio", - "Hey Mycroft, what's on the radio" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "@whohlfeld" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Radio Skill", - "android_handler": "radio-Skill.whohlfeld.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-10-20T19:47:39Z", - "archived": false, - "license": "apache-2.0", - "modified": "2017-10-27T14:20:19Z", - "authorname": "TREE-Ind", - "skillname": "Speaker recognition for Mycroft", - "foldername": "speaker-rec-skill-test", - "name": "Speaker recognition for Mycroft", - "url": "https://github.com/TREE-Ind/speaker-rec-skill-test", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [ - "Do you recognize my voice.", - "Do you recognize my voice" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [ - "tensorflow", - "tflearn" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Speaker Rec Test Skill", - "android_handler": "speaker-rec-skill-test.tree-ind.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-10-08T16:45:36Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2017-10-11T12:37:30Z", - "authorname": "WalterKlosse", - "skillname": "Mycroft BBC news skill", - "foldername": "mycroft-skill-bbc-news", - "name": "Mycroft BBC news skill", - "url": "https://github.com/WalterKlosse/mycroft-skill-bbc-news", - "category": null, - "description": "This Mycroft skill is a modification of the npr-skill by jdorleans. Basically, all I have done is changed the URL from the latest NPR news feed to BBC Radio's latest news feed.", - "short_description": "", - "branch": "master", - "examples": [ - "I want listen to bbc news.", - "Tell me bbc news.", - "i want listen to bbc news", - "tell me bbc news" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "WalterKlosse" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Bbc News Skill", - "android_handler": "mycroft-skill-bbc-news.walterklosse.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-02-23T22:34:21Z", - "archived": false, - "license": "isc", - "modified": "2017-02-23T22:38:02Z", - "authorname": "kfarwell", - "skillname": "", - "foldername": "mycroft-skill-quodlibet", - "name": "", - "url": "https://github.com/kfarwell/mycroft-skill-quodlibet", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Quodlibet Skill", - "android_handler": "mycroft-skill-quodlibet.kfarwell.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-12-05T05:34:45Z", - "archived": false, - "license": "unknown", - "modified": "2017-12-05T05:35:00Z", - "authorname": "dinesh2222202", - "skillname": "picroft example skill gpio Readme", - "foldername": "gpio", - "name": "picroft example skill gpio Readme", - "url": "https://github.com/dinesh2222202/gpio", - "category": null, - "description": "This is a skill for picroft that will interact with the GPIO", - "short_description": "This is a skill for picroft that will interact with the GPIO", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "GPIO" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Gpio Skill", - "android_handler": "gpio.dinesh2222202.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-09-18T17:39:16Z", - "archived": false, - "license": "unknown", - "modified": "2017-10-17T12:27:35Z", - "authorname": "forslund", - "skillname": "Wikiperia Fallback", - "foldername": "fallback-wiki", - "name": "Wikiperia Fallback", - "url": "https://github.com/forslund/fallback-wiki", - "category": null, - "description": "Since this is a fallback skill it will run after normal skills. It only handles simple questions like who was or what is.\n\nIt also has basic support for disambiguation, if many alternatives are possible it will ask the user to specify which of the option was meant.", - "short_description": "", - "branch": "master", - "examples": [ - "What is a Bumble Bee?", - "Who was Marie Curie?", - "Hey Mycroft what is a Bumble Bee", - "Hey Mycroft who was Marie Curie" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "Åke Forslund" - ], - "requirements": { - "python": [ - "wikipedia==1.4.0" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Fallback Wiki Skill", - "android_handler": "fallback-wiki.forslund.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-12-05T05:22:42Z", - "archived": false, - "license": "unknown", - "modified": "2017-12-05T05:25:03Z", - "authorname": "dleweyiv", - "skillname": "picroft example skill gpio Readme", - "foldername": "GPIOtest", - "name": "picroft example skill gpio Readme", - "url": "https://github.com/dleweyiv/GPIOtest", - "category": null, - "description": "This is a skill for picroft that will interact with the GPIO", - "short_description": "This is a skill for picroft that will interact with the GPIO", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "GPIO" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Gpiotest Skill", - "android_handler": "GPIOtest.dleweyiv.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-05-10T22:45:51Z", - "archived": false, - "license": "unknown", - "modified": "2019-02-02T06:15:05Z", - "authorname": "JarbasAl", - "skillname": "mycroft names skill", - "foldername": "skill-names", - "name": "mycroft names skill", - "url": "https://github.com/JarbasAl/skill-names", - "category": null, - "description": "[![Donate with Bitcoin](https://en.cryptobadges.io/badge/micro/1QJNhKM8tVv62XSUrST2vnaMXh5ADSyYP8)](https://en.cryptobadges.io/donate/1QJNhKM8tVv62XSUrST2vnaMXh5ADSyYP8)\n[![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://paypal.me/jarbasai)\n\"Patreon\n[![Say Thanks!](https://img.shields.io/badge/Say%20Thanks-!-1EAEDB.svg)](https://saythanks.io/to/JarbasAl)\n\nsays english names, mycroft can now help name your baby", - "short_description": "[![Donate with Bitcoin](https://en.cryptobadges.io/badge/micro/1QJNhKM8tVv62XSUrST2vnaMXh5ADSyYP8)](https://en.cryptobadges.io/donate/1QJNhKM8tVv62XSUrST2vnaMXh5ADSyYP8)", - "branch": "master", - "examples": [ - "05-10 23:37:41,801 - CLIClient - INFO - Speak: Mary Odom.", - "05-10 23:37:49,666 - CLIClient - INFO - Speak: Billy.", - "05-10 23:37:52,915 - CLIClient - INFO - Speak: Edith.", - "05-10 23:37:56,218 - CLIClient - INFO - Speak: Minardi." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [ - "names" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Names Skill", - "android_handler": "skill-names.jarbasal.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-01-14T15:49:20Z", - "archived": false, - "license": "unknown", - "modified": "2018-04-06T06:54:53Z", - "authorname": "marksev1", - "skillname": "Space Launch", - "foldername": "Mycroft-SpaceLaunch-Skill", - "name": "Space Launch", - "url": "https://github.com/marksev1/Mycroft-SpaceLaunch-Skill", - "category": null, - "description": "This skill interacts with https://launchlibrary.net/ api to return the latest space launch.", - "short_description": "", - "branch": "master", - "examples": [ - "Next rocket launch.", - "I want to know more.", - "next rocket launch", - "i want to know more" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 4, - "credits": [ - "msev\n\nJarbasAI\n\n[praxeo](https://github.com/praxeo/mycroft_spaceflightnow_skill)" - ], - "requirements": { - "python": [ - "arrow" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Spacelaunch Skill", - "android_handler": "Mycroft-SpaceLaunch-Skill.marksev1.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-04-25T18:31:21Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2017-05-18T06:53:23Z", - "authorname": "chrison999", - "skillname": "mycroft-skill-HelpMe", - "foldername": "mycroft-skill-HelpMe", - "name": "mycroft-skill-HelpMe", - "url": "https://github.com/chrison999/mycroft-skill-HelpMe", - "category": null, - "description": "A skill for MycroftAI that implements an internal help facility", - "short_description": "A skill for MycroftAI that implements an internal help facility", - "branch": "master", - "examples": [ - "Help me with skill_name <- will give options for help about this skill <- do this before other commands!", - "Help me with skill <- info about previous skill.", - "Help me with commands <- info about previous skill's commands/ keywords.", - "Help me with intents <- info about previous skill's intents.", - "Prototype*_ of how a full-featured help facility." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Helpme Skill", - "android_handler": "mycroft-skill-HelpMe.chrison999.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-09-03T22:04:39Z", - "archived": false, - "license": "unknown", - "modified": "2017-10-16T21:31:50Z", - "authorname": "deevrek", - "skillname": "mycroft-haskill-chat", - "foldername": "mycroft-haskill-chat", - "name": "mycroft-haskill-chat", - "url": "https://github.com/deevrek/mycroft-haskill-chat", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Haskill Chat Skill", - "android_handler": "mycroft-haskill-chat.deevrek.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-03-31T18:24:27Z", - "archived": false, - "license": "unknown", - "modified": "2017-03-31T18:41:23Z", - "authorname": "trungdn", - "skillname": "test_skill", - "foldername": "test_skill", - "name": "test_skill", - "url": "https://github.com/trungdn/test_skill", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Test_Skill Skill", - "android_handler": "test_skill.trungdn.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-05-24T00:11:03Z", - "archived": false, - "license": "unknown", - "modified": "2017-05-24T00:42:07Z", - "authorname": "aivizionz", - "skillname": "skill-zulip", - "foldername": "skill-zulip", - "name": "skill-zulip", - "url": "https://github.com/aivizionz/skill-zulip", - "category": null, - "description": "This skill integrates zulip group chat with Mycroft.", - "short_description": "This skill integrates zulip group chat with Mycroft.", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Zulip Skill", - "android_handler": "skill-zulip.aivizionz.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-09-29T15:53:11Z", - "archived": false, - "license": "unknown", - "modified": "2017-10-02T06:32:22Z", - "authorname": "chris-mcawesome12", - "skillname": "mycroft-skill-ha-scenes", - "foldername": "mycroft-skill-ha-scenes", - "name": "mycroft-skill-ha-scenes", - "url": "https://github.com/chris-mcawesome12/mycroft-skill-ha-scenes", - "category": null, - "description": "activate scenes in Home Assistant", - "short_description": "activate scenes in Home Assistant", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [ - "fuzzywuzzy==0.14.0", - "requests>=2.10.0", - "python-Levenshtein==0.12.0" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Ha Scenes Skill", - "android_handler": "mycroft-skill-ha-scenes.chris-mcawesome12.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-11-09T20:27:20Z", - "archived": false, - "license": "unknown", - "modified": "2017-11-12T11:52:36Z", - "authorname": "cristinailli", - "skillname": "Quote Skill", - "foldername": "skill-quote", - "name": "Quote Skill", - "url": "https://github.com/cristinailli/skill-quote", - "category": null, - "description": "\nMycroft reads quotes of famous people.", - "short_description": "", - "branch": "master", - "examples": [ - "Quote.", - "quote" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Quote Skill", - "android_handler": "skill-quote.cristinailli.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-11-25T11:39:17Z", - "archived": false, - "license": "unknown", - "modified": "2017-11-25T11:41:26Z", - "authorname": "mkonsti", - "skillname": "mycroft-mamalauda", - "foldername": "mycroft-mamalauda", - "name": "mycroft-mamalauda", - "url": "https://github.com/mkonsti/mycroft-mamalauda", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Mamalauda Skill", - "android_handler": "mycroft-mamalauda.mkonsti.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-12-23T06:38:20Z", - "archived": false, - "license": "unknown", - "modified": "2018-07-18T17:35:57Z", - "authorname": "lachendeKatze", - "skillname": "skill-days-until-christmas", - "foldername": "skill-days-until-christmas", - "name": "skill-days-until-christmas", - "url": "https://github.com/lachendeKatze/skill-days-until-christmas", - "category": null, - "description": "\"Hey Mycroft, how many days until christmas?\"", - "short_description": "\"Hey Mycroft, how many days until christmas?\"", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Days Until Christmas Skill", - "android_handler": "skill-days-until-christmas.lachendekatze.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2016-07-15T15:09:23Z", - "archived": false, - "license": "unknown", - "modified": "2017-04-05T12:04:00Z", - "authorname": "ElliotTheRobot", - "skillname": "Shopping skills for MyCroft", - "foldername": "shopping", - "name": "Shopping skills for MyCroft", - "url": "https://github.com/ElliotTheRobot/shopping", - "category": null, - "description": "A skill that manages a remote shopping list provided by a webservice", - "short_description": "A skill that manages a remote shopping list provided by a webservice", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Shopping Skill", - "android_handler": "shopping.elliottherobot.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-05-05T18:16:20Z", - "archived": false, - "license": "unknown", - "modified": "2017-05-05T18:46:59Z", - "authorname": "eClarity", - "skillname": "", - "foldername": "skill-hass", - "name": "", - "url": "https://github.com/eClarity/skill-hass", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Hass Skill", - "android_handler": "skill-hass.eclarity.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-09-08T04:44:25Z", - "archived": false, - "license": "apache-2.0", - "modified": "2019-12-18T05:14:59Z", - "authorname": "ekjswim", - "skillname": "mycroftjacket", - "foldername": "mycroftjacket", - "name": "mycroftjacket", - "url": "https://github.com/ekjswim/mycroftjacket", - "category": null, - "description": "Developing a skill for Mycroft to tell users if they need a jacket (umbrella, coat, etc) for the day.", - "short_description": "Developing a skill for Mycroft to tell users if they need a jacket (umbrella, coat, etc) for the day.", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroftjacket Skill", - "android_handler": "mycroftjacket.ekjswim.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-12-11T15:41:33Z", - "archived": false, - "license": "mit", - "modified": "2017-12-11T15:41:54Z", - "authorname": "wayglem", - "skillname": "PROJECT_NAME skill", - "foldername": "mycroft-insults", - "name": "PROJECT_NAME skill", - "url": "https://github.com/wayglem/mycroft-insults", - "category": null, - "description": "This skill allow Mycroft to be insulted and reply back with some good answers", - "short_description": "This skill allow Mycroft to be insulted and reply back with some good answers", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Insults Skill", - "android_handler": "mycroft-insults.wayglem.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-12-05T16:55:23Z", - "archived": false, - "license": "unknown", - "modified": "2017-12-05T16:58:27Z", - "authorname": "whohlfeld", - "skillname": "play some music", - "foldername": "play-music", - "name": "play some music", - "url": "https://github.com/whohlfeld/play-music", - "category": null, - "description": "Play internet radio station using Mycroft.", - "short_description": "", - "branch": "master", - "examples": [ - "Play some music.", - "play some music" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Norman Moore" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Play Music Skill", - "android_handler": "play-music.whohlfeld.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-11-07T19:53:51Z", - "archived": false, - "license": "mit", - "modified": "2018-08-19T19:17:55Z", - "authorname": "theCalcaholic", - "skillname": "Messaging Skill", - "foldername": "mycroft-messaging", - "name": "Messaging Skill", - "url": "https://github.com/theCalcaholic/mycroft-messaging", - "category": null, - "description": "A messaging skill for the [mycroft assistent](https://mycroft.ai) (e-mail for now, other messenging utilities may follow).\n\nHeavily WIP", - "short_description": "A messaging skill for the [mycroft assistent](https://mycroft.ai) (e-mail for now, other messenging utilities may follow).", - "branch": "master", - "examples": [ - "...", - "...", - "..." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Messaging Skill", - "android_handler": "mycroft-messaging.thecalcaholic.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-11-12T15:26:14Z", - "archived": false, - "license": "unknown", - "modified": "2017-11-22T12:09:21Z", - "authorname": "normandmickey", - "skillname": "play some music", - "foldername": "play-some-music-skill", - "name": "play some music", - "url": "https://github.com/normandmickey/play-some-music-skill", - "category": null, - "description": "Play internet radio station using Mycroft.", - "short_description": "", - "branch": "master", - "examples": [ - "Play some music.", - "play some music" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "Norman Moore" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Play Some Music Skill", - "android_handler": "play-some-music-skill.normandmickey.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-06-16T19:20:12Z", - "archived": false, - "license": "unknown", - "modified": "2019-02-02T06:15:12Z", - "authorname": "JarbasAl", - "skillname": "Firefox Browser Service Skill", - "foldername": "service-skill-browser", - "name": "Firefox Browser Service Skill", - "url": "https://github.com/JarbasAl/service-skill-browser", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Service Browser Skill", - "android_handler": "service-skill-browser.jarbasal.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-03-13T19:26:00Z", - "archived": false, - "license": "unknown", - "modified": "2019-01-10T18:13:11Z", - "authorname": "JarbasAl", - "skillname": "mycroft---konami-code", - "foldername": "skill-konami-code", - "name": "mycroft---konami-code", - "url": "https://github.com/JarbasAl/skill-konami-code", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [ - "Executes cheat code script." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Konami Code Skill", - "android_handler": "skill-konami-code.jarbasal.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-05-30T00:33:16Z", - "archived": false, - "license": "unknown", - "modified": "2017-06-10T19:40:57Z", - "authorname": "Skills-And-Translations", - "skillname": "", - "foldername": "mycroft-MotionControlSkill", - "name": "", - "url": "https://github.com/Skills-And-Translations/mycroft-MotionControlSkill", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Motioncontrolskill Skill", - "android_handler": "mycroft-MotionControlSkill.skills-and-translations.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-06-26T23:46:25Z", - "archived": false, - "license": "unknown", - "modified": "2017-06-26T23:47:30Z", - "authorname": "ethanaward", - "skillname": "DuckDuckGo skill for Mycroft", - "foldername": "duckduckgo-skill", - "name": "DuckDuckGo skill for Mycroft", - "url": "https://github.com/ethanaward/duckduckgo-skill", - "category": null, - "description": "The duckduckgo skill is intended as a fallback handler. When it is fallen back to, it parses the query to see if it is a question, and if it is, it extracts the query and searches on duckduckgo for it.", - "short_description": "The duckduckgo skill is intended as a fallback handler. When it is fallen back to, it parses the query to see if it is a question, and if it is, it extracts the query and searches on duckduckgo for it.", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "duckduckgo2" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Duckduckgo Skill", - "android_handler": "duckduckgo-skill.ethanaward.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-05-25T23:12:30Z", - "archived": false, - "license": "unknown", - "modified": "2020-02-25T17:37:22Z", - "authorname": "josmithua", - "skillname": "mycroft-skill-bible", - "foldername": "mycroft-skill-bible", - "name": "mycroft-skill-bible", - "url": "https://github.com/josmithua/mycroft-skill-bible", - "category": null, - "description": "A bible skill for mycroftAI. Uses BibleGateway.com to perform various bible passage lookup tasks, such as getting their verse of the day. More to come.\n\n### Usage:\nBibleGateway Verse of The Day:\n\n### Requirements\n\n### Issues:\nWhat is the daily verse?\n * Tell me the daily verse\n * Daily verse\n * requests (pip install requests)\n * beautifulsoup4 (pip install beautifulsoup4)\n * None", - "short_description": "A bible skill for mycroftAI. Uses BibleGateway.com to perform various bible passage lookup tasks, such as getting their verse of the day. More to come.", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Bible Skill", - "android_handler": "mycroft-skill-bible.josmithua.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-07-31T22:53:21Z", - "archived": false, - "license": "unknown", - "modified": "2017-07-31T22:53:54Z", - "authorname": "TREE-Ind", - "skillname": "MatterMost Skill for Mycroft AI", - "foldername": "skill-mattermost", - "name": "MatterMost Skill for Mycroft AI", - "url": "https://github.com/TREE-Ind/skill-mattermost", - "category": null, - "description": "This skill will enable controlling Mattermost keyboard shortcuts by voice.", - "short_description": "This skill will enable controlling Mattermost keyboard shortcuts by voice.", - "branch": "master", - "examples": [ - "Next channel.", - "Open my direct messages.", - "Switch channels.", - "Desktop only skill that will have little use on a Mark1 device (for now)*", - "", - "next channel", - "open my direct messages", - "switch channels" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "pyautogui" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mattermost Skill", - "android_handler": "skill-mattermost.tree-ind.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-03-31T13:19:41Z", - "archived": false, - "license": "unknown", - "modified": "2017-10-16T22:55:09Z", - "authorname": "ElliotTheRobot", - "skillname": "servermonitor_skill", - "foldername": "servermonitor_skill", - "name": "servermonitor_skill", - "url": "https://github.com/ElliotTheRobot/servermonitor_skill", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Servermonitor_Skill Skill", - "android_handler": "servermonitor_skill.elliottherobot.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-09-03T19:35:38Z", - "archived": false, - "license": "lgpl-3.0", - "modified": "2018-06-07T02:00:02Z", - "authorname": "00tiagopolicarpo00", - "skillname": "Mycroft skill-radio-rne-news", - "foldername": "skill-radio-rne", - "name": "Mycroft skill-radio-rne-news", - "url": "https://github.com/00tiagopolicarpo00/skill-radio-rne", - "category": null, - "description": "Latest news from http://www.rtve.es/radio/ from Spain.", - "short_description": "", - "branch": "master", - "examples": [ - "Spanish news.", - "News from spain.", - "Radio from Spain.", - "Spanish news", - "news from spain", - "radio from Spain" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Radio Rne Skill", - "android_handler": "skill-radio-rne.00tiagopolicarpo00.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-03-31T11:21:18Z", - "archived": false, - "license": "unknown", - "modified": "2017-04-05T09:08:00Z", - "authorname": "ElliotTheRobot", - "skillname": "episode_skill", - "foldername": "episode_skill", - "name": "episode_skill", - "url": "https://github.com/ElliotTheRobot/episode_skill", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Episode_Skill Skill", - "android_handler": "episode_skill.elliottherobot.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-04-06T00:54:21Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2017-10-16T19:22:56Z", - "authorname": "aatchison", - "skillname": "Pulseaudio device control skill", - "foldername": "skill-pulseaudio-control", - "name": "Pulseaudio device control skill", - "url": "https://github.com/aatchison/skill-pulseaudio-control", - "category": null, - "description": "This skill is intended to allow a Mycroft user to list and set the default input and output devices. This should work both by voice and by cli for an initial setup.", - "short_description": "", - "branch": "master", - "examples": [ - "Pulse source list.", - "Pulse sink list.", - "Pulse source set (integer)", - "Pulse sink set (integer)", - "pulse source list", - "pulse sink list", - "pulse source set (integer)", - "pulse sink set (integer)" - ], - "tags": [ - "device", - "`setting", - "hasn't", - "fine`", - "devices", - "yet`", - "was", - "been", - "should", - "work", - "just", - "set,", - "*", - "speaks", - "but", - "setting", - "the", - "that", - "`listing", - "implemented", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [ - "pulsectl==17.1.3" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Pulseaudio Control Skill", - "android_handler": "skill-pulseaudio-control.aatchison.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-05-12T18:54:07Z", - "archived": false, - "license": "unknown", - "modified": "2017-05-12T22:06:53Z", - "authorname": "rsimari", - "skillname": "NPR-LIVE-RADIO", - "foldername": "npr-live", - "name": "NPR-LIVE-RADIO", - "url": "https://github.com/rsimari/npr-live", - "category": null, - "description": "A skill for streaming live NPR Radio", - "short_description": "A skill for streaming live NPR Radio", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Npr Live Skill", - "android_handler": "npr-live.rsimari.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-10-06T00:49:57Z", - "archived": false, - "license": "unknown", - "modified": "2017-10-25T05:07:04Z", - "authorname": "MedChartAI", - "skillname": "medchart item", - "foldername": "item-skill", - "name": "medchart item", - "url": "https://github.com/MedChartAI/item-skill", - "category": null, - "description": "Patients can ask for a blanket and other items and then have a sms notification sent to let you know what to bring them.", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "btotharye" - ], - "requirements": { - "python": [ - "twilio" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Item Skill", - "android_handler": "item-skill.medchartai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-06-05T18:43:11Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2017-07-02T14:29:14Z", - "authorname": "kgaddy", - "skillname": "Mycroft Octoprint Skill", - "foldername": "mycroft_skill_octopi", - "name": "Mycroft Octoprint Skill", - "url": "https://github.com/kgaddy/mycroft_skill_octopi", - "category": null, - "description": "Interface with your 3d printer using Octoprint.\n\nTo get this done we need\n - Octoprint http://octoprint.org\n - Add your API key from Octoprint to the __init__.py file.", - "short_description": "Interface with your 3d printer using Octoprint.", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft_Skill_Octopi Skill", - "android_handler": "mycroft_skill_octopi.kgaddy.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-03-18T04:37:17Z", - "archived": false, - "license": "unknown", - "modified": "2017-03-18T05:42:31Z", - "authorname": "BoatrightTBC", - "skillname": "sunspots", - "foldername": "sunspots", - "name": "sunspots", - "url": "https://github.com/BoatrightTBC/sunspots", - "category": null, - "description": "A sunspot number skill for mycroft. \n\nYes, this duplicates a perfectly workable wolfram alpha query that already works, but it's a basis for future expansion. \n\nThis skill pulls the current month's count CSV file from sidc.be, splits it, and responds with the count and the number of observatories. For more information on the data, visit http://www.sidc.be/silso/datafiles and look at the Daily Estimated Sunspot Number.", - "short_description": "A sunspot number skill for mycroft. ", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Sunspots Skill", - "android_handler": "sunspots.boatrighttbc.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-11-03T12:02:20Z", - "archived": false, - "license": "apache-2.0", - "modified": "2019-02-22T00:46:25Z", - "authorname": "KathyReid", - "skillname": "Australian News Skill", - "foldername": "skill-australian-news", - "name": "Australian News Skill", - "url": "https://github.com/KathyReid/skill-australian-news", - "category": null, - "description": "This skill reads the [Australian Broadcasting Network](http://abc.net.au) live radio news feed. The ABC is Australia's national public broacasting service.\n\nThe direct stream URLs from the ABC are at:\nhttp://radio.abc.net.au/help/streams\n\nMost of these streams are in *.pls* format, which is an XML playist format.\n\nThis skill currently plays the stream from:\nhttp://live-radio02.mediahubaustralia.com/PBW/mp3/\n\nThis is a stream, not a recording, so when it plays it will begin mid-stream. ABC often streams the BBC World Service, with local Australian news updates on the hour.", - "short_description": "This skill reads the [Australian Broadcasting Network](http://abc.net.au) live radio news feed. The ABC is Australia's national public broacasting service.", - "branch": "master", - "examples": [ - "Speak:", - "Speak:", - "Speak:", - "Speak: Australian news", - "Speak: Aussie news", - "Speak: read the Australian news" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Australian News Skill", - "android_handler": "skill-australian-news.kathyreid.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-10-10T07:54:38Z", - "archived": false, - "license": "unknown", - "modified": "2017-10-14T04:56:13Z", - "authorname": "drphysica", - "skillname": "", - "foldername": "test_file", - "name": "", - "url": "https://github.com/drphysica/test_file", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Test_File Skill", - "android_handler": "test_file.drphysica.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-05-02T06:43:47Z", - "archived": false, - "license": "mit", - "modified": "2017-05-02T07:09:28Z", - "authorname": "rlopezxl", - "skillname": "Test skill", - "foldername": "test-skill", - "name": "Test skill", - "url": "https://github.com/rlopezxl/test-skill", - "category": null, - "description": "This is just a test.", - "short_description": "This is just a test.", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Test Skill", - "android_handler": "test-skill.rlopezxl.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-10-03T20:17:03Z", - "archived": false, - "license": "mit", - "modified": "2017-10-07T18:12:04Z", - "authorname": "peteryorke", - "skillname": "PROJECT_NAME skill", - "foldername": "skill-pizza-order", - "name": "PROJECT_NAME skill", - "url": "https://github.com/peteryorke/skill-pizza-order", - "category": null, - "description": "This skill does ...\n\nTo get this done we need\n - This\n - That\n - The other thing", - "short_description": "This skill does ...", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [ - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Pizza Order Skill", - "android_handler": "skill-pizza-order.peteryorke.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-07-30T23:45:58Z", - "archived": false, - "license": "unknown", - "modified": "2017-12-26T12:08:01Z", - "authorname": "lachendeKatze", - "skillname": "smarteye", - "foldername": "skill-smart-eye", - "name": "smarteye", - "url": "https://github.com/lachendeKatze/skill-smart-eye", - "category": null, - "description": "test folder", - "short_description": "test folder", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Smart Eye Skill", - "android_handler": "skill-smart-eye.lachendekatze.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-05-15T18:55:06Z", - "archived": false, - "license": "unknown", - "modified": "2019-01-10T18:15:12Z", - "authorname": "JarbasAl", - "skillname": "Cleverbot skill", - "foldername": "fallback-cleverbot", - "name": "Cleverbot skill", - "url": "https://github.com/JarbasAl/fallback-cleverbot", - "category": null, - "description": "Input: talk to cleverbot\n2017-05-15 19:47:49,325 - CLIClient - INFO - Speak: Hello\n2017-05-15 19:47:51,976 - CLIClient - INFO - Speak: How are you?\n2017-05-15 19:47:53,351 - CLIClient - INFO - Speak: I asked first!\n2017-05-15 19:47:55,795 - CLIClient - INFO - Speak: No you didn't.\n2017-05-15 19:47:56,769 - CLIClient - INFO - Speak: That's right.\n2017-05-15 19:47:57,787 - CLIClient - INFO - Speak: I had to something cleaning...\n.....", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Fallback Cleverbot Skill", - "android_handler": "fallback-cleverbot.jarbasal.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-10-22T12:45:49Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-09-30T06:03:08Z", - "authorname": "rigved", - "skillname": "Webpage Summarizer", - "foldername": "webpage-summarizer-skill", - "name": "Webpage Summarizer", - "url": "https://github.com/rigved/webpage-summarizer-skill", - "category": "Productivity", - "description": "This skill reads out summaries of all the provided web pages. The web pages and their accompanying summaries are managed by the [Webpage Summarizer Service](https://github.com/rigved/webpage-summarizer-service). This skill then reads out the summaries for all the web pages in the queue of the service.\n\nThere is a large amount of online news and other interesting articles that we come across every day. It is difficult to keep pace with this large volume of information. This Mycroft AI Webpage Summarizer Skill and the accompanying [Webpage Summarizer Service](https://github.com/rigved/webpage-summarizer-service) helps to convert all this incoming information into something more manageable.", - "short_description": "Reads out summaries of all the provided web pages. Uses the [Webpage Summarizer Service](https://github.com/rigved/webpage-summarizer-service) to generate summaries of the provided web pages.", - "branch": "master", - "examples": [ - "Read summary.", - "Read summaries.", - "Read web page summary.", - "Read web page summaries.", - "Read summary", - "Read summaries", - "Read web page summary", - "Read web page summaries" - ], - "tags": [ - "Web", - "News", - "Productivity", - "Summary", - "page", - "Web page", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/newspaper.svg", - "credits": [ - "[rigved](https://github.com/rigved/)" - ], - "categories": [ - "Productivity" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Webpage Summarizer Skill", - "android_handler": "webpage-summarizer-skill.rigved.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2016-08-31T23:55:02Z", - "archived": false, - "license": "unknown", - "modified": "2016-08-31T23:59:36Z", - "authorname": "dladd10", - "skillname": "", - "foldername": "Good-Morning-Skill", - "name": "", - "url": "https://github.com/dladd10/Good-Morning-Skill", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Good Morning Skill", - "android_handler": "Good-Morning-Skill.dladd10.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2016-12-29T05:43:13Z", - "archived": false, - "license": "mit", - "modified": "2016-12-29T05:43:20Z", - "authorname": "vlaryn", - "skillname": "PROJECT_NAME skill", - "foldername": "MyCroft_RetroPie_Skill", - "name": "PROJECT_NAME skill", - "url": "https://github.com/vlaryn/MyCroft_RetroPie_Skill", - "category": null, - "description": "This skill does ...\n\nTo get this done we need\n - This\n - That\n - The other thing", - "short_description": "This skill does ...", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft_Retropie_Skill Skill", - "android_handler": "MyCroft_RetroPie_Skill.vlaryn.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-09-24T20:51:06Z", - "archived": false, - "license": "mit", - "modified": "2018-06-12T05:11:29Z", - "authorname": "el-tocino", - "skillname": "Geek Hue skill", - "foldername": "mycroft-hue", - "name": "Geek Hue skill", - "url": "https://github.com/el-tocino/mycroft-hue", - "category": null, - "description": "This skill is a revamp of @btothayre's hue skill using fuzzy matching for adjusting lights, groups, and colors. (Should work with python 3 now as well?)", - "short_description": "This skill is a revamp of @btothayre's hue skill using fuzzy matching for adjusting lights, groups, and colors. (Should work with python 3 now as well?)", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "rgbxy", - "fuzzywuzzy", - "webcolors", - "phue" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Hue Skill", - "android_handler": "mycroft-hue.el-tocino.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-04-09T08:21:18Z", - "archived": false, - "license": "unknown", - "modified": "2017-04-09T08:26:35Z", - "authorname": "forslund", - "skillname": "", - "foldername": "playback_control_skill", - "name": "", - "url": "https://github.com/forslund/playback_control_skill", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Playback_Control_Skill Skill", - "android_handler": "playback_control_skill.forslund.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-07-01T00:32:00Z", - "archived": false, - "license": "unknown", - "modified": "2017-10-16T22:38:57Z", - "authorname": "gerlachry", - "skillname": "Audio Bible Skill", - "foldername": "skill-bible", - "name": "Audio Bible Skill", - "url": "https://github.com/gerlachry/skill-bible", - "category": null, - "description": "Uses the ESV. http://www.esvapi.org/api", - "short_description": "Uses the ESV. http://www.esvapi.org/api", - "branch": "master", - "examples": [ - "Play bible.", - "Play bible john chapter 4.", - "Play bible john chapter 4 verse 3.", - "play bible", - "play bible john chapter 4", - "play bible john chapter 4 verse 3" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [ - "feedparser==5.2.1", - "requests==2.18.1", - "urllib3==1.21.1", - "websocket-client==0.32.0", - "pkg-resources==0.0.0", - "six==1.10.0", - "idna==2.5", - "mustache==0.1.4", - "configobj==5.0.6", - "mycroft-skills-sdk==0.1.20", - "pyee==1.0.1", - "chardet==3.0.4", - "certifi==2017.4.17", - "adapt-parser==0.2.1" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Bible Skill", - "android_handler": "skill-bible.gerlachry.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-02-12T12:28:16Z", - "archived": false, - "license": "unknown", - "modified": "2018-04-06T06:54:25Z", - "authorname": "marksev1", - "skillname": "Sun times", - "foldername": "Mycroft-SunSkill", - "name": "Sun times", - "url": "https://github.com/marksev1/Mycroft-SunSkill", - "category": null, - "description": "This skill provides times for relevant sun events (sunrise, sunset, etc.).", - "short_description": "", - "branch": "master", - "examples": [ - "When does the sun set?", - "When does the sun rise?", - "when does the sun set", - "when does the sun rise" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "msev" - ], - "requirements": { - "python": [ - "tzlocal", - "arrow", - "geopy", - "solartime" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Sunskill Skill", - "android_handler": "Mycroft-SunSkill.marksev1.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-09-22T18:22:49Z", - "archived": false, - "license": "unknown", - "modified": "2018-05-18T10:08:20Z", - "authorname": "skeledrew", - "skillname": "", - "foldername": "mycroft-skill-basichelp", - "name": "", - "url": "https://github.com/skeledrew/mycroft-skill-basichelp", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "sh", - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Basichelp Skill", - "android_handler": "mycroft-skill-basichelp.skeledrew.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-01-11T06:31:15Z", - "archived": false, - "license": "unknown", - "modified": "2017-10-17T01:32:15Z", - "authorname": "forslund", - "skillname": "", - "foldername": "swedishradio_skill", - "name": "", - "url": "https://github.com/forslund/swedishradio_skill", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Swedishradio_Skill Skill", - "android_handler": "swedishradio_skill.forslund.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-09-15T15:05:07Z", - "archived": false, - "license": "apache-2.0", - "modified": "2018-07-31T05:29:33Z", - "authorname": "tjoen", - "skillname": "Number skill", - "foldername": "mycroft-skill-numbers", - "name": "Number skill", - "url": "https://github.com/tjoen/mycroft-skill-numbers", - "category": null, - "description": "This skill gives useless info about a number\n\nTo get this done we use http://numbersapi.com", - "short_description": "This skill gives useless info about a number", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Numbers Skill", - "android_handler": "mycroft-skill-numbers.tjoen.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-05-13T08:20:17Z", - "archived": false, - "license": "unknown", - "modified": "2017-05-13T08:28:29Z", - "authorname": "george-ai", - "skillname": "Random Bible Verse Skill", - "foldername": "skill-random-bible-verse", - "name": "Random Bible Verse Skill", - "url": "https://github.com/george-ai/skill-random-bible-verse", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [ - "Play bible verse.", - "play bible verse" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Random Bible Verse Skill", - "android_handler": "skill-random-bible-verse.george-ai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-05-03T16:47:17Z", - "archived": false, - "license": "mit", - "modified": "2017-05-03T16:55:27Z", - "authorname": "rsimari", - "skillname": "NPR-LIVE-SKILL skill", - "foldername": "mycroft-skills", - "name": "NPR-LIVE-SKILL skill", - "url": "https://github.com/rsimari/mycroft-skills", - "category": null, - "description": "This skill does ...\n\nTo get this done we need\n - This\n - That\n - The other thing", - "short_description": "This skill does ...", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Skills Skill", - "android_handler": "mycroft-skills.rsimari.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-07-31T17:07:34Z", - "archived": false, - "license": "unknown", - "modified": "2017-07-31T17:14:06Z", - "authorname": "forslund", - "skillname": "", - "foldername": "startup_skill", - "name": "", - "url": "https://github.com/forslund/startup_skill", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Startup_Skill Skill", - "android_handler": "startup_skill.forslund.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-03-01T16:25:10Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2017-03-01T16:27:22Z", - "authorname": "Nold360", - "skillname": "", - "foldername": "mycroft_skill-live_camera", - "name": "", - "url": "https://github.com/Nold360/mycroft_skill-live_camera", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft_Skill Live_Camera Skill", - "android_handler": "mycroft_skill-live_camera.nold360.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2017-09-12T12:08:00Z", - "archived": false, - "license": "unknown", - "modified": "2020-01-15T22:51:08Z", - "authorname": "spammedia", - "skillname": "mycroft-poetry-skill", - "foldername": "mycroft-poetry-skill", - "name": "mycroft-poetry-skill", - "url": "https://github.com/spammedia/mycroft-poetry-skill", - "category": null, - "description": "make poems/lyrics with markov chains", - "short_description": "make poems/lyrics with markov chains", - "branch": "master", - "examples": [ - "* black metal **", - "", - "* scifi **", - "", - "Fi movie but.", - "* viking **", - "", - "* death metal **", - "", - "Turning.", - "* inspirational **", - "", - "* life **", - "", - "* love **", - "", - "* friends **", - "", - "* family **", - "", - "* Camões **", - "", - "* shakespeare **", - "", - "-", - "" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Poetry Skill", - "android_handler": "mycroft-poetry-skill.spammedia.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-01-27T10:15:07Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-09T23:15:13Z", - "authorname": "jarbasai", - "skillname": "nodered-skill", - "foldername": "skill-node-red", - "name": "NodeRed Skill", - "url": "https://github.com/JarbasSkills/mycroft-node-red", - "category": null, - "description": "![](./logo.png)\n\n[Node Red](https://nodered.org/) - Mycroft interface\n\nbeginners and non technical users can now leverage visual programming and easily extend mycroft functionality\n\n * [Installing node red](#installing-node-red)\n + [Firewall](#firewall)\n + [Launch Node red](#launch-node-red)\n * [Import base flows](#import-base-flows)\n * [Configure Websocket](#configure-websocket)\n * [Build Intents](#build-intents)\n * [Webui](#webui)\n * [Debug](#debug)\n[Additional Setup](#additional-setup)\n * [Extra functionality](#extra-functionality)", - "short_description": "![](./logo.png)", - "branch": "master", - "examples": [ - "ping node red" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 20, - "logo": "https://raw.githubusercontent.com/JarbasSkills/skill-node-red/master/logo.png", - "requirements": { - "python": [ - "jarbas_hive_mind_red>=0.1.6", - "json_database", - "jarbas_utils" - ], - "skill": [ - "https://github.com/JarbasSkills/skill-hivemind" - ], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Node Red Skill", - "android_handler": "skill-node-red.jarbasskills.home" - }, - "desktop": {}, - "desktopFile": false - }, - { - "created": "2018-06-14T04:01:54Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-09-03T00:03:02Z", - "authorname": "ChristopherRogers1991", - "skillname": "Mycroft Routine Skill", - "foldername": "mycroft_routine_skill", - "name": "Mycroft Routine Skill", - "url": "https://github.com/ChristopherRogers1991/mycroft_routine_skill", - "category": null, - "description": "Create named rountines, which are lists of Mycroft commands, that can be run by name, and scheduled to run at particular times.", - "short_description": "", - "branch": "master", - "examples": [ - "User:*", - ":*", - "User:*", - ":*", - "User:*", - ":*", - "User:*", - ":*", - "User:*", - ":*", - "User:*", - ":*", - "User:*", - ":*", - "User:*", - ":*", - "User:*", - ":*", - "User:*", - ":*", - "Run routine morning.", - "List routines.", - "Describe routine morning.", - "Disable morning routine.", - "Enable morning routine.", - "Delete morning routine.", - "*Do not put the name of the routine into one of the commands**. For example, if you create a routine called 'morning,' do not have 'say good morning' as one of the commands. Mycroft may pickup on the name of the routine, and try to run it over again, ultimately creating an infinite loop where the routine continually triggers itself.", - "Run routine morning", - "List routines", - "Describe routine morning", - "Disable morning routine", - "Enable morning routine", - "Delete morning routine" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 20, - "credits": [ - "@ChristopherRogers1991", - "@gras64 (German translation)" - ], - "requirements": { - "python": [ - "apscheduler" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft_Routine_Skill Skill", - "android_handler": "mycroft_routine_skill.christopherrogers1991.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-10-19T21:03:35Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-03-29T15:05:16Z", - "authorname": "andlo", - "skillname": "Google AIY voicekit", - "foldername": "picroft-google-aiy-voicekit-skill", - "name": "Google AIY voicekit", - "url": "https://github.com/andlo/picroft-google-aiy-voicekit-skill", - "category": "IoT", - "description": "This enables the led and button on the Google AIY voicekit.\n\nThe button led turns on when Mycroft is listning. If button is pressed he begins to listen. If the button is pressed for a longer time he stops whatever he is dooing.", - "short_description": "Enables Google AIY voicekit", - "branch": "master", - "examples": [], - "tags": [ - "IoT", - "googlevoicekit", - "aiy", - "voicehat", - "voicekit", - "Googleaiy", - "viral-license" - ], - "platforms": [ - "platform_picroft" - ], - "stars": 13, - "last_updated": "2021-02-12T23:30:17Z", - "icon": "AIY_logo_blue.png", - "categories": [ - "IoT" - ], - "credits": [ - "Andreas Lorensen (@andlo)" - ], - "requirements": { - "python": [ - "RPi.GPIO" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Picroft Google Aiy Voicekit Skill", - "android_handler": "picroft-google-aiy-voicekit-skill.andlo.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-09-09T14:31:01Z", - "archived": false, - "license": "unknown", - "modified": "2020-09-29T00:28:02Z", - "authorname": "rickyphewitt", - "skillname": "Emby", - "foldername": "emby-skill", - "name": "Emby", - "url": "https://github.com/rickyphewitt/emby-skill", - "category": "Music", - "description": "Stream music from your Emby server using Mycroft! Play all songs by an artist or an instant mix of any artist/album/song in your Emby library.", - "short_description": "This skill allows audio playback from an Emby server", - "branch": "master", - "examples": [ - "Play Dance Gavin Dance From Emby.", - "Play Artist Thrice From Emby.", - "Play Album Deadweight From Emby.", - "Play Playlist Rockin Tunes From Emby.", - "Play Dance Gavin Dance From Emby", - "Play Artist Thrice From Emby", - "Play Album Deadweight From Emby", - "Play Playlist Rockin Tunes From Emby", - "Play Song Stitch From Emby" - ], - "tags": [ - "Music", - "Emby,Music", - "Emby,", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 9, - "last_updated": "2020-12-20T21:55:35Z", - "credits": [ - "rickyphewitt" - ], - "categories": [ - "Music" - ], - "requirements": { - "python": [ - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Emby Skill", - "android_handler": "emby-skill.rickyphewitt.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-12-12T08:36:13Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-24T07:18:48Z", - "authorname": "MycroftAI", - "skillname": "Mycroft Mark 2", - "foldername": "skill-mark-2", - "name": "Mycroft Mark 2", - "url": "https://github.com/MycroftAI/skill-mark-2", - "category": "Configuration", - "description": "The Mycroft Mark 2 has several unique capabilities which this Skill lets you\ncontrol.\n\n### Faceplate Brightness\nSet the faceplate to a specific brightness, or allow it to automatically adjust\nits brightness level to dim at night.", - "short_description": "Customize your Mark 2", - "branch": "master", - "examples": [ - "Turn on auto brightness.", - "Change to low brightness.", - "Dim to 50%", - "Turn on auto brightness", - "Change to low brightness" - ], - "tags": [ - "settings", - "system", - "mark2", - "Configuration", - "configuration", - "permissive-license" - ], - "platforms": [ - "platform_mark2", - "platform_respeaker" - ], - "stars": 7, - "last_updated": "2021-04-23T01:35:34Z", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/cog.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [ - "arrow==0.12.0", - "astral==1.4" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mark 2 Skill", - "android_handler": "skill-mark-2.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-11-08T14:12:22Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-08-10T13:27:52Z", - "authorname": "gras64", - "skillname": "Learning", - "foldername": "learning-skill", - "name": "Learning", - "url": "https://github.com/gras64/learning-skill", - "category": "Entertainment", - "description": "This Skill helps to give Mycroft a personality by learning any new information that you provide.\nif mycroft not understood mycroft you. you can immediately train the previous request by saying \"I want to explain it\" or \"houmor is probably not your strength\".\nthen you do not have to do everything from the beginning.", - "short_description": "Teach Mycroft knowledge and humor.", - "branch": "master", - "examples": [ - "Do you want to learn something.", - "Do you already know this.", - "There you can learn something.", - "I show you something.", - "Can you keep a secret.", - "I tell you something private.", - "Please do not say what I'm talking about.", - "I want to explain it.", - "Houmor is probably not your strength.", - "Do you want to learn something", - "Do you already know this", - "There you can learn something", - "I show you something", - "can you keep a secret", - "I tell you something private", - "Please do not say what I'm talking about", - "I want to explain it", - "houmor is probably not your strength" - ], - "tags": [ - "learning", - "Productivity", - "Entertainment", - "Information", - "science", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 8, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/graduation-cap.svg", - "credits": [ - "Andreas Reinle(@gras64)" - ], - "categories": [ - "Entertainment", - "Information", - "Productivity" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Learning Skill", - "android_handler": "learning-skill.gras64.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-07-04T10:49:00Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-15T13:43:21Z", - "authorname": "luke5sky", - "skillname": "Telegram", - "foldername": "telegram-skill", - "name": "Telegram", - "url": "https://github.com/luke5sky/telegram-skill", - "category": "IoT", - "description": "You need to create a telegram bot (via BotFather) and save the Bot Token, your ChatID and your MyCroft Device name on home.mycroft.ai under skill settings.\nYou can now commmunicate with your MyCroft Unit via this bot.\n\nSettings:\n\nDetailed HowTo:\n\n\nOpen Telegram App on your smartphone, click on the search symbol in the upper right corner
\nSearch for BotFather and click on it
\nNow type /newbot hit enter
\nBotfather should reply with: Alright, a new bot. How are we going to call it? please chosse a name for your bot.
\nGive your bot a displayname like Mycroft
\nBotfather should reply with: Good. Now let's choose a username for your bot. It must end in bot. Like this, for example: TetrisBot or tetris-bot.
\nGive your bot unique username like lukesmycroftbot
\nBotfather should now give you your token for this bot
\nSave this token and don't post it online or send it to people, safety first!
\n\nTelegram documentation on botfather: https://core.telegram.org/bots#6-botfather\n\n\n\n\n\n It should respond with: This is your ChatID: YOURCHATID\nBOT TOKEN (MANDATORY): Your bot token you got from BotFather\n * DEVICE NAME (CASE SENSITIVE | MANDATORY): Your Device name you configured on home.mycroft.ai - Devices - Registered Devices\n * BOT TOKEN SECOND MYCROFT DEVICE (OPTIONAL): If you have a second Mycroft Device and you want to use this skill with it -> put your second bot token here (it has to be an other bot than the first one because telegram only allows one device to get updates from one bot)\n * SECOND MYCROFT DEVICE NAME (IF YOU HAVE A SECOND DEVICE): Your Device name from your second Device you configured on home.mycroft.ai - Devices - Registered Devices\n * PRIMARY USERNAME (OPTIONAL): You do not need to put anything here, the skill does not use this field. It is only for yourself to know which Chat ID belongs to whom\n * PRIMARY CHAT ID (MANDATORY): You will get your Chat ID from the Telegram-Skill if you have configured BOT TOKEN (first field) and DEVICE NAME, saved and then write anything to the bot.\n * SECOND USERNAME (OPTIONAL): For second User if you have one\n * SECOND CHAT ID (IF YOU HAVE A SECOND USER): Same as PRIMARY CHAT ID with Telegram-Account of second user\n * Install this skill on your Mycroft Device\n * Create a telegram bot:\n * Go to home.mycroft.ai - skills and search for the telegram-skills settings\n * Copy/paste your token botfather gave you in the field BOT TOKEN (MANDATORY)\n * Copy/paste your device name from home.mycroft.ai - devices in DEVICE NAME (CASE SENSITIVE | MANDATORY)\n * SAVE and wait till the settings are synced to your Mycroft Unit (or reboot your device to trigger the sync)\n * Open Telegram App on your smartphone and search (upper right corner) for your bot (username or displayname) click on it and write test or hello to your bot\n * Copy/paste this under PRIMARY CHAT ID (MANDATORY)\n * SAVE and wait till the settings are synced to your Mycroft Unit (or reboot your device to trigger the sync)\n * On every reboot your bot should send you this welcome message: Telegram-Skill on Mycroft Unit YOURUNIT is loaded and ready to use", - "short_description": "A skill to control your Mycroft instance through a TelegramBot.", - "branch": "master", - "examples": [], - "tags": [ - "IoT", - "bot", - "telegram-bot", - "messenger", - "Productivity", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 7, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/paper-plane.svg", - "credits": [ - "Lukas Gangel (@luke5sky)" - ], - "categories": [ - "IoT", - "Productivity" - ], - "requirements": { - "python": [ - "pytz>=2020.1", - "python-telegram-bot>=12.0" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Telegram Skill", - "android_handler": "telegram-skill.luke5sky.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-08-09T16:57:42Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-07T16:51:25Z", - "authorname": "LinusS1", - "skillname": "Email", - "foldername": "email-skill", - "name": "Email", - "url": "https://github.com/LinusS1/email-skill", - "category": "Productivity", - "description": "With this skill, Mycroft can check your email. With this skill, Mycroft can say the sender and the subject of each email. You can also request Mycroft to notify you when you get email, either any email, or just from a specific sender. In addition, this skill allows you to ask if you have any email, and will list the new email from that sender.\n\nTo configure this skill go [to the skill wiki](https://github.com/LinusS1/email-skill/wiki/Configuration)", - "short_description": "Check your email with Mycroft!", - "branch": "master", - "examples": [ - "Check my email.", - "Do I have any new emails?", - "Do I have any email from Bob?", - "Tell me when I get new mail.", - "Do I have any new mail?", - "Check my email", - "Tell me when I get new mail" - ], - "tags": [ - "email", - "emails", - "Productivity", - "mail", - "Daily", - "Information", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 7, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/envelope.svg", - "credits": [ - "Linus S (@LinusS1)" - ], - "categories": [ - "Productivity", - "Daily", - "Information" - ], - "requirements": { - "python": [ - "inflect", - "pyyaml" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Email Skill", - "android_handler": "email-skill.linuss1.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-11-05T20:34:10Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-10-26T08:49:09Z", - "authorname": "andlo", - "skillname": "THEIA IDE", - "foldername": "theia-ide-skill", - "name": "THEIA IDE", - "url": "https://github.com/andlo/theia-ide-skill", - "category": "Productivity", - "description": "This skill installs Theia IDE on your Mycroft device. This is an easy way to make and edit skills \nwith integratio to Github, and tools like mycroft-msm and mycroft-msk directly from the integrated \nshell.\n\nTheia provides Microsoft VS Code experience in the browser.\n\n### New in this release\npackages for other platforms. Installer wil always install latest Theia-for-Mycroft from \nhttps://github.com/andlo/theia-for-mycroft/ \nthan 4 Gb memmory.\ndebug adaptor https://github.com/andlo/remote-debug-skill and change settings for padatious\nsingle_thread. remote-debug skills is at time of writing on way to market and PR to makea setting\nfor controling padatious single_thread is on its way to mycroft.core. \n \n\nhttps://www.theia-ide.org/index.html\n\n\nInstaller rewrite so picroft is downloading precompiled package and prepaired for other precompiled\n * Installer Builds and compile on systems where there isnt precompiled package for if system has more\n * No more support for Mark_1 as debian jessie isnt supported and theia cant build properly. \n * Added workspace setting on home.mycroft.at. Default to skills directory.\n * Debug is working by using PTVSD, but requere remote-debug skill to activate and inject ", - "short_description": "Installs and setup THEIA IDE locally on your device. Real VS Code experience.", - "branch": "master", - "examples": [ - "Run IDE.", - "End theia IDE.", - "Restart IDE.", - "Run IDE", - "End theia IDE", - "Restart IDE" - ], - "tags": [ - "editor", - "vscode", - "dev", - "theia", - "Productivity", - "IDE", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 8, - "icon": "theia.png", - "credits": [ - "Andreas Lorensen (@andlo)" - ], - "categories": [ - "Productivity" - ], - "requirements": { - "python": [ - "ptvsd", - "pyls", - "python-language-server[all]", - "jedi", - "pylint", - "bandit", - "flake8", - "pycodestyle", - "pydocstyle", - "mypy" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Theia Ide Skill", - "android_handler": "theia-ide-skill.andlo.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-07-08T22:08:21Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-10-08T09:14:19Z", - "authorname": "pcwii", - "skillname": "This Project is no longer being maintained due to changes in Mycroft.ai Common Play structure.", - "foldername": "kodi-skill", - "name": "Kodi Control", - "url": "https://github.com/pcwii/kodi-skill", - "category": "Media", - "description": "###*New - Now Supports Music Playback (20200519)\nUtilize the kodi API and Python library for controlling the KODI open source media center with Mycroft.ai. The control is mostly geared towards videos/movies but is capable of handling cursor navigation as well.\nThe Kodi Skill uses conversational dialog to help you to control your KODI instance more naturally.", - "short_description": "Control KODI open source media center with Mycroft.ai", - "branch": "master", - "examples": [ - "Ask kodi to play the artist elvis Presley.", - "Ask kodi to play all shook up.", - "Ask kodi to play the album appeal to reason.", - "Ask kodi to play the movie guardians of the galaxy.", - "Ask kodi to play the film planet of the apes.", - "Ask kodi to play a random movie.", - "Turn kodi subtitles on.", - "Turn kodi subtitles off.", - "Skip kodi forward.", - "Skip kodi backward.", - "Pause kodi.", - "Pause the film.", - "Re-start kodi.", - "Stop the movie.", - "Stop kodi.", - "Set kodi volume to 100.", - "Set kodi volume to 25.", - "Show kodi movie information.", - "Hide kodi movie information.", - "Turn kodi notifications on.", - "Turn kodi notifications off.", - "Move the kodi cursor up / down / left / right / back / select / cancel.", - "Move the kodi cursor right 3 times.", - "Move the kodi cursor down twice.", - "Update the kodi library.", - "Clean the kodi library.", - "Ask kodi to list recently added movies.", - "Ask kodi to list the movies by genre.", - "Ask kodi to list the movies by studio.", - "List kodi movie sets.", - "List kodi movies by title.", - "List kodi movies by actor.", - "List all kodi movies." - ], - "tags": [ - "mycroft.ai,", - "python,", - "Leia,", - "'kodi,", - "Krypton", - "youtube'", - "Media", - "skills", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 18, - "requirements": { - "python": [ - "pafy>=0.5.4", - "youtube_dl>=2019.9.1", - "pychromecast", - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Kodi Skill", - "android_handler": "kodi-skill.pcwii.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-10-16T18:13:54Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-07-24T15:03:38Z", - "authorname": "andlo", - "skillname": "Auto volume", - "foldername": "auto-volume-skill", - "name": "Auto volume", - "url": "https://github.com/andlo/auto-volume-skill", - "category": "Daily", - "description": "This skill lets Mycroft decide when to use high, normal, or low volume. Mycrofts keeps monitoring the background sound levels using the microphone, using which it decides what volume level is the right one to use.\n\nAs it is not easy to know what is high and what is low noise level, the skill will adapt over time. The skill notices the highest and lowest measured levels over time and adjusts its settings according to those measurements.\n\nThe skill stops adjusting the volume if another skill is using the speaker or if Mycroft himself is talking.\n\nThe skill can be activated or deactivated using the command \"Hey Mycroft, set auto volume off\" or \"Hey Mycroft, set auto volume on\".", - "short_description": "Sets the volume depending on background noise level", - "branch": "master", - "examples": [ - "Set auto volume on.", - "Set auto volume off.", - "Clear auto volume measurements.", - "Set auto volume on", - "Set auto volume off", - "Clear auto volume measurements" - ], - "tags": [ - "Configuration", - "volume", - "Daily", - "no-license" - ], - "platforms": [ - "platform_mark1", - "platform_picroft" - ], - "stars": 8, - "icon": "icon.png", - "credits": [ - "Andreas Lorensen (@andlo)" - ], - "categories": [ - "Daily", - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Auto Volume Skill", - "android_handler": "auto-volume-skill.andlo.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-09-05T09:03:49Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-26T10:09:46Z", - "authorname": "AIIX", - "skillname": "Youtube Player", - "foldername": "youtube-skill", - "name": "Youtube Player", - "url": "https://github.com/AIIX/youtube-skill", - "category": "Media", - "description": "Play and Stream Youtube Videos", - "short_description": "Play and stream youtube videos", - "branch": "master", - "examples": [ - "Youtube Metallica.", - "Search Youtube For Metallica.", - "Pause Youtube.", - "Resume Youtube.", - "Hey Mycroft Youtube Metallica", - "Hey Mycroft Search Youtube For Metallica", - "Hey Mycroft Pause Youtube", - "Hey Mycroft Resume Youtube" - ], - "tags": [ - "Youtube", - "GUI", - "YoutubeVideos", - "VideoStreaming", - "Music", - "Media", - "Video", - "AudioStreaming", - "no-license" - ], - "platforms": [ - "platform_mark2", - "platform_plasmoid" - ], - "stars": 11, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/video.svg", - "credits": [ - "Aix (@aiix)" - ], - "categories": [ - "Media" - ], - "requirements": { - "python": [ - "timeago", - "bs4", - "python-dateutil", - "requests_cache", - "pafy", - "json_database", - "youtube-dl", - "requests>=1.1" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": "https://raw.githubusercontent.com/AIIX/youtube-skill/master/res/icon/youtube-skill.png", - "android_name": "Youtube Skill", - "android_handler": "youtube-skill.aiix.home" - }, - "desktop": { - "X-DBUS-StartupType": "None", - "X-KDE-StartupNotify": "false", - "Version": "1.0", - "Terminal": "false", - "Type": "Application", - "Name": "Youtube", - "Exec": "mycroft-gui-app --hideTextInput --skill=youtube-skill.aiix.home", - "Icon": "youtube-skill", - "Categories": "VoiceApp", - "StartupNotify": "false" - }, - "desktopFile": true - }, - { - "created": "2018-01-06T09:08:31Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-06-19T09:19:42Z", - "authorname": "CarstenAgerskov", - "skillname": "Mosquito Speak", - "foldername": "skill-mosquito-speak", - "name": "Mosquito Speak", - "url": "https://github.com/CarstenAgerskov/skill-mosquito-speak", - "category": null, - "description": "This skill has two purposes:\n1) Instead of triggering a skill by asking Mycroft a question, this skill triggers when a text message is received on mqtt.\nIt can be used for notifications. For instance, a smart home server could publish the text \"Somebody is at the door\", if the doorbell is pressed.\nIt is possible to make Mycroft repeat the last text it received on mqtt.\n\n2) Send an utterance in text from mqtt, to activate other skills. For instance, if your\nhome automation detect that a window is opened, send the text \"_utterance remind me to close the window in 10 minutes\" on mqtt to\ntrigger the \"reminder\" skill.\n\n\n### Configuration\nThe skill is configured on your \"Mycroft Home\" page. Configure the mqtt server, port and topic that the skill will listen for text messages on.\nCurrently, password or certificates are not supported. (Maybe I will implement it if you promise to test it :)\n\nTwo topics are available in the configuration: \"Mqtt topic\" and \"Mqtt alert topic\".\nThe \"Mqtt alert topic\" is a priority topic, that will always be active, even if mycroft is sleeping.\nThe \"Mqtt topic\" will be silent if mycroft is sleeping. You can put mycroft to sleep by using the command \"Hey Mycroft, go to sleep\".\n\nA restart of the skill is needed when changing the configuration.\n\nOptionally, it is possible to split the text, using a regular expression.\n\nExample CamelCase: If you send the string \"KitchenWindow is open\",\nyou want to split KitchenWindow. After the split Mycroft will say \"Kitchen Window is open\". To do that set the parameters on \"Mycroft Home\" like this:\n* Split text at pattern (optional): `[a-z][A-Z]`\n* Retain characters in matched string until index: 1\n* Retain characters in matched string from index: 1\n\nWhat happens: The regex match \"nK\" in \"KitchenWindow is open\". We retain the characters until index 1 of \"nK\", which is n.\nWe retain the characters after index 1 of \"nK\", which is K. And we put a space in the middle.\n\nExample hypen: Convert \"Outside-temperature is -5 degrees\" to \"Outside temperature is -5 degrees\"\n* Split text at pattern (optional): `[a-z|A-Z]-[a-z|A-Z]`\n* Retain characters in matched string until index: 1\n* Retain characters in matched string from index: 2\n\nWhat happens: The regex match \"e-t\" in \"Outside-temperature is -5 degrees\". We retain the characters until index 1 of \"e-t\", which is e.\nWe retain the characters after index 2 of \"e-t\", which is t. And we put a space in the middle.\n\nExample underscore: Convert \"Kitchen_window is open\" to \"Kitchen Window is open\"\n* Split text at pattern (optional): _\n* Retain characters in matched string until index: 0\n* Retain characters in matched string from index: 1\n\nWhat happens: The regex match \"_\" in \"Kitchen_window is open\". We retain the characters until index 0 of \"_\", which is no characters.\nWe retain the characters after index 1 of \"_\", which is no characters. And we put a space in the middle.", - "short_description": "", - "branch": "master", - "examples": [ - "Out/text.", - "You, at a linux command prompt: mosquitto_pub -h mqttserver -t my-out/text -m.", - ":", - "You:", - ":", - "You, at a linux command prompt: mosquitto_pub -h mqttserver -t my-out/text -m.", - ":", - ":", - "You, at a linux command prompt: mosquitto_pub -h mqttserver -t my-out/text -m the washing machine is done", - "Mycroft: the washing machine is done", - "You: Hey Mycroft, what was the last mosquito message", - "Mycroft: the washing machine is done", - "You, at a linux command prompt: mosquitto_pub -h mqttserver -t my-out/text -m _utterance remind me to close the window in 10 minutes", - "Mycroft: reminder set for 9 minute and 59 seconds from now", - "Mycroft: you have a reminder to close the window" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 9, - "credits": [ - "[Carsten Agerskov](https://github.com/CarstenAgerskov)\n\nAlert topic thanks to [tobus3000](https://github.com/tobus3000)" - ], - "requirements": { - "python": [ - "paho-mqtt", - "future" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mosquito Speak Skill", - "android_handler": "skill-mosquito-speak.carstenagerskov.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-03-27T15:44:21Z", - "archived": false, - "license": "unknown", - "modified": "2020-10-20T01:21:53Z", - "authorname": "JarbasAl", - "skillname": "", - "foldername": "skill-camera", - "name": "", - "url": "https://github.com/JarbasAl/skill-camera", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 5, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Camera Skill", - "android_handler": "skill-camera.jarbasal.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-12-07T18:43:59Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-11T19:34:29Z", - "authorname": "domcross", - "skillname": "Mycroft Chat", - "foldername": "mycroft-chat-skill", - "name": "Mycroft Chat", - "url": "https://github.com/domcross/mycroft-chat-skill", - "category": "Daily", - "description": "In your [skill settings](https://home.mycroft.ai) you must enter your username (as given in your Mycroft Chat account settings) and your personal access token.\nIn case you do not have a token you can specify your login-id (usually that is your email) and your password.\nNOTE: your password will be stored in clear text in your settings.json!)\n\nThere is also the option to set the time interval between refresh/check for updates.\nWhen monitoring is active the skill will use that time period for automated checking.\nThe option \"notify on updates\" is only applicable when monitoring is active -\nwhen the option is activated Mycroft willl speak out loud the number of unread messages and mentions.", - "short_description": "The [Mycroft Chat](https://chat.mycroft.ai) allows you to interact with other community users.", - "branch": "master", - "examples": [ - "Are there unread messages on Mycroft Chat.", - "Name Mycroft Chat channels with unread messages.", - "Read all unread Mycroft Chat messages.", - "Read messages for the channel {name}", - "Begin monitoring of Mycroft Chat.", - "Stop monitoring of Mycroft Chat.", - "Are there unread messages on Mycroft Chat", - "Name Mycroft Chat channels with unread messages", - "Read all unread Mycroft Chat messages", - "Begin monitoring of Mycroft Chat", - "Stop monitoring of Mycroft Chat" - ], - "tags": [ - "[![Say", - "this", - "to", - "chat", - "the", - "skill!](https://img.shields.io/badge/Say%20Thanks-!-1EAEDB.svg)](https://saythanks.io/to/domcross)", - "Thanks", - "of", - "Productivity", - "author", - "Information", - "Daily", - "mattermost", - "mattermost\n\n\n[![Say Thanks to the author of this skill!](https://img.shields.io/badge/Say%20Thanks-!-1EAEDB.svg)](https://saythanks.io/to/domcross)", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 4, - "icon": "icon.png", - "credits": [ - "Dominik (@domcross)\n\nSkill [suggested](https://community.mycroft.ai/t/mattermost-for-mycroft/5293) by Andreas Lorenson (@andlo)" - ], - "categories": [ - "Daily", - "Information", - "Productivity" - ], - "requirements": { - "python": [ - "rapidfuzz>=0.12.2", - "mattermostdriver>=7.1.0" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Chat Skill", - "android_handler": "mycroft-chat-skill.domcross.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-05-10T01:57:37Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-02-08T19:30:34Z", - "authorname": "JonStratton", - "skillname": "Wrapper Aircrack", - "foldername": "skill-aircrack", - "name": "Wrapper Aircrack", - "url": "https://github.com/JonStratton/skill-aircrack", - "category": "Information", - "description": "A simple Mycroft wrapper for a small subset of Aircrack-ng. Basically, it can list networks and interfaces, bring interfaces up in monitor mode, deauth clients, and crack WPA2 passwords.", - "short_description": "A simple Mycroft wrapper for a small subset of Aircrack-ng.", - "branch": "master", - "examples": [ - "List interfaces.", - "Select interface number one.", - "List wireless networks.", - "Select network number three.", - "Start Monitor.", - "Disconnect Clients.", - "Crack Password.", - "Stop Monitor." - ], - "tags": [ - "aircrack-ng", - "wifi", - "aircrack", - "Information", - "no-license" - ], - "platforms": [ - "platform_picroft", - "platform_plasmoid" - ], - "stars": 12, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "Jon Stratton (@JonStratton)" - ], - "categories": [ - "Information" - ], - "requirements": { - "python": [ - "pexpect" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Aircrack Skill", - "android_handler": "skill-aircrack.jonstratton.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-07-13T16:10:26Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-05-19T06:15:29Z", - "authorname": "forslund", - "skillname": "Cocktails", - "foldername": "skill-cocktail", - "name": "Cocktails", - "url": "https://github.com/forslund/skill-cocktail", - "category": "Information", - "description": "Let Mycroft help you mix better and more fun drinks and cocktails. When asked Mycroft provides ingredients and mixing instructions for various drinks. The skill uses the fabulous [theCocktailDB](https://thecocktaildb.com/).", - "short_description": "Get help mixing drinks.", - "branch": "master", - "examples": [ - "How do I mix a Moscow Mule.", - "How do I make a daiquiri.", - "how do I mix a Moscow Mule", - "how do I make a daiquiri" - ], - "tags": [ - "recipies", - "cocktails", - "drinks", - "Information", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 3, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/cocktail.svg", - "credits": [ - "@forslund" - ], - "categories": [ - "Information" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Cocktail Skill", - "android_handler": "skill-cocktail.forslund.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-10-27T18:30:40Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-10-07T23:56:01Z", - "authorname": "zelmon64", - "skillname": "Finished Booting Skill", - "foldername": "skill-finished-booting", - "name": "Finished Booting Skill", - "url": "https://github.com/zelmon64/skill-finished-booting", - "category": "Configuration", - "description": "With this skill Mycroft will say when the boot up period has finished and is ready to receive commands.", - "short_description": "Skill to determine when Mycroft AI has finished booting up.", - "branch": "master", - "examples": [], - "tags": [ - "Configuration", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "icon": "https://rawgithub.com/FortAwesome/Font-Awesome/master/advanced-options/raw-svg/solid/flag-checkered.svg", - "credits": [ - "zelmon64 (@zelmon64), Wally Fort (@fortwally), JarbasAI (@JarbasAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Finished Booting Skill", - "android_handler": "skill-finished-booting.zelmon64.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-11-02T20:13:21Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-06-05T20:58:53Z", - "authorname": "andlo", - "skillname": "Fairytalez", - "foldername": "fairytalez-skill", - "name": "Fairytalez", - "url": "https://github.com/andlo/fairytalez-skill", - "category": "Entertainment", - "description": "This skill enables Mycroft to tell lots of fairytales. So make a cup of coco, and sit back and enjoy listning to the good tales.\n\nContent is from fairytalez.com, so please go visit there if you like the stories.\nFairytalez.com is the world's largest collection of fairy tales, fables and folktales. Discover more than 2,000 classic tales plus new stories by fairy tale fans.\n\nhttp://www.fairytalez.com\n\n\n_“If you want your children to be intelligent, read them fairy tales. If you want them to be more\nintelligent, read them more fairy tales.”\nAlbert Einstein_", - "short_description": "Mycroft tells more then 2000 fairy tales, folk tales, and fables from all around the world.", - "branch": "master", - "examples": [ - "Tell a fairy tale.", - "Tell me the story The Little Match Girl.", - "Continue story.", - "Tell a fairy tale", - "Tell me the story The Little Match Girl", - "Continue story" - ], - "tags": [ - "fairy", - "stories", - "fairytale", - "fairytales", - "Entertainment", - "tales", - "story", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 6, - "icon": "story-512.png", - "credits": [ - "Andreas Lorensen (@andlo) and the super comunity around Mycroft" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [ - "bs4" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Fairytalez Skill", - "android_handler": "fairytalez-skill.andlo.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-12-24T22:57:14Z", - "archived": false, - "license": "apache-2.0", - "modified": "2019-10-17T22:38:32Z", - "authorname": "TREE-Ind", - "skillname": "Bedtime Stories", - "foldername": "bedtime-stories-skill", - "name": "Bedtime Stories", - "url": "https://github.com/TREE-Ind/bedtime-stories-skill", - "category": "Entertainment", - "description": "A skill that has a small selection of famous bedtime stories provided by Librivox.\n\nStories are downloaded with the skill and can be listed by voice, selected by title, or chosen randomly.", - "short_description": "Listen to famous bedtime stories.", - "branch": "master", - "examples": [ - "Read me a bedtime story.", - "What bedtime stories do you know?", - "Read me little red riding hood.", - "Hey mycroft, read me a bedtime story", - "Hey mycroft, what bedtime stories do you know", - "Hey mycroft, read me little red riding hood" - ], - "tags": [ - "audio", - "Entertainment", - "stories", - "kidfriendly", - "no-license" - ], - "platforms": [ - "platform_mark1", - "platform_picroft", - "platform_kde", - "platform_mark2" - ], - "stars": 7, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/book-open.svg", - "credits": [ - "TREE Industries" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Bedtime Stories Skill", - "android_handler": "bedtime-stories-skill.tree-ind.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-11-10T00:27:07Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-07T16:43:34Z", - "authorname": "LinusS1", - "skillname": "Skill Recommendations", - "foldername": "fallback-recommendations-skill", - "name": "Skill Recommendations", - "url": "https://github.com/LinusS1/fallback-recommendations-skill", - "category": "Daily", - "description": "When Mycroft doesn't know something, this fallback skill will look up skills from the Marketplace that could help you complete your request. If it finds an appropriate skill, this will be downloaded to your device.", - "short_description": "When Mycroft doesn't know something, look up and download a skill that can handle that request.", - "branch": "master", - "examples": [ - "(Utterances of any skill not yet installed)", - "..." - ], - "tags": [ - "search", - "find-skill", - "find", - "Configuration", - "dumb", - "Media", - "Information", - "Daily", - "skills", - "fallback", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 6, - "icon": "https://rawgit.com/FortAwesome/Font-Awesome/master/svgs/solid/brain.svg", - "credits": [ - "Linus S (@LinusS1)" - ], - "categories": [ - "Daily", - "Configuration", - "Information", - "Media" - ], - "requirements": { - "python": [ - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Fallback Recommendations Skill", - "android_handler": "fallback-recommendations-skill.linuss1.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-01-10T23:03:20Z", - "archived": false, - "license": "mit", - "modified": "2019-12-18T05:17:48Z", - "authorname": "JamesPoole", - "skillname": "Podcasts", - "foldername": "podcast-skill", - "name": "Podcasts", - "url": "https://github.com/JamesPoole/podcast-skill", - "category": "Entertainment", - "description": "With this skill, you can add your favorite podcasts an\nSelect your favourite podcasts and listen to episodes from those podcasts. You can also check with Mycroft if there are any new episodes available from your chosen podcasts.\n\nYou can now also scroll through all episodes of your chosen podcasts.", - "short_description": "Listen to episodes of your favourite podcasts", - "branch": "master", - "examples": [ - "Play the podcast linux unplugged.", - "Check for new episodes.", - "Put on the podcast linux unplugged.", - "What is the latest episode of late night linux?", - "play the podcast linux unplugged", - "check for new episodes", - "put on the podcast linux unplugged", - "what is the latest episode of late night linux?" - ], - "tags": [ - "podcasts", - "Music", - "Media", - "Entertainment", - "podcast", - "Information", - "play", - "listen", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 7, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/podcast.svg", - "credits": [ - "James Poole (@JamesPoole)\n[@domcross](https://github.com/domcross)\n[@LinusS1](https://github.com/LinusS1)\n[@backassward](https://github.com/backassward)\n[@zasghu](https://github.com/zasghu)" - ], - "categories": [ - "Entertainment", - "Information", - "Music", - "Media" - ], - "requirements": { - "python": [ - "podcastparser", - "python-vlc" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Podcast Skill", - "android_handler": "podcast-skill.jamespoole.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-03-09T16:28:33Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-06-15T05:05:00Z", - "authorname": "JarbasSkills", - "skillname": "Laugh", - "foldername": "skill-laugh", - "name": "Laugh", - "url": "https://github.com/JarbasSkills/skill-laugh", - "category": "Entertainment", - "description": "Laugh randomly or when requested, gender configurable on home.mycroft.ai", - "short_description": "Makes Mycroft laugh like a maniac", - "branch": "master", - "examples": [ - "Laugh like Alexa.", - "Random laughter.", - "Do the evil laugh.", - "Laugh like Alexa", - "can you laugh" - ], - "tags": [ - "Entertainment", - "funny", - "repeating", - "laugh", - "entertainment", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 4, - "icon": "https://github.com/JarbasSkills/skill-laugh/res/icon/laugh_icon.png", - "credits": [ - "[@JarbasAl](https://jarbasal.github.io)\n[SoundBible](http://soundbible.com/suggest.php?q=laugh&x=0&y=0)\n[FreeSound](https://freesound.org/search/?q=female+evil+laugh)" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": "laugh_icon", - "android_name": "Laugh Skill", - "android_handler": "skill-laugh.jarbasskills.home" - }, - "desktop": { - "X-DBUS-StartupType": "None", - "X-KDE-StartupNotify": "false", - "Version": "1.0", - "Terminal": "false", - "Type": "Application", - "Name": "Laugh", - "Exec": "mycroft-gui-app --hideTextInput --skill=skill-laugh.jarbasskills.home", - "Icon": "laugh_icon", - "Categories": "VoiceApp", - "StartupNotify": "false" - }, - "desktopFile": true - }, - { - "created": "2018-06-07T16:55:28Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-11T17:27:08Z", - "authorname": "domcross", - "skillname": "FHEM Skill for Mycroft", - "foldername": "fhem-skill", - "name": "FHEM Skill for Mycroft", - "url": "https://github.com/domcross/fhem-skill", - "category": null, - "description": "This is a skill to add [Fhem](https://fhem.de) support to\n[Mycroft](https://mycroft.ai). Currently supported is turning on and off several entity types (`light`, `switch`, `outlet`), changing temperature (`thermostat`) and get status information (`sensor`, `thermometer`). You can also check if a person is present (that is represented by a Fhem-device of type ROOMMATE).\n\nMake sure you have your Fhem settings filled out on home.mycroft.ai.", - "short_description": "This is a skill to add [Fhem](https://fhem.de) support to", - "branch": "master", - "examples": [ - "Device*", - "Check if given room has exactly one device of desired type (e.g. only one.", - "Search for closest matching device ID or alias name.", - "Prefer devices that are in the desired room.", - "check if given room has exactly one device of desired type (e.g. only one thermostat)", - "search for closest matching device ID or alias name.", - "prefer devices that are in the desired room" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 3, - "requirements": { - "python": [ - "fhem", - "rapidfuzz==0.12.2", - "responses", - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Fhem Skill", - "android_handler": "fhem-skill.domcross.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-05-30T02:09:43Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-08-29T00:29:16Z", - "authorname": "dmwilsonkc", - "skillname": "Magic Mirror Voice Control", - "foldername": "magic-mirror-voice-control-skill", - "name": "Magic Mirror Voice Control", - "url": "https://github.com/dmwilsonkc/magic-mirror-voice-control-skill", - "category": "IoT", - "description": "This mycroft skill passes commands to an accessible MagicMirror installed anywhere on the same network as Mycroft. It requires a working install of [MagicMirror](https://github.com/MichMich/MagicMirror) and the [MMM-Remote-Control module](https://github.com/Jopyth/MMM-Remote-Control). It must be installed AND ACCESSIBLE ON THE SAME NETWORK AS MYCROFT.\n\nThis skill requires MMM-Remote-Control be installed and working properly on the MagicMirror.\n\nYou must configure the MagicMirror's config.js file to properly whitelist the ip address of your Mycroft.\n\nIn the MagicMirror's config.js:\n\nReplace: address: \"localhost\", With: address: \"0.0.0.0\", and\n\nReplace: ipWhitelist: [\"127.0.0.1\", \"::ffff:127.0.0.1\", \"::1\"], with ipWhitelist: [\"127.0.0.1\", \"192.168.X.1/24\"],\n\nYou can use this skill to hide or show modules, update the mirror or individual modules,\nrefresh or restart the mirror, list installed modules, install modules by name (will still require you\nto configure the MagicMirror config.js by SSH or VNC for the particular skill you install), change pages of modules by either swipe commands or telling mycroft to \"go to page [number]\"(requires that [MMM-pages](https://github.com/edward-shen/MMM-pages) be installed), restart or reboot the Raspberry Pi.", - "short_description": "Give voice commands to Mycroft to control a MagicMirror.", - "branch": "master", - "examples": [ - ": hide clock.", - "Show clock.", - "Turn on weather.", - "Turn off weather.", - "Show [insert module name]", - "Hide [insert module name]", - "Update mirror.", - "Update [insert module name]", - "Restart pi.", - "Restart mirror.", - "Refresh mirror.", - "Reboot raspberry pi.", - "Show article details.", - "Hide article details.", - "Swipe left.", - "Swipe right.", - "List installed modules.", - "Hey Mycroft: hide clock", - "show clock", - "turn on weather", - "turn off weather", - "show [insert module name]", - "hide [insert module name]", - "update mirror", - "update [insert module name]", - "restart pi", - "restart mirror", - "refresh mirror", - "reboot raspberry pi", - "show article details (for news feed)", - "hide article details", - "swipe left (requires pages module to be installed)", - "swipe right (requires pages module to be installed)", - "list installed modules (Mycroft will tell you which MagicMirror modules are installed)" - ], - "tags": [ - "IoT", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 3, - "icon": "https://cdn1.iconfinder.com/data/icons/mirror/512/magic-mirror-look-glass-home-512.png", - "categories": [ - "IoT" - ], - "credits": [ - "[dmwilsonkc](https://github.com/dmwilsonkc)," - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Magic Mirror Voice Control Skill", - "android_handler": "magic-mirror-voice-control-skill.dmwilsonkc.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-05-17T23:56:07Z", - "archived": false, - "license": "mit", - "modified": "2019-10-29T21:49:58Z", - "authorname": "deejcunningham", - "skillname": "score", - "foldername": "skill-score", - "name": "score", - "url": "https://github.com/deejcunningham/skill-score", - "category": null, - "description": "Skill-score is an application that enables Mycroft to answer user questions about Major League Baseball (MLB) scores. [Mycroft](https://mycroft.ai) is an open-source AI voice assistant. Skill-score uses [panzarino's mlbgame API](https://github.com/panzarino/mlbgame) to report an MLB team's latest final scores, including live scores.\n\nUser input has the format:\n\"What is the {team}'s score?\"\n\nIf a game is in progress, Mycroft will respond:\n\"The {team} are winning/losing {score} to {score} against the {opponent} in the top/middle/bottom/end of the {inning}.\"\n\nIf a game is not in progress, Mycroft will respond:\n\"The {team} won/lost {score} to {score} against the {opponent} {number-of-days} ago.\"\n\n### Next Goals\n\nThe next goals for skill-score are the ability to:\n* give the time of the next MLB game; and\n* support more leagues (e.g., National Football League, National Basketball League), depending on available APIs.", - "short_description": "", - "branch": "master", - "examples": [ - "What is the Royals score?", - "What is the Angels score?", - "What is the Yankees score?", - "what is the Royals score", - "what is the Angels score", - "what is the Yankees score" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 3, - "requirements": { - "python": [ - "datetime", - "mlbgame" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Score Skill", - "android_handler": "skill-score.deejcunningham.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-02-06T23:07:51Z", - "archived": false, - "license": "apache-2.0", - "modified": "2019-04-13T21:47:02Z", - "authorname": "MycroftAI", - "skillname": "Persona Fallback", - "foldername": "skill-fallback-persona", - "name": "Persona Fallback", - "url": "https://github.com/MycroftAI/skill-fallback-persona", - "category": "Daily", - "description": "Persona is a Q and A machine learning algorithm that gives Mycroft personality", - "short_description": "A fallback that utilizes the Persona engine", - "branch": "master", - "examples": [ - "What is your favorite color?", - "What is the meaning of life?" - ], - "tags": [ - "Daily", - "fallback", - "personality", - "persona", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 3, - "icon": "https://rawgithub.com/FortAwesome/Font-Awesome/master/advanced-options/raw-svg/solid/brain.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Daily" - ], - "requirements": { - "python": [ - "eventlet==0.22.1" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Fallback Persona Skill", - "android_handler": "skill-fallback-persona.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-12-04T17:24:58Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-23T20:29:02Z", - "authorname": "MycroftAI", - "skillname": "Query", - "foldername": "skill-query", - "name": "Query", - "url": "https://github.com/MycroftAI/skill-query", - "category": "Information", - "description": "Negotiates handling of questions by calling all registered Common Query Skills. This is done by sending a `question:query` message with the utterance to give the skills the posibility to report back if they can answer the question and at which confidence.", - "short_description": "Negotiates the best answer to a question", - "branch": "20.08", - "examples": [ - "How tall is Abraham Lincoln?", - "What is an Aardwark?", - "Why is the sky blue?" - ], - "tags": [ - "Information", - "system", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 3, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/question.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Information" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Query Skill", - "android_handler": "skill-query.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-02-15T01:32:02Z", - "archived": false, - "license": "mit", - "modified": "2020-01-27T18:06:54Z", - "authorname": "MatthewScholefield", - "skillname": "Repeat Recent", - "foldername": "skill-repeat-recent", - "name": "Repeat Recent", - "url": "https://github.com/MatthewScholefield/skill-repeat-recent", - "category": null, - "description": "This will save the most recent text to speech and speech to text utterances to show to the user.", - "short_description": "", - "branch": "master", - "examples": [ - "Repeat what you just said.", - "Repeat that.", - "Can you repeat that?", - "What did I just say?", - "Tell me what I just said." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 5, - "credits": [ - "Matthew Scholefield" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Repeat Recent Skill", - "android_handler": "skill-repeat-recent.matthewscholefield.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-10-16T15:03:26Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-09-20T12:16:56Z", - "authorname": "AIIX", - "skillname": "Soundcloud Player", - "foldername": "soundcloud-audio-player", - "name": "Soundcloud Player", - "url": "https://github.com/AIIX/soundcloud-audio-player", - "category": "Music", - "description": "SoundCloud is a music and podcast streaming platform that lets you listen to millions of songs from around the world, This skill enables you to stream and search for your favorite soundcloud tracks on your device.", - "short_description": "Play songs and music from soundcloud", - "branch": "master", - "examples": [ - "Soundcloud Metallica.", - "Pause Soundcloud.", - "Resume Soundcloud.", - "Hey Mycroft Soundcloud Metallica", - "Hey Mycroft Pause Soundcloud", - "Hey Mycroft Resume Soundcloud" - ], - "tags": [ - "GUI", - "MusicStreaming", - "Songs", - "Streaming", - "MusicSearch", - "Soundcloud", - "Sound", - "Music", - "SongSearch", - "Online", - "MusicPlayer", - "no-license" - ], - "platforms": [ - "platform_mark2", - "platform_plasmoid" - ], - "stars": 4, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/headphones.svg", - "credits": [ - "Aix (@AIIX)" - ], - "categories": [ - "Music" - ], - "requirements": { - "python": [ - "pafy", - "youtube-dl", - "requests>=1.1" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": "/res/icon/soundcloud-skill.png", - "android_name": "Soundcloud", - "android_handler": "soundcloud-audio-player.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-06-14T20:55:15Z", - "archived": false, - "license": "apache-2.0", - "modified": "2019-06-13T16:14:34Z", - "authorname": "TREE-Ind", - "skillname": "Desktop Control", - "foldername": "desktop-control", - "name": "Desktop Control", - "url": "https://github.com/TREE-Ind/desktop-control", - "category": "Productivity", - "description": "A skill that allows voice control over your mouse and keyboard using natural language. This skill should be compatible with any Mycroft instance that is installed on a system with display drivers / screen.", - "short_description": "Control your mouse and keyboard by voice.", - "branch": "master", - "examples": [ - "Type Mycroft is awesome.", - "Press the enter key.", - "Move mouse to 400 and 100.", - "Scroll up a bit.", - "Scroll down a bit.", - "Scroll down some.", - "Scroll down a lot.", - "Hold space key.", - "Release space key.", - "Screen resolution.", - "Select all.", - "Select all and copy.", - "type Mycroft is awesome", - "press the enter key", - "move mouse to 400 and 100", - "scroll up a bit", - "scroll down a bit", - "scroll down some", - "scroll down a lot", - "hold space key", - "release space key", - "screen resolution", - "select all", - "select all and copy" - ], - "tags": [ - "keyboard", - "screen", - "desktop", - "Productivity", - "mouse", - "no-license" - ], - "platforms": [ - "platform_plasmoid", - "platform_mark2" - ], - "stars": 6, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/desktop.svg", - "categories": [ - "Productivity" - ], - "credits": [ - "TREE Industries" - ], - "requirements": { - "python": [ - "python3-xlib >=0.15", - "pyautogui >=0.9.36", - "num2words >=0.5.6" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Desktop Control Skill", - "android_handler": "desktop-control.tree-ind.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-12-25T01:28:55Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-05-16T21:25:38Z", - "authorname": "LinusS1", - "skillname": "Communications", - "foldername": "communications-skill", - "name": "Communications", - "url": "https://github.com/LinusS1/communications-skill", - "category": "Daily", - "description": "Use this skill to broadcast messages across your home.\nWhen this skill is installed on two or more of your devices, the devices will automatically find and connect to each other.\n\nAfter they connect, you can say something like \"Announce dinner's ready\" and all your devices will say that message.\nIf you want to send a message to a specific device, all you need to say is \"Ask the kitchen when dinner is ready.\"\n\nIf you want to reply to an announcement all you need to say is \"Reply to the message\"\n\nThe names of the devices, along with the placements, (the kitchen, Chris' room, etc...) can be named on [Mycroft Home](home.mycroft.ai). The names and placements are used to identify the device to send the message when you send a message. \n\n**Setup**\nOn certain devices (most likely the Mark I), you will have to allow incoming connections through the firewall. Run the following commands on your device:\n\n`sudo ufw allow from any to any port 4445 proto tcp`\n\n`sudo ufw allow from any to any port 4446 proto tcp`\n\n**If the skill does not work, make sure you've entered those commands, and restarted your device**\n\n**Security**\nThe skill does try to do some basic security implementations, however you **MUST** run this on a WPA2 secured wifi network, if you use wifi.\n\n**Roadmap**\nThis is only the beginning of this skill!\nThe future includes:\n - Not having to allow ports in (this will be done automatically)\n - Calling and video calling!", - "short_description": "An intercom, messaging, and (video) calling skill for Mycroft!", - "branch": "master", - "examples": [ - "Announce that.", - "Announce.", - "Announce.", - "Message the kitchen when will dinner be ready?", - "Send a message to the living room.", - "Tell everyome that the dinner is ready!", - "Reply to the message.", - "Announce that Dinner is ready", - "Announce the cat is outside", - "Announce (anything you want)", - "Reply to the message" - ], - "tags": [ - "IoT", - "intercom", - "calling", - "communications", - "intercoms", - "communication", - "video", - "Media", - "call", - "connect", - "Entertainment", - "broadcasting", - "Daily", - "devices", - "Information", - "Productivity", - "broadcast", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 13, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/comments.svg", - "credits": [ - "Linus S (@LinusS1)" - ], - "categories": [ - "Daily", - "Entertainment", - "Information", - "IoT", - "Media", - "Productivity" - ], - "requirements": { - "python": [ - "zeroconf", - "ifaddr", - "py2p" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Communications Skill", - "android_handler": "communications-skill.linuss1.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-11-11T17:31:25Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-03-16T09:13:29Z", - "authorname": "richhowley", - "skillname": "National Parks", - "foldername": "national-parks-skill", - "name": "National Parks", - "url": "https://github.com/richhowley/national-parks-skill", - "category": "Information", - "description": "Get listings of US National Parks by state, have Mycroft read descriptions of national parks and even test your knowledge of where National Parks are located. \n\nTo use this skill you will need to obtain an API key from the [National Park Service](https://www.nps.gov/subjects/developer/get-started.htm). Just follow the link and fill in the form, it's free and you will not be required to create an account. When the skill is installed there will be a new settings entry in the Skills section of [Mycroft Home](https://home.mycroft.ai) under National Parks. Paste in your API key and click the Save button. As soon as the skill picks up the API key it will be able to connect to the NPS servers.\n \nFor the purpose of this skill the term \"National Park\" is used loosely to refer to almost any property managed by the US National Park Service. Properties with a designation of National Monument, National Historic Site or National Recreation Area will be included in park listings. The only designation that is explicitly excluded from park listings is National Historic Trail. All information is provided by the National Park Service.\n\nWhen asking for a park description the skill will do a search on the words given, so one does not need to say the complete park name. For example, 'describe Edgar national park\", \"describe Edgar Allan national park\" and \"describe Edgar Allan Poe national park\" will all provide a description of Edgar Allan Poe National Historic Site. \n\nSince definite articles are dropped from speech, searches for descriptions of some properties will fail if they are included. For example, trying to hear a description of Rosie the Riveter WWII Home Front National Historical Park by saying \"describe Rosie the Riveter national park\" will fail but \"describe Rosie national park\" and \"describe Riveter national park\" will succeed.\n\nAfter asking to be quizzed Mycroft will ask what state a particular National Park Service property is in. The answer may be spoken after the beep without using the wake word but there will only be a few seconds to answer. If Mycroft does not respond to the answer use the wake word with \"Repeat national parks quiz\" and answer after the beep.", - "short_description": "Information on US National Parks", - "branch": "master", - "examples": [ - "List national parks in Utah.", - "Describe Yellowstone national park.", - "Quiz me on national parks.", - "Repeat national parks quiz.", - "List national parks in Utah", - "Describe Yellowstone national park", - "Quiz me on national parks", - "Repeat national parks quiz" - ], - "tags": [ - "parks", - "Information", - "nationalparks", - "vacation", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/tree.svg", - "credits": [ - "@richhowley" - ], - "categories": [ - "Information" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "National Parks Skill", - "android_handler": "national-parks-skill.richhowley.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-10-05T19:13:32Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-10-18T17:14:06Z", - "authorname": "andlo", - "skillname": "Count", - "foldername": "count-skill", - "name": "Count", - "url": "https://github.com/andlo/count-skill", - "category": "Daily", - "description": "This skill lets Mycroft do counting to a number or and countdown from a number.", - "short_description": "Count and countdown skill", - "branch": "master", - "examples": [ - "Count to 10.", - "Countdown from 10.", - "Count to 10", - "Countdown from 10" - ], - "tags": [ - "Daily", - "countdown", - "count", - "no-license" - ], - "platforms": [ - "platform_mark1", - "platform_mark2", - "platform_picroft", - "platform_plasmoid" - ], - "stars": 1, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid//rocket.svg", - "credits": [ - "Andreas Lorensen (@andlo)" - ], - "categories": [ - "Daily" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Count Skill", - "android_handler": "count-skill.andlo.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-11-19T03:01:05Z", - "archived": false, - "license": "unknown", - "modified": "2020-06-04T21:16:27Z", - "authorname": "LinusS1", - "skillname": "Calendar", - "foldername": "calendar-skill", - "name": "Calendar", - "url": "https://github.com/LinusS1/calendar-skill", - "category": "Productivity", - "description": "With this skill, you can access your iCal server, or just use a [local calendar on your device](https://bit.ly/mycroft-calendar-ics), that doesn't sync anywhere. This skill needs configuration if your use an iCal server. You can (if you're technical) use a local file and not store your server credentials with Mycroft Home, if you follow the instructions [here](https://bit.ly/mycroft-calendar-local).", - "short_description": "Access your Calendar", - "branch": "master", - "examples": [ - "What's on my calendar?", - "Add a event.", - "How many events do I have?", - "What's on my Almanac?", - "Add a event call Bob's birthday." - ], - "tags": [ - "ical", - "server", - "Productivity", - "calendar", - "Daily", - "Information", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 4, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Calendar Skill", - "android_handler": "calendar-skill.linuss1.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-07-19T21:13:47Z", - "archived": false, - "license": "mit", - "modified": "2020-08-10T03:55:03Z", - "authorname": "fortwally", - "skillname": "", - "foldername": "sonos-control-skill", - "name": "", - "url": "https://github.com/fortwally/sonos-control-skill", - "category": "Media", - "description": "Allow control of Sonos speakers from Mycroft.\nAssumes all speakers are in one group.", - "short_description": "Control Sonos speakers from Mycroft", - "branch": "master", - "examples": [ - "Sonos play.", - "Sonos pause.", - "Sonos skip.", - "Sonos volume up.", - "Sonos volume loud.", - "Sonos volume middle.", - "Sonos volume down.", - "Sonos volume soft.", - "Sonos what song is playing.", - "Sonos play", - "Sonos pause", - "Sonos skip", - "Sonos volume up", - "Sonos volume loud", - "Sonos volume middle", - "Sonos volume down", - "Sonos volume soft", - "Sonos what song is playing" - ], - "tags": [ - "Media", - "Sonos", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/music.svg", - "credits": [ - "@fortwally" - ], - "categories": [ - "Media" - ], - "requirements": { - "python": [ - "soco>=0.15" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Sonos Control Skill", - "android_handler": "sonos-control-skill.fortwally.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-06-01T22:33:50Z", - "archived": false, - "license": "unknown", - "modified": "2018-11-16T19:15:08Z", - "authorname": "reginaneon", - "skillname": "AVmusic", - "foldername": "AVmusic", - "name": "AVmusic", - "url": "https://github.com/reginaneon/AVmusic", - "category": null, - "description": "The skill provides the functionality to playback the video of any music band/album/playlist\nor specific song requested by the user. No need to specify the location of the files or register any accounts.\nJust say what you would like to listen to and enjoy.\n\nMake sure to follow the pattern of \"AV play *artist or song name*\" or \"play some *artist or song name*\" and\nadd \"music\" or \"playlist\" at the end of your request.\n\nFor example:\nSample skill flow:\n\n- Hey Mycroft, play some skillet album\n- Would you like me to play it now?\n- yes/ go ahead/ proceed\n- Say stop when you are done\n\nor -\n\n- Hey Mycroft, play some classic music playlist\n- Would you like me to play it now?\n- No\n- Let me know if you change your mind.\n- Actually, go ahead\n- Say stop when you are done.", - "short_description": "", - "branch": "master", - "examples": [ - "Play some imagine dragons music.", - "Av play study music playlist.", - "play some imagine dragons music", - "av play study music playlist" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "credits": [ - "reginaneon\nneongeckocom\naugustnmonteiro" - ], - "requirements": { - "python": [ - "youtube-dl>=2018.6.18" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Avmusic Skill", - "android_handler": "AVmusic.reginaneon.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-09-08T13:38:50Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-02-04T08:54:45Z", - "authorname": "Arc676", - "skillname": "Number Guess", - "foldername": "Number-Guess-Mycroft-Skill", - "name": "Number Guess", - "url": "https://github.com/Arc676/Number-Guess-Mycroft-Skill", - "category": "Entertainment", - "description": "In Number Guess, you provide a lower and upper bound, then try to guess the randomly generated number between those bounds. With this skill, Mycroft can play with you! Ask Mycroft to generate a random number, try to guess, and Mycroft will tell you if your guess is too high, too low, or spot on.", - "short_description": "Play Number Guess with Mycroft", - "branch": "master", - "examples": [ - "Let's play Number Guess.", - "Play Number Guess.", - "Number Guess.", - "Let's play Number Guess", - "Play Number Guess", - "Number Guess" - ], - "tags": [ - "game", - "numberguess", - "random", - "number", - "Entertainment", - "guessing", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/question.svg", - "credits": [ - "Alessandro Vinciguerra (@Arc676)" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Number Guess Mycroft Skill", - "android_handler": "Number-Guess-Mycroft-Skill.arc676.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-12-13T07:21:01Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-26T08:38:26Z", - "authorname": "luke5sky", - "skillname": "Remember", - "foldername": "remember-skill", - "name": "Remember", - "url": "https://github.com/luke5sky/remember-skill", - "category": "Daily", - "description": "You can ask MyCroft to remember and forget things.\nIt will store everything in a list locally on your device.", - "short_description": "Ask MyCroft to remember things for you.", - "branch": "master", - "examples": [ - "Remember take the trash out.", - "What did you remember?", - "Forget phrase take the trash out.", - "Forget all phrases.", - "Hey mycroft, remember take the trash out", - "Hey mycroft, what did you remember", - "Hey mycroft, forget phrase take the trash out", - "Hey mycroft, forget all phrases" - ], - "tags": [ - "brain", - "Productivity", - "Daily", - "todo-list", - "remember", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/brain.svg", - "credits": [ - "Lukas Gangel (@luke5sky)" - ], - "categories": [ - "Daily", - "Productivity" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Remember Skill", - "android_handler": "remember-skill.luke5sky.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-03-19T14:15:24Z", - "archived": false, - "license": "unknown", - "modified": "2020-03-27T11:14:11Z", - "authorname": "ChristopherRogers1991", - "skillname": "mycroft-hello", - "foldername": "mycroft-hello", - "name": "mycroft-hello", - "url": "https://github.com/ChristopherRogers1991/mycroft-hello", - "category": null, - "description": "Mycroft Facial Recognition Skill\n\nIntroduce yourself to mycroft, and he should remember who you are, and greet you by name.\n\nThis skill leverages https://github.com/ageitgey/face_recognition for facial recognition. I have been\nunable to get this library to install on my Mark 1 unit, but it runs well on my laptop.\n\nA webcam is reqired for facial recognition.", - "short_description": "Mycroft Facial Recognition Skill", - "branch": "master", - "examples": [ - "The entirety of what you respond with will be used as your name." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "requirements": { - "python": [ - "face_recognition" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Hello Skill", - "android_handler": "mycroft-hello.christopherrogers1991.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-01-29T20:12:45Z", - "archived": false, - "license": "unknown", - "modified": "2018-11-19T08:47:06Z", - "authorname": "aussieW", - "skillname": "Quotes from Confucius", - "foldername": "skill-confucius-say", - "name": "Quotes from Confucius", - "url": "https://github.com/aussieW/skill-confucius-say", - "category": null, - "description": "On request, Mycroft will deliver a random quote from Confucius. Humerous quotes can also be requested.", - "short_description": "", - "branch": "master", - "examples": [ - "What does Confucius say?", - "Quote Confucius.", - "Tell me a funny Confucius saying.", - "Give me a humorous Confucius quote.", - "What does Confucius say", - "Quote Confucius", - "Tell me a funny Confucius saying", - "Give me a humorous Confucius quote" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 3, - "credits": [ - "aussieW" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Confucius Say Skill", - "android_handler": "skill-confucius-say.aussiew.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-08-31T19:03:44Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-02-28T14:59:02Z", - "authorname": "samclane", - "skillname": "lifx-mycroft", - "foldername": "lifx-mycroft", - "name": "lifx-mycroft", - "url": "https://github.com/samclane/lifx-mycroft", - "category": "IoT", - "description": "Allows users to interact with the LIFX-brand smartbulbs on their home network through Mycroft. Can change power, brightness, color, and color-temperature of individual Lights and predefined Groups.", - "short_description": "A mycroft skill to control LIFX brand smart-bulbs.", - "branch": "master", - "examples": [ - "Turn off the bedroom light.", - "Set the bedroom light yellow.", - "Turn down the bedroom light.", - "Increase the bedroom light temperature.", - "Also uses Contexts.", - "Turn on the bedroom light.", - "Now turn it red.", - "Dim it.", - "->", - "Turn on the bedroom light", - "Now turn it red", - "Dim it" - ], - "tags": [ - "IoT", - "smartlight", - "lifx", - "home-automation", - "smartbulb", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "icon": "https://rawgithub.com/FortAwesome/Font-Awesome/master/advanced-options/raw-svg/solid/lightbulb.svg", - "credits": [ - "Sawyer McLane (@samclane)" - ], - "categories": [ - "IoT" - ], - "requirements": { - "python": [ - "webcolors>=1.11.1", - "fuzzywuzzy", - "lifxlan" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Lifx Mycroft Skill", - "android_handler": "lifx-mycroft.samclane.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-02-20T11:58:48Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-10-09T11:51:52Z", - "authorname": "AIIX", - "skillname": "Food Wizard", - "foldername": "food-wizard", - "name": "Food Wizard", - "url": "https://github.com/AIIX/food-wizard", - "category": "Information", - "description": "Get popular recipes and how to cook directions based on combination of Ingredient keywords", - "short_description": "Get Popular Food & Cooking Recipes On The Go", - "branch": "master", - "examples": [ - "Show recipes with apple and honey.", - "Show recipes with chicken, honey and lime.", - "Read recipe mexican chicken lime soup.", - "Hey Mycroft show recipes with apple and honey", - "Hey Mycroft show recipes with chicken, honey and lime", - "Hey Mycroft read recipe mexican chicken lime soup" - ], - "tags": [ - "KDE", - "GUI", - "Ingredients", - "Food", - "Plasmoid", - "Cooking", - "Recipes", - "Information", - "no-license" - ], - "platforms": [ - "platform_mark2", - "platform_plasmoid" - ], - "stars": 2, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/coffee.svg", - "credits": [ - "Aix (@aiix)" - ], - "categories": [ - "Information" - ], - "requirements": { - "python": [ - "unidecode" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": "/res/icon/foodwizz.png", - "android_name": "Food Wizard", - "android_handler": "food-wizard.aiix.home" - }, - "desktop": { - "X-DBUS-StartupType": "None", - "X-KDE-StartupNotify": "false", - "Version": "1.0", - "Terminal": "false", - "Type": "Application", - "Name": "Food Wizard", - "Exec": "mycroft-gui-app --hideTextInput --skill=food-wizard.aiix.home", - "Icon": "foodwizz", - "Categories": "VoiceApp", - "StartupNotify": "false" - }, - "desktopFile": true - }, - { - "created": "2018-09-08T08:08:11Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-02-04T08:51:14Z", - "authorname": "Arc676", - "skillname": "Crystal Ball", - "foldername": "Crystal-Ball-Mycroft-Skill", - "name": "Crystal Ball", - "url": "https://github.com/Arc676/Crystal-Ball-Mycroft-Skill", - "category": "Entertainment", - "description": "Ask Mycroft any yes/no question and receive a randomly chosen answer.\n\nPlease don't use this skill for any important questions.", - "short_description": "Provides random answers to yes/no questions", - "branch": "master", - "examples": [ - "Crystal Ball, will the world end tomorrow?", - "Mirror mirror on the wall, am I the fairest of them all?", - "What does the future hold? Will I become rich and famous?", - "Tell me the future; will Mycroft become greater than Siri or Alexa?" - ], - "tags": [ - "Entertainment", - "crystalball", - "random", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "Alessandro Vinciguerra (@Arc676)" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Crystal Ball Mycroft Skill", - "android_handler": "Crystal-Ball-Mycroft-Skill.arc676.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-01-12T13:05:23Z", - "archived": false, - "license": "unknown", - "modified": "2018-11-19T08:46:33Z", - "authorname": "PFE1718", - "skillname": "Skill Listener", - "foldername": "PFE1718-skill-listener", - "name": "Skill Listener", - "url": "https://github.com/PFE1718/PFE1718-skill-listener", - "category": null, - "description": "This skill is made to work with the full Habits Automation project https://github.com/PFE1718/mycroft-skills-automation.\n\nIts role is to log mycroft intents when the user launches a skill. It runs continuously in the background and calls the other two skills of the project by utterance when necessary.\nDifferent cases :\n- Skill trigger detected (calls the automation handler skill)\n- Frequency habit detected (calls the automation handler skill)\n- Habit completed for the first time (calls the automation handler skill)\n- Inactivity for more than 5 minutes after last command (calls the data mining skill)", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "credits": [ - "Xavier Hermand (RReivax)" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Pfe1718 Listener Skill", - "android_handler": "PFE1718-skill-listener.pfe1718.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-01-17T23:22:55Z", - "archived": false, - "license": "unknown", - "modified": "2020-01-02T19:02:24Z", - "authorname": "aussieW", - "skillname": "Farting", - "foldername": "skill-farting", - "name": "Farting", - "url": "https://github.com/aussieW/skill-farting", - "category": "Entertainment", - "description": "This is just a fun skill that should generate a laugh or two and then never be used again.\n\nWhen asked \"did you fart\", Mycroft will answer with a statement such as \"it wasn't me. it was the dog\".\n\nWhen told to \"make a farting sound\", Mycroft will play a randomly selected fart sound file, followed by a statement such as \"did someone sit on a whoopee cushion\".\n\nWhen told to \"let one slip\" or \"fart randomly\", Mycroft will play a fart sound file and make a comment at a random interval between 1 minute and half an hour. This will continue until Mycroft is requested to stop via \"stop farting\".\n\nHas been tested on picroft and mark1.", - "short_description": "Mycroft will play a farting sound when requested or at random intervals", - "branch": "master", - "examples": [ - "Did you fart.", - "What is that smell?", - "Fart.", - "Make a farting noise.", - "Fart randomly.", - "Stop farting.", - "did you fart", - "what is that smell", - "fart", - "make a farting noise", - "fart randomly", - "stop farting" - ], - "tags": [ - "Entertainment", - "fun", - "smell", - "fart", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "icon": "fart.png", - "credits": [ - "aussieW" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [ - "tinytag" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Farting Skill", - "android_handler": "skill-farting.aussiew.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-06-28T20:08:49Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2018-06-28T22:44:45Z", - "authorname": "backassward", - "skillname": "Rss Reader", - "foldername": "rss-reader-skill", - "name": "Rss Reader", - "url": "https://github.com/backassward/rss-reader-skill", - "category": null, - "description": "This skill is a simple tool to get updates from your favorite news sources.\n\nthe main features are:\n* manage your feed subscriptions from your [dashboard](https://home.mycroft.ai/),\n* ask Mycroft to check if new articles have been published,\n* ask Mycroft to read the titles and other information for you.", - "short_description": "", - "branch": "master", - "examples": [ - "Check for new feeds.", - "Check for new feeds from Mycroft blog.", - "Read my new feeds.", - "Read my new feeds from Mycroft blog." - ], - "tags": [ - "I", - "[JamesPoole](https://github.com/JamesPoole/)", - "brilliant", - "[podcast-skill](https://github.com/JamesPoole/podcast-skill)", - "inherited", - "many", - "from", - "skill", - "ideas.", - "whose", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "backassward" - ], - "requirements": { - "python": [ - "feedparser" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Rss Reader Skill", - "android_handler": "rss-reader-skill.backassward.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-02-01T14:50:11Z", - "archived": false, - "license": "apache-2.0", - "modified": "2019-12-18T05:34:09Z", - "authorname": "tjoen", - "skillname": "Better Jokes", - "foldername": "skill-better-jokes", - "name": "Better Jokes", - "url": "https://github.com/tjoen/skill-better-jokes", - "category": null, - "description": "You don't know Chuck Norris, and python jokes are not for you? Try Better Jokes!\nThis skill gives mycroft better jokes. It uses icanhazdadjoke.com to get the jokes.", - "short_description": "", - "branch": "master", - "examples": [ - "Be funny.", - "Hey Mycroft, be funny" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "Theun Kohlbeck - https://github.com/tjoen\n\nGerman translation by Andreas Reinle - https://github.com/gras64" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Better Jokes Skill", - "android_handler": "skill-better-jokes.tjoen.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-03-21T12:59:32Z", - "archived": false, - "license": "mit", - "modified": "2018-04-20T20:39:21Z", - "authorname": "Nhoya", - "skillname": "skill-nmap", - "foldername": "nmap-skill", - "name": "skill-nmap", - "url": "https://github.com/Nhoya/nmap-skill", - "category": null, - "description": "nmap skill for Mycroft AI", - "short_description": "nmap skill for Mycroft AI", - "branch": "master", - "examples": [ - "Scan 127.0.0.1.", - "Hey Mycroft scan 127.0.0.1" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [ - "python-nmap" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Nmap Skill", - "android_handler": "nmap-skill.nhoya.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-12-13T17:15:12Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-02-19T13:24:41Z", - "authorname": "Dragoncraft89", - "skillname": "Dice", - "foldername": "dice-skill", - "name": "Dice", - "url": "https://github.com/Dragoncraft89/dice-skill", - "category": "Entertainment", - "description": "This skill enables mycroft to generate random numbers for you. \nYou either need to specify a range or type of dice (e.g. d20).\n\nPerfect whenever you need to generate a random number, but don't have a dice nearby.", - "short_description": "Generates random numbers for you", - "branch": "master", - "examples": [ - "Roll a dice.", - "Roll a d20.", - "Generate a random number between 0 and 5.", - "roll a dice", - "roll a d20", - "generate a random number between 0 and 5" - ], - "tags": [ - "dice", - "Entertainment", - "dnd", - "random", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/dice.svg", - "credits": [ - "@Dragoncraft89" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Dice Skill", - "android_handler": "dice-skill.dragoncraft89.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-01-23T09:41:23Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-07-06T21:25:31Z", - "authorname": "JarbasSkills", - "skillname": "skill-wikihow", - "foldername": "skill-wikihow", - "name": "Wikihow Skill", - "url": "https://github.com/JarbasSkills/skill-wikihow", - "category": "Daily", - "description": "Ever wondered about how to boil an egg, or the best way to brush your teeths. This skill enables\nMycroft to anser a lot of \"how to\" questions with step by step guide. More detailed\ninformation can be asked afterwods.\n\nInformation is comming from [wikihow.com](https://www.wikihow.com/)\n\n![](gui2.gif)\n![](gui.gif)", - "short_description": "How to do nearly everything.", - "branch": "master", - "examples": [ - "how to boil an egg", - "give me a random how to", - "explain better", - "repeat", - "tell me more" - ], - "tags": [ - "Information", - "Daily", - "howto", - "no-license" - ], - "platforms": [ - "all", - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "stars": 1, - "icon": "icon.png", - "credits": [ - "JarbasAI", - "[Wikihow](https://www.wikihow.com/)" - ], - "categories": [ - "Daily", - "Information" - ], - "logo": "https://raw.githubusercontent.com/JarbasSkills/skill-wikihow/master/logo.png", - "requirements": { - "python": [ - "pywikihow>=0.5.7" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": "skill-xkcd.png", - "android_name": "Wikihow Skill", - "android_handler": "skill-wikihow.jarbasskills.home" - }, - "desktop": { - "Terminal": "false", - "Type": "Application", - "Name": "WikiHow", - "Exec": "mycroft-gui-app --hideTextInput --skill=skill-wikihow.jarbasskills.home", - "Icon": "skill-xkcd.png", - "Categories": "VoiceApp", - "StartupNotify": "false", - "X-DBUS-StartupType": "None", - "X-KDE-StartupNotify": "false" - }, - "desktopFile": false, - "systemDeps": false - }, - { - "created": "2018-09-30T08:45:26Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-01-26T19:45:22Z", - "authorname": "andlo", - "skillname": "Say hello to", - "foldername": "say-hello-to-skill", - "name": "Say hello to", - "url": "https://github.com/andlo/say-hello-to-skill", - "category": "Daily", - "description": "Simple skill to let mycroft say hi to someone\n\nMain purpose is making an example of how to make a simple skill that takes input from user and use it - in this example just for replying.\n\nThe skill uses the @intent_file_handler and Padatious\n\n Mycroft will reply\n - \"Hi {name}. Nice to meet you.\"\n - \"Hello {name}. Good to see you.\"", - "short_description": "Simple skill to let mycroft say hi to someone", - "branch": "master", - "examples": [ - "Say hi to {name}", - "Meet {name}", - "This is {name}", - "Let me introduce you to {name}" - ], - "tags": [ - "Daily", - "example", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://rawgithub.com/FortAwesome/Font-Awesome/master/advanced-options/raw-svg/solid/comment.svg", - "credits": [ - "Andreas Lorensen (@andlo)" - ], - "categories": [ - "Daily" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Say Hello To Skill", - "android_handler": "say-hello-to-skill.andlo.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-04-13T17:17:37Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-06T00:19:31Z", - "authorname": "MycroftAI", - "skillname": "Repeat recent", - "foldername": "skill-repeat-interactions", - "name": "Repeat recent", - "url": "https://github.com/MycroftAI/skill-repeat-interactions", - "category": "Daily", - "description": "", - "short_description": "This will save the most recent text to speech and speech to text _Utterances_ to show to the user.", - "branch": "20.08", - "examples": [ - "What did you just say?", - "What did I just say?", - "Did you hear me?", - "Tell me what I just said.", - "Tell me what I just said" - ], - "tags": [ - "again", - "repeat-interaction", - "Daily", - "redo", - "repeat", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 3, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/redo.svg", - "credits": [ - "MycroftAI (@mycroftAI)" - ], - "categories": [ - "Daily" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Repeat Interactions Skill", - "android_handler": "skill-repeat-interactions.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-04-10T10:39:37Z", - "archived": false, - "license": "unknown", - "modified": "2019-02-21T00:12:21Z", - "authorname": "AIIX", - "skillname": "Open-Library-skill", - "foldername": "open-library-skill", - "name": "Open-Library-skill", - "url": "https://github.com/AIIX/open-library-skill", - "category": null, - "description": "#### Installation of skill:\n* Download or Clone Git (run: git clone https://github.com/AIIX/open-library-skill inside /opt/mycroft/skills)\n* Create /opt/mycroft/skills folder if it does not exist\n* Extract Downloaded Skill into a folder. \"open-library-skill\". (Clone does not require this step)\n* Copy the open-library-skill folder to /opt/mycroft/skills/ folder.", - "short_description": "", - "branch": "master", - "examples": [ - "Find book by title story of my life.", - "Hey Mycroft, find book by title story of my life" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 4, - "credits": [ - "(AIX) Aditya Mehra" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Open Library Skill", - "android_handler": "open-library-skill.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-05-28T04:48:39Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-04-20T22:11:15Z", - "authorname": "retrodaredevil", - "skillname": "Pokemon", - "foldername": "pokemon-skill", - "name": "Pokemon", - "url": "https://github.com/retrodaredevil/pokemon-skill", - "category": "Entertainment", - "description": "With this skill, you can ask Mycroft many different facts about Pokemon. The things you can ask it range from useful statistics such as when a Pokemon evolves or how effective a move is to a Pokemon's weight.", - "short_description": "Aids you on your journey as a Pokemon Trainer", - "branch": "master", - "examples": [ - "What type is Pikachu?", - "How tall is Pikachu?", - "What is Pikachu's base happiness?", - "What is Pikachu's first evolution?", - "What is Pikachu's final evolution?", - "How much does Pikachu weigh in kilograms.", - "What are eevee's evolutions?", - "What is Bulbasaur's base attack?", - "What does Bulbasaur evolve into?", - "What does Charizard evolve from?", - "How effective is a ground move against Pikachu?", - "What generation was Pichu introduced in?", - "What abilities does Pikachu have?", - "What is Static's flavor text in emerald?", - "What is Intimidate's flavor text in diamond?", - "Give me some info about the ability Static.", - "Give me some detailed information about the ability Static.", - "What generation was Static first introduced?", - "How much does Pikachu weigh in kilograms", - "What is Static's flavor text in emerald", - "What is Intimidate's flavor text in diamond", - "Give me some info about the ability Static", - "Give me some detailed information about the ability Static" - ], - "tags": [ - "Pokemon", - "Entertainment", - "Pokedex", - "Information", - "Video", - "Games", - "Video Games", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 6, - "icon": "https://cdn.pixabay.com/photo/2016/07/23/13/18/pokemon-1536849_960_720.png", - "credits": [ - "Joshua Shannon (@retrodaredevil)" - ], - "categories": [ - "Entertainment", - "Information" - ], - "requirements": { - "python": [ - "pokebase" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Pokemon Skill", - "android_handler": "pokemon-skill.retrodaredevil.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-08-21T16:07:21Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-02-06T06:38:08Z", - "authorname": "samclane", - "skillname": "HomeSeer-Mycroft", - "foldername": "homeseer-mycroft", - "name": "HomeSeer-Mycroft", - "url": "https://github.com/samclane/homeseer-mycroft", - "category": "IoT", - "description": "A port of the HomeSeer functionality from Alexa to Mycroft. Allows the user to interact with smart-objects using voice \ncontrol. Currently allows devices to be turned on/off, change values/percentages, lock/unlock devices, and get the \ncurrent status of any device.", - "short_description": "Connect to your HomeSeer hub and control your smart-home devices using Mycroft.", - "branch": "master", - "examples": [ - "Turn on the first floor bathroom light.", - "Unlock the kitchen door lock.", - "Set the first floor kitchen outside lights to 50%.", - "Turn off all the first floor lights.", - "Get the status of the first floor kitchen door lock.", - "Run the Turn All Lights Off event.", - "Mycroft, turn on the first floor bathroom light.", - "Mycroft, unlock the kitchen door lock.", - "Mycroft, set the first floor kitchen outside lights to 50%.", - "Mycroft, turn off all the first floor lights.", - "Mycroft, get the status of the first floor kitchen door lock.", - "Mycroft, run the Turn All Lights Off event." - ], - "tags": [ - "url", - "path", - "hub", - "homeautomation", - "smarthome", - "homeseer", - "homeseer-mycroft-skill", - "smartlight", - "automation", - "smartlock", - "=", - "IoT", - "lights", - "[submodule", - "smartbulb", - "\"homeseer-mycroft\"]", - "https://github.com/samclane/homeseer-mycroft.git", - "iot", - "lighting", - "smartlock\n\n[submodule \"homeseer-mycroft\"]\n path = homeseer-mycroft-skill\n url = https://github.com/samclane/homeseer-mycroft.git", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 3, - "icon": "https://rawgithub.com/FortAwesome/Font-Awesome/master/advanced-options/raw-svg/solid/home.svg", - "credits": [ - "Sawyer McLane (@samclane)" - ], - "categories": [ - "IoT" - ], - "requirements": { - "python": [ - "fuzzywuzzy", - "python-Levenshtein", - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Homeseer Mycroft Skill", - "android_handler": "homeseer-mycroft.samclane.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-11-11T11:34:36Z", - "archived": false, - "license": "apache-2.0", - "modified": "2019-11-19T23:12:12Z", - "authorname": "smearumi", - "skillname": "Remote Computer", - "foldername": "mycroft-remote-computer", - "name": "Remote Computer", - "url": "https://github.com/smearumi/mycroft-remote-computer", - "category": "Daily", - "description": "Turn OFF/ON your computer via SSH and WOL from mycroft. You must enable SSH Server on your remote computer for Power OFF and also you have to enable Wake on Lan for Power ON.\n\nFor Power OFF (Supported Remote Computer OS with SSH Server):\n\nFor Power ON (Wake on LAN):\nLinux\n * Mac\n * Windows\n * Any WOL supported computer", - "short_description": "Control a remote computer via SSH and Wake on Lan. (Power OFF/ON)", - "branch": "master", - "examples": [ - "Turn off my computer.", - "Turn my computer off.", - "Shut down the computer.", - "Turn on the computer.", - "Wake up my computer.", - "turn off my computer", - "turn my computer off", - "shut down the computer", - "turn on the computer", - "wake up my computer" - ], - "tags": [ - "IoT", - "home", - "remote", - "computer", - "skill", - "voice", - "assistant", - "Daily", - "mycroft", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 3, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/desktop.svg", - "credits": [ - "S. M. Estiaque Ahmed (@smearumi)" - ], - "categories": [ - "Daily", - "IoT" - ], - "requirements": { - "python": [ - "paramiko==2.4.2", - "wakeonlan==1.1.6" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Remote Computer Skill", - "android_handler": "mycroft-remote-computer.smearumi.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-05-15T03:16:35Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-01-09T17:48:04Z", - "authorname": "ChristianMurphy", - "skillname": "uPortal Demo Skill", - "foldername": "mycroft-skill-uportal-demo", - "name": "uPortal Demo Skill", - "url": "https://github.com/ChristianMurphy/mycroft-skill-uportal-demo", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [ - "What's due today?", - "What's for lunch?", - "What classes do I have today?", - "When is registration?" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Uportal Demo Skill", - "android_handler": "mycroft-skill-uportal-demo.christianmurphy.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-12-15T15:59:03Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-07T06:22:38Z", - "authorname": "domcross", - "skillname": "", - "foldername": "amzn-music-skill", - "name": "", - "url": "https://github.com/domcross/amzn-music-skill", - "category": "Music", - "description": "This skill requires an Amaz*n Music account and a subscription of type \"music unlimited\" or \"prime music\" - even if you want to stream music from your own library only.\n\nAfter skill is installed is you must either:\n\na) enter your login credentials at home.mycroft.ai > Skills > Amzn music\nWARNING: with this option your Amaz\\*n username and password will be stored i) on a server hosted by mycroft.ai and ii) in clear text in the skills 'settings.json' file.\n\nb) run './credentials.py' in the skills directory and enter your login credentials there.\nIn this case your credentials will be stored encoded & pickled in file 'credentials.store' - this option is recommended if you care for privacy.\nNOTE: file 'credentials.store' must be owned by mycroft:mycroft - either run credentials.py as user 'mycroft' or sudo chown mycroft:mycroft credentals.store afterwards.\n\nNOTE: this was tested only on Mycroft Mark-1 and PiCroft (both running Debian Jessie) and will probably run (not tested yet) on PiCroft with Debian Stretch.\nMost likely this will not run on Ubuntu or other OS without tweaking requirements.sh at least (any assistance here is welcome)\n\nNOTE: this will install 'VLC media player' as a requirement, which is a approx. 70MB download an will require additinal 250MB on your sd-card when unpacked...", - "short_description": "AMZN Music Player", - "branch": "master", - "examples": [ - "Hey ~~Alexa~~ Mycroft, play the song purple rain by prince on amaz*n music.", - "Play the album 25 by adele.", - "Play something by the foo fighters.", - "Play some jazz.", - "Hey ~~Alexa~~ Mycroft, play the song purple rain by prince on amaz*n music", - "Hey Mycroft, play the album 25 by adele", - "Hey Mycroft, play something by the foo fighters", - "Hey Mycroft, play some jazz" - ], - "tags": [ - "music", - "amzn", - "Music", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/headphones.svg", - "credits": [ - "Dominik (@domcross)\n\n@Jaffa for the [amaz*n music api python library](https://github.com/Jaffa/amazon-music)\n\n@forslund and the rest of the Mycroft Dev team for inspiration and code from [spotify-skill](https://github.com/forslund/spotify-skill/)" - ], - "categories": [ - "Music" - ], - "requirements": { - "python": [ - "bs4", - "python-vlc", - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Amzn Music Skill", - "android_handler": "amzn-music-skill.domcross.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-02-23T03:47:17Z", - "archived": false, - "license": "unknown", - "modified": "2019-12-18T05:20:17Z", - "authorname": "aussieW", - "skillname": "", - "foldername": "mycroft-push-to-listen", - "name": "", - "url": "https://github.com/aussieW/mycroft-push-to-listen", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 4, - "requirements": { - "python": [ - "RPi.GPIO" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Push To Listen Skill", - "android_handler": "mycroft-push-to-listen.aussiew.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-05-21T17:06:07Z", - "archived": false, - "license": "unknown", - "modified": "2020-04-29T09:23:10Z", - "authorname": "jcasoft", - "skillname": "", - "foldername": "translate-skill.jcasoft", - "name": "", - "url": "https://github.com/jcasoft/translate-skill.jcasoft", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "requirements": { - "python": [ - "lxml ", - "mtranslate", - "mutagen" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Translate Skill.Jcasoft Skill", - "android_handler": "translate-skill.jcasoft.jcasoft.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-06-29T12:42:44Z", - "archived": false, - "license": "apache-2.0", - "modified": "2019-12-19T02:45:04Z", - "authorname": "luke5sky", - "skillname": "What Can You Do", - "foldername": "what-can-you-do-skill", - "name": "What Can You Do", - "url": "https://github.com/luke5sky/what-can-you-do-skill", - "category": null, - "description": "It tells you what you can do with Mycroft (some examples)\nand lists the installed skills (if you want).", - "short_description": "", - "branch": "master", - "examples": [ - "What can you do?", - "What can i do?", - "What can i ask you?" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "Luke5Sky" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "What Can You Do Skill", - "android_handler": "what-can-you-do-skill.luke5sky.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-12-26T15:36:04Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-02-06T21:05:25Z", - "authorname": "andlo", - "skillname": "ISS Tracker", - "foldername": "iss-tracker-skill", - "name": "ISS Tracker", - "url": "https://github.com/andlo/iss-tracker-skill", - "category": "Daily", - "description": "This skill allows mycroft to tell you where the International Space Station (ISS) is in orbit, realtive\nto the earth in latitude and longitude. it uses reverse geocoding to translate these coordinates\ninto the country or body of water it is over.", - "short_description": "Where is the international space station - ISS", - "branch": "master", - "examples": [ - "Where is the international space station?", - "Locate I S S.", - "Where is I S S?" - ], - "tags": [ - "spacestation", - "space", - "Entertainment", - "esa", - "Daily", - "Information", - "iss", - "nasa", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "icon": "iss.png", - "credits": [ - "@lachendeKatze\nAndreas Lorensen (@andlo)" - ], - "categories": [ - "Daily", - "Entertainment", - "Information" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Iss Tracker Skill", - "android_handler": "iss-tracker-skill.andlo.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-05-05T15:37:04Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-01-10T03:03:10Z", - "authorname": "pcwii", - "skillname": "Pick Number", - "foldername": "skill-pick-number", - "name": "Pick Number", - "url": "https://github.com/pcwii/skill-pick-number", - "category": "Entertainment", - "description": "Mycroft.AI will select a random number between a min and max value.\nThe minimum and maximum value may be in any order and any value.", - "short_description": "Select a random number when provided a min and max value", - "branch": "master", - "examples": [ - "Select a number between 1 and 10.", - "Choose a number between 100 and 199.", - "Pick a number from 5 to 15.", - "Select a number between 20 and 1.", - "select a number between 1 and 10", - "choose a number between 100 and 199", - "pick a number from 5 to 15", - "select a number between 20 and 1" - ], - "tags": [ - "dice", - "Entertainment", - "decisionmaker", - "random", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/dice.svg", - "credits": [ - "@pcwii" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Pick Number Skill", - "android_handler": "skill-pick-number.pcwii.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-01-08T14:38:15Z", - "archived": false, - "license": "apache-2.0", - "modified": "2018-11-19T08:46:17Z", - "authorname": "PFE1718", - "skillname": "automation handler", - "foldername": "PFE1718-automation-handler", - "name": "automation handler", - "url": "https://github.com/PFE1718/PFE1718-automation-handler", - "category": null, - "description": "The automation-handler skill is part of the [**habits automation system**](https://github.com/PFE1718/mycroft-habits-automation) that aims to detect the **user habits** when using [Mycroft](https://mycroft.ai/), and to offer automation of these identified habits. You can find a detailed definition of a **habit** on the [project page](https://github.com/PFE1718/mycroft-habits-automation).\n\nThis skill allows you to automate some of the habits that Mycroft has detected and it handles their automation. When you first reproduce a detected habit, Mycroft will ask you if this habit should be automatized.\n\nThe habit detection is done by two other complementary skills:\n1. The [**skill-listener**](https://github.com/PFE1718/mycroft-skill-listener), that logs the user activity. It is also responsible for launching the 2 other skills when needed.\n2. The [**habit-miner**](https://github.com/PFE1718/mycroft-habit-miner-skill), that extracts the habits of the user from the logs.", - "short_description": "", - "branch": "master", - "examples": [ - "List my habits." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "credits": [ - "Gauthier LEONARD" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Pfe1718 Automation Handler Skill", - "android_handler": "PFE1718-automation-handler.pfe1718.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-02-16T03:15:43Z", - "archived": false, - "license": "unknown", - "modified": "2018-04-06T01:17:23Z", - "authorname": "lachendeKatze", - "skillname": "skill-rock-paper-scissors", - "foldername": "skill-rock-paper-scissors", - "name": "skill-rock-paper-scissors", - "url": "https://github.com/lachendeKatze/skill-rock-paper-scissors", - "category": null, - "description": "play rock paper scissors with mycroft & clarifai\n\nFull Instructions:\nhttps://www.hackster.io/gov/hey-mycroft-rock-paper-scissors-0228b2", - "short_description": "play rock paper scissors with mycroft & clarifai", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Rock Paper Scissors Skill", - "android_handler": "skill-rock-paper-scissors.lachendekatze.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-01-03T15:07:19Z", - "archived": false, - "license": "unknown", - "modified": "2020-07-05T01:41:26Z", - "authorname": "roadriverrail", - "skillname": "Google Play Music Skill", - "foldername": "skill-google-play-music", - "name": "Google Play Music Skill", - "url": "https://github.com/roadriverrail/skill-google-play-music", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [ - "You will need to register a Google Play Music username and password with the Mycroft.", - "Factor auth on your Google account, go to https://myaccount.google.com/security.", - "Specific password for your Mycroft instance.", - "Play on Google Play Music.", - "You will need to register a Google Play Music username and password with the Mycroft", - "play on Google Play Music : This plays a curated station. Often, these are" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "requirements": { - "python": [ - "gmusicapi==10.1.2" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Google Play Music Skill", - "android_handler": "skill-google-play-music.roadriverrail.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-03-14T00:31:24Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2018-08-25T15:51:47Z", - "authorname": "who-is-matt", - "skillname": "Kodi Controller", - "foldername": "kodi-controller-skill", - "name": "Kodi Controller", - "url": "https://github.com/who-is-matt/kodi-controller-skill", - "category": null, - "description": "The Kodi Controller Skill allows Mycroft to control Kodi, whether locally installed\nor on another device on the local network. It will allow a high degree of control\nover Kodi, including the ability for the user to specify a device IP for the Kodi\nplayer (allowing the skill to control Kodi on multiple different devices without\nrequiring the user to manually edit the skill's settings), to search for videos and\nmusic, and to control playback.", - "short_description": "", - "branch": "master", - "examples": [ - "Connect to Kodi at <IP address>", - "Pause Kodi.", - "Pause playback in Kodi.", - "Resume Kodi.", - "Resume playback in Kodi.", - "Stop Kodi.", - "Stop playback in Kodi.", - "Enable subtitles in Kodi.", - "Disable subtitles in Kodi.", - "Search Kodi for ", - "Connect: Connect to Kodi on <IP address>, Connect to Kodi at <IP address>, Kodi connect <IP address> **[WIP]** (For now, you must specify an IP using the Skills settings on [Mycroft Home](https://home.mycroft.ai) as mentioned in the Setup section above.)", - "Up: Kodi up", - "Down: Kodi down", - "Left: Kodi left", - "Right: Kodi right", - "Select: Kodi select, Kodi click, Kodi enter", - "Info: Kodi info", - "Home: Kodi home", - "Context menu: Kodi context", - "Back: Kodi back", - "Pause: Kodi pause, Kodi pause playback, Pause Kodi, Pause playback in Kodi", - "Play: Kodi play, Play Kodi, Kodi unpause, Unpause Kodi", - "Stop: Kodi stop, Kodi stop playback, Stop Kodi", - "Resume/rewatch last played: Kodi resume, Kodi resume playback, Resume playback in Kodi, Kodi play last watched **[WIP]** ", - "Seek forward: Kodi skip ahead, Kodi seek forward", - "Seek backward: Kodi skip back, Kodi seek backward", - "Show on-screen display: Kodi display, Kodi show on-screen display", - "Search/open media: Kodi find <title>, Kodi search for <title>, Search Kodi for <title>, Search in Kodi for <title> **[WIP]** ", - "Play random movie: Kodi play a random movie, Play a random movie in Kodi, Kodi random movie **[WIP]** ", - "Enable subtitles: Kodi enable subtitles, Enable subtitles in Kodi, Kodi turn on subtitiles **[WIP]** ", - "Disable subtitles: Kodi disable subtitles, Disable subtitles in Kodi, Kodi turn off subtitles **[WIP]** ", - "Scan for new video: Kodi scan movies, Kodi scan videos", - "Scan for new audio: Kodi scan audio" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "credits": [ - "Matt Burns" - ], - "requirements": { - "python": [ - "kodipydent" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Kodi Controller Skill", - "android_handler": "kodi-controller-skill.who-is-matt.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-12-08T20:51:57Z", - "archived": false, - "license": "unknown", - "modified": "2020-02-07T22:34:23Z", - "authorname": "andlo", - "skillname": "Sound tuner", - "foldername": "sound-tuner-skill", - "name": "Sound tuner", - "url": "https://github.com/andlo/sound-tuner-skill", - "category": "Information", - "description": "This skill plays a sound in the given note or an sound in the given guitar string.\nThis can be used to tune a musical instruments.\n\nMycroft is using the even tempered (aka equal tempered) scale, where an octave is a\nfrequency ratio of exactly two and a semitone is a frequency ratio of exactly the\ntwelfth root of two. In the real world however many different temperaments may be\nused - see en.wikipedia.org/wiki/Musical_temperament - and octaves too can vary in\nsize, see en.wikipedia.org/wiki/Stretched_octave.\n\nAlso Mycroft call middle C for \"C4\" : this is the commonest octave numbering but some\npeople call middle C for \"C3\" or even for \"C5\".", - "short_description": "This skill plays a sound in the given note or an sound in the given guitar string.", - "branch": "master", - "examples": [ - "Gime me an C note.", - "Give me an guitar Low E string.", - "Give me an A4 note.", - "Give me an violin A string.", - "Guitar.", - "Mandolin.", - "Cello.", - "Viola.", - "Banjo.", - "Bass." - ], - "tags": [ - "sound", - "Information", - "tuner", - "no-license" - ], - "platforms": [ - "platform_mark1", - "platform_mark2", - "platform_picroft", - "platform_plasmoid" - ], - "stars": 2, - "icon": "g-key.png", - "credits": [ - "Andreas Lorensen (@andlo)" - ], - "categories": [ - "Information" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Sound Tuner Skill", - "android_handler": "sound-tuner-skill.andlo.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-08-01T08:19:40Z", - "archived": false, - "license": "unknown", - "modified": "2020-03-09T02:22:27Z", - "authorname": "rugbylug", - "skillname": "Mycroft Todo skill", - "foldername": "Mycroft-Todo", - "name": "Mycroft Todo skill", - "url": "https://github.com/rugbylug/Mycroft-Todo", - "category": null, - "description": "This skill provides a to-do list using the todotxt back-end. Therefore this does not rely on any 3rd parties or external services. The todotxt file is stored locally on the Mycroft and can be syncronised with tdotxt services including Nextcloud.\n\nProject planning in the https://github.com/rugbylug/Mycroft-Todo/blob/master/BACKGROUND.md file.\n\nInitial code borrowed from https://github.com/gerlachry/skill-todoist (GPL 3 assumed) and todoist code removed.", - "short_description": "This skill provides a to-do list using the todotxt back-end. Therefore this does not rely on any 3rd parties or external services. The todotxt file is stored locally on the Mycroft and can be syncronised with tdotxt services including Nextcloud.", - "branch": "master", - "examples": [ - "Create a list called SOMELIST.", - "{{listname}} created.", - "Set list as default.", - "List {{listname}} set as default.", - "Use list SOMELIST.", - "Using list {{listname}}", - "Find list SOMELIST.", - "Found list {{listname}}", - "Cant find list {{listname}}", - "Remove list SOMELIST.", - "Are you sure you want to remove list {{listname}}?", - "Yes.", - "List {{listname}} removed.", - "Add {{item}} [to SOMELIST]", - "Item {{item}} added to {{listname}}", - "How many items.", - "There are {{itemcount}} items on list {{listname}}", - "Find item SOMEITEM.", - "Item {{item}} found.", - "Make it priority 1.", - "Make it top priority.", - "Make it high priority.", - "Make it highest priority.", - "Make it low priority.", - "Item {{item}} is now priority {{priority}}", - "Set due date to SOMEDATE.", - "Item {{item}} due at {{duedate}}", - "Mark as complete.", - "Item {{item}} marked as complete.", - "Remove item SOMEITEM.", - "Item {{item}} removed.", - "Tell me about it.", - "Item {{itemname}} has priority {{priority}} and is due on {{duedate}}" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "requirements": { - "python": [ - "mycroft-skills-sdk==0.1.20", - "python-todotxt" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Todo Skill", - "android_handler": "Mycroft-Todo.rugbylug.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-02-10T05:26:01Z", - "archived": false, - "license": "mit", - "modified": "2019-05-07T23:00:37Z", - "authorname": "KathyReid", - "skillname": "skill-malibu-stacey", - "foldername": "skill-malibu-stacy", - "name": "skill-malibu-stacey", - "url": "https://github.com/KathyReid/skill-malibu-stacy", - "category": null, - "description": "This Skill is an homage to all the women who grew up knowing that Malibu Stacy was a vacuous, vapid waste of plastic, and that they were better off spending their time learning iterators, linked lists and relational algebra than baking cookies for boys, or shopping.\n\nLet Mycroft help you when you need that extra element of sarcasm when dealing with the mansplainer in your life.", - "short_description": "This Skill is an homage to all the women who grew up knowing that Malibu Stacy was a vacuous, vapid waste of plastic, and that they were better off spending their time learning iterators, linked lists and relational algebra than baking cookies for boys, or shopping.", - "branch": "master", - "examples": [ - "Speak: 'What would Malibu Stacy do.", - "Speak: 'Malibu Stacy.", - "Speak: 'What would Malibu Stacy do'", - "Speak: 'Malibu Stacy'" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 4, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Malibu Stacy Skill", - "android_handler": "skill-malibu-stacy.kathyreid.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-10-16T18:49:26Z", - "archived": false, - "license": "mit", - "modified": "2020-04-06T14:11:01Z", - "authorname": "tgru", - "skillname": "Xbox Control Skill", - "foldername": "xbox-control-skill", - "name": "Xbox Control Skill", - "url": "https://github.com/tgru/xbox-control-skill", - "category": null, - "description": "Lets you control your Xbox One by voice.", - "short_description": "Lets you control your Xbox One by voice.", - "branch": "master", - "examples": [ - "Power on the Xbox.", - "Switch the Xbox off." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/gamepad.svg", - "credits": [ - "@tgru" - ], - "requirements": { - "python": [ - "netdisco" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Xbox Control Skill", - "android_handler": "xbox-control-skill.tgru.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-03-16T23:22:11Z", - "archived": false, - "license": "unknown", - "modified": "2018-11-05T21:32:11Z", - "authorname": "megastruktur", - "skillname": "skill-jira", - "foldername": "mycroft-skill-jira", - "name": "skill-jira", - "url": "https://github.com/megastruktur/mycroft-skill-jira", - "category": null, - "description": "Add to `mycroft.conf`:\n\n```\n \"JiraSkill\": {\n\"jira_user\":<USERNAME>,\n\"jira_password\":<PASSWORD>,\n\"jira_server\":<SERVER>,\n\"jira_project\":<PROJECT>\n}\n```", - "short_description": "Add to `mycroft.conf`:", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "requirements": { - "python": [ - "jira" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Jira Skill", - "android_handler": "mycroft-skill-jira.megastruktur.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-01-26T11:35:28Z", - "archived": false, - "license": "unknown", - "modified": "2019-02-02T06:15:09Z", - "authorname": "JarbasAl", - "skillname": "", - "foldername": "fallback-rivescript", - "name": "", - "url": "https://github.com/JarbasAl/fallback-rivescript", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 3, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Fallback Rivescript Skill", - "android_handler": "fallback-rivescript.jarbasal.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-01-31T23:18:16Z", - "archived": false, - "license": "unknown", - "modified": "2018-09-11T20:49:13Z", - "authorname": "aussieW", - "skillname": "MQTT for MycroftAI", - "foldername": "skill-mqtt", - "name": "MQTT for MycroftAI", - "url": "https://github.com/aussieW/skill-mqtt", - "category": null, - "description": "This is a skill written for mycroft to publish commands over an mqtt broker for home automation or any other purpose.", - "short_description": "This is a skill written for mycroft to publish commands over an mqtt broker for home automation or any other purpose.", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mqtt Skill", - "android_handler": "skill-mqtt.aussiew.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-01-24T10:32:58Z", - "archived": false, - "license": "unknown", - "modified": "2019-02-02T06:15:18Z", - "authorname": "JarbasAl", - "skillname": "Apollo 11 Space Game Skill", - "foldername": "skill-moon-game", - "name": "", - "url": "https://github.com/JarbasAl/skill-moon-game", - "category": null, - "description": "[![Donate with Bitcoin](https://en.cryptobadges.io/badge/micro/1QJNhKM8tVv62XSUrST2vnaMXh5ADSyYP8)](https://en.cryptobadges.io/donate/1QJNhKM8tVv62XSUrST2vnaMXh5ADSyYP8)\n[![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://paypal.me/jarbasai)\n<span class=\"badge-patreon\"><a href=\"https://www.patreon.com/jarbasAI\" title=\"Donate to this project using Patreon\"><img src=\"https://img.shields.io/badge/patreon-donate-yellow.svg\" alt=\"Patreon donate button\" /></a></span>\n[![Say Thanks!](https://img.shields.io/badge/Say%20Thanks-!-1EAEDB.svg)](https://saythanks.io/to/JarbasAl)\n\nCan you even moon land?\n\nland on the moon challenge, a mycroft adventure voice game", - "short_description": "[![Donate with Bitcoin](https://en.cryptobadges.io/badge/micro/1QJNhKM8tVv62XSUrST2vnaMXh5ADSyYP8)](https://en.cryptobadges.io/donate/1QJNhKM8tVv62XSUrST2vnaMXh5ADSyYP8)", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 3, - "requirements": { - "python": [ - "git+https://github.com/JarbasAl/mycroft_jarbas_utils" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Moon Game Skill", - "android_handler": "skill-moon-game.jarbasal.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-02-02T02:31:42Z", - "archived": false, - "license": "unknown", - "modified": "2019-09-25T10:39:16Z", - "authorname": "aussieW", - "skillname": "MQTT for MycroftAI", - "foldername": "skill-mqtt-worldtime", - "name": "MQTT for MycroftAI", - "url": "https://github.com/aussieW/skill-mqtt-worldtime", - "category": null, - "description": "This is a skill written for mycroft to publish commands over an mqtt broker for home automation or any other purpose.", - "short_description": "This is a skill written for mycroft to publish commands over an mqtt broker for home automation or any other purpose.", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "paho-mqtt" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mqtt Worldtime Skill", - "android_handler": "skill-mqtt-worldtime.aussiew.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-01-02T13:27:41Z", - "archived": false, - "license": "unknown", - "modified": "2018-08-22T15:22:13Z", - "authorname": "AIIX", - "skillname": "whats-nearby", - "foldername": "whats-nearby", - "name": "whats-nearby", - "url": "https://github.com/AIIX/whats-nearby", - "category": null, - "description": "#### Note: This Mycroft Skill Requires The Mycroft Plasmoid for Desktop / Plasma-Mobile To Display Results\n#### Permission Notice: This Skill makes use of Mozilla Location Services to determine your current location\n#### This skill requires you to setup your own HERE API Keys on https://home.mycroft.ai | Register for free HERE API Keys at: https://developer.here.com/\n\n##### To-Do: Improve Location Accuracy on Plasma-Mobile by utilizing nearby cell-tower information.", - "short_description": "", - "branch": "master", - "examples": [ - "Search for nearby resturants.", - "Search for nearby Hotels.", - "Search nearby parks.", - "Search nearby hostels.", - "Search for nearby hospitals.", - "Search for hotels.", - "Search for pubs.", - "Hey Mycroft search for nearby resturants", - "Hey Mycroft search for nearby Hotels", - "Hey Mycroft search nearby parks", - "Hey Mycroft search nearby hostels", - "Hey Mycroft Search for nearby hospitals", - "Hey Mycroft Search for hotels", - "Hey Mycroft Search for pubs" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "Aix (aix.m@outlook.com)" - ], - "requirements": { - "python": [ - "PyRIC" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Whats Nearby Skill", - "android_handler": "whats-nearby.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-03-11T12:47:45Z", - "archived": false, - "license": "unknown", - "modified": "2019-12-19T02:43:59Z", - "authorname": "EuripideH", - "skillname": "Buddha-quote", - "foldername": "skill-bouddha", - "name": "Buddha-quote", - "url": "https://github.com/EuripideH/skill-bouddha", - "category": null, - "description": "Mycroft can tell several famous quotes from Buddha.", - "short_description": "", - "branch": "master", - "examples": [ - "Tell me a quote from Buddha.", - "What is your favorite quote of Buddha?", - "tell me a quote from Buddha", - "what is your favorite quote of Buddha" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "credits": [ - "EuripideH" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Bouddha Skill", - "android_handler": "skill-bouddha.euripideh.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-03-27T09:36:10Z", - "archived": false, - "license": "unknown", - "modified": "2018-05-29T11:52:44Z", - "authorname": "AIIX", - "skillname": "Digikam-Control", - "foldername": "digikam-control", - "name": "Digikam-Control", - "url": "https://github.com/AIIX/digikam-control", - "category": null, - "description": "#### Installation of skill:\n* Download or Clone Git (run: git clone https://github.com/AIIX/DigiKam-control inside /opt/mycroft/skills)\n* Create /opt/mycroft/skills folder if it does not exist\n* Extract Downloaded Skill into a folder. \"DigiKam-control\". (Clone does not require this step)\n* Copy the DigiKam-control folder to /opt/mycroft/skills/ folder\n\n#### Installation of requirements:\n##### Fedora:\n- sudo dnf install dbus-python\n- From terminal: cp -R /usr/lib64/python2.7/site-packages/dbus* /home/$USER/.virtualenvs/mycroft/lib/python2.7/site-packages/\n- From terminal: cp /usr/lib64/python2.7/site-packages/_dbus* /home/$USER/.virtualenvs/mycroft/lib/python2.7/site-packages/\n\n##### Ubuntu / KDE Neon:\n- sudo apt install python-dbus\n- From terminal: cp -R /usr/lib/python2.7/dist-packages/dbus* /home/$USER/.virtualenvs/mycroft/lib/python2.7/site-packages/\n- From terminal: cp /usr/lib/python2.7/dist-packages/_dbus* /home/$USER/.virtualenvs/mycroft/lib/python2.7/site-packages/\n\n* For other distributions:\n- Python Dbus package is required and copying the Python Dbus folder and lib from your system python install over to /home/$USER/.virtualenvs/mycroft/lib/python2.7/site-packages/.", - "short_description": "", - "branch": "master", - "examples": [ - "In digicam next image.", - "In digicam previous image.", - "In digicam rotate clockwise.", - "In digicam rotate counter clockwise.", - "Horizontally.", - "In digicam flip horizontally.", - "Vertically.", - "In digicam flip vertically.", - "Hey Mycroft, in digicam next image", - "Hey Mycroft, in digicam previous image", - "Hey Mycroft, in digicam rotate clockwise", - "Hey Mycroft, in digicam rotate counter clockwise", - "Hey Mycroft, in digicam flip horizontally", - "Hey Mycroft, in digicam flip vertically" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "(AIX) Aditya Mehra" - ], - "requirements": { - "python": [ - "dbus-python" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Digikam Control Skill", - "android_handler": "digikam-control.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-04-01T20:57:12Z", - "archived": false, - "license": "unknown", - "modified": "2018-04-01T21:09:42Z", - "authorname": "gadgetguy08", - "skillname": "", - "foldername": "nextcloudCalendarSkill", - "name": "", - "url": "https://github.com/gadgetguy08/nextcloudCalendarSkill", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "oauth2client==3.0.0", - "httplib2", - "apiclient ", - "tzlocal", - "google-api-python-client " - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Nextcloudcalendarskill Skill", - "android_handler": "nextcloudCalendarSkill.gadgetguy08.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-10-19T10:39:24Z", - "archived": false, - "license": "unknown", - "modified": "2018-10-19T14:18:24Z", - "authorname": "VHeusdens", - "skillname": "Hello World", - "foldername": "skill-red", - "name": "Hello World", - "url": "https://github.com/VHeusdens/skill-red", - "category": "Daily", - "description": "This is a basic Hello Word Skill that takes an _Utterance_ from the user and provides a voice response - a _Dialog_. This Skill demonstrates the basic directory and file structure of a Mycroft Skill, and is a good first Skill to study if you are interested in developing Skills for the Mycroft ecosystem. \n\nIf you want to write **Skills** for Mycroft, Documentation is available:\n[Mycroft Skills Kit](https://mycroft.ai/documentation/skills/msk/)\n * [Developing a new Skill](https://mycroft.ai/documentation/skills/introduction-developing-skills/)\n * [Skill Settings](https://mycroft.ai/documentation/skills/skill-settings/)\n * [Automatic testing of your Mycroft Skill](https://mycroft.ai/documentation/skills/automatic-testing/)\n * [Skill Acceptance Process](https://mycroft.ai/documentation/skills/skills-acceptance-process/)\n * [Mycroft Skills Manager](https://mycroft.ai/documentation/msm/)\n * [Mycroft Message Bus](https://mycroft.ai/documentation/message-bus/)", - "short_description": "Introductory Skill so that Skill Authors can see how a Mycroft Skill is put together", - "branch": "master", - "examples": [ - "Hello world.", - "How are you?", - "Thank you.", - "Hello world", - "Thank you" - ], - "tags": [ - "first-skill", - "helloworld", - "hello", - "Daily", - "greeting", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://rawgithub.com/FortAwesome/Font-Awesome/master/advanced-options/raw-svg/solid/smile.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Daily" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Red Skill", - "android_handler": "skill-red.vheusdens.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-06-23T18:39:01Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-11-29T21:15:23Z", - "authorname": "BugHunterPhilosopher", - "skillname": "Alfred", - "foldername": "Alfred", - "name": "Alfred", - "url": "https://github.com/BugHunterPhilosopher/Alfred", - "category": null, - "description": "Trigger Jeedom scenarios and actions using plain old English. If you are able to send a request to:\nhttp://#IP_JEEDOM#/core/api/jeeApi.php?apikey=#APIKEY#&type=scenario&id=#ID#&action=#ACTION# then it should work.", - "short_description": "", - "branch": "master", - "examples": [ - "Lights.", - "Hey Mycroft, lights => launches the scenario that turns all your lights on" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "BugHunterPhilosopher" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Alfred Skill", - "android_handler": "Alfred.bughunterphilosopher.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-03-23T22:54:16Z", - "archived": false, - "license": "lgpl-3.0", - "modified": "2018-03-23T22:55:23Z", - "authorname": "chris-mcawesome12", - "skillname": "Home Assistant Skill for Mycroft", - "foldername": "Mycroft-Home-Assistant", - "name": "Home Assistant Skill for Mycroft", - "url": "https://github.com/chris-mcawesome12/Mycroft-Home-Assistant", - "category": null, - "description": "[![Stories in Ready](https://badge.waffle.io/btotharye/mycroft-homeassistant.svg?label=ready&title=Ready)](http://waffle.io/btotharye/mycroft-homeassistant)\n\nbased off the original code from https://github.com/BongoEADGC6/mycroft-home-assistant, spun off my own version since they seem to be inactive.\n\nThis is a skill to add [Home Assistant](https://home-assistant.io) support to\n[Mycroft](https://mycroft.ai). Currently is supports turning on and off several\nentity types (`light`, `switch`, `scene`, `groups` and `input_boolean`).", - "short_description": "[![Stories in Ready](https://badge.waffle.io/btotharye/mycroft-homeassistant.svg?label=ready&title=Ready)](http://waffle.io/btotharye/mycroft-homeassistant)", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "fuzzywuzzy==0.14.0", - "requests>=2.10.0", - "python-Levenshtein==0.12.0" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Home Assistant Skill", - "android_handler": "Mycroft-Home-Assistant.chris-mcawesome12.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-12-16T11:31:22Z", - "archived": false, - "license": "unknown", - "modified": "2018-12-16T11:35:31Z", - "authorname": "ln191", - "skillname": "Hello World", - "foldername": "Skill-PhotoFrame", - "name": "Hello World", - "url": "https://github.com/ln191/Skill-PhotoFrame", - "category": "Daily", - "description": "This is a basic Hello Word Skill that takes an _Utterance_ from the user and provides a voice response - a _Dialog_. This Skill demonstrates the basic directory and file structure of a Mycroft Skill, and is a good first Skill to study if you are interested in developing Skills for the Mycroft ecosystem. \n\nIf you want to write **Skills** for Mycroft, Documentation is available:\n[Mycroft Skills Kit](https://mycroft.ai/documentation/skills/msk/)\n * [Developing a new Skill](https://mycroft.ai/documentation/skills/introduction-developing-skills/)\n * [Skill Settings](https://mycroft.ai/documentation/skills/skill-settings/)\n * [Automatic testing of your Mycroft Skill](https://mycroft.ai/documentation/skills/automatic-testing/)\n * [Skill Acceptance Process](https://mycroft.ai/documentation/skills/skills-acceptance-process/)\n * [Mycroft Skills Manager](https://mycroft.ai/documentation/msm/)\n * [Mycroft Message Bus](https://mycroft.ai/documentation/message-bus/)", - "short_description": "Introductory Skill so that Skill Authors can see how a Mycroft Skill is put together", - "branch": "master", - "examples": [ - "Hello world.", - "How are you?", - "Thank you.", - "Hello world", - "Thank you" - ], - "tags": [ - "first-skill", - "helloworld", - "hello", - "Daily", - "greeting", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://rawgithub.com/FortAwesome/Font-Awesome/master/advanced-options/raw-svg/solid/smile.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Daily" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Photoframe Skill", - "android_handler": "Skill-PhotoFrame.ln191.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-12-17T13:21:17Z", - "archived": false, - "license": "unknown", - "modified": "2019-01-02T14:46:31Z", - "authorname": "colla69", - "skillname": "Hello World", - "foldername": "VoiceControlMycroft", - "name": "Hello World", - "url": "https://github.com/colla69/VoiceControlMycroft", - "category": "Daily", - "description": "This is a basic Hello Word Skill that takes an _Utterance_ from the user and provides a voice response - a _Dialog_. This Skill demonstrates the basic directory and file structure of a Mycroft Skill, and is a good first Skill to study if you are interested in developing Skills for the Mycroft ecosystem. \n\nIf you want to write **Skills** for Mycroft, Documentation is available:\n[Mycroft Skills Kit](https://mycroft.ai/documentation/skills/msk/)\n * [Developing a new Skill](https://mycroft.ai/documentation/skills/introduction-developing-skills/)\n * [Skill Settings](https://mycroft.ai/documentation/skills/skill-settings/)\n * [Automatic testing of your Mycroft Skill](https://mycroft.ai/documentation/skills/automatic-testing/)\n * [Skill Acceptance Process](https://mycroft.ai/documentation/skills/skills-acceptance-process/)\n * [Mycroft Skills Manager](https://mycroft.ai/documentation/msm/)\n * [Mycroft Message Bus](https://mycroft.ai/documentation/message-bus/)", - "short_description": "Introductory Skill so that Skill Authors can see how a Mycroft Skill is put together", - "branch": "master", - "examples": [ - "Hello world.", - "How are you?", - "Thank you.", - "Hello world", - "Thank you" - ], - "tags": [ - "first-skill", - "helloworld", - "hello", - "Daily", - "greeting", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://rawgithub.com/FortAwesome/Font-Awesome/master/advanced-options/raw-svg/solid/smile.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Daily" - ], - "requirements": { - "python": [ - "pynput >= 1.4", - "keyboard >= 0.13.2" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Voicecontrolmycroft Skill", - "android_handler": "VoiceControlMycroft.colla69.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-02-01T20:26:25Z", - "archived": false, - "license": "lgpl-3.0", - "modified": "2019-08-26T00:36:43Z", - "authorname": "mschot", - "skillname": "Home Assistant Skill for Mycroft", - "foldername": "mycroft-smartthings", - "name": "Home Assistant Skill for Mycroft", - "url": "https://github.com/mschot/mycroft-smartthings", - "category": null, - "description": "[![Stories in Ready](https://badge.waffle.io/btotharye/mycroft-homeassistant.svg?label=ready&title=Ready)](http://waffle.io/btotharye/mycroft-homeassistant) [![Build Status](https://travis-ci.org/btotharye/mycroft-homeassistant.svg?branch=master)](https://travis-ci.org/btotharye/mycroft-homeassistant)", - "short_description": "[![Stories in Ready](https://badge.waffle.io/btotharye/mycroft-homeassistant.svg?label=ready&title=Ready)](http://waffle.io/btotharye/mycroft-homeassistant) [![Build Status](https://travis-ci.org/btotharye/mycroft-homeassistant.svg?branch=master)](https://travis-ci.org/btotharye/mycroft-homeassistant)", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [ - "fuzzywuzzy==0.14.0", - "python-Levenshtein==0.12.0" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Smartthings Skill", - "android_handler": "mycroft-smartthings.mschot.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-11-05T17:48:01Z", - "archived": false, - "license": "unknown", - "modified": "2020-05-26T20:35:19Z", - "authorname": "henridbr", - "skillname": "Netatmo Weather", - "foldername": "henridbr-netatmo-weather", - "name": "Netatmo Weather", - "url": "https://github.com/henridbr/henridbr-netatmo-weather", - "category": "Daily", - "description": "Netatmo weather device is part of your home network using wifi and you can look at some parameters from Netatmo website on your desktop, or apps on smartphones and tablets.\n\n[![Netatmo_weather station](https://raw.githubusercontent.com/henridbr/Netatmo-Weather/master/images/Netatmo-device.png\n)](https://www.netatmo.com/en-US/product/weather/)\n\nWhat's new with Mycroft ? \"Hey Mycroft, what's the room temperature ?\", it's easier and faster.", - "short_description": "A Mycroft Skill for Home Temperatures and more with Netatmo.", - "branch": "master", - "examples": [ - "I need info from Netatmo.", - "What's home temperature ?", - "What's room temperature ?", - "What's the temperature in our garden ?", - "What's the pressure ?", - "What's the humidity ?", - "Hey Mycroft, I need info from Netatmo and Mycroft will connect to Netatmo", - "What's home temperature ? and Mycroft says inside and out side temperatures", - "What's room temperature ? and Mycroft says inside temperature and its trend", - "What's the temperature in our garden ? and Mycroft says outside temperature and its trend", - "What's the pressure ? and Mycroft says absolute (at sea level) atmospheric pressure and its trend", - "What's the humidity ? and Mycroft says outside temperature and its trend" - ], - "tags": [ - "IoT", - "Netatmo", - "Picroft", - "Daily", - "Weather", - "no-license" - ], - "platforms": [ - "platform_picroft" - ], - "stars": 0, - "icon": "https://raw.githubusercontent.com/henridbr/Netatmo-Weather/master/images/Home_Temp.png", - "credits": [ - "Henri Debierre (@henridbr)\n\n[Netatmo SDK](https://dev.netatmo.com/resources/technical/samplessdks/codesamples#getstationsdata)" - ], - "categories": [ - "Daily", - "IoT" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Henridbr Netatmo Weather Skill", - "android_handler": "henridbr-netatmo-weather.henridbr.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-12-10T17:00:15Z", - "archived": false, - "license": "unknown", - "modified": "2018-12-10T19:53:21Z", - "authorname": "josmoo15", - "skillname": "Hello World", - "foldername": "skill-mcp-status", - "name": "Hello World", - "url": "https://github.com/josmoo15/skill-mcp-status", - "category": "Daily", - "description": "This is a basic Hello Word Skill that takes an _Utterance_ from the user and provides a voice response - a _Dialog_. This Skill demonstrates the basic directory and file structure of a Mycroft Skill, and is a good first Skill to study if you are interested in developing Skills for the Mycroft ecosystem. \n\nIf you want to write **Skills** for Mycroft, Documentation is available:\n[Mycroft Skills Kit](https://mycroft.ai/documentation/skills/msk/)\n * [Developing a new Skill](https://mycroft.ai/documentation/skills/introduction-developing-skills/)\n * [Skill Settings](https://mycroft.ai/documentation/skills/skill-settings/)\n * [Automatic testing of your Mycroft Skill](https://mycroft.ai/documentation/skills/automatic-testing/)\n * [Skill Acceptance Process](https://mycroft.ai/documentation/skills/skills-acceptance-process/)\n * [Mycroft Skills Manager](https://mycroft.ai/documentation/msm/)\n * [Mycroft Message Bus](https://mycroft.ai/documentation/message-bus/)", - "short_description": "Introductory Skill so that Skill Authors can see how a Mycroft Skill is put together", - "branch": "master", - "examples": [ - "Hello world.", - "How are you?", - "Thank you.", - "Hello world", - "Thank you" - ], - "tags": [ - "first-skill", - "helloworld", - "hello", - "Daily", - "greeting", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://rawgithub.com/FortAwesome/Font-Awesome/master/advanced-options/raw-svg/solid/smile.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Daily" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mcp Status Skill", - "android_handler": "skill-mcp-status.josmoo15.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-11-15T10:59:46Z", - "archived": false, - "license": "unknown", - "modified": "2018-11-15T21:39:32Z", - "authorname": "Smoerble", - "skillname": "Hello World", - "foldername": "skill-hello-earth", - "name": "Hello World", - "url": "https://github.com/Smoerble/skill-hello-earth", - "category": "Daily", - "description": "This is a basic Hello Word Skill that takes an _Utterance_ from the user and provides a voice response - a _Dialog_. This Skill demonstrates the basic directory and file structure of a Mycroft Skill, and is a good first Skill to study if you are interested in developing Skills for the Mycroft ecosystem. \n\nIf you want to write **Skills** for Mycroft, Documentation is available:\n[Mycroft Skills Kit](https://mycroft.ai/documentation/skills/msk/)\n * [Developing a new Skill](https://mycroft.ai/documentation/skills/introduction-developing-skills/)\n * [Skill Settings](https://mycroft.ai/documentation/skills/skill-settings/)\n * [Automatic testing of your Mycroft Skill](https://mycroft.ai/documentation/skills/automatic-testing/)\n * [Skill Acceptance Process](https://mycroft.ai/documentation/skills/skills-acceptance-process/)\n * [Mycroft Skills Manager](https://mycroft.ai/documentation/msm/)\n * [Mycroft Message Bus](https://mycroft.ai/documentation/message-bus/)", - "short_description": "Introductory Skill so that Skill Authors can see how a Mycroft Skill is put together", - "branch": "master", - "examples": [ - "Hello world.", - "How are you?", - "Thank you.", - "Hello world", - "Thank you" - ], - "tags": [ - "first-skill", - "helloworld", - "hello", - "Daily", - "greeting", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://rawgithub.com/FortAwesome/Font-Awesome/master/advanced-options/raw-svg/solid/smile.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Daily" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Hello Earth Skill", - "android_handler": "skill-hello-earth.smoerble.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-09-29T15:35:59Z", - "archived": false, - "license": "mit", - "modified": "2019-05-04T00:58:18Z", - "authorname": "Tyler-The-App-Creator", - "skillname": "Mycroftinator", - "foldername": "mycroftinator", - "name": "Mycroftinator", - "url": "https://github.com/Tyler-The-App-Creator/mycroftinator", - "category": null, - "description": "A fun game created with Akinator the Genie, https://en.akinator.com/\nbrought to life using the Mycroft open source AI, https://mycroft.ai/", - "short_description": "", - "branch": "master", - "examples": [ - "Start Akinator.", - "Play Mycroftinator.", - "Start Akinator", - "Play Mycroftinator" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Tyler The App Creator" - ], - "requirements": { - "python": [ - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroftinator Skill", - "android_handler": "mycroftinator.tyler-the-app-creator.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-07-16T19:56:03Z", - "archived": false, - "license": "unknown", - "modified": "2018-07-18T05:02:44Z", - "authorname": "aussieW", - "skillname": "Knock Knock Jokes", - "foldername": "knock-knock-jokes-skill", - "name": "Knock Knock Jokes", - "url": "https://github.com/aussieW/knock-knock-jokes-skill", - "category": null, - "description": "A skill for telling Knock Knock jokes.\n\nThe user requests Mycroft to tell a knock knock joke and then interacts with Mycroft in the delivery of the joke. Mycroft expects the user to reply with certain keywords to allow the interaction to progress smoothly.\n\nHere is a sample interaction\n\nUser: \"Hey Mycroft, tell me a knock knock\"\n\nMycroft: \"knock knock\"\n\nUser: \"who's there\" <<< must be this response\n\nMycroft: \"says\"\n\nUser: \"says who\" <<< must have the word 'who' somewhere in the response\n\nMycroft: \"says me, that's who\"\n\nUser: rotfl.", - "short_description": "", - "branch": "master", - "examples": [ - "Tell me a knock knock joke." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "aussieW" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Knock Knock Jokes Skill", - "android_handler": "knock-knock-jokes-skill.aussiew.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-05-25T19:11:30Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-01-06T19:02:28Z", - "authorname": "RdeLange", - "skillname": "Mosquito Message", - "foldername": "skill-mosquito-message", - "name": "Mosquito Message", - "url": "https://github.com/RdeLange/skill-mosquito-message", - "category": null, - "description": "This skill has two purposes:\n1) Instead of triggering a skill by asking Mycroft a question, this skill triggers when a text message is received on mqtt.\nIt can be used for notifications. For instance, a smart home server could publish the text \"Somebody is at the door\", if the doorbell is pressed.\nIt is possible to make Mycroft repeat the last text it received on mqtt.\n\n2) Send an utterance in text from mqtt, to activate other skills. For instance, if your\nhome automation detect that a window is opened, send the text \"_utterance remind me to close the window in 10 minutes\" on mqtt to\ntrigger the \"reminder\" skill.\n\n\n### Configuration\nThe skill is configured on your \"Mycroft Home\" page. Configure the mqtt server, port and topic that the skill will listen for text messages on.\nCurrently, password or certificates are not supported. (Maybe I will implement it if you promise to test it :)\n\nA restart of the skill is needed when changing the configuration.\n\nOptionally, it is possible to split the text, using a regular expression.\n\nExample CamelCase: If you send the string \"KitchenWindow is open\",\nyou want to split KitchenWindow. After the split Mycroft will say \"Kitchen Window is open\". To do that set the parameters on \"Mycroft Home\" like this:\n* Split text at pattern (optional): [a-z][A-Z]\n* Retain characters in matched string until index: 1\n* Retain characters in matched string from index: 1\n\nWhat happens: The regex match \"nK\" in \"KitchenWindow is open\". We retain the characters until index 1 of \"nK\", which is n.\nWe retain the characters after index 1 of \"nK\", which is K. And we put a space in the middle.\n\nExample hypen: Convert \"Outside-temperature is -5 degrees\" to \"Outside temperature is -5 degrees\"\n* Split text at pattern (optional): [a-z|A-Z]-[a-z|A-Z]\n* Retain characters in matched string until index: 1\n* Retain characters in matched string from index: 2\n\nWhat happens: The regex match \"e-t\" in \"Outside-temperature is -5 degrees\". We retain the characters until index 1 of \"e-t\", which is e.\nWe retain the characters after index 2 of \"e-t\", which is t. And we put a space in the middle.\n\nExample underscore: Convert \"Kitchen_window is open\" to \"Kitchen Window is open\"\n* Split text at pattern (optional): _\n* Retain characters in matched string until index: 0\n* Retain characters in matched string from index: 1\n\nWhat happens: The regex match \"_\" in \"Kitchen_window is open\". We retain the characters until index 0 of \"_\", which is no characters.\nWe retain the characters after index 1 of \"_\", which is no characters. And we put a space in the middle.", - "short_description": "", - "branch": "master", - "examples": [ - "Out/text.", - "You, at a linux command prompt: mosquitto_pub -h mqttserver -t my-out/text -m.", - ":", - "You:", - ":", - "You, at a linux command prompt: mosquitto_pub -h mqttserver -t my-out/text -m.", - ":", - ":", - "You, at a linux command prompt: mosquitto_pub -h mqttserver -t my-out/text -m the washing machine is done", - "Mycroft: the washing machine is done", - "You: Hey Mycroft, what was the last mosquito message", - "Mycroft: the washing machine is done", - "You, at a linux command prompt: mosquitto_pub -h mqttserver -t my-out/text -m _utterance remind me to close the window in 10 minutes", - "Mycroft: reminder set for 9 minute and 59 seconds from now", - "Mycroft: you have a reminder to close the window" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Carsten Agerskov (https://github.com/CarstenAgerskov)" - ], - "requirements": { - "python": [ - "paho-mqtt", - "future" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mosquito Message Skill", - "android_handler": "skill-mosquito-message.rdelange.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-01-30T01:11:21Z", - "archived": false, - "license": "unknown", - "modified": "2018-02-13T16:18:11Z", - "authorname": "aussieW", - "skillname": "Description", - "foldername": "skill-knock-knock-jokes", - "name": "Description", - "url": "https://github.com/aussieW/skill-knock-knock-jokes", - "category": null, - "description": "In this skill a user interacts with Mycroft to tell a Knock Knock joke.\n\nHere is a sample interaction\n\nUser: \"Hey Mycroft, tell a knock knock\"\n\nMycroft: \"knock knock\"\n\nUser: \"who's there\" <<< must be this response\n\nMycroft: \"says\"\n\nUser: \"says who\" <<< must have the word 'who' somewhere in the response\n\nMycroft: \"says me, that's who\"\n\nUser: rotfl.", - "short_description": "", - "branch": "master", - "examples": [ - "Tell a knock knock.", - "Tell a knock knock joke.", - "tell a knock knock", - "tell a knock knock joke <<<< this version does not work yet!!!!!" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "aussieW" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Knock Knock Jokes Skill", - "android_handler": "skill-knock-knock-jokes.aussiew.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-03-06T13:17:34Z", - "archived": false, - "license": "unknown", - "modified": "2018-03-06T13:21:47Z", - "authorname": "AIIX", - "skillname": "plasma-baloo-search-skill", - "foldername": "plasma-baloo-search-skill", - "name": "plasma-baloo-search-skill", - "url": "https://github.com/AIIX/plasma-baloo-search-skill", - "category": null, - "description": "#### Note: This Mycroft Skill Requires The Mycroft Plasmoid for Desktop / Plasma-Mobile To Display Results.", - "short_description": "", - "branch": "master", - "examples": [ - "Local search music $Songnamehere.", - "Local search video $Movienamehere.", - "Local search documents $Documentnamehere.", - "Hey Mycroft local search music $Songnamehere", - "Hey Mycroft local search video $Movienamehere", - "Hey Mycroft local search documents $Documentnamehere" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Aix (aix.m@outlook.com)" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Plasma Baloo Search Skill", - "android_handler": "plasma-baloo-search-skill.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-01-21T10:31:22Z", - "archived": false, - "license": "unknown", - "modified": "2018-01-21T10:37:09Z", - "authorname": "smolino", - "skillname": "skill-communicate", - "foldername": "skill-communicate", - "name": "skill-communicate", - "url": "https://github.com/smolino/skill-communicate", - "category": null, - "description": "Communication with voice command between picroft or Desktop and another picroft with skill-gpio8s installed.\nThe communication is made using an ssh connection sending say_to_mycroft command to a remote picroft.\n\nLocal (desktop or picroft) skill-communicate --> remote (picroft with skill-gpio8s)\n\nFrom local Picroft you are able to run remote picroft commands", - "short_description": "Communication with voice command between picroft or Desktop and another picroft with skill-gpio8s installed.", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Communicate Skill", - "android_handler": "skill-communicate.smolino.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-06-29T11:54:15Z", - "archived": false, - "license": "apache-2.0", - "modified": "2018-06-29T12:46:08Z", - "authorname": "sofwerx", - "skillname": "Mycroft PDF Skill", - "foldername": "skill-pdf", - "name": "Mycroft PDF Skill", - "url": "https://github.com/sofwerx/skill-pdf", - "category": null, - "description": "Use mycroft to query pages from pdf with spoken keywords.", - "short_description": "", - "branch": "master", - "examples": [ - "Filter for linux.", - "Filter for wireshark and windows.", - "filter for linux", - "filter for wireshark and windows" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "wikipedia==1.4.0" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Pdf Skill", - "android_handler": "skill-pdf.sofwerx.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-12-07T15:52:20Z", - "archived": false, - "license": "apache-2.0", - "modified": "2019-11-14T09:27:58Z", - "authorname": "luke5sky", - "skillname": "Directions Skill", - "foldername": "directions-skill", - "name": "Directions Skill", - "url": "https://github.com/luke5sky/directions-skill", - "category": null, - "description": "A skill to get simple directions (time and distance) via MyCroft.\n\nYou need to create an account at https://openrouteservice.org/ and create an API-KEY/API-TOKEN put this on home.mycroft.ai under skill settings.\nAfter this restart your MyCroft Unit or give mycroft some time to sync the settings.\n\nSettings:\n- OPENROUTESERVICE-APIKEY: API-Key from OpenRouteService\n- DISTANCE-UNIT: this may be KM (for kilometers) or MI (for miles)\n\nHowToUse:\n\n\"Hey mycroft, give me directions from Richmond Hill Road New York to 39th street kansas city\"", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "Luke5Sky" - ], - "requirements": { - "python": [ - "urllib.request" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Directions Skill", - "android_handler": "directions-skill.luke5sky.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-02-03T10:47:42Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-11-19T23:14:43Z", - "authorname": "mkonsti", - "skillname": "Deutschlandfunk player", - "foldername": "radio_playback_skill", - "name": "Deutschlandfunk player", - "url": "https://github.com/mkonsti/radio_playback_skill", - "category": null, - "description": "Play Deutschlandfunk streams and query schedule.", - "short_description": "", - "branch": "master", - "examples": [ - "Play dlf nova.", - "Play dlf.", - "Play dlf culture.", - "What's on dlf?", - "Hey Mycroft, play dlf nova", - "Hey Mycroft, play dlf", - "Hey Mycroft, play dlf culture", - "Hey Mycroft, what's on dlf" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "@ofosos" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Radio_Playback_Skill Skill", - "android_handler": "radio_playback_skill.mkonsti.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-03-27T07:14:52Z", - "archived": false, - "license": "unknown", - "modified": "2018-08-22T16:10:52Z", - "authorname": "AIIX", - "skillname": "Ask-Stack", - "foldername": "ask-stack", - "name": "Ask-Stack", - "url": "https://github.com/AIIX/ask-stack", - "category": null, - "description": "#### Note: This Mycroft Skill Requires The Mycroft Plasmoid for Desktop / Plasma-Mobile To Display and Interact with Results\nFind Questions on StackExchanged based channels.\n###### Done: StackOverFlow\n###### ToDo: Rest.", - "short_description": "", - "branch": "master", - "examples": [ - "Ask stackoverflow how to debug python.", - "Hey Mycroft ask stackoverflow how to debug python" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Aix (aix.m@outlook.com)" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Ask Stack Skill", - "android_handler": "ask-stack.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-03-29T02:14:26Z", - "archived": false, - "license": "agpl-3.0", - "modified": "2018-04-28T17:56:42Z", - "authorname": "Quinn2017", - "skillname": "Skill-Abitrator-of-Disputes", - "foldername": "Skill-Arbitrator-of-Disputes", - "name": "Skill-Abitrator-of-Disputes", - "url": "https://github.com/Quinn2017/Skill-Arbitrator-of-Disputes", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [ - "Up if all parties consent, to which a." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "The skill is inspired and a basic reworking of Willem Ligtenberg's 'Flip a Coin' Skill." - ], - "requirements": { - "python": [ - "None" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Arbitrator Of Disputes Skill", - "android_handler": "Skill-Arbitrator-of-Disputes.quinn2017.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-10-15T18:13:23Z", - "archived": false, - "license": "apache-2.0", - "modified": "2018-10-15T18:23:52Z", - "authorname": "syner1", - "skillname": "Naptime", - "foldername": "mycroft-nap-skill", - "name": "Naptime", - "url": "https://github.com/syner1/mycroft-nap-skill", - "category": "Daily", - "description": "Tell Mycroft to sleep when you don't want to be disturbed in any way.\nThis stops all calls to Speech to Text system, guaranteeing your voice won't\nbe sent anywhere on an accidental activation.\n\nWhen sleeping, Mycroft will only listen locally for the phrase \"Hey Mycroft,\nwake up\". Otherwise the system will be totally silent and won't bother you.\n\nOn a Mark 1 this also dims the eyes.", - "short_description": "Put Mycroft to sleep when you don't want to be disturbed", - "branch": "18.08", - "examples": [ - "Go to sleep.", - "Nap time.", - "Wake up.", - "Go to sleep", - "Nap time", - "Wake up" - ], - "tags": [ - "naptime", - "do-not-disturb", - "sleep", - "donotdisturb", - "Configuration", - "Daily", - "nap", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://rawgithub.com/FortAwesome/Font-Awesome/master/advanced-options/raw-svg/solid/bed.svg", - "credits": [ - "Mycroft AI (@MycroftAI)\nzelmon64 (correct wake word)" - ], - "categories": [ - "Daily", - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Nap Skill", - "android_handler": "mycroft-nap-skill.syner1.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-10-07T21:57:00Z", - "archived": false, - "license": "unknown", - "modified": "2019-06-15T02:23:48Z", - "authorname": "JarbasAl", - "skillname": "Colossal Cave Adventure", - "foldername": "cave-adventure-game-skill", - "name": "Colossal Cave Adventure", - "url": "https://github.com/JarbasAl/cave-adventure-game-skill", - "category": "Entertainment", - "description": "This is a faithful port of the “Adventure” game to a Mycroft Skill from the original 1977 FORTRAN code by Crowther and Woods.\n\nAdapted from [python-adventure](https://github.com/brandon-rhodes/python-adventure), the python port of the game.", - "short_description": "[![Donate with Bitcoin](https://en.cryptobadges.io/badge/micro/1QJNhKM8tVv62XSUrST2vnaMXh5ADSyYP8)](https://en.cryptobadges.io/donate/1QJNhKM8tVv62XSUrST2vnaMXh5ADSyYP8) [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://paypal.me/jarbasai) [![Say Thanks!](https://img.shields.io/badge/Say%20Thanks-!-1EAEDB.svg)](https://saythanks.io/to/JarbasAl) skill for Adventure game by Crowther and Woods", - "branch": "master", - "examples": [ - "Play cave adventure.", - "Who made cave adventure?", - "Save.", - "Resume cave adventure." - ], - "tags": [ - "Entertainment", - "cave", - "game", - "adventure", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 4, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Cave Adventure Game Skill", - "android_handler": "cave-adventure-game-skill.jarbasal.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-01-06T21:55:09Z", - "archived": false, - "license": "unknown", - "modified": "2018-08-27T15:35:39Z", - "authorname": "erabti", - "skillname": "Pomodoro Skill", - "foldername": "mycroft-pomodoro-skill", - "name": "Pomodoro Skill", - "url": "https://github.com/erabti/mycroft-pomodoro-skill", - "category": null, - "description": "This skill is used to try to make Mycroft as your work companion.\nPomodoro is a very good work technique used to manage time, by giving persistent break times.\n\n### NOTES:\n1. The default work time is 25 minutes, the default break time is 5 minutes and the default long break time is 15 minutes.\n2. If you want to change the work time or the break time in speech, say the work time first.\n3. Not recommended to put the break time longer than the work time.\n4. Not recommended to put the work and break time too short (below 10 seconds).\n\n### Terminology:\n1. A cycle is one finished work and one finished break.\n2. A run is four finished cycles.\n3. A long break is a duration taken each run.\n4. A session is all works and breaks taken after stopping pomodoro.\n\n### TODO:\n1. Make a record to store the sessions.\n2. Ask to save the session each time finishes.\n3. Keep record of distractions during the session.\n4. Integrate with the enclosure.\n5. Switchable fun mode!", - "short_description": "", - "branch": "master", - "examples": [ - "Pomodoro.", - "Start pomodoro.", - "Start a pomodoro.", - "Start a pomodoro for 23 minutes.", - "Start a pomodoro for 20 minutes and 10 minutes.", - "Start pomodoro for 30 minutes work and 10 minutes break.", - "Start a pomodoro for 20 minutes work time and 5 minutes break time.", - "How much time left for the work time.", - "How much time left in pomodoro.", - "Pomodoro status.", - "How much time left for the break.", - "What is the remaining time for the break?", - "End pomodoro.", - "Stop pomodoro.", - "Exit pomodoro.", - "pomodoro", - "start pomodoro", - "start a pomodoro", - "start a pomodoro for 23 minutes", - "start a pomodoro for 20 minutes and 10 minutes", - "start pomodoro for 30 minutes work and 10 minutes break", - "start a pomodoro for 20 minutes work time and 5 minutes break time", - "how much time left for the work time", - "how much time left in pomodoro", - "pomodoro status", - "how much time left for the break", - "what is the remaining time for the break", - "end pomodoro", - "stop pomodoro", - "exit pomodoro" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "credits": [ - "erabti\nmycroft community" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Pomodoro Skill", - "android_handler": "mycroft-pomodoro-skill.erabti.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-10-12T14:39:47Z", - "archived": false, - "license": "unknown", - "modified": "2020-05-25T19:17:58Z", - "authorname": "henridbr", - "skillname": "![tree](https://github.com/henridbr/Skill_Family_Learning/blob/master/images/arbre1.jpg) My Family Tree", - "foldername": "henridbr-my_family_tree", - "name": "![tree](https://github.com/henridbr/Skill_Family_Learning/blob/master/images/arbre1.jpg) My Family Tree", - "url": "https://github.com/henridbr/henridbr-my_family_tree", - "category": null, - "description": "**a SKILL for Mycroft**\n\nThe family tree is pre-recorded and Mycroft can read it.", - "short_description": "**a SKILL for Mycroft**", - "branch": "master", - "examples": [ - "Who is my granddaughter ?", - "How old is Joe ?", - "What is the city of Jane ?", - "And more to be developped.", - "who is my granddaughter ?", - "how old is Joe ?", - "what is the city of Jane ?", - "and more to be developped" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Henridbr My_Family_Tree Skill", - "android_handler": "henridbr-my_family_tree.henridbr.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-05-23T13:30:34Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2018-05-23T22:08:49Z", - "authorname": "adamc199", - "skillname": "Mycroft-skill-karma", - "foldername": "Mycroft-skill-karma", - "name": "Mycroft-skill-karma", - "url": "https://github.com/adamc199/Mycroft-skill-karma", - "category": null, - "description": "Building my first skill for mycroft to play different kinds of requested karma\n\nGoing to base it on this coin flip skill: https://github.com/wligtenberg/coin-flip-skill\n\nI also have never written python code, or any real code.\n\n=============================================\n\nThe master version is stable and works\n\nTo install:\nmsm install https://github.com/adamc199/Mycroft-skill-karma\n\nThen restart the myvroft skills\nmycroft-skills restart", - "short_description": "Building my first skill for mycroft to play different kinds of requested karma", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Karma Skill", - "android_handler": "Mycroft-skill-karma.adamc199.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-07-17T15:54:14Z", - "archived": false, - "license": "unknown", - "modified": "2018-07-17T17:22:34Z", - "authorname": "estherdalley", - "skillname": "Check Signal", - "foldername": "check-signal-skill", - "name": "Check Signal", - "url": "https://github.com/estherdalley/check-signal-skill", - "category": null, - "description": "Mycroft skill for checking the signal strength of a connected IOTBit.", - "short_description": "", - "branch": "master", - "examples": [ - "How good is my signal?", - "What's the signal strength here?" - ], - "tags": [ - "home", - "testing", - "Mycroft", - "an", - "cloned", - "of", - "home,", - "during", - "as", - "is", - "if", - "be", - "IOTBit_library-auto", - "home/pi/:", - "venv", - "edit", - "to", - "startMycroft.sh", - "needs", - "from", - "designed", - "etc.", - "look", - "where", - "for", - "into", - "way", - "starting", - "run", - "will", - "cli-client", - "/home/pi/mycroft-core/.venv/lib/python3.5/site-packages", - "-", - "mycroft-core", - "moved", - "necessary.", - "the", - "easy", - "you", - "and", - "For", - "copy", - "paths", - "example,", - "it:", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Check Signal Skill", - "android_handler": "check-signal-skill.estherdalley.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-09-23T21:04:48Z", - "archived": false, - "license": "apache-2.0", - "modified": "2018-09-23T21:04:58Z", - "authorname": "solograyhat", - "skillname": "Mycroft's Personal Background", - "foldername": "skill-personal-18.08", - "name": "Mycroft's Personal Background", - "url": "https://github.com/solograyhat/skill-personal-18.08", - "category": "Entertainment", - "description": "Ask about the \"birth\" and parentage of Mycroft and get a taste of the community\nwho is fostering this open source artificial intelligence.", - "short_description": "Learn history and personality of Mycroft", - "branch": "master", - "examples": [ - "When were you created?", - "What are you?", - "Where were you born?", - "Who made you?", - "Do you even rhyme?" - ], - "tags": [ - "Entertainment", - "personality", - "persona", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://rawgithub.com/FortAwesome/Font-Awesome/master/advanced-options/raw-svg/solid/smile-wink.svg", - "credits": [ - "Mycroft AI (@MycroftAI)\n\nPoem penned by community member Jelmer Prins" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Personal 18.08 Skill", - "android_handler": "skill-personal-18.08.solograyhat.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-05-23T21:32:47Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-01-23T22:50:38Z", - "authorname": "RdeLange", - "skillname": "Mosquito Broadcast", - "foldername": "skill-mosquito-broadcast", - "name": "Mosquito Broadcast", - "url": "https://github.com/RdeLange/skill-mosquito-broadcast", - "category": null, - "description": "This skill has three purposes:\n1) Broadcast messages to other mycroft devices\n2) Receive broadcast messages from other mycroft devices\n3) Repeat the last broadcast message which was send to the mqtt topic specified\n\nAnd a warning: Due to the way this skill is implemented, it may stop working in case of a live update, under certain circumstances. A workaround is restarting the skill (or restarting Mycroft).\nThe problem only affects this skill. I am still looking for a solution to this.\n\n\n### Configuration\nThe skill is configured on your \"Mycroft Home\" page. Configure the mqtt server, port and topic that the skill will listen for text messages on.\nCurrently, password or certificates are not supported. (Maybe I will implement it if you promise to test it :)\n\nA restart of the skill is needed when changing the configuration.\n\nOptionally, it is possible to split the text, using a regular expression.\n\nExample CamelCase: If you send the string \"KitchenWindow is open\",\nyou want to split KitchenWindow. After the split Mycroft will say \"Kitchen Window is open\". To do that set the parameters on \"Mycroft Home\" like this:\n* Split text at pattern (optional): [a-z][A-Z]\n* Retain characters in matched string until index: 1\n* Retain characters in matched string from index: 1\n\nWhat happens: The regex match \"nK\" in \"KitchenWindow is open\". We retain the characters until index 1 of \"nK\", which is n.\nWe retain the characters after index 1 of \"nK\", which is K. And we put a space in the middle.\n\nExample hypen: Convert \"Outside-temperature is -5 degrees\" to \"Outside temperature is -5 degrees\"\n* Split text at pattern (optional): [a-z|A-Z]-[a-z|A-Z]\n* Retain characters in matched string until index: 1\n* Retain characters in matched string from index: 2\n\nWhat happens: The regex match \"e-t\" in \"Outside-temperature is -5 degrees\". We retain the characters until index 1 of \"e-t\", which is e.\nWe retain the characters after index 2 of \"e-t\", which is t. And we put a space in the middle.\n\nExample underscore: Convert \"Kitchen_window is open\" to \"Kitchen Window is open\"\n* Split text at pattern (optional): _\n* Retain characters in matched string until index: 0\n* Retain characters in matched string from index: 1\n\nWhat happens: The regex match \"_\" in \"Kitchen_window is open\". We retain the characters until index 0 of \"_\", which is no characters.\nWe retain the characters after index 1 of \"_\", which is no characters. And we put a space in the middle.", - "short_description": "", - "branch": "18.8.1", - "examples": [ - "Out/text.", - "You:", - "(on your device):", - "(on other devices): <DINGDONG>", - "You:", - "(on your device):" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "Based on the Mosquito-Speak Skill from Carsten Agerskov (https://github.com/CarstenAgerskov)" - ], - "requirements": { - "python": [ - "paho-mqtt", - "future" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mosquito Broadcast Skill", - "android_handler": "skill-mosquito-broadcast.rdelange.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-04-03T07:56:17Z", - "archived": false, - "license": "unknown", - "modified": "2018-08-22T16:12:12Z", - "authorname": "AIIX", - "skillname": "Animelist-skill", - "foldername": "animelist-skill", - "name": "Animelist-skill", - "url": "https://github.com/AIIX/animelist-skill", - "category": null, - "description": "#### Installation of skill:\n* Download or Clone Git (run: git clone https://github.com/AIIX/Animelist-skill inside /opt/mycroft/skills)\n* Create /opt/mycroft/skills folder if it does not exist\n* Extract Downloaded Skill into a folder. \"Animelist-skill\". (Clone does not require this step)\n* Copy the Animelist-skill folder to /opt/mycroft/skills/ folder.", - "short_description": "", - "branch": "master", - "examples": [ - "Search anime %some-anime-name or $some-anime-keywords.", - "Hey Mycroft, search anime %some-anime-name or $some-anime-keywords" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "PyMoe - https://github.com/ccubed/PyMoe - Author: https://github.com/ccubed", - "(AIX) Aditya Mehra" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Animelist Skill", - "android_handler": "animelist-skill.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-03-18T04:00:51Z", - "archived": false, - "license": "unknown", - "modified": "2020-10-23T17:48:41Z", - "authorname": "ejstacey", - "skillname": "subsonic media player", - "foldername": "skill-subsonic-media", - "name": "subsonic media player", - "url": "https://github.com/ejstacey/skill-subsonic-media", - "category": null, - "description": "This module plays streaming content from a Subsonic Media Server (https://www.subsonic.org/).", - "short_description": "", - "branch": "master", - "examples": [ - "Play something i can never have by nine inch nails.", - "Play pretty hate machine.", - "Play nine inch nails.", - "Play pretty hate machine on random on my chromecast." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Subsonic Media Skill", - "android_handler": "skill-subsonic-media.ejstacey.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-05-15T04:18:31Z", - "archived": false, - "license": "mit", - "modified": "2018-05-15T04:34:27Z", - "authorname": "HellCatVN", - "skillname": "Mycroft-Random", - "foldername": "Mycroft-Random", - "name": "Mycroft-Random", - "url": "https://github.com/HellCatVN/Mycroft-Random", - "category": null, - "description": "This skill will let mycroft create n number from a to b.", - "short_description": "", - "branch": "master", - "examples": [ - "Random from a to b.", - "Random n from a to b.", - "Random from a to b", - "Random n from a to b" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "HellCatVN" - ], - "requirements": { - "python": [ - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Random Skill", - "android_handler": "Mycroft-Random.hellcatvn.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-08-11T22:11:00Z", - "archived": false, - "license": "mit", - "modified": "2020-03-14T21:31:02Z", - "authorname": "Shamanon", - "skillname": "webSearch", - "foldername": "webSearch", - "name": "webSearch", - "url": "https://github.com/Shamanon/webSearch", - "category": null, - "description": "Mycroft Skill to initiate browser search using google, pirate bay, etc.", - "short_description": "Mycroft Skill to initiate browser search using google, pirate bay, etc.", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Websearch Skill", - "android_handler": "webSearch.shamanon.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-04-14T03:13:11Z", - "archived": false, - "license": "unknown", - "modified": "2018-04-14T03:16:35Z", - "authorname": "marcfunston", - "skillname": "Algorithm", - "foldername": "skill-protocol", - "name": "Algorithm", - "url": "https://github.com/marcfunston/skill-protocol", - "category": null, - "description": "Currently undefined functions\nOmega will shut MyCroft and the computer.", - "short_description": "", - "branch": "master", - "examples": [ - "Protocol Gamma.", - "Tell me merge sort running time.", - "Protocol Gamma", - "Tell me merge sort running time" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Mycroft AI" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Protocol Skill", - "android_handler": "skill-protocol.marcfunston.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-09-23T20:49:44Z", - "archived": false, - "license": "unknown", - "modified": "2018-09-23T21:13:55Z", - "authorname": "solograyhat", - "skillname": "skill-personal", - "foldername": "mycroft-personal", - "name": "skill-personal", - "url": "https://github.com/solograyhat/mycroft-personal", - "category": null, - "description": "Skill will answer some of the personality questions of mycroft.", - "short_description": "", - "branch": "master", - "examples": [ - "What are you?", - "Where are you born?", - "Who made you?", - "what are you?", - "where are you born?", - "who made you?" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Mycroft Inc" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Personal Skill", - "android_handler": "mycroft-personal.solograyhat.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-06-28T20:18:10Z", - "archived": false, - "license": "mit", - "modified": "2018-06-28T20:18:54Z", - "authorname": "avimeens", - "skillname": "Wemo Controller Using Wit", - "foldername": "skill-wemo-controller-using-wit", - "name": "Wemo Controller Using Wit", - "url": "https://github.com/avimeens/skill-wemo-controller-using-wit", - "category": null, - "description": "Mycroft skill to controll WeMo switches that are not on the same network as Mycroft.", - "short_description": "", - "branch": "master", - "examples": [ - "Find WeMo devices.", - "Discover WeMo devices.", - "Turn on living room lights.", - "Turn of living room lights.", - "Turn on dining room fan.", - "Turn off dining room fan." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Avinash Vyas" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Wemo Controller Using Wit Skill", - "android_handler": "skill-wemo-controller-using-wit.avimeens.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-12-23T17:44:57Z", - "archived": false, - "license": "unknown", - "modified": "2018-12-23T17:45:09Z", - "authorname": "cliffordvandyk", - "skillname": "Mqtt Automation Controller", - "foldername": "mqtt-automation-controller-skill", - "name": "Mqtt Automation Controller", - "url": "https://github.com/cliffordvandyk/mqtt-automation-controller-skill", - "category": null, - "description": "Allows control of mqtt-interfaced automation by converting requests to suitable mqtt messages to an mqtt broker on the local network.", - "short_description": "", - "branch": "master", - "examples": [ - "Turn on the pool pump.", - "Turn off the kitchen light.", - "Set the bedroom light to fifty per cent." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "cliffordvandyk" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mqtt Automation Controller Skill", - "android_handler": "mqtt-automation-controller-skill.cliffordvandyk.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-12-02T22:35:38Z", - "archived": false, - "license": "unknown", - "modified": "2020-02-23T21:30:48Z", - "authorname": "KCAstromechs", - "skillname": "skill-nova-demobot", - "foldername": "skill-nova-demobot", - "name": "skill-nova-demobot", - "url": "https://github.com/KCAstromechs/skill-nova-demobot", - "category": null, - "description": "Mycroft Skill for running the Nova outreach / demo robot", - "short_description": "Mycroft Skill for running the Nova outreach / demo robot", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "RPi.GPIO>=0.6.3" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Nova Demobot Skill", - "android_handler": "skill-nova-demobot.kcastromechs.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-08-16T23:42:13Z", - "archived": false, - "license": "apache-2.0", - "modified": "2018-08-17T00:05:46Z", - "authorname": "tiredoftry", - "skillname": "Spelling", - "foldername": "mycroft-spelling", - "name": "Spelling", - "url": "https://github.com/tiredoftry/mycroft-spelling", - "category": null, - "description": "Mycroft can spell any word which is understood by speech-to-text. The proper spelling is pronounced on all platforms, as well as displayed by devices such as the Mark 1.", - "short_description": "", - "branch": "master", - "examples": [ - "How do you spell aardvark?", - "Spell succotash.", - "Spell succotash" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Mycroft AI" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Spelling Skill", - "android_handler": "mycroft-spelling.tiredoftry.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-03-03T20:32:03Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2018-03-07T12:41:59Z", - "authorname": "Willow-Systems", - "skillname": "mycroft-ACNLCoffeeHelper", - "foldername": "mycroft-ACNLCoffeeHelper", - "name": "mycroft-ACNLCoffeeHelper", - "url": "https://github.com/Willow-Systems/mycroft-ACNLCoffeeHelper", - "category": null, - "description": "A mycroft skill that tells you how a villager in the game [animal crossing: new leaf](https://en.wikipedia.org/wiki/Animal_Crossing:_New_Leaf) likes their coffee for the coffee mini game.<br>", - "short_description": "A mycroft skill that tells you how a villager in the game [animal crossing: new leaf](https://en.wikipedia.org/wiki/Animal_Crossing:_New_Leaf) likes their coffee for the coffee mini game.<br>", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Acnlcoffeehelper Skill", - "android_handler": "mycroft-ACNLCoffeeHelper.willow-systems.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-12-01T05:36:02Z", - "archived": false, - "license": "unknown", - "modified": "2018-12-01T05:36:08Z", - "authorname": "basiliskAI", - "skillname": "Emotion Matrix", - "foldername": "emotion-matrix-skill", - "name": "Emotion Matrix", - "url": "https://github.com/basiliskAI/emotion-matrix-skill", - "category": null, - "description": "Give mycroft emotions! using a simple vad matrix, mycroft can remember what emotion he has and change them at your command.", - "short_description": "", - "branch": "master", - "examples": [ - "Feel happy.", - "Feel angry.", - "How are you feeling.", - "How are you doing.", - "How you feeling.", - "How you doing.", - "Increase arousal.", - "Decrease valence." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "basiliskAI" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Emotion Matrix Skill", - "android_handler": "emotion-matrix-skill.basiliskai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-03-17T16:20:08Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2018-08-09T16:55:23Z", - "authorname": "groupwhere", - "skillname": "skill-tivo", - "foldername": "skill-tivo", - "name": "skill-tivo", - "url": "https://github.com/groupwhere/skill-tivo", - "category": null, - "description": "Based on ideas from the following sites:\n```\nhttps://community.home-assistant.io/t/control-tivo-box-over-telnet/12430/65\nhttps://www.tivocommunity.com/community/index.php?threads/tivo-ui-control-via-telnet-no-hacking-required.392385/\nhttps://community.home-assistant.io/t/tivo-media-player-component/851\nhttps://charliemeyer.net/2012/12/04/remote-control-of-a-tivo-from-the-linux-command-line/\n```\n\nAdd the following to your mycroft.conf and restart mycroft-skills\n```\n\"TivoSkill\": {\n\"name\": \"Bob's Tivo\",\n\"host\": \"192.168.0.84\",\n\"port\": 31339,\n\"zapuser\": \"your@email.addr\",\n\"zappass\": \"YOURZAP2ITPASS\",\n\"debug\": false\n}\n```\n\nPort should always be 31339. Zap2iT is optional but will allow mycroft to tell you what is playing on the current channel. Without it, it will only tell you the channel.\n\nCurrently, the following functions are working:\n* \"Tivo status\"\n* \"Tivo channel up\"\n* \"Tivo channel down\"\n* \"Tivo channel set 2 3 1\"\n* \"Tivo pause\"\n* \"Tivo play\"\n* \"Tivo off\"\n* \"Tivo on\"\n\nThese functions should be working but require some additional testing. These are specifically to initiate and stop a recording in progress:\n* \"Tivo record\"\n* \"Tivo stop\"\n\nMycroft will respond with, e.g.:\n* \"Bob's Tivo is currently watching channel 231\"\n* \"Bob's Tivo is currently watching channel 231 Raiders of the Lost Ark\" (with your zap2it account setup and with the correct lineup selected with their service)\n* \"Bob's Tivo is off\"\n* \"Bob's Tivo is playing\"", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Tivo Skill", - "android_handler": "skill-tivo.groupwhere.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-03-14T18:38:54Z", - "archived": false, - "license": "unknown", - "modified": "2018-03-14T18:47:06Z", - "authorname": "adriansas88", - "skillname": "", - "foldername": "a", - "name": "", - "url": "https://github.com/adriansas88/a", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "translate", - "unidecode" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "A Skill", - "android_handler": "a.adriansas88.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-12-08T20:08:13Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2018-12-29T15:44:37Z", - "authorname": "ErikEkstedt", - "skillname": "Mycroft-Chatbot-Conversation-Research", - "foldername": "mycroft-test-skill", - "name": "Mycroft-Chatbot-Conversation-Research", - "url": "https://github.com/ErikEkstedt/mycroft-test-skill", - "category": null, - "description": "https://mycroft.ai/documentation/skills/introduction-developing-skills/\n\n\n\n\nIdeas to think about\n * search through bookmarked/special pages to find keyword mentioned by user\n - OpenAI\n - SingularityNET\n - deepmind\n - Fair\n - Bair\n\n\nSkills that should already exists\nRead the documentation\n * Find mycroft.conf (using web/home-conf now) and add to .files/mycroft\n * Install the test skill and test it\n * How to continue dialog?\n * Open bookmarks in background (selenium)\n * Vim docs/help\n * man (CLI)\n * Bash script help (I ALWAYS search the most basic stuf over and over)\n * ask if info was valuable and store in json\n * scrape favorite subreddits\n * Github frontpage\n * Remind to look at blogs I wish to stay updated on\n * Open browser\n * Kde settings\n * Crypto prices\n * Spotify", - "short_description": "https://mycroft.ai/documentation/skills/introduction-developing-skills/", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "re" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Test Skill", - "android_handler": "mycroft-test-skill.erikekstedt.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-07-06T20:40:06Z", - "archived": false, - "license": "unknown", - "modified": "2018-12-20T12:52:34Z", - "authorname": "pcwii", - "skillname": "Hyperion-Skill", - "foldername": "hyperion-control-skill", - "name": "Hyperion-Skill", - "url": "https://github.com/pcwii/hyperion-control-skill", - "category": null, - "description": "Utilize the KODI hyperion plugin for controlling the hyperion strip light RGB bulbs with Mycroft.", - "short_description": "", - "branch": "master", - "examples": [ - "Turn lights on.", - "Turn lights off.", - "Dim the lights.", - "Set lights to 50%", - "Set light color to red.", - "turn lights on", - "turn lights off", - "dim the lights", - "set lights to 50%", - "set light color to red" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "PCWii" - ], - "requirements": { - "python": [ - "requests", - "pexpect", - "asyncio", - "colour", - "websockets" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Hyperion Control Skill", - "android_handler": "hyperion-control-skill.pcwii.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-01-10T12:01:14Z", - "archived": false, - "license": "unknown", - "modified": "2018-01-15T14:57:02Z", - "authorname": "smolino", - "skillname": "picroft 8 Switch Relay skill gpio and LCD Readme", - "foldername": "skill-gpio8s-lcd", - "name": "picroft 8 Switch Relay skill gpio and LCD Readme", - "url": "https://github.com/smolino/skill-gpio8s-lcd", - "category": null, - "description": "This is a skill for picroft that will interact with the GPIO and 8 Swich Relay + LCD", - "short_description": "This is a skill for picroft that will interact with the GPIO and 8 Swich Relay + LCD", - "branch": "master", - "examples": [ - "G gpio mycroft.", - "1.", - "Get install rpi.gpio." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "smbus2", - "GPIO" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Gpio8S Lcd Skill", - "android_handler": "skill-gpio8s-lcd.smolino.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-04-21T18:26:11Z", - "archived": false, - "license": "unknown", - "modified": "2018-04-21T18:28:47Z", - "authorname": "Quinn2017", - "skillname": "Skill-Contexts-Two", - "foldername": "skill-contexts-two", - "name": "Skill-Contexts-Two", - "url": "https://github.com/Quinn2017/skill-contexts-two", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Contexts Two Skill", - "android_handler": "skill-contexts-two.quinn2017.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-09-08T08:01:51Z", - "archived": false, - "license": "mit", - "modified": "2018-09-29T15:23:29Z", - "authorname": "Tyler-The-App-Creator", - "skillname": "Want To Play", - "foldername": "want-to-play", - "name": "Want To Play", - "url": "https://github.com/Tyler-The-App-Creator/want-to-play", - "category": null, - "description": "Ask mycroft if it would like to play something and it will start any of the game skills.", - "short_description": "", - "branch": "master", - "examples": [ - "Want to play?", - "Let's play something.", - "Let's game.", - "Let's play something", - "Let's game" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Tyler The App Creator" - ], - "requirements": { - "python": [ - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Want To Play Skill", - "android_handler": "want-to-play.tyler-the-app-creator.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-12-21T17:11:38Z", - "archived": false, - "license": "gpl-2.0", - "modified": "2018-12-22T00:11:36Z", - "authorname": "techstoa", - "skillname": "mycroft-sonos", - "foldername": "mycroft-sonos", - "name": "mycroft-sonos", - "url": "https://github.com/techstoa/mycroft-sonos", - "category": null, - "description": "Mycroft skill for sonos speakers", - "short_description": "Mycroft skill for sonos speakers", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "soco==0.16" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Sonos Skill", - "android_handler": "mycroft-sonos.techstoa.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-01-22T20:24:35Z", - "archived": false, - "license": "apache-2.0", - "modified": "2018-02-01T21:07:13Z", - "authorname": "PFE1718", - "skillname": "Habit-miner skill", - "foldername": "PFE1718-habit-miner", - "name": "Habit-miner skill", - "url": "https://github.com/PFE1718/PFE1718-habit-miner", - "category": null, - "description": "This skill is made to work with the full Habits Automation project https://github.com/PFE1718/mycroft-skills-automation.\n\nIts role is to go through user logs and analyse them. By implementing machine learning algorithms, it can then detect most frequent user habits. They are then passed to the habits-automation skill.\n\nIt can detect two types of habits :\n\n* Time based habits (i.e launching the same skill regularly at the same time of the day)\n* Group based habits (i.e launching a group of skills very frequently)", - "short_description": "", - "branch": "master", - "examples": [ - "Start habit mining.", - "start habit mining" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "credits": [ - "Adrien Chevrier\nFlorian Hepp" - ], - "requirements": { - "python": [ - "statistics", - "scipy>=0.13.3", - "sklearn", - "numpy" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Pfe1718 Habit Miner Skill", - "android_handler": "PFE1718-habit-miner.pfe1718.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-02-05T14:27:43Z", - "archived": false, - "license": "unknown", - "modified": "2018-12-10T19:36:05Z", - "authorname": "pcwii", - "skillname": "yeelight-skill", - "foldername": "yeelight-skill", - "name": "yeelight-skill", - "url": "https://github.com/pcwii/yeelight-skill", - "category": null, - "description": "Utilize the Yeelight API and Python library for controlling YeeLight WiFi RGB bulbs with Mycroft.", - "short_description": "", - "branch": "master", - "examples": [ - "Turn lights on.", - "Turn lights off.", - "Dim the lights.", - "Set lights to 50%", - "Set light color to red.", - "turn lights on", - "turn lights off", - "dim the lights", - "set lights to 50%", - "set light color to red" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "PCWii" - ], - "requirements": { - "python": [ - "colour", - "yeelight" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Yeelight Skill", - "android_handler": "yeelight-skill.pcwii.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-11-28T22:11:03Z", - "archived": false, - "license": "unknown", - "modified": "2020-09-09T04:20:53Z", - "authorname": "RobBrenn", - "skillname": "Description", - "foldername": "wake-on-lan", - "name": "Description", - "url": "https://github.com/RobBrenn/wake-on-lan", - "category": "IoT", - "description": "A skill that uses the Wake On Lan protocol to wake up a device.", - "short_description": "", - "branch": "master", - "examples": [ - "Wake up Desktop.", - "Turn On Computer.", - "Wake up Desktop", - "Turn On Computer" - ], - "tags": [ - "wake", - "wake-on-lan", - "IoT", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "RobBren\nremcohaszing https://github.com/remcohaszing/pywakeonlan" - ], - "categories": [ - "IoT" - ], - "requirements": { - "python": [ - "wakeonlan==1.1.6" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Wake On Lan Skill", - "android_handler": "wake-on-lan.robbrenn.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-10-30T06:05:59Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2018-10-30T06:22:40Z", - "authorname": "kadams1463", - "skillname": "mycroft-flipcoinskill", - "foldername": "mycroft-flipcoinskill", - "name": "mycroft-flipcoinskill", - "url": "https://github.com/kadams1463/mycroft-flipcoinskill", - "category": null, - "description": "Skill that flips a coin for Mycroft AI.", - "short_description": "Skill that flips a coin for Mycroft AI.", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Flipcoinskill Skill", - "android_handler": "mycroft-flipcoinskill.kadams1463.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-06-28T02:02:49Z", - "archived": false, - "license": "unknown", - "modified": "2018-12-08T23:52:57Z", - "authorname": "pcwii", - "skillname": "decora-smart-wifi-skill", - "foldername": "decora-smart-wifi-skill", - "name": "decora-smart-wifi-skill", - "url": "https://github.com/pcwii/decora-smart-wifi-skill", - "category": null, - "description": "Mycroft.AI will have control over the smart wifi dimmer switch.", - "short_description": "", - "branch": "master", - "examples": [ - "Turn the lights on.", - "Turn the lights off.", - "Dim the lights.", - "Set the lights to 25%", - "turn the lights on", - "turn the lights off", - "dim the lights", - "set the lights to 25%" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "PCWii" - ], - "requirements": { - "python": [ - "decora_wifi" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Decora Smart Wifi Skill", - "android_handler": "decora-smart-wifi-skill.pcwii.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-12-27T10:26:49Z", - "archived": false, - "license": "unknown", - "modified": "2018-12-27T10:26:56Z", - "authorname": "loicloic", - "skillname": "Mycroft Test", - "foldername": "mycroft-test-skill", - "name": "Mycroft Test", - "url": "https://github.com/loicloic/mycroft-test-skill", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [ - "Test.", - "Testing.", - "Run test." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "loicloic" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Test Skill", - "android_handler": "mycroft-test-skill.loicloic.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-04-21T03:25:00Z", - "archived": false, - "license": "unknown", - "modified": "2018-04-21T03:26:00Z", - "authorname": "Quinn2017", - "skillname": "Skill-Contexts", - "foldername": "skill-contexts", - "name": "Skill-Contexts", - "url": "https://github.com/Quinn2017/skill-contexts", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Contexts Skill", - "android_handler": "skill-contexts.quinn2017.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-03-09T00:28:50Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2018-03-09T01:36:10Z", - "authorname": "Nerdenator", - "skillname": "mycroft_demo_skill", - "foldername": "mycroft_demo_skill", - "name": "mycroft_demo_skill", - "url": "https://github.com/Nerdenator/mycroft_demo_skill", - "category": null, - "description": "A demonstration skill for Mycroft", - "short_description": "A demonstration skill for Mycroft", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft_Demo_Skill Skill", - "android_handler": "mycroft_demo_skill.nerdenator.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-05-05T18:09:59Z", - "archived": false, - "license": "unknown", - "modified": "2020-04-09T21:36:24Z", - "authorname": "pcwii", - "skillname": "nanoleaf-skill", - "foldername": "nanoleaf-skill", - "name": "nanoleaf-skill", - "url": "https://github.com/pcwii/nanoleaf-skill", - "category": null, - "description": "Mycroft.AI will have control over the smart wifi dimmer switch.", - "short_description": "", - "branch": "master", - "examples": [ - "Turn the aurora on.", - "Turn the aurora off.", - "Dim the aurora.", - "Set the aurora to 25%", - "Set the aurora to red.", - "turn the aurora on", - "turn the aurora off", - "dim the aurora", - "set the aurora to 25%", - "set the aurora to red" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "PCWii" - ], - "requirements": { - "python": [ - "git+https://github.com/pcwii/nanoleaf.git", - "ifaddr", - "colour" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Nanoleaf Skill", - "android_handler": "nanoleaf-skill.pcwii.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-10-30T16:16:59Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-12-18T05:35:21Z", - "authorname": "kadams1463", - "skillname": "Play Relaxing Sounds", - "foldername": "mycroft-relaxingsounds", - "name": "Play Relaxing Sounds", - "url": "https://github.com/kadams1463/mycroft-relaxingsounds", - "category": null, - "description": "Play various sounds on a loop through Mycroft. The sounds help with sleep, relaxing, or meditating.\n\nHere is a list of sounds:\n\n * White Noise\n * Waves\n * Rain", - "short_description": "Skill for Mycroft AI that plays relaxing sounds and acts as a noise machine.", - "branch": "master", - "examples": [ - "Play white noise.", - "Play waves.", - "Stop." - ], - "tags": [ - "please", - "feel", - "make", - "If", - "to", - "sleep", - "find", - "health,", - "Contributing", - "something", - "edits", - "skill", - "this", - "Development", - "you", - "and", - "improve,", - "contributions.", - "that", - "can", - "free", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Relaxingsounds Skill", - "android_handler": "mycroft-relaxingsounds.kadams1463.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-03-07T19:17:36Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2018-03-07T19:19:19Z", - "authorname": "GotTheNumbers", - "skillname": "lifx-skill", - "foldername": "skill-lifx", - "name": "lifx-skill", - "url": "https://github.com/GotTheNumbers/skill-lifx", - "category": null, - "description": "A Mycroft skill for controlling Lifx lights.", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Anthony DiGiovanni" - ], - "requirements": { - "python": [ - "gensim", - "pifx" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Lifx Skill", - "android_handler": "skill-lifx.gotthenumbers.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-07-31T15:52:14Z", - "archived": false, - "license": "mit", - "modified": "2018-07-31T20:53:11Z", - "authorname": "jrwarwick", - "skillname": "Mycroft AI Integration with MS Flow test", - "foldername": "skill-msflow", - "name": "Mycroft AI Integration with MS Flow test", - "url": "https://github.com/jrwarwick/skill-msflow", - "category": null, - "description": "Simple trigger via Mycroft to send a RESTFul call to special \"HTTP Request\" trigger predefined in MS FLows.", - "short_description": "Simple trigger via Mycroft to send a RESTFul call to special \"HTTP Request\" trigger predefined in MS FLows.", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "requests>=2.13.0", - "json" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Msflow Skill", - "android_handler": "skill-msflow.jrwarwick.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-06-26T16:30:58Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2018-06-26T19:01:33Z", - "authorname": "BugHunterPhilosopher", - "skillname": "clementine-player", - "foldername": "clementine-player", - "name": "clementine-player", - "url": "https://github.com/BugHunterPhilosopher/clementine-player", - "category": null, - "description": "Control Clementine audio player using plain old English. For Linux.", - "short_description": "", - "branch": "master", - "examples": [ - "Pause.", - "Hey Mycroft, pause" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "BugHunterPhilosopher" - ], - "requirements": { - "python": [ - "dbus-python" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Clementine Player Skill", - "android_handler": "clementine-player.bughunterphilosopher.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-07-31T11:51:10Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2018-07-31T11:54:15Z", - "authorname": "AIIX", - "skillname": "mastadon-social-skill", - "foldername": "mastadon-social-skill", - "name": "mastadon-social-skill", - "url": "https://github.com/AIIX/mastadon-social-skill", - "category": null, - "description": "Interact with mastadon, toot and get latest toots.", - "short_description": "", - "branch": "master", - "examples": [ - "Toot hey!", - "Get latest toot.", - "Hey Mycroft, toot hey! ", - "Hey Mycroft, get latest toot" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Aix (Aix@outlook.com)" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mastadon Social Skill", - "android_handler": "mastadon-social-skill.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-01-21T10:30:24Z", - "archived": false, - "license": "unknown", - "modified": "2018-01-31T03:24:04Z", - "authorname": "smolino", - "skillname": "picroft 8 Switch Relay skill gpio Readme", - "foldername": "picroft_skill_gpio8s", - "name": "picroft 8 Switch Relay skill gpio Readme", - "url": "https://github.com/smolino/picroft_skill_gpio8s", - "category": null, - "description": "This is a skill for picroft that will interact with the GPIO and 8 Swich Relay", - "short_description": "This is a skill for picroft that will interact with the GPIO and 8 Swich Relay", - "branch": "master", - "examples": [ - "G gpio mycroft.", - "Get install rpi.gpio." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [ - "GPIO" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Picroft_Skill_Gpio8S Skill", - "android_handler": "picroft_skill_gpio8s.smolino.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-02-17T13:59:42Z", - "archived": false, - "license": "unknown", - "modified": "2018-03-23T16:18:55Z", - "authorname": "tjoen", - "skillname": "Trivia skill with local stt", - "foldername": "lstt-skill", - "name": "Trivia skill with local stt", - "url": "https://github.com/tjoen/lstt-skill", - "category": null, - "description": "This skill uses mycrofts pocketsphinx STT with a small dict.\n\nIt uses a localstt.dic (dictionary) and localstt.lm (language model) in the res folder.\nIt shuts now down the speech recognition with naptime when the skill starts, and wakes it up when ending it.\n\nAt the moment, the skill will ask you 3 questions.\nYou can answer by choosing 1,2,3 or 4.\n\nYes, no, stop/quit/end, repeat and start/play should also work.\n\nThis started out as an experiment, checking if a faster method could make the game more playable.\nAnd it actually does seem to work pretty good.\n\nTranslations might be a problem with this method, but this skill uses questions in english.\n[JarbasAI](https://github.com/JarbasAl) just made a very nice local listener that will be implemented in the near future.\n[More info on that here](https://github.com/JarbasAl/local_listener)", - "short_description": "", - "branch": "master", - "examples": [ - "Start local speech.", - "Play trivia.", - "Game of trivia.", - "Hey Mycroft, start local speech", - "Hey Mycroft, play trivia", - "Hey Mycroft, game of trivia" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "Theun Kohlbeck, https://github.com/tjoen\nSteen Bentall, https://github.com/barricados" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Lstt Skill", - "android_handler": "lstt-skill.tjoen.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-02-21T13:52:32Z", - "archived": false, - "license": "unknown", - "modified": "2018-02-21T13:53:01Z", - "authorname": "tjoen", - "skillname": "Trivia skill with local stt", - "foldername": "trivia-game-skill", - "name": "Trivia skill with local stt", - "url": "https://github.com/tjoen/trivia-game-skill", - "category": null, - "description": "This skill uses mycrofts pocketsphinx STT with a small dict.\n\nIt uses a localstt.dic (dictionary) and localstt.lm (language model) in the res folder.\n\nAt the moment, the skill will ask you 3 \"general knowledge\" questions.\nYou can answer by choosing 1,2,3 or 4.\n\nYes, No, Stop, Repeat and Start should also work.\n\nThis started out as an experiment, checking if a faster method could make the game more playable.\nAnd it actually does seem to work pretty good.\n\nTranslations might be a problem with this method, but this skill uses questions in english.", - "short_description": "", - "branch": "master", - "examples": [ - "Start local speech.", - "Play trivia.", - "Game of trivia.", - "Hey Mycroft, start local speech", - "Hey Mycroft, play trivia", - "Hey Mycroft, game of trivia" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Theun Kohlbeck, https://github.com/tjoen\nSteen Bentall, https://github.com/barricados\nJarbasAI, https://github.com/JarbasAI" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Trivia Game Skill", - "android_handler": "trivia-game-skill.tjoen.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-01-04T21:21:58Z", - "archived": false, - "license": "mit", - "modified": "2018-02-12T14:57:52Z", - "authorname": "mikonse", - "skillname": "mycroft smart home skill", - "foldername": "mycroft-smart-home", - "name": "mycroft smart home skill", - "url": "https://github.com/mikonse/mycroft-smart-home", - "category": null, - "description": "This skill is designed to communicate with generic IoT devices via different protocols.\n\nA very basic use case would be turning on a led strip by using an ESP8266.", - "short_description": "This skill is designed to communicate with generic IoT devices via different protocols.", - "branch": "master", - "examples": [ - "*Turn on the light in the kitchen**.", - "*/light/kitchen** with the data **{" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "paho-mqtt", - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Smart Home Skill", - "android_handler": "mycroft-smart-home.mikonse.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-09-26T19:56:19Z", - "archived": false, - "license": "unknown", - "modified": "2018-10-31T08:33:41Z", - "authorname": "henridbr", - "skillname": "Rolling_Shutters", - "foldername": "Rolling_Shutters", - "name": "Rolling_Shutters", - "url": "https://github.com/henridbr/Rolling_Shutters", - "category": null, - "description": "**a SKILL for Mycroft**\n\nMy home rolling shutters are radio controlled by remotes. \nI use a Wemos D1 mini (ESP8266) in order to simulate one pushing the switches on a remote. \nThe Wemos D1 mini is listening for a GET on its port 80. A command is transmitted through text in the URI.\nThis works fine from desktop using browser or from Android devices (smartphone or tablet) using an API I wrote thanks to Thunkable.\nIt was too difficult to resist doing the same with Mycroft !", - "short_description": "**a SKILL for Mycroft**", - "branch": "master", - "examples": [ - "To shut the rolling shutters : close shutters or close window or shutters down.", - "To open the rolling shutters : open shutters or open windows or lift shutters.", - "To shut the southern rolling shutters half way on sunny days : shadow shutters or sunny windows shut or southern windows shut.", - "to shut the rolling shutters : close shutters or close window or shutters down", - "to open the rolling shutters : open shutters or open windows or lift shutters", - "to shut the southern rolling shutters half way on sunny days : shadow shutters or sunny windows shut or southern windows shut" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Rolling_Shutters Skill", - "android_handler": "Rolling_Shutters.henridbr.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-06-12T12:38:53Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-03-17T16:58:32Z", - "authorname": "AIIX", - "skillname": "KDE News Skill", - "foldername": "kde-news-skill", - "name": "KDE News Skill", - "url": "https://github.com/AIIX/kde-news-skill", - "category": null, - "description": "Get the latest KDE News and DOT stories read to you by mycroft.", - "short_description": "", - "branch": "master", - "examples": [ - "Whats New At KDE?", - "Hey Mycroft Whats New At KDE" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Aix (aix.m@outlook.com)" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Kde News Skill", - "android_handler": "kde-news-skill.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-01-31T12:48:30Z", - "archived": false, - "license": "unknown", - "modified": "2018-01-31T12:48:46Z", - "authorname": "smolino", - "skillname": "picroft 4 Switch Relay skill gpio Readme", - "foldername": "picroft_skill_gpio4s", - "name": "picroft 4 Switch Relay skill gpio Readme", - "url": "https://github.com/smolino/picroft_skill_gpio4s", - "category": null, - "description": "This is a skill for picroft that will interact with the GPIO and 4 Swich Relay", - "short_description": "This is a skill for picroft that will interact with the GPIO and 4 Swich Relay", - "branch": "master", - "examples": [ - "G gpio mycroft.", - "Get install rpi.gpio." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "GPIO" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Picroft_Skill_Gpio4S Skill", - "android_handler": "picroft_skill_gpio4s.smolino.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-04-11T22:32:21Z", - "archived": false, - "license": "unknown", - "modified": "2018-04-11T22:35:59Z", - "authorname": "marcfunston", - "skillname": "Algorithm", - "foldername": "skill-algorithm", - "name": "Algorithm", - "url": "https://github.com/marcfunston/skill-algorithm", - "category": null, - "description": "Tells you the running time of merge sort and other algorithms.", - "short_description": "", - "branch": "master", - "examples": [ - "Merge Sort running time.", - "Tell me merge sort running time.", - "Merge Sort running time", - "Tell me merge sort running time" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Mycroft AI" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Algorithm Skill", - "android_handler": "skill-algorithm.marcfunston.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-07-28T14:05:46Z", - "archived": false, - "license": "unknown", - "modified": "2019-10-27T16:41:55Z", - "authorname": "pcwii", - "skillname": "Help Skill for Mycroft AI", - "foldername": "help-skill", - "name": "Help Skill for Mycroft AI", - "url": "https://github.com/pcwii/help-skill", - "category": null, - "description": "This skill will provide conversational help for the installed skills by scraping the Readme files for any examples.", - "short_description": "", - "branch": "master", - "examples": [ - "Help.", - "What can you do?", - "How do I use kodi skill.", - "help", - "what can you do?", - "how do I use kodi skill" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "PCWii" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Help Skill", - "android_handler": "help-skill.pcwii.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-05-22T12:28:42Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-12-18T05:36:07Z", - "authorname": "AIIX", - "skillname": "Track-Parcel-Skill", - "foldername": "track-parcel-skill", - "name": "Track-Parcel-Skill", - "url": "https://github.com/AIIX/track-parcel-skill", - "category": null, - "description": "#### Installation of skill:\n* Download or Clone Git (git clone https://github.com/AIIX/track-parcel-skill)\n* Create /opt/mycroft/skills folder if it does not exist\n* Extract Downloaded Skill into a folder. \"track-parcel-skill\". (Clone does not require this step)\n* Copy the track-parcel-skill folder to /opt/mycroft/skills/ folder\n\n#### Dependency requirements:\n* This skill requires the installation of aftership.", - "short_description": "", - "branch": "master", - "examples": [ - "Track a package.", - "Enter Your Courier Service Name.", - "Enter Your Tracking Number.", - "Hey Mycroft, Track a package", - "Enter Your Courier Service Name", - "Enter Your Tracking Number" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "Aix [Github: https://github.com/AIIX]\nAftership Python Library [Github: https://github.com/AfterShip/aftership-sdk-python]" - ], - "requirements": { - "python": [ - "aftership " - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Track Parcel Skill", - "android_handler": "track-parcel-skill.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-05-10T15:28:41Z", - "archived": false, - "license": "mit", - "modified": "2018-05-14T23:56:06Z", - "authorname": "JamesPoole", - "skillname": "Tuner", - "foldername": "skill-tuner", - "name": "Tuner", - "url": "https://github.com/JamesPoole/skill-tuner", - "category": null, - "description": "Ask Mycroft to play a tuning or to play an individual note.", - "short_description": "", - "branch": "master", - "examples": [ - "Tune to standard.", - "Tune to drop d." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "JamesPoole" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Tuner Skill", - "android_handler": "skill-tuner.jamespoole.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-06-20T13:27:26Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2018-06-22T14:27:41Z", - "authorname": "joshuacox", - "skillname": "[GNU World Order](http://gnuworldorder.info/)", - "foldername": "skill-GNUworldOrder", - "name": "[GNU World Order](http://gnuworldorder.info/)", - "url": "https://github.com/joshuacox/skill-GNUworldOrder", - "category": null, - "description": "Teaches Mycroft AI about the the GNU World Order [\"GNU World Order\".](http://gnuworldorder.info/)\n\n* \"Hey Mycroft, Who is the GNU World Order?\"", - "short_description": "", - "branch": "master", - "examples": [ - "Play the GNU World Order!", - "Random GNU World Order!", - "Initiate a random GNU World Order!", - "What's the latest GNU World Order?", - "Fire up the penultimate GNU World Order!", - "Load the third GNU World Order!", - "Play the fourth GNU World Order!", - "Load the fifth GNU World Order!", - "Initiate the sixth GNU World Order!", - "Start the seventh GNU World Order!", - "Start up the eighth GNU World Order!", - "Fire up the ninth GNU World Order!", - "Startup the tenth GNU World Order!", - "Spam the eleventh GNU World Order!", - "Initiate the twelfth GNU World Order!", - "Load the thirteenth GNU World Order!", - "Fire up the fourteenth GNU World Order!", - "Load the fifteenth GNU World Order!", - "random GNU World Order!" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "based on the official news module from Mycroft AI\n\nadapted by:\n@joshuacox" - ], - "requirements": { - "python": [ - "feedparser==5.2.1" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Gnuworldorder Skill", - "android_handler": "skill-GNUworldOrder.joshuacox.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-10-02T22:52:28Z", - "archived": false, - "license": "unknown", - "modified": "2018-10-02T22:52:34Z", - "authorname": "adocampo", - "skillname": "Introduce Yourself", - "foldername": "introduce-yourself-skill", - "name": "Introduce Yourself", - "url": "https://github.com/adocampo/introduce-yourself-skill", - "category": null, - "description": "With this skill, you can let mycroft to introduce itself, super cool to let your friends astonished.", - "short_description": "", - "branch": "master", - "examples": [ - "What's your name?", - "Introduce yourself.", - "What is your name?", - "Who are you?" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Angel Docampo" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Introduce Yourself Skill", - "android_handler": "introduce-yourself-skill.adocampo.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-10-15T17:52:50Z", - "archived": false, - "license": "apache-2.0", - "modified": "2018-10-15T18:07:32Z", - "authorname": "syner1", - "skillname": "Volume Control", - "foldername": "mycroft-volume", - "name": "Volume Control", - "url": "https://github.com/syner1/mycroft-volume", - "category": "Music", - "description": "Control the volume of Mycroft with verbal commands or by spinning the physical\nbutton on a Mark 1.", - "short_description": "Control the volume of your system", - "branch": "18.08", - "examples": [ - "Turn up the volume.", - "Decrease the audio.", - "Mute audio.", - "Set volume to 5.", - "Set volume to 75 percent.", - "Turn up the volume", - "Decrease the audio", - "Mute audio", - "Set volume to 5", - "Set volume to 75 percent" - ], - "tags": [ - "Music", - "sound", - "volume", - "volume-control", - "no-license" - ], - "platforms": [ - "platform_mark1" - ], - "stars": 0, - "icon": "https://rawgithub.com/FortAwesome/Font-Awesome/master/advanced-options/raw-svg/solid/volume-down.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Music" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Volume Skill", - "android_handler": "mycroft-volume.syner1.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-09-25T11:12:13Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-03-12T13:14:52Z", - "authorname": "AIIX", - "skillname": "tictactoe", - "foldername": "tictactoe", - "name": "tictactoe", - "url": "https://github.com/AIIX/tictactoe", - "category": null, - "description": "tic tac toe mycroft skill", - "short_description": "tic tac toe mycroft skill", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Tictactoe Skill", - "android_handler": "tictactoe.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-04-18T21:49:58Z", - "archived": false, - "license": "mit", - "modified": "2018-04-26T19:31:22Z", - "authorname": "adropofilm", - "skillname": "Word Of The Day Skill", - "foldername": "word-of-the-day-skill", - "name": "Word Of The Day Skill", - "url": "https://github.com/adropofilm/word-of-the-day-skill", - "category": null, - "description": "This skill dynamically provides Mycroft users with the \"word of the day\" and definition. Current words and definitions come from\n[Dictionary.com.](Dictionary.com)", - "short_description": "", - "branch": "master", - "examples": [ - "Tell me the word of the day.", - "Word of the day.", - "Word of day.", - "tell me the word of the day", - "word of the day", - "word of day" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Fatima Mohamed", - "Dictionary.com ", - "Mycroft AI" - ], - "requirements": { - "python": [ - "urllib", - "bs4" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Word Of The Day Skill", - "android_handler": "word-of-the-day-skill.adropofilm.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-04-09T21:21:08Z", - "archived": false, - "license": "unknown", - "modified": "2018-04-12T15:09:53Z", - "authorname": "akuataya", - "skillname": "Good Night Skill", - "foldername": "good-night-skill", - "name": "Good Night Skill", - "url": "https://github.com/akuataya/good-night-skill", - "category": null, - "description": "Mycroft replies when user says `good night`.", - "short_description": "Mycroft replies when user says `good night`.", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Good Night Skill", - "android_handler": "good-night-skill.akuataya.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-04-04T02:10:11Z", - "archived": false, - "license": "unknown", - "modified": "2018-07-06T09:09:59Z", - "authorname": "oliveralonzo", - "skillname": "Inspirational Quotes", - "foldername": "skill-inspirational-quotes", - "name": "Inspirational Quotes", - "url": "https://github.com/oliveralonzo/skill-inspirational-quotes", - "category": null, - "description": "Inspirational quotes for when you need a lift-up or just want to hear some wisdom. Quotes from Forismatic.", - "short_description": "", - "branch": "skill", - "examples": [ - "Inspire me.", - "Read me a quote.", - "Hey Mycroft, inspire me", - "Hey Mycroft, read me a quote" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "Oliver Alonzo - https://github.com/oliveralonzo\nSource for the quotes: https://forismatic.com/en/" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Inspirational Quotes Skill", - "android_handler": "skill-inspirational-quotes.oliveralonzo.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-10-30T03:08:14Z", - "archived": false, - "license": "mit", - "modified": "2019-12-18T05:37:14Z", - "authorname": "ankitjena008", - "skillname": "LOCATION-ASSISTED VOICE AUTHENTICATION", - "foldername": "jarvis_auth", - "name": "LOCATION-ASSISTED VOICE AUTHENTICATION", - "url": "https://github.com/ankitjena008/jarvis_auth", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [ - "Identify me.", - "Authenticate me.", - "Identify me", - "Authenticate me" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "Team NBA" - ], - "requirements": { - "python": [ - "pyaudio", - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Jarvis_Auth Skill", - "android_handler": "jarvis_auth.ankitjena008.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-03-10T05:26:55Z", - "archived": false, - "license": "unknown", - "modified": "2018-03-25T20:23:36Z", - "authorname": "lachendeKatze", - "skillname": "skill-fed-the-fish", - "foldername": "skill-fed-the-fish", - "name": "skill-fed-the-fish", - "url": "https://github.com/lachendeKatze/skill-fed-the-fish", - "category": null, - "description": "https://www.hackster.io/gov/hey-mycroft-i-fed-the-fish-a2141c\n\n\"Hey Mycroft, has the fed been fed today?\"\n\nThe morning hustle features everyone in the house going every which way. It must be quite entertaining for our pets watching us! In our particular swirl of AM chaos, there is one persistent question for the last person to leave the house, \"Has the fish been fed?\"", - "short_description": "https://www.hackster.io/gov/hey-mycroft-i-fed-the-fish-a2141c", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Fed The Fish Skill", - "android_handler": "skill-fed-the-fish.lachendekatze.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-10-05T20:41:02Z", - "archived": false, - "license": "apache-2.0", - "modified": "2018-10-05T21:33:20Z", - "authorname": "nagamanikandank", - "skillname": "About", - "foldername": "naga-mycroft-test", - "name": "About", - "url": "https://github.com/nagamanikandank/naga-mycroft-test", - "category": "Configuration", - "description": "Retrieve the [IP address](https://en.wikipedia.org/wiki/IP_address), also known as the \"network address\" of the Device and respond verbally to the user, and if the Device supports it, display the IP address.", - "short_description": "", - "branch": "master", - "examples": [ - "What Naga Address?", - "What Naga Address" - ], - "tags": [ - "network", - "network-address", - "system", - "Configuration", - "IPaddress", - "IP-address", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Mycroft AI (@MycroftAI) \nhttps://github.com/MycroftAI/skill-ip" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [ - "netifaces==0.10.7" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Naga Mycroft Test Skill", - "android_handler": "naga-mycroft-test.nagamanikandank.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-09-29T18:47:14Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2018-09-30T08:26:34Z", - "authorname": "jubbathejack", - "skillname": "BBC Radio Skill", - "foldername": "skill-bbc-radio", - "name": "BBC Radio Skill", - "url": "https://github.com/jubbathejack/skill-bbc-radio", - "category": null, - "description": "A Mycroft skill to play BBC radio stations. I intend to implement a feature to allow for dynamic\nselection of any of the radio stations that the BBC operates. It currently is only configured\nto play BBC radio 1 just to get the skill up and running. I then intend to implement the\nfeature for multiple stations.", - "short_description": "", - "branch": "master", - "examples": [ - "BBC Radio 1.", - "Radio 1.", - "BBC Radio 1", - "Radio 1" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Jack Parker" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Bbc Radio Skill", - "android_handler": "skill-bbc-radio.jubbathejack.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-04-25T11:27:54Z", - "archived": false, - "license": "unknown", - "modified": "2018-04-25T11:29:03Z", - "authorname": "Capt-ley", - "skillname": "picroft example skill gpio Readme", - "foldername": "voice", - "name": "picroft example skill gpio Readme", - "url": "https://github.com/Capt-ley/voice", - "category": null, - "description": "This is a skill for picroft that will interact with the GPIO", - "short_description": "This is a skill for picroft that will interact with the GPIO", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Voice Skill", - "android_handler": "voice.capt-ley.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-01-13T22:18:57Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-01-02T17:40:08Z", - "authorname": "camuthig", - "skillname": "mycroft-lifx", - "foldername": "mycroft-lifx", - "name": "mycroft-lifx", - "url": "https://github.com/camuthig/mycroft-lifx", - "category": null, - "description": "A Mycroft skill for controlling Lifx bulbs.", - "short_description": "A Mycroft skill for controlling Lifx bulbs.", - "branch": "master", - "examples": [ - "*(in progress)**", - "", - "*(in progress)**", - "" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [ - "fuzzywuzzy", - "pifx" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Lifx Skill", - "android_handler": "mycroft-lifx.camuthig.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-05-03T00:14:09Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2018-05-10T12:05:49Z", - "authorname": "ErdMutter92", - "skillname": "BWN Wemo Skill", - "foldername": "bwn-wemo-skill", - "name": "BWN Wemo Skill", - "url": "https://github.com/ErdMutter92/bwn-wemo-skill", - "category": null, - "description": "A Mycroft skill for finding, listing, and controlling wemo devices.", - "short_description": "", - "branch": "master", - "examples": [ - "Turn on the kitchen light switch.", - "Turn off the christmas tree switch.", - "Toggle the bedroom light switch.", - "Search for wemo devices.", - "Discover wemo devices.", - "List my wemo devices.", - "turn on the kitchen light switch", - "turn off the christmas tree switch", - "toggle the bedroom light switch", - "search for wemo devices", - "discover wemo devices", - "list my wemo devices" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Idea based off of [martymulligan's work](https://github.com/martymulligan/skill-wemo)\n\nerdmutter92" - ], - "requirements": { - "python": [ - "gevent==1.1b4", - "ouimeaux[server]" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Bwn Wemo Skill", - "android_handler": "bwn-wemo-skill.erdmutter92.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-02-26T06:48:24Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2018-02-26T13:27:30Z", - "authorname": "mandolincreek", - "skillname": "Mycroft Introspection Skill", - "foldername": "mycroft-skill-introspect", - "name": "Mycroft Introspection Skill", - "url": "https://github.com/mandolincreek/mycroft-skill-introspect", - "category": null, - "description": "This skill will allow interactive discovery of Mycroft's capabilities:\n\n- skills\n- intents\n- vocabulary.", - "short_description": "", - "branch": "master", - "examples": [ - "What can you do?", - "What are your skills?", - "How can I use <skill>?", - "What can I say to <intent>?" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "Zachary T Welch <zach@mandolincreek.net> https://github.com/mandolincreek" - ], - "requirements": { - "python": [ - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Introspect Skill", - "android_handler": "mycroft-skill-introspect.mandolincreek.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-01-19T01:23:13Z", - "archived": false, - "license": "unknown", - "modified": "2018-07-02T20:15:19Z", - "authorname": "aussieW", - "skillname": "internet radio", - "foldername": "skill-streaming-radio", - "name": "internet radio", - "url": "https://github.com/aussieW/skill-streaming-radio", - "category": null, - "description": "Play internet radio stations using Mycroft.\nManage your station URLs at home.mycroft.ai -> Skills.", - "short_description": "", - "branch": "master", - "examples": [ - "Internet radio.", - "Web radio.", - "Play some music.", - "Rock radio.", - "Play rock radio.", - "Listen to rock radio.", - "Country radio.", - "Play country radio.", - "Listen to country radio.", - "Classical radio.", - "Play classical radio.", - "Listen to classical radio.", - "Jazz radio.", - "Play jazz radio.", - "Listen to jazz radio.", - "Top 40 radio.", - "Play top 40 radio.", - "Listen to top 40 radio.", - "Christmas radio.", - "Play christmas radio.", - "Listen to christmas radio.", - "internet radio", - "web radio", - "play some music", - "rock radio", - "play rock radio", - "listen to rock radio", - "country radio", - "play country radio", - "listen to country radio", - "classical radio", - "play classical radio", - "listen to classical radio", - "jazz radio", - "play jazz radio", - "listen to jazz radio", - "top 40 radio", - "play top 40 radio", - "listen to top 40 radio", - "christmas radio", - "play christmas radio", - "listen to christmas radio" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Norman Moore" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Streaming Radio Skill", - "android_handler": "skill-streaming-radio.aussiew.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-06-18T14:39:57Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2018-06-28T14:05:20Z", - "authorname": "joshuacox", - "skillname": "[No Agenda Show](http://www.noagendashow.com/)", - "foldername": "skill-na-show", - "name": "[No Agenda Show](http://www.noagendashow.com/)", - "url": "https://github.com/joshuacox/skill-na-show", - "category": null, - "description": "Teaches Mycroft AI about the the best podcast in the universe [\"No Agenda Show\".](http://www.noagendashow.com/)\n\n* \"Hey Mycroft, Who is the best podcast in the Universe?\"", - "short_description": "", - "branch": "master", - "examples": [ - "Jack into the live No Agenda stream.", - "What is the best podcast in the Universe?", - "Play the No Agenda show!", - "Initiate a random No Agenda show!", - "Fire up the penultimate No Agenda show!", - "Start up the best podcast in the universe!", - "What is the No Agenda show?", - "Load the third No Agenda show!", - "In the morning!", - "What is Gitmo Nation?", - "What's the latest in gitmo nation?", - "What's the latest No Agenda show?", - "Random No Agenda show!", - "My Millenials, Stay Woke!", - "I need Karma!", - "I need Pharma!", - "Resist We Much!", - "Build A Wall!", - "Any Collusion?", - "Play the fourth No Agenda show!", - "Load the fifth No Agenda show!", - "Initiate the sixth No Agenda show!", - "Start the seventh No Agenda show!", - "Start up the eighth No Agenda show!", - "Fire up the ninth No Agenda show!", - "Startup the tenth No Agenda show!", - "Spam the eleventh No Agenda show!", - "Initiate the twelfth No Agenda show!", - "Load the thirteenth No Agenda show!", - "Fire up the fourteenth No Agenda show!", - "Load the fifteenth No Agenda show!", - "Jack into the live No Agenda stream", - "random No Agenda show!" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "based on the official news module from Mycroft AI\n\nadapted by:\n@joshuacox" - ], - "requirements": { - "python": [ - "feedparser==5.2.1" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Na Show Skill", - "android_handler": "skill-na-show.joshuacox.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-01-19T00:51:10Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2018-02-08T17:38:08Z", - "authorname": "Gobbenobber", - "skillname": "CryptoSkill", - "foldername": "skill-CryptoSkill", - "name": "CryptoSkill", - "url": "https://github.com/Gobbenobber/skill-CryptoSkill", - "category": null, - "description": "This skill utilizes the CoinMarketCap API found on <https://api.coinmarketcap.com> to deliver cryptocurrency-related functionality for Mycroft.", - "short_description": "This skill utilizes the CoinMarketCap API found on <https://api.coinmarketcap.com> to deliver cryptocurrency-related functionality for Mycroft.", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Cryptoskill Skill", - "android_handler": "skill-CryptoSkill.gobbenobber.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-05-11T01:52:54Z", - "archived": false, - "license": "mit", - "modified": "2018-09-10T16:28:23Z", - "authorname": "scherererer", - "skillname": "Roku", - "foldername": "skill-roku", - "name": "Roku", - "url": "https://github.com/scherererer/skill-roku", - "category": null, - "description": "This is a mycroft skill for controlling your roku. It uses the Roku External Control API found here: https://sdkdocs.roku.com/display/sdkdoc/External+Control+API\n\nWhen you ask your mycroft to play a show, this skill will do a search at the \"roku\" level for the show. If it finds what you are looking for on the correct provider (e.g. netflix, amazon, etc.) then it will launch it automatically. If it doesn't, you'll end up with some search results on your screen.", - "short_description": "", - "branch": "master", - "examples": [ - "Show altered carbon on netflix.", - "Show altered carbon on netflix" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "Michael P. Scherer" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Roku Skill", - "android_handler": "skill-roku.scherererer.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-07-09T21:34:51Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-06-29T13:19:15Z", - "authorname": "Dark5ide", - "skillname": "Espy", - "foldername": "espy-skill", - "name": "Espy", - "url": "https://github.com/Dark5ide/espy-skill", - "category": null, - "description": "This skill has been created for the makers and hackers who want to build their own home automation system based on esp8266. the purpose of this skill is to be able to use mycroft to send commands to all esp8266s on the local network. the communication protocol can be selected (websocket, mqtt, http get).", - "short_description": "", - "branch": "master", - "examples": [ - "_Hey Mycroft, can you switch on the mood lamp ?_", - "_Hey Mycroft, can you turn off the TV ?_" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Dark5ide" - ], - "requirements": { - "python": [ - "websocket-client-py3>=0.15.0", - "paho-mqtt>=1.2" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Espy Skill", - "android_handler": "espy-skill.dark5ide.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-03-01T22:50:45Z", - "archived": false, - "license": "mit", - "modified": "2018-12-12T16:33:21Z", - "authorname": "mathias", - "skillname": "Heroku Status", - "foldername": "skill-heroku-status", - "name": "Heroku Status", - "url": "https://github.com/mathias/skill-heroku-status", - "category": null, - "description": "Fetches Heroku platform status from the status site.", - "short_description": "", - "branch": "master", - "examples": [ - "Check heroku status.", - "Get heroku status.", - "Are there any heroku incidents?", - "check heroku status", - "get heroku status", - "are there any heroku incidents?" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Matt Gauger matt.gauger@gmail.com\nCopyright 2018 All Rights Reserved.\n\nLicensed under the MIT License. See LICENSE file." - ], - "requirements": { - "python": [ - "idna==2.6", - "certifi==2018.1.18", - "urllib3>=1.23", - "chardet==3.0.4", - "requests==2.20.0" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Heroku Status Skill", - "android_handler": "skill-heroku-status.mathias.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-05-15T20:58:10Z", - "archived": false, - "license": "unlicense", - "modified": "2018-05-16T19:59:31Z", - "authorname": "sofwerx", - "skillname": "mycroft-articlekeyword-skill", - "foldername": "mycroft-articlekeyword-skill", - "name": "mycroft-articlekeyword-skill", - "url": "https://github.com/sofwerx/mycroft-articlekeyword-skill", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "scipy>=0.19", - "pathlib" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Articlekeyword Skill", - "android_handler": "mycroft-articlekeyword-skill.sofwerx.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-04-11T01:57:48Z", - "archived": false, - "license": "unknown", - "modified": "2018-04-11T02:31:53Z", - "authorname": "dleweyiv", - "skillname": "Jokes", - "foldername": "joke-skill", - "name": "Jokes", - "url": "https://github.com/dleweyiv/joke-skill", - "category": null, - "description": "Brighten your day with a little humor. This draws on the jokes collected by the [PyJokes project](https://github.com/pyjokes/pyjokes) to give you a chuckle.\n\nThe joke categories are:\n* Neutral -- jokes that are safe for work, kids or your grandmother\n* Adult -- nothing horrible, but be ready to cover some ears\n* Chuck Norris -- jokes only a geek can love\n\nBy default it will give you clean and/or geeky jokes, but you can ask a little adult humor if you feel that way.\n\n_WARNING: Laughter is not guaranteed, but eye rolls are likely._", - "short_description": "", - "branch": "master", - "examples": [ - "Make me laugh.", - "Tell me a Chuck Norris joke.", - "I want to hear a raunchy joke.", - "How about a neutral joke.", - "Make me laugh", - "Tell me a Chuck Norris joke", - "I want to hear a raunchy joke", - "How about a neutral joke" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Mycroft AI\n\nEveryone at https://github.com/pyjokes/pyjokes!" - ], - "requirements": { - "python": [ - "pyjokes==0.5.0" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Joke Skill", - "android_handler": "joke-skill.dleweyiv.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-10-31T15:00:04Z", - "archived": false, - "license": "apache-2.0", - "modified": "2018-10-31T15:30:12Z", - "authorname": "AIIX", - "skillname": "Weather", - "foldername": "skill-weather-2", - "name": "Weather", - "url": "https://github.com/AIIX/skill-weather-2", - "category": "Daily", - "description": "Get weather conditions, forecasts, expected precipitation and more! By default it will tell\nyou about your default location, or you can ask for other cities around the world. \n\nCurrent conditions and weather forecasts come from [Open Weather Map](https://openweathermap.org).\n\nFor **enclosures** with screen support, conditions are briefly shown using visemes.\n\nThe temperature is shown in Celsius or Fahrenheit depending on the preferences set in your [https://home.mycroft.ai](https://home.mycroft.ai) account.", - "short_description": "Weather conditions and forecasts", - "branch": "master", - "examples": [ - "What is the weather?", - "What is the forecast tomorrow?", - "What is the weather going to be like Tuesday?", - "What is the weather in Houston?", - "When will it rain next?", - "How windy is it?", - "What's the humidity?", - "Is it going to snow?", - "What's the temperature?" - ], - "tags": [ - "humidity", - "forecast", - "temperature", - "Daily", - "snow", - "rain", - "weather", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://rawgithub.com/FortAwesome/Font-Awesome/master/advanced-options/raw-svg/solid/sun.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Daily" - ], - "requirements": { - "python": [ - "pyowm==2.6.1", - "requests>=2.13.0", - "multi-key-dict==2.0.3" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Weather 2 Skill", - "android_handler": "skill-weather-2.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-05-04T21:05:12Z", - "archived": false, - "license": "mit", - "modified": "2018-05-04T21:05:44Z", - "authorname": "chadwallacehart", - "skillname": "Mycroft Tragedy of Darth Plagueis skill", - "foldername": "mycroft-skill-darth-plagueis", - "name": "Mycroft Tragedy of Darth Plagueis skill", - "url": "https://github.com/chadwallacehart/mycroft-skill-darth-plagueis", - "category": null, - "description": "Recreate the Star Wars Revenge of the Sith scene where Palpatine explains the Tragedy of Darth Plaguies to Anakin.\nYou must start the skill by asking about \"Darth Plaguies\". After that you can navigate via any of Anakin's dialog\nin that scene and the app will respond as Palpatine.", - "short_description": "", - "branch": "master", - "examples": [ - "Who was Darth Plagueis?", - "He could actuall save people from death?", - "What happened to him?", - "Can this power be learned?" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Darth Plagueis Skill", - "android_handler": "mycroft-skill-darth-plagueis.chadwallacehart.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-05-27T15:23:17Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-08-07T06:08:59Z", - "authorname": "neoscreenager", - "skillname": "node-light-controller", - "foldername": "node-light-controller", - "name": "node-light-controller", - "url": "https://github.com/neoscreenager/node-light-controller", - "category": null, - "description": "This skills allows to turn on/off, the Red/Green LEDs attached with NodeMCU microcontroller.\nIt is using Thinger.io (https://thinger.io/) server installed on local machine to control the\nLEDs through REST API calls. Thinger.io server provides an interface to manage all the IoT resources\nand automatically creates REST APIs with secure authentication mechanism to control the resources.\nThis skill at present only providing voice control for turning Red/Green led ON of OFF.\nBut it could be extended or new skills can be created using same tools to give Mycroft more capabilities to\ncontrol IoT devices via voice. As an example, room temperature sensor could be added to the NodeMCU board ( L35 analog temperature sensor is used here, check this article for\ntutorial on how to connect it with NodeMCU : http://www.instructables.com/id/Interface-LM35-With-NodeMCU/ ) and with few code addition, this skill allows Mycroft to fetch room temperature reading using voice command.\nThis skill has not yet been submitted to Mycroft skill set, as some code modifications ( like reading the authentication headers from config files) need to be done.\nThe sketch is also provided with this code (NodeMCUThinger.ino) which can be flashed into a NodeMCU unit.\nAlso, this repository contains a PDF file with overview of components required for creating and using this skill.\nDemo videos on YouTube:\n1. https://youtu.be/2W1dCUOKwTw Demo to turn LEDs ON/OFF\n2. https://youtu.be/Tw6L6K-t1TA Demo to query room temperature\n3. https://youtu.be/Zdkx1vZKKfw Screencast walkthrough under the hood.", - "short_description": "", - "branch": "master", - "examples": [ - "Turn red light on.", - "Turn green light off.", - "Turn red light off.", - "What is the room temperature?", - "What is the temperature of this room?", - "Turn red light on", - "Turn green light off", - "Turn red light off", - "What is the room temperature", - "What is the temperature of this room" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "Abhishek Mathur" - ], - "requirements": { - "python": [ - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Node Light Controller Skill", - "android_handler": "node-light-controller.neoscreenager.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-05-16T05:01:49Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2018-05-17T04:52:18Z", - "authorname": "Siltstorm", - "skillname": "story timeThis skill tells story that changes what happens next each time", - "foldername": "storytime-skill", - "name": "story timeThis skill tells story that changes what happens next each time", - "url": "https://github.com/Siltstorm/storytime-skill", - "category": null, - "description": "Start a story by saying \"Mycroft, tell me a story.\"\nIt will then start the story and randomly choose each chapter for the reader.\n\nTo get this done we need\n- A sound effect for the page flip\n- Randomly pick between two chapter options- Speak the result.", - "short_description": "", - "branch": "master", - "examples": [ - "Tell me a story.", - "tell me a story" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Storytime Skill", - "android_handler": "storytime-skill.siltstorm.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-06-14T10:00:12Z", - "archived": false, - "license": "unknown", - "modified": "2018-12-26T17:25:37Z", - "authorname": "AIIX", - "skillname": "Yelp Skill - Fork of btotharye Mycroft Yelp Skill", - "foldername": "mycroft-yelp", - "name": "Yelp Skill - Fork of btotharye Mycroft Yelp Skill", - "url": "https://github.com/AIIX/mycroft-yelp", - "category": null, - "description": "Finds restaurants/bars/and other locations via the Yelp API", - "short_description": "Finds restaurants/bars/and other locations via the Yelp API", - "branch": "master", - "examples": [ - "I need a place to eat dinner.", - "Need a place to eat sushi.", - "Find me a place to eat sushi.", - "Find me a place to eat dinner.", - "Comic book stores near me.", - "Yelp bars.", - "Sushi restaurants by me.", - "Sushi restaurants nearby.", - "I need a place to eat dinner", - "Need a place to eat sushi", - "find me a place to eat sushi", - "find me a place to eat dinner", - "comic book stores near me", - "yelp bars", - "sushi restaurants by me", - "sushi restaurants nearby" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "btotharye, aiix" - ], - "requirements": { - "python": [ - "yelpapi" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Yelp Skill", - "android_handler": "mycroft-yelp.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-08-02T07:05:54Z", - "archived": false, - "license": "mit", - "modified": "2019-02-04T09:01:56Z", - "authorname": "herangithan", - "skillname": "mycroft-test", - "foldername": "mycroft-test", - "name": "mycroft-test", - "url": "https://github.com/herangithan/mycroft-test", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Test Skill", - "android_handler": "mycroft-test.herangithan.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-09-27T17:49:36Z", - "archived": false, - "license": "mit", - "modified": "2019-01-22T00:10:35Z", - "authorname": "parthshihora", - "skillname": "mycroft-gtm-skill", - "foldername": "mycroft-gtm-skill", - "name": "mycroft-gtm-skill", - "url": "https://github.com/parthshihora/mycroft-gtm-skill", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [ - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Gtm Skill", - "android_handler": "mycroft-gtm-skill.parthshihora.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-11-16T12:38:56Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-02-19T10:51:44Z", - "authorname": "AIIX", - "skillname": "news-skill", - "foldername": "news-skill", - "name": "news-skill", - "url": "https://github.com/AIIX/news-skill", - "category": null, - "description": "news skill for mycroft", - "short_description": "news skill for mycroft", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "beautifulsoup4 ", - "arrow", - "requests>=1.1" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "News Skill", - "android_handler": "news-skill.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-02-04T16:00:23Z", - "archived": false, - "license": "apache-2.0", - "modified": "2018-02-04T16:01:10Z", - "authorname": "Arcanesaadman15", - "skillname": "Mycroft Today in History - Event skill", - "foldername": "MySkills1", - "name": "Mycroft Today in History - Event skill", - "url": "https://github.com/Arcanesaadman15/MySkills1", - "category": null, - "description": "This skill gives back a event from today in history. It uses http://history.muffinlabs.com/#api for the results", - "short_description": "This skill gives back a event from today in history. It uses http://history.muffinlabs.com/#api for the results", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Myskills1 Skill", - "android_handler": "MySkills1.arcanesaadman15.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-04-11T02:17:22Z", - "archived": false, - "license": "unknown", - "modified": "2018-04-11T02:18:08Z", - "authorname": "dleweyiv", - "skillname": "Spelling Skill", - "foldername": "spelling-skill", - "name": "Spelling Skill", - "url": "https://github.com/dleweyiv/spelling-skill", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [ - "Spell Mycroft.", - "spell Mycroft" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Spelling Skill", - "android_handler": "spelling-skill.dleweyiv.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-01-18T17:44:39Z", - "archived": false, - "license": "mit", - "modified": "2018-01-18T17:47:14Z", - "authorname": "pythonfoo", - "skillname": "test_skill for learning Mycroft Skill Development", - "foldername": "mycroft_test_skill", - "name": "test_skill for learning Mycroft Skill Development", - "url": "https://github.com/pythonfoo/mycroft_test_skill", - "category": null, - "description": "This skill does reply with a preset dialog", - "short_description": "This skill does reply with a preset dialog", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft_Test_Skill Skill", - "android_handler": "mycroft_test_skill.pythonfoo.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-11-23T16:50:47Z", - "archived": false, - "license": "mit", - "modified": "2018-11-24T09:36:58Z", - "authorname": "HackYourOffice", - "skillname": "skill-klima", - "foldername": "skill-klima", - "name": "skill-klima", - "url": "https://github.com/HackYourOffice/skill-klima", - "category": null, - "description": "mycroft skill for air condition control", - "short_description": "mycroft skill for air condition control", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Klima Skill", - "android_handler": "skill-klima.hackyouroffice.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-10-04T14:27:01Z", - "archived": false, - "license": "unknown", - "modified": "2019-04-03T11:53:39Z", - "authorname": "AIIX", - "skillname": "shopping-demo", - "foldername": "shopping-demo", - "name": "shopping-demo", - "url": "https://github.com/AIIX/shopping-demo", - "category": null, - "description": "shopping demo skill for mycroft", - "short_description": "shopping demo skill for mycroft", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "word2number " - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Shopping Demo Skill", - "android_handler": "shopping-demo.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-04-20T06:04:17Z", - "archived": false, - "license": "unlicense", - "modified": "2018-04-20T08:44:05Z", - "authorname": "Gits3", - "skillname": "Lottery-Skill", - "foldername": "Lottery-Skill", - "name": "Lottery-Skill", - "url": "https://github.com/Gits3/Lottery-Skill", - "category": null, - "description": "random lottery Numbers Based in the UK \n Skill for Mycroft", - "short_description": "random lottery Numbers Based in the UK ", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Lottery Skill", - "android_handler": "Lottery-Skill.gits3.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-03-21T14:29:39Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2018-03-21T14:37:45Z", - "authorname": "im-strongthany-zz", - "skillname": "skill-nmap", - "foldername": "skill-pentest", - "name": "skill-nmap", - "url": "https://github.com/im-strongthany-zz/skill-pentest", - "category": null, - "description": "nmap skill for Mycroft AI\n\n\nsay `scan *IP address of your choice*'", - "short_description": "nmap skill for Mycroft AI", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "python-nmap" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Pentest Skill", - "android_handler": "skill-pentest.im-strongthany-zz.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-05-14T03:17:26Z", - "archived": false, - "license": "mit", - "modified": "2018-05-16T10:25:20Z", - "authorname": "HellCatVN", - "skillname": "Desktop Launcher Skill", - "foldername": "Mycroft-Application-Launcher", - "name": "Desktop Launcher Skill", - "url": "https://github.com/HellCatVN/Mycroft-Application-Launcher", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [ - "Open firefox.", - "Search mycroft in amazon.", - "Close firefox.", - "open firefox", - "search mycroft in amazon", - "close firefox" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Application Launcher Skill", - "android_handler": "Mycroft-Application-Launcher.hellcatvn.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-03-20T13:22:21Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2018-03-20T13:27:17Z", - "authorname": "AIIX", - "skillname": "image-ocr-skill", - "foldername": "image-ocr-skill", - "name": "image-ocr-skill", - "url": "https://github.com/AIIX/image-ocr-skill", - "category": null, - "description": "Image OCR skill for Mycroft on KDE Plasma\n\n##### How To Use:\norc image url {URL}", - "short_description": "Image OCR skill for Mycroft on KDE Plasma", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "pytesseract", - "pyenchant", - "nltk" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Image Ocr Skill", - "android_handler": "image-ocr-skill.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-03-10T03:23:39Z", - "archived": false, - "license": "lgpl-3.0", - "modified": "2018-03-10T03:38:58Z", - "authorname": "SomePati", - "skillname": "Mycroft skill-radio-oe1", - "foldername": "skill-radio-oe1", - "name": "Mycroft skill-radio-oe1", - "url": "https://github.com/SomePati/skill-radio-oe1", - "category": null, - "description": "Latest news from http://www.oe1.orf.at from austria.", - "short_description": "", - "branch": "master", - "examples": [ - "Austrian news.", - "News from austria.", - "Radio from austria.", - "austrian news", - "news from austria", - "radio from austria" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Radio Oe1 Skill", - "android_handler": "skill-radio-oe1.somepati.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-02-03T10:22:43Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2018-02-03T10:26:17Z", - "authorname": "whohlfeld", - "skillname": "Radio Channel Skill", - "foldername": "radio_channel_skill", - "name": "Radio Channel Skill", - "url": "https://github.com/whohlfeld/radio_channel_skill", - "category": null, - "description": "Play Radio Channels and switch between them.", - "short_description": "", - "branch": "master", - "examples": [ - "Turn on the radio.", - "Hey Mycroft, turn on the radio" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Radio_Channel_Skill Skill", - "android_handler": "radio_channel_skill.whohlfeld.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-10-06T02:24:47Z", - "archived": false, - "license": "unknown", - "modified": "2019-01-10T18:07:43Z", - "authorname": "JarbasAl", - "skillname": "All about intents", - "foldername": "learn-portuguese-skill", - "name": "All about intents", - "url": "https://github.com/JarbasAl/learn-portuguese-skill", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Learn Portuguese Skill", - "android_handler": "learn-portuguese-skill.jarbasal.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-01-26T17:02:50Z", - "archived": false, - "license": "mit", - "modified": "2018-01-26T17:03:26Z", - "authorname": "MatthewScholefield", - "skillname": "Kickstarter Tracker", - "foldername": "skill-kickstarter-tracker", - "name": "Kickstarter Tracker", - "url": "https://github.com/MatthewScholefield/skill-kickstarter-tracker", - "category": null, - "description": "This skill queries Kickstarter for the current pledge amount.", - "short_description": "", - "branch": "master", - "examples": [ - "Track mycroft on kickstarter." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Matthew Scholefield" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Kickstarter Tracker Skill", - "android_handler": "skill-kickstarter-tracker.matthewscholefield.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-01-20T09:47:20Z", - "archived": false, - "license": "mit", - "modified": "2018-01-20T09:49:11Z", - "authorname": "jaller94", - "skillname": "Rock Paper Scissors", - "foldername": "skill-rock-paper-scissors", - "name": "Rock Paper Scissors", - "url": "https://github.com/jaller94/skill-rock-paper-scissors", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [ - "I choose rock.", - "I choose paper.", - "I choose scissors." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Christian Paul" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Rock Paper Scissors Skill", - "android_handler": "skill-rock-paper-scissors.jaller94.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-06-17T20:20:10Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2018-06-29T01:08:45Z", - "authorname": "ExperimentalCivics", - "skillname": "Quizbox", - "foldername": "quizbox", - "name": "Quizbox", - "url": "https://github.com/ExperimentalCivics/quizbox", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [ - "Start a quiz.", - "I want a quiz.", - "start a quiz", - "I want a quiz" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "@joshuacox" - ], - "requirements": { - "python": [ - "python", - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Quizbox Skill", - "android_handler": "quizbox.experimentalcivics.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-12-20T18:42:05Z", - "archived": false, - "license": "unknown", - "modified": "2019-01-08T14:09:39Z", - "authorname": "pcwii", - "skillname": "rpi-gpio-skill", - "foldername": "rpi-gpio-skill", - "name": "rpi-gpio-skill", - "url": "https://github.com/pcwii/rpi-gpio-skill", - "category": null, - "description": "A skill to turn on / off a Rpi GPIO pin\n\nmust set user privilege for GPIO access\n\nin the virtual environmnet\nsudo adduser mycroft gpio", - "short_description": "A skill to turn on / off a Rpi GPIO pin", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "RPi.GPIO" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Rpi Gpio Skill", - "android_handler": "rpi-gpio-skill.pcwii.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-08-04T22:09:35Z", - "archived": false, - "license": "mit", - "modified": "2020-06-25T03:54:19Z", - "authorname": "DarmainTheDonkey", - "skillname": "mycroft-lightbar.mycroftai", - "foldername": "mycroft-lightbar.mycroftai", - "name": "mycroft-lightbar.mycroftai", - "url": "https://github.com/DarmainTheDonkey/mycroft-lightbar.mycroftai", - "category": null, - "description": "Mycroft skill to control a WS8211 LED string\n\nThe lightbar consists of 20 RGB LED modules, each commanded by a WS8211 controller chip. There is a daisy-chain serial bus jumping from one LED to the next to form the chain. The first LED is connected to a ESP8266 NodeMCU module. There is a 3V3 / 5V level shifter in between. The ESP8266 runs an Arduino sketch that commands the LEDs. There are several modes.\n\nOff.\nFade up to full white.\n50% white.\n100% white.\n50% blue.\n100% blue.\n50% green.\n100% green.\n50% red.\n100% red.\n50% yellow.\n100% yellow.\nKnight rider chase in red with after glow.\nRunning random colour changing.\n\nThe ESP8266 presents a simple web page via wifi that allow the light modes to be selected via radio buttons and an Action button.\n\nThis skill generates the form extension to the web site call, that commands the mode of the light bar.\n\nMy light bar is static on 192.168.1.19.\n\nWhile this repository does not conatain the light bar sketch it does show a working example of writing form data to a web page. I will endevour to add the sketch as another repository in due course.", - "short_description": "Mycroft skill to control a WS8211 LED string", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [ - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Lightbar.Mycroftai Skill", - "android_handler": "mycroft-lightbar.mycroftai.darmainthedonkey.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-07-27T07:13:22Z", - "archived": false, - "license": "unknown", - "modified": "2018-07-27T07:13:29Z", - "authorname": "nidaibani21", - "skillname": "Launch", - "foldername": "launch-skill", - "name": "Launch", - "url": "https://github.com/nidaibani21/launch-skill", - "category": null, - "description": "When the trigger words are given the target app specified should open.", - "short_description": "", - "branch": "master", - "examples": [ - "Launch.", - "Launch app.", - "Please launch.", - "Run.", - "Direct.", - "Redirect.", - "Open.", - "Start." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "NidaAibani" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Launch Skill", - "android_handler": "launch-skill.nidaibani21.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-10-06T17:43:25Z", - "archived": false, - "license": "apache-2.0", - "modified": "2018-12-20T18:22:02Z", - "authorname": "avellent", - "skillname": "", - "foldername": "simpleskilltest", - "name": "", - "url": "https://github.com/avellent/simpleskilltest", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Simpleskilltest Skill", - "android_handler": "simpleskilltest.avellent.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-04-08T02:00:16Z", - "archived": false, - "license": "mit", - "modified": "2020-04-17T13:20:57Z", - "authorname": "DerekCaelin", - "skillname": "CIVICUS Monitor", - "foldername": "skill-civicus-monitor", - "name": "CIVICUS Monitor", - "url": "https://github.com/DerekCaelin/skill-civicus-monitor", - "category": null, - "description": "The CIVICUS Monitor web platform uses multiple information streams to track developments related to civic space in 195 countries, communicating analysis and updates in as close to real time as possible. The Monitor serves as a source of valuable information and analysis to inform and underpin fact-based advocacy on civic space at national, regional and international levels.\n\nThis tool checks the CIVICUS Monitor to provide the civic space status of and a 1-2 sentence description of civic space in each of the 195 countries.", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 3, - "credits": [ - "Derek Caelin" - ], - "requirements": { - "python": [ - "titlecase", - "html5lib==1.0.1", - "bs4" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Civicus Monitor Skill", - "android_handler": "skill-civicus-monitor.derekcaelin.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-12-04T12:49:53Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2018-12-04T12:51:29Z", - "authorname": "AIIX", - "skillname": "Holidays", - "foldername": "holidays-skill", - "name": "Holidays", - "url": "https://github.com/AIIX/holidays-skill", - "category": "Entertainment", - "description": "Get Current and Historic holidays list for a country", - "short_description": "Holidays List Information", - "branch": "master", - "examples": [ - "Give me a list of holidays for {country} in {year}", - "Hey Mycroft, Give me a list of holidays for {country} in {year}" - ], - "tags": [ - "list", - "information", - "Entertainment", - "history", - "holidays", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://rawgithub.com/FortAwesome/Font-Awesome/master/advanced-options/raw-svg/solid/bars.svg", - "credits": [ - "Aix (@aiix)" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [ - "python-dateutil", - "pycountry", - "requests>=1.1" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Holidays Skill", - "android_handler": "holidays-skill.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-10-09T04:23:04Z", - "archived": false, - "license": "unknown", - "modified": "2019-02-02T06:15:45Z", - "authorname": "JarbasAl", - "skillname": "Planet Fall", - "foldername": "planet-fall-game-skill", - "name": "Planet Fall", - "url": "https://github.com/JarbasAl/planet-fall-game-skill", - "category": "Entertainment", - "description": "![](http://infocom.elsewhere.org/gallery/planetfall/planetfall1.jpg)\n\nImages of exotic worlds, strange and colorful aliens and Deep Space heroism had danced in your head as you signed the dotted line. And since that day the closest you've come to Deep Space heroism was scrubbing down the radioactive leper colony on Ishmael-3.", - "short_description": "", - "branch": "master", - "examples": [ - "Play planet fall.", - "Save.", - "Resume planet fall." - ], - "tags": [ - "Entertainment", - "cave", - "game", - "adventure", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Planet Fall Game Skill", - "android_handler": "planet-fall-game-skill.jarbasal.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-01-07T23:09:44Z", - "archived": false, - "license": "unknown", - "modified": "2019-02-02T06:15:09Z", - "authorname": "JarbasAl", - "skillname": "Jarbas Server fallback", - "foldername": "fallback-jarbas", - "name": "Jarbas Server fallback", - "url": "https://github.com/JarbasAl/fallback-jarbas", - "category": null, - "description": "Asks a server jarbas/mycroft instance for an answer using [JarbasAPI](https://github.com/JarbasAl/jarbas-core/tree/server/mycroft/server/microservices)", - "short_description": "", - "branch": "master", - "examples": [ - "Do you like pizza?" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Fallback Jarbas Skill", - "android_handler": "fallback-jarbas.jarbasal.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-04-14T19:27:42Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2018-08-27T11:05:49Z", - "authorname": "Quinn2017", - "skillname": "skill-magic-eight-ball", - "foldername": "Skill-Magic-Eight-Ball", - "name": "skill-magic-eight-ball", - "url": "https://github.com/Quinn2017/Skill-Magic-Eight-Ball", - "category": null, - "description": "A classic game where you ask magic eigh ball a question, shake it, and have an answer returned using random python import.\n\nNote: No shaking your Mycroft required, and probably not recommended. \n\nThere are a total of 20 possible answers (10 affirmative; 5 non-committal; and 5 negative). \n\n'As I see it yes', \n'Ask again later', \n'Better not tell you now', \n'Cannot predict now', \n'Concentrate and ask again', \n'Dont count on it', \n'It is certain', \n'It is decidedly so', \n'Most likely', \n'My reply is no', \n'My sources say no', \n'Outlook good', \n'Outlook not so good', \n'Reply hazy, try again', \n'Signs point to yes', \n'Very doubtful', \n'Without a doubt', \n'Yes definitely', \n'Yes', \n'You may rely on it'", - "short_description": "A classic game where you ask magic eigh ball a question, shake it, and have an answer returned using random python import.", - "branch": "master", - "examples": [ - "No question about the future]." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Magic Eight Ball Skill", - "android_handler": "Skill-Magic-Eight-Ball.quinn2017.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-05-23T17:16:57Z", - "archived": false, - "license": "unknown", - "modified": "2018-05-23T17:22:59Z", - "authorname": "adrianmrit", - "skillname": "Desktop Launcher Skill", - "foldername": "skill-desktop-launcher", - "name": "Desktop Launcher Skill", - "url": "https://github.com/adrianmrit/skill-desktop-launcher", - "category": null, - "description": "This is a modification of the original skill found at https://github.com/MycroftAI/skill-desktop-launcher", - "short_description": "This is a modification of the original skill found at https://github.com/MycroftAI/skill-desktop-launcher", - "branch": "master", - "examples": [ - "Open firefox.", - "Search mycroft in amazon.", - "Close firefox.", - "open firefox", - "search mycroft in amazon", - "close firefox" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Desktop Launcher Skill", - "android_handler": "skill-desktop-launcher.adrianmrit.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-07-01T06:58:18Z", - "archived": false, - "license": "mit", - "modified": "2018-07-29T06:00:12Z", - "authorname": "ITE-5th", - "skillname": "Face Recognizer", - "foldername": "skill-face-recognizer", - "name": "Face Recognizer", - "url": "https://github.com/ITE-5th/skill-face-recognizer", - "category": null, - "description": "Recognise known people and unknown from connected camera using remote server.", - "short_description": "", - "branch": "master", - "examples": [ - "Face.", - "Add john.", - "Take an image.", - "Remove john." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "ITE-5th" - ], - "requirements": { - "python": [ - "msm", - "requests", - "googletrans", - "dlib", - "picamera", - "numpy" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Face Recognizer Skill", - "android_handler": "skill-face-recognizer.ite-5th.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-05-21T01:17:49Z", - "archived": false, - "license": "unknown", - "modified": "2020-02-09T12:32:11Z", - "authorname": "tiagochiavericosta", - "skillname": "Heart Monitor Skill", - "foldername": "heart-rate", - "name": "Heart Monitor Skill", - "url": "https://github.com/tiagochiavericosta/heart-rate", - "category": null, - "description": "Shows heartbeat using webcam", - "short_description": "Shows heartbeat using webcam", - "branch": "master", - "examples": [ - "What is my heart rate?", - "What my heart rate?", - "what is my heart rate", - "what my heart rate" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Tiago Chiaveri da Costa" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Heart Rate Skill", - "android_handler": "heart-rate.tiagochiavericosta.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-05-01T14:24:08Z", - "archived": false, - "license": "mit", - "modified": "2018-05-02T13:42:36Z", - "authorname": "sofwerx", - "skillname": "tsa-wait-skill", - "foldername": "skill-test", - "name": "tsa-wait-skill", - "url": "https://github.com/sofwerx/skill-test", - "category": null, - "description": "This skill uses the following 2 API's:\n\nThe TSA wait times API: http://apps.tsa.dhs.gov/MyTSAWebService/GetTSOWaitTimes.ashx which is documented at https://www.dhs.gov/mytsa-api-documentation\n\nThe IATA Codes api located at https://iatacodes.org/\n\nUsing this information we get the last TSA wait time for an airport code and use the IATA api to get the full name of the airport to respond back with the wait time.\n\nTo get this done we need:\n - requests module installed via msm when you install the skill, if it doesn't install it can be installed via `pip install requests`", - "short_description": "This skill uses the following 2 API's:", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Test Skill", - "android_handler": "skill-test.sofwerx.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-05-31T20:30:53Z", - "archived": false, - "license": "unknown", - "modified": "2018-06-15T21:32:12Z", - "authorname": "ajwkc", - "skillname": "Recipe skill", - "foldername": "recipe-skill", - "name": "Recipe skill", - "url": "https://github.com/ajwkc/recipe-skill", - "category": null, - "description": "Uses the Yummly API to search the recipe database, and then reads the ingredients one by one.", - "short_description": "", - "branch": "master", - "examples": [ - "I want to cook vegetarian chili.", - "How do I make buffalo wings?", - "I want to cook vegetarian chili", - "how do I make buffalo wings?" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "ajwkc" - ], - "requirements": { - "python": [ - "yummly" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Recipe Skill", - "android_handler": "recipe-skill.ajwkc.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-11-15T16:33:25Z", - "archived": false, - "license": "mit", - "modified": "2018-11-16T18:10:53Z", - "authorname": "Smoerble", - "skillname": "YOUR SKILL NAME", - "foldername": "skill-imdb", - "name": "YOUR SKILL NAME", - "url": "https://github.com/Smoerble/skill-imdb", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Imdb Skill", - "android_handler": "skill-imdb.smoerble.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-01-22T04:44:08Z", - "archived": false, - "license": "apache-2.0", - "modified": "2019-12-19T02:44:45Z", - "authorname": "el-tocino", - "skillname": "Mycroft Today in History - Event skill", - "foldername": "mycroft-tih", - "name": "Mycroft Today in History - Event skill", - "url": "https://github.com/el-tocino/mycroft-tih", - "category": null, - "description": "This skill gives back a event from today in history. It uses http://history.muffinlabs.com/#api for the results", - "short_description": "This skill gives back a event from today in history. It uses http://history.muffinlabs.com/#api for the results", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "@btothayre wrote this originally." - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Tih Skill", - "android_handler": "mycroft-tih.el-tocino.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-10-29T20:05:52Z", - "archived": false, - "license": "unknown", - "modified": "2018-10-30T18:48:09Z", - "authorname": "andlo", - "skillname": "Tell A Story", - "foldername": "tell-a-story-skill", - "name": "Tell A Story", - "url": "https://github.com/andlo/tell-a-story-skill", - "category": null, - "description": "This skill tells small stories.", - "short_description": "", - "branch": "master", - "examples": [ - "Tell me a story.", - "Tell a good story." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Andreas Lorensen" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Tell A Story Skill", - "android_handler": "tell-a-story-skill.andlo.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-11-09T15:47:26Z", - "archived": false, - "license": "mit", - "modified": "2018-11-09T16:33:39Z", - "authorname": "VHeusdens", - "skillname": "YOUR SKILL NAME", - "foldername": "skill-test", - "name": "YOUR SKILL NAME", - "url": "https://github.com/VHeusdens/skill-test", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "Your name" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Test Skill", - "android_handler": "skill-test.vheusdens.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-11-16T19:57:23Z", - "archived": false, - "license": "mit", - "modified": "2018-11-16T19:59:04Z", - "authorname": "Smoerble", - "skillname": "YOUR SKILL NAME", - "foldername": "skill-funny", - "name": "YOUR SKILL NAME", - "url": "https://github.com/Smoerble/skill-funny", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Funny Skill", - "android_handler": "skill-funny.smoerble.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-03-07T15:41:46Z", - "archived": false, - "license": "mit", - "modified": "2018-03-07T16:01:24Z", - "authorname": "mohitsrivastava15", - "skillname": "YOUR SKILL NAME", - "foldername": "hindiHelloSkill", - "name": "YOUR SKILL NAME", - "url": "https://github.com/mohitsrivastava15/hindiHelloSkill", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name# hindiHelloSkill" - ], - "requirements": { - "python": [ - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Hindihelloskill Skill", - "android_handler": "hindiHelloSkill.mohitsrivastava15.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-06-11T01:13:24Z", - "archived": false, - "license": "mit", - "modified": "2018-06-11T01:21:02Z", - "authorname": "clebio", - "skillname": "YOUR SKILL NAME", - "foldername": "learning_mycroft", - "name": "YOUR SKILL NAME", - "url": "https://github.com/clebio/learning_mycroft", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [ - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Learning_Mycroft Skill", - "android_handler": "learning_mycroft.clebio.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-02-28T16:11:02Z", - "archived": false, - "license": "mit", - "modified": "2018-03-25T21:15:12Z", - "authorname": "SergioML9", - "skillname": "YOUR SKILL NAME", - "foldername": "yeelight-skill", - "name": "YOUR SKILL NAME", - "url": "https://github.com/SergioML9/yeelight-skill", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [ - "python2-miio", - "yeelight" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Yeelight Skill", - "android_handler": "yeelight-skill.sergioml9.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-08-14T20:50:23Z", - "archived": false, - "license": "mit", - "modified": "2018-08-14T21:08:27Z", - "authorname": "VikramVaroo", - "skillname": "YOUR SKILL NAME", - "foldername": "helloworld-", - "name": "YOUR SKILL NAME", - "url": "https://github.com/VikramVaroo/helloworld-", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [ - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Helloworld Skill", - "android_handler": "helloworld-.vikramvaroo.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-08-09T08:00:59Z", - "archived": false, - "license": "unknown", - "modified": "2018-08-09T08:01:05Z", - "authorname": "SamG486", - "skillname": "Employees", - "foldername": "employees-skill", - "name": "Employees", - "url": "https://github.com/SamG486/employees-skill", - "category": null, - "description": "Customer wants to be connected to an employee\n\nafter specifying a name or phone number, mycroft connects him to the specific employee.", - "short_description": "", - "branch": "master", - "examples": [ - "Connect me with employee müller.", - "Connect me with number 123456.", - "Call employee müller.", - "Call müller.", - "Connect me with müller." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Samantha Göldner" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Employees Skill", - "android_handler": "employees-skill.samg486.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-10-18T09:56:42Z", - "archived": false, - "license": "mit", - "modified": "2018-10-22T18:07:44Z", - "authorname": "VHeusdens", - "skillname": "YOUR SKILL NAME", - "foldername": "skill-blue", - "name": "YOUR SKILL NAME", - "url": "https://github.com/VHeusdens/skill-blue", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Blue Skill", - "android_handler": "skill-blue.vheusdens.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-09-28T10:21:08Z", - "archived": false, - "license": "mit", - "modified": "2019-03-25T12:47:16Z", - "authorname": "BrianArch96", - "skillname": "YOUR SKILL NAME", - "foldername": "Mycroft-appointment", - "name": "YOUR SKILL NAME", - "url": "https://github.com/BrianArch96/Mycroft-appointment", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [ - "gensim", - "httplib2", - "googleapiclient", - "oauth2client", - "datetime" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Appointment Skill", - "android_handler": "Mycroft-appointment.brianarch96.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-06-16T03:36:24Z", - "archived": false, - "license": "mit", - "modified": "2018-06-16T04:08:24Z", - "authorname": "khalildh", - "skillname": "YOUR SKILL NAME", - "foldername": "skill-bot-commander", - "name": "YOUR SKILL NAME", - "url": "https://github.com/khalildh/skill-bot-commander", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [ - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Bot Commander Skill", - "android_handler": "skill-bot-commander.khalildh.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-02-19T08:55:37Z", - "archived": false, - "license": "mit", - "modified": "2018-02-20T02:56:26Z", - "authorname": "gallsy", - "skillname": "LIFX-Skill", - "foldername": "lifx-skill", - "name": "LIFX-Skill", - "url": "https://github.com/gallsy/lifx-skill", - "category": null, - "description": "This is a basic mycroft skill that can control LIFX lights using LifxLAN (https://github.com/mclarkk/lifxlan)\n\nUsage\nTurn on the lights / Lights on\n * Turn off the lights / Lights off\n * Dim Lights / Lights down\n * Lights Full / lights up", - "short_description": "This is a basic mycroft skill that can control LIFX lights using LifxLAN (https://github.com/mclarkk/lifxlan)", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "lifxlan" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Lifx Skill", - "android_handler": "lifx-skill.gallsy.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-07-15T17:29:51Z", - "archived": false, - "license": "mit", - "modified": "2020-01-01T20:03:09Z", - "authorname": "MostAwesomeJJ", - "skillname": "YOUR SKILL NAME", - "foldername": "lovey-laptop-control", - "name": "YOUR SKILL NAME", - "url": "https://github.com/MostAwesomeJJ/lovey-laptop-control", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "Your name" - ], - "requirements": { - "python": [ - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Lovey Laptop Control Skill", - "android_handler": "lovey-laptop-control.mostawesomejj.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-09-25T10:15:19Z", - "archived": false, - "license": "mit", - "modified": "2018-09-25T23:48:08Z", - "authorname": "Mennu", - "skillname": "Data Fair Quiz", - "foldername": "DataFair_Quiz", - "name": "Data Fair Quiz", - "url": "https://github.com/Mennu/DataFair_Quiz", - "category": null, - "description": "A Data Fair Quiz.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Naveen Meher" - ], - "requirements": { - "python": [ - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Datafair_Quiz Skill", - "android_handler": "DataFair_Quiz.mennu.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-10-11T14:09:20Z", - "archived": false, - "license": "unknown", - "modified": "2018-10-17T08:26:38Z", - "authorname": "sumutcan", - "skillname": "Music Brains", - "foldername": "skill-musicbrainz", - "name": "Music Brains", - "url": "https://github.com/sumutcan/skill-musicbrainz", - "category": "Information", - "description": "This skill answers questions like Who sings Let it be? This is just a simple skill to demonstrate the usage of mycroft over linked data.", - "short_description": "A skill that answers questions over LinkedBrainz data.", - "branch": "master", - "examples": [ - "Who sings Let it be?" - ], - "tags": [ - "questionanswer", - "music", - "Music", - "generalknowledge", - "Information", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://rawgithub.com/FortAwesome/Font-Awesome/master/advanced-options/raw-svg/solid/brain.svg", - "credits": [ - "Umutcan Simsek (@sumutcan)" - ], - "categories": [ - "Information", - "Music" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Musicbrainz Skill", - "android_handler": "skill-musicbrainz.sumutcan.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-02-25T22:25:00Z", - "archived": false, - "license": "mit", - "modified": "2018-02-25T22:30:47Z", - "authorname": "CarlKlein", - "skillname": "YOUR SKILL NAME", - "foldername": "mycroft-test-skill", - "name": "YOUR SKILL NAME", - "url": "https://github.com/CarlKlein/mycroft-test-skill", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [ - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Test Skill", - "android_handler": "mycroft-test-skill.carlklein.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-02-28T16:34:09Z", - "archived": false, - "license": "mit", - "modified": "2018-10-23T18:21:42Z", - "authorname": "pedrocolon93", - "skillname": "YOUR SKILL NAME", - "foldername": "mycroft-hover-skill", - "name": "YOUR SKILL NAME", - "url": "https://github.com/pedrocolon93/mycroft-hover-skill", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [ - "tinydb" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Hover Skill", - "android_handler": "mycroft-hover-skill.pedrocolon93.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-04-11T17:14:38Z", - "archived": false, - "license": "unknown", - "modified": "2019-04-08T06:20:11Z", - "authorname": "TREE-Ind", - "skillname": "Fallback Cakechat", - "foldername": "skill-fallback-cakechat", - "name": "Fallback Cakechat", - "url": "https://github.com/TREE-Ind/skill-fallback-cakechat", - "category": null, - "description": "Allows Mycroft to give responses from CakeChat dialog system that is able to express emotions\n\nGet CakeChat Here: [GitHub](https://github.com/lukalabs/cakechat)", - "short_description": "", - "branch": "master", - "examples": [ - "What is your favorite color?", - "What is the meaning of life?" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "TREE Industries" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Fallback Cakechat Skill", - "android_handler": "skill-fallback-cakechat.tree-ind.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-03-08T19:10:38Z", - "archived": false, - "license": "mit", - "modified": "2018-03-08T19:15:12Z", - "authorname": "collinsrj", - "skillname": "YOUR SKILL NAME", - "foldername": "mcdonald-house", - "name": "YOUR SKILL NAME", - "url": "https://github.com/collinsrj/mcdonald-house", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [ - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mcdonald House Skill", - "android_handler": "mcdonald-house.collinsrj.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-04-17T01:17:41Z", - "archived": false, - "license": "mit", - "modified": "2019-02-21T17:26:54Z", - "authorname": "adelin-b", - "skillname": "Theme Change", - "foldername": "skill-theme-change", - "name": "Theme Change", - "url": "https://github.com/adelin-b/skill-theme-change", - "category": null, - "description": "Change the wallpaper them call themer to change the theme colors.", - "short_description": "", - "branch": "master", - "examples": [ - "Change wallpaper.", - "Change theme.", - "Set a new wallpaper.", - "New wallpaper.", - "Get a new skin." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "adberard" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Theme Change Skill", - "android_handler": "skill-theme-change.adelin-b.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-08-16T19:37:30Z", - "archived": false, - "license": "unknown", - "modified": "2018-08-16T19:37:36Z", - "authorname": "machinekoder", - "skillname": "Mk Automation", - "foldername": "mk-automation-skill", - "name": "Mk Automation", - "url": "https://github.com/machinekoder/mk-automation-skill", - "category": null, - "description": "This skill connects to my personal pc automation suite and exposes the automation scripts to mycroft.", - "short_description": "", - "branch": "master", - "examples": [ - "Start miracle morning.", - "Open my ideas.", - "Start coding.", - "Open the password manager." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Alexander Rössler" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mk Automation Skill", - "android_handler": "mk-automation-skill.machinekoder.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-02-28T21:30:16Z", - "archived": false, - "license": "mit", - "modified": "2018-02-28T22:05:03Z", - "authorname": "stacs01", - "skillname": "YOUR SKILL NAME", - "foldername": "hi-mycroft", - "name": "YOUR SKILL NAME", - "url": "https://github.com/stacs01/hi-mycroft", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [ - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Hi Mycroft Skill", - "android_handler": "hi-mycroft.stacs01.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-11-23T18:28:21Z", - "archived": false, - "license": "unknown", - "modified": "2019-01-21T16:29:05Z", - "authorname": "lumoe", - "skillname": "Recipe recommender", - "foldername": "recipe-skill", - "name": "", - "url": "https://github.com/lumoe/recipe-skill", - "category": "Food", - "description": "Get a recipe to your ingredients. Mycroft skill to get a recipe suggestion for an ingredient.", - "short_description": "Get a recipe to your ingredients. Mycroft skill to get a recipe suggestion for an ingredient.", - "branch": "master", - "examples": [ - "What can i make with Tomaten?", - "What can i make with Blumenkohl?" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://rawgit.com/FortAwesome/Font-Awesome/master/advanced-options/raw-svg/solid/utensils.svg", - "categories": [ - "Food" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Recipe Skill", - "android_handler": "recipe-skill.lumoe.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-09-02T20:30:00Z", - "archived": false, - "license": "apache-2.0", - "modified": "2018-09-02T20:30:45Z", - "authorname": "avellent", - "skillname": "Mycroft Today in History - Event skill", - "foldername": "tinh", - "name": "Mycroft Today in History - Event skill", - "url": "https://github.com/avellent/tinh", - "category": null, - "description": "This skill gives back a event from today in history. It uses http://history.muffinlabs.com/#api for the results", - "short_description": "This skill gives back a event from today in history. It uses http://history.muffinlabs.com/#api for the results", - "branch": "master", - "examples": [ - "What event happened this day in history?", - "This day in history.", - "Today in history.", - "what event happened this day in history", - "this day in history", - "today in history" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "btotharye" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Tinh Skill", - "android_handler": "tinh.avellent.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-02-04T17:15:38Z", - "archived": false, - "license": "apache-2.0", - "modified": "2018-02-04T17:16:35Z", - "authorname": "Arcanesaadman15", - "skillname": "Mycroft Today in History - Event skill", - "foldername": "MySkills2", - "name": "Mycroft Today in History - Event skill", - "url": "https://github.com/Arcanesaadman15/MySkills2", - "category": null, - "description": "This skill gives back a event from today in history. It uses http://history.muffinlabs.com/#api for the results", - "short_description": "This skill gives back a event from today in history. It uses http://history.muffinlabs.com/#api for the results", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Myskills2 Skill", - "android_handler": "MySkills2.arcanesaadman15.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-08-20T21:12:21Z", - "archived": false, - "license": "unknown", - "modified": "2018-08-20T21:19:45Z", - "authorname": "sartsj", - "skillname": "YOUR SKILL NAME", - "foldername": "domocrofticz", - "name": "YOUR SKILL NAME", - "url": "https://github.com/sartsj/domocrofticz", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Domocrofticz Skill", - "android_handler": "domocrofticz.sartsj.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-05-25T18:13:36Z", - "archived": false, - "license": "mit", - "modified": "2018-06-04T19:14:36Z", - "authorname": "avimeens", - "skillname": "Ppt Controller Using Rasa", - "foldername": "skill-ppt-controller-using-rasa", - "name": "Ppt Controller Using Rasa", - "url": "https://github.com/avimeens/skill-ppt-controller-using-rasa", - "category": null, - "description": "Infer actions to control power point presentation. E.g. 'start a presentation', 'next slide', 'previous slide', 'end presentation'", - "short_description": "", - "branch": "master", - "examples": [ - "Open file with name mycroft.", - "Open file padatious.", - "Next slide.", - "Previous slide.", - "End presentation." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Avinash Vyas" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Ppt Controller Using Rasa Skill", - "android_handler": "skill-ppt-controller-using-rasa.avimeens.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-09-04T08:49:51Z", - "archived": false, - "license": "apache-2.0", - "modified": "2018-09-04T08:50:18Z", - "authorname": "avellent", - "skillname": "", - "foldername": "HistoryDeathSkill", - "name": "", - "url": "https://github.com/avellent/HistoryDeathSkill", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Historydeathskill Skill", - "android_handler": "HistoryDeathSkill.avellent.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-02-04T15:50:04Z", - "archived": false, - "license": "apache-2.0", - "modified": "2018-12-26T17:14:36Z", - "authorname": "Arcanesaadman15", - "skillname": "Mycroft Today in History - Event skill", - "foldername": "mycroft-skill-today-in-history", - "name": "Mycroft Today in History - Event skill", - "url": "https://github.com/Arcanesaadman15/mycroft-skill-today-in-history", - "category": null, - "description": "This skill gives back a event from today in history. It uses http://history.muffinlabs.com/#api for the results", - "short_description": "This skill gives back a event from today in history. It uses http://history.muffinlabs.com/#api for the results", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Today In History Skill", - "android_handler": "mycroft-skill-today-in-history.arcanesaadman15.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-10-06T12:37:20Z", - "archived": false, - "license": "apache-2.0", - "modified": "2018-10-06T12:39:13Z", - "authorname": "avellent", - "skillname": "", - "foldername": "SimpleTestSkill", - "name": "", - "url": "https://github.com/avellent/SimpleTestSkill", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Simpletestskill Skill", - "android_handler": "SimpleTestSkill.avellent.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-07-03T16:08:36Z", - "archived": false, - "license": "mit", - "modified": "2018-07-04T09:44:05Z", - "authorname": "estherdalley", - "skillname": "YOUR SKILL NAME", - "foldername": "skill-cookie-jar", - "name": "YOUR SKILL NAME", - "url": "https://github.com/estherdalley/skill-cookie-jar", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [ - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Cookie Jar Skill", - "android_handler": "skill-cookie-jar.estherdalley.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-06-01T00:36:09Z", - "archived": false, - "license": "mit", - "modified": "2018-06-01T01:42:19Z", - "authorname": "stuin", - "skillname": "YOUR SKILL NAME", - "foldername": "read-poem-skill", - "name": "YOUR SKILL NAME", - "url": "https://github.com/stuin/read-poem-skill", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Read Poem Skill", - "android_handler": "read-poem-skill.stuin.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-12-22T17:57:43Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-01-13T20:16:07Z", - "authorname": "makeworld-the-better-one", - "skillname": "Reddit News", - "foldername": "reddit-news-skill", - "name": "Reddit News", - "url": "https://github.com/makeworld-the-better-one/reddit-news-skill", - "category": "Information", - "description": "This skill scrapes from r/worldnews using a GET request, and then has Mycroft read five of the headlines.", - "short_description": "Reads out news headlines from r/worldnews on reddit.", - "branch": "master", - "examples": [ - "Tell me the news from reddit.", - "What's the news from reddit?", - "Any phrase with news and reddit in it.", - "Tell me the news from reddit", - "What's the news from reddit", - "Any phrase with news and reddit in it" - ], - "tags": [ - "headlines", - "news", - "Information", - "reddit", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "icon": "https://static.getjar.com/icon-50x50/ff/898732_thm.jpg", - "credits": [ - "@makeworld" - ], - "categories": [ - "Information" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Reddit News Skill", - "android_handler": "reddit-news-skill.makeworld-the-better-one.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-03-30T13:32:36Z", - "archived": false, - "license": "mit", - "modified": "2019-03-11T12:39:09Z", - "authorname": "nielstron", - "skillname": "YOUR SKILL NAME", - "foldername": "skill-icalendar", - "name": "YOUR SKILL NAME", - "url": "https://github.com/nielstron/skill-icalendar", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "dev", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "Your name" - ], - "requirements": { - "python": [ - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Icalendar Skill", - "android_handler": "skill-icalendar.nielstron.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-08-17T17:12:12Z", - "archived": false, - "license": "unknown", - "modified": "2018-08-17T17:12:36Z", - "authorname": "spinozaure", - "skillname": "YOUR SKILL NAME", - "foldername": "radio-browser-skill", - "name": "YOUR SKILL NAME", - "url": "https://github.com/spinozaure/radio-browser-skill", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Radio Browser Skill", - "android_handler": "radio-browser-skill.spinozaure.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-11-09T16:55:44Z", - "archived": false, - "license": "mit", - "modified": "2018-11-09T17:35:15Z", - "authorname": "VHeusdens", - "skillname": "YOUR SKILL NAME", - "foldername": "skill-janee", - "name": "YOUR SKILL NAME", - "url": "https://github.com/VHeusdens/skill-janee", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Janee Skill", - "android_handler": "skill-janee.vheusdens.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-03-05T14:28:13Z", - "archived": false, - "license": "mit", - "modified": "2018-03-05T14:32:45Z", - "authorname": "lakst", - "skillname": "YOUR SKILL NAME", - "foldername": "HindiHelloSkill", - "name": "YOUR SKILL NAME", - "url": "https://github.com/lakst/HindiHelloSkill", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [ - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Hindihelloskill Skill", - "android_handler": "HindiHelloSkill.lakst.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-07-27T07:37:06Z", - "archived": false, - "license": "unknown", - "modified": "2018-07-27T07:37:13Z", - "authorname": "nidaibani21", - "skillname": "Mycroft Launch", - "foldername": "mycroft-launch-skill", - "name": "Mycroft Launch", - "url": "https://github.com/nidaibani21/mycroft-launch-skill", - "category": null, - "description": "The word used after the trigger word should be taken as action and that word app should be launched on device.", - "short_description": "", - "branch": "master", - "examples": [ - "Launch app.", - "Please launch.", - "Launch.", - "Run.", - "Direct.", - "Redirect.", - "Open.", - "Take me to." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "NidaAibani" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Launch Skill", - "android_handler": "mycroft-launch-skill.nidaibani21.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-09-07T08:55:33Z", - "archived": false, - "license": "mit", - "modified": "2018-11-19T11:55:35Z", - "authorname": "davidedmundson", - "skillname": "YOUR SKILL NAME", - "foldername": "skill-samegame", - "name": "YOUR SKILL NAME", - "url": "https://github.com/davidedmundson/skill-samegame", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "Your name" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Samegame Skill", - "android_handler": "skill-samegame.davidedmundson.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-09-02T20:49:07Z", - "archived": false, - "license": "apache-2.0", - "modified": "2018-10-06T17:26:24Z", - "authorname": "avellent", - "skillname": "", - "foldername": "DeathHistorySkill", - "name": "", - "url": "https://github.com/avellent/DeathHistorySkill", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Deathhistoryskill Skill", - "android_handler": "DeathHistorySkill.avellent.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-07-04T13:32:57Z", - "archived": false, - "license": "mit", - "modified": "2018-07-04T13:33:14Z", - "authorname": "estherdalley", - "skillname": "YOUR SKILL NAME", - "foldername": "template", - "name": "YOUR SKILL NAME", - "url": "https://github.com/estherdalley/template", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [ - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Template Skill", - "android_handler": "template.estherdalley.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-03-16T21:54:38Z", - "archived": false, - "license": "mit", - "modified": "2018-05-02T01:01:08Z", - "authorname": "tohigu", - "skillname": "YOUR SKILL NAME", - "foldername": "misnomia", - "name": "YOUR SKILL NAME", - "url": "https://github.com/tohigu/misnomia", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Misnomia Skill", - "android_handler": "misnomia.tohigu.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-06-09T01:17:51Z", - "archived": false, - "license": "mit", - "modified": "2018-06-09T03:59:26Z", - "authorname": "mjmauldin", - "skillname": "YOUR SKILL NAME", - "foldername": "LogSkill", - "name": "YOUR SKILL NAME", - "url": "https://github.com/mjmauldin/LogSkill", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [ - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Logskill Skill", - "android_handler": "LogSkill.mjmauldin.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-09-28T10:10:23Z", - "archived": false, - "license": "mit", - "modified": "2019-03-26T22:09:41Z", - "authorname": "BrianArch96", - "skillname": "YOUR SKILL NAME", - "foldername": "Mycroft-assignment", - "name": "YOUR SKILL NAME", - "url": "https://github.com/BrianArch96/Mycroft-assignment", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [ - "smtplib", - "gensim", - "time", - "threading", - "bson", - "pymongo", - "re", - "json" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Assignment Skill", - "android_handler": "Mycroft-assignment.brianarch96.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-02-04T18:44:44Z", - "archived": false, - "license": "apache-2.0", - "modified": "2018-02-04T18:45:47Z", - "authorname": "Arcanesaadman15", - "skillname": "Mycroft Today in History - Event skill", - "foldername": "MySkills3", - "name": "Mycroft Today in History - Event skill", - "url": "https://github.com/Arcanesaadman15/MySkills3", - "category": null, - "description": "This skill gives back a event from today in history. It uses http://history.muffinlabs.com/#api for the results", - "short_description": "This skill gives back a event from today in history. It uses http://history.muffinlabs.com/#api for the results", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Myskills3 Skill", - "android_handler": "MySkills3.arcanesaadman15.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-07-25T21:02:04Z", - "archived": false, - "license": "unknown", - "modified": "2020-06-03T18:20:01Z", - "authorname": "mj2p", - "skillname": "Subsonic", - "foldername": "subsonic-mycroft-skill", - "name": "Subsonic", - "url": "https://github.com/mj2p/subsonic-mycroft-skill", - "category": null, - "description": "Subsonic (https://subsonic.org) is a media streaming server. this skill will interface with a preconfigured subsonic server and allow mycroft to stream media from it.", - "short_description": "", - "branch": "master", - "examples": [ - "Play me some aphex twin.", - "Sub me some music.", - "Play my tuneyards playlist.", - "Play me a radio of squarepusher.", - "Play me some squire of gothos." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "MJ2P" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Subsonic Mycroft Skill", - "android_handler": "subsonic-mycroft-skill.mj2p.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-06-06T19:20:46Z", - "archived": false, - "license": "unknown", - "modified": "2018-06-06T19:20:56Z", - "authorname": "KathyReid", - "skillname": "Feed The Corgi", - "foldername": "feed-the-corgi-skill", - "name": "Feed The Corgi", - "url": "https://github.com/KathyReid/feed-the-corgi-skill", - "category": null, - "description": "Every 24 hours, mycroft will send you a reminder to feed your corgi, and tell you what your corgi was fed the previous day, so you can provide a different delicious meal for your precious corgi.", - "short_description": "", - "branch": "master", - "examples": [ - "Have i fed the corgi today.", - "What did i feed the corgi yesterday?", - "Remind me to feed the corgi at 5pm." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "YourGitHubUserName" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Feed The Corgi Skill", - "android_handler": "feed-the-corgi-skill.kathyreid.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-03-06T08:34:23Z", - "archived": false, - "license": "mit", - "modified": "2018-03-06T08:37:10Z", - "authorname": "lakst", - "skillname": "YOUR SKILL NAME", - "foldername": "WinidoTestSKill", - "name": "YOUR SKILL NAME", - "url": "https://github.com/lakst/WinidoTestSKill", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name# mykt" - ], - "requirements": { - "python": [ - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Winidotestskill Skill", - "android_handler": "WinidoTestSKill.lakst.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-03-21T02:03:55Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2018-04-07T13:25:38Z", - "authorname": "Quinn2017", - "skillname": "Skill-Bill-and-Teds", - "foldername": "Skill-Bill-and-Teds", - "name": "Skill-Bill-and-Teds", - "url": "https://github.com/Quinn2017/Skill-Bill-and-Teds", - "category": null, - "description": "A nostalgic return to an 80s classic 'Bill and Ted'. A Mycroft skill that lets you invoke air guitar soundclip in style.", - "short_description": "A nostalgic return to an 80s classic 'Bill and Ted'. A Mycroft skill that lets you invoke air guitar soundclip in style.", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "https://github.com/KathyReid/skill-malibu-stacy" - ], - "requirements": { - "python": [ - "none" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Bill And Teds Skill", - "android_handler": "Skill-Bill-and-Teds.quinn2017.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-06-08T06:02:12Z", - "archived": false, - "license": "unknown", - "modified": "2018-06-21T22:10:44Z", - "authorname": "RdeLange", - "skillname": "Dutch Radio skill", - "foldername": "skill-dutchradio", - "name": "Dutch Radio skill", - "url": "https://github.com/RdeLange/skill-dutchradio", - "category": null, - "description": "This skill streams radio from urls.\nChange the csv to add or change channels in to your own language.\n\nAdd or change urls with streams you like from http://www.hendrikjansen.nl/henk/streaming.html\n\nIt is based upon https://github.com/forslund/mycroft-media-skills/tree/master/swedishradio", - "short_description": "This skill streams radio from urls.", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Dutchradio Skill", - "android_handler": "skill-dutchradio.rdelange.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-10-07T23:47:11Z", - "archived": false, - "license": "mit", - "modified": "2018-10-10T05:31:43Z", - "authorname": "shejuti", - "skillname": "YOUR SKILL NAME", - "foldername": "skill-state-university", - "name": "YOUR SKILL NAME", - "url": "https://github.com/shejuti/skill-state-university", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "What are the list of universities in Oklahoma?", - "What are the list of universities in Texas?", - "what are the list of universities in Oklahoma", - "what are the list of universities in Texas" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "shejuti" - ], - "requirements": { - "python": [ - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "State University Skill", - "android_handler": "skill-state-university.shejuti.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-11-09T17:36:50Z", - "archived": false, - "license": "apache-2.0", - "modified": "2018-11-13T13:53:03Z", - "authorname": "einstalek", - "skillname": "Wikipedia", - "foldername": "ru-wiki", - "name": "Wikipedia", - "url": "https://github.com/einstalek/ru-wiki", - "category": "Information", - "description": "Query [Wikipedia](https://www.wikipedia.org) for answers to all your questions. Get just a summary, or ask for more to get in-depth information.\n \n This Skill uses the [Wikimedia API](https://en.wikipedia.org/w/api.php).", - "short_description": "Wikipedia", - "branch": "master", - "examples": [ - "Tell me about Elon Musk.", - "Tell me about beans.", - "Check Wikipedia for beans.", - "Tell me about the Pembroke Welsh Corgi.", - "Search for chocolate.", - "More information.", - "Tell me More.", - "Tell me about Elon Musk", - "Tell me about beans", - "Check Wikipedia for beans", - "Tell me about the Pembroke Welsh Corgi", - "Search for chocolate", - "More information (followup after an initial summary)", - "Tell me More (followup after an initial summary)" - ], - "tags": [ - "wiki", - "query", - "wikipedia", - "encyclopedia", - "Information", - "general-knowledge", - "question", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://rawgithub.com/FortAwesome/./Font-Awesome/master/advanced-options/raw-svg/brands/wikipedia-w.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Information" - ], - "requirements": { - "python": [ - "wikipedia==1.4.0" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Ru Wiki Skill", - "android_handler": "ru-wiki.einstalek.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-12-29T11:51:10Z", - "archived": false, - "license": "mit", - "modified": "2018-12-30T16:58:32Z", - "authorname": "fandonov", - "skillname": "movie trivia", - "foldername": "movie_trivia", - "name": "movie trivia", - "url": "https://github.com/fandonov/movie_trivia", - "category": null, - "description": "With self contained db from opendb project, this skill knows lets Mycroft knows all about who plays who in what movie, directors, screen writers, etc.", - "short_description": "", - "branch": "master", - "examples": [ - "Tell me who plays in die hard.", - "Tell me who stars in the movie home alone.", - "Tell me the movie cast of the terminator.", - "Tell me who wrote the music for the movie braveheart.", - "Tell me who directed home alone.", - "tell me who plays in die hard", - "tell me who stars in the movie home alone", - "tell me the movie cast of the terminator", - "tell me who wrote the music for the movie braveheart", - "tell me who directed home alone" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Filip Andonov" - ], - "requirements": { - "python": [ - "re", - "sqlite3", - "gensim", - "os" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Movie_Trivia Skill", - "android_handler": "movie_trivia.fandonov.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-11-26T21:57:05Z", - "archived": false, - "license": "mit", - "modified": "2018-11-29T15:35:16Z", - "authorname": "Fantailed", - "skillname": "Fallback Chatbot", - "foldername": "fallback-chatbot", - "name": "Fallback Chatbot", - "url": "https://github.com/Fantailed/fallback-chatbot", - "category": "Daily", - "description": "**WARNING**: Do NOT install this skill if you aren't at least somewhat familiar with linux as it WILL break your Picroft installation!!!\nBecause of the mere size of Program-Y, there are a few incompatibilities and installation difficulties that have to be manually resolved.\nPlease read the whole description before proceeding.\n \n<br/>\nThis skill makes use of the offline Python AIML2.0 interpreter Program-Y.\n<br/><br/><br/>\n\nAt the moment, it only supports my own stupid bot called BakaBot, but adding your own bots will be supported very soon.\n\nSome dependencies of Program-Y have to be installed with a pip version prior to 10. If the automatic installation of dependencies doesn't work, try downgrading to pip 9.0.3 first:\n`pip install pip==9.0.3`.\n\nThen, install Program-Y manually using `pip install programy`.\n\nThis will break Mycroft in its current state as one of the dependencies requires `websocket-client>=0.35.0` to work. As a result, pip will update websocket-client to a version that Mycroft in turn does not support anymore. Downgrade to 0.35.0 and you should be fine:\n\n```pip install websocket-client==0.35.0```\n\nIf the lxml install fails, do the following:\n```\nsudo apt install -y libxml2-dev libxslt1-dev zlib1g-dev python3-pip\nsudo pip3 install lxml\n```\nNote that the installation of lxml can be _very_ slow on low RAM devices like the Raspberry Pi (I am talking in the order of 10min+!). If you\never doubt that it's even doing anything, open another terminal and run `htop` on it.", - "short_description": "Fallback using any offline AIML2.0 chatbot", - "branch": "master", - "examples": [ - "My name is Dave.", - "What is my name?" - ], - "tags": [ - "\\chatbot", - "\\aiml", - "Entertainment", - "Daily", - "\\aiml2.0", - "aiml2.0", - "chatbot\n\\", - "aiml\n\\", - "\\", - "no-license" - ], - "platforms": [ - "Picroft", - "Linux", - "Desktop", - "Picroft\n\nLinux" - ], - "stars": 1, - "icon": "https://rawgithub.com/FortAwesome/Font-Awesome/master/advanced-options/raw-svg/solid/robot.svg", - "credits": [ - "Conny Lin @Fantailed" - ], - "categories": [ - "Daily", - "Entertainment" - ], - "requirements": { - "python": [ - "programy", - "websocket-client==0.35.0", - "pip<=10.0.0" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Fallback Chatbot Skill", - "android_handler": "fallback-chatbot.fantailed.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-01-28T02:01:38Z", - "archived": false, - "license": "unlicense", - "modified": "2018-01-28T02:05:14Z", - "authorname": "mason88", - "skillname": "Federal Closings", - "foldername": "skill-federal-closings", - "name": "Federal Closings", - "url": "https://github.com/mason88/skill-federal-closings", - "category": null, - "description": "This is a Mycroft AI skill which tells the user of any federal government closings in DC as they are listed in the official OPM alerts.", - "short_description": "", - "branch": "master", - "examples": [ - "Are there federal closings?", - "Are there government closings?", - "are there federal closings?", - "are there government closings?" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Mason Lee" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Federal Closings Skill", - "android_handler": "skill-federal-closings.mason88.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-07-16T14:55:52Z", - "archived": false, - "license": "mit", - "modified": "2018-08-14T21:39:13Z", - "authorname": "avimeens", - "skillname": "Rasa Robot Controller", - "foldername": "skill-rasa-robot-controller", - "name": "Rasa Robot Controller", - "url": "https://github.com/avimeens/skill-rasa-robot-controller", - "category": null, - "description": "In order to provide voice interance for controlling a robot on Mycroft, this skill provides intent processing to understand basic commands such as \"move\", \"go\", \"stop\", \"turn\" using RasaNLU as the intent processor.", - "short_description": "", - "branch": "master", - "examples": [ - "Move 10 feet forward.", - "Turn 45 degrees to your right.", - "Go back 3 meters.", - "Store your current location.", - "Stop." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Avinash Vyas" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Rasa Robot Controller Skill", - "android_handler": "skill-rasa-robot-controller.avimeens.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-05-13T08:56:08Z", - "archived": false, - "license": "mit", - "modified": "2018-05-15T13:30:14Z", - "authorname": "rasika-chandana", - "skillname": "YOUR SKILL NAME", - "foldername": "TeaSkill", - "name": "YOUR SKILL NAME", - "url": "https://github.com/rasika-chandana/TeaSkill", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [ - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Teaskill Skill", - "android_handler": "TeaSkill.rasika-chandana.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-01-15T23:27:54Z", - "archived": false, - "license": "apache-2.0", - "modified": "2018-02-01T13:35:34Z", - "authorname": "tjoen", - "skillname": "Trivia skill", - "foldername": "skill-trivia", - "name": "Trivia skill", - "url": "https://github.com/tjoen/skill-trivia", - "category": null, - "description": "At the moment, the skill will ask you 5 questions. You can answer by choosing 1,2,3 or 4.", - "short_description": "", - "branch": "master", - "examples": [ - "Let's play trivia.", - "Hey Mycroft, let's play trivia" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Theun Kohlbeck, https://github.com/tjoen\nSteen Bentall, https://github.com/barricados" - ], - "requirements": { - "python": [ - "HTMLParser" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Trivia Skill", - "android_handler": "skill-trivia.tjoen.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-04-11T02:11:55Z", - "archived": false, - "license": "apache-2.0", - "modified": "2018-04-11T02:13:24Z", - "authorname": "dleweyiv", - "skillname": "Weather", - "foldername": "weather-skill", - "name": "Weather", - "url": "https://github.com/dleweyiv/weather-skill", - "category": null, - "description": "Get weather conditions, forecasts, expected precipitation and more! By default it will tell\nyou about your default location, or you can ask for other cities around the world. Current\nconditions and weather forecasts come from [Open Weather Map](https://openweathermap.org).\n\nFor devices with screen support, conditions are briefly shown.", - "short_description": "", - "branch": "master", - "examples": [ - "What is the weather?", - "What is the forecast tommorow?", - "What is the weather going to be like Tuesday?", - "What is the weather in San Francisco?", - "When will it rain next?", - "How windy is it?", - "What's the humidity?" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Mycroft AI" - ], - "requirements": { - "python": [ - "requests==2.13.0", - "pyowm==2.6.1", - "multi-key-dict==2.0.3" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Weather Skill", - "android_handler": "weather-skill.dleweyiv.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-05-07T16:54:42Z", - "archived": false, - "license": "mit", - "modified": "2018-05-08T06:47:09Z", - "authorname": "rasika-chandana", - "skillname": "YOUR SKILL NAME", - "foldername": "TestSkill", - "name": "YOUR SKILL NAME", - "url": "https://github.com/rasika-chandana/TestSkill", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [ - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Testskill Skill", - "android_handler": "TestSkill.rasika-chandana.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-04-11T02:15:55Z", - "archived": false, - "license": "unknown", - "modified": "2018-04-11T02:16:35Z", - "authorname": "dleweyiv", - "skillname": "Date and Time", - "foldername": "date-time-skill", - "name": "Date and Time", - "url": "https://github.com/dleweyiv/date-time-skill", - "category": null, - "description": "Get the local time or time for major cities around the world. Times\nare given in 12-hour (2:30 pm) or 24-hour format (14:30) based on the\nTime Format setting at [Home](https://home.mycroft.ai/#/setting/basic)\n\nTime can optionally be shown on a display, like a digital clock. See\nthe [skill setting](https://home.mycroft.ai/#/skill).", - "short_description": "", - "branch": "master", - "examples": [ - "What time is it?", - "What time is it in Paris?", - "Show me the time.", - "What's the date?", - "Tell me the day of the week.", - "Show me the time", - "Tell me the day of the week" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Mycroft AI" - ], - "requirements": { - "python": [ - "tzlocal==1.3", - "pytz==2017.2", - "astral==1.4" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Date Time Skill", - "android_handler": "date-time-skill.dleweyiv.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-03-18T03:11:53Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2018-04-06T00:23:56Z", - "authorname": "Quinn2017", - "skillname": "Write to Google-Spreadsheets Skill", - "foldername": "skill-google-spreadsheet", - "name": "Write to Google-Spreadsheets Skill", - "url": "https://github.com/Quinn2017/skill-google-spreadsheet", - "category": null, - "description": "This Mycroft skill is still a work in progress. It is meant to allow you to create and dictate to your Google Spreadsheet using Pygsheets.", - "short_description": "This Mycroft skill is still a work in progress. It is meant to allow you to create and dictate to your Google Spreadsheet using Pygsheets.", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "pygsheets==1.1.4" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Google Spreadsheet Skill", - "android_handler": "skill-google-spreadsheet.quinn2017.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-03-23T01:26:36Z", - "archived": false, - "license": "mit", - "modified": "2018-03-23T01:50:00Z", - "authorname": "stuartlangridge", - "skillname": "Birmingham tech events", - "foldername": "bio-calendar-mycroft", - "name": "Birmingham tech events", - "url": "https://github.com/stuartlangridge/bio-calendar-mycroft", - "category": null, - "description": "A list of tech events happening in Birmingham UK over the next few days. Powered by [the Birmingham.IO calendar](https://calendar.birmingham.io), and using the same back end as the similar [Alexa Flash Briefing skill](https://www.kryogenix.org/days/2017/07/05/birmingham-tech-events-in-the-alexa-flash-briefing/).", - "short_description": "", - "branch": "master", - "examples": [ - "List upcoming Birmingham tech events.", - "Tell me about Brum tech meetups.", - "What tech events are there in Birmingham soon?", - "List upcoming Birmingham tech events", - "Tell me about Brum tech meetups" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Stuart Langridge <sil@kryogenix.org>, @sil on twitter, https://kryogenix.org" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Bio Calendar Mycroft Skill", - "android_handler": "bio-calendar-mycroft.stuartlangridge.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-05-02T20:19:11Z", - "archived": false, - "license": "mit", - "modified": "2018-05-02T20:32:28Z", - "authorname": "nautik1", - "skillname": "YOUR SKILL NAME", - "foldername": "skill-start-app", - "name": "YOUR SKILL NAME", - "url": "https://github.com/nautik1/skill-start-app", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [ - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Start App Skill", - "android_handler": "skill-start-app.nautik1.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-09-26T16:40:22Z", - "archived": false, - "license": "mit", - "modified": "2018-09-27T16:34:25Z", - "authorname": "martinbentenrieder", - "skillname": "Soundcloud-Skill", - "foldername": "skill-soundcloud", - "name": "Soundcloud-Skill", - "url": "https://github.com/martinbentenrieder/skill-soundcloud", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Play Spectralist on Soundcloud.", - "Listen to Joseph Disco on Soundcloud.", - "Stop Soundcloud.", - "Play Spectralist on Soundcloud", - "Listen to Joseph Disco on Soundcloud", - "Stop Soundcloud" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [ - "soundcloud", - "gensim", - "python-vlc" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Soundcloud Skill", - "android_handler": "skill-soundcloud.martinbentenrieder.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-03-23T21:47:40Z", - "archived": false, - "license": "mit", - "modified": "2018-03-24T18:25:53Z", - "authorname": "stuartlangridge", - "skillname": "One Before Last", - "foldername": "one-before-last-mycroft", - "name": "One Before Last", - "url": "https://github.com/stuartlangridge/one-before-last-mycroft", - "category": null, - "description": "Answer true or false trivia questions, but with a twist: you have to answer not the question you've just been asked, but the one before that. Get it wrong three times and you lose.", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "https://freesound.org/people/FunWithSound/sounds/394899/", - "https://freesound.org/people/Autistic%20Lucario/sounds/142608/", - "https://freesound.org/people/LittleRainySeasons/sounds/335908/", - "https://freesound.org/people/plasterbrain/sounds/397354/" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "One Before Last Mycroft Skill", - "android_handler": "one-before-last-mycroft.stuartlangridge.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-06-11T09:41:42Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2018-06-22T15:25:44Z", - "authorname": "ITISEnricoFermi", - "skillname": "Mycroft Fermi IoT skill", - "foldername": "mycroft-ai-skill", - "name": "Mycroft Fermi IoT skill", - "url": "https://github.com/ITISEnricoFermi/mycroft-ai-skill", - "category": null, - "description": "Reprehenderit proident sunt ea non occaecat veniam. Ipsum sit cupidatat anim ea. Incididunt aute consequat eu incididunt magna ut mollit cupidatat culpa. Exercitation proident sunt in Lorem incididunt laboris magna. Quis et est ex ut sint velit est quis dolore cillum. Veniam fugiat velit amet nulla quis sint aliqua et ad eu duis magna nostrud elit. Commodo enim laboris Lorem enim reprehenderit ex excepteur dolore deserunt.", - "short_description": "", - "branch": "master", - "examples": [ - "Turn on the lights.", - "Switch on the light.", - "Turn off the light.", - "Switch off the lights.", - "Turn on the lights", - "Switch on the light", - "Turn off the light", - "Switch off the lights" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Ai Skill", - "android_handler": "mycroft-ai-skill.itisenricofermi.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-05-04T16:20:27Z", - "archived": false, - "license": "mit", - "modified": "2018-06-19T18:08:27Z", - "authorname": "jrwarwick", - "skillname": "Corporate I T F A Q", - "foldername": "skill-corporate-i-t-f-a-q", - "name": "Corporate I T F A Q", - "url": "https://github.com/jrwarwick/skill-corporate-i-t-f-a-q", - "category": null, - "description": "Every corporation will have a different answer to \"what is the wifi password\", and this is also a very frequently asked and answered question. Allow Mycroft to help with the FAQ load by teaching him the answers to these very common inquiries.\n\nCurrently, VPN is assumed to be an SSL or similar type delivered with a web-based login.", - "short_description": "", - "branch": "master", - "examples": [ - "What is the wifi password?", - "What is the corporate VPN URL?", - "What is the kerberos domain name?", - "Who is the IT manager?!?" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "jrwarwick" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Corporate I T F A Q Skill", - "android_handler": "skill-corporate-i-t-f-a-q.jrwarwick.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-01-28T10:26:37Z", - "archived": false, - "license": "mit", - "modified": "2018-01-28T10:32:33Z", - "authorname": "Uks2", - "skillname": "PROJECT_NAME skill", - "foldername": "webSkill", - "name": "PROJECT_NAME skill", - "url": "https://github.com/Uks2/webSkill", - "category": null, - "description": "This skill does ...\n\nTo get this done we need\n - This\n - That\n - The other thing", - "short_description": "This skill does ...", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Webskill Skill", - "android_handler": "webSkill.uks2.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-06-13T15:23:53Z", - "archived": false, - "license": "unknown", - "modified": "2018-08-09T20:57:08Z", - "authorname": "asalekin", - "skillname": "", - "foldername": "AsifMycroftTest", - "name": "", - "url": "https://github.com/asalekin/AsifMycroftTest", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Asifmycrofttest Skill", - "android_handler": "AsifMycroftTest.asalekin.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-10-25T17:28:01Z", - "archived": false, - "license": "unknown", - "modified": "2018-10-26T14:05:41Z", - "authorname": "leolivier", - "skillname": "My Greetings", - "foldername": "my-greetings-skill", - "name": "My Greetings", - "url": "https://github.com/leolivier/my-greetings-skill", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [ - "Greetings.", - "Hello.", - "How are you." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "ol" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "My Greetings Skill", - "android_handler": "my-greetings-skill.leolivier.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-11-23T11:31:13Z", - "archived": false, - "license": "mit", - "modified": "2018-11-23T22:04:28Z", - "authorname": "HackYourOffice", - "skillname": "smart beer skill", - "foldername": "skill-smartbeer", - "name": "smart beer skill", - "url": "https://github.com/HackYourOffice/skill-smartbeer", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "HackYourOffice" - ], - "requirements": { - "python": [ - "gensim", - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Smartbeer Skill", - "android_handler": "skill-smartbeer.hackyouroffice.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-06-05T09:18:54Z", - "archived": false, - "license": "license by usia mueller", - "modified": "2018-06-23T10:34:18Z", - "authorname": "r4z4c", - "skillname": "showondisplay", - "foldername": "skill-my-alarm", - "name": "showondisplay", - "url": "https://github.com/r4z4c/skill-my-alarm", - "category": null, - "description": "Display date an my OLED Screen for my alarm.", - "short_description": "", - "branch": "master", - "examples": [ - "Show me the time on display.", - "Start display.", - "show me the time on display", - "start display" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Uffi" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "My Alarm Skill", - "android_handler": "skill-my-alarm.r4z4c.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-10-09T20:42:58Z", - "archived": false, - "license": "unknown", - "modified": "2019-02-02T06:15:45Z", - "authorname": "JarbasAl", - "skillname": "The Hitchhiker's Guide to the Galaxy", - "foldername": "hhgg-game-skill", - "name": "The Hitchhiker's Guide to the Galaxy", - "url": "https://github.com/JarbasAl/hhgg-game-skill", - "category": "Entertainment", - "description": "Play this classic Infocom game from the [Interactive Fiction Archive](http://www.ifarchive.org/). Peek into the history of gaming, experiencing some of the very earliest examples of interactive worlds using only text -- but this time using your voice!\n\n### Original Infocom Description\n![](http://infocom.elsewhere.org/gallery/hhgttg/front_th.jpg)\n\nAs the story begins, you are Arthur Dent, and a bulldozer is preparing to level your house even as an alien space fleet is preparing to level your planet. The incorrigible Mr. Adams has written new material and designed problems, especially for this interactive story. So grab a pint of bitter and a couple for the road and join Ford Prefect, Trillian, Zaphod Beeblebrox and Marvin on a cosmic jaunt into the outer reaches where anything can -- and does -- happen. And don't forget your towel!\n\nExample Gameplay:\n\n``play hitchiker guide``\n\n> you wake up\n> the room is spinning very gently round your head\n> or at least it would be if you could see it which you can't\n>\n> it is pitch black\n>\n>\n\n``turn on light``\n\n> good start to the day\n> pity it's going to be the worst one of your life\n>\n> the light is now on\n> bedroom, in the bed the bedroom is a mess\n> it is a small bedroom with a faded carpet and old wallpaper\n> there is a washbasin, a chair with a tatty dressing gown slung over it, and a window with the curtains drawn\n> near the exit leading south is a phone\n> there is a flathead screwdriver here\n> (outside the bed) there is a toothbrush here.", - "short_description": "[![Donate with Bitcoin](https://en.cryptobadges.io/badge/micro/1QJNhKM8tVv62XSUrST2vnaMXh5ADSyYP8)](https://en.cryptobadges.io/donate/1QJNhKM8tVv62XSUrST2vnaMXh5ADSyYP8) [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://paypal.me/jarbasai) [![Say Thanks!](https://img.shields.io/badge/Say%20Thanks-!-1EAEDB.svg)](https://saythanks.io/to/JarbasAl) Enjoy the classic Infocom adventure", - "branch": "master", - "examples": [ - "Play Hitchhiker's Guide to the Galaxy.", - "Save.", - "Resume Hitchhiker's Guide." - ], - "tags": [ - "infocom", - "Entertainment", - "game", - "adventure", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Hhgg Game Skill", - "android_handler": "hhgg-game-skill.jarbasal.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-02-02T15:17:56Z", - "archived": false, - "license": "mit", - "modified": "2018-02-02T15:19:35Z", - "authorname": "mkonsti", - "skillname": "PROJECT_NAME skill", - "foldername": "mp3_playback_skill", - "name": "PROJECT_NAME skill", - "url": "https://github.com/mkonsti/mp3_playback_skill", - "category": null, - "description": "This skill illustrates a very simple MP3 music player. It works by loading\nMP3 files from the /mp3 subfolder using the format: song_title.mp3", - "short_description": "This skill illustrates a very simple MP3 music player. It works by loading", - "branch": "master", - "examples": [ - "Attribution - No Derivative Works.", - "Nd/3.0/legalcode." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mp3_Playback_Skill Skill", - "android_handler": "mp3_playback_skill.mkonsti.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-07-22T21:44:18Z", - "archived": false, - "license": "unknown", - "modified": "2018-09-08T19:54:29Z", - "authorname": "pcwii", - "skillname": "", - "foldername": "mute-skill", - "name": "", - "url": "https://github.com/pcwii/mute-skill", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mute Skill", - "android_handler": "mute-skill.pcwii.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-10-09T20:16:33Z", - "archived": false, - "license": "unknown", - "modified": "2019-02-02T06:15:44Z", - "authorname": "JarbasAl", - "skillname": "Starcross", - "foldername": "starcross-game-skill", - "name": "Starcross", - "url": "https://github.com/JarbasAl/starcross-game-skill", - "category": "Entertainment", - "description": "![](http://infocom.elsewhere.org/gallery/starcross/starcross1.jpg)\n\nUpon docking with the strange craft, you must succeed in gaining entry to its mysterious interior. Once within, you will encounter a microcosm of the galaxy, peopled with both harmful and helpful beings. But the great starship serves a far larger purpose than mere cultural exchange. It bears a challenge that was issued eons ago, from light-years away- and only you can meet it.", - "short_description": "", - "branch": "master", - "examples": [ - "Play star cross.", - "Save.", - "Resume star cross." - ], - "tags": [ - "Entertainment", - "cave", - "game", - "adventure", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Starcross Game Skill", - "android_handler": "starcross-game-skill.jarbasal.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-04-09T21:39:14Z", - "archived": false, - "license": "unknown", - "modified": "2019-01-10T18:21:30Z", - "authorname": "JarbasAl", - "skillname": "Enclosure Control", - "foldername": "skill-enclosure-ctrl", - "name": "Enclosure Control", - "url": "https://github.com/JarbasAl/skill-enclosure-ctrl", - "category": null, - "description": "This skill can be used to trigger changes in the enclosure.", - "short_description": "", - "branch": "master", - "examples": [ - "Look up.", - "Look down.", - "Look left.", - "Look right.", - "Look left and right.", - "Look up and down.", - "Reset enclosure.", - "Narrow your eyes.", - "Spin your eyes.", - "Blink your eyes.", - "Perform system reboot.", - "System mute.", - "System unmute.", - "Smile animation.", - "Listen animation.", - "Think animation." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Enclosure Ctrl Skill", - "android_handler": "skill-enclosure-ctrl.jarbasal.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-12-26T20:26:04Z", - "archived": false, - "license": "unknown", - "modified": "2019-09-25T15:32:47Z", - "authorname": "praduk", - "skillname": "Pradu", - "foldername": "pradu-skill", - "name": "Pradu", - "url": "https://github.com/praduk/pradu-skill", - "category": null, - "description": "Pradu's custom skills.", - "short_description": "", - "branch": "master", - "examples": [ - "Goals.", - "Schedule.", - "What's next?", - "Add goal." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Pradu Kannan" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Pradu Skill", - "android_handler": "pradu-skill.praduk.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-05-02T23:45:40Z", - "archived": false, - "license": "unknown", - "modified": "2018-06-11T12:34:51Z", - "authorname": "reaperjudge", - "skillname": "helloword", - "foldername": "skill-email", - "name": "helloword", - "url": "https://github.com/reaperjudge/skill-email", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Email Skill", - "android_handler": "skill-email.reaperjudge.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-02-27T01:06:09Z", - "archived": false, - "license": "unknown", - "modified": "2020-01-15T22:54:15Z", - "authorname": "patalanov", - "skillname": "image recognition skill", - "foldername": "image_recog_skill", - "name": "image recognition skill", - "url": "https://github.com/patalanov/image_recog_skill", - "category": null, - "description": "Recognize contents of images using caffe bvlc_googlenet, 1000 categories available", - "short_description": "Recognize contents of images using caffe bvlc_googlenet, 1000 categories available", - "branch": "master", - "examples": [ - "Recognize test image.", - "Visualize a random layer (may takeup to 1 hour)", - "Fuzzy match your name to best availabel class and visualize it." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "imgurpython", - "scipy", - "PIL", - "fuzzywuzzy", - "numpy" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Image_Recog_Skill Skill", - "android_handler": "image_recog_skill.patalanov.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-02-17T06:53:50Z", - "archived": false, - "license": "apache-2.0", - "modified": "2018-02-17T06:57:50Z", - "authorname": "pranavlal", - "skillname": "EchoUtteranceSkill", - "foldername": "skill-echo-utterance", - "name": "EchoUtteranceSkill", - "url": "https://github.com/pranavlal/skill-echo-utterance", - "category": null, - "description": "#What this skill does\nThis skill speaks back what ever you have said. It outputs this data via speech and a HTTP post request on port 15000. There is a parameter called spoken which has the utterances. You can grab this request using a do_POST method in a server. The POST URL is http://localhost:15000. I got the idea for this skill from a friend who runs a travel company catering to the disabled. She wanted me to create a speech to sign language converter. I then subsequently thought that it would be easier to create a mechanism to output spoken text. I expect this skill to be used in conferences etc. However, it has not been tested in the field.", - "short_description": "#What this skill does", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "idna==2.6", - "jsondatabase==0.1.7", - "future==0.16.0", - "python-dateutil==2.6.1", - "SpeechRecognition==3.8.1", - "chatterbot-corpus==1.0.1", - "chardet==3.0.4", - "pymongo==3.5.1", - "oauthlib==2.0.6", - "ruamel.yaml==0.15.0", - "requests-oauthlib==0.8.0", - "python-twitter==3.3", - "remi==0.1", - "SQLAlchemy==1.1.14", - "requests==2.18.4", - "urllib3==1.22", - "six==1.11.0", - "PyAudio==0.2.11", - "certifi==2017.7.27.1", - "ChatterBot==0.7.6", - "nltk==3.2.5" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Echo Utterance Skill", - "android_handler": "skill-echo-utterance.pranavlal.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-10-14T18:06:08Z", - "archived": false, - "license": "unknown", - "modified": "2018-10-20T21:32:19Z", - "authorname": "syner1", - "skillname": "Magic Mirror Mycroft Skill", - "foldername": "mycroft-mm-boot", - "name": "Magic Mirror Mycroft Skill", - "url": "https://github.com/syner1/mycroft-mm-boot", - "category": null, - "description": "This skill allows the user to turn off, start, restart Magic Mirror (tested on Rpi) gracefully, with a voice confirmation (yes).", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Mm Boot Skill", - "android_handler": "mycroft-mm-boot.syner1.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-02-22T22:43:14Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-06-05T15:06:37Z", - "authorname": "bw3740", - "skillname": "KC Streetcar", - "foldername": "wally-kc-streetcar", - "name": "KC Streetcar", - "url": "https://github.com/bw3740/wally-kc-streetcar", - "category": null, - "description": "Based on a configurable static stop, this skill retrieves the number of minutes until the next streetcars arrive in either the North or South directions.\n\nInformation is provided free-of-charge from http://www.kc-metro.com/tmwebwatch/LiveArrivalTimes. This page, with a routeID and directionID, makes to POST calls to http://www.kc-metro.com/tmwebwatch/Arrivals.aspx/getStops to get a list of stops and http://www.kc-metro.com/tmwebwatch/Arrivals.aspx/getStopTimes to get the arrival times for a specific stop. Keep in mind some intersections have 2 stops, so direction matters.\n\nThis skill is still in it's early stages of development. With the planned expansions of the line, there will be tweaks needed. This is for the good of the KC and Mycroft communities, so please add/suggest new features.", - "short_description": "", - "branch": "master", - "examples": [ - "Kc street car at third.", - "Kansas city streetcar at ninth heading north." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "Brad Walters & Matt Burke" - ], - "requirements": { - "python": [ - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Wally Kc Streetcar Skill", - "android_handler": "wally-kc-streetcar.bw3740.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-07-21T05:32:02Z", - "archived": false, - "license": "mit", - "modified": "2020-03-02T15:19:52Z", - "authorname": "jberger", - "skillname": "WFMT Classical Music Stream", - "foldername": "skill-wfmt", - "name": "WFMT Classical Music Stream", - "url": "https://github.com/jberger/skill-wfmt", - "category": null, - "description": "Skill written by [Joel Berger](https://github.com/jberger).\nThe author is not affiliated with WFMT, this skill is not official in any way.", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [ - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Wfmt Skill", - "android_handler": "skill-wfmt.jberger.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-10-09T19:13:48Z", - "archived": false, - "license": "unknown", - "modified": "2019-02-02T06:15:43Z", - "authorname": "JarbasAl", - "skillname": "Station Fall", - "foldername": "station-fall-game-skill", - "name": "Station Fall", - "url": "https://github.com/JarbasAl/station-fall-game-skill", - "category": "Entertainment", - "description": "![](http://infocom.elsewhere.org/gallery/stationfall/stationfall1.jpg)\n\nSure, you were promoted to Lieutenant First Class, but this only meant that your dull life of cleaning grotch cages was replaced by an equally dull life of paperwork. Now you've got another assignment tailor- made for a grotchbrain: pilot a spacetruck to a nearby station to pick up a load of trivial forms. Trot and double trot!", - "short_description": "", - "branch": "master", - "examples": [ - "Play station fall.", - "Save.", - "Resume station fall." - ], - "tags": [ - "Entertainment", - "cave", - "game", - "adventure", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Station Fall Game Skill", - "android_handler": "station-fall-game-skill.jarbasal.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-12-14T14:08:22Z", - "archived": false, - "license": "unknown", - "modified": "2018-12-14T18:30:41Z", - "authorname": "forslund", - "skillname": "", - "foldername": "skill-tap-to-talk", - "name": "", - "url": "https://github.com/forslund/skill-tap-to-talk", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Tap To Talk Skill", - "android_handler": "skill-tap-to-talk.forslund.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-05-01T02:01:45Z", - "archived": false, - "license": "unknown", - "modified": "2018-06-11T12:33:38Z", - "authorname": "reaperjudge", - "skillname": "Skill-backtalk", - "foldername": "skill-hey-google", - "name": "Skill-backtalk", - "url": "https://github.com/reaperjudge/skill-hey-google", - "category": null, - "description": "To backtalk people (to pratice my programming)", - "short_description": "To backtalk people (to pratice my programming)", - "branch": "hey-google", - "examples": [ - "Good morning.", - "Good afternoon.", - "Good evening.", - "Don't backtalk me.", - "Backtalk.", - "This is sparta.", - "good morning", - "good afternoon", - "good evening", - "don't backtalk me", - "backtalk", - "this is sparta" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Hey Google Skill", - "android_handler": "skill-hey-google.reaperjudge.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-06-09T14:23:51Z", - "archived": false, - "license": "unknown", - "modified": "2019-07-12T10:49:14Z", - "authorname": "martymulligan", - "skillname": "", - "foldername": "skill-podcast-butler", - "name": "", - "url": "https://github.com/martymulligan/skill-podcast-butler", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "pyPodcastParser", - "python-vlc", - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Podcast Butler Skill", - "android_handler": "skill-podcast-butler.martymulligan.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-11-20T17:03:24Z", - "archived": false, - "license": "unknown", - "modified": "2018-11-20T17:04:39Z", - "authorname": "eyecreate", - "skillname": "Magnatune Music", - "foldername": "magnatune-music-skill", - "name": "Magnatune Music", - "url": "https://github.com/eyecreate/magnatune-music-skill", - "category": null, - "description": "Tries to find music matching words given on Magnatune and streams the closest album matching.", - "short_description": "", - "branch": "master", - "examples": [ - "Play Analog Disease from magnatune.", - "Stop music.", - "Play music by Dr. Kuch from magnatune." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "eyecreate" - ], - "requirements": { - "python": [ - "xdg", - "sqlalchemy" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Magnatune Music Skill", - "android_handler": "magnatune-music-skill.eyecreate.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-03-07T03:19:43Z", - "archived": false, - "license": "mit", - "modified": "2018-04-01T01:12:51Z", - "authorname": "JosiahDub", - "skillname": "Gpb News", - "foldername": "skill-gpb-news", - "name": "Gpb News", - "url": "https://github.com/JosiahDub/skill-gpb-news", - "category": null, - "description": "Streams the latest news from Georgia Public Broadcasting.", - "short_description": "", - "branch": "master", - "examples": [ - "Play gpb.", - "Play georgia public broadcasting." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Josiah White" - ], - "requirements": { - "python": [ - "feedparser", - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Gpb News Skill", - "android_handler": "skill-gpb-news.josiahdub.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-03-09T15:56:12Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2018-12-25T07:15:28Z", - "authorname": "merspieler", - "skillname": "irc-skill", - "foldername": "irc-skill", - "name": "irc-skill", - "url": "https://github.com/merspieler/irc-skill", - "category": null, - "description": "Mycroft skill that lets you use IRC via voice commands.\n\nThis skill is not considered done.\n_NOTE_: Developent has been currently stoped due to personal reasons. Merge Requests will still be accepted.", - "short_description": "", - "branch": "master", - "examples": [ - "Connect to irc.", - "Join irc channel.", - "Send irc message.", - "Part from irc channel.", - "Disconnect from irc server.", - "Enable irc debug.", - "Disable irc debug.", - "*Note** settings are set in the.", - "Server.", - "Server.", - "Port.", - "Ssl.", - "Server-password.", - "Proxy (Only socks proxys are supported)", - "Proxy.", - "Proxy-port.", - "Proxy-user.", - "Proxy-passwd.", - "User.", - "User.", - "Password.", - "Channel.", - "Channel.", - "Channel-password.", - "Enable irc debug.", - "Disable irc debug.", - "connect to irc Connect to the server.", - "join irc channel Join the channel.", - "send irc message Send a message.", - "part from irc channel Leave the channel.", - "disconnect from irc server Disconnect from the server.", - "enable irc debug To enter debug mode.", - "disable irc debug To leave debug mode.", - "Server", - "User", - "Channel", - "Enable irc debug Enables debug mode. This will print useful information for debugging and **every** message recived. This includes messages like the PING message.", - "Disable irc debug Disables debug mode and goes back to normal output." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "" - ], - "requirements": { - "python": [ - "pysocks" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Irc Skill", - "android_handler": "irc-skill.merspieler.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-04-29T22:51:39Z", - "archived": false, - "license": "unknown", - "modified": "2018-06-11T12:32:18Z", - "authorname": "reaperjudge", - "skillname": "helloword", - "foldername": "helloword", - "name": "helloword", - "url": "https://github.com/reaperjudge/helloword", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Helloword Skill", - "android_handler": "helloword.reaperjudge.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-05-08T01:11:00Z", - "archived": false, - "license": "unknown", - "modified": "2018-06-11T12:38:01Z", - "authorname": "reaperjudge", - "skillname": "Skill-picture", - "foldername": "skill-pictures-failed-", - "name": "Skill-picture", - "url": "https://github.com/reaperjudge/skill-pictures-failed-", - "category": null, - "description": "To to a picture", - "short_description": "To to a picture", - "branch": "master", - "examples": [ - "Snap.", - "snap" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Pictures Failed Skill", - "android_handler": "skill-pictures-failed-.reaperjudge.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-05-05T16:27:02Z", - "archived": false, - "license": "mit", - "modified": "2018-05-05T18:53:55Z", - "authorname": "kjbrandstatter", - "skillname": "Shopping List", - "foldername": "skill-shopping-list", - "name": "Shopping List", - "url": "https://github.com/kjbrandstatter/skill-shopping-list", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [ - "Add item to list." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Kevin Brandstatter" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Shopping List Skill", - "android_handler": "skill-shopping-list.kjbrandstatter.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-07-15T18:39:25Z", - "archived": false, - "license": "mit", - "modified": "2018-07-15T20:20:08Z", - "authorname": "lhannon", - "skillname": "Decide", - "foldername": "mycroftfallbackdecideskill", - "name": "Decide", - "url": "https://github.com/lhannon/mycroftfallbackdecideskill", - "category": null, - "description": "Given a choice between two options, this skill randomly chooses one.", - "short_description": "", - "branch": "master", - "examples": [ - "Who is going to win the game between the National League and the American League?", - "Should I eat pizza or sushi?", - "Should I wear a dress shirt or tee?", - "Decide red or black.", - "Decide red or black" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Laurie Hannon,\nPrincipal Consultant,\nSoftSource Consulting" - ], - "requirements": { - "python": [ - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroftfallbackdecideskill Skill", - "android_handler": "mycroftfallbackdecideskill.lhannon.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-02-03T02:24:57Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2018-02-03T22:33:34Z", - "authorname": "UncleSnail", - "skillname": "Variety Controller", - "foldername": "variety-controller", - "name": "Variety Controller", - "url": "https://github.com/UncleSnail/variety-controller", - "category": null, - "description": "Voice commands for the Variety Linux desktop background. Variety must be installed for this skill to work correctly\nCommands include:\n\"Next background\"\n\"Previous background\"\n\"Fast forward background\"\n\"Add background to favorites\"\n\"Move background to trash\"\n\"Pause background playback\"\n\"Play background playback\"\n\"Toggle background playback\"\n\"Next quote\"\n\"Previous quote\"\n\"Fast forward quote\"\n\"Add quote to favorites\"\n\"Toggle quote playback\"\n\"Quit Variety\"\n\"Open Variety preferences\"\n\"Show background history\"\n\"Show Variety downloads\"\n\"Variety version\"", - "short_description": "", - "branch": "master", - "examples": [ - "Next desktop background.", - "Add this wallpaper to my favorites.", - "Open wallpaper history.", - "Next desktop background", - "Add this wallpaper to my favorites", - "Open wallpaper history" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Uncle Snail\nBased on kfezer's \"skill_template\"" - ], - "requirements": { - "python": [ - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Variety Controller Skill", - "android_handler": "variety-controller.unclesnail.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-07-15T15:57:46Z", - "archived": false, - "license": "unknown", - "modified": "2018-08-06T23:54:47Z", - "authorname": "Kholdan", - "skillname": "WOL Skill", - "foldername": "mycroft-WOL", - "name": "WOL Skill", - "url": "https://github.com/Kholdan/mycroft-WOL", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [ - "Power on' + target.", - "Boot' + target.", - "Bootup' + target.", - "Start' + target.", - "Startup' + target.", - "'power on' + target", - "'boot' + target", - "'bootup' + target", - "'start' + target", - "'startup' + target" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Wol Skill", - "android_handler": "mycroft-WOL.kholdan.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-01-08T19:14:27Z", - "archived": false, - "license": "mit", - "modified": "2018-01-08T19:18:56Z", - "authorname": "JamesPoole", - "skillname": "Gimlet Podcast Skill", - "foldername": "skill-gimlet-podcasts", - "name": "Gimlet Podcast Skill", - "url": "https://github.com/JamesPoole/skill-gimlet-podcasts", - "category": null, - "description": "This skill allows you to listen to podcasts from the Gimlet network", - "short_description": "This skill allows you to listen to podcasts from the Gimlet network", - "branch": "master", - "examples": [ - "Play the latest episode of the startup podcast.", - "Play the gimlet podcast reply all.", - "Play an episode of the crimetown podcast.", - "play the latest episode of the startup podcast", - "play the gimlet podcast reply all", - "play an episode of the crimetown podcast" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "feedparser==5.2.1" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Gimlet Podcasts Skill", - "android_handler": "skill-gimlet-podcasts.jamespoole.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-09-28T10:05:40Z", - "archived": false, - "license": "mit", - "modified": "2019-03-25T14:34:12Z", - "authorname": "BrianArch96", - "skillname": "UL Timetable", - "foldername": "Mycroft-timetable", - "name": "UL Timetable", - "url": "https://github.com/BrianArch96/Mycroft-timetable", - "category": "Daily", - "description": "This skill allows a student, using their personal University of Limerick student ID, to request details about their timetable. Via this skill, a user can request details for a given day or period of a day.\nThe skill also allows student to request details about modules such as the full name of the module and it's primary lecturer.\n\nCurrent timetable and module information comes from the official [University of Limerick Timetable Site](https://www.timetable.ul.ie/) which is available to the public.\n\nOnce pulled, the Skill starts with my own Student ID. This can be changed with the following command:\n\n``` Student 1234567```\n\nOnce it's been successfully changed, you can then use the **Timetable Skill** with your own Student ID.", - "short_description": "Request details about a specific UL student timetable", - "branch": "master", - "examples": [ - "What is my first class on Monday?", - "What is my next lecture?", - "Where is my next class?", - "Tell me about module CS1234.", - "What is my third class tomorrow?", - "What is my last lecture on Friday?", - "Have I lectures tomorrow?", - "Have I lectures today?", - "Student 1234567." - ], - "tags": [ - "limerick", - "university", - "student", - "Configuration", - "Information", - "Daily", - "timetable", - "college", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/book.svg", - "credits": [ - "Brian Archbold(@BrianArch96)" - ], - "categories": [ - "Daily", - "Configuration", - "Information" - ], - "requirements": { - "python": [ - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Timetable Skill", - "android_handler": "Mycroft-timetable.brianarch96.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-04-01T01:21:20Z", - "archived": false, - "license": "mit", - "modified": "2018-04-06T01:43:17Z", - "authorname": "JosiahDub", - "skillname": "State Representative", - "foldername": "skill-state-representative", - "name": "State Representative", - "url": "https://github.com/JosiahDub/skill-state-representative", - "category": null, - "description": "Provide your state or zip code and the skill can give you your congressperon and senator's names.", - "short_description": "", - "branch": "master", - "examples": [ - "Who are my congresspeople in 90210?", - "Who are my senators in Rhode Island?" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Josiah White" - ], - "requirements": { - "python": [ - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "State Representative Skill", - "android_handler": "skill-state-representative.josiahdub.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2018-12-24T01:31:23Z", - "archived": false, - "license": "unknown", - "modified": "2019-02-08T01:05:09Z", - "authorname": "KCAstromechs", - "skillname": "", - "foldername": "skill-astro-pit", - "name": "", - "url": "https://github.com/KCAstromechs/skill-astro-pit", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [ - "bs4" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Astro Pit Skill", - "android_handler": "skill-astro-pit.kcastromechs.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-08-20T04:11:20Z", - "archived": false, - "license": "mit", - "modified": "2020-09-07T11:57:30Z", - "authorname": "jamesmf", - "skillname": "rasa-chat", - "foldername": "skill-rasa-chat", - "name": "rasa-chat", - "url": "https://github.com/jamesmf/skill-rasa-chat", - "category": null, - "description": "The package Rasa is a nice fit for Mycroft, as it allows you to build conversational agents without handing over your data to a third-party service. This package is designed to hit the Rasa REST endpoints and speak the resultant messages.\n\nTo start a chat, say \"chat with bot\" and to end it, say \"stop\"\n\nOnce you're chatting, this skill will override most Mycroft functionality, and you will be in a conversation with the Rasa bot until you end the chat or are silent too long.", - "short_description": "", - "branch": "master", - "examples": [ - "Chat with bot.", - "Talk to rasa.", - "Stop.", - "chat with bot", - "talk to rasa", - "stop" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 3, - "credits": [ - "jamesmf" - ], - "requirements": { - "python": [ - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Rasa Chat Skill", - "android_handler": "skill-rasa-chat.jamesmf.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-05-19T20:32:03Z", - "archived": false, - "license": "mit", - "modified": "2020-07-03T22:04:20Z", - "authorname": "colla69", - "skillname": "PlexMusic-Skill", - "foldername": "plexmusic-skill", - "name": "PlexMusic-Skill", - "url": "https://github.com/colla69/plexmusic-skill", - "category": null, - "description": "<img src=\"https://assets.pcmag.com/media/images/517012-plex-logo.png?width=333&height=245\" align=\"right\">\n\n### Description\n\nThis Mycroft skill can play music from your plex media server with speech commands.\n\n### Requirements\n you will need access to a plex media server and a working version of the vlc player.\n \n ##### how to get vlc:\n Debian/Ubuntu `sudo apt install vlc` \n CentOs `sudo yum install vlc` \n Arch/Manjaro `sudo pacman -S vlc` \n \n### Install\n `msm install https://github.com/colla69/plexmusic-skill.git`\n \n### Examples\n - \"Hey mycroft, play mockingbird!\"\n - \"Hey mycroft, play eminem!\"\n - \"Hey mycroft, play album meteora\"\n \n### Functions\n - Play *song|artist|album name*\n - Play *artist name* \n - Play *album name* \n - Play *playlist name* \n - Pause music\n - Resume music\n - Next|Skip\n - Reload|Refresh library \n\n### Usage\n Once you have installed the skill, go to https://account.mycroft.ai/skills and find the Plex Music Skill.<br>\n Please fill in the 3 fields:\n - plex uri (address of your PlexMediaServer, it has to be reachable on port 32400)\n <br>e.G. http://my.plex.address \n - plex token (for info visit https://support.plex.tv/articles/204059436-finding-an-authentication-token-x-plex-token/)\n <br>e.G. ys738s6uPWXpwabc4sRYe\n - Library name in plex (the name of the library to play the music from)\n <br>e.G. Music\n \n Alternative config (mycroft.conf):<br>\n ```json\n \"plexmusic-skill\": {\n \"musicsource\": \"http://my.plex.address\",\n \"plextoken\": \"ys738s6uPWXpwabc4sRYe\", \n \"plexlib\": \"music\", \n \"ducking\": true\n }\n ```\n \n \n The first intallation will need to download all your library metadata and will save it in a JSON file. \n (~/.config/plexSkill/data.json) <br> \n The process will take a long time, don't panic, you can watch it load if you have debug=True in your config. \n\n### Credits\ncolla69", - "short_description": "<img src=\"https://assets.pcmag.com/media/images/517012-plex-logo.png?width=333&height=245\" align=\"right\">", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 7, - "requirements": { - "python": [ - "plexapi", - "fuzzywuzzy", - "python-Levenshtein" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Plexmusic Skill", - "android_handler": "plexmusic-skill.colla69.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-07-26T21:18:14Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-08-28T04:46:37Z", - "authorname": "gras64", - "skillname": "Wake Word", - "foldername": "wake-word-skill", - "name": "Wake Word", - "url": "https://github.com/gras64/wake-word-skill", - "category": "Configuration", - "description": "wakeword is only a few times spoken and bad detection sorted out. you could not do that through speech. i have thought about it and make a skill.\nThis skill should make it easier for everyone to use their own precise wake words and make it possible for everyone. you can also turn on a small webserver to check your audiofiles at http://mycroft_ip:8082", - "short_description": "Just train a new wakeword", - "branch": "master", - "examples": [ - "I want to call you christopher.", - "Install wakeword source.", - "You still do not understand me correctly.", - "I want to create my own model to Christopher.", - "I want to upload my wakeword Christopher.", - "I train 12 wacke word Christopher.", - "I train 12 no wacke word Christopher.", - "I want to call you christopher", - "install wakeword source", - "You still do not understand me correctly", - "I want to create my own model to Christopher", - "I want to upload my wakeword Christopher", - "I train 12 wacke word Christopher", - "I train 12 no wacke word Christopher" - ], - "tags": [ - "Configuration", - "word", - "Wake", - "Productivity", - "Wake word", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 6, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "gras64" - ], - "categories": [ - "Configuration", - "Productivity" - ], - "requirements": { - "python": [ - "psutil==5.2.1", - "fitipy==0.1.2", - "py7zr", - "wget" - ], - "system": { - "all": "python3-pip libopenblas-dev python3-scipy cython libhdf5-dev python3-h5py portaudio19-dev ffmpeg hdf5-helpers libaec-dev libaec0 libatlas3-base libhdf5-100 libhdf5-cpp-100 libopenblas-base libsz2 python3-decorator python3-numpy" - }, - "skill": [] - }, - "android": { - "android_icon": null, - "android_name": "Wake Word Skill", - "android_handler": "wake-word-skill.gras64.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-04-04T18:34:10Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-10-07T16:49:07Z", - "authorname": "lb803", - "skillname": "List Manager", - "foldername": "list-manager-skill", - "name": "List Manager", - "url": "https://github.com/lb803/list-manager-skill", - "category": "Productivity", - "description": "*List Manager* is a simple utility for filing lists of things you don't want to forget.\nWhether these are titles of books to read, the specs of your new bike, or random thoughts for a new programming project; you can ask [Mycroft](https://mycroft.ai/) to create a list for each them!", - "short_description": "Access and manage lists with Mycroft", - "branch": "master", - "examples": [ - "What lists do I have?", - "What's on my important list?", - "Add a new list called travel plans.", - "Add coffee to my shopping list.", - "Remove my finals list.", - "Remove return books to the library from my today list." - ], - "tags": [ - "Productivity", - "Notes", - "Note-taking", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 4, - "credits": [ - "Luca Baffa (@lb803)" - ], - "categories": [ - "Productivity" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "List Manager Skill", - "android_handler": "list-manager-skill.lb803.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-01-28T13:41:45Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-08-24T13:10:52Z", - "authorname": "builderjer", - "skillname": "Movie Master", - "foldername": "moviemaster", - "name": "Movie Master", - "url": "https://github.com/builderjer/moviemaster", - "category": "Entertainment", - "description": "Easily find information about a movie with your voice.", - "short_description": "Find information about movies, actors and production details.", - "branch": "master", - "examples": [ - "What is the movie _______ about?", - "Tell me about the movie _______", - "Who plays in the movie _______?", - "What genres does the flick _______ belong to?", - "Look for information on the movie _______.", - "What company made the movie _______?", - "When was the movie _______ made?", - "Do you have info on the film _______?", - "What are popular movies playing now?", - "What films do you recommend like _______?", - "How long is the movie _______?", - "What are the highest rated movies out?" - ], - "tags": [ - "I", - "Movies", - "Mark", - "Entertainment", - "Actors", - "TMDB", - "Mark I", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "icon": "PrimaryLogo_Green.png", - "categories": [ - "Entertainment" - ], - "credits": [ - "This skill uses tmdbv3api avaliable on GitHub at [tmdbv3api](https://github.com/AnthonyBloomer/tmdbv3api.git)\n\nIt also uses the TMDb API but is not endorsed or certified by TMDb. Information avaliable at [TMDb](https://www.themoviedb.org/)\n\nbuilderjer@github.com" - ], - "requirements": { - "python": [ - "tmdbv3api" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Moviemaster Skill", - "android_handler": "moviemaster.builderjer.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-02-18T03:34:21Z", - "archived": false, - "license": "mit", - "modified": "2020-06-17T04:03:24Z", - "authorname": "dwfalk", - "skillname": "rhythmbox-skill", - "foldername": "rhythmbox-skill", - "name": "rhythmbox-skill", - "url": "https://github.com/dwfalk/rhythmbox-skill", - "category": "Entertainment", - "description": "Let Mycroft help you control Rhythmbox. When asked Mycroft interfaces with Rhythmbox to play selections from your music library.", - "short_description": "RhythmboxSkill for Mycroft", - "branch": "master", - "examples": [ - "Play rock.", - "Play **", - "Play ** playlist.", - "Play something by **", - "Shuffle **", - "Refresh Rhythmbox database.", - "Pause.", - "Resume.", - "Next song.", - "Previous song.", - "Stop Rhythmbox.", - "Play some music by Huey Lewis and the News.", - "Play Feelin' Alright by Joe Cocker.", - "Play Greatist Hits album by Heart.", - "Shuffle Greatest Hits album by Fleetwood Mac.", - "play rock - plays any genre with rock in it (e.g. rock, rock/pop, rock/country)", - "play ** - plays closest match (genre/artist/album/song)", - "play ** playlist - by playlist", - "play something by ** - by artist", - "shuffle ** - plays closest match (playlist/album)", - "refresh Rhythmbox database - pull in any recently added playlists", - "pause", - "resume", - "next song", - "previous song", - "stop Rhythmbox", - "play some music by Huey Lewis and the News", - "play Feelin' Alright by Joe Cocker", - "play Greatist Hits album by Heart", - "shuffle Greatest Hits album by Fleetwood Mac" - ], - "tags": [ - "rhythmbox", - "songs", - "To", - "music", - "install:", - "~/mycroft-core/bin/mycroft-msm", - "Entertainment", - "skill", - "https://github.com/dwfalk/rhythmbox-skill", - "install", - "mycroft", - "skill\n\nTo install:\n~/mycroft-core/bin/mycroft-msm install https://github.com/dwfalk/rhythmbox-skill", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 3, - "credits": [ - "@dwfalk - Base project\n@gras64 - German Translations\n@unwisebard - Ability to search/play by genre" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [ - "fuzzywuzzy>=0.17.0" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Rhythmbox Skill", - "android_handler": "rhythmbox-skill.dwfalk.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-12-21T13:58:30Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-04-28T07:51:42Z", - "authorname": "pcwii", - "skillname": "Mesh", - "foldername": "mesh-skill", - "name": "Mesh", - "url": "https://github.com/pcwii/mesh-skill", - "category": "IoT", - "description": "A flock of Seagulls, a pride of Lions, a swarm of Bees, and a \"mesh of Mycrofts\".\n\nThis skill utilizes the lightweight MQTT messaging protocol to connect a group (\"mesh\") of Mycroft units together. The skill has the ability to send messages (intercom) and commands (messagebus) to one or more remote Mycroft units.\n1. Each Mycroft unit has the ability to publish both Mycroft requests and responses to the the MQTT broker.\nThe MQTT Topics for this communication is...\n * ```<base_topic>/RemoteDevices/deviceUUID/request```\n * ```<base_topic>/RemoteDevices/deviceUUID/response```\n2. The deviceUUID is a unique ID created from the MAC of the sending Mycroft unit.\n*This is intended to be a general MQTT broadcast and can be subscribed to by any MQTT client (ie. Home Assistant?).\n3. Each Mycroft unit has it's own Device Name (location_id) that can be set in the web interface.\n4. The Mycroft unit will automatically subscribe to all messages sent to it's own Device Name (location_id).\n * ```<base_topic>/RemoteDevices/<location_id>```\n * The <location_id> is automatically obtained from the Mycroft Device Settings web page...\n ![location_id](/images/location_id.png)\n * location id's are automatically converted to lowercase to avoid confusion\n \n5. When a message is sent from any Mycroft unit, the message will be published to \"Mycroft/RemoteDevices/location_id\".\n6. The destination location_id is specified in the skill dialog.\n7. The message payload will contain the following Json...\n * ```{\"source\":\"<source_location_id>\", \"message\":\"is dinner ready yet\"}```", - "short_description": "send MQTT messages and commands between multiple mycroft.ai devices.", - "branch": "master", - "examples": [ - "Send a remote message.", - "Send a remote command.", - "Send a remote message", - "Send a remote command" - ], - "tags": [ - "IoT", - "remote", - "MQTT", - "mesh", - "connect", - "HA", - "Homeassistant", - "control", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 7, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/broadcast-tower.svg", - "credits": [ - "pcwii" - ], - "categories": [ - "IoT" - ], - "requirements": { - "python": [ - "paho-mqtt", - "websockets" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mesh Skill", - "android_handler": "mesh-skill.pcwii.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-03-01T04:07:56Z", - "archived": false, - "license": "mit", - "modified": "2020-08-04T17:10:12Z", - "authorname": "johnbartkiw", - "skillname": "TuneIn", - "foldername": "mycroft-skill-tunein", - "name": "TuneIn", - "url": "https://github.com/johnbartkiw/mycroft-skill-tunein", - "category": "Entertainment", - "description": "Search and stream live sports, music, news, podcasts, and internet radio from around the world\nusing TuneIn", - "short_description": "Search and stream live sports, music, news, podcasts, and internet radio from around the world", - "branch": "master", - "examples": [ - "Play KEXP (on|with|using) tune in.", - "Play Jack FM radio.", - "Play Jazz 24 internet radio.", - "Play 80s Metal radio (on|with|using) tune in.", - "Play 70s Country internet radio (on|with|using) tune in.", - "Play KEXP (on|with|using) tune in ", - "Play Jack FM radio", - "Play Jazz 24 internet radio", - "Play 80s Metal radio (on|with|using) tune in", - "Play 70s Country internet radio (on|with|using) tune in" - ], - "tags": [ - "Tune", - "streaming", - "stream", - "in", - "radio", - "Entertainment", - "TuneIn", - "Tune in", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 8, - "icon": "tunein.png", - "credits": [ - "John Bartkiw" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [ - "python-vlc", - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Tunein Skill", - "android_handler": "mycroft-skill-tunein.johnbartkiw.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-08-30T14:35:02Z", - "archived": false, - "license": "mit", - "modified": "2020-10-07T16:42:52Z", - "authorname": "ChanceNCounter", - "skillname": "Dismissal", - "foldername": "dismissal-skill", - "name": "Dismissal", - "url": "https://github.com/ChanceNCounter/dismissal-skill", - "category": "Configuration", - "description": "Allows you to dismiss Mycroft verbally, in case of accidental activation, or if you change your mind. By default, Mycroft will confirm this action, but there is a setting to disable verbal feedback, accessible over the web interface.", - "short_description": "Dismisses Mycroft", - "branch": "master", - "examples": [ - "Nevermind.", - "Dismissed.", - "Forget it.", - "Go away.", - "nevermind", - "dismissed", - "forget it", - "go away" - ], - "tags": [ - "Configuration", - "basic", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 3, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/meh-blank.svg", - "credits": [ - "@ChanceNCounter\n@krisgesling\n@AIDungeonWiXAnon" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Dismissal Skill", - "android_handler": "dismissal-skill.chancencounter.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-05-14T09:12:36Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-05-13T22:24:08Z", - "authorname": "AIIX", - "skillname": "Skill-Gui-Example", - "foldername": "Skill-Gui-Examples", - "name": "Skill-Gui-Example", - "url": "https://github.com/AIIX/Skill-Gui-Examples", - "category": "Information", - "description": "Example skill to showcase Mycroft GUI supported delegates and skill displays", - "short_description": "Mycroft GUI Showcase Examples", - "branch": "master", - "examples": [ - "Show Examples Menu.", - "Show Simple Text Example.", - "Show Simple Image Example.", - "Show Paginated Text Example.", - "Show Sliding Image Example.", - "Show Proportional Delegate Example.", - "Show Vertical Cards List Example.", - "Show Horizontal Cards List Example.", - "Show Lottie Animation Example.", - "Show Event System Example.", - "Show Audio Player Example.", - "Show Examples Menu", - "Show Simple Text Example", - "Show Simple Image Example", - "Show Paginated Text Example", - "Show Sliding Image Example", - "Show Proportional Delegate Example", - "Show Vertical Cards List Example", - "Show Horizontal Cards List Example", - "Show Lottie Animation Example", - "Show Event System Example", - "Show Audio Player Example" - ], - "tags": [ - "mycroftgui", - "sample", - "mycroft-gui", - "gui", - "Information", - "delegates", - "example", - "no-license" - ], - "platforms": [ - "platform_mark2", - "platform_plasmoid" - ], - "stars": 4, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/user-astronaut.svg", - "categories": [ - "Information" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Gui Examples Skill", - "android_handler": "Skill-Gui-Examples.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-06-06T15:14:27Z", - "archived": false, - "license": "unknown", - "modified": "2020-07-21T11:26:56Z", - "authorname": "JarbasAl", - "skillname": "Local Speech", - "foldername": "local-speech-skill", - "name": "Local Speech", - "url": "https://github.com/JarbasAl/local-speech-skill", - "category": "Configuration", - "description": "Using kaldi it will perform offline speech recognition 24/7\n\npre approved commands will be broadcast to messagebus\n\nalso works as a wake word spotter, multiple wake words supported at the same time\n\nwake words will trigger mycroft's speech client\n\nedit your configuration at \"~/.kaldi_spotter/kaldi_spotter.conf\" or add/remove hotwords at home.mycroft.ai, see [kaldi_spotter](https://github.com/JarbasAl/kaldi_spotter) for configuration details", - "short_description": "Listens offline for wake words and pre-defined speech commands", - "branch": "master", - "examples": [], - "tags": [ - "Configuration", - "mic", - "offline", - "STT", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 7, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/microphone-alt.svg", - "credits": [ - "JarbasAI (@jarbasal)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [ - "kaldi_spotter" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Local Speech Skill", - "android_handler": "local-speech-skill.jarbasal.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-02-26T01:42:23Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-06T00:37:11Z", - "authorname": "MycroftAI", - "skillname": "IoT Control", - "foldername": "skill-iot-control", - "name": "IoT Control", - "url": "https://github.com/MycroftAI/skill-iot-control", - "category": "IoT", - "description": "This Skill doesn't do anything by itself, but it provides an important common language for controlling Internet of Things (IoT) or Smart Home devices. By handling simple phrases like 'turn on', this one Skill can unify multiple other Skills that act as the interface into specific IoT devices or control ecosystems. This creates uniform and seamless interactions for the user!", - "short_description": "Smart home device unification", - "branch": "master", - "examples": [ - "Turn on the lights.", - "Turn down the heat.", - "Unlock the front door.", - "Turn on the lights", - "Turn down the heat", - "Unlock the front door" - ], - "tags": [ - "IoT", - "system", - "iot", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/lightbulb.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "IoT" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Iot Control Skill", - "android_handler": "skill-iot-control.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-01-03T15:37:35Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-04-07T11:34:00Z", - "authorname": "luke5sky", - "skillname": "Speedtest", - "foldername": "speedtest-skill", - "name": "Speedtest", - "url": "https://github.com/luke5sky/speedtest-skill", - "category": "Daily", - "description": "Run a speedtest with Mycroft.\nThis skill uses the speedtest-cli (https://github.com/sivel/speedtest-cli) which runs an internet bandwidth test using speedtest.net.\n\nBe aware that this speedtest relies on the capability of the network-adapter of your Mycroft device.\n\nExamples for Raspberry Pi: \n\nIf a Raspberry Pi 3 B - connected to WiFi - runs Mycroft you won't get more than 40 Mbit/s from the speedtest despite your internet connection may have more bandwith.\nRaspberry Pi 3 B onboard WiFi: max. ~40 Mbit/s, onboard LAN: max. ~100 Mbit/s \n * Raspberry Pi 3 B+ onboard WiFi: max. ~100 Mbit/s, onboard LAN: max. ~225 Mbit/s", - "short_description": "Ask Mycroft to run a simple speedtest.", - "branch": "master", - "examples": [ - "Run a speedtest.", - "Hey mycroft, run a speedtest" - ], - "tags": [ - "IoT", - "speed", - "bandwith", - "ínternet", - "Productivity", - "Information", - "Daily", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/signal.svg", - "credits": [ - "Lukas Gangel (@luke5sky)" - ], - "categories": [ - "Daily", - "Information", - "IoT", - "Productivity" - ], - "requirements": { - "python": [ - "speedtest-cli" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Speedtest Skill", - "android_handler": "speedtest-skill.luke5sky.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-01-10T03:26:14Z", - "archived": false, - "license": "unknown", - "modified": "2019-02-09T14:03:43Z", - "authorname": "JarbasAl", - "skillname": "Good Manners Enforcer", - "foldername": "skill-good-manners", - "name": "", - "url": "https://github.com/JarbasAl/skill-good-manners", - "category": "Daily", - "description": "### Acknowledge and Appreciate Good Manners in Others\nManners are reciprocal. If someone holds a door, say thank you. If you need something from\na grocery shelf, and someone else is in the way, say \"excuse me, please.\" Or ask them\n\"could you please hand me a box of that cereal?\" and then thank them.\n\n### Why Do We Need Manners?\nManners make the world go 'round. They are to the smooth functioning of society as oil is\nto an engine.\nWithout good manners, people get offended, hurt, and in extreme cases, very bad manners\ncan lead to things such as the all-too-familiar public shootings, and even wars between\ncountries when some official protocol is snubbed.\n\nThis skill monitor utterances and reprimand insults / foul language, show appreciation for good manners\n\n “hey mycroft, play the news please”\n news play\n “hey mycroft, can you please tell me a joke”\n chuck norris joke\n “hey mycroft, please tell me the price of bitcoin”\n bitcoin price\n you have really good manners, i like you\n \"hey mycroft, You are a disgusting maggot of a person.\"\n sorry, i don't know how to answer that\n you shouldn't be rude\n \"hey mycroft, what the fuck is this shit\"\n sorry, i don't know how to answer that\n fuck and shit are such ugly words\n \"hey mycroft, can you please check the fucking asshole weather\"\n current weather is something\n avoid using the words fucking and asshole, makes you look bad\n\nfor best insult detection also install in the venv the Insults package (py3 fork)\n\n pip install git+https://github.com/nguyentr17/Insults", - "short_description": "[![Donate with Bitcoin](https://en.cryptobadges.io/badge/micro/1QJNhKM8tVv62XSUrST2vnaMXh5ADSyYP8)](https://en.cryptobadges.io/donate/1QJNhKM8tVv62XSUrST2vnaMXh5ADSyYP8)", - "branch": "master", - "examples": [ - "go F#&K yourself", - "eat sh1$ and die", - "please something (X times in a row)" - ], - "tags": [ - "goodmanners", - "Entertainment", - "Daily", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "icon": "goodmanner.png", - "credits": [ - "@JarbasAl" - ], - "categories": [ - "Daily", - "Entertainment" - ], - "requirements": { - "python": [ - "ai_demos", - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Good Manners Skill", - "android_handler": "skill-good-manners.jarbasal.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-04-05T23:08:52Z", - "archived": false, - "license": "unknown", - "modified": "2019-12-18T05:19:22Z", - "authorname": "clszz6", - "skillname": "White Noise", - "foldername": "white-noise-skill", - "name": "White Noise", - "url": "https://github.com/clszz6/white-noise-skill", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "White Noise Skill", - "android_handler": "white-noise-skill.clszz6.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-06-11T16:51:38Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-06-12T17:30:42Z", - "authorname": "fractal13", - "skillname": "My First Skill", - "foldername": "skill-my-first-skill", - "name": "My First Skill", - "url": "https://github.com/fractal13/skill-my-first-skill", - "category": null, - "description": "There are several word phrases to activate this skill. The list\nof possible responses is different depending on activation phrase.", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "[Coding Zendo](https://github.com/fractal13)" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "My First Skill", - "android_handler": "skill-my-first-skill.fractal13.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-07-28T12:05:26Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-21T17:59:51Z", - "authorname": "domcross", - "skillname": "Severe Weather Information", - "foldername": "severe-weather-information-skill", - "name": "Severe Weather Information", - "url": "https://github.com/domcross/severe-weather-information-skill", - "category": "Daily", - "description": "The severe weather information skills can connect to many weather alerting services (as long as they are implementing the [Common Alert Protocol](https://en.wikipedia.org/wiki/Common_Alerting_Protocol))\n\nAmong them many from following lists:\n\n[severe weather information center](https://severeweather.wmo.int/v2/sources.html)\n\n[alerting world weather](https://alerting.worldweather.org/)\n\n[meteoalarm](http://meteoalarm.eu/)\n\nAfter installation go to home.mycroft.ai and select your preferred weather service from the list on the skills configuration page.\n\nAsk \"are there weather alerts?\" to check for new alerts.\n\nYou can also set a \"watchdog\" that automatically checks for new alerts and notifies you...", - "short_description": "Checks your national weather service and notifies you when there are alerts for your region", - "branch": "master", - "examples": [ - "Are there weather alerts.", - "Are there weather alerts" - ], - "tags": [ - "Essentials", - "alert", - "Severe", - "Information", - "Daily", - "Weather", - "weather", - "Weather alert", - "Severe weather", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 3, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/bolt.svg", - "credits": [ - "Dominik (github: domcross)" - ], - "categories": [ - "Daily", - "Information", - "Weather", - "Essentials" - ], - "requirements": { - "python": [ - "Shapely", - "xmltodict", - "feedparser", - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Severe Weather Information Skill", - "android_handler": "severe-weather-information-skill.domcross.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-01-16T08:01:08Z", - "archived": false, - "license": "unknown", - "modified": "2019-01-22T11:32:38Z", - "authorname": "BhavikKatyal", - "skillname": "Hello World", - "foldername": "mycroft-skill-today-in-history", - "name": "Hello World", - "url": "https://github.com/BhavikKatyal/mycroft-skill-today-in-history", - "category": "Daily", - "description": "This is a basic Hello Word Skill that takes an _Utterance_ from the user and provides a voice response - a _Dialog_. This Skill demonstrates the basic directory and file structure of a Mycroft Skill, and is a good first Skill to study if you are interested in developing Skills for the Mycroft ecosystem.\n\nIf you want to write **Skills** for Mycroft, Documentation is available:\n\n* [Mycroft Skills Kit](https://mycroft.ai/documentation/skills/msk/)\n* [Developing a new Skill](https://mycroft.ai/documentation/skills/introduction-developing-skills/)\n* [Skill Settings](https://mycroft.ai/documentation/skills/skill-settings/)\n* [Automatic testing of your Mycroft Skill](https://mycroft.ai/documentation/skills/automatic-testing/)\n* [Skill Acceptance Process](https://mycroft.ai/documentation/skills/skills-acceptance-process/)\n* [Mycroft Skills Manager](https://mycroft.ai/documentation/msm/)\n* [Mycroft Message Bus](https://mycroft.ai/documentation/message-bus/)", - "short_description": "Introductory Skill so that Skill Authors can see how a Mycroft Skill is put together", - "branch": "master", - "examples": [ - "Hello world.", - "How are you?", - "Thank you." - ], - "tags": [ - "first-skill", - "helloworld", - "hello", - "Daily", - "greeting", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Today In History Skill", - "android_handler": "mycroft-skill-today-in-history.bhavikkatyal.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-01-04T10:25:15Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-15T14:25:55Z", - "authorname": "luke5sky", - "skillname": "Telegram Spam Skill", - "foldername": "telegram-spam-skill", - "name": "Telegram Spam Skill", - "url": "https://github.com/luke5sky/telegram-spam-skill", - "category": "IoT", - "description": "You need to create a telegram bot (via BotFather) and save the Bot Token, your ChatID and your MyCroft Device name on home.mycroft.ai under skill settings.\nAfter this restart your MyCroft Unit.\nYou can now commmunicate with your MyCroft Unit via this bot.\n\nSettings:\n\nDetailed HowTo:\n\n\nOpen Telegram App on your smartphone, click on the search symbol in the upper right corner<br/>\nSearch for BotFather and click on it<br/>\nNow type /newbot hit enter<br/>\nBotfather should reply with: Alright, a new bot. How are we going to call it? please chosse a name for your bot.<br/>\nGive your bot a displayname like Mycroft<br/>\nBotfather should reply with: Good. Now let's choose a username for your bot. It must end in bot. Like this, for example: TetrisBot or tetris-bot.<br/>\nGive your bot unique username like lukesmycroftbot<br/>\nBotfather should now give you your token for this bot<br/>\nSave this token and don't post it online or send it to people, safety first!<br/>\n\nTelegram documentation on botfather: https://core.telegram.org/bots#6-botfather\n\n\n\n\n\n It should respond with: This is your ChatID: YOURCHATID\nBOT TOKEN (MANDATORY): Your bot token you got from BotFather\n * MYCROFT DEVICE NAME (MANDATORY): Your Device name you configured on home.mycroft.ai - Devices - Registered Devices\n * USERNAME (OPTIONAL): You do not need to put anything here, the skill does not use this field. It is only for yourself to know which Chat ID belongs to whom\n * CHAT ID (MANDATORY): You will get your Chat ID from the Telegram-Skill if you have configured BOT TOKEN (first field) and MYCROFT DEVICE NAME, saved and then write anything to the bot.\n * Install this skill on your Mycroft Device\n * Create a telegram bot:\n * Go to home.mycroft.ai - skills and search for the telegram-skills settings\n * Copy/paste your token botfather gave you in the field BOT TOKEN (MANDATORY)\n * Copy/paste your device name from home.mycroft.ai - devices in MYCROFT DEVICE NAME (MANDATORY)\n * SAVE and wait till the settings are synced to your Mycroft Unit (or reboot your device to trigger the sync)\n * Open Telegram App on your smartphone and search (upper right corner) for your bot (username or displayname) click on it and write test or hello to your bot\n * Copy/paste this under CHAT ID (MANDATORY)\n * reboot your device to trigger the sync\n * Your bot should send you this welcome message: Telegram-Skill on Mycroft Unit YOURUNIT is loaded and ready to use", - "short_description": "A skill to connect a telegram bot to MyCroft. [THIS SKILL IS NOT GETTING ANY UPDATES!]", - "branch": "master", - "examples": [], - "tags": [ - "IoT", - "bot", - "telegram-bot", - "messenger", - "Productivity", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/brands/telegram-plane.svg", - "credits": [ - "Lukas Gangel (@luke5sky)" - ], - "categories": [ - "IoT", - "Productivity" - ], - "requirements": { - "python": [ - "python-telegram-bot" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Telegram Spam Skill", - "android_handler": "telegram-spam-skill.luke5sky.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-02-03T18:26:11Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-12-18T05:19:40Z", - "authorname": "andlo", - "skillname": "Andersen's Fairy Tales", - "foldername": "hcandersen-skill", - "name": "Andersen's Fairy Tales", - "url": "https://github.com/andlo/hcandersen-skill", - "category": "Entertainment", - "description": "This skill enables Mycroft to tell H. C. Andersen's Fairy Tales. So enjoy these good stories from the famious Danish auhtor.\n\nContent is from andersenstories.com, so please go visit there if you like the stories and want them in text to read.\n\nhttps://www.andersenstories.com/\n\n_“If you want your children to be intelligent, read them fairy tales. If you want them to be more\nintelligent, read them more fairy tales.”\nAlbert Einstein_", - "short_description": "Mycroft tells H. C. Andersen's Fairy Tales", - "branch": "master", - "examples": [ - "Tell a H. C. Andersen storie.", - "Tell me the H. C. Andersen story The Little Match Girl.", - "Continue H. C. Andersen story.", - "Tell a H. C. Andersen storie", - "Tell me the H. C. Andersen story The Little Match Girl", - "Continue H. C. Andersen story" - ], - "tags": [ - "fairy", - "stories", - "fairytale", - "fairytales", - "hca", - "Entertainment", - "tales", - "andersen", - "story", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "icon": "story-512.png", - "credits": [ - "Andreas Lorensen (@andlo)" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [ - "bs4" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Hcandersen Skill", - "android_handler": "hcandersen-skill.andlo.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-03-08T00:10:33Z", - "archived": false, - "license": "mit", - "modified": "2020-06-12T22:30:46Z", - "authorname": "johnbartkiw", - "skillname": "mycroft-skill-iheartradio", - "foldername": "mycroft-skill-iheartradio", - "name": "mycroft-skill-iheartradio", - "url": "https://github.com/johnbartkiw/mycroft-skill-iheartradio", - "category": "Entertainment", - "description": "Search and stream internet radio using IHeartRadio", - "short_description": "Search and stream internet radio using IHeartRadio", - "branch": "master", - "examples": [ - "Play KEXP (on|with|using) I Heart Radio.", - "Play Jack FM radio.", - "Play Jazz 24 internet radio.", - "Play 80s Metal radio (on|with|using) I Heart Radio.", - "Play 70s Country internet radio (on|with|using) I Heart Radio.", - "Play KEXP (on|with|using) I Heart Radio", - "Play Jack FM radio", - "Play Jazz 24 internet radio", - "Play 80s Metal radio (on|with|using) I Heart Radio", - "Play 70s Country internet radio (on|with|using) I Heart Radio" - ], - "tags": [ - "streaming", - "stream", - "IHeartRadio", - "radio", - "Entertainment", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "John Bartkiw" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [ - "python-vlc", - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Iheartradio Skill", - "android_handler": "mycroft-skill-iheartradio.johnbartkiw.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-05-20T06:21:22Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-06T00:37:22Z", - "authorname": "MycroftAI", - "skillname": "Development Status", - "foldername": "mycroft-precise-trainer", - "name": "Development Status", - "url": "https://github.com/MycroftAI/mycroft-precise-trainer", - "category": null, - "description": "This skill uses tranfer learning to train a precise model that is tuned to one or multiple people's voice.", - "short_description": "", - "branch": "master", - "examples": [ - "Train precise for my voice.", - "Make a custom precise model for my voice." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Mycroft AI" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Precise Trainer Skill", - "android_handler": "mycroft-precise-trainer.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-01-11T11:22:37Z", - "archived": false, - "license": "apache-2.0", - "modified": "2019-10-10T17:20:52Z", - "authorname": "smearumi", - "skillname": "Dictionary", - "foldername": "mycroft-dictionary", - "name": "Dictionary", - "url": "https://github.com/smearumi/mycroft-dictionary", - "category": "Daily", - "description": "You can find out the definition/meaning of a specific word from dictionary using Oxford Dictionaries API.", - "short_description": "Find out the definition/meaning of a specific word from dictionary.", - "branch": "master", - "examples": [ - "Define cat.", - "Define the cat.", - "define cat", - "define the cat" - ], - "tags": [ - "home", - "dictionary", - "Productivity", - "Information", - "voice", - "skill", - "assistant", - "Daily", - "mycroft", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/book.svg", - "credits": [ - "S. M. Estiaque Ahmed (@smearumi)" - ], - "categories": [ - "Daily", - "Information", - "Productivity" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Dictionary Skill", - "android_handler": "mycroft-dictionary.smearumi.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-05-02T05:23:03Z", - "archived": false, - "license": "apache-2.0", - "modified": "2019-12-18T05:23:43Z", - "authorname": "MycroftAI", - "skillname": "Standard GUI", - "foldername": "skill-standard-gui", - "name": "Standard GUI", - "url": "https://github.com/MycroftAI/skill-standard-gui", - "category": "Configuration", - "description": "Manage standard screen events, not specific to any particular implementation of the Mycroft GUI. This includes support for the Mark 1 face plate display events on the Mycroft GUI", - "short_description": "Basic Mycroft GUI screen support", - "branch": "master", - "examples": [], - "tags": [ - "Configuration", - "gui", - "system", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/desktop.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Standard Gui Skill", - "android_handler": "skill-standard-gui.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-05-24T01:51:39Z", - "archived": false, - "license": "mit", - "modified": "2020-07-29T00:30:26Z", - "authorname": "hexeratops", - "skillname": "mycroft-youtube", - "foldername": "mycroft-youtube-skill", - "name": "mycroft-youtube", - "url": "https://github.com/hexeratops/mycroft-youtube-skill", - "category": null, - "description": "A skill to play youtube videos. It searches youtube for what you say to it, then\nit plays the first thing it finds in the results. \n\nThe python figures out the URL, then uses the external yt\\_player.sh file to pipe \nyoutube-dl into mplayer to play the content. The plus side of this approach is\nthat we never leave any files behind. The downside is that this makes the script\nincredibly dumb. It can only start/stop videos and not control the tracking.\n\nIn the future, this skill may be expanded to be able to queue up songs or even handle\nplaylists, but for now, it just trys to play the video you ask it to play.\n\nThere is now volume control added to the project. This is mainly to act as a balance\nbetween the loudness of Mycroft's voice and the loudness of the audio it plays over\nyoutube. It can be controlled by your voice (as per the examples) or set to a new\ndefault on home.mycroft.ai.\n\nSpecial thanks to [JarbasAI](https://github.com/augustnmonteiro) for providing the\n[search utility](https://github.com/HelloChatterbox/youtube_searcher) for this project.\nWere it not for them, the project would have likely been archived.", - "short_description": "A skill to play youtube videos. It searches youtube for what you say to it, then", - "branch": "master", - "examples": [ - "Say.", - "Say.", - "Say.", - "Say.", - "Say." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "requirements": { - "python": [ - "youtube_search", - "youtube_dl", - "youtube_searcher" - ], - "system": { - "all": "mplayer2" - }, - "skill": [] - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Youtube Skill", - "android_handler": "mycroft-youtube-skill.hexeratops.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-12-25T18:07:04Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-01-26T22:33:30Z", - "authorname": "TheLastProject", - "skillname": "Travel Time", - "foldername": "travel-time-skill", - "name": "Travel Time", - "url": "https://github.com/TheLastProject/travel-time-skill", - "category": "Transport", - "description": "Get traffic information for any route, defaulting to your Mycroft's location.\n\nThis skill uses [OpenStreetMap Nomatim](https://wiki.openstreetmap.org/wiki/Nominatim) to reverse geocode the location and [WazeRouteCalculator](https://github.com/kovacsbalu/WazeRouteCalculator) to calculate the route.", - "short_description": "Get traffic information for your route", - "branch": "master", - "examples": [ - "How long to work?", - "What's the travel time to amsterdam?", - "What's traffic like to brussels?", - "What's the traffic like from amsterdam to brussels?", - "How long to reach london?" - ], - "tags": [ - "Car", - "Waze", - "OpenStreetMaps", - "Traffic", - "Travel", - "Transport", - "Information", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 3, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/car.svg", - "credits": [ - "TheLastProject" - ], - "categories": [ - "Transport", - "Information" - ], - "requirements": { - "python": [ - "WazeRouteCalculator==0.12" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Travel Time Skill", - "android_handler": "travel-time-skill.thelastproject.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-08-20T10:10:39Z", - "archived": false, - "license": "unknown", - "modified": "2020-05-16T18:05:22Z", - "authorname": "machinekoder", - "skillname": "Mycroft Robot Control Skill", - "foldername": "mycroft-robot-control-skill", - "name": "Mycroft Robot Control Skill", - "url": "https://github.com/machinekoder/mycroft-robot-control-skill", - "category": "Daily", - "description": "This is a basic Hello Word Skill that takes an _Utterance_ from the user and provides a voice response - a _Dialog_. This Skill demonstrates the basic directory and file structure of a Mycroft Skill, and is a good first Skill to study if you are interested in developing Skills for the Mycroft ecosystem. \n\nIf you want to write **Skills** for Mycroft, Documentation is available:\n[Mycroft Skills Kit](https://mycroft.ai/documentation/skills/msk/)\n * [Developing a new Skill](https://mycroft.ai/documentation/skills/introduction-developing-skills/)\n * [Skill Settings](https://mycroft.ai/documentation/skills/skill-settings/)\n * [Automatic testing of your Mycroft Skill](https://mycroft.ai/documentation/skills/automatic-testing/)\n * [Skill Acceptance Process](https://mycroft.ai/documentation/skills/skills-acceptance-process/)\n * [Mycroft Skills Manager](https://mycroft.ai/documentation/msm/)\n * [Mycroft Message Bus](https://mycroft.ai/documentation/message-bus/)", - "short_description": "Controls my Borunte ROS robot with Mycroft voice assistant.", - "branch": "master", - "examples": [ - "Hello world.", - "How are you?", - "Thank you.", - "Hello world", - "Thank you" - ], - "tags": [ - "first-skill", - "helloworld", - "hello", - "Daily", - "greeting", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Daily" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Robot Control Skill", - "android_handler": "mycroft-robot-control-skill.machinekoder.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-02-19T11:14:57Z", - "archived": false, - "license": "unknown", - "modified": "2019-03-13T17:58:13Z", - "authorname": "BrianArch96", - "skillname": "Hello World", - "foldername": "ul-events", - "name": "Hello World", - "url": "https://github.com/BrianArch96/ul-events", - "category": "Daily", - "description": "This is a basic Hello Word Skill that takes an _Utterance_ from the user and provides a voice response - a _Dialog_. This Skill demonstrates the basic directory and file structure of a Mycroft Skill, and is a good first Skill to study if you are interested in developing Skills for the Mycroft ecosystem. \n\nIf you want to write **Skills** for Mycroft, Documentation is available:\n[Mycroft Skills Kit](https://mycroft.ai/documentation/skills/msk/)\n * [Developing a new Skill](https://mycroft.ai/documentation/skills/introduction-developing-skills/)\n * [Skill Settings](https://mycroft.ai/documentation/skills/skill-settings/)\n * [Automatic testing of your Mycroft Skill](https://mycroft.ai/documentation/skills/automatic-testing/)\n * [Skill Acceptance Process](https://mycroft.ai/documentation/skills/skills-acceptance-process/)\n * [Mycroft Skills Manager](https://mycroft.ai/documentation/msm/)\n * [Mycroft Message Bus](https://mycroft.ai/documentation/message-bus/)", - "short_description": "Introductory Skill so that Skill Authors can see how a Mycroft Skill is put together", - "branch": "master", - "examples": [ - "Hello world.", - "How are you?", - "Thank you.", - "Hello world", - "Thank you" - ], - "tags": [ - "first-skill", - "helloworld", - "hello", - "Daily", - "greeting", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/smile.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Daily" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Ul Events Skill", - "android_handler": "ul-events.brianarch96.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-01-21T17:18:08Z", - "archived": false, - "license": "unknown", - "modified": "2019-01-21T17:32:20Z", - "authorname": "SandeepRamesh", - "skillname": "Hello World", - "foldername": "mycroft_history_skill", - "name": "Hello World", - "url": "https://github.com/SandeepRamesh/mycroft_history_skill", - "category": "Daily", - "description": "This is a basic Hello Word Skill that takes an _Utterance_ from the user and provides a voice response - a _Dialog_. This Skill demonstrates the basic directory and file structure of a Mycroft Skill, and is a good first Skill to study if you are interested in developing Skills for the Mycroft ecosystem. \n\nIf you want to write **Skills** for Mycroft, Documentation is available:\n[Mycroft Skills Kit](https://mycroft.ai/documentation/skills/msk/)\n * [Developing a new Skill](https://mycroft.ai/documentation/skills/introduction-developing-skills/)\n * [Skill Settings](https://mycroft.ai/documentation/skills/skill-settings/)\n * [Automatic testing of your Mycroft Skill](https://mycroft.ai/documentation/skills/automatic-testing/)\n * [Skill Acceptance Process](https://mycroft.ai/documentation/skills/skills-acceptance-process/)\n * [Mycroft Skills Manager](https://mycroft.ai/documentation/msm/)\n * [Mycroft Message Bus](https://mycroft.ai/documentation/message-bus/)", - "short_description": "Introductory Skill so that Skill Authors can see how a Mycroft Skill is put together", - "branch": "master", - "examples": [ - "Hello world.", - "How are you?", - "Thank you.", - "Hello world", - "Thank you" - ], - "tags": [ - "first-skill", - "helloworld", - "hello", - "Daily", - "greeting", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "last_updated": "2019-01-21T17:32:20Z", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/smile.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Daily" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft_History_Skill Skill", - "android_handler": "mycroft_history_skill.sandeepramesh.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-09-25T16:03:23Z", - "archived": false, - "license": "mit", - "modified": "2019-09-27T17:01:21Z", - "authorname": "Regenflocke", - "skillname": "mycroft-medical-example", - "foldername": "MemoryBox", - "name": "mycroft-medical-example", - "url": "https://github.com/Regenflocke/MemoryBox", - "category": null, - "description": "A example skill to show, how easy it is to create dialogue with mycroft in a medical setting.\n\nTo use this skill, use the following commands after each other: (on the device that runs mycroft)\n\n```Bash\ncd /opt/mycroft/skills\n```\n\nand then \n\n```Bash\ngit clone https://github.com/lucasvog/mycroft-medical-example mycroft-medical.mycroftai\n```\n\nif mycroft runs in the background, it should automatically load the skill.", - "short_description": "A example skill to show, how easy it is to create dialogue with mycroft in a medical setting.", - "branch": "master", - "examples": [], - "tags": [], - "platforms": [ - "all" - ], - "stars": 0, - "last_updated": "2019-09-27T17:01:21Z", - "requirements": { - "python": [ - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Memorybox Skill", - "android_handler": "MemoryBox.regenflocke.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-09-24T20:17:38Z", - "archived": false, - "license": "mit", - "modified": "2019-10-09T10:47:38Z", - "authorname": "lucasvog", - "skillname": "mycroft-medical-example", - "foldername": "mycroft-medical-example", - "name": "mycroft-medical-example", - "url": "https://github.com/lucasvog/mycroft-medical-example", - "category": null, - "description": "A example skill to show, how easy it is to create dialogue with mycroft in a medical setting.\n\nTo use this skill, use the following commands after each other: (on the device that runs mycroft)\n\n```Bash\ncd /opt/mycroft/skills\n```\n\nand then \n\n```Bash\ngit clone https://github.com/lucasvog/mycroft-medical-example mycroft-medical.mycroftai\n```\n\nif mycroft runs in the background, it should automatically load the skill.", - "short_description": "A example skill to show, how easy it is to create dialogue with mycroft in a medical setting.", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Medical Example Skill", - "android_handler": "mycroft-medical-example.lucasvog.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-08-13T02:50:50Z", - "archived": false, - "license": "mit", - "modified": "2019-08-13T03:08:12Z", - "authorname": "anshumanpatil", - "skillname": "Learn Javascript Language", - "foldername": "skill-learn-javascript", - "name": "Learn Javascript Language", - "url": "https://github.com/anshumanpatil/skill-learn-javascript", - "category": null, - "description": "Creating javascript experience.", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Anshuman" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Learn Javascript Skill", - "android_handler": "skill-learn-javascript.anshumanpatil.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-01-18T10:52:38Z", - "archived": false, - "license": "unknown", - "modified": "2019-01-18T12:14:10Z", - "authorname": "BhavikKatyal", - "skillname": "Hello World", - "foldername": "Today_Skill_2", - "name": "Hello World", - "url": "https://github.com/BhavikKatyal/Today_Skill_2", - "category": "Daily", - "description": "This is a basic Hello Word Skill that takes an _Utterance_ from the user and provides a voice response - a _Dialog_. This Skill demonstrates the basic directory and file structure of a Mycroft Skill, and is a good first Skill to study if you are interested in developing Skills for the Mycroft ecosystem.\n\nIf you want to write **Skills** for Mycroft, Documentation is available:\n\n* [Mycroft Skills Kit](https://mycroft.ai/documentation/skills/msk/)\n* [Developing a new Skill](https://mycroft.ai/documentation/skills/introduction-developing-skills/)\n* [Skill Settings](https://mycroft.ai/documentation/skills/skill-settings/)\n* [Automatic testing of your Mycroft Skill](https://mycroft.ai/documentation/skills/automatic-testing/)\n* [Skill Acceptance Process](https://mycroft.ai/documentation/skills/skills-acceptance-process/)\n* [Mycroft Skills Manager](https://mycroft.ai/documentation/msm/)\n* [Mycroft Message Bus](https://mycroft.ai/documentation/message-bus/)", - "short_description": "Introductory Skill so that Skill Authors can see how a Mycroft Skill is put together", - "branch": "master", - "examples": [ - "Hello world.", - "How are you?", - "Thank you." - ], - "tags": [ - "first-skill", - "helloworld", - "hello", - "Daily", - "greeting", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Today_Skill_2 Skill", - "android_handler": "Today_Skill_2.bhavikkatyal.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-09-29T06:30:16Z", - "archived": false, - "license": "unknown", - "modified": "2020-05-31T13:32:27Z", - "authorname": "alonyomtov123", - "skillname": "Useridentification", - "foldername": "useridentification-skill", - "name": "Useridentification", - "url": "https://github.com/alonyomtov123/useridentification-skill", - "category": "Productivity", - "description": "", - "short_description": "Identify speaker of user", - "branch": "master", - "examples": [ - "Contacts.", - "Calander.", - "Contacts", - "Calander" - ], - "tags": [ - "true", - "mycroft-pip", - "pandas", - "tensorflow", - "your", - "useridentification-skill", - "Productivity", - "numpy", - "apt-get", - "skillSetup.py", - "librosa", - "to", - "secure", - "app", - "listener.save_utterances", - "sudo", - "access", - "run:", - "python3-tk", - "name", - "Add", - "mycroft-config", - "keras", - "account", - "less", - "DO", - "install", - "PySimpleGUI", - "set", - "email", - "To", - "file", - "that", - "check", - "is", - "To DO\n\ncheck that file name is useridentification-skill\n\nrun: skillSetup.py\n\nAdd less secure app access to your email account\n\nmycroft-config set listener.save_utterances true\n\nrun:\n\nmycroft-pip install tensorflow\n\nmycroft-pip install pandas\n\nmycroft-pip install numpy\n\nmycroft-pip install keras\n\nmycroft-pip install librosa\n\nmycroft-pip install PySimpleGUI\n\nsudo apt-get install python3-tk", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "alonyomtov123@gmail.com" - ], - "categories": [ - "Productivity" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Useridentification Skill", - "android_handler": "useridentification-skill.alonyomtov123.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-04-07T15:11:25Z", - "archived": false, - "license": "unknown", - "modified": "2019-04-08T04:33:07Z", - "authorname": "acherukuri", - "skillname": "UMKC Hackathon Spring'19", - "foldername": "mycroft-kitchen.mycroftai", - "name": "UMKC Hackathon Spring'19", - "url": "https://github.com/acherukuri/mycroft-kitchen.mycroftai", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Kitchen.Mycroftai Skill", - "android_handler": "mycroft-kitchen.mycroftai.acherukuri.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-09-25T16:06:45Z", - "archived": false, - "license": "mit", - "modified": "2019-10-11T16:21:26Z", - "authorname": "lllAlexanderlll", - "skillname": "mycroft-momo", - "foldername": "mycroft-momo", - "name": "mycroft-momo", - "url": "https://github.com/lllAlexanderlll/mycroft-momo", - "category": null, - "description": "Momo, our personal assisstant.\n\nTo use this skill, use the following commands after each other: (on the device that runs mycroft)\n\n```Bash\ncd /opt/mycroft/skills\n```\n\nand then \n\n```Bash\ngit clone https://github.com/lucasvog/mycroft-medical-example mycroft-medical.mycroftai\n```\n\nif mycroft runs in the background, it should automatically load the skill.", - "short_description": "Momo, our personal assisstant.", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Momo Skill", - "android_handler": "mycroft-momo.lllalexanderlll.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-04-10T06:02:03Z", - "archived": false, - "license": "unknown", - "modified": "2019-04-10T06:03:12Z", - "authorname": "Cathalb28345", - "skillname": "Hello World", - "foldername": "hello-world", - "name": "Hello World", - "url": "https://github.com/Cathalb28345/hello-world", - "category": "Daily", - "description": "This is a basic Hello Word Skill that takes an _Utterance_ from the user and provides a voice response - a _Dialog_. This Skill demonstrates the basic directory and file structure of a Mycroft Skill, and is a good first Skill to study if you are interested in developing Skills for the Mycroft ecosystem. \n\nIf you want to write **Skills** for Mycroft, Documentation is available:\n[Mycroft Skills Kit](https://mycroft.ai/documentation/skills/msk/)\n * [Developing a new Skill](https://mycroft.ai/documentation/skills/introduction-developing-skills/)\n * [Skill Settings](https://mycroft.ai/documentation/skills/skill-settings/)\n * [Automatic testing of your Mycroft Skill](https://mycroft.ai/documentation/skills/automatic-testing/)\n * [Skill Acceptance Process](https://mycroft.ai/documentation/skills/skills-acceptance-process/)\n * [Mycroft Skills Manager](https://mycroft.ai/documentation/msm/)\n * [Mycroft Message Bus](https://mycroft.ai/documentation/message-bus/)", - "short_description": "Introductory Skill so that Skill Authors can see how a Mycroft Skill is put together", - "branch": "master", - "examples": [ - "Hello world.", - "How are you?", - "Thank you.", - "Hello world", - "Thank you" - ], - "tags": [ - "first-skill", - "helloworld", - "hello", - "Daily", - "greeting", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/smile.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Daily" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Hello World Skill", - "android_handler": "hello-world.cathalb28345.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-04-24T04:14:02Z", - "archived": false, - "license": "mit", - "modified": "2019-05-14T17:07:51Z", - "authorname": "tony1661", - "skillname": "Plex Mycroft Skill", - "foldername": "Mycroft-Plex-Skill", - "name": "Plex Mycroft Skill", - "url": "https://github.com/tony1661/Mycroft-Plex-Skill", - "category": null, - "description": "A custom Mycroft skill I created to control my plex server.", - "short_description": "", - "branch": "master", - "examples": [ - "Refresh Plex.", - "How many movies do I have downloaded?", - "Count my movies.", - "How many movies do I have.", - "How many movies do I have downloaded.", - "How many movies do I have on plex.", - "Refresh Plex", - "count my movies", - "how many movies do I have", - "how many movies do I have downloaded", - "how many movies do I have on plex" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Tony Fernandez" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Plex Skill", - "android_handler": "Mycroft-Plex-Skill.tony1661.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-02-11T09:42:47Z", - "archived": false, - "license": "unknown", - "modified": "2019-02-11T13:33:20Z", - "authorname": "hubolife", - "skillname": "Maxwell Acronym skill interface to Altsearch engine", - "foldername": "maxwell_skills", - "name": "Maxwell Acronym skill interface to Altsearch engine", - "url": "https://github.com/hubolife/maxwell_skills", - "category": "Daily", - "description": "This is a AltSearch for acroymyns skill that takes an _Utterance_ from the user and provides a voice response - a _Dialog_. This Skill demonstrates the basic directory and file structure of a Mycroft Skill platform good in developing Skills for the Mycroft ecosystem. \n\nIf you want to write **Skills** for Mycroft, Documentation is available:\n[Mycroft Skills Kit](https://mycroft.ai/documentation/skills/msk/)\n * [Developing a new Skill](https://mycroft.ai/documentation/skills/introduction-developing-skills/)\n * [Skill Settings](https://mycroft.ai/documentation/skills/skill-settings/)\n * [Automatic testing of your Mycroft Skill](https://mycroft.ai/documentation/skills/automatic-testing/)\n * [Skill Acceptance Process](https://mycroft.ai/documentation/skills/skills-acceptance-process/)\n * [Mycroft Skills Manager](https://mycroft.ai/documentation/msm/)\n * [Mycroft Message Bus](https://mycroft.ai/documentation/message-bus/)", - "short_description": "Skills to intergrate to Myscroft platform , Maxwell is the project name", - "branch": "master", - "examples": [ - "AltSearch.", - "Link status?", - "Search Acronym.", - "AltSearch", - "Search Acronym" - ], - "tags": [ - "altsearch", - "catagory", - "Daily", - "acronym", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/smile.svg", - "credits": [ - "Mycroft AI (@MycroftAI) - Framework\nhubert.bouma@gmail.com" - ], - "categories": [ - "Daily" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Maxwell_Skills Skill", - "android_handler": "maxwell_skills.hubolife.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-04-08T07:13:50Z", - "archived": false, - "license": "unknown", - "modified": "2020-01-09T10:15:30Z", - "authorname": "colla69", - "skillname": "Localmusicplayer", - "foldername": "localMusicPlayer-skill", - "name": "Localmusicplayer", - "url": "https://github.com/colla69/localMusicPlayer-skill", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Localmusicplayer Skill", - "android_handler": "localMusicPlayer-skill.colla69.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-11-19T08:34:01Z", - "archived": false, - "license": "mit", - "modified": "2020-01-24T23:00:43Z", - "authorname": "RdeLange", - "skillname": "", - "foldername": "skill-homey", - "name": "", - "url": "https://github.com/RdeLange/skill-homey", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "paho-mqtt" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Homey Skill", - "android_handler": "skill-homey.rdelange.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-11-10T22:49:55Z", - "archived": false, - "license": "apache-2.0", - "modified": "2019-11-10T22:50:15Z", - "authorname": "waltk99", - "skillname": "Remember", - "foldername": "test-remember-skill", - "name": "Remember", - "url": "https://github.com/waltk99/test-remember-skill", - "category": "Daily", - "description": "You can ask MyCroft to remember and forget things.\nIt will store everything in a list locally on your device.", - "short_description": "Ask MyCroft to remember things for you.", - "branch": "master", - "examples": [ - "Remember take the trash out.", - "What did you remember?", - "Forget phrase take the trash out.", - "Forget all phrases.", - "Hey mycroft, remember take the trash out", - "Hey mycroft, what did you remember", - "Hey mycroft, forget phrase take the trash out", - "Hey mycroft, forget all phrases" - ], - "tags": [ - "brain", - "Productivity", - "Daily", - "todo-list", - "remember", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/brain.svg", - "credits": [ - "Lukas Gangel (@luke5sky)" - ], - "categories": [ - "Daily", - "Productivity" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Test Remember Skill", - "android_handler": "test-remember-skill.waltk99.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-11-08T13:20:35Z", - "archived": false, - "license": "unknown", - "modified": "2019-12-20T09:10:55Z", - "authorname": "HerrAugust", - "skillname": "Real-time smart-car skill Mycroft", - "foldername": "skill-smart-car", - "name": "Real-time smart-car skill Mycroft", - "url": "https://github.com/HerrAugust/skill-smart-car", - "category": "IoT", - "description": "This is a Mycroft skill to control a smart-car via voice commands.\n\nAccepted vocal commands are:\n\nIt has been tested under ARTe 1.6.11-r3 (http://arte.retis.santannapisa.it/). ARTe is a **real-time extension for Arduino**, which lets you write **periodic tasks** in a very simple way. \n\n<img src=\"screens/preview1.jpg\" alt=\"screen 1 not available\" />\ngo ahead\n * go back\n * turn left\n * turn right\n * stop", - "short_description": "This is a Mycroft skill to control a smart-car via voice commands.", - "branch": "master", - "examples": [], - "tags": [ - "IoT", - "smart-car", - "mycroft", - "iot", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "HerrAugust @ github.com" - ], - "categories": [ - "IoT" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Smart Car Skill", - "android_handler": "skill-smart-car.herraugust.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-10-14T18:12:48Z", - "archived": false, - "license": "unknown", - "modified": "2019-10-15T09:58:00Z", - "authorname": "domcross", - "skillname": "Google Search Knowledge Graph", - "foldername": "google-search-knowledge-graph-skill", - "name": "Google Search Knowledge Graph", - "url": "https://github.com/domcross/google-search-knowledge-graph-skill", - "category": "Information", - "description": "With this skill you can \"google\" the internet using google's knowledge search api.\n\nYou need a Google account and [create an api key](https://console.developers.google.com/start/api?id=kgsearch.googleapis.com&credential=client_key)\nthat you have to enter in the skill settings section of home.mycroft.ai", - "short_description": "Search the internet using google knowledge search", - "branch": "master", - "examples": [ - "Google.", - "Graph search.", - "Google", - "Graph search" - ], - "tags": [ - "Search", - "Information", - "Daily", - "Google", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "Dominik" - ], - "categories": [ - "Information", - "Daily" - ], - "requirements": { - "python": [ - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Google Search Knowledge Graph Skill", - "android_handler": "google-search-knowledge-graph-skill.domcross.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-04-06T04:37:11Z", - "archived": false, - "license": "unknown", - "modified": "2019-04-08T04:32:54Z", - "authorname": "acherukuri", - "skillname": "mycroft-white-noise.mycroftai", - "foldername": "mycroft-white-noise.mycroftai", - "name": "mycroft-white-noise.mycroftai", - "url": "https://github.com/acherukuri/mycroft-white-noise.mycroftai", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft White Noise.Mycroftai Skill", - "android_handler": "mycroft-white-noise.mycroftai.acherukuri.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-09-15T09:22:11Z", - "archived": false, - "license": "apache-2.0", - "modified": "2019-10-13T17:37:11Z", - "authorname": "smearumi", - "skillname": "Health", - "foldername": "mycroft-health", - "name": "Health", - "url": "https://github.com/smearumi/mycroft-health", - "category": "Daily", - "description": "You can track health related information of your and your family's and generate the report for current/previous month which will send to your registered email address.", - "short_description": "Track your and your family's health related information.", - "branch": "master", - "examples": [ - "Track health blood pressure (Mycroft will prompt for 'Top', 'Bottom', 'For whom', 'confirm')", - "Track health diabetes 5.7 (Mycroft will prompt for 'Before or after meal', 'For whom', 'Confirm')", - "Track health temperature 99 (Mycroft will prompt for 'For whom', 'Confirm')", - "Track health pain headache (Mycroft will prompt for 'For whom', 'Confirm')", - "Track health heartbeat 75 (Mycroft will prompt for 'For whom', 'Confirm')", - "Generate report for this month (Mycroft will prompt for 'Which category', 'For whom')", - "track health blood pressure (Mycroft will prompt for 'Top', 'Bottom', 'For whom', 'confirm')", - "track health diabetes 5.7 (Mycroft will prompt for 'Before or after meal', 'For whom', 'Confirm')", - "track health temperature 99 (Mycroft will prompt for 'For whom', 'Confirm')", - "track health pain headache (Mycroft will prompt for 'For whom', 'Confirm')", - "track health heartbeat 75 (Mycroft will prompt for 'For whom', 'Confirm')", - "generate report for this month (Mycroft will prompt for 'Which category', 'For whom')" - ], - "tags": [ - "home", - "health", - "medical", - "Productivity", - "Information", - "voice", - "skill", - "assistant", - "Daily", - "mycroft", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/heartbeat.svg", - "credits": [ - "S. M. Estiaque Ahmed (@smearumi)" - ], - "categories": [ - "Daily", - "Information", - "Productivity" - ], - "requirements": { - "python": [ - "sendgrid", - "json2html==1.3.0" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Health Skill", - "android_handler": "mycroft-health.smearumi.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-04-09T10:28:38Z", - "archived": false, - "license": "unknown", - "modified": "2019-04-16T11:14:03Z", - "authorname": "Cathalb28345", - "skillname": "pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib", - "foldername": "gcalendar_skill", - "name": "pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib", - "url": "https://github.com/Cathalb28345/gcalendar_skill", - "category": null, - "description": "Fetches scheduled events from Google Calendar and allows adding events to your calendar.", - "short_description": "", - "branch": "master", - "examples": [ - "What's next on my schedule?", - "What's on my calendar on friday?", - "Add have fun to my calendar at 7 in the evening on saturday.", - "what's next on my schedule", - "what's on my calendar on friday", - "add have fun to my calendar at 7 in the evening on saturday" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Mycroft AI" - ], - "requirements": { - "python": [ - "httplib2", - "apiclient", - "google-auth-oauthlib", - "oauth2client", - "google-api-python-client" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Gcalendar_Skill Skill", - "android_handler": "gcalendar_skill.cathalb28345.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-02-17T14:13:10Z", - "archived": false, - "license": "mit", - "modified": "2019-02-18T09:16:15Z", - "authorname": "colla69", - "skillname": "cmus-skill", - "foldername": "cmus-skill", - "name": "cmus-skill", - "url": "https://github.com/colla69/cmus-skill", - "category": null, - "description": "This Mycroft skill can control the cmus player with speech commands.\n\n### Requirements\n you will need a working cmus to play your music <br/><br/>\n `sudo apt install screen`<br/>\n `sudo apt install cmus`<br/>\n \n### Install\n `msm install https://github.com/colla69/cmus-skill`\n\n### Usage\n \"Hey Mycroft, play my music!\" <br/>\n \"Hey Mycroft, pause music!\" <br/>\n \"Hey Mycroft, search music eminem stan\" <br/>", - "short_description": "This Mycroft skill can control the cmus player with speech commands.", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Cmus Skill", - "android_handler": "cmus-skill.colla69.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-04-02T13:30:08Z", - "archived": false, - "license": "unknown", - "modified": "2019-04-23T10:56:01Z", - "authorname": "Ishimaru17", - "skillname": "First Talk", - "foldername": "first-talk-skill", - "name": "First Talk", - "url": "https://github.com/Ishimaru17/first-talk-skill", - "category": null, - "description": "When Mycroft is wake up with a talk word, then it will repeat what you said except if you ask him about him or help.", - "short_description": "", - "branch": "master", - "examples": [ - "Talk with me.", - "Talk.", - "Let's talk.", - "(When conversation is activated)", - "(When conversation is activated)", - "(When conversation is activated)" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Campora" - ], - "requirements": { - "python": [ - "pycrypto>=2.6" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "First Talk Skill", - "android_handler": "first-talk-skill.ishimaru17.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-09-15T09:20:48Z", - "archived": false, - "license": "apache-2.0", - "modified": "2019-10-10T22:27:59Z", - "authorname": "smearumi", - "skillname": "Prayer Time", - "foldername": "mycroft-prayer-time", - "name": "Prayer Time", - "url": "https://github.com/smearumi/mycroft-prayer-time", - "category": "Daily", - "description": "Muslims around the world need to pray in time five times a day. This skill gets\nprayer times for the local region from https://aladhan.com/ using API and plays Adhan\nin time. Also, anyone can get next prayer time or today's prayer times updates using this skill.\n\nThis skill runs automatically when the mycroft starts.", - "short_description": "Automatic reminder for daily prayer times. As reminder, it plays Adhan (the call to prayer).", - "branch": "master", - "examples": [ - "Start prayer time.", - "Turn on prayer time.", - "Stop prayer time.", - "Turn off prayer time.", - "Tell me about the next prayer time.", - "What's the latest prayer time?", - "Next prayer time.", - "Tell me today's prayer times.", - "start prayer time", - "turn on prayer time", - "stop prayer time", - "turn off prayer time", - "tell me about the next prayer time", - "what's the latest prayer time", - "next prayer time", - "tell me today's prayer times" - ], - "tags": [ - "home", - "time", - "Islam", - "prayer", - "Productivity", - "Information", - "voice", - "skill", - "assistant", - "Muslim", - "Daily", - "mycroft", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/mosque.svg", - "credits": [ - "S. M. Estiaque Ahmed (@smearumi)" - ], - "categories": [ - "Daily", - "Information", - "Productivity" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Prayer Time Skill", - "android_handler": "mycroft-prayer-time.smearumi.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-09-04T12:50:47Z", - "archived": false, - "license": "apache-2.0", - "modified": "2019-09-04T18:30:58Z", - "authorname": "Mel1818", - "skillname": "Spotify", - "foldername": "mycroft-spotify-skill", - "name": "Spotify", - "url": "https://github.com/Mel1818/mycroft-spotify-skill", - "category": "Music", - "description": "Stream your favorite music from the popular Spotify music service. Spotify\nPremium users can search and play tracks from their own playlists or the huge\nSpotify music library.\n\nYou can also control your Mycroft device using the Spotify Connect system.\nSo play DJ on your phone while listening on Mycroft!\n\n### Authorization:\nThis Skill uses two different methods of authentication. Both need to be filled in correctly for the **Skill** to function correctly.\n\n#### API connection to your Spotify account\nAfter installing `mycroft-spotify`, in your [Skill\nsettings for Spotify](https://home.mycroft.ai/#/skill) in home.mycroft.ai you will see settings for the Spotify Skill. You will see a username and password field and a 'Connect' button. Ignore the username and password field for now, and click the 'Connect' button. You will be prompted to log in to Spotify, and to authorize Mycroft AI to use your Spotify account using OAuth. This allows Mycroft access to your account details such as Playlists.\n\n#### Username and password to authenticate a Mycroft device\nIn addition to account details, Mycroft needs to be authorized as a **device** for Spotify. To do this, we use your username and password for Spotify. These must be entered as well, or you will receive an error message like:\n\n`I couldn't find any Spot-ify devices. This skill requires a Spotify Premium account to work properly.`\n\nwhen you try to use the **Skill** on a Mycroft device.\n\nIf you log in to Spotify using Facebook, your password will be your _Facebook_ password, but your Spotify device username. You can get your Spotify device username [here](https://www.spotify.com/us/account/set-device-password/).\n\n_NOTE: You MUST have a Premium Spotify account to use this **Skill**. It will NOT work with a free Spotify account._", - "short_description": "Listen to music from your Spotify Premium music account", - "branch": "master", - "examples": [ - "What Spotify devices are available?", - "Play discover weekly.", - "Search Spotify for Hello Nasty.", - "Play something by Coventant.", - "Play the album Hello Nasty on Spotify.", - "Play discover weekly", - "Search Spotify for Hello Nasty", - "Play something by Coventant", - "Play the album Hello Nasty on Spotify" - ], - "tags": [ - "music", - "spotify", - "Music", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/music.svg", - "credits": [ - "@forslund\nThe Mycroft devs" - ], - "categories": [ - "Music" - ], - "requirements": { - "python": [ - "spotipy==2.4.4" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Spotify Skill", - "android_handler": "mycroft-spotify-skill.mel1818.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-04-11T06:07:26Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-07-12T13:14:22Z", - "authorname": "muhareb", - "skillname": "Skill-quran", - "foldername": "skill-quran", - "name": "Singing", - "url": "https://github.com/muhareb/skill-quran", - "category": "Entertainment", - "description": "Recite Quran chapters.", - "short_description": "Recite Quran chapters.", - "branch": "master", - "examples": [ - "Sing.", - "اقرا سورة النصر بصوت السديس" - ], - "tags": [ - "lyrics", - "music", - "sing", - "Entertainment", - "singing", - "song", - "texttospeech", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/laugh-beam.svg", - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Quran Skill", - "android_handler": "skill-quran.muhareb.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-10-15T01:34:53Z", - "archived": false, - "license": "mit", - "modified": "2019-10-15T20:45:03Z", - "authorname": "ChanceNCounter", - "skillname": "Repeat That", - "foldername": "repeat-skill", - "name": "Repeat That", - "url": "https://github.com/ChanceNCounter/repeat-skill", - "category": "Configuration", - "description": "Enables Mycroft to repeat whatever it said most recently. Useful when Mycroft speaks too fast, or when you aren't paying close attention.", - "short_description": "Allows Mycroft to repeat the most recent thing it said", - "branch": "master", - "examples": [ - "Repeat that.", - "What did you say?", - "Say that again.", - "Repeat that", - "Say that again" - ], - "tags": [ - "Configuration", - "basic", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/reply.svg", - "credits": [ - "@ChanceNCounter" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Repeat Skill", - "android_handler": "repeat-skill.chancencounter.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-06-27T23:33:41Z", - "archived": false, - "license": "apache-2.0", - "modified": "2019-10-10T16:30:53Z", - "authorname": "MycroftAI", - "skillname": "ARCHIVE - This Skill is no longer in use.", - "foldername": "skill-mark-2-pi", - "name": "Mycroft Mark 2", - "url": "https://github.com/MycroftAI/skill-mark-2-pi", - "category": "Configuration", - "description": "The Mycroft Mark 2 has several unique capabilities which this Skill lets you\ncontrol.\n\n### Faceplate Brightness\nSet the faceplate to a specific brightness, or allow it to automatically adjust\nits brightness level to dim at night.", - "short_description": "Please use the new [Mark II Skill](https://github.com/MycroftAI/skill-mark-2)", - "branch": "master", - "examples": [ - "Turn on auto brightness.", - "Change to low brightness.", - "Dim to 50%", - "Turn on auto brightness", - "Change to low brightness" - ], - "tags": [ - "settings", - "system", - "mark2", - "Configuration", - "configuration", - "no-license" - ], - "platforms": [ - "platform_mark2", - "platform_respeaker" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/cog.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [ - "arrow==0.12.0", - "astral==1.4", - "git+https://github.com/respeaker/pixel_ring.git" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mark 2 Pi Skill", - "android_handler": "skill-mark-2-pi.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-01-04T11:58:29Z", - "archived": false, - "license": "apache-2.0", - "modified": "2019-01-04T14:28:10Z", - "authorname": "luke5sky", - "skillname": "Speedtest", - "foldername": "speedtest-test-skill", - "name": "Speedtest", - "url": "https://github.com/luke5sky/speedtest-test-skill", - "category": "Daily", - "description": "Run a speedtest with MyCroft.\nThis skill uses the speedtest-cli (https://github.com/sivel/speedtest-cli) which runs an internet bandwidth test using speedtest.net.", - "short_description": "Ask MyCroft to run a simple speedtest.", - "branch": "master", - "examples": [ - "Run a speedtest.", - "Hey mycroft, run a speedtest" - ], - "tags": [ - "IoT", - "speed", - "bandwith", - "ínternet", - "Productivity", - "Information", - "Daily", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/signal.svg", - "credits": [ - "Lukas Gangel (@luke5sky)" - ], - "categories": [ - "Daily", - "Information", - "IoT", - "Productivity" - ], - "requirements": { - "python": [ - "speedtest-cli" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Speedtest Test Skill", - "android_handler": "speedtest-test-skill.luke5sky.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-04-06T21:03:07Z", - "archived": false, - "license": "mit", - "modified": "2019-12-18T05:33:33Z", - "authorname": "kentonschool", - "skillname": "Recipe Getter", - "foldername": "UMKCHackaroo2", - "name": "Recipe Getter", - "url": "https://github.com/kentonschool/UMKCHackaroo2", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Umkchackaroo2 Skill", - "android_handler": "UMKCHackaroo2.kentonschool.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-07-16T01:18:28Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-02-15T21:07:13Z", - "authorname": "richhowley", - "skillname": "MBTA Bus Tracking", - "foldername": "mbta-bus-tracking-skill", - "name": "MBTA Bus Tracking", - "url": "https://github.com/richhowley/mbta-bus-tracking-skill", - "category": "Transport", - "description": "Mycroft will announce estimated arrival times of MBTA buses at your stop so you never leave the house before you have to. All data and arrival predictions used by this skill are provided by the MBTA. \n\nSee below for full documentation, including how to track buses traveling toward your stop, but to get started just say \"Hey Mycroft, T Bus Arrivals\". You will be prompted for the bus route, direction and stop name. Mycroft will respond with all estimated arrival times at your stop.\n\n<details><summary>View Sample dialog</summary>\n<dl>\n<dt>Hey Mycroft T Bus Arrivals</dt>\n<dd>Which route are you riding?</dd>\n<dt>One</dt>\n<dd>Are you going outbound toward Harvard or Inbound toward Dudley?</dd>\n<dt>Inbound</dt>\n<dd>Which stop?</dd>\n<dt>Mount Auburn Street at Putnam Ave</dt>\n<dd>Route One service to Dudley arrivals for Mount Auburn Street at Putnam Avenue:<dd>\n<dd>Arriving in 11 minutes<dd>\n<dd>Arriving in 21 minutes<dd>\n<dd>Arriving in 34 minutes<dd>\n</dl>\n</details>\n\n<details><summary>View Full Documentation</summary>\n\n#### T bus or Transit\n\nWherever this documentation calls for saying \"T bus\" to Mycroft it can be replaced with \"transit\", and vice versa. If Mycroft is having difficulty understanding one, try the other.\n\n#### Arrival Times\n\nTo provide bus arrival times the skill requires three pieces of information: bus route, traveling direction and bus stop. If you do not provide all information needed the skill will prompt you for the rest. For example, saying\n\n> T bus arrivals route 57 going inbound stop Brighton Ave and Linden Street\n\nwill retrieve all arrival times predicted for the stop. The arrival times could also be retrieved by any of the following:\n\n> T bus arrivals route 57 going inbound\n\n> T bus arrivals route 57\n\n> T bus arrivals\n\nMycroft will prompt for any missing information.\n\n#### Bus Tracking\n\nBus tracking is similar to Arrival Times but Mycroft will continue to track buses, periodically updating their predicted arrival times, until they have passed the stop. By default Mycroft will track the next three buses and will announce updated arrival predictions every 30 seconds. These values can be changed in the skill settings on Mycroft Home. The minimum frequency of updates is 30 seconds.\n\nAs with Arrivals, say\n\n> T bus tracking\n\nto begin. Predicted arrival times of the next three tracked buses will be announced right away and updated every 30 seconds. Be aware that there may be any number of buses heading to your stop but only the arrival predictions for the tracked buses will be announced.\n\nWhen a bus passes your stop it will drop off the tracking list and there will be one fewer arrival time announced on subsequent updates. When all buses have passed your stop Mycroft will automatically stop tracking. If you would like tracking to end at any time say\n\n> T bus shutdown\n\n#### Shortcuts\n\nIf you ride the same route from the same stop often you will want to use shortcuts. After Mycroft announces arrivals or starts tracking buses you may save the route, direction and stop combination as a shortcut using any name you wish.\n\nSuppose you take the bus to work and went through the process of asking for arrivals, telling Mycroft the bus route, direction and stop. Now say\n\n> transit save shortcut\n\nand Mycroft will prompt you for a name. If you say\n\n> rat race\n\nyou may get Arrivals or begin Bus Tracking using the shortcut\n\n>T bus tracking rat race\n\nTwo additional phrases\n\n> list T bus shortcuts\n\n> T bus remove shortcut rat race\n\nallow you to list and delete saved shortcuts.\n\n#### API Key\n\nWhen installed this skill does not use an API key when getting data from the MBTA servers. Using a key allows a higher rate limit when requesting data. It should not be necessary to use an API key but if you like you may obtain one on the [MBTA website](https://api-v3.mbta.com/register). In the skill settings on Mycroft Home check the box next to \"Use my API key\" and enter your key in the text field.\n\n</details>", - "short_description": "Announce arrivals of MBTA buses.", - "branch": "master", - "examples": [ - "T Bus Arrivals.", - "T Bus Tracking.", - "Save Transit Shortcut.", - "T Bus Arrivals", - "T Bus Tracking", - "Save Transit Shortcut" - ], - "tags": [ - "Transport", - "MBTA,Boston", - "Boston", - "MBTA,", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/bus.svg", - "credits": [ - "Rich Howley" - ], - "categories": [ - "Transport" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mbta Bus Tracking Skill", - "android_handler": "mbta-bus-tracking-skill.richhowley.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-08-02T08:08:19Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-05T16:23:06Z", - "authorname": "AIIX", - "skillname": "Mycroft Mark 2", - "foldername": "skill-remote-platform", - "name": "Mycroft Mark 2", - "url": "https://github.com/AIIX/skill-remote-platform", - "category": "Configuration", - "description": "The Mycroft Mark 2 has several unique capabilities which this Skill lets you\ncontrol.\n\n### Faceplate Brightness\nSet the faceplate to a specific brightness, or allow it to automatically adjust\nits brightness level to dim at night.", - "short_description": "Customize your Mark 2", - "branch": "master", - "examples": [ - "Turn on auto brightness.", - "Change to low brightness.", - "Dim to 50%", - "Turn on auto brightness", - "Change to low brightness" - ], - "tags": [ - "settings", - "system", - "mark2", - "Configuration", - "configuration", - "no-license" - ], - "platforms": [ - "platform_mark2", - "platform_respeaker" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/cog.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [ - "arrow==0.12.0", - "astral==1.4" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Remote Platform Skill", - "android_handler": "skill-remote-platform.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-12-09T16:34:56Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-12-27T14:13:06Z", - "authorname": "kalyaninagaraj", - "skillname": "Air Quality", - "foldername": "air-quality-skill", - "name": "Air Quality", - "url": "https://github.com/kalyaninagaraj/air-quality-skill", - "category": "Daily", - "description": "Get real-time air quality data for more than 1000 cities from \nthe [World Air Quality Index](https://aqicn.org/) (WAQI) project. \n\nBy default, Mycroft reports **real-time** (most recent, \none-hour average) fine particulate matter (PM 2.5) concentration \nlevels at a monitoring station in your city. You can also ask \nMycroft for PM 10, carbon monoxode (CO), nitrogen dioxide \n(NO<sub>2</sub>), and sulphur dioxide (SO<sub>2</sub>) levels at \nyour location or in other cities. Mycroft will also report how \nlong back the reading was taken if the measurements were made more \nthan two hours ago, and a health cautionary statement (only for \nPM 2.5 concentration levels) as suggested by the WAQI project. \n\nThe Air Quality skill requires an API key to access data from \nthe World Air Quality Index project. For instructions to obtain \na key, go to the skill settings in your Mycroft account. The \nWAQI project's terms of acceptable data and API usage apply. \n\n### Things to note\nAPI doesn't mention the units (ppb, or milligrams per cubic meter).\nSo, for the present, this skill doesn't report ozone levels.\nresulting in different nations using different air quality indices. To \nstandardize the reporting, this skill reports *raw* concentration \nlevels measured in micrograms per cubic meter.\nSeveral stations record ozone levels but the WAQI project's \n * Different government agencies have different air quality standards, ", - "short_description": "Mycroft reports real-time pollutant levels in your city.", - "branch": "master", - "examples": [ - "What is the air quality?", - "How polluted is the air in New Delhi?", - "What is the carbon monoxide level in Hong Kong?", - "What's the ozone level in Dublin?", - "What's the PM 10 level in Portland?" - ], - "tags": [ - "level", - "quality", - "AI", - "Pollutant", - "Air", - "Information", - "Daily", - "Mycroft", - "Mycroft AI", - "Air quality", - "Pollutant level", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/smog.svg", - "credits": [ - "[@kalyaninagaraj](https://github.com/kalyaninagaraj)" - ], - "categories": [ - "Daily", - "Information" - ], - "requirements": { - "python": [ - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Air Quality Skill", - "android_handler": "air-quality-skill.kalyaninagaraj.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-09-27T05:37:59Z", - "archived": false, - "license": "unknown", - "modified": "2019-10-02T07:51:45Z", - "authorname": "krisgesling", - "skillname": "Polite", - "foldername": "polite-skill", - "name": "Polite", - "url": "https://github.com/krisgesling/polite-skill", - "category": "Example", - "description": "A simple example Skill that shows how the `converse()` method can be used to take action on utterances before they reach the normal intent handling process.\n\nThis Skill catches any utterance that contains a word defined in `vocab/lang-code/RudeWords.voc` and responds. Or if no rude word is detected, allows Mycroft to respond normally.\n\nFor more details see the [technical documentation on converse](https://mycroft-core.readthedocs.io/en/latest/source/mycroft.html?highlight=converse#mycroft.MycroftSkill.converse).", - "short_description": "Example Skill to show use of the converse() method.", - "branch": "master", - "examples": [ - "You are stupid.", - "Will you shut up.", - "You are stupid", - "Will you shut up" - ], - "tags": [ - "Example", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/chalkboard-teacher.svg", - "credits": [ - "krisgesling" - ], - "categories": [ - "Example" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Polite Skill", - "android_handler": "polite-skill.krisgesling.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-06-30T00:52:51Z", - "archived": false, - "license": "unknown", - "modified": "2020-01-29T00:19:25Z", - "authorname": "krywenko", - "skillname": "", - "foldername": "Evcan-alerts-skill", - "name": "", - "url": "https://github.com/krywenko/Evcan-alerts-skill", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "if you visual display then you can use my https://github.com/krywenko/TFT-ifterface-for-Mycroft-AI - you also need to install mosquitto-clients" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Evcan Alerts Skill", - "android_handler": "Evcan-alerts-skill.krywenko.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-05-14T18:56:25Z", - "archived": false, - "license": "mit", - "modified": "2019-05-21T11:31:04Z", - "authorname": "tony1661", - "skillname": "Coffee Warmer Mycroft Skill", - "foldername": "Mycroft-Coffee-Warmer", - "name": "Coffee Warmer Mycroft Skill", - "url": "https://github.com/tony1661/Mycroft-Coffee-Warmer", - "category": null, - "description": "A custom Mycroft skill I created to turn my sonoff on and off for my coffee mug warmer. Included is the custom sonoff firmware I got from another website which I slightly modified for my needs. You can find that firmware in the sonoff.cfg file. I am using a Sonoff Basic.", - "short_description": "", - "branch": "master", - "examples": [ - "Turn on my coffee warmer.", - "Turn off my coffee warmer.", - "Turn on my coffee warmer", - "Turn off my coffee warmer" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Tony Fernandez" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Coffee Warmer Skill", - "android_handler": "Mycroft-Coffee-Warmer.tony1661.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-08-28T06:46:33Z", - "archived": false, - "license": "mit", - "modified": "2020-01-22T07:27:07Z", - "authorname": "krisgesling", - "skillname": "Nevermind", - "foldername": "nevermind-skill", - "name": "Nevermind", - "url": "https://github.com/krisgesling/nevermind-skill", - "category": "Configuration", - "description": "There's no button on Linux, but who needs one? This skill teaches Mycroft a handful of dismissive terms, in case you should change your mind after speaking the wake word.\n\nThis skill includes a setting \"verbal_feedback\" which, if set to False, does exactly what it sounds like, enabling you to dismiss Mycroft silently. However, I have not yet implemented a way to *toggle* that value, so verbal feedback is always on.", - "short_description": "Dismisses Mycroft", - "branch": "master", - "examples": [ - "Nevermind.", - "Dismissed.", - "Forget it.", - "Go away.", - "nevermind", - "dismissed", - "forget it", - "go away" - ], - "tags": [ - "Configuration", - "basic", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/meh-blank.svg", - "credits": [ - "@ChanceNCounter" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Nevermind Skill", - "android_handler": "nevermind-skill.krisgesling.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-01-14T16:50:09Z", - "archived": false, - "license": "mit", - "modified": "2019-10-12T11:35:15Z", - "authorname": "colla69", - "skillname": "Computer Helper Skill", - "foldername": "ComputerHelperSkill", - "name": "Computer Helper Skill", - "url": "https://github.com/colla69/ComputerHelperSkill", - "category": null, - "description": "You can use this skill as an example to what you can do .. basically anything you can do in python on your pc can also be used with speech commands. This is my own playground :)", - "short_description": "", - "branch": "master", - "examples": [ - "Open chrome.", - "Good night.", - "Hey Mycroft, open chrome > open a new browser window", - "Hey Mycroft, good night > turns off the computer screen" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "colla69" - ], - "requirements": { - "python": [ - "gensim", - "pynput" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Computerhelperskill Skill", - "android_handler": "ComputerHelperSkill.colla69.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-12-18T13:05:04Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-12-27T14:11:54Z", - "authorname": "kalyaninagaraj", - "skillname": "Podcast Player", - "foldername": "podcast-player-skill", - "name": "Podcast Player", - "url": "https://github.com/kalyaninagaraj/podcast-player-skill", - "category": "Music & Audio", - "description": "Unlike some of the other podcast players, this skill does not maintain a playlist.\n\nInstead, this skill lets you to play a particular episode by identifying the season and episode number to Mycroft.", - "short_description": "Mycroft plays the latest episode of your favorite podcast.", - "branch": "master", - "examples": [ - "*Play \\*podcast-name\\** (Plays the latest episode)", - "*Play season 2 episode 5 of \\*podcast-name\\** (Plays episode 5 of season 2)", - "*Play episode 6 of \\*podcast-name\\** (Plays episode 6 of the latest season)", - "*Play season 3 of \\*podcast-name\\** (Plays episode 1 of season 3)", - "*Play episode 6 of \\*podcast-name\\** (Plays episode 6 of the latest season) " - ], - "tags": [ - "Podcast", - "AI", - "Music", - "Audio", - "Media", - "Entertainment", - "Mycroft", - "Music & Audio", - "Mycroft AI", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/podcast.svg", - "credits": [ - "[@kalyaninagaraj](https://github.com/kalyaninagaraj/)" - ], - "categories": [ - "Music & Audio", - "Media", - "Entertainment" - ], - "requirements": { - "python": [ - "requests", - "feedparser" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Podcast Player Skill", - "android_handler": "podcast-player-skill.kalyaninagaraj.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-10-24T21:39:40Z", - "archived": false, - "license": "mit", - "modified": "2020-05-27T13:40:58Z", - "authorname": "UMD-AIMAR", - "skillname": "Files", - "foldername": "mycroft_aimar", - "name": "Files", - "url": "https://github.com/UMD-AIMAR/mycroft_aimar", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "PyYAML~=5.3.1", - "rospy~=1.15.9", - "fuzzywuzzy~=0.18.0", - "python-Levenshtein~=0.12.1", - "nltk~=3.5", - "requests~=2.22.0", - "numpy~=1.17.4" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft_Aimar Skill", - "android_handler": "mycroft_aimar.umd-aimar.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-01-26T15:01:15Z", - "archived": false, - "license": "unknown", - "modified": "2019-01-26T17:08:21Z", - "authorname": "HotcakesSanderson", - "skillname": "Riddles", - "foldername": "riddles-skill", - "name": "Riddles", - "url": "https://github.com/HotcakesSanderson/riddles-skill", - "category": null, - "description": "Mycroft will ask you riddles.", - "short_description": "", - "branch": "master", - "examples": [ - "Tell me a riddle.", - "Riddles." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Hotcakes Sanderson" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Riddles Skill", - "android_handler": "riddles-skill.hotcakessanderson.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-11-26T17:33:40Z", - "archived": false, - "license": "unknown", - "modified": "2019-11-26T17:44:53Z", - "authorname": "yogi1510", - "skillname": "About", - "foldername": "AIskills", - "name": "About", - "url": "https://github.com/yogi1510/AIskills", - "category": "Configuration", - "description": "Testing Mycroft skill development - reveals yogesh's true nature", - "short_description": "", - "branch": "master", - "examples": [ - "Yogesh.", - "Yogi.", - "Yogesh", - "Yogi" - ], - "tags": [ - "Configuration", - "yogesh", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Aiskills Skill", - "android_handler": "AIskills.yogi1510.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-12-02T15:29:21Z", - "archived": false, - "license": "unknown", - "modified": "2019-12-03T14:53:21Z", - "authorname": "yogi1510", - "skillname": "About", - "foldername": "NavigationSkill-VirtualAssistant", - "name": "About", - "url": "https://github.com/yogi1510/NavigationSkill-VirtualAssistant", - "category": "Configuration", - "description": "Testing Mycroft skill development - navigates from office to home", - "short_description": "", - "branch": "master", - "examples": [ - "Home.", - "Navigate home.", - "Navigation.", - "home", - "navigate home", - "navigation" - ], - "tags": [ - "Configuration", - "navigation", - "navigate", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Navigationskill Virtualassistant Skill", - "android_handler": "NavigationSkill-VirtualAssistant.yogi1510.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-04-13T10:19:54Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-04-27T09:15:59Z", - "authorname": "lb803", - "skillname": "Calcurse", - "foldername": "calcurse-skill", - "name": "Calcurse", - "url": "https://github.com/lb803/calcurse-skill", - "category": null, - "description": "This skill is a [calcurse](https://packages.debian.org/stable/calcurse) wrapper for [Mycroft](https://mycroft.ai/).", - "short_description": "", - "branch": "master", - "examples": [ - "What's on my calendar?" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Luca Baffa" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Calcurse Skill", - "android_handler": "calcurse-skill.lb803.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-12-13T13:21:50Z", - "archived": false, - "license": "unknown", - "modified": "2019-12-22T12:33:03Z", - "authorname": "yogi1510", - "skillname": "About", - "foldername": "NavigateSkill-VirtualAssistant", - "name": "About", - "url": "https://github.com/yogi1510/NavigateSkill-VirtualAssistant", - "category": "Configuration", - "description": "Testing Mycroft skill development - navigates from office to home", - "short_description": "", - "branch": "master", - "examples": [ - "Navigate from place1 to place2.", - "What is the distance from place1 to place2?", - "navigate from place1 to place2", - "what is the distance from place1 to place2" - ], - "tags": [ - "direction", - "navigation", - "Configuration", - "navigate", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Navigateskill Virtualassistant Skill", - "android_handler": "NavigateSkill-VirtualAssistant.yogi1510.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-11-04T20:26:01Z", - "archived": false, - "license": "unknown", - "modified": "2019-11-04T20:26:11Z", - "authorname": "gilbr1098", - "skillname": "Jeedom Assistant", - "foldername": "jeedom-assistant-skill", - "name": "Jeedom Assistant", - "url": "https://github.com/gilbr1098/jeedom-assistant-skill", - "category": "IoT", - "description": "Mycroft will call jeedom scenarios to trigger actions on home automation controller.", - "short_description": "Mycroft interaction to jeedom", - "branch": "master", - "examples": [], - "tags": [ - "IoT", - "Home", - "automation", - "Domotic", - "Iot", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Jeedom Assistant Skill", - "android_handler": "jeedom-assistant-skill.gilbr1098.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-02-17T09:27:50Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-02-17T09:28:09Z", - "authorname": "andlo", - "skillname": "Andersen's Fairy Tales", - "foldername": "grimms-skill", - "name": "Andersen's Fairy Tales", - "url": "https://github.com/andlo/grimms-skill", - "category": "Entertainment", - "description": "This skill enables Mycroft to tell H. C. Andersen's Fairy Tales. So enjoy these good stories from the famious Danish auhtor.\n\nContent is from andersenstories.com, so please go visit there if you like the stories and want them in text to read.\n\nhttps://www.andersenstories.com/\n\n_“If you want your children to be intelligent, read them fairy tales. If you want them to be more\nintelligent, read them more fairy tales.”\nAlbert Einstein_", - "short_description": "Mycroft tells H. C. Andersen's Fairy Tales", - "branch": "master", - "examples": [ - "Tell a H. C. Andersen storie.", - "Tell me the H. C. Andersen story The Little Match Girl.", - "Continue H. C. Andersen story.", - "Tell a H. C. Andersen storie", - "Tell me the H. C. Andersen story The Little Match Girl", - "Continue H. C. Andersen story" - ], - "tags": [ - "fairy", - "stories", - "fairytale", - "fairytales", - "hca", - "Entertainment", - "tales", - "andersen", - "story", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "story-512.png", - "credits": [ - "Andreas Lorensen (@andlo)" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [ - "bs4" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Grimms Skill", - "android_handler": "grimms-skill.andlo.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-09-26T20:21:36Z", - "archived": false, - "license": "mit", - "modified": "2020-03-09T02:24:59Z", - "authorname": "moritzgloeckl", - "skillname": "Todoist", - "foldername": "todoist-skill", - "name": "Todoist", - "url": "https://github.com/moritzgloeckl/todoist-skill", - "category": "Productivity", - "description": "Add new tasks to your Todoist todo-list, complete tasks or check what's on your todos for a specific day/date or project. Works with or without a Todoist premium membership.\n\nTo setup the skill you can either click on the Connect button in the skill settings in home.mycroft.ai or enter your Todoist API key.", - "short_description": "Manage your Todoist tasks", - "branch": "master", - "examples": [ - "What's on my todo list?", - "Put buy groceries due tomorrow on my todos.", - "Mark buy a new computer as complete.", - "Put buy groceries due tomorrow on my todos", - "Mark buy a new computer as complete" - ], - "tags": [ - "todo", - "todolist", - "Productivity", - "Daily", - "todoist", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/check-double.svg", - "credits": [ - "@moritzgloeckl Moritz Glöckl" - ], - "categories": [ - "Productivity", - "Daily" - ], - "requirements": { - "python": [ - "todoist-python==8.0.0", - "oauth2client" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Todoist Skill", - "android_handler": "todoist-skill.moritzgloeckl.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-04-06T14:46:32Z", - "archived": false, - "license": "unknown", - "modified": "2019-04-07T14:59:11Z", - "authorname": "MaxGolden", - "skillname": "Whitenoise", - "foldername": "test-skill", - "name": "Whitenoise", - "url": "https://github.com/MaxGolden/test-skill", - "category": "Entertainment", - "description": "Mycroft will play the whitenoise by using text to speech.", - "short_description": "Mycroft whitenoise", - "branch": "master", - "examples": [ - "Play some whitenoise.", - "play some whitenoise" - ], - "tags": [ - "lyrics", - "music", - "sing", - "Entertainment", - "singing", - "song", - "texttospeech", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/laugh-beam.svg", - "credits": [ - "max" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Test Skill", - "android_handler": "test-skill.maxgolden.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-03-13T00:58:41Z", - "archived": false, - "license": "unknown", - "modified": "2020-05-30T19:50:53Z", - "authorname": "PayloadBae", - "skillname": "Emby", - "foldername": "music", - "name": "Emby", - "url": "https://github.com/PayloadBae/music", - "category": "Music", - "description": "Stream music from your Emby server using Mycroft! Play all songs by an artist or an instant mix of any artist/album/song in your Emby library.", - "short_description": "This skill allows audio playback from an Emby server", - "branch": "master", - "examples": [ - "Play Dance Gavin Dance From Emby.", - "Play Artist Thrice From Emby.", - "Play Album Deadweight From Emby.", - "Play Dance Gavin Dance From Emby", - "Play Artist Thrice From Emby", - "play Album Deadweight From Emby" - ], - "tags": [ - "Music", - "Emby,Music", - "Emby,", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "icon": "https://rawgithub.com/FortAwesome/Font-Awesome/master/advanced-options/raw-svg/solid/play.svg", - "credits": [ - "rickyphewitt" - ], - "categories": [ - "Music" - ], - "requirements": { - "python": [ - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Music Skill", - "android_handler": "music.payloadbae.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-04-13T05:55:37Z", - "archived": false, - "license": "mit", - "modified": "2020-05-01T11:10:19Z", - "authorname": "krisgesling", - "skillname": "", - "foldername": "skill-my-episodes", - "name": "", - "url": "https://github.com/krisgesling/skill-my-episodes", - "category": "Information", - "description": "You will be able to ask Mycroft to check the status of your shows list handled by [MyEpisodes.com](http://www.myepisodes.com). \nMycroft will be able to give you the number of episodes not acquired and optionally the number of episodes acquired but not watched.\nAlso you will be able to find out the unacquired seasons and episdes numbers", - "short_description": "My Episodes", - "branch": "master", - "examples": [ - "Check my episodes.", - "Any new episodes.", - "Check tv shows.", - "Any new episodes.", - "Anything new on my episodes.", - "check my episodes", - "any new episodes", - "check tv shows", - "any new episodes", - "anything new on my episodes" - ], - "tags": [ - "tv", - "myepisodes.com", - "episodes", - "Entertainment", - "series", - "Information", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "http://www.myepisodes.com/img/myepisodes_logo.jpg", - "credits": [ - "Bogdan Brezuica (@brezuicabogdan)\n\n##Disclaimer\nNote that I am not affiliated in any way with [MyEpisodes.com](http://www.myepisodes.com) and/or the services they provide. I am not responsible for the services they provide nor is [MyEpisodes.com](http://www.myepisodes.com) responsible for this skill. \nI just use and like the services [MyEpisodes.com](http://www.myepisodes.com) provides free of charge and would like to have Mycroft be able to access this service. \nThis skill uses the RSS feed [MyEpisodes.com](http://www.myepisodes.com) provides as part of their free service." - ], - "categories": [ - "Information", - "Entertainment" - ], - "requirements": { - "python": [ - "feedparser" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "My Episodes Skill", - "android_handler": "skill-my-episodes.krisgesling.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-04-20T22:11:59Z", - "archived": false, - "license": "unknown", - "modified": "2019-04-21T14:35:36Z", - "authorname": "tony1661", - "skillname": "YOUR SKILL NAME", - "foldername": "hello-world", - "name": "YOUR SKILL NAME", - "url": "https://github.com/tony1661/hello-world", - "category": null, - "description": "My first hellow world skill for Mycroft.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Hello World Skill", - "android_handler": "hello-world.tony1661.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-12-23T08:37:20Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-12-27T15:01:19Z", - "authorname": "kalyaninagaraj", - "skillname": "All India Radio News", - "foldername": "all-india-radio-skill", - "name": "All India Radio News", - "url": "https://github.com/kalyaninagaraj/all-india-radio-skill", - "category": "Daily", - "description": "Mycroft streams five to fifteen minute news bulletins from All India Radio's News Service Division website. For more information about the streaming service, visit its [podcast page](http://www.newsonair.nic.in/Podcast.aspx).\n\nThis skill can play either the national news (by default, in English), or the regional news (by default, from Pune in Marathi). To change to a different language or local station, modify the skill settings at [home.mycroft.ai](https://home.mycroft.ai).", - "short_description": "Plays the latest news bulletin from [All India Radio](http://www.newsonair.nic.in/Default.aspx).", - "branch": "master", - "examples": [ - "Play All India Radio.", - "Play the national news on All India Radio.", - "Play the local news on All India Radio.", - "Play All India Radio", - "Play the national news on All India Radio", - "Play the local news on All India Radio" - ], - "tags": [ - "India", - "AIR", - "AI", - "News", - "Akashvani", - "Media", - "Daily", - "All", - "Mycroft", - "Radio", - "Mycroft AI", - "All India Radio News", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/broadcast-tower.svg", - "credits": [ - "[@kalyaninagaraj](https://github.com/kalyaninagaraj/)" - ], - "categories": [ - "Daily", - "Media" - ], - "requirements": { - "python": [ - "requests", - "feedparser" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "All India Radio Skill", - "android_handler": "all-india-radio-skill.kalyaninagaraj.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-12-12T19:25:22Z", - "archived": false, - "license": "mit", - "modified": "2019-12-12T20:11:09Z", - "authorname": "idusertbs", - "skillname": "rasa-chat", - "foldername": "mycroft-skill-banorte-demo", - "name": "rasa-chat", - "url": "https://github.com/idusertbs/mycroft-skill-banorte-demo", - "category": null, - "description": "The package Rasa is a nice fit for Mycroft, as it allows you to build conversational agents without handing over your data to a third-party service. This package is designed to hit the Rasa REST endpoints and speak the resultant messages.\n\nTo start a chat, say \"chat with bot\" and to end it, say \"stop\"\n\nOnce you're chatting, this skill will override most Mycroft functionality, and you will be in a conversation with the Rasa bot until you end the chat or are silent too long.", - "short_description": "", - "branch": "master", - "examples": [ - "Chat with bot.", - "Talk to rasa.", - "Stop.", - "chat with bot", - "talk to rasa", - "stop" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "jamesmf" - ], - "requirements": { - "python": [ - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Banorte Demo Skill", - "android_handler": "mycroft-skill-banorte-demo.idusertbs.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-02-10T00:53:55Z", - "archived": false, - "license": "mit", - "modified": "2020-01-19T16:38:05Z", - "authorname": "Shadowsith", - "skillname": "App Launcher Skill", - "foldername": "mycroft-app-launcher", - "name": "App Launcher Skill", - "url": "https://github.com/Shadowsith/mycroft-app-launcher", - "category": null, - "description": "The App Launcher Skill allows to open and close linux desktop applications\nwith simple open/close commands. It is very similiar to [Desktop\nLauncher](https://github.com/MycroftAI/skill-desktop-launcher) from Mycroft but\nony uses subprocesses to open/close programs. It also gives you a message if a\napplication is not found on the device.", - "short_description": "", - "branch": "master", - "examples": [ - "App open firefox.", - "Program open firefox.", - "App launch thunderbird.", - "App close firefox.", - "App exit thunderbird.", - "Program close chromium.", - "App open firefox", - "Program open firefox", - "App launch thunderbird", - "App close firefox", - "App exit thunderbird", - "Program close chromium" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "Philip Mayer" - ], - "requirements": { - "python": [ - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft App Launcher Skill", - "android_handler": "mycroft-app-launcher.shadowsith.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-06-17T08:00:44Z", - "archived": false, - "license": "unknown", - "modified": "2020-05-06T21:05:59Z", - "authorname": "ndato", - "skillname": "About", - "foldername": "baby-talk-skill", - "name": "About", - "url": "https://github.com/ndato/baby-talk-skill", - "category": "Entertainment", - "description": "Communicate to mycroft as if you're talking to a baby.", - "short_description": "", - "branch": "master", - "examples": [ - "Beautiful eyes!", - "How old are you?", - "Who's a good baby?" - ], - "tags": [ - "Simulation", - "Communication", - "Baby", - "Entertainment", - "talk", - "Baby talk", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Neriah \"BJ\" Ato" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Baby Talk Skill", - "android_handler": "baby-talk-skill.ndato.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-03-03T13:52:45Z", - "archived": false, - "license": "apache-2.0", - "modified": "2019-12-21T11:32:34Z", - "authorname": "johanpalmqvist", - "skillname": "logitech media server skill", - "foldername": "skill-squeezebox", - "name": "logitech media server skill", - "url": "https://github.com/johanpalmqvist/skill-squeezebox", - "category": null, - "description": "This module controls streaming of content from a Logitech Media Server.", - "short_description": "", - "branch": "master", - "examples": [ - "Play electronic music.", - "Play artist covenant.", - "Play favorite slay radio.", - "Pause music playback.", - "Identify musical composition.", - "Stop playback.", - "play electronic music", - "play artist covenant", - "play favorite slay radio", - "pause music playback", - "identify musical composition", - "stop playback" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "credits": [ - "Johan Palmqvist <johan.palmqvist-mycroft@kenkon.net>" - ], - "requirements": { - "python": [ - "fuzzywuzzy==0.14.0", - "python-Levenshtein==0.12.0", - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Squeezebox Skill", - "android_handler": "skill-squeezebox.johanpalmqvist.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-07-07T17:10:13Z", - "archived": false, - "license": "apache-2.0", - "modified": "2019-07-13T15:24:17Z", - "authorname": "arraylabs", - "skillname": "ReSpeaker Mic Array v2 (usb) Mycroft A.I. Skill", - "foldername": "mycroft-respeaker-usb-pixel-ring", - "name": "ReSpeaker Mic Array v2 (usb) Mycroft A.I. Skill", - "url": "https://github.com/arraylabs/mycroft-respeaker-usb-pixel-ring", - "category": null, - "description": "Use the Respeaker Mic Array v2 (usb) with Mycroft A.I.", - "short_description": "Use the Respeaker Mic Array v2 (usb) with Mycroft A.I.", - "branch": "master", - "examples": [ - "Enable pixel ring.", - "Disable pixel ring." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://camo.githubusercontent.com/16b0193e895780987f64fdbef7551c4adbd4033f/68747470733a2f2f7261772e6769746861636b2e636f6d2f466f7274417765736f6d652f466f6e742d417765736f6d652f6d61737465722f737667732f736f6c69642f636f672e737667", - "credits": [ - "Dominik (@domcross)<br>\nJ1nx (@j1nx)" - ], - "requirements": { - "python": [ - "pixel-ring\r" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Respeaker Usb Pixel Ring Skill", - "android_handler": "mycroft-respeaker-usb-pixel-ring.arraylabs.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-03-23T15:21:27Z", - "archived": false, - "license": "unknown", - "modified": "2020-04-15T19:27:10Z", - "authorname": "HotcakesSanderson", - "skillname": "Meowcroft", - "foldername": "meowcroft-skill", - "name": "Meowcroft", - "url": "https://github.com/HotcakesSanderson/meowcroft-skill", - "category": null, - "description": "Mycroft will play audio sounds of a cat.", - "short_description": "", - "branch": "master", - "examples": [ - "Meow.", - "What sound does a cat make?", - "What noise does a cat make?" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "H.Sanderson & Turlough" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Meowcroft Skill", - "android_handler": "meowcroft-skill.hotcakessanderson.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-05-22T01:05:17Z", - "archived": false, - "license": "mit", - "modified": "2019-05-30T15:57:58Z", - "authorname": "magicaltrevor", - "skillname": "Myvis", - "foldername": "myvis", - "name": "Myvis", - "url": "https://github.com/magicaltrevor/myvis", - "category": null, - "description": "Mostly this is an exercise to learn about the differences that Mycroft has from Alexa in handling intents, dialogs, and vocabulary. Ultimately this should implement some type of machine learning to figure out what you want it to do by learning your habits.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello Jarvis.", - "Greetings computer.", - "Count up.", - "Count down.", - "Hello Jarvis", - "Greetings computer", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Trevor Griffin" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Myvis Skill", - "android_handler": "myvis.magicaltrevor.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-10-23T01:21:13Z", - "archived": false, - "license": "unknown", - "modified": "2019-10-23T02:40:42Z", - "authorname": "krisgesling", - "skillname": "Dev Ex Get Response", - "foldername": "dev-ex-get-response-skill", - "name": "Dev Ex Get Response", - "url": "https://github.com/krisgesling/dev-ex-get-response-skill", - "category": "Development", - "description": "DO NOT USE.\nThis was a quick first draft, it does not work.\n\nIf you're interested in contributing please reach out via [Mycroft Chat](https://chat.mycroft.ai/community/messages/@gez-mycroft).", - "short_description": "How to use the get_response method in a mycroft skill.", - "branch": "master", - "examples": [ - "Ask me a question.", - "Ask me a question" - ], - "tags": [ - "Development", - "Code", - "Example", - "Dev", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "krisgesling" - ], - "categories": [ - "Development" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Dev Ex Get Response Skill", - "android_handler": "dev-ex-get-response-skill.krisgesling.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-08-29T10:58:03Z", - "archived": false, - "license": "apache-2.0", - "modified": "2019-08-29T10:58:14Z", - "authorname": "drunau", - "skillname": "Raspberry Pi GPIO Demo", - "foldername": "Controlling_GPIO", - "name": "Raspberry Pi GPIO Demo", - "url": "https://github.com/drunau/Controlling_GPIO", - "category": "IoT", - "description": "This Skill demonstrates how to interact with the Raspberry Pi GPIO pins using a Mycroft Skill. This Skill shows both reading data from a GPIO port (detecting a button press) and writing data to the port (illuminating an LED). \n\n### Preparation\n\n[You will need to first install the GPIO libraries for Picroft, and add some additional permissions](https://mycroft.ai/documentation/picroft/#using-the-gpio-pins-on-the-raspberry-pi-3).\n\n### Generation\n\nThe documentation is done using Sphinx, which picks up comments from the code. The following will generate the html docs.\n\n```make docs```\n\nYou can then find the generated html in ```docs/build/html/index.html```. Open that file in your browser and you should be able to navigate to the docs.\n\n### Installing from the `makefile`\n\n\nThat is, edit the file `makefile` using your favorite editor like `nano` or `vi`. \n\nThe line you will need to change is `scp -r * pi@192.168.205.115:/opt/mycroft/skills/skill-gpio`. \n\nChange this to have the IP address of your RPi. \n\n\nYou can do this by using the command `mkdir /opt/mycroft/skills/skill-gpio`\n\n\n### Testing the `makefile`\n\n```make test.pi```\n\nThis will run a test to be sure you have access to the GPIO and will report any errors that are identified. \n\n### Notes\n\nIf the LED blinking is too fast, it will be difficult to get a command to execute because there will be a voice response when the the LED turns off and on. Turn the blinking to a lower frequency to be able to execute commands. \n\n### Circuit\nPlease use the below image as a guide to the circuit layout: \n\n![](https://github.com/MycroftAI/picroft_example_skill_gpio/blob/master/IMG_20170706_153744.jpg)\nChange the Makefile IP address for the RPi installation to the IP address of your RPi. \n * Create the folder /opt/mycroft/skills/skill-gpio on the RPi for the installer. \n * Build the code using the makefile. make install.pi", - "short_description": "Example of interacting with GPIO pins on a Raspberry Pi", - "branch": "master", - "examples": [ - "Turn LED on.", - "Turn LED off.", - "Blink LED.", - "LED status.", - "Turn LED on", - "Turn LED off", - "Blink LED", - "LED status" - ], - "tags": [ - "IoT", - "GPIO", - "RPi", - "no-license" - ], - "platforms": [ - "platform_mark1", - "platform_picroft" - ], - "stars": 0, - "icon": "https://rawgithub.com/FortAwesome/Font-Awesome/master/advanced-options/raw-svg/solid/microchip.svg", - "credits": [ - "@amcgee7\nMycroft AI (@MycroftAI)" - ], - "categories": [ - "IoT" - ], - "requirements": { - "python": [ - "GPIO" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Controlling_Gpio Skill", - "android_handler": "Controlling_GPIO.drunau.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-03-05T09:23:39Z", - "archived": false, - "license": "apache-2.0", - "modified": "2019-03-05T09:23:58Z", - "authorname": "Shivaabhai", - "skillname": "Raspberry Pi GPIO Demo", - "foldername": "picroft", - "name": "Raspberry Pi GPIO Demo", - "url": "https://github.com/Shivaabhai/picroft", - "category": "IoT", - "description": "This Skill demonstrates how to interact with the Raspberry Pi GPIO pins using a Mycroft Skill. This Skill shows both reading data from a GPIO port (detecting a button press) and writing data to the port (illuminating an LED). \n\n### Preparation\n\n[You will need to first install the GPIO libraries for Picroft, and add some additional permissions](https://mycroft.ai/documentation/picroft/#using-the-gpio-pins-on-the-raspberry-pi-3).\n\n### Generation\n\nThe documentation is done using Sphinx, which picks up comments from the code. The following will generate the html docs.\n\n```make docs```\n\nYou can then find the generated html in ```docs/build/html/index.html```. Open that file in your browser and you should be able to navigate to the docs.\n\n### Installing from the `makefile`\n\n\nThat is, edit the file `makefile` using your favorite editor like `nano` or `vi`. \n\nThe line you will need to change is `scp -r * pi@192.168.205.115:/opt/mycroft/skills/skill-gpio`. \n\nChange this to have the IP address of your RPi. \n\n\nYou can do this by using the command `mkdir /opt/mycroft/skills/skill-gpio`\n\n\n### Testing the `makefile`\n\n```make test.pi```\n\nThis will run a test to be sure you have access to the GPIO and will report any errors that are identified. \n\n### Notes\n\nIf the LED blinking is too fast, it will be difficult to get a command to execute because there will be a voice response when the the LED turns off and on. Turn the blinking to a lower frequency to be able to execute commands. \n\n### Circuit\nPlease use the below image as a guide to the circuit layout: \n\n![](https://github.com/MycroftAI/picroft_example_skill_gpio/blob/master/IMG_20170706_153744.jpg)\nChange the Makefile IP address for the RPi installation to the IP address of your RPi. \n * Create the folder /opt/mycroft/skills/skill-gpio on the RPi for the installer. \n * Build the code using the makefile. make install.pi", - "short_description": "Example of interacting with GPIO pins on a Raspberry Pi", - "branch": "master", - "examples": [ - "Turn LED on.", - "Turn LED off.", - "Blink LED.", - "LED status.", - "Turn LED on", - "Turn LED off", - "Blink LED", - "LED status" - ], - "tags": [ - "IoT", - "GPIO", - "RPi", - "no-license" - ], - "platforms": [ - "platform_mark1", - "platform_picroft" - ], - "stars": 0, - "icon": "https://rawgithub.com/FortAwesome/Font-Awesome/master/advanced-options/raw-svg/solid/microchip.svg", - "credits": [ - "@amcgee7\nMycroft AI (@MycroftAI)" - ], - "categories": [ - "IoT" - ], - "requirements": { - "python": [ - "GPIO" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Picroft Skill", - "android_handler": "picroft.shivaabhai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-01-01T16:39:57Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-01-05T17:03:25Z", - "authorname": "mehmetaergun", - "skillname": "Kodi Remote Skill", - "foldername": "skill-kodi-remote", - "name": "Kodi Remote Skill", - "url": "https://github.com/mehmetaergun/skill-kodi-remote", - "category": "Media", - "description": "A barebones Mycroft AI Skill to Interact with the Kodi media player", - "short_description": "A barebones Mycroft AI Skill to Interact with the Kodi media player", - "branch": "master", - "examples": [ - "Pause Kodi.", - "Resume Kodi.", - "Stop Kodi.", - "Set volume to 8 on Kodi.", - "Pause Kodi (pauses the currently playing movie)", - "Resume Kodi (resumes the currently playing movie)", - "Stop Kodi (stops the currently playing movie)", - "Set volume to 8 on Kodi (volume level should be between 0 and 10)" - ], - "tags": [ - "Media", - "no-license" - ], - "platforms": [ - "platform_mark1", - "platform_picroft" - ], - "stars": 0, - "credits": [ - "[Cadair](https://github.com/Cadair/mycroft-kodi); [PCWii](https://github.com/pcwii/kodi-skill)" - ], - "categories": [ - "Media" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Kodi Remote Skill", - "android_handler": "skill-kodi-remote.mehmetaergun.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-08-05T09:10:55Z", - "archived": false, - "license": "apache-2.0", - "modified": "2019-08-05T09:21:02Z", - "authorname": "MOHIT-sketch", - "skillname": "Raspberry Pi GPIO Demo", - "foldername": "rasp", - "name": "Raspberry Pi GPIO Demo", - "url": "https://github.com/MOHIT-sketch/rasp", - "category": "IoT", - "description": "This Skill demonstrates how to interact with the Raspberry Pi GPIO pins using a Mycroft Skill. This Skill shows both reading data from a GPIO port (detecting a button press) and writing data to the port (illuminating an LED). \n\n### Preparation\n\n[You will need to first install the GPIO libraries for Picroft, and add some additional permissions](https://mycroft.ai/documentation/picroft/#using-the-gpio-pins-on-the-raspberry-pi-3).\n\n### Generation\n\nThe documentation is done using Sphinx, which picks up comments from the code. The following will generate the html docs.\n\n```make docs```\n\nYou can then find the generated html in ```docs/build/html/index.html```. Open that file in your browser and you should be able to navigate to the docs.\n\n### Installing from the `makefile`\n\n\nThat is, edit the file `makefile` using your favorite editor like `nano` or `vi`. \n\nThe line you will need to change is `scp -r * pi@192.168.205.115:/opt/mycroft/skills/skill-gpio`. \n\nChange this to have the IP address of your RPi. \n\n\nYou can do this by using the command `mkdir /opt/mycroft/skills/skill-gpio`\n\n\n### Testing the `makefile`\n\n```make test.pi```\n\nThis will run a test to be sure you have access to the GPIO and will report any errors that are identified. \n\n### Notes\n\nIf the LED blinking is too fast, it will be difficult to get a command to execute because there will be a voice response when the the LED turns off and on. Turn the blinking to a lower frequency to be able to execute commands. \n\n### Circuit\nPlease use the below image as a guide to the circuit layout: \n\n![](https://github.com/MycroftAI/picroft_example_skill_gpio/blob/master/IMG_20170706_153744.jpg)\nChange the Makefile IP address for the RPi installation to the IP address of your RPi. \n * Create the folder /opt/mycroft/skills/skill-gpio on the RPi for the installer. \n * Build the code using the makefile. make install.pi", - "short_description": "Example of interacting with GPIO pins on a Raspberry Pi", - "branch": "master", - "examples": [ - "Turn LED on.", - "Turn LED off.", - "Blink LED.", - "LED status.", - "Turn LED on", - "Turn LED off", - "Blink LED", - "LED status" - ], - "tags": [ - "IoT", - "GPIO", - "RPi", - "no-license" - ], - "platforms": [ - "platform_mark1", - "platform_picroft" - ], - "stars": 0, - "icon": "https://rawgithub.com/FortAwesome/Font-Awesome/master/advanced-options/raw-svg/solid/microchip.svg", - "credits": [ - "@amcgee7\nMycroft AI (@MycroftAI)" - ], - "categories": [ - "IoT" - ], - "requirements": { - "python": [ - "GPIO" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Rasp Skill", - "android_handler": "rasp.mohit-sketch.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-04-19T03:46:49Z", - "archived": false, - "license": "unknown", - "modified": "2020-07-09T05:57:00Z", - "authorname": "krisgesling", - "skillname": "Skill Testing", - "foldername": "skill-testing-skill", - "name": "Skill Testing", - "url": "https://github.com/krisgesling/skill-testing-skill", - "category": "Configuration", - "description": "### \"read all utterances\"\nEnter a list of phrases in Skill settings to verify which Skill and intent handler is triggered. Phrase list should be in format:\n> phrase one, phrase two, phrase three\n\nAlternatively provide a csv of phrases at: `~/.mycroft/skills/SkillTesting/utterances.csv`\n\nIf a phrase contains a comma it must be surrounded with quotation marks:\n> phrase one, \"phrase, two\", phrase three\n\nAdditional options include:\n\nResults will be uploaded to termbin.com in csv format and the link will be emailed to you. A csv file of the results will also be saved on the device at: `~/.mycroft/skills/SkillTesting/reading-output/{test_identifier}.csv`. Note that when creating the filename, characters not in [a-z, A-Z, 0-9, [.\\_-]] will be removed eg \"weather phrases\" will become \"weatherphrases.csv\". This file can be used to generate integration tests for all phrases.\ntest_identifier - title of the test for your benefit eg 'weather phrases' - default timestamp of test comppletion time.\n * delay - the period in seconds between each phrase - default 30", - "short_description": "Internal utterance testing tool", - "branch": "master", - "examples": [ - "Read all utterances.", - "Generate integration tests.", - "Run integration tests.", - "Remove generated tests.", - "read all utterances", - "generate integration tests", - "run integration tests", - "remove generated tests" - ], - "tags": [ - "Configuration", - "testing", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/vial.svg", - "credits": [ - "krisgesling (@krisgesling)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Testing Skill", - "android_handler": "skill-testing-skill.krisgesling.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-03-10T04:36:44Z", - "archived": false, - "license": "unknown", - "modified": "2019-12-18T05:39:00Z", - "authorname": "Shivaabhai", - "skillname": "Pandora", - "foldername": "savan", - "name": "Pandora", - "url": "https://github.com/Shivaabhai/savan", - "category": null, - "description": "Pandora provides dynamically generated internet radio streams. Streams are\ninfluenced by the the traits of the music played and the songs you like\nor skip.\n\nUsing this skill does require a [Pandora.com](https://pandora.com) account.\nSign-up is free with ad-supported streams.\n\nThis skill should work with Mycroft version 0.9.1 +", - "short_description": "", - "branch": "master", - "examples": [ - "Play Pandora.", - "Play Today's Hits Radio on Pandora.", - "Skip this song.", - "Next station.", - "Next song.", - "Pause Pandora.", - "Resume Pandora.", - "List my stations.", - "Next station.", - "Change station to Today's Top Hits on Pandora.", - "Play Pandora", - "Play Today's Hits Radio on Pandora", - "Skip this song", - "Next station", - "Next song", - "Pause Pandora", - "Resume Pandora", - "List my stations", - "Next station", - "Change station to Today's Top Hits on Pandora" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "Mycroft AI" - ], - "requirements": { - "python": [ - "fuzzywuzzy==0.15.0" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Savan Skill", - "android_handler": "savan.shivaabhai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-04-23T13:37:26Z", - "archived": false, - "license": "unknown", - "modified": "2019-08-30T15:24:43Z", - "authorname": "Ishimaru17", - "skillname": "Deep Learning", - "foldername": "DeepLearning", - "name": "Deep Learning", - "url": "https://github.com/Ishimaru17/DeepLearning", - "category": null, - "description": "Mycroft will be able to have a conversation with an human, about medecine.", - "short_description": "", - "branch": "master", - "examples": [ - "Hey mia.", - "Hello mia.", - "Mia.", - "(When wake up)", - "(When wake up)", - "(When wake up)", - "(When wake up)" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Campora\n\n##How To\nThe blockchain must be initialized somewhere which is outside the skill.\nThen the path must be changed in bot setData.py and blockchain.\nBefore started the Mycroft skill, the blockchain must be started, and the script setData.py must be activate (python3 setData.py) to initialize the data." - ], - "requirements": { - "python": [ - "torchvision", - "web3==3.16.5", - "pycryptodome==3.8.2" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Deeplearning Skill", - "android_handler": "DeepLearning.ishimaru17.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-01-01T14:22:26Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-02-27T21:57:10Z", - "authorname": "andlo", - "skillname": "Remote Debug", - "foldername": "remote-debug-skill", - "name": "Remote Debug", - "url": "https://github.com/andlo/remote-debug-skill", - "category": "Productivity", - "description": "This skill adds PTVSD - Python Tools for Visual Studio debug server to make it posible to \ndebug running skills.\nIt is made as a companion to the THEIA IDE skill to enable debugging from there. But if you\nuse another IDE like VS Code you can use this skill to inject the debug adaptor in the\nmycroft.skills service and attach to it on port 5678.\n\nWhen you activate debugging by saying \"Run debug adaptor\" the skill will change Settings for \npadatious single_thread = true so skills service runs in single thread. \n\nTHEIA IDE is already setup so you just have to start debug from debug menu\n\nWhen finish debugging say \"End debug adaptor\" and skill restore single_thread settings and \nrestart mycroft.skills service\n\n[https://github.com/Microsoft/ptvsd](https://github.com/Microsoft/ptvsd)\n\n### This skills requeue using mycroft.core 19.8.7 or newer releases\n\n### launch.json\nTo use the debug adaptor from THEIA IDE or VS Code make sure ou use Python \nremote attach setting in launch.json\n```\n {\n \"name\": \"Python: Remote Attach\",\n \"type\": \"python\",\n \"request\": \"attach\",\n \"port\": 5678,\n \"host\": \"localhost\",\n }\n```", - "short_description": "Enable PTVSD - Python Tools for Visual Studio debug server", - "branch": "master", - "examples": [ - "Start (remote|ptvsd|) debug adaptor.", - "Enable (remote|ptvsd|) debug adaptor.", - "Run (remote|ptvsd|) debug adaptor.", - "Stop (remote|ptvsd|) debug adaptor.", - "Exit (remote|ptvsd|) debug adaptor.", - "End (remote|ptvsd|) debug adaptor.", - "Start (remote|ptvsd|) debug adaptor", - "Enable (remote|ptvsd|) debug adaptor", - "Run (remote|ptvsd|) debug adaptor", - "Stop (remote|ptvsd|) debug adaptor", - "Exit (remote|ptvsd|) debug adaptor", - "End (remote|ptvsd|) debug adaptor" - ], - "tags": [ - "VSCode", - "THEIA", - "ptvsd", - "Productivity", - "Code", - "debug", - "debugging", - "IDE", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/bug.svg", - "credits": [ - "Andreas Lorensen (@andlo)" - ], - "categories": [ - "Productivity" - ], - "requirements": { - "python": [ - "ptvsd" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Remote Debug Skill", - "android_handler": "remote-debug-skill.andlo.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-10-21T20:38:41Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-05-17T22:12:25Z", - "authorname": "gras64", - "skillname": "Password", - "foldername": "password-skill", - "name": "Password", - "url": "https://github.com/gras64/password-skill", - "category": "Configuration", - "description": "If you can enable this ability to automatically authenticate users, you need to enter a password at home.mycroft.ai and enable the feature. Without login, mycroft deactivates all skills and can be activated using your password or your sentence. you can also set a timeout for logout and you can protect individual skills from being deactivated.", - "short_description": "This skill allow login user", - "branch": "master", - "examples": [ - "Login anton.", - "Password schnizel.", - "Sign in password.", - "Logout.", - "Login anton", - "Password schnizel", - "Sign in password", - "logout" - ], - "tags": [ - "Configuration", - "Password,", - "login", - "Password, login", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "gras64" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Password Skill", - "android_handler": "password-skill.gras64.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-06-26T19:26:27Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-01-29T00:20:11Z", - "authorname": "krywenko", - "skillname": "recipe-library-skill", - "foldername": "recipe-library-skill", - "name": "recipe-library-skill", - "url": "https://github.com/krywenko/recipe-library-skill", - "category": null, - "description": "here is a recipe libary skill for mycroft- it reads locally stored recipes scrapped from allrecipes website . to extract new recipes favourite from allrecipe web site\n simplly run ./recipe with the url of the recipe on allrecipe.com\n example \n ./recipe https://www.allrecipes.com/recipe/230812/standing-roast-beef-brined/\n \n benifit of local stored recipes is that you can modify download or add your own. to suit your pwn preference or correct any weird vocalization mycroft might have . once a recipe has being downloaded it will not add another recipe of the same name to be installed\n update:\n you can now add recipes by catagory from allrecipe.com through the mycroft voice interface\n - beef, pork, chicken, vegan, cake, cookies, bread, snacks, breakfast .. etc\n to list catagories just say what are my recipe catagories \n \n to do download reciped to the device by catagory \n just say \"download new bread recipe\" and it will download the days top bread recipes from allricipe .com\n \n to list recipes by catagory just say \"list bread recipes\" \n \n to have mycroft read out or display recipe - just say - bread recipe \"banana bread\" and it will find your banana bread recipe\n \n read random bread recipe - just say \"random bread recipe\"\n \n individual recipe upload still work ie\n ./recipe https://www.allrecipes.com/recipe/230812/standing-roast-beef-brined/\n but to get acces to those use they are place in a favorite catagory :\n list my favorite recipes --- to list them\n favorite recipe standing roast beef -- to have it read out the recipe \n or random favorite recipe\n \n you need to install lynx for recipe scraper to work\n \n update-\n you can now say \n read ingredients- it will read the line by line after prompt option are yes ( next line) repeat and continue which reads at a slow pace contiously throuh the list\n read directions- it will read the line by line after prompt option are yes ( next line) repeat and continue which reads at a slow pace contiously throuh the each direction\n also email recipe. you just need to adjust emil script to match you email setting ( test for google mail) and you can send to any address. later on i probably add option email to my email address or my wife or table computer \n \n currently after download recipe fore the first time per cat agory you need to wait several minutes before it done after that downloading recipes are much faster", - "short_description": "here is a recipe libary skill for mycroft- it reads locally stored recipes scrapped from allrecipes website . to extract new recipes favourite from allrecipe web site", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Recipe Library Skill", - "android_handler": "recipe-library-skill.krywenko.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-08-09T09:52:50Z", - "archived": false, - "license": "apache-2.0", - "modified": "2019-08-09T09:55:18Z", - "authorname": "AIIX", - "skillname": "Weather", - "foldername": "skill-weather-static", - "name": "Weather", - "url": "https://github.com/AIIX/skill-weather-static", - "category": "Daily", - "description": "Get weather conditions, forecasts, expected precipitation and more! By default it will tell\nyou about your default location, or you can ask for other cities around the world. \n\nCurrent conditions and weather forecasts come from [Open Weather Map](https://openweathermap.org).\n\nFor **enclosures** with screen support, conditions are briefly shown using visemes.\n\nThe temperature is shown in Celsius or Fahrenheit depending on the preferences set in your [https://home.mycroft.ai](https://home.mycroft.ai) account.", - "short_description": "Weather conditions and forecasts", - "branch": "master", - "examples": [ - "What is the weather?", - "What is the forecast tomorrow?", - "What is the weather going to be like Tuesday?", - "What is the weather in Houston?", - "When will it rain next?", - "How windy is it?", - "What's the humidity?", - "Is it going to snow?", - "What's the temperature?" - ], - "tags": [ - "humidity", - "forecast", - "temperature", - "Daily", - "snow", - "rain", - "weather", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://rawgithub.com/FortAwesome/Font-Awesome/master/svgs/solid/sun.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Daily" - ], - "requirements": { - "python": [ - "pyowm==2.6.1", - "requests>=2.13.0", - "multi-key-dict==2.0.3" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Weather Static Skill", - "android_handler": "skill-weather-static.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-01-16T10:12:43Z", - "archived": false, - "license": "apache-2.0", - "modified": "2019-01-16T10:13:33Z", - "authorname": "AIIX", - "skillname": "Weather", - "foldername": "skill-weather-archive-unclean", - "name": "Weather", - "url": "https://github.com/AIIX/skill-weather-archive-unclean", - "category": "Daily", - "description": "Get weather conditions, forecasts, expected precipitation and more! By default it will tell\nyou about your default location, or you can ask for other cities around the world. \n\nCurrent conditions and weather forecasts come from [Open Weather Map](https://openweathermap.org).\n\nFor **enclosures** with screen support, conditions are briefly shown using visemes.\n\nThe temperature is shown in Celsius or Fahrenheit depending on the preferences set in your [https://home.mycroft.ai](https://home.mycroft.ai) account.", - "short_description": "Weather conditions and forecasts", - "branch": "master", - "examples": [ - "What is the weather?", - "What is the forecast tomorrow?", - "What is the weather going to be like Tuesday?", - "What is the weather in Houston?", - "When will it rain next?", - "How windy is it?", - "What's the humidity?", - "Is it going to snow?", - "What's the temperature?" - ], - "tags": [ - "humidity", - "forecast", - "temperature", - "Daily", - "snow", - "rain", - "weather", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://rawgithub.com/FortAwesome/Font-Awesome/master/advanced-options/raw-svg/solid/sun.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Daily" - ], - "requirements": { - "python": [ - "pyowm==2.6.1", - "requests>=2.13.0", - "multi-key-dict==2.0.3" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Weather Archive Unclean Skill", - "android_handler": "skill-weather-archive-unclean.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-06-14T22:33:02Z", - "archived": false, - "license": "unknown", - "modified": "2019-12-19T02:37:21Z", - "authorname": "Flamekebab", - "skillname": "Usage", - "foldername": "skill-youtube-audio", - "name": "Usage", - "url": "https://github.com/Flamekebab/skill-youtube-audio", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [ - "rm", - "urllib", - "sultan", - "bs4", - "youtube-dl" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Youtube Audio Skill", - "android_handler": "skill-youtube-audio.flamekebab.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-12-03T22:15:34Z", - "archived": false, - "license": "apache-2.0", - "modified": "2019-12-03T22:17:09Z", - "authorname": "gras64", - "skillname": "Playback Control", - "foldername": "mycroft-navigaton-control", - "name": "Playback Control", - "url": "https://github.com/gras64/mycroft-navigaton-control", - "category": "Music", - "description": "This Skill doesn't do anything by itself, but it provides an important common\nlanguage for audio playback skills. By handling simple phrases like\n'pause', this one Skill can turn around and rebroadcast the [messagebus](https://mycroft.ai/documentation/message-bus/)\ncommand `mycroft.audio.service.pause`, allowing several music services to share\ncommon terminology such as \"pause\".\n\nAdditionally, this implements the common Play handler. This allows playback\nservices to negotiate which is best suited to play back a specific request.\nThis capability is used by the [Spotify](https://github.com/forslund/spotify-skill) and [Pandora](https://github.com/mycroftai/pianobar-skill) Skills, among others.", - "short_description": "Common playback control system", - "branch": "master", - "examples": [ - "Play my summer playlist.", - "Play Pandora.", - "Pause.", - "Resume.", - "Next song.", - "Next track.", - "Previous track.", - "Previous song.", - "Play my summer playlist", - "Play Pandora", - "Pause", - "Resume", - "Next song", - "Next track", - "Previous track", - "Previous song" - ], - "tags": [ - "music", - "resume", - "system", - "Music", - "next", - "pause", - "play", - "playback", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/play.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Music" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Navigaton Control Skill", - "android_handler": "mycroft-navigaton-control.gras64.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-01-04T13:46:45Z", - "archived": false, - "license": "apache-2.0", - "modified": "2019-01-07T10:09:12Z", - "authorname": "BenjaminDannegard", - "skillname": "Timer", - "foldername": "Dog_timer", - "name": "Timer", - "url": "https://github.com/BenjaminDannegard/Dog_timer", - "category": "Daily", - "description": "Use Mycroft when your hands are messy or you need more that the one timer in your kitchen. Multiple timers are easy to set and track with conversational interactions.\n\nOn a Mark 1 you'll see visual feedback as the timer runs, and you can use\nthe top button to stop the beeping once a timer expires.", - "short_description": "Set named timers for cooking, watering plants, brewing tea and more.", - "branch": "master", - "examples": [ - "Start a timer for 30 seconds.", - "Set a timer for 1 minute.", - "Set a timer for 3 hours called turkey.", - "Start a timer.", - "Cancel the timer.", - "How long is left on the timer?", - "How long is left on the turkey timer?", - "Mute the timer.", - "Start a timer for 30 seconds", - "Set a timer for 1 minute", - "Set a timer for 3 hours called turkey", - "Start a timer (will be prompted)", - "Cancel the timer", - "Mute the timer (once triggered)" - ], - "tags": [ - "timer", - "Daily", - "kitchen-timer", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://rawgithub.com/FortAwesome/Font-Awesome/master/advanced-options/raw-svg/solid/stopwatch.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Daily" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Dog_Timer Skill", - "android_handler": "Dog_timer.benjamindannegard.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-09-27T10:30:15Z", - "archived": false, - "license": "mit", - "modified": "2019-09-28T10:34:45Z", - "authorname": "bijuthank", - "skillname": "diagnose", - "foldername": "diagnose", - "name": "diagnose", - "url": "https://github.com/bijuthank/diagnose", - "category": null, - "description": "Mycroft skill for diagnosis", - "short_description": "Mycroft skill for diagnosis", - "branch": "master", - "examples": [], - "tags": [ - "diagnosis", - "for", - "Mycroft", - "skill", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Diagnose Skill", - "android_handler": "diagnose.bijuthank.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-04-23T19:55:28Z", - "archived": false, - "license": "unknown", - "modified": "2019-04-23T20:54:58Z", - "authorname": "avimeens", - "skillname": "mycroft-first-robotics-2019", - "foldername": "mycroft-first-robotics-2019", - "name": "mycroft-first-robotics-2019", - "url": "https://github.com/avimeens/mycroft-first-robotics-2019", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft First Robotics 2019 Skill", - "android_handler": "mycroft-first-robotics-2019.avimeens.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-09-10T18:52:20Z", - "archived": false, - "license": "unknown", - "modified": "2019-11-12T20:15:51Z", - "authorname": "pcwii", - "skillname": "condor_skill", - "foldername": "condor_skill", - "name": "condor_skill", - "url": "https://github.com/pcwii/condor_skill", - "category": null, - "description": "A PLC and Robotics skill for mycroft.ai", - "short_description": "A PLC and Robotics skill for mycroft.ai", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "paho-mqtt", - "pylogix", - "RPi.GPIO" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Condor_Skill Skill", - "android_handler": "condor_skill.pcwii.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-11-10T14:28:20Z", - "archived": false, - "license": "unknown", - "modified": "2019-11-10T15:41:24Z", - "authorname": "waltk99", - "skillname": "skill-oh-ann", - "foldername": "skill-oh-ann", - "name": "skill-oh-ann", - "url": "https://github.com/waltk99/skill-oh-ann", - "category": null, - "description": "mycroft skill playground", - "short_description": "mycroft skill playground", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Oh Ann Skill", - "android_handler": "skill-oh-ann.waltk99.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-09-06T07:36:40Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-09-06T07:51:36Z", - "authorname": "Gradivis", - "skillname": "Nonsense Skill for Mycroft", - "foldername": "mycroft-nonsense-skill", - "name": "Nonsense Skill for Mycroft", - "url": "https://github.com/Gradivis/mycroft-nonsense-skill", - "category": null, - "description": "### Literally nonsense. \nJust...don't ask.", - "short_description": "### Literally nonsense. ", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Nonsense Skill", - "android_handler": "mycroft-nonsense-skill.gradivis.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-01-01T23:22:40Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-01-02T18:41:51Z", - "authorname": "EpicKau", - "skillname": "Description", - "foldername": "tv-connector-skill", - "name": "Description", - "url": "https://github.com/EpicKau/tv-connector-skill", - "category": null, - "description": "Todo.", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Ape (https://github.com/Ape/samsungctl)<br>" - ], - "requirements": { - "python": [ - "git+https://github.com/EpicKau/samsungctl.git", - "wakeonlan" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Tv Connector Skill", - "android_handler": "tv-connector-skill.epickau.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-02-27T00:04:18Z", - "archived": false, - "license": "unknown", - "modified": "2019-02-27T00:48:53Z", - "authorname": "reaperjudge", - "skillname": "mycroft-readfile", - "foldername": "mycroft-readfile", - "name": "mycroft-readfile", - "url": "https://github.com/reaperjudge/mycroft-readfile", - "category": null, - "description": "To read every line of a file", - "short_description": "To read every line of a file", - "branch": "master", - "examples": [ - "Read file.", - "File read.", - "File.", - "read file", - "file read", - "file" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Readfile Skill", - "android_handler": "mycroft-readfile.reaperjudge.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-12-31T10:44:48Z", - "archived": false, - "license": "unknown", - "modified": "2020-02-04T11:16:40Z", - "authorname": "antoninovara", - "skillname": "Hola Mubita", - "foldername": "Mubita", - "name": "Hola Mubita", - "url": "https://github.com/antoninovara/Mubita", - "category": "Configuration", - "description": "Primera prueba de una Skill para Mubita", - "short_description": "Primera prueba de una Skill para Mubita", - "branch": "master", - "examples": [ - "Felices Fiestas.", - "¿Cómo estás?", - "Gracias." - ], - "tags": [ - "first-skill", - "helloworld", - "Configuration", - "hello", - "greeting", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/smile.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mubita Skill", - "android_handler": "Mubita.antoninovara.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-12-06T15:10:19Z", - "archived": false, - "license": "unknown", - "modified": "2020-02-07T05:02:25Z", - "authorname": "gapaza", - "skillname": "Daphne", - "foldername": "daphne-skill", - "name": "Daphne", - "url": "https://github.com/gapaza/daphne-skill", - "category": "Information", - "description": "Connect mycroft mark ii to daphne server", - "short_description": "Physical embodiment of daphne eoss", - "branch": "master", - "examples": [ - "Connect to daphne.", - "Connect to daphne" - ], - "tags": [ - "Information", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "Gabriel Apaza" - ], - "categories": [ - "Information" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Daphne Skill", - "android_handler": "daphne-skill.gapaza.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-07-23T12:24:58Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-07-06T00:03:05Z", - "authorname": "gras64", - "skillname": "Calculator", - "foldername": "calculator", - "name": "Calculator", - "url": "https://github.com/gras64/calculator", - "category": "Productivity", - "description": "With this skill you can do a lot of arithmetic operations. you can also use formulas like ohm's law. the skill supports the factors of units, formulas brackets, net and gross as well as sales price and calculations of any length \"theoretically\".in the new set version, the skill can also calculate the units back to their original form.\n\npossible factors are: giga, mega, kilo, centi, deci, milli, micro and nano.", - "short_description": "a not so simple calculator skill for Mycroft AI as an alternative to wolfram alpha", - "branch": "master", - "examples": [ - "What is 12 and 2.4 and 6.2 and 12.5?", - "Addiere 4 and 5 from that gross.", - "Divide 600 by 2 from that net.", - "Divide Bracket on 9 and 3 Bracket off and 2.", - "What is 9 times 72 from that sale?", - "Multiply 2 with 3.", - "What is 5 minus 4?", - "Subtract 7 with 6.", - "What is ohm from 40 ampere and 60 volt?", - "What is tension from 40 milliampere and 60 millivolt?", - "What is the breaking point at 130 kmh?", - ".......", - "what is 12 and 2.4 and 6.2 and 12.5", - "addiere 4 and 5 from that gross ", - "divide 600 by 2 from that net", - "divide Bracket on 9 and 3 Bracket off and 2", - "what is 9 times 72 from that sale", - "multiply 2 with 3", - "what is 5 minus 4", - "subtract 7 with 6", - "what is ohm from 40 ampere and 60 volt", - "what is tension from 40 milliampere and 60 millivolt", - "what is the breaking point at 130 kmh", - "....... " - ], - "tags": [ - "Productivity", - "'calculation", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/calculator.svg", - "credits": [ - "gras64" - ], - "categories": [ - "Productivity" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Calculator Skill", - "android_handler": "calculator.gras64.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-08-24T16:02:02Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-08-29T10:18:27Z", - "authorname": "padresb", - "skillname": "Bark", - "foldername": "bark-skill", - "name": "Bark", - "url": "https://github.com/padresb/bark-skill", - "category": "Daily", - "description": "Ask mycroft to bark and it will say ruff", - "short_description": "Barks like a dog", - "branch": "master", - "examples": [ - "Bark.", - "What does a dog say?", - "Look at that cat.", - "Mailman is here.", - "Bark", - "What does a dog say", - "Look at that cat", - "Mailman is here" - ], - "tags": [ - "Daily", - "Bark", - "Dog", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/dog.svg", - "credits": [ - "Bret Padres" - ], - "categories": [ - "Daily" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Bark Skill", - "android_handler": "bark-skill.padresb.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-10-05T20:36:46Z", - "archived": false, - "license": "unknown", - "modified": "2020-02-26T22:46:25Z", - "authorname": "MYesca", - "skillname": "Hello Print", - "foldername": "hello-print-skill", - "name": "Hello Print", - "url": "https://github.com/MYesca/hello-print-skill", - "category": "Entertainment", - "description": "Testing interface between mycroft and a matrix printer from 80s", - "short_description": "My first test to interact with emilia", - "branch": "master", - "examples": [ - "Hello print.", - "Print the test.", - "Test printer.", - "Hello print", - "Print the test", - "Test printer" - ], - "tags": [ - "Vintage", - "Restoration", - "Arts", - "Ascii", - "Entertainment", - "Printer", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "Marcello Yesca" - ], - "categories": [ - "Entertainment", - "Arts", - "Vintage", - "Restoration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Hello Print Skill", - "android_handler": "hello-print-skill.myesca.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-05-18T17:41:00Z", - "archived": false, - "license": "mit", - "modified": "2019-05-20T18:39:54Z", - "authorname": "snow2k9", - "skillname": "Sonos Control", - "foldername": "sonos-control-skill", - "name": "Sonos Control", - "url": "https://github.com/snow2k9/sonos-control-skill", - "category": null, - "description": "**currently only chooses random device**\n\nControl your Sonos with [Mycroft](https://github.com/MycroftAI/mycroft-core)", - "short_description": "", - "branch": "master", - "examples": [ - "Sonos play.", - "Sonos pause.", - "Sonos volume five.", - "Sonos next song." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "- [soco Project](https://github.com/SoCo/SoCo)" - ], - "requirements": { - "python": [ - "git+https://github.com/SoCo/SoCo@master#egg=soco" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Sonos Control Skill", - "android_handler": "sonos-control-skill.snow2k9.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-06-24T03:28:50Z", - "archived": false, - "license": "unknown", - "modified": "2019-06-26T20:01:26Z", - "authorname": "tom-servo", - "skillname": "Unit Converter", - "foldername": "unit-converter-skill", - "name": "Unit Converter", - "url": "https://github.com/tom-servo/unit-converter-skill", - "category": "Information", - "description": "Allows mycroft to convert quantities in one physical unit of measure to another.", - "short_description": "Converts from one unit of measure to another.", - "branch": "master", - "examples": [ - "How many cups in 3 liters?" - ], - "tags": [ - "Conversion", - "Units", - "Information", - "Productivity", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "tom-servo" - ], - "categories": [ - "Information", - "Productivity" - ], - "requirements": { - "python": [ - "pint==0.9" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Unit Converter Skill", - "android_handler": "unit-converter-skill.tom-servo.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-03-03T16:13:16Z", - "archived": false, - "license": "unknown", - "modified": "2019-03-03T16:18:10Z", - "authorname": "georgebaily", - "skillname": "Wild Race", - "foldername": "skill-wild-race", - "name": "Wild Race", - "url": "https://github.com/georgebaily/skill-wild-race", - "category": null, - "description": "Mycroft picks at random from a predefined list of things for children to act out.", - "short_description": "", - "branch": "master", - "examples": [ - "Wild race.", - "Beserk running." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "georgebaily" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Wild Race Skill", - "android_handler": "skill-wild-race.georgebaily.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-04-18T05:47:32Z", - "archived": false, - "license": "mit", - "modified": "2019-04-18T05:50:58Z", - "authorname": "kapi238", - "skillname": "Best Anime", - "foldername": "Mycroft-Boku-no-pico", - "name": "Best Anime", - "url": "https://github.com/kapi238/Mycroft-Boku-no-pico", - "category": null, - "description": "Tells you what the best anime is.", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Kyle Zhou" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Boku No Pico Skill", - "android_handler": "Mycroft-Boku-no-pico.kapi238.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-11-05T05:43:40Z", - "archived": false, - "license": "unknown", - "modified": "2019-11-05T05:49:46Z", - "authorname": "ndato", - "skillname": "Bj Geolocation Sample", - "foldername": "bj-geolocation-sample-skill", - "name": "Bj Geolocation Sample", - "url": "https://github.com/ndato/bj-geolocation-sample-skill", - "category": "Configuration", - "description": "Mycroft skill to provide minimum code to test the geolocation api", - "short_description": "Minimum code to test geolocation api", - "branch": "master", - "examples": [ - "Test geolocation.", - "Test geolocation" - ], - "tags": [ - "Configuration", - "Geolocation", - "Testing", - "Sample", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "Neriah \"BJ\" Ato" - ], - "categories": [ - "Configuration", - "Testing" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Bj Geolocation Sample Skill", - "android_handler": "bj-geolocation-sample-skill.ndato.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-04-20T06:00:50Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-04-20T07:35:02Z", - "authorname": "SubhadeepJasu", - "skillname": "Hemera", - "foldername": "mycroft-skill-hemera", - "name": "Hemera", - "url": "https://github.com/SubhadeepJasu/mycroft-skill-hemera", - "category": null, - "description": "This skill lets Mycroft send special bus messages to Hemera, a digital personal \nassistant for elementary OS.", - "short_description": "Companion skill for Hemera", - "branch": "master", - "examples": [ - "Launch Melody.", - "Open the app called Firefox.", - "Open Code.", - "Open AppCenter.", - "Launch Melody", - "Open the app called Firefox", - "Open Code", - "Open AppCenter" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Subhadeep Jasu" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Hemera Skill", - "android_handler": "mycroft-skill-hemera.subhadeepjasu.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-04-10T02:57:09Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-02-04T03:49:29Z", - "authorname": "benklop", - "skillname": "Antique Radio", - "foldername": "skill-antique-radio", - "name": "Antique Radio", - "url": "https://github.com/benklop/skill-antique-radio", - "category": null, - "description": "This skill allows using the knobs on the radio to control various\nmycroft functions, and allows the screen on the radio to display\nstatus information.", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Ben Klopfenstein" - ], - "requirements": { - "python": [ - "bitarray==1.2.1", - "Pillow==8.1.1", - "pylint==2.4.4", - "spidev==3.4", - "mycroftapi==2.0", - "numpy==1.18.1", - "lazy-object-proxy==1.4.3", - "PyAudio==0.2.11", - "six==1.14.0", - "pixel-ring==0.1.0", - "wrapt==1.11.2", - "mccabe==0.6.1", - "pyusb==1.0.2", - "websocket-client==0.44.0", - "astroid==2.3.3", - "isort==4.3.21" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Antique Radio Skill", - "android_handler": "skill-antique-radio.benklop.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-05-08T07:05:29Z", - "archived": false, - "license": "unknown", - "modified": "2019-08-30T07:56:57Z", - "authorname": "Habanossi", - "skillname": "Lecture Subjects", - "foldername": "lecture-skill", - "name": "Lecture Subjects", - "url": "https://github.com/Habanossi/lecture-skill", - "category": null, - "description": "When asked what kind of lecture there is today, mycroft answers with the right subject. this works as a teaching example for home assistants.\n\nIn \"dates.txt\" the user puts dates for upcoming lectures with some requirements:\n> - one date per line\n> - in the format YYYYMMDD\n> - in the right order, with the first upcoming lecture date highest on the list, the second lecture date second and so on.\n\nThe user can modify the .dialog files to match the lectures. Files will be named \"lecture1\", \"lecture2\" and so on.\nObserve that the amount of lecture.dialog files must match the amount of dates in \"dates.txt\". Otherwise an error will occur.\n\nDate settings can be changed so that mycroft either uses a default answer or uses dates.txt for lecture subjects set for specific dates.\nIf the date of today cannot be found in \"dates.txt\", nolecture.dialog will be used. This means that there is no lecture today.", - "short_description": "", - "branch": "master", - "examples": [ - "What is the subject of the lecture?", - "What theme does the lecture have?", - "Change the lecture settings." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Viljanen" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Lecture Skill", - "android_handler": "lecture-skill.habanossi.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-07-17T19:21:14Z", - "archived": false, - "license": "unknown", - "modified": "2020-01-29T00:19:03Z", - "authorname": "krywenko", - "skillname": "meteo-alerts-skill", - "foldername": "meteo-alerts-skill", - "name": "meteo-alerts-skill", - "url": "https://github.com/krywenko/meteo-alerts-skill", - "category": null, - "description": "meteo alert skill uses http://meteoalarm.eu for alerts for mycroft.. I have it built for linux/pi version of mycroft do not know if it works on other versions\n\nusage in skill setting just copy and paste in the region you wish to monitor for alerts.. and choose your language you wish to use.. title and caption are options. if you used different page laguages from http://meteoalarm.eu \n\nexample if you used greek \n\ntitle \nweather warngings = Προειδοποιήσεις καιρού Ευρώπης:\n\ncaption\n\nfor greek is still Caption (and if you wanted to use greek language lietuviu: )\n\nbut spanish page it uses Leyenda: french uses Légende: etc for caption\n\nusage is simple just say \"climate alerts\" or \"weather alerts\" and it will read out any current alerts\n\ncurrently is just uses simple tone alert for automatic alerting . 3 tones yellow, orange and red if you have multiple type alerts say 2 yellow 1 orange and a red it will play first the 1 red alert tone, then 1 orange tone , followed by 2 yellow tones.. from the simple tones you should be able the access the risk urgency ..ie multiple red tones pretty well means head for shelter quickly.", - "short_description": "meteo alert skill uses http://meteoalarm.eu for alerts for mycroft.. I have it built for linux/pi version of mycroft do not know if it works on other versions", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "sudo apt install lynx", - "lynx" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Meteo Alerts Skill", - "android_handler": "meteo-alerts-skill.krywenko.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-07-27T20:28:37Z", - "archived": false, - "license": "unknown", - "modified": "2019-07-28T17:22:17Z", - "authorname": "Extarys", - "skillname": "Test", - "foldername": "Mycroft-Nextcloud-Skill", - "name": "Test", - "url": "https://github.com/Extarys/Mycroft-Nextcloud-Skill", - "category": "Productivity", - "description": "Control your contacts and your calendar with Mycroft!\n\nAbility to create appointments in any calendars.\nYou can now add a contact to Nextcloud in 15 seconds with your voice", - "short_description": "Connect [Nextcloud](https://nextcloud.com/) services to Mycroft", - "branch": "master", - "examples": [ - "List my calendars.", - "What is on the calendar today?", - "Do I have anything for tomorrow.", - "Do I have anything for today in Meals.", - "Do I have any appointment in 2 days.", - "What do I have on friday?", - "I have an appointment tomorrow evening at the school.", - "Add an appointment in Shopping on the 5th of this month at 2 o'clock for a haircut.", - "What is the cellphone number of Jane?", - "Create a contact for Alex. His phone number is 123-555-4455.", - "List my calendars ☑", - "What is on the calendar today", - "Do I have anything for tomorrow", - "Do I have anything for today in Meals", - "Do I have any appointment in 2 days", - "What do I have on friday", - "I have an appointment tomorrow evening at the school", - "Add an appointment in Shopping on the 5th of this month at 2 o'clock for a haircut", - "Create a contact for Alex. His phone number is 123-555-4455" - ], - "tags": [ - "Productivity", - "Information,", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "SickWolf AKA Jeremy Dicaire\n\n### Interested testers\ngras64" - ], - "categories": [ - "Productivity", - "Information," - ], - "requirements": { - "python": [ - "vobject", - "ics", - "caldav", - "pyyaml" - ], - "system": { - "all": "libxml2-dev libxslt-dev python-dev python3-lxml" - }, - "skill": [] - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Nextcloud Skill", - "android_handler": "Mycroft-Nextcloud-Skill.extarys.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-07-11T02:58:51Z", - "archived": false, - "license": "mit", - "modified": "2019-07-11T12:16:12Z", - "authorname": "taitleaney", - "skillname": "Garage Light Skill", - "foldername": "MycroftGarageLight", - "name": "Garage Light Skill", - "url": "https://github.com/taitleaney/MycroftGarageLight", - "category": null, - "description": "This skill turns on/off the garage light via lifx.", - "short_description": "", - "branch": "master", - "examples": [ - "Garage Light.", - "Garage Light" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Tait Leaney" - ], - "requirements": { - "python": [ - "lifxlan" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroftgaragelight Skill", - "android_handler": "MycroftGarageLight.taitleaney.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-03-08T08:43:35Z", - "archived": false, - "license": "mit", - "modified": "2019-03-08T08:47:32Z", - "authorname": "didekoning", - "skillname": "YOUR SKILL NAME", - "foldername": "skill-dion", - "name": "YOUR SKILL NAME", - "url": "https://github.com/didekoning/skill-dion", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Dion Skill", - "android_handler": "skill-dion.didekoning.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-01-15T23:17:38Z", - "archived": false, - "license": "mit", - "modified": "2019-01-16T02:02:53Z", - "authorname": "tsandh", - "skillname": "Who Is Skill", - "foldername": "whois-skill", - "name": "Who Is Skill", - "url": "https://github.com/tsandh/whois-skill", - "category": null, - "description": "Looks up information about a person.", - "short_description": "", - "branch": "master", - "examples": [ - "Who is John Doe?" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Thomas Sandholm" - ], - "requirements": { - "python": [ - "gensim", - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Whois Skill", - "android_handler": "whois-skill.tsandh.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-01-04T11:40:28Z", - "archived": false, - "license": "mit", - "modified": "2019-01-04T11:52:21Z", - "authorname": "umbertix", - "skillname": "YOUR SKILL NAME", - "foldername": "skill-speed-test", - "name": "YOUR SKILL NAME", - "url": "https://github.com/umbertix/skill-speed-test", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [ - "speedtest-cli", - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Speed Test Skill", - "android_handler": "skill-speed-test.umbertix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-08-27T18:51:49Z", - "archived": false, - "license": "mit", - "modified": "2019-08-27T19:05:37Z", - "authorname": "deqtrio2015", - "skillname": "YOUR SKILL NAME", - "foldername": "mycroft_command_skill", - "name": "YOUR SKILL NAME", - "url": "https://github.com/deqtrio2015/mycroft_command_skill", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft_Command_Skill Skill", - "android_handler": "mycroft_command_skill.deqtrio2015.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-10-12T19:57:16Z", - "archived": false, - "license": "unknown", - "modified": "2019-10-12T19:57:24Z", - "authorname": "dakam", - "skillname": "Pacetasks Employee", - "foldername": "pacetasks-employee-skill", - "name": "Pacetasks Employee", - "url": "https://github.com/dakam/pacetasks-employee-skill", - "category": "Information", - "description": "This is a test skill for connecting mycroft to erp system", - "short_description": "A skill for pacetasks", - "branch": "master", - "examples": [ - "How is pacetasks employee.", - "How many employees are in pacetasks.", - "Pacetasks.", - "How is pacetasks employee", - "How many employees are in pacetasks", - "Pacetasks" - ], - "tags": [ - "Erp", - "resource", - "Productivity", - "Information", - "Mysql", - "Human", - "Pacetasks", - "Database", - "Human resource", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "dakam" - ], - "categories": [ - "Information", - "Productivity" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Pacetasks Employee Skill", - "android_handler": "pacetasks-employee-skill.dakam.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-05-29T18:26:39Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-05-29T18:30:08Z", - "authorname": "fractal13", - "skillname": "YOUR SKILL NAME", - "foldername": "skill-hello-anyone", - "name": "YOUR SKILL NAME", - "url": "https://github.com/fractal13/skill-hello-anyone", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Hello Anyone Skill", - "android_handler": "skill-hello-anyone.fractal13.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-11-06T04:05:06Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-11-06T04:05:13Z", - "authorname": "laurapalmerstolemyheart", - "skillname": "Powerball Checker", - "foldername": "powerball-checker-skill", - "name": "Powerball Checker", - "url": "https://github.com/laurapalmerstolemyheart/powerball-checker-skill", - "category": "Daily", - "description": "This skill allows mycroft to tell you the last winning Powerball numbers.", - "short_description": "Find out the last winning numbers for Powerball in the USA", - "branch": "master", - "examples": [ - "What were the last Powerball numbers?", - "What were the winning Powerball numbers?", - "Powerball numbers." - ], - "tags": [ - "lottery", - "Entertainment", - "lotto", - "Daily", - "Information", - "powerball", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "@laurapalmerstolemyheart\nJonathan Goins" - ], - "categories": [ - "Daily", - "Entertainment", - "Information" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Powerball Checker Skill", - "android_handler": "powerball-checker-skill.laurapalmerstolemyheart.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-02-07T23:20:17Z", - "archived": false, - "license": "unknown", - "modified": "2019-12-19T02:48:41Z", - "authorname": "ImprezaRSC", - "skillname": "Kineticinit", - "foldername": "kineticinit-skill", - "name": "Kineticinit", - "url": "https://github.com/ImprezaRSC/kineticinit-skill", - "category": null, - "description": "This command passes 'roscore' to the command line, nested into a subprocess.call([\"\"]) Python function. Most of the user commands pass to ROS through this Mycroft skill structure.", - "short_description": "", - "branch": "master", - "examples": [ - "Kinetic.", - "Start Kinetic.", - "Melodic.", - "Start Melodic.", - "Ross Core." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Kineticinit Skill", - "android_handler": "kineticinit-skill.imprezarsc.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-03-16T13:37:54Z", - "archived": false, - "license": "apache-2.0", - "modified": "2019-05-09T04:26:01Z", - "authorname": "s-p-a-s", - "skillname": "Mycroft Today in History - Event skill", - "foldername": "mycroft-esp-skill-off", - "name": "Mycroft Today in History - Event skill", - "url": "https://github.com/s-p-a-s/mycroft-esp-skill-off", - "category": null, - "description": "This skill gives back a event from today in history. It uses http://history.muffinlabs.com/#api for the results", - "short_description": "This skill gives back a event from today in history. It uses http://history.muffinlabs.com/#api for the results", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "@btothayre wrote this originally." - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Esp Off Skill", - "android_handler": "mycroft-esp-skill-off.s-p-a-s.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-06-07T21:30:22Z", - "archived": false, - "license": "mit", - "modified": "2019-06-07T22:16:37Z", - "authorname": "maxpivo", - "skillname": "Dirty Talk", - "foldername": "mycroft-skill-dirtytalk", - "name": "Dirty Talk", - "url": "https://github.com/maxpivo/mycroft-skill-dirtytalk", - "category": null, - "description": "* \"Talk Dirty\" - Run of the mill dirty talk\n* \"Filthy\" - A little more X rated\n* \"Nasty\" - X Rated and intended to be offensive\n* \"Filthy Joke\" - Will tell you a one-liner.", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "maxpivo # mycroft-skill-dirtytalk" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Dirtytalk Skill", - "android_handler": "mycroft-skill-dirtytalk.maxpivo.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-09-25T12:58:41Z", - "archived": false, - "license": "mit", - "modified": "2019-09-25T18:00:56Z", - "authorname": "Julia3107", - "skillname": "YOUR SKILL NAME", - "foldername": "weather_skill", - "name": "YOUR SKILL NAME", - "url": "https://github.com/Julia3107/weather_skill", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [ - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Weather_Skill Skill", - "android_handler": "weather_skill.julia3107.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-05-14T20:51:41Z", - "archived": false, - "license": "mit", - "modified": "2019-05-25T12:15:18Z", - "authorname": "rekkitcwts", - "skillname": "YOUR SKILL NAME", - "foldername": "skill-template-with-sqlite", - "name": "YOUR SKILL NAME", - "url": "https://github.com/rekkitcwts/skill-template-with-sqlite", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Template With Sqlite Skill", - "android_handler": "skill-template-with-sqlite.rekkitcwts.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-05-03T11:06:21Z", - "archived": false, - "license": "mit", - "modified": "2019-05-03T11:42:09Z", - "authorname": "rcaller", - "skillname": "YOUR SKILL NAME", - "foldername": "skill-brewcontroller", - "name": "YOUR SKILL NAME", - "url": "https://github.com/rcaller/skill-brewcontroller", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Brewcontroller Skill", - "android_handler": "skill-brewcontroller.rcaller.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-02-10T03:30:16Z", - "archived": false, - "license": "unknown", - "modified": "2019-03-23T16:28:28Z", - "authorname": "ImprezaRSC", - "skillname": "Turtleleft", - "foldername": "turtleleft-skill", - "name": "Turtleleft", - "url": "https://github.com/ImprezaRSC/turtleleft-skill", - "category": null, - "description": "This line executes the ros command \"rostopic pub -1 /turtle1/cmd_vel geometry_msgs/twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'\" through the Mycroft interface for Linux.", - "short_description": "", - "branch": "master", - "examples": [ - "Left.", - "Left turn.", - "Bank left." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Turtleleft Skill", - "android_handler": "turtleleft-skill.imprezarsc.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-02-06T08:23:11Z", - "archived": false, - "license": "unknown", - "modified": "2019-02-06T12:30:57Z", - "authorname": "swenvb", - "skillname": "People In Space", - "foldername": "people-in-space-skill", - "name": "People In Space", - "url": "https://github.com/swenvb/people-in-space-skill", - "category": null, - "description": "Ever wondered how many people are in space right now? just ask mycroft, and you will get the answer!", - "short_description": "", - "branch": "master", - "examples": [ - "How many people are in space?" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Swen van Brussel" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "People In Space Skill", - "android_handler": "people-in-space-skill.swenvb.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-04-14T03:39:30Z", - "archived": false, - "license": "mit", - "modified": "2019-04-14T06:08:56Z", - "authorname": "alvaromndz", - "skillname": "YOUR SKILL NAME", - "foldername": "cbt-skill", - "name": "YOUR SKILL NAME", - "url": "https://github.com/alvaromndz/cbt-skill", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Cbt Skill", - "android_handler": "cbt-skill.alvaromndz.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-05-05T15:59:56Z", - "archived": false, - "license": "mit", - "modified": "2019-05-05T17:50:21Z", - "authorname": "jaredjames2020", - "skillname": "YOUR SKILL NAME", - "foldername": "skill-morning", - "name": "YOUR SKILL NAME", - "url": "https://github.com/jaredjames2020/skill-morning", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Morning Skill", - "android_handler": "skill-morning.jaredjames2020.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-02-07T15:09:35Z", - "archived": false, - "license": "mit", - "modified": "2019-02-07T15:12:59Z", - "authorname": "jmmisiegoruiz", - "skillname": "YOUR SKILL NAME", - "foldername": "skill-pickup-toys", - "name": "YOUR SKILL NAME", - "url": "https://github.com/jmmisiegoruiz/skill-pickup-toys", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [ - "mycroft-core", - "gensim", - "adapt-parser" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Pickup Toys Skill", - "android_handler": "skill-pickup-toys.jmmisiegoruiz.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-08-29T10:03:55Z", - "archived": false, - "license": "mit", - "modified": "2019-09-14T12:26:50Z", - "authorname": "Julia3107", - "skillname": "YOUR SKILL NAME", - "foldername": "arduino-control-skill", - "name": "YOUR SKILL NAME", - "url": "https://github.com/Julia3107/arduino-control-skill", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [ - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Arduino Control Skill", - "android_handler": "arduino-control-skill.julia3107.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-02-12T11:15:14Z", - "archived": false, - "license": "apache-2.0", - "modified": "2019-02-12T11:16:44Z", - "authorname": "AIIX", - "skillname": "Wikipedia", - "foldername": "plasma-skill-wiki", - "name": "Wikipedia", - "url": "https://github.com/AIIX/plasma-skill-wiki", - "category": null, - "description": "Query [Wikipedia](https://www.wikipedia.org) for answers to all your questions! Get just the\nsummary, or ask for more to get in-depth information.", - "short_description": "", - "branch": "master", - "examples": [ - "Tell me about Elon Musk.", - "Tell me about beans.", - "Check wikipedia for beans.", - "Search for water.", - "Tell me about Elon Musk", - "Tell me about beans", - "Check wikipedia for beans", - "Search for water" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Mycroft AI" - ], - "requirements": { - "python": [ - "git+https://github.com/davidedmundson/Wikipedia" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Plasma Wiki Skill", - "android_handler": "plasma-skill-wiki.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-03-05T16:40:05Z", - "archived": false, - "license": "mit", - "modified": "2019-03-20T14:09:13Z", - "authorname": "BrianArch96", - "skillname": "YOUR SKILL NAME", - "foldername": "Mycroft-scheduler", - "name": "YOUR SKILL NAME", - "url": "https://github.com/BrianArch96/Mycroft-scheduler", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [ - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Scheduler Skill", - "android_handler": "Mycroft-scheduler.brianarch96.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-08-30T06:39:42Z", - "archived": false, - "license": "mit", - "modified": "2019-08-31T11:49:57Z", - "authorname": "chrise123x", - "skillname": "Skill-Particle", - "foldername": "skill-particle", - "name": "Skill-Particle", - "url": "https://github.com/chrise123x/skill-particle", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [ - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Particle Skill", - "android_handler": "skill-particle.chrise123x.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-09-23T12:53:04Z", - "archived": false, - "license": "mit", - "modified": "2019-09-23T14:01:05Z", - "authorname": "oliverguhr", - "skillname": "YOUR SKILL NAME", - "foldername": "mycroft-skill-history", - "name": "YOUR SKILL NAME", - "url": "https://github.com/oliverguhr/mycroft-skill-history", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft History Skill", - "android_handler": "mycroft-skill-history.oliverguhr.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-08-23T01:39:49Z", - "archived": false, - "license": "mit", - "modified": "2020-02-28T01:16:48Z", - "authorname": "Shiroke-013", - "skillname": "YOUR SKILL NAME", - "foldername": "Antonia", - "name": "YOUR SKILL NAME", - "url": "https://github.com/Shiroke-013/Antonia", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "Your name" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Antonia Skill", - "android_handler": "Antonia.shiroke-013.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-07-27T17:36:40Z", - "archived": false, - "license": "mit", - "modified": "2019-07-28T03:26:53Z", - "authorname": "MajesticMagician", - "skillname": "YOUR SKILL NAME", - "foldername": "Nmap-Mycroft", - "name": "YOUR SKILL NAME", - "url": "https://github.com/MajesticMagician/Nmap-Mycroft", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Nmap Mycroft Skill", - "android_handler": "Nmap-Mycroft.majesticmagician.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-01-23T08:05:09Z", - "archived": false, - "license": "unknown", - "modified": "2019-02-08T10:58:49Z", - "authorname": "BhavikKatyal", - "skillname": "Count", - "foldername": "Skill", - "name": "Count", - "url": "https://github.com/BhavikKatyal/Skill", - "category": "Daily", - "description": "This skill lets Mycroft do counting to a number or and countdown from a number.", - "short_description": "Count and countdown skill", - "branch": "master", - "examples": [ - "Count to 10.", - "Countdown from 10." - ], - "tags": [ - "Daily", - "countdown", - "count", - "no-license" - ], - "platforms": [ - "platform_mark1", - "platform_mark2", - "platform_picroft", - "platform_plasmoid" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": " Skill", - "android_handler": "Skill.bhavikkatyal.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-04-28T16:08:51Z", - "archived": false, - "license": "unknown", - "modified": "2019-04-28T16:08:56Z", - "authorname": "FruityWelsh", - "skillname": "Mycroft Blender Control", - "foldername": "mycroft-blender-control-skill", - "name": "Mycroft Blender Control", - "url": "https://github.com/FruityWelsh/mycroft-blender-control-skill", - "category": null, - "description": "Skill to have a mode so i can run blender operators (the guis buttons) so that i can quickly create and manipulate objects without having to remember where menus are.", - "short_description": "", - "branch": "master", - "examples": [ - "“help me use blender”", - "“help me 3d model”" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Andy" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Blender Control Skill", - "android_handler": "mycroft-blender-control-skill.fruitywelsh.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-09-01T11:02:26Z", - "archived": false, - "license": "mit", - "modified": "2019-09-01T11:24:51Z", - "authorname": "atheedom", - "skillname": "YOUR SKILL NAME", - "foldername": "mycroft-skill-hello-world", - "name": "YOUR SKILL NAME", - "url": "https://github.com/atheedom/mycroft-skill-hello-world", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Hello World Skill", - "android_handler": "mycroft-skill-hello-world.atheedom.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-04-12T03:20:40Z", - "archived": false, - "license": "mit", - "modified": "2019-04-12T03:23:37Z", - "authorname": "Cschlaefli", - "skillname": "YOUR SKILL NAME", - "foldername": "gatherer-query-skill", - "name": "YOUR SKILL NAME", - "url": "https://github.com/Cschlaefli/gatherer-query-skill", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [ - "mtgsdk" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Gatherer Query Skill", - "android_handler": "gatherer-query-skill.cschlaefli.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-06-03T16:06:45Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-06-10T23:21:40Z", - "authorname": "maxrbriggs", - "skillname": "YOUR SKILL NAME", - "foldername": "mycroft-splitter-skill", - "name": "YOUR SKILL NAME", - "url": "https://github.com/maxrbriggs/mycroft-splitter-skill", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Splitter Skill", - "android_handler": "mycroft-splitter-skill.maxrbriggs.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-05-15T18:57:52Z", - "archived": false, - "license": "mit", - "modified": "2020-04-30T06:23:52Z", - "authorname": "edegeyer", - "skillname": "YOUR SKILL NAME", - "foldername": "masterarbeit", - "name": "YOUR SKILL NAME", - "url": "https://github.com/edegeyer/masterarbeit", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Masterarbeit Skill", - "android_handler": "masterarbeit.edegeyer.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-04-30T22:01:18Z", - "archived": false, - "license": "mit", - "modified": "2020-10-25T12:12:28Z", - "authorname": "adi-mikulic", - "skillname": "Send-Serial-Packet-Skill", - "foldername": "send-serial-packet-skill", - "name": "Send-Serial-Packet-Skill", - "url": "https://github.com/adi-mikulic/send-serial-packet-skill", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Kiahna J. Tucker" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Send Serial Packet Skill", - "android_handler": "send-serial-packet-skill.adi-mikulic.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-04-08T04:40:41Z", - "archived": false, - "license": "mit", - "modified": "2019-04-08T22:04:36Z", - "authorname": "cjk8zb", - "skillname": "YOUR SKILL NAME", - "foldername": "skill-wemo-outlet", - "name": "YOUR SKILL NAME", - "url": "https://github.com/cjk8zb/skill-wemo-outlet", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Wemo Outlet Skill", - "android_handler": "skill-wemo-outlet.cjk8zb.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-01-09T22:17:24Z", - "archived": false, - "license": "mit", - "modified": "2019-01-09T22:39:12Z", - "authorname": "tsandh", - "skillname": "Speed Test Skill", - "foldername": "speed-test-skill", - "name": "Speed Test Skill", - "url": "https://github.com/tsandh/speed-test-skill", - "category": null, - "description": "Finds closest Speedtest server and runs an upload and download test and reports\nserver and upload and download speeds im Megabits per second.", - "short_description": "", - "branch": "master", - "examples": [ - "Run Speed Test.", - "Run Speed Test" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Thomas Sandholm" - ], - "requirements": { - "python": [ - "speedtest-cli", - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Speed Test Skill", - "android_handler": "speed-test-skill.tsandh.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-12-07T00:01:18Z", - "archived": false, - "license": "unknown", - "modified": "2020-02-21T22:00:40Z", - "authorname": "jrwarwick", - "skillname": "Count Down", - "foldername": "count-down-skill", - "name": "Count Down", - "url": "https://github.com/jrwarwick/count-down-skill", - "category": "Productivity", - "description": "Whether you are playing hide and seek or having a jam session, have mycroft do the count downs for you!", - "short_description": "Count down out loud", - "branch": "master", - "examples": [ - "Count down from 10.", - "Count backwards from 30.", - "Give us a 60 second count down.", - "Count down from 10", - "Count backwards from 30", - "Give us a 60 second count down" - ], - "tags": [ - "Productivity", - "Time", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "jrwarwick" - ], - "categories": [ - "Productivity" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Count Down Skill", - "android_handler": "count-down-skill.jrwarwick.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-12-11T22:05:28Z", - "archived": false, - "license": "apache-2.0", - "modified": "2019-12-11T22:05:35Z", - "authorname": "gordtulloch", - "skillname": "Mycroft Indi", - "foldername": "mycroft-indi-skill", - "name": "Mycroft Indi", - "url": "https://github.com/gordtulloch/mycroft-indi-skill", - "category": "IoT", - "description": "Telescopes using the indi (instrument nuetral device interface www.indilib.org) can be controlled using this skill", - "short_description": "Voice interface to control a telescope using the indi protocol", - "branch": "master", - "examples": [ - "Goto.", - "What am i looking at?", - "Where am i pointed?", - "Slew and solve.", - "Solve.", - "Goto", - "What am i looking at", - "Where am i pointed", - "Slew and solve", - "Solve" - ], - "tags": [ - "IoT", - "telescope", - "Astronomy", - "indi", - "Astronomy telescope indi", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/asterisk.svg", - "credits": [ - "Gord Tulloch" - ], - "categories": [ - "IoT" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Indi Skill", - "android_handler": "mycroft-indi-skill.gordtulloch.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-04-07T03:21:23Z", - "archived": false, - "license": "unknown", - "modified": "2019-04-08T04:26:48Z", - "authorname": "evanwike", - "skillname": "Grocery List", - "foldername": "grocery-list-skill", - "name": "Grocery List", - "url": "https://github.com/evanwike/grocery-list-skill", - "category": null, - "description": "Mycroft will keep track of and update your grocery list!", - "short_description": "", - "branch": "master", - "examples": [ - "What's on my grocery list?", - "Add hot pockets to my grocery list.", - "Remove apples from my grocery list.", - "How many items are on my grocery list." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Evan Wike" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Grocery List Skill", - "android_handler": "grocery-list-skill.evanwike.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-04-17T21:19:16Z", - "archived": false, - "license": "apache-2.0", - "modified": "2019-04-17T22:50:58Z", - "authorname": "gras64", - "skillname": "Please Repeat", - "foldername": "pleace-repeat", - "name": "Please Repeat", - "url": "https://github.com/gras64/pleace-repeat", - "category": "Daily", - "description": "You can always repeat the last sentence if you did not understand it", - "short_description": "You did not understand anything and want mycroft to repeat itself", - "branch": "master", - "examples": [ - "Please repeat.", - "Can you repeat that.", - "Pardon.", - "Repeat please.", - "Please repeat", - "Can you repeat that", - "Pardon", - "Repeat please" - ], - "tags": [ - "Productivity", - "Repeat", - "Daily", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/retweet.svg", - "credits": [ - "Gras64" - ], - "categories": [ - "Daily", - "Productivity" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Pleace Repeat Skill", - "android_handler": "pleace-repeat.gras64.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-07-28T03:30:25Z", - "archived": false, - "license": "mit", - "modified": "2019-07-30T03:30:25Z", - "authorname": "MajesticMagician", - "skillname": "YOUR SKILL NAME", - "foldername": "WebView-Mycroft", - "name": "YOUR SKILL NAME", - "url": "https://github.com/MajesticMagician/WebView-Mycroft", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Webview Mycroft Skill", - "android_handler": "WebView-Mycroft.majesticmagician.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-10-28T01:08:21Z", - "archived": false, - "license": "unknown", - "modified": "2019-11-12T22:38:09Z", - "authorname": "mofadashi", - "skillname": "Allergy Level", - "foldername": "mycroft-skill-allergy", - "name": "Allergy Level", - "url": "https://github.com/mofadashi/mycroft-skill-allergy", - "category": "Daily", - "description": "With this skill users will be able to inquire what the allergy level will be for either today or tomorrow.\nThe results are pulled from pollen.com\nThe skill uses the mycrofts IP Address to determining the zip code(if you use VPN, it doesn't provide the correct reults)", - "short_description": "Allergy report for my husband David", - "branch": "master", - "examples": [ - "How are the allergies today.", - "What's the allergy level tomorrow?", - "how are the allergies today", - "What's the allergy level tomorrow" - ], - "tags": [ - "Allergy", - "Daily", - "Information", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "Muge Niu" - ], - "categories": [ - "Daily", - "Information" - ], - "requirements": { - "python": [ - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Allergy Skill", - "android_handler": "mycroft-skill-allergy.mofadashi.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-12-13T13:32:49Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-02-28T23:44:11Z", - "authorname": "domcross", - "skillname": "Shairport", - "foldername": "shairport-skill", - "name": "Shairport", - "url": "https://github.com/domcross/shairport-skill", - "category": "Music & Audio", - "description": "This skill will install shairport-sync package that turns your Picroft (or Mycroft on a Debian-style Linux) into an airplay audio player. Nothing fancy here like ducking or volume control, just turning Shairport-sync on and off.\n\nThis is just a quick hack I made on a rainy day that \"works for me\" and comes without any warranty or support.", - "short_description": "Run and control shairport-sync", - "branch": "master", - "examples": [ - "Activate shairport.", - "Disable shairport.", - "Activate shairport", - "Disable shairport" - ], - "tags": [ - "Airport", - "Music", - "Audio", - "Music & Audio", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/apple-alt.svg", - "credits": [ - "Dominik (domcross)" - ], - "categories": [ - "Music & Audio" - ], - "requirements": { - "system": { - "apt-get": "shairport-sync" - }, - "exes": [ - "shairport-sync" - ], - "python": [], - "skill": [] - }, - "android": { - "android_icon": null, - "android_name": "Shairport Skill", - "android_handler": "shairport-skill.domcross.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-08-21T07:44:45Z", - "archived": false, - "license": "unknown", - "modified": "2019-09-07T02:27:46Z", - "authorname": "abowerman", - "skillname": "Nanoleaf", - "foldername": "nanoleaf-skill", - "name": "Nanoleaf", - "url": "https://github.com/abowerman/nanoleaf-skill", - "category": null, - "description": "Robots and blinky lights, oh my.", - "short_description": "", - "branch": "master", - "examples": [ - "Turn on the nanoleaf.", - "Turn off the nanoleaf." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Nanoleaf Skill", - "android_handler": "nanoleaf-skill.abowerman.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-06-20T02:25:51Z", - "archived": false, - "license": "unknown", - "modified": "2019-06-20T03:03:27Z", - "authorname": "krisgesling", - "skillname": "Regex Example", - "foldername": "regex-example-skill", - "name": "Regex Example", - "url": "https://github.com/krisgesling/regex-example-skill", - "category": "Examples", - "description": "A very simple Skill showing how to use regex files with the Adapt intent parser.\n\nFor more detail on the structure of Skills and different types of intents, see [Introduction to Developing Skills](https://mycroft.ai/documentation/skills/introduction-developing-skills/) in the Mycroft.ai documentation.", - "short_description": "A quick regex examples for Skill developers", - "branch": "master", - "examples": [ - "Apple is an example.", - "An example is zebra.", - "Apple is an example", - "An example is zebra" - ], - "tags": [ - "Examples", - "regex", - "adapt", - "example", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "@krisgesling" - ], - "categories": [ - "Examples" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Regex Example Skill", - "android_handler": "regex-example-skill.krisgesling.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-05-15T15:14:41Z", - "archived": false, - "license": "apache-2.0", - "modified": "2019-05-15T23:01:17Z", - "authorname": "retrodaredevil", - "skillname": "Minecraft Server Status", - "foldername": "minecraft-server-status-skill", - "name": "Minecraft Server Status", - "url": "https://github.com/retrodaredevil/minecraft-server-status-skill", - "category": "Entertainment", - "description": "With this skill you can ask Mycroft the player count and MOTD on Minecraft Servers!", - "short_description": "Tells you the status of your favorite Minecraft Servers", - "branch": "master", - "examples": [ - "How many people are online in Mineplex.", - "How many people are online in mineplex dot com port 25565.", - "What is the M O T D of Mineplex?", - "How many people are online in Mineplex", - "How many people are online in mineplex dot com port 25565", - "What is the M O T D of Mineplex" - ], - "tags": [ - "Entertainment", - "Information", - "Video", - "Minecraft", - "Games", - "Video Games", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "todo", - "credits": [ - "Joshua Shannon (@retrodaredevil)" - ], - "categories": [ - "Entertainment", - "Information" - ], - "requirements": { - "python": [ - "mcstatus" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Minecraft Server Status Skill", - "android_handler": "minecraft-server-status-skill.retrodaredevil.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-03-24T21:37:56Z", - "archived": false, - "license": "apache-2.0", - "modified": "2019-12-19T02:51:51Z", - "authorname": "retrodaredevil", - "skillname": "YOUR SKILL NAME", - "foldername": "youtube-skill", - "name": "YOUR SKILL NAME", - "url": "https://github.com/retrodaredevil/youtube-skill", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Youtube face to face by daft punk.", - "Tell me some information about this youtube song.", - "Put youtube in full screen.", - "Fast forward 2 minutes.", - "Rewind 20 seconds.", - "Youtube face to face by daft punk", - "Tell me some information about this youtube song", - "Put youtube in full screen", - "Fast forward 2 minutes", - "Rewind 20 seconds" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "Your name" - ], - "requirements": { - "python": [ - "youtube-dl" - ], - "system": { - "all": "mplayer" - }, - "skill": [] - }, - "android": { - "android_icon": null, - "android_name": "Youtube Skill", - "android_handler": "youtube-skill.retrodaredevil.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-02-24T20:11:10Z", - "archived": false, - "license": "mit", - "modified": "2019-04-15T20:01:56Z", - "authorname": "dgardner4695", - "skillname": "TEA Control Skill", - "foldername": "skill-tea-control", - "name": "TEA Control Skill", - "url": "https://github.com/dgardner4695/skill-tea-control", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [ - "What is the status of the check engine light?", - "Please tell me how much gas I have left.", - "What is the current RPM?", - "Lock/Unlock the doors.", - "Is my car locked?", - "Please tell me how much gas I have left", - "Lock/Unlock the doors" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Daniel Gardner" - ], - "requirements": { - "python": [ - "inflect", - "pyserial" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Tea Control Skill", - "android_handler": "skill-tea-control.dgardner4695.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-02-27T21:00:05Z", - "archived": false, - "license": "unknown", - "modified": "2020-02-18T18:37:37Z", - "authorname": "Karacolmar", - "skillname": "Next Tram", - "foldername": "next-tram-skill", - "name": "Next Tram", - "url": "https://github.com/Karacolmar/next-tram-skill", - "category": null, - "description": "Configure one tram station close to your home. your mycroft device will be able to tell you how long you will have to wait for the next tram and whether to hurry up\n\n!", - "short_description": "", - "branch": "master", - "examples": [ - "When is the next tram north?", - "When does the next tram leave?", - "How long until the next tram goes into town?" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "karacolmar" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Next Tram Skill", - "android_handler": "next-tram-skill.karacolmar.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-11-09T19:46:14Z", - "archived": false, - "license": "unknown", - "modified": "2019-11-10T22:50:38Z", - "authorname": "Nos-", - "skillname": "Public Transport", - "foldername": "public-transport-skill", - "name": "Public Transport", - "url": "https://github.com/Nos-/public-transport-skill", - "category": "Transportation", - "description": "Auskunft über Bus- und Bahnverbindungen im Bereich der DVB (Dresdner Verkehrsbetriebe) und des VVO (Verkehrsverbund Oberelbe, Sachsen) - ein Sprachassistent für datenschutzbewusste Reisende.\n\nEntstanden beim [opendatacamp2019](http://www.dresden.de/odcdresden19).", - "short_description": "Nahverkehrsauskunft für Dresden (dvb, vvo) per [MyCroft-Sprachassistent](https://mycroft.ai/).", - "branch": "master", - "examples": [ - "Wie komme ich nach ... ?", - "Wie komme ich von ... nach ... ?", - "Wann fährt der nächste Bus?", - "Wann fährt die nächste Bahn?", - "Wann fährt Linie ... ?", - "Wohin fährt Linie ... ?" - ], - "tags": [ - "Transportation", - "Nahverkehr", - "ÖPNV", - "Dresden", - "Information", - "DVB", - "Daily", - "Sachsen", - "VVO", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "N. Schwirz" - ], - "categories": [ - "Transportation", - "Daily", - "Information" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Public Transport Skill", - "android_handler": "public-transport-skill.nos-.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-11-15T02:26:38Z", - "archived": false, - "license": "unknown", - "modified": "2020-04-04T20:31:53Z", - "authorname": "jandrovins", - "skillname": "Lahuertaderamiroskill", - "foldername": "LaHuertaDeRamiroSkill", - "name": "Lahuertaderamiroskill", - "url": "https://github.com/jandrovins/LaHuertaDeRamiroSkill", - "category": "IoT", - "description": "This skill is intended to administrate 4 aspects of a orchard: soil moisture, temperature, brightness and athmomspheric pressure. this variables will me measure a few times a day, and depending on the data collected mycroft will alert the user to water the plant.", - "short_description": "Orchestrates an automatic orchard with mycroft", - "branch": "master", - "examples": [ - "How are my plants.", - "How is my plant.", - "What is the soil moisture?", - "When was the last time my plants were watered?", - "When was the last time my plant was watered?", - "What is the temperature of my plant?", - "What is the temperature of my plants?", - "What is my plant's temperature?", - "What is my plant's soil moisture?", - "What is the brightness of my plants?", - "What is my plant's brightness?", - "What is my plant's athmospheric pressure?", - "What is the athmomspheric pressure of my plant?", - "What is the athmomspheric pressure of my plants?", - "How is my orchard.", - "How is my garden.", - "When was the last time my garden was watered?", - "When was the last time my orchard was watered?", - "What is the temperature of my garden?", - "What is the temperature of my orchard?", - "What is my orchard's temperature?", - "What is my garden's temperature?", - "What is my garden's moisture?", - "What is my orchard's moisture?", - "What is my orchard's soil moisture?", - "What is my garden's soil moisture?", - "What is the brightness of my garden?", - "What is the brightness of my orchard?", - "What is my orchard's brightness?", - "What is my garden's brightness?", - "What is my orchard's athmospheric pressure?", - "What is my garden's athmospheric pressure?", - "How are my plants", - "How is my plant", - "What is the soil moisture", - "When was the last time my plants were watered", - "When was the last time my plant was watered", - "What is the temperature of my plant", - "What is the temperature of my plants", - "What is my plant's temperature", - "What is my plant's soil moisture", - "What is the brightness of my plants", - "What is my plant's brightness", - "What is my plant's athmospheric pressure", - "What is the athmomspheric pressure of my plant", - "What is the athmomspheric pressure of my plants", - "How is my orchard", - "How is my garden", - "When was the last time my garden was watered", - "When was the last time my orchard was watered", - "What is the temperature of my garden", - "What is the temperature of my orchard", - "What is my orchard's temperature", - "What is my garden's temperature", - "What is my garden's moisture", - "What is my orchard's moisture", - "What is my orchard's soil moisture", - "What is my garden's soil moisture", - "What is the brightness of my garden", - "What is the brightness of my orchard", - "What is my orchard's brightness", - "What is my garden's brightness", - "What is my orchard's athmospheric pressure", - "What is my garden's athmospheric pressure" - ], - "tags": [ - "IoT", - "Daily", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "Vincent A. Arcila, Santiago Santacruz, Andrés D. Chaves." - ], - "categories": [ - "IoT", - "Daily" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Lahuertaderamiroskill Skill", - "android_handler": "LaHuertaDeRamiroSkill.jandrovins.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-03-05T18:04:52Z", - "archived": false, - "license": "unknown", - "modified": "2019-03-05T18:05:02Z", - "authorname": "cliffordvandyk", - "skillname": "Mycroft Influxdb Sensor Lookup", - "foldername": "mycroft-influxdb-sensor-lookup-skill", - "name": "Mycroft Influxdb Sensor Lookup", - "url": "https://github.com/cliffordvandyk/mycroft-influxdb-sensor-lookup-skill", - "category": null, - "description": "When queried, the skill fetches the last sensor reading recorded in a local influxdb database. for example, querying the temperature of the pool.", - "short_description": "", - "branch": "master", - "examples": [ - "What is the temperature of the pool?", - "How warm is the pool?", - "How cold is the pool?", - "What is the pool temperature?" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "cliffordvandyk@gmail.com" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Influxdb Sensor Lookup Skill", - "android_handler": "mycroft-influxdb-sensor-lookup-skill.cliffordvandyk.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-05-30T00:33:11Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-05-30T14:59:40Z", - "authorname": "fractal13", - "skillname": "YOUR SKILL NAME", - "foldername": "skill-rock-paper-scissors", - "name": "YOUR SKILL NAME", - "url": "https://github.com/fractal13/skill-rock-paper-scissors", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "I challenge you to rock-paper-scissors.", - "Tell me my rock-paper-scissors score.", - "Show the rock-paper-scissors scoreboard.", - "Debug rock-paper-scissors.", - "i challenge you to rock-paper-scissors", - "tell me my rock-paper-scissors score", - "show the rock-paper-scissors scoreboard", - "debug rock-paper-scissors" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Rock Paper Scissors Skill", - "android_handler": "skill-rock-paper-scissors.fractal13.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-09-04T13:46:01Z", - "archived": false, - "license": "apache-2.0", - "modified": "2019-09-06T12:05:30Z", - "authorname": "thiagodchen", - "skillname": "Inflação Brasileira", - "foldername": "inflacao-skill", - "name": "Inflação Brasileira", - "url": "https://github.com/thiagodchen/inflacao-skill", - "category": null, - "description": "Utilizando os dados do IPCA através do sistema do IBGE, a skill Inflação permite que consulte taxa de variação do IPCA.", - "short_description": "", - "branch": "master", - "examples": [ - "Quanto está a variação do IPCA hoje?", - "Quero saber a variação mensal do ipca de março de 2017." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Inflacao Skill", - "android_handler": "inflacao-skill.thiagodchen.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-06-24T23:55:52Z", - "archived": false, - "license": "mit", - "modified": "2019-07-12T05:15:42Z", - "authorname": "drewlg", - "skillname": "Update Self", - "foldername": "Update-Self", - "name": "Update Self", - "url": "https://github.com/drewlg/Update-Self", - "category": null, - "description": "A Simple task to use the msm manager to update the skills installed.", - "short_description": "", - "branch": "master", - "examples": [ - "Update yourself.", - "Do you have any updates?", - "Update yourself" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Doctor Strange\nList Repos Forked from PyAntony/List-Repos" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Update Self Skill", - "android_handler": "Update-Self.drewlg.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-01-13T22:45:51Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-01-22T01:15:10Z", - "authorname": "JonStratton", - "skillname": "Roomba Serial Command", - "foldername": "roomba-serial-command-skill", - "name": "Roomba Serial Command", - "url": "https://github.com/JonStratton/roomba-serial-command-skill", - "category": "IoT", - "description": "This skill is to be used with a roomba with a serial connection to a small single board computer running the roomba-serial-command-service. This device must also be connected to the same local network that mycroft is running from. The mycoft skill will use zeroconf to try to locate the service.", - "short_description": "Talks to a roomba that is connected to something running [roomba-serial-command-service](https://github.com/JonStratton/Roomba-Serial-Command-Service).", - "branch": "master", - "examples": [ - "List robots.", - "Tell roomba to clean.", - "Tell roomba to dock.", - "Tell robot off.", - "List robots", - "Tell roomba to clean", - "Tell roomba to dock", - "Tell robot off" - ], - "tags": [ - "IoT", - "roomba", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "Jon Stratton (@JonStratton)" - ], - "categories": [ - "IoT" - ], - "requirements": { - "python": [ - "zeroconf" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Roomba Serial Command Skill", - "android_handler": "roomba-serial-command-skill.jonstratton.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-03-10T09:16:40Z", - "archived": false, - "license": "apache-2.0", - "modified": "2019-12-19T02:53:34Z", - "authorname": "Shivaabhai", - "skillname": "Wikipedia", - "foldername": "webmd-skill", - "name": "Wikipedia", - "url": "https://github.com/Shivaabhai/webmd-skill", - "category": "Information", - "description": "Query [Wikipedia](https://www.wikipedia.org) for answers to all your questions. Get just a summary, or ask for more to get in-depth information.\n \n This Skill uses the [Wikimedia API](https://en.wikipedia.org/w/api.php).", - "short_description": "Wikipedia", - "branch": "master", - "examples": [ - "Tell me about Elon Musk.", - "Tell me about beans.", - "Tell me something random.", - "Check Wikipedia for beans.", - "Tell me about the Pembroke Welsh Corgi.", - "Search for chocolate.", - "More information.", - "Tell me More.", - "Tell me about Elon Musk", - "Tell me about beans", - "Tell me something random", - "Check Wikipedia for beans", - "Tell me about the Pembroke Welsh Corgi", - "Search for chocolate", - "More information (followup after an initial summary)", - "Tell me More (followup after an initial summary)" - ], - "tags": [ - "wiki", - "query", - "wikipedia", - "encyclopedia", - "Information", - "general-knowledge", - "question", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/brands/wikipedia-w.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Information" - ], - "requirements": { - "python": [ - "webmd" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Webmd Skill", - "android_handler": "webmd-skill.shivaabhai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-05-05T02:43:29Z", - "archived": false, - "license": "unknown", - "modified": "2019-05-06T00:16:51Z", - "authorname": "ImprezaRSC", - "skillname": "Gpio Pins Skill", - "foldername": "gpio-pins-skill", - "name": "Gpio Pins Skill", - "url": "https://github.com/ImprezaRSC/gpio-pins-skill", - "category": null, - "description": "This is a demo script to activate GPIO pins in a Raspberry Pi using a verbal command in Picroft installations. It activates pin 11 in (BOARD) configuration twice. You should see 2 pulsations of an LED, small motor, or speaker depending on what you want to attach to the pins. A breadboard with female-to-male jumpers and a resistor is recommended for ease of use with the Pi's pins.", - "short_description": "", - "branch": "master", - "examples": [ - "Pins.", - "Io.", - "Pie." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Gpio Pins Skill", - "android_handler": "gpio-pins-skill.imprezarsc.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-09-21T14:53:02Z", - "archived": false, - "license": "apache-2.0", - "modified": "2019-10-27T19:28:25Z", - "authorname": "domcross", - "skillname": "Apprise", - "foldername": "apprise-skill", - "name": "Apprise", - "url": "https://github.com/domcross/apprise-skill", - "category": "Productivity", - "description": "With this skill you can send push notifications to a large number of notifications services including pushbullet, pushover, twitter, email and many many more - using the fantastic apprise lib...\n\nConfigure up to three services and/or use a configuration file (e.g. when you do not want to upload your username and password to home.mycroft.ai)\nPlease refer to the [apprise lib wiki](https://github.com/caronc/apprise/wiki) for detailed information on service url configuration.\nFor config file usage instructions please see the [apprise config file manual](https://github.com/caronc/apprise/wiki/config).", - "short_description": "Send push notification to almost every platform (using apprise lib)", - "branch": "master", - "examples": [ - "Apprise someone of something.", - "Apprise someone of something" - ], - "tags": [ - "Messaging", - "Push", - "Productivity", - "Apprise", - "Notify", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/comment-dots.svg", - "credits": [ - "Dominik (@domcross)" - ], - "categories": [ - "Productivity", - "Messaging" - ], - "requirements": { - "python": [ - "apprise" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Apprise Skill", - "android_handler": "apprise-skill.domcross.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-04-10T07:51:18Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-04-16T11:13:29Z", - "authorname": "Cathalb28345", - "skillname": "Weather", - "foldername": "weather", - "name": "Weather", - "url": "https://github.com/Cathalb28345/weather", - "category": null, - "description": "Get weather conditions, forecasts, expected precipitation and more! By default it will tell\nyou about your default location, or you can ask for other cities around the world. Current\nconditions and weather forecasts come from [Open Weather Map](https://openweathermap.org).\n\nFor devices with screen support, conditions are briefly shown.", - "short_description": "", - "branch": "master", - "examples": [ - "What is the weather?", - "What is the forecast tommorow?", - "What is the weather going to be like Tuesday?", - "What is the weather in San Francisco?", - "When will it rain next?", - "How windy is it?", - "What's the humidity?" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Mycroft AI" - ], - "requirements": { - "python": [ - "requests==2.13.0", - "pyowm==2.6.1", - "multi-key-dict==2.0.3" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Weather Skill", - "android_handler": "weather.cathalb28345.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-07-30T08:04:15Z", - "archived": false, - "license": "unknown", - "modified": "2019-07-30T08:04:22Z", - "authorname": "TheCis", - "skillname": "Sport Exercises", - "foldername": "sport-exercises-skill", - "name": "Sport Exercises", - "url": "https://github.com/TheCis/sport-exercises-skill", - "category": "Daily", - "description": "Mycroft will help you train your body parts with diffrent exercises.", - "short_description": "Train your body parts.", - "branch": "master", - "examples": [ - "Tell me an exercise.", - "Tell me an exercise for legs.", - "What exercise should i do for legs?", - "Tell me an exercise for chest.", - "What exercise should i do for chest?", - "Tell me an exercise for triceps.", - "What exercise should i do for triceps?", - "Tell me an exercise for biceps.", - "What exercise should i do for biceps?", - "What exercise should i do for today?", - "What exercise should i do for legs." - ], - "tags": [ - "Sport", - "Workout", - "parts", - "Productivity", - "Daily", - "Body", - "Body parts", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "Mocan Narcis" - ], - "categories": [ - "Daily", - "Productivity" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Sport Exercises Skill", - "android_handler": "sport-exercises-skill.thecis.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-11-10T19:37:31Z", - "archived": false, - "license": "unknown", - "modified": "2019-11-11T01:19:53Z", - "authorname": "waltk99", - "skillname": "Ann", - "foldername": "ann-skill", - "name": "Ann", - "url": "https://github.com/waltk99/ann-skill", - "category": "Entertainment", - "description": "", - "short_description": "Phrases from leslie knope to ann perkins", - "branch": "master", - "examples": [ - "Oh, ann.", - "Nope says.", - "Oh, ann", - "Nope says" - ], - "tags": [ - "Silly", - "Entertainment", - "and", - "recreation", - "Parks", - "Parks and recreation", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "EmmaK" - ], - "categories": [ - "Entertainment", - "Silly" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Ann Skill", - "android_handler": "ann-skill.waltk99.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-08-11T16:09:10Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-01-01T14:53:10Z", - "authorname": "thevirtuoso1973", - "skillname": "Local Music Player", - "foldername": "local-music-skill", - "name": "Local Music Player", - "url": "https://github.com/thevirtuoso1973/local-music-skill", - "category": "Entertainment", - "description": "This is a 'skill'/add-on for the MycroftAI assistant that lets you play mp3 files on your computer.\n\nMycroft currently looks through the files in `~/Music` (`/home/Music`) path to see if the song mentioned is present.\nYou can edit the code in `__init__.py` if you want it to look through another directory.\n\nIt compares the filenames to the user's request and plays the matching song, if a match is confident enough.\n\nN.B. you can put a bunch of mp3 files in a folder and ask it to play _folder name_ and it'll play all the songs in that folder. Great for albums!", - "short_description": "Play downloaded mp3 files on your `~/Music` path with MycroftAI on Linux.", - "branch": "master", - "examples": [ - "Play Money by Pink Floyd.", - "Pause.", - "Resume.", - "Play Money by Pink Floyd", - "Pause", - "Resume" - ], - "tags": [ - "IoT", - "downloaded", - "music", - "linux", - "Music", - "Media", - "Entertainment", - "listen", - "no-license" - ], - "platforms": [ - "platform_picroft", - "platform_plasmoid" - ], - "stars": 1, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/music.svg", - "credits": [ - "@thevirtuoso1973" - ], - "categories": [ - "Entertainment", - "IoT", - "Music", - "Media" - ], - "requirements": { - "python": [ - "os", - "random" - ], - "skills": [ - "mycroft-playback-control" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Local Music Skill", - "android_handler": "local-music-skill.thevirtuoso1973.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-06-04T21:07:59Z", - "archived": false, - "license": "unknown", - "modified": "2019-07-20T09:17:07Z", - "authorname": "ldubost", - "skillname": "Sports", - "foldername": "sports-skill", - "name": "Sports", - "url": "https://github.com/ldubost/sports-skill", - "category": "Information", - "description": "Get sports results from open data sources including Wikipedia\n\nthis service requires a server to treat the results and manage the sources. The code for this server is an XWiki Application provided here: https://github.com/ldubost/xwiki-sports-skill/ which currently supports only the Tennis French Open 2019.\n\nA server is running at http://wiki-scores.org/ where you can test the capabilities of that skill.\n\nYou can hear a demo here https://raw.githubusercontent.com/ldubost/sports-skill/master/mycroftsports.mp3", - "short_description": "Mycroft skill to get sports results from open data sources", - "branch": "master", - "examples": [ - "<French open> results for <Djokovic>", - "Women <Wimbledon> results for <Halep>", - "What are the Women <worldcup> results for <France>?", - "Latest Wimbledon results.", - "Next VolleyBall games.", - "Available Sports.", - "What are the Women <worldcup> results for <France>", - "Latest Wimbledon results", - "Next VolleyBall games", - "Available Sports" - ], - "tags": [ - "Sports", - "Information", - "Tennis", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "Ludovic Dubost" - ], - "categories": [ - "Information", - "Sports" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Sports Skill", - "android_handler": "sports-skill.ldubost.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-01-31T09:18:26Z", - "archived": false, - "license": "unknown", - "modified": "2019-01-31T09:18:32Z", - "authorname": "gfhuertac", - "skillname": "Voice Playemjs", - "foldername": "voice-playemjs-skill", - "name": "Voice Playemjs", - "url": "https://github.com/gfhuertac/voice-playemjs-skill", - "category": null, - "description": "There are some music providers that require a ui to work, making them hard to control from audio-only controllers such as mycroft, unless you connect to a third party proxy. this skill tries to solve this.\n\nin order to do that, we leverage playemjs, a js player for online sources such as youtube, vimeo, deezer, and using a headless browser (firefox) and xvfb (if available), we launch an instance of the player and are able to control it using voice commands.\n\nthis is a proof of concept and we hope that it can help others to achieve similar stuff.", - "short_description": "", - "branch": "master", - "examples": [ - "Play queen on deezer.", - "Play inxs on youtube.", - "Play next.", - "Play previous.", - "Stop.", - "Pause.", - "Resume.", - "Set volume to 50." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Gonzalo Huerta-Cánepa" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Voice Playemjs Skill", - "android_handler": "voice-playemjs-skill.gfhuertac.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-02-17T14:09:54Z", - "archived": false, - "license": "unknown", - "modified": "2019-02-18T20:58:47Z", - "authorname": "andlo", - "skillname": "Common Storytelling", - "foldername": "common-storytelling-skill", - "name": "Common Storytelling", - "url": "https://github.com/andlo/common-storytelling-skill", - "category": "Entertainment", - "description": "A super skill that invokes other skill to tell stories. That mens the story telling skills \n\nThis skill enables Mycroft to tell storie. This skill does not by it self have ny stories, but utilize other\nstorytelling skills that uses this comme storytelling skill.\n\nAt time of writing this to skills is using common storyteliing\nThe Brothers Grimms Fairy tales (https://github.com/andlo/grimms-skill)\nand\nH. C. Andersen's Fairy Tales (https://github.com/andlo/hcandersen-skill)\n\n_“If you want your children to be intelligent, read them fairy tales. If you want them to be more\nintelligent, read them more fairy tales.”\nAlbert Einstein_", - "short_description": "A common storytelling skill", - "branch": "master", - "examples": [ - "Tell a story.", - "Thell the story {story}", - "Tell a fairy tale.", - "Continue story." - ], - "tags": [ - "fairy", - "stories", - "fairytale", - "fairytales", - "common-storytelling", - "Entertainment", - "tales", - "story", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "story-512.png", - "credits": [ - "Andreas Lorensen (@andlo]" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Common Storytelling Skill", - "android_handler": "common-storytelling-skill.andlo.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-06-03T09:19:57Z", - "archived": false, - "license": "unknown", - "modified": "2019-08-07T12:18:06Z", - "authorname": "vozotem", - "skillname": "Weather Test", - "foldername": "weather-test-skill", - "name": "Weather Test", - "url": "https://github.com/vozotem/weather-test-skill", - "category": null, - "description": "J'ai modifié le Skill mycroft-weather-skill utilisant l'API Open Weather Map afin de récupérer la météo et la stocker dans une base de données (avec SQLite). Ce Skill sert à récupérer une température stockée dans la base de données et retourner la valeur vocalement. Il ne peut récupérer une température seulement pour la date courante.", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "RaphaelTMM" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Weather Test Skill", - "android_handler": "weather-test-skill.vozotem.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-12-11T23:34:58Z", - "archived": false, - "license": "mit", - "modified": "2020-07-08T16:10:18Z", - "authorname": "timo-a", - "skillname": "Anki Interface", - "foldername": "anki-interface-skill", - "name": "Anki Interface", - "url": "https://github.com/timo-a/anki-interface-skill", - "category": "Daily", - "description": "Control the flashcard program anki with your voice. mycroft navigates anki by sending key presses.", - "short_description": "Control the flashcard program anki with your voice.", - "branch": "master", - "examples": [ - "Open anki.", - "Start vocabulary review.", - "Open deck two.", - "Open deck number two.", - "Show.", - "Show answer.", - "Easy.", - "Good.", - "Hard.", - "Again.", - "Again on new.", - "Undo.", - "Go back to main menu.", - "Quit.", - "Open anki", - "Start vocabulary review", - "Open deck two", - "Open deck number two", - "show", - "show answer", - "easy", - "good", - "hard", - "again", - "again on new ", - "undo", - "go back to main menu", - "quit" - ], - "tags": [ - "repetition", - "Learning", - "Productivity", - "Daily", - "Spaced", - "Vocab", - "Spaced repetition", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/brain.svg", - "credits": [ - "timo-a" - ], - "categories": [ - "Daily", - "Productivity" - ], - "requirements": { - "python": [ - "python3-xlib", - "pyautogui" - ], - "system": { - "all": "scrot python3-tk python3-dev" - }, - "skill": [] - }, - "android": { - "android_icon": null, - "android_name": "Anki Interface Skill", - "android_handler": "anki-interface-skill.timo-a.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-02-10T02:11:08Z", - "archived": false, - "license": "mit", - "modified": "2019-03-09T13:28:40Z", - "authorname": "Shadowsith", - "skillname": "Mycroft Youtube Mpv", - "foldername": "mycroft-youtube-mpv", - "name": "Mycroft Youtube Mpv", - "url": "https://github.com/Shadowsith/mycroft-youtube-mpv", - "category": null, - "description": "Youtube Mpv is a powerful tool on base of the mpv player that uses the mpv unix\nsocket to play and control youtube videos only with help of voice commands.\nIt also checks if mpv is running to avoid not wanted simultaneous mpv sessions.", - "short_description": "", - "branch": "master", - "examples": [ - "Youtube arianna grande 7 rings.", - "Youtube cancel|exit.", - "Youtube pause|wait.", - "Youtube resume|play.", - "Youtube volume up|down|20.", - "Youtube speed up|down|2.", - "Youtube get duration.", - "Youtube get remaining.", - "Youtube get position.", - "Youtube get volume.", - "Youtube get speed.", - "Youtube seek forward|backward|num.", - "Youtube arianna grande 7 rings -- plays first result", - "Youtube cancel|exit -- stops playing", - "Youtube pause|wait -- pause playing", - "Youtube resume|play -- resume playing", - "Youtube volume up|down|20 -- set volume up, down, to number from 0 - 100", - "Youtube speed up|down|2 -- set spee up, down, to floating point number from 0 - 5", - "Youtube get duration -- get video duration", - "Youtube get remaining -- get remaining video time ", - "Youtube get position -- get current time stamp", - "Youtube get volume -- get current volume", - "Youtube get speed -- get current speed", - "Youtube seek forward|backward|num -- seek for/backward or with integer num (+/-)" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "Philip Mayer" - ], - "requirements": { - "python": [ - "bs4" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Youtube Mpv Skill", - "android_handler": "mycroft-youtube-mpv.shadowsith.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-04-28T23:30:07Z", - "archived": false, - "license": "unknown", - "modified": "2019-04-29T16:58:30Z", - "authorname": "KittyMac", - "skillname": "Jukebox", - "foldername": "jukebox-spotifyd", - "name": "Jukebox", - "url": "https://github.com/KittyMac/jukebox-spotifyd", - "category": null, - "description": "Should only be used on my jukebox.", - "short_description": "", - "branch": "master", - "examples": [ - "Play the music.", - "Start the music.", - "Play.", - "Start.", - "Go." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Rocco Bowling" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Jukebox Spotifyd Skill", - "android_handler": "jukebox-spotifyd.kittymac.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-01-13T12:00:49Z", - "archived": false, - "license": "mit", - "modified": "2019-01-15T22:18:19Z", - "authorname": "JoshSnek", - "skillname": "Audible", - "foldername": "skill-audible", - "name": "Audible", - "url": "https://github.com/JoshSnek/skill-audible", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Play the book The Art of War.", - "Go to chapter number 7.", - "Play the book The Art of War", - "Go to chapter number 7" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Joshua Bierton" - ], - "requirements": { - "python": [ - "gensim" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Audible Skill", - "android_handler": "skill-audible.joshsnek.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-11-17T16:36:41Z", - "archived": false, - "license": "unknown", - "modified": "2020-01-05T07:34:33Z", - "authorname": "umglurf", - "skillname": "Entur", - "foldername": "entur-skill", - "name": "Entur", - "url": "https://github.com/umglurf/entur-skill", - "category": "Transport", - "description": "Get the next realtime departure info from the configured stops. You can ask about a specific line or transport method.", - "short_description": "Get realtime departure data from [Entur](https://www.entur.org/)", - "branch": "master", - "examples": [ - "When is the next tram?", - "Get the next line 17.", - "When is the next metro leaving?", - "Give me the next departure.", - "When is the next tram", - "Get the next line 17", - "When is the next metro leaving", - "Give me the next departure" - ], - "tags": [ - "Transport", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "@umglurf" - ], - "categories": [ - "Transport" - ], - "requirements": { - "python": [ - "python-dateutil", - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Entur Skill", - "android_handler": "entur-skill.umglurf.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-05-03T22:28:02Z", - "archived": false, - "license": "unknown", - "modified": "2019-05-04T19:01:26Z", - "authorname": "aarondh", - "skillname": "Wunderlist", - "foldername": "wunderlist-skill", - "name": "Wunderlist", - "url": "https://github.com/aarondh/wunderlist-skill", - "category": null, - "description": "Manage your wunderlist tasks.", - "short_description": "", - "branch": "master", - "examples": [ - "What are my wonder lists?", - "List my wonder lists.", - "List my lists.", - "What are my lists?", - "Wonder list." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "aarondh" - ], - "requirements": { - "python": [ - "wunderpy2==0.1.6\r", - "phonetics==1.0.5" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Wunderlist Skill", - "android_handler": "wunderlist-skill.aarondh.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-07-23T08:45:35Z", - "archived": false, - "license": "unknown", - "modified": "2020-04-04T17:12:41Z", - "authorname": "thekindler", - "skillname": "Face Interaction", - "foldername": "face-interaction-mycroft-skill", - "name": "Face Interaction", - "url": "https://github.com/thekindler/face-interaction-mycroft-skill", - "category": "Entertainment", - "description": "Identifies who the person is by face recognition and starts a conversation with him", - "short_description": "Identifies who the person is from his face an", - "branch": "master", - "examples": [ - "Face recognition greet name.", - "Face interaction greet.", - "Start face interaction name.", - "Face recognition start.", - "Face recognition interact.", - "Face recognition converse.", - "Face interaction converse.", - "Face interaction speak.", - "Face recognition greet name", - "Face interaction greet", - "Start face interaction name", - "Face recognition start", - "Face recognition interact", - "Face recognition converse", - "Face interaction converse", - "Face interaction speak" - ], - "tags": [ - "Entertainment", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "anupam" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Face Interaction Mycroft Skill", - "android_handler": "face-interaction-mycroft-skill.thekindler.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-09-24T17:56:18Z", - "archived": false, - "license": "unknown", - "modified": "2020-01-15T22:48:14Z", - "authorname": "a1aiintel", - "skillname": "mycroft-vision-skill", - "foldername": "ZZZ-service-skill-vision", - "name": "mycroft-vision-skill", - "url": "https://github.com/a1aiintel/ZZZ-service-skill-vision", - "category": null, - "description": "Listens to messagebus \"vision_request\" queries, replies with info of what is in vision field\n\nProcesses images for face detection, eye detection and smile detection\n\nwork in progress - motion detection, face recognition\n\nOptionally applies image filters before displaying\n\nTakes webcam pictures", - "short_description": "Listens to messagebus \"vision_request\" queries, replies with info of what is in vision field", - "branch": "master", - "examples": [ - "05-07 16:23:45,035 - CLIClient - INFO - Speak: Here is what i see.", - "Shows feed (with filter if enabled)", - "Requests local/server image classification.", - "06-17 18:19:23,294 - CLIClient - INFO - Speak: i see suit, or maybe it is Windsor tie.", - "05-07 16:29:00,117 - CLIClient - INFO - Speak: There are 0 persons on view.", - "05-07 16:29:00,122 - CLIClient - INFO - Speak: Noone is smiling.", - "05-07 16:29:49,905 - CLIClient - INFO - Speak: smooth filter enabled.", - "05-07 16:29:53,411 - CLIClient - INFO - Speak: skeleton filter enabled.", - "05-07 16:29:56,608 - CLIClient - INFO - Speak: threshold filter enabled.", - "05-07 16:29:59,374 - CLIClient - INFO - Speak: detail filter enabled.", - "05-07 16:30:01,273 - CLIClient - INFO - Speak: filters disabled.", - "05-07 16:48:21,730 - CLIClient - INFO - Speak: saving picture.", - "Saves pic (with filter if enabled)", - "Shows pic (with filter if enabled)" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Zzz Service Vision Skill", - "android_handler": "ZZZ-service-skill-vision.a1aiintel.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-04-16T12:49:59Z", - "archived": false, - "license": "unknown", - "modified": "2019-05-07T12:46:25Z", - "authorname": "AIIX", - "skillname": "", - "foldername": "map-navigation-places", - "name": "", - "url": "https://github.com/AIIX/map-navigation-places", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Map Navigation Places Skill", - "android_handler": "map-navigation-places.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-01-09T18:55:47Z", - "archived": false, - "license": "unknown", - "modified": "2020-09-05T13:13:56Z", - "authorname": "thorstenMueller", - "skillname": "Symcon Light", - "foldername": "symcon-skill", - "name": "Symcon Light", - "url": "https://github.com/thorstenMueller/symcon-skill", - "category": null, - "description": "This skill should switch the light in my kitchen.", - "short_description": "", - "branch": "master", - "examples": [ - "Turn of the light in the kitchen.", - "Turn off the light in the kitchen.", - "Light in kitchen brighter." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "ThorstenMueller" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Symcon Skill", - "android_handler": "symcon-skill.thorstenmueller.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-10-24T20:47:53Z", - "archived": false, - "license": "unknown", - "modified": "2020-02-13T15:33:54Z", - "authorname": "jaredcobb", - "skillname": "Crypto Markets", - "foldername": "crypto-markets-skill", - "name": "Crypto Markets", - "url": "https://github.com/jaredcobb/crypto-markets-skill", - "category": "Information", - "description": "", - "short_description": "Get market price updates for popular cryptocurrencies", - "branch": "master", - "examples": [ - "How much is bitcoin.", - "What's the price of btc?", - "How much is eth.", - "What's going on with crypto?", - "How much is bitcoin", - "What's the price of btc", - "How much is eth", - "What's going on with crypto" - ], - "tags": [ - "Bitcoin", - "Cryptocurrency", - "Crypto", - "Information", - "Btc", - "Eth", - "Ether", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "@jaredcobb" - ], - "categories": [ - "Information" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Crypto Markets Skill", - "android_handler": "crypto-markets-skill.jaredcobb.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-06-09T21:10:30Z", - "archived": false, - "license": "unknown", - "modified": "2019-06-15T21:26:50Z", - "authorname": "wescottsharples", - "skillname": "About", - "foldername": "skill-time-tracker", - "name": "About", - "url": "https://github.com/wescottsharples/skill-time-tracker", - "category": null, - "description": "Track the amount of time you spend on your projects/tasks/activities. Great for freelancers or individuals who want to track the time on their projects/tasks/activities. Multiple tasks can be tracked at the same time, just make sure to stop all of them. All project names and time spent on them are stored in a `projects.json` file.\n\n---\n\n### Usage :pencil:\n\nAdd project: Writes a new task name on file.\n\nDelete project: Deletes a task name on file, if it exists.\n\nStart project: Starts the timer on a task.\n\nStop project: Stops the timer on a task.\n\nList projects: Lists all avaliable projects.\n\nCreate csv: Creates a csv for each project in a folder `projects_csv` in the skill's directory.\n\nDetails: Returns the past week's amount of time spent on a task.\n\n### Examples :microphone:\n\n - \"Add activity {running}\"\n - \"Delete activity {running}\"\n - \"Start activity {running}\"\n - \"Stop activity {running}\"\n - \"List all projects\"\n - \"Create csv for my projects\"\n - \"How long did I work this week on {job project}?\"", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Time Tracker Skill", - "android_handler": "skill-time-tracker.wescottsharples.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-06-13T16:19:53Z", - "archived": false, - "license": "unknown", - "modified": "2019-06-13T17:47:16Z", - "authorname": "klarsen14", - "skillname": "", - "foldername": "skill-punny-joke-skill", - "name": "", - "url": "https://github.com/klarsen14/skill-punny-joke-skill", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Punny Joke Skill", - "android_handler": "skill-punny-joke-skill.klarsen14.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-10-15T14:05:11Z", - "archived": false, - "license": "unknown", - "modified": "2020-03-03T05:57:10Z", - "authorname": "rhythm1705", - "skillname": "Cricket Scores", - "foldername": "cricket-scores-skill", - "name": "Cricket Scores", - "url": "https://github.com/rhythm1705/cricket-scores-skill", - "category": "Entertainment", - "description": "", - "short_description": "Gives scores of latest cricket match being played.", - "branch": "master", - "examples": [ - "Cricket.", - "Cricket match score.", - "What is the score for the cricket match?", - "Cricket", - "Cricket match score", - "What is the score for the cricket match" - ], - "tags": [ - "Sports", - "Game", - "Match", - "Entertainment", - "Cricket", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "@rhythm1705" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Cricket Scores Skill", - "android_handler": "cricket-scores-skill.rhythm1705.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-12-29T17:44:08Z", - "archived": false, - "license": "mit", - "modified": "2020-01-15T03:31:04Z", - "authorname": "vraedac", - "skillname": "Shopping List", - "foldername": "shopping-list-skill", - "name": "Shopping List", - "url": "https://github.com/vraedac/shopping-list-skill", - "category": "Productivity", - "description": "This skill allows you to create and manage a group of named shopping lists. It uses Todoist as the backend, and organizes all lists as sub-projects under a single Todoist parent Project, the name of which is customizeable.", - "short_description": "Manages a group of shopping lists on Todoist", - "branch": "master", - "examples": [ - "Create a list named Test.", - "Add cookies to my Test list.", - "Remove string cheese from the Test list.", - "What's on my Test list?", - "Is bacon on the Test list?" - ], - "tags": [ - "Grocery", - "Productivity", - "Shopping", - "List", - "Todoist", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/clipboard-list.svg", - "credits": [ - "vraedac" - ], - "categories": [ - "Productivity" - ], - "requirements": { - "python": [ - "todoist-python" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Shopping List Skill", - "android_handler": "shopping-list-skill.vraedac.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-11-15T21:35:01Z", - "archived": false, - "license": "unknown", - "modified": "2020-05-24T19:22:14Z", - "authorname": "john-ammon", - "skillname": "NBA Scoreboard", - "foldername": "nba-scoreboard-skill", - "name": "NBA Scoreboard", - "url": "https://github.com/john-ammon/nba-scoreboard-skill", - "category": "Entertainment", - "description": "This skill gets the score of an nba game based on the team and date the user provides.", - "short_description": "Gets nba scores", - "branch": "master", - "examples": [ - "What is the score of the most recent bulls game?" - ], - "tags": [ - "Entertainment", - "Nba", - "Basketball", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://image.flaticon.com/icons/svg/79/79543.svg", - "credits": [ - "john-ammon (John Ammon)", - "ericgurevich (Eric Gurevich)", - "dsh3406 (Su Hyun Do)", - "beckmeghane (Meghan Beck)", - "blowthemandown (James Piatt)" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Nba Scoreboard Skill", - "android_handler": "nba-scoreboard-skill.john-ammon.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-06-06T08:23:19Z", - "archived": false, - "license": "unknown", - "modified": "2020-04-04T17:13:50Z", - "authorname": "thekindler", - "skillname": "Retail", - "foldername": "retail-skill", - "name": "Retail", - "url": "https://github.com/thekindler/retail-skill", - "category": null, - "description": "Reply to retail related questions.", - "short_description": "", - "branch": "master", - "examples": [ - "How much are potatoes.", - "How much is a kilo of potato.", - "What is the price of one kilo potato?", - "Price of potato.", - "How much do potatoes cost.", - "How much does a kilogram of potato cost." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "anupam" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Retail Skill", - "android_handler": "retail-skill.thekindler.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-06-07T19:38:29Z", - "archived": false, - "license": "unknown", - "modified": "2019-06-07T19:40:40Z", - "authorname": "rekkitcwts", - "skillname": "Suitenguu Enclosure", - "foldername": "suitenguu-enclosure-skill", - "name": "Suitenguu Enclosure", - "url": "https://github.com/rekkitcwts/suitenguu-enclosure-skill", - "category": "Configuration", - "description": "Inspired by the original mark 1, this allows customization of the faceplate. this requires a custom enclosure that has 5 buttons, such as an old radio clock that is repurposed.", - "short_description": "Made for an arduino uno-based enclosure parallel to the mark 1", - "branch": "master", - "examples": [ - "Change eye colour.", - "Set eye colour to blue.", - "Check network status.", - "Change eye colour", - "Set eye colour to blue", - "Check network status" - ], - "tags": [ - "Configuration", - "System", - "Settings", - "Suitenguu", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "rekkitcwts" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Suitenguu Enclosure Skill", - "android_handler": "suitenguu-enclosure-skill.rekkitcwts.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-08-26T21:05:01Z", - "archived": false, - "license": "epl-2.0", - "modified": "2019-09-22T19:38:13Z", - "authorname": "wheezardth", - "skillname": "About", - "foldername": "mycroft-clue", - "name": "About", - "url": "https://github.com/wheezardth/mycroft-clue", - "category": "Utilities", - "description": "A skill that provides a conversational interface with an imaginary person's voice assistant.", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "audio", - "Utilities", - "clues", - "franzl", - "no-license" - ], - "platforms": [ - "platform_mark1", - "platform_picroft", - "platform_kde", - "platform_mark2" - ], - "stars": 0, - "categories": [ - "Utilities" - ], - "credits": [ - "Stefan Kachaunov / TREE Industries" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Clue Skill", - "android_handler": "mycroft-clue.wheezardth.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-11-14T20:17:59Z", - "archived": false, - "license": "unknown", - "modified": "2019-11-14T20:26:55Z", - "authorname": "thorstenMueller", - "skillname": "Workout Interval", - "foldername": "workout-interval-skill", - "name": "Workout Interval", - "url": "https://github.com/thorstenMueller/workout-interval-skill", - "category": "Daily", - "description": "The training consists of several rounds of x seconds / minutes followed by a break of also y seconds.", - "short_description": "Starts a training interval with multiple passes and pauses", - "branch": "master", - "examples": [ - "Workout.", - "Interval.", - "Training.", - "Workout", - "Interval", - "Training" - ], - "tags": [ - "Interval", - "Workout", - "Daily", - "Training", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "Thorsten Mueller" - ], - "categories": [ - "Daily" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Workout Interval Skill", - "android_handler": "workout-interval-skill.thorstenmueller.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-02-15T02:57:06Z", - "archived": false, - "license": "unknown", - "modified": "2019-03-23T16:44:23Z", - "authorname": "ImprezaRSC", - "skillname": "Turtlerear", - "foldername": "turtlerear-skill", - "name": "Turtlerear", - "url": "https://github.com/ImprezaRSC/turtlerear-skill", - "category": null, - "description": "\u001b[f\u001b[csee above\n\nsee above.", - "short_description": "", - "branch": "master", - "examples": [ - "Rear.", - "Back up.", - "Backward." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Turtlerear Skill", - "android_handler": "turtlerear-skill.imprezarsc.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-05-29T20:50:21Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2019-05-30T00:20:16Z", - "authorname": "fractal13", - "skillname": "", - "foldername": "skill-brainyquote", - "name": "", - "url": "https://github.com/fractal13/skill-brainyquote", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Brainyquote Skill", - "android_handler": "skill-brainyquote.fractal13.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-02-10T02:01:44Z", - "archived": false, - "license": "unknown", - "modified": "2019-03-23T16:40:31Z", - "authorname": "ImprezaRSC", - "skillname": "Startturtlesim", - "foldername": "startturtlesim-skill", - "name": "Startturtlesim", - "url": "https://github.com/ImprezaRSC/startturtlesim-skill", - "category": null, - "description": "See above.", - "short_description": "", - "branch": "master", - "examples": [ - "Turtle.", - "Turtle Sim.", - "Turtlesim." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Startturtlesim Skill", - "android_handler": "startturtlesim-skill.imprezarsc.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-02-19T18:52:15Z", - "archived": false, - "license": "unknown", - "modified": "2019-03-23T16:35:02Z", - "authorname": "ImprezaRSC", - "skillname": "Spinturtleright", - "foldername": "spinturtleright-skill", - "name": "Spinturtleright", - "url": "https://github.com/ImprezaRSC/spinturtleright-skill", - "category": null, - "description": "This skill rotates the turtle clockwise about 15 degrees.", - "short_description": "", - "branch": "master", - "examples": [ - "Spin right.", - "Rotate right.", - "Pivot right." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Spinturtleright Skill", - "android_handler": "spinturtleright-skill.imprezarsc.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2019-02-15T02:41:20Z", - "archived": false, - "license": "unknown", - "modified": "2019-03-23T16:33:07Z", - "authorname": "ImprezaRSC", - "skillname": "Turtleforward", - "foldername": "turtleforward-skill", - "name": "Turtleforward", - "url": "https://github.com/ImprezaRSC/turtleforward-skill", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [ - "Forward." - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Turtleforward Skill", - "android_handler": "turtleforward-skill.imprezarsc.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-05-29T21:01:05Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-07-08T07:50:51Z", - "authorname": "jarbasskills", - "skillname": "skill-voip", - "foldername": "skill-voip", - "name": "VoIP Skill", - "url": "https://github.com/JarbasSkills/skill-voip", - "category": null, - "description": "Add VOIP capabilities to Mycroft using Baresip\n\n![](./voip.gif)", - "short_description": "Add VOIP capabilities to Mycroft using Baresip", - "branch": "master", - "examples": [ - "call X", - "call X and say Y", - "accept call", - "accept call and say Y", - "hang up", - "reject call", - "hold call", - "resume call", - "mute call", - "unmute call", - "answer all calls", - "answer all calls with Y", - "reject all calls", - "Do not handle calls automatically", - "how many contacts", - "List contacts", - "Call status", - "restart sip", - "sip login", - "call bob", - "call bob and say Open Source is AWESOME", - "list contacts" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all", - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "stars": 2, - "credits": [ - "This work as been sponsored by Matt Keys, [eZuce Inc](https://ezuce.com/)\n\nThe GUI was made by [AIIX](https://github.com/AIIX/)\n\n<meta name=\"ocs-site-verification\" content=\"8b4504b05f4c0b263ff59f5e4919a6e4\" />" - ], - "requirements": { - "python": [ - "baresipy>=0.1.4", - "json_database>=0.1.3" - ], - "system": { - "all": "baresip" - }, - "skill": [] - }, - "android": { - "android_icon": "voip-skill", - "android_name": "Voip Skill", - "android_handler": "skill-voip.jarbasskills.home" - }, - "desktop": { - "X-DBUS-StartupType": "None", - "X-KDE-StartupNotify": "false", - "Version": "1.0", - "Terminal": "false", - "Type": "Application", - "Name": "VoIP", - "Exec": "mycroft-gui-app --hideTextInput --skill=skill-voip.jarbasskills.home", - "Icon": "voip-skill", - "Categories": "VoiceApp", - "StartupNotify": "false" - }, - "desktopFile": false, - "systemDeps": true - }, - { - "created": "2020-07-03T09:20:57Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-10-16T12:55:57Z", - "authorname": "AIIX", - "skillname": "Pixabay", - "foldername": "pixabay-skill", - "name": "Pixabay", - "url": "https://github.com/AIIX/pixabay-skill", - "category": "Media", - "description": "Browse Pixabay Gallery Images and Videos, Set Images or Videos as Your Homescreen", - "short_description": "Browse Pixabay Gallery Images and Videos Mycroft Skill", - "branch": "master", - "examples": [ - "Search Pixabay for Dogs.", - "Search Pixabya for Dog Videos.", - "Set As Homescreen.", - "Configure Pixabay Homescreen.", - "Hey Mycroft Search Pixabay for Dogs", - "Hey Mycroft Search Pixabya for Dog Videos", - "Hey Mycroft Set As Homescreen", - "Hey Mycroft Configure Pixabay Homescreen" - ], - "tags": [ - "ImageGallery", - "GUI", - "Pixabay", - "VideoStreaming", - "Media", - "Images", - "Video", - "no-license" - ], - "platforms": [ - "platform_mark2", - "platform_plasmoid" - ], - "stars": 0, - "icon": "https://raw.githubusercontent.com/FortAwesome/Font-Awesome/master/svgs/regular/images.svg", - "credits": [ - "Aix (@aiix)" - ], - "categories": [ - "Media" - ], - "requirements": { - "python": [ - "python-pixabay", - "json_database", - "requests>=1.1" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": "/res/icon/pxlogo.png", - "android_name": "Pixabay", - "android_handler": "pixabay-skill.aiix.home" - }, - "desktop": { - "X-DBUS-StartupType": "None", - "X-KDE-StartupNotify": "false", - "Version": "1.0", - "Terminal": "false", - "Type": "Application", - "Name": "Pixabay", - "Exec": "mycroft-gui-app --hideTextInput --skill=pixabay-skill.aiix.home", - "Icon": "pxlogo", - "Categories": "VoiceApp", - "StartupNotify": "false" - }, - "desktopFile": true - }, - { - "created": "2020-01-06T08:44:50Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-01-07T21:19:32Z", - "authorname": "domcross", - "skillname": "Mycroft Verbosity", - "foldername": "mycroft-verbosity-skill", - "name": "Mycroft Verbosity", - "url": "https://github.com/domcross/mycroft-verbosity-skill", - "category": "Configuration", - "description": "As a mycroft developer this skill to lets you me turn verbosity up on the command line interface so that youi can better understand what’s going on inside of Mycroft.\n\nCurrently the verbosity level are mapped to LOG level as follows:\nlow - ERROR\n * normal - INFO\n * high - DEBUG", - "short_description": "This skill lets you set the verbosity/log level on the mycroft cli", - "branch": "master", - "examples": [ - "Set verbosity to low/normal/high.", - "Set log level to critical/error/warning/info/debug.", - "Hey Mycroft, set verbosity to low/normal/high", - "Hey Mycroft, set log level to critical/error/warning/info/debug" - ], - "tags": [ - "Verbosity", - "Loglevel", - "Cli", - "Debug", - "Configuration", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 4, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/bug.svg", - "credits": [ - "domcross (@dominik)", - "Mike MacIsaac (@mike99mac) - skill suggestion" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Verbosity Skill", - "android_handler": "mycroft-verbosity-skill.domcross.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-07-09T11:58:09Z", - "archived": false, - "license": "mit", - "modified": "2020-10-13T17:03:11Z", - "authorname": "boxledev", - "skillname": "Sonos controller skill", - "foldername": "sonos-controller", - "name": "Sonos controller skill", - "url": "https://github.com/boxledev/sonos-controller", - "category": null, - "description": "Uses the SoCo library to control sonos speakers\n\nYou can set a default speaker in the settings, otherwise a random active speaker will be chosen at initialisation\n\n![](sonos_gui.png)", - "short_description": "", - "branch": "master", - "examples": [ - "Sonos play.", - "Sonos pause.", - "Sonos next.", - "Sonos previous.", - "Sonos louder / volume up.", - "Sonos quieter / volume down.", - "Sonos shuffle on.", - "Sonos shuffle off.", - "Sonos playlist playlist_name.", - "Sonos playlist playlist_name in the living room.", - "Sonos play album album_name.", - "Sonos set living room (as active speaker)", - "Search for sonos speakers.", - "Show album (art)", - "Sonos what's playing?", - "sonos play", - "sonos pause", - "sonos next", - "sonos previous", - "sonos louder / volume up", - "sonos quieter / volume down", - "sonos shuffle on", - "sonos shuffle off", - "sonos playlist playlist_name", - "sonos playlist playlist_name in the living room", - "sonos play album album_name", - "sonos set living room (as active speaker)", - "search for sonos speakers", - "show album (art) (requires mycroft-gui)", - "sonos what's playing?" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "SoCo", - "rapidfuzz" - ], - "requirements": { - "python": [ - "rapidfuzz", - "soco" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Sonos Controller Skill", - "android_handler": "sonos-controller.boxledev.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-01-02T14:22:32Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-06T19:37:50Z", - "authorname": "OpenVoiceOS", - "skillname": "skill-ovos-enclosure", - "foldername": "skill-ovos-enclosure", - "name": "skill-ovos-enclosure", - "url": "https://github.com/OpenVoiceOS/skill-ovos-enclosure", - "category": null, - "description": "Skill to take control of OpenVoiceOS it's functions and tools as Mycroft skill.", - "short_description": "Skill to take control of OpenVoiceOS it's functions and tools as Mycroft skill.", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Ovos Enclosure Skill", - "android_handler": "skill-ovos-enclosure.openvoiceos.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-06-10T00:37:45Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-06-16T15:21:29Z", - "authorname": "JarbasSkills", - "skillname": "skill-hivemind", - "foldername": "skill-hivemind", - "name": "HiveMind Skill", - "url": "https://github.com/JarbasSkills/skill-hivemind", - "category": null, - "description": "![](./logo.png)\n\nMycroft skill for [HiveMind-core](https://github.com/JarbasHiveMind/HiveMind-core)\n\nAllows the HiveMind ecosystem to talk to a Mycroft instance", - "short_description": "![](./logo.png)", - "branch": "master", - "examples": [ - "[Remote Cli](https://github.com/JarbasHiveMind/HiveMind-cli)", - "[Voice Satellite](https://github.com/JarbasHiveMind/HiveMind-voice-sat)", - "[Flask Chatroom](https://github.com/JarbasHiveMind/HiveMind-flask-chatroom)", - "[Webchat](https://github.com/JarbasHiveMind/HiveMind-webchat)", - "[Mattermost Bridge](https://github.com/JarbasHiveMind/HiveMind_mattermost_bridge)", - "[HackChat Bridge](https://github.com/JarbasHiveMind/HiveMind-HackChatBridge)", - "[Twitch Bridge](https://github.com/JarbasHiveMind/HiveMind-twitch-bridge)" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all", - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "stars": 2, - "logo": "https://raw.githubusercontent.com/JarbasSkills/skill-hivemind/master/logo.png", - "requirements": { - "python": [ - "jarbas_hive_mind>=0.10.4", - "json_database", - "jarbas_hive_mind", - "jarbas_utils" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Hivemind Skill", - "android_handler": "skill-hivemind.jarbasskills.home" - }, - "desktop": {}, - "desktopFile": false, - "systemDeps": "false" - }, - { - "created": "2020-03-23T17:28:47Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-05-05T23:22:01Z", - "authorname": "davimk", - "skillname": "CPU Temperature", - "foldername": "cpu-temperature", - "name": "CPU Temperature", - "url": "https://github.com/davimk/cpu-temperature", - "category": "Information", - "description": "Speaks the cpu temperature. Value is obtained from thermal_zone0 at /sys/class/thermal/thermal_zone0/temp. The temperature unit can be set to Celsius or Fahrenheit on your Mycroft account skill settings page.", - "short_description": "Speaks the cpu temperature.", - "branch": "master", - "examples": [ - "What is the cpu temperature?", - "Cpu temperature.", - "Thermals.", - "Thermal.", - "How is the processor doing.", - "How is the cpu doing.", - "What is the processor temperature?", - "Processor temperature.", - "What is the cpu temperature", - "Cpu temperature", - "Thermals", - "Thermal", - "How is the processor doing", - "How is the cpu doing", - "What is the processor temperature", - "Processor temperature" - ], - "tags": [ - "Cpu", - "Processor", - "temperature", - "Information", - "Thermal_zone0", - "Cpu temperature", - "Processor temperature", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/thermometer-half.svg", - "credits": [ - "David" - ], - "categories": [ - "Information" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Cpu Temperature Skill", - "android_handler": "cpu-temperature.davimk.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-06-09T20:16:45Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-10-20T17:50:41Z", - "authorname": "chiisaa", - "skillname": "Google AIY2 voicebonnet", - "foldername": "picroft-google-aiy2-voicebonnet-skill", - "name": "Google AIY2 voicebonnet", - "url": "https://github.com/chiisaa/picroft-google-aiy2-voicebonnet-skill", - "category": "IoT", - "description": "This enables the LED and button on the Google AIY2 voicebonnet.\n\nThe button LED turns on when Mycroft is listening. If button is pressed he begins to listen. If the button is pressed for a longer time he stops whatever he is doing.", - "short_description": "Enables Google AIY2 voicebonnet", - "branch": "master", - "examples": [], - "tags": [ - "IoT", - "voicekitv2", - "voicebonnet", - "Googleaiy2", - "aiy2", - "googlevoicebonnet", - "no-license" - ], - "platforms": [ - "platform_picroft" - ], - "stars": 4, - "icon": "AIY_logo_blue.png", - "categories": [ - "IoT" - ], - "credits": [ - "Chip Isaacks (@chiisaa)\n\nThanks to Andreas Lorensen (@andlo) for doing the heavy lifting" - ], - "requirements": { - "python": [ - "RPi.GPIO\r" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Picroft Google Aiy2 Voicebonnet Skill", - "android_handler": "picroft-google-aiy2-voicebonnet-skill.chiisaa.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-05-15T09:27:28Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-06-30T04:35:28Z", - "authorname": "AIIX", - "skillname": "Netflix Webapp", - "foldername": "netflix-webapp", - "name": "Netflix Webapp", - "url": "https://github.com/AIIX/netflix-webapp", - "category": "Media", - "description": "Netflix Web Application", - "short_description": "Netflix Web Application Skill for Mycroft", - "branch": "master", - "examples": [ - "Open Netflix.", - "Search Netflix For {Series}/{Movies}", - "Hey Mycroft Open Netflix", - "Hey Mycroft Search Netflix For {Series}/{Movies}" - ], - "tags": [ - "GUI", - "VideoStreaming", - "Media", - "Video", - "AudioStreaming", - "Netflix", - "no-license" - ], - "platforms": [ - "platform_mark2", - "platform_plasmoid" - ], - "stars": 2, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/film.svg", - "credits": [ - "Aix (@aiix)" - ], - "categories": [ - "Media" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": "https://raw.githubusercontent.com/AIIX/netflix-webapp/master/res/icon/netflix-webapp.png", - "android_name": "Netflix Webapp Skill", - "android_handler": "netflix-webapp.aiix.home" - }, - "desktop": { - "X-DBUS-StartupType": "None", - "X-KDE-StartupNotify": "false", - "Version": "1.0", - "Terminal": "false", - "Type": "Application", - "Name": "Netflix Webapp", - "Exec": "mycroft-gui-app --hideTextInput --skill=netflixwebapp.aiix.home", - "Icon": "netflix-webapp", - "Categories": "VoiceApp", - "StartupNotify": "false " - }, - "desktopFile": true - }, - { - "created": "2020-06-12T11:13:25Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-07-08T07:26:37Z", - "authorname": "AIIX", - "skillname": "Twitch Streams", - "foldername": "twitch-streams", - "name": "Twitch Streams", - "url": "https://github.com/AIIX/twitch-streams", - "category": "Media", - "description": "Play Live Twitch Streams", - "short_description": "Play Live Twitch Streams", - "branch": "master", - "examples": [ - "Show Twitch Streams.", - "Play Twitch Stream By [User]", - "Hey Mycroft Show Twitch Streams", - "Hey Mycroft Play Twitch Stream By [User]" - ], - "tags": [ - "GUI", - "Twitch", - "VideoStreaming", - "Music", - "Media", - "Video", - "AudioStreaming", - "LiveStreams", - "no-license" - ], - "platforms": [ - "platform_mark2", - "platform_plasmoid" - ], - "stars": 2, - "icon": "https://raw.githubusercontent.com/FortAwesome/Font-Awesome/master/svgs/brands/twitch.svg", - "credits": [ - "Aix (@aiix)" - ], - "categories": [ - "Media" - ], - "requirements": { - "python": [ - "streamlink", - "python-twitch-client", - "timeago", - "python-dateutil" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": "/res/icon/twitch-streams.png", - "android_name": "Twitch Streams", - "android_handler": "twitchstreams.aiix.home" - }, - "desktop": { - "X-DBUS-StartupType": "None", - "X-KDE-StartupNotify": "false", - "Version": "1.0", - "Terminal": "false", - "Type": "Application", - "Name": "Twitch Streams", - "Exec": "mycroft-gui-app --hideTextInput --skill=twitch-streams.aiix.home", - "Icon": "twitch-streams", - "Categories": "VoiceApp", - "StartupNotify": "false" - }, - "desktopFile": true - }, - { - "created": "2020-07-14T03:41:57Z", - "archived": false, - "license": "lgpl-3.0", - "modified": "2020-09-25T14:19:00Z", - "authorname": "jamesmf", - "skillname": "WebThings Gateway", - "foldername": "mycroft-mozilla-iot-skill", - "name": "WebThings Gateway", - "url": "https://github.com/jamesmf/mycroft-mozilla-iot-skill", - "category": "IoT", - "description": "[Mozilla WebThings Gateway](https://iot.mozilla.org/gateway/) is an open-source framework for controlling WebThings.\n\nThis skill extends the `CommonIoTSkill` so many utterances should work. The skill registers an entity for each Thing on your gateway. It uses the name of each Thing, so your utterance should follow something like \"turn on {thing.name}\" or \"set {thing.name} {property} to {value}\".", - "short_description": "<img src='things_ui_screenshot.png' card_color='#000000' style='vertical-align:bottom'/>", - "branch": "master", - "examples": [ - "Turn on the office light.", - "Turn off bedroom lights.", - "Set the office lamp brightness to 50.", - "Turn on the office light", - "Turn off bedroom lights", - "Set the office lamp brightness to 50" - ], - "tags": [ - "IoT", - "homeautomation", - "smarthome", - "mozillaiot", - "mozillagateway", - "mozilla", - "iot", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "Mycroft AI (@mycroftai)\njamesmf (@jamesmf)" - ], - "categories": [ - "IoT" - ], - "requirements": { - "python": [ - "responses", - "requests" - ], - "skill": [ - "https://github.com/MycroftAI/skill-iot-control" - ], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Mozilla Iot Skill", - "android_handler": "mycroft-mozilla-iot-skill.jamesmf.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-07-28T09:22:44Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-08-26T20:20:09Z", - "authorname": "j1nx", - "skillname": "skill-wifi-connect", - "foldername": "skill-wifi-connect", - "name": "skill-wifi-connect", - "url": "https://github.com/j1nx/skill-wifi-connect", - "category": null, - "description": "Mycroft AI skill to control Balena.io wifi-connect", - "short_description": "Mycroft AI skill to control Balena.io wifi-connect", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 2, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Wifi Connect Skill", - "android_handler": "skill-wifi-connect.j1nx.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-07-09T14:02:08Z", - "archived": false, - "license": "unknown", - "modified": "2020-09-19T12:14:49Z", - "authorname": "smilesmiley", - "skillname": "mycroft-skill-addon", - "foldername": "mycroft_bachelor_thesis", - "name": "mycroft-skill-addon", - "url": "https://github.com/smilesmiley/mycroft_bachelor_thesis", - "category": null, - "description": "Our goal is to perform user studies with a smart speaker called Mycroft. Therefore, we overwrite the main classes of Mycroft. This repository contains all files needed to conduct a user study with a specific skill.", - "short_description": "Enhancements for mycroft-skills to conduct user-centric studies.", - "branch": "master", - "examples": [], - "tags": [ - "rm", - "msm", - "functionality.", - "cp", - "skills/mycroft-skill-addon.justfaked/listener.py", - "initial", - "are", - "files.", - "listener.py", - "mic.py", - "with", - "skills/mycroft-skill-addon.justfaked/mic.py", - "````", - "replaces", - "mycroft-files", - "custom", - "removes", - "up-to-date", - "mycroft-skill-addon.justfaked", - "cd", - "remove", - "../../../", - "all", - "mycroft/skills/mycroft_skill/", - "This", - "script", - "for", - "stop-mycroft.sh", - "skills/mycroft-skill-addon.justfaked/mycroft_skill.py", - "update", - "mycroft/client/speech/", - "survey", - "files,", - "cli", - "mycroft_skill.py", - "the", - "bash", - "mycroft-hello-world.mycroft", - "../../client/speech/", - "keeps", - "start-mycroft.sh", - "and", - "It", - "that", - "functionality", - "conflicting", - "needed", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "create study_data folders so that diary and problem skill work" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft_Bachelor_Thesis Skill", - "android_handler": "mycroft_bachelor_thesis.smilesmiley.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-02-06T10:24:16Z", - "archived": false, - "license": "unknown", - "modified": "2020-03-10T09:28:02Z", - "authorname": "justfaked", - "skillname": "mycroft-skill-addon", - "foldername": "mycroft-skill-addon", - "name": "mycroft-skill-addon", - "url": "https://github.com/justfaked/mycroft-skill-addon", - "category": null, - "description": "Our goal is to perform user studies with a smart speaker called Mycroft. Therefore, we overwrite the main classes of Mycroft. This repository contains all files needed to conduct a user study with a specific skill.", - "short_description": "Enhancements for mycroft-skills to conduct user-centric studies.", - "branch": "master", - "examples": [], - "tags": [ - "rm", - "msm", - "functionality.", - "cp", - "skills/mycroft-skill-addon.justfaked/listener.py", - "initial", - "are", - "files.", - "listener.py", - "mic.py", - "with", - "skills/mycroft-skill-addon.justfaked/mic.py", - "````", - "replaces", - "mycroft-files", - "custom", - "removes", - "up-to-date", - "mycroft-skill-addon.justfaked", - "cd", - "remove", - "../../../", - "all", - "mycroft/skills/mycroft_skill/", - "This", - "script", - "for", - "stop-mycroft.sh", - "skills/mycroft-skill-addon.justfaked/mycroft_skill.py", - "update", - "mycroft/client/speech/", - "survey", - "files,", - "cli", - "mycroft_skill.py", - "the", - "bash", - "mycroft-hello-world.mycroft", - "../../client/speech/", - "keeps", - "start-mycroft.sh", - "and", - "It", - "that", - "functionality", - "conflicting", - "needed", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "#### mycroft.ai: \nDevs behind mycroft (https://github.com/mycroftai and https://mycroft.ai/)." - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Addon Skill", - "android_handler": "mycroft-skill-addon.justfaked.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-09-20T10:16:29Z", - "archived": false, - "license": "unknown", - "modified": "2020-09-20T10:16:37Z", - "authorname": "paccolamano", - "skillname": "Developer Assistant", - "foldername": "developer-assistant-skill", - "name": "Developer Assistant", - "url": "https://github.com/paccolamano/developer-assistant-skill", - "category": "IoT", - "description": "", - "short_description": "Use git via voice commands", - "branch": "master", - "examples": [ - "Commit [project-name]", - "Push [project-name]", - "Committing [project-name]", - "Add all [project-name] project files.", - "Add all files of the [project-name] project and commit.", - "Add all files of the [project-name] project and push.", - "Add all [project-name] files.", - "Reset all [project-name] files.", - "Checkout [project-name]", - "Hey mycroft, commit [project-name]", - "Hey mycroft, push [project-name]", - "Hey mycroft, committing [project-name]", - "Hey mycroft, add all [project-name] project files", - "Hey mycroft, add all files of the [project-name] project and commit", - "Hey mycroft, add all files of the [project-name] project and push", - "Hey mycroft, add all [project-name] files", - "Hey mycroft, reset all [project-name] files", - "Hey mycroft, checkout [project-name]" - ], - "tags": [ - "IoT", - "Productivity", - "Developer", - "Code", - "Dev", - "Git", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/code-branch.svg", - "credits": [ - "@paccolamano" - ], - "categories": [ - "IoT", - "Productivity" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Developer Assistant Skill", - "android_handler": "developer-assistant-skill.paccolamano.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-10-24T22:12:13Z", - "archived": false, - "license": "unknown", - "modified": "2020-10-24T22:13:47Z", - "authorname": "danjeffries96", - "skillname": "Hello World", - "foldername": "mycroft-spotify-test", - "name": "Hello World", - "url": "https://github.com/danjeffries96/mycroft-spotify-test", - "category": "Configuration", - "description": "This is a basic Hello Word Skill that takes an _Utterance_ from the user and provides a voice response - a _Dialog_. This Skill demonstrates the basic directory and file structure of a Mycroft Skill, and is a good first Skill to study if you are interested in developing Skills for the Mycroft ecosystem.\n\nIf you want to write **Skills** for Mycroft, Documentation is available:\n[Mycroft Skills Kit](https://mycroft.ai/documentation/skills/msk/)\n * [Developing a new Skill](https://mycroft.ai/documentation/skills/introduction-developing-skills/)\n * [Skill Settings](https://mycroft.ai/documentation/skills/skill-settings/)\n * [Automatic testing of your Mycroft Skill](https://mycroft.ai/documentation/skills/automatic-testing/)\n * [Skill Acceptance Process](https://mycroft.ai/documentation/skills/skills-acceptance-process/)\n * [Mycroft Skills Manager](https://mycroft.ai/documentation/msm/)\n * [Mycroft Message Bus](https://mycroft.ai/documentation/message-bus/)", - "short_description": "Introductory Skill so that Skill Authors can see how a Mycroft Skill is put together", - "branch": "master", - "examples": [ - "Hello world.", - "How are you?", - "Thank you.", - "Hello world", - "Thank you" - ], - "tags": [ - "first-skill", - "helloworld", - "Configuration", - "hello", - "greeting", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/smile.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Spotify Test Skill", - "android_handler": "mycroft-spotify-test.danjeffries96.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-02-19T01:20:38Z", - "archived": false, - "license": "unknown", - "modified": "2020-02-20T01:47:03Z", - "authorname": "TurBoss", - "skillname": "Hello World", - "foldername": "MicBot", - "name": "Hello World", - "url": "https://github.com/TurBoss/MicBot", - "category": "Configuration", - "description": "This is a basic Hello Word Skill that takes an _Utterance_ from the user and provides a voice response - a _Dialog_. This Skill demonstrates the basic directory and file structure of a Mycroft Skill, and is a good first Skill to study if you are interested in developing Skills for the Mycroft ecosystem.\n\nIf you want to write **Skills** for Mycroft, Documentation is available:\n[Mycroft Skills Kit](https://mycroft.ai/documentation/skills/msk/)\n * [Developing a new Skill](https://mycroft.ai/documentation/skills/introduction-developing-skills/)\n * [Skill Settings](https://mycroft.ai/documentation/skills/skill-settings/)\n * [Automatic testing of your Mycroft Skill](https://mycroft.ai/documentation/skills/automatic-testing/)\n * [Skill Acceptance Process](https://mycroft.ai/documentation/skills/skills-acceptance-process/)\n * [Mycroft Skills Manager](https://mycroft.ai/documentation/msm/)\n * [Mycroft Message Bus](https://mycroft.ai/documentation/message-bus/)", - "short_description": "Introductory Skill so that Skill Authors can see how a Mycroft Skill is put together", - "branch": "master", - "examples": [ - "Hello world.", - "How are you?", - "Thank you.", - "Hello world", - "Thank you" - ], - "tags": [ - "first-skill", - "helloworld", - "Configuration", - "hello", - "greeting", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/smile.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Micbot Skill", - "android_handler": "MicBot.turboss.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-03-30T01:38:55Z", - "archived": false, - "license": "mit", - "modified": "2020-06-13T03:18:24Z", - "authorname": "edwardwang1", - "skillname": "skill-dashboard", - "foldername": "skill-dashboard", - "name": "skill-dashboard", - "url": "https://github.com/edwardwang1/skill-dashboard", - "category": null, - "description": "This skill allows users to interact with Pi-Dashboard through voice commands.", - "short_description": "", - "branch": "master", - "examples": [ - "Hide calendar.", - "Show clock.", - "Note add five eggs.", - "Note remove one.", - "Hide calendar", - "Show clock", - "Note add five eggs", - "Note remove one" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Edward Wang" - ], - "requirements": { - "python": [ - "Pyro4==4.80", - "adapt==0.1", - "mycroft==0.1.0" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Dashboard Skill", - "android_handler": "skill-dashboard.edwardwang1.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-04-11T16:44:42Z", - "archived": false, - "license": "unknown", - "modified": "2020-04-15T17:21:03Z", - "authorname": "KleinerFlo27", - "skillname": "Hello World", - "foldername": "mycroft-skill.klaus", - "name": "Hello World", - "url": "https://github.com/KleinerFlo27/mycroft-skill.klaus", - "category": "Configuration", - "description": "This is a basic Hello Word Skill that takes an _Utterance_ from the user and provides a voice response - a _Dialog_. This Skill demonstrates the basic directory and file structure of a Mycroft Skill, and is a good first Skill to study if you are interested in developing Skills for the Mycroft ecosystem.\n\nIf you want to write **Skills** for Mycroft, Documentation is available:\n\n* [Mycroft Skills Kit](https://mycroft.ai/documentation/skills/msk/)\n* [Developing a new Skill](https://mycroft.ai/documentation/skills/introduction-developing-skills/)\n* [Skill Settings](https://mycroft.ai/documentation/skills/skill-settings/)\n* [Automatic testing of your Mycroft Skill](https://mycroft.ai/documentation/skills/automatic-testing/)\n* [Skill Acceptance Process](https://mycroft.ai/documentation/skills/skills-acceptance-process/)\n* [Mycroft Skills Manager](https://mycroft.ai/documentation/msm/)\n* [Mycroft Message Bus](https://mycroft.ai/documentation/message-bus/)", - "short_description": "Introductory Skill so that Skill Authors can see how a Mycroft Skill is put together", - "branch": "master", - "examples": [ - "Hallo Klaus.", - "Klaus.", - "Na Kleiner." - ], - "tags": [ - "first-skill", - "helloworld", - "Configuration", - "hello", - "greeting", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Skill.Klaus Skill", - "android_handler": "mycroft-skill.klaus.kleinerflo27.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-04-12T11:32:45Z", - "archived": false, - "license": "unknown", - "modified": "2020-04-15T19:38:50Z", - "authorname": "KleinerFlo27", - "skillname": "Hello World", - "foldername": "mycroft-skill.gpio", - "name": "Hello World", - "url": "https://github.com/KleinerFlo27/mycroft-skill.gpio", - "category": "Configuration", - "description": "This is a basic Hello Word Skill that takes an _Utterance_ from the user and provides a voice response - a _Dialog_. This Skill demonstrates the basic directory and file structure of a Mycroft Skill, and is a good first Skill to study if you are interested in developing Skills for the Mycroft ecosystem.\n\nIf you want to write **Skills** for Mycroft, Documentation is available:\n\n* [Mycroft Skills Kit](https://mycroft.ai/documentation/skills/msk/)\n* [Developing a new Skill](https://mycroft.ai/documentation/skills/introduction-developing-skills/)\n* [Skill Settings](https://mycroft.ai/documentation/skills/skill-settings/)\n* [Automatic testing of your Mycroft Skill](https://mycroft.ai/documentation/skills/automatic-testing/)\n* [Skill Acceptance Process](https://mycroft.ai/documentation/skills/skills-acceptance-process/)\n* [Mycroft Skills Manager](https://mycroft.ai/documentation/msm/)\n* [Mycroft Message Bus](https://mycroft.ai/documentation/message-bus/)", - "short_description": "Introductory Skill so that Skill Authors can see how a Mycroft Skill is put together", - "branch": "master", - "examples": [ - "Hello world.", - "How are you?", - "Thank you." - ], - "tags": [ - "first-skill", - "helloworld", - "Configuration", - "hello", - "greeting", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Skill.Gpio Skill", - "android_handler": "mycroft-skill.gpio.kleinerflo27.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-10-09T18:16:57Z", - "archived": false, - "license": "mit", - "modified": "2020-10-10T23:23:50Z", - "authorname": "calacuda", - "skillname": "mycroft-app-launcher:", - "foldername": "mycroft-app-launcher-testing", - "name": "mycroft-app-launcher:", - "url": "https://github.com/calacuda/mycroft-app-launcher-testing", - "category": null, - "description": "a mycroft skill that allows you to open and run programs from mycroft\n\n### usage:\n\nsay somehting to the effect of:\n -- open (prgram)\n -- launch (program)\n -- start (program)\n -- spin up (program)\n -- boot up (program)\n\n### special programs:\n\nI'm using \"Special Programs\" to mean programs that can be called based on what type of\nprgram they are not just by their name.\n\n\nThese are so you could say \"Hey Mycroft, Please launch a terminal.\" and Mycroft will\nknow what you mean even though there is no program called \"terminal\". (NOTE: You can\nstill explicitly specifiy the terminal to use, but this is easier. Right now one can\nset the the default terminal in the \"settingsmeta.json\" file. This is located in the\nroot on the skill's install directory, \"/opt/mycroft/skills/mycroft-app-launcher.calacuda\"\nby default on linux systems). Suport for changing this setting via the mycroft website\nis coming soon.\n\nother \"special programs\" include:\n -- web browser = firefox\n -- terminal = urxvt\n -- audio controller = pavucontrol\n -- chat client = caprine (facebook messenger client)\n\n\n### TODO's:\n\n1. Add online settigns update function. (This functionality is already in mycroft so\n it will be easy.)\n2. Make user definable \"Special Programs\" (maybe by having a json text input on mycrofts\n website?)\n3. make a julia/python repl mode. (the user would say something like \"launch julia\", the\n skill would open an interactive julia repl, with voice\n control and typing, in a fully equiped terminal emulator) \n4. Add a user toggleable proxychains mode. (If on every app is run through proxcychains\n if all apps are run normally)\n5. Add more phrases for the intent parser. (recuring iterative process)", - "short_description": "a mycroft skill that allows you to open and run programs from mycroft", - "branch": "main", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft App Launcher Testing Skill", - "android_handler": "mycroft-app-launcher-testing.calacuda.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-02-19T04:06:57Z", - "archived": false, - "license": "mit", - "modified": "2020-02-19T05:03:56Z", - "authorname": "jamesmf", - "skillname": "two-way-mycroft-adapter", - "foldername": "skill-mycroft-as-webthing", - "name": "two-way-mycroft-adapter", - "url": "https://github.com/jamesmf/skill-mycroft-as-webthing", - "category": null, - "description": "This skill allows you to speak to Mycroft from the Mozilla IoT Gateway by registering it as a `webthing` and to control the Mozilla IoT Hub via Mycroft.", - "short_description": "", - "branch": "master", - "examples": [ - "Turn on the light.", - "Turn on the light" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "jamesmf" - ], - "requirements": { - "python": [ - "requests", - "webthing", - "asyncio" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft As Webthing Skill", - "android_handler": "skill-mycroft-as-webthing.jamesmf.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-10-05T21:21:06Z", - "archived": false, - "license": "mit", - "modified": "2020-10-12T07:28:33Z", - "authorname": "calacuda", - "skillname": "mycroft-app-launcher:", - "foldername": "mycroft-app-launcher", - "name": "mycroft-app-launcher:", - "url": "https://github.com/calacuda/mycroft-app-launcher", - "category": null, - "description": "a mycroft skill that allows you to open and run programs from mycroft\n\n### usage:\n\nsay somehting to the effect of:\n -- open (prgram)\n -- launch (program)\n -- start (program)\n -- spin up (program)\n -- boot up (program)\n\n### special programs:\n\nI'm using \"Special Programs\" to mean programs that can be called based on what type of\nprgram they are not just by their name.\n\nThese are so you could say \"Hey Mycroft, Please launch a terminal.\" and Mycroft will\nknow what you mean even though there is no program called \"terminal\". (NOTE: You can\nstill explicitly specifiy the terminal to use, but this is easier on the brain. Right now\none can set the the default terminal in the \"settingsmeta.json\" file or on the mycroft\nwebsite. The \"settingsmeta.json\" file is located in the root on the skill's install\ndirectory, \"/opt/mycroft/skills/mycroft-app-launcher.calacuda\" by default on linux\nsystems).\n\nother \"special programs\" include:\n -- web browser = firefox\n -- terminal = urxvt\n -- audio controller = pavucontrol\n -- chat client = caprine (facebook messenger client)\n\n### aliases:\n\nyou can set up aliases from the mycroft website skills settings menu or by directily\nediting the skills \"settingsmeta.json\". I recomend the website as it is MUCH easier\nthe format is as follows: uterance_1=program_1, uterance_2=program_2. with these\nsettings mycroft will run [program_1] when you say \"run [uterance_1]\" where [uterance_1]\nis the alias or \"nickname\" of [program_1]. [program_X] can be a path to the excacutable or\nan excecutable in your path. this functionality was added so you can launch programs with \nnames that are either hard to say or that mycroft wont regognize. (you can also write custom\nscripts, make them executable, then point an alias to said script and run it with your voice.)\n\n\n### TODO's:\n\n1. [x] Add online settigns update function. (This functionality is already in mycroft so\n it will be easy.)\n2. [x] Make user definable \"Special Programs\" (maybe by having a json text input on mycrofts\n website?) (effectively done with the aliases\n functionality)\n3. [x] Make a julia/python repl mode. (the user would say something like \"launch julia\", the\n skill would open an interactive julia repl, with voice\n control and typing, in a fully equiped terminal emulator)\n (this brock off to a whole different mycroft skill called\n [mycroft-julia-skill-2](https://github.com/calacuda/mycroft-julia-skill-2))\n4. [ ] Add more phrases for the intent parser. (recuring iterative process)", - "short_description": "a mycroft skill that allows you to open and run programs from mycroft", - "branch": "main", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft App Launcher Skill", - "android_handler": "mycroft-app-launcher.calacuda.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-04-02T22:18:34Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-07-02T23:00:45Z", - "authorname": "AVA-USP", - "skillname": "Naptime", - "foldername": "skill-naptime", - "name": "Naptime", - "url": "https://github.com/AVA-USP/skill-naptime", - "category": "Daily", - "description": "Tell Mycroft to sleep when you don't want to be disturbed in any way.\nThis stops all calls to Speech to Text system, guaranteeing your voice won't\nbe sent anywhere on an accidental activation.\n\nWhen sleeping, Mycroft will only listen locally for the phrase \"Hey Mycroft,\nwake up\". Otherwise the system will be totally silent and won't bother you.\n\nOn a Mark 1 this also dims the eyes.", - "short_description": "Put Mycroft to sleep when you don't want to be disturbed", - "branch": "master", - "examples": [ - "Go to sleep.", - "Nap time.", - "Wake up.", - "Go to sleep", - "Nap time", - "Wake up" - ], - "tags": [ - "naptime", - "do-not-disturb", - "sleep", - "donotdisturb", - "Configuration", - "Daily", - "nap", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/bed.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Daily", - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Naptime Skill", - "android_handler": "skill-naptime.ava-usp.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-02-21T12:47:35Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-03-17T14:50:25Z", - "authorname": "AIIX", - "skillname": "Youtube Player", - "foldername": "bitchute-skill", - "name": "Youtube Player", - "url": "https://github.com/AIIX/bitchute-skill", - "category": "Media", - "description": "Play and Stream Bitchute Videos", - "short_description": "Play and stream Bitchute videos", - "branch": "master", - "examples": [ - "Bit Metallica.", - "Search Bit For Metallica.", - "Pause Youtube.", - "Resume Youtube.", - "Hey Mycroft Bit Metallica", - "Hey Mycroft Search Bit For Metallica", - "Hey Mycroft Pause Youtube", - "Hey Mycroft Resume Youtube" - ], - "tags": [ - "Youtube", - "GUI", - "VideoStreaming", - "Music", - "BitchuteVideos", - "Media", - "Video", - "AudioStreaming", - "no-license" - ], - "platforms": [ - "platform_mark2", - "platform_plasmoid" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/video.svg", - "credits": [ - "Aix (@aiix)" - ], - "categories": [ - "Media" - ], - "requirements": { - "python": [ - "bs4", - "youtube-dl", - "requests>=1.1" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": "https://raw.githubusercontent.com/AIIX/bitchute-skill/master/res/icon/bitchute-skill.png", - "android_name": "Bitchute Skill", - "android_handler": "bitchute-skill.aiix.home" - }, - "desktop": { - "X-DBUS-StartupType": "None", - "X-KDE-StartupNotify": "false", - "Version": "1.0", - "Terminal": "false", - "Type": "Application", - "Name": "BitChute", - "Exec": "mycroft-gui-app --hideTextInput --skill=bitchute-skill.aiix.home", - "Icon": "bitchute-skill", - "Categories": "VoiceApp", - "StartupNotify": "false" - }, - "desktopFile": true - }, - { - "created": "2020-04-02T18:35:04Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-04-07T17:32:53Z", - "authorname": "tcanabrava", - "skillname": "Youtube Player", - "foldername": "tvskill", - "name": "Youtube Player", - "url": "https://github.com/tcanabrava/tvskill", - "category": "Media", - "description": "Play and Stream Bitchute Videos", - "short_description": "Play and stream Bitchute videos", - "branch": "master", - "examples": [ - "Bit Metallica.", - "Search Bit For Metallica.", - "Pause Youtube.", - "Resume Youtube.", - "Hey Mycroft Bit Metallica", - "Hey Mycroft Search Bit For Metallica", - "Hey Mycroft Pause Youtube", - "Hey Mycroft Resume Youtube" - ], - "tags": [ - "Youtube", - "GUI", - "VideoStreaming", - "Music", - "BitchuteVideos", - "Media", - "Video", - "AudioStreaming", - "no-license" - ], - "platforms": [ - "platform_mark2", - "platform_plasmoid" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/video.svg", - "credits": [ - "Aix (@aiix)" - ], - "categories": [ - "Media" - ], - "requirements": { - "python": [ - "timeago", - "bs4", - "pafy", - "youtube-dl", - "requests>=1.1" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Tvskill Skill", - "android_handler": "tvskill.tcanabrava.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-05-10T22:02:24Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-05-11T04:20:27Z", - "authorname": "matiasgonzalocalvo", - "skillname": "Matias Play Spotify", - "foldername": "matias-spotify-skill", - "name": "Matias Play Spotify", - "url": "https://github.com/matiasgonzalocalvo/matias-spotify-skill", - "category": "Music", - "description": "Stream your favorite music from the popular Spotify music service. Spotify\nPremium users can search and play tracks from their own playlists or the huge\nSpotify music library.\n\nYou can also control your Mycroft device using the Spotify Connect system.\nSo play DJ on your phone while listening on Mycroft!\n\n### Authorization:\nThis Skill uses two different methods of authentication. Both need to be filled in correctly for the **Skill** to function correctly.\n\n#### API connection to your Spotify account\nAfter installing `mycroft-spotify`, in your [Skill\nsettings for Spotify](https://home.mycroft.ai/#/skill) in home.mycroft.ai you will see settings for the Spotify Skill. You will see a username and password field and a 'Connect' button. Ignore the username and password field for now, and click the 'Connect' button. You will be prompted to log in to Spotify, and to authorize Mycroft AI to use your Spotify account using OAuth. This allows Mycroft access to your account details such as Playlists.\n\n#### Username and password to authenticate a Mycroft device\nIn addition to account details, Mycroft needs to be authorized as a **device** for Spotify. To do this, we use your username and password for Spotify. These must be entered as well, or you will receive an error message like:\n\n`I couldn't find any Spot-ify devices. This skill requires a Spotify Premium account to work properly.`\n\nwhen you try to use the **Skill** on a Mycroft device.\n\nIf you log in to Spotify using Facebook, your password will be your _Facebook_ password, but your Spotify device username. You can get your Spotify device username [here](https://www.spotify.com/us/account/set-device-password/).\n\n_NOTE: You MUST have a Premium Spotify account to use this **Skill**. It will NOT work with a free Spotify account._", - "short_description": "Listen to music from your Spotify Premium music account", - "branch": "master", - "examples": [ - "What Spotify devices are available?", - "Play discover weekly.", - "Play Hello Nasty on Spotify.", - "Play something by Covenant.", - "Play the album Hello Nasty on Spotify.", - "Play my liked songs.", - "Play discover weekly", - "Play Hello Nasty on Spotify", - "Play something by Covenant", - "Play the album Hello Nasty on Spotify", - "Play my liked songs" - ], - "tags": [ - "music", - "spotify", - "Music", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://rawcdn.githack.com/forslund/spotify-skill/05c19c0fba8a4af150c6eb8cf2e955d59ac83d15/Spotify_Icon.png", - "credits": [ - "@forslund\nThe Mycroft devs" - ], - "categories": [ - "Music" - ], - "requirements": { - "python": [ - "spotipy==2.4.4" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Matias Spotify Skill", - "android_handler": "matias-spotify-skill.matiasgonzalocalvo.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-05-04T11:22:22Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-05-04T11:23:59Z", - "authorname": "forslund", - "skillname": "Play Spotify", - "foldername": "mycroft-spotify", - "name": "Play Spotify", - "url": "https://github.com/forslund/mycroft-spotify", - "category": "Music", - "description": "Stream your favorite music from the popular Spotify music service. Spotify\nPremium users can search and play tracks from their own playlists or the huge\nSpotify music library.\n\nYou can also control your Mycroft device using the Spotify Connect system.\nSo play DJ on your phone while listening on Mycroft!\n\n### Authorization:\nThis Skill uses two different methods of authentication. Both need to be filled in correctly for the **Skill** to function correctly.\n\n#### API connection to your Spotify account\nAfter installing `mycroft-spotify`, in your [Skill\nsettings for Spotify](https://home.mycroft.ai/#/skill) in home.mycroft.ai you will see settings for the Spotify Skill. You will see a username and password field and a 'Connect' button. Ignore the username and password field for now, and click the 'Connect' button. You will be prompted to log in to Spotify, and to authorize Mycroft AI to use your Spotify account using OAuth. This allows Mycroft access to your account details such as Playlists.\n\n#### Username and password to authenticate a Mycroft device\nIn addition to account details, Mycroft needs to be authorized as a **device** for Spotify. To do this, we use your username and password for Spotify. These must be entered as well, or you will receive an error message like:\n\n`I couldn't find any Spot-ify devices. This skill requires a Spotify Premium account to work properly.`\n\nwhen you try to use the **Skill** on a Mycroft device.\n\nIf you log in to Spotify using Facebook, your password will be your _Facebook_ password, but your Spotify device username. You can get your Spotify device username [here](https://www.spotify.com/us/account/set-device-password/).\n\n_NOTE: You MUST have a Premium Spotify account to use this **Skill**. It will NOT work with a free Spotify account._", - "short_description": "Listen to music from your Spotify Premium music account", - "branch": "20.02", - "examples": [ - "What Spotify devices are available?", - "Play discover weekly.", - "Play Hello Nasty on Spotify.", - "Play something by Covenant.", - "Play the album Hello Nasty on Spotify.", - "Play my liked songs.", - "Play discover weekly", - "Play Hello Nasty on Spotify", - "Play something by Covenant", - "Play the album Hello Nasty on Spotify", - "Play my liked songs" - ], - "tags": [ - "music", - "spotify", - "Music", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://rawcdn.githack.com/forslund/spotify-skill/05c19c0fba8a4af150c6eb8cf2e955d59ac83d15/Spotify_Icon.png", - "credits": [ - "@forslund\nThe Mycroft devs" - ], - "categories": [ - "Music" - ], - "requirements": { - "python": [ - "spotipy==2.4.4" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Spotify Skill", - "android_handler": "mycroft-spotify.forslund.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-04-27T03:14:48Z", - "archived": false, - "license": "mit", - "modified": "2020-06-13T03:31:33Z", - "authorname": "edwardwang1", - "skillname": "skill-pi", - "foldername": "skill-pi", - "name": "skill-pi", - "url": "https://github.com/edwardwang1/skill-pi", - "category": null, - "description": "This skill is primarily used to enable/disable the monitor attached to the Rasperry Pi to save power. This skill has been tested on a Raspberry Pi 3B+ running Raspian Stretch.", - "short_description": "", - "branch": "master", - "examples": [ - "Disable monitor.", - "Enable monitor.", - "Restart pi.", - "disable monitor", - "enable monitor", - "restart pi" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Edward Wang" - ], - "requirements": { - "python": [ - "adapt==0.1", - "mycroft==0.1.0" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Pi Skill", - "android_handler": "skill-pi.edwardwang1.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-04-02T22:23:39Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-07-02T23:00:07Z", - "authorname": "AVA-USP", - "skillname": "Speak", - "foldername": "skill-speak", - "name": "Speak", - "url": "https://github.com/AVA-USP/skill-speak", - "category": "Entertainment", - "description": "Turn Mycroft into a parrot. Speak a phrase and listen to it repeated in Mycroft's selected voice.", - "short_description": "Make Mycroft repeat whatever you want", - "branch": "master", - "examples": [ - "Say Goodnight, Gracie.", - "Repeat Once upon a midnight dreary, while I pondered, weak and weary, Over many a quaint and curious volume of forgotten lore.", - "Speak I can say anything you'd like!", - "say Goodnight, Gracie", - "repeat Once upon a midnight dreary, while I pondered, weak and weary, Over many a quaint and curious volume of forgotten lore", - "speak I can say anything you'd like!" - ], - "tags": [ - "system", - "Entertainment", - "speak", - "repeat", - "say", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/bullhorn.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Speak Skill", - "android_handler": "skill-speak.ava-usp.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-03-20T13:07:42Z", - "archived": false, - "license": "lgpl-3.0", - "modified": "2020-03-20T13:07:56Z", - "authorname": "Mycroft-Bavarian-Team", - "skillname": "Home Assistant Skill für Mycroft", - "foldername": "mycroft-hass-skill", - "name": "Home Assistant Skill für Mycroft", - "url": "https://github.com/Mycroft-Bavarian-Team/mycroft-hass-skill", - "category": null, - "description": "Modifikation des original Home Assistant Mycroft Skills (https://github.com/MycroftAI/mycroft-homeassistant) zur Optimierung für die Verwendung in deutscher Sprache.", - "short_description": "Modifikation des original Home Assistant Mycroft Skills (https://github.com/MycroftAI/mycroft-homeassistant) zur Optimierung für die Verwendung in deutscher Sprache.", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "home-assistant.png", - "requirements": { - "python": [ - "fuzzywuzzy==0.14.0", - "responses", - "python-Levenshtein==0.12.0", - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Hass Skill", - "android_handler": "mycroft-hass-skill.mycroft-bavarian-team.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-04-02T22:20:22Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-07-02T23:00:31Z", - "authorname": "AVA-USP", - "skillname": "Pairing", - "foldername": "skill-pairing", - "name": "Pairing", - "url": "https://github.com/AVA-USP/skill-pairing", - "category": "Configuration", - "description": "The default backend to provide services for Mycroft users is\n [Home](https://home.mycroft.ai/). Pairing a device with Home provides access\n to privacy-protecting Speech to Text, Wolfram Alpha and other such services,\n as well as easy configuration for all your Mycroft devices.", - "short_description": "Connect your device to the Mycroft server - [Home](https://home.mycroft.ai/)", - "branch": "master", - "examples": [ - "Pair my device.", - "Pair my device (happens automatically on first run if not paired already)" - ], - "tags": [ - "system", - "Configuration", - "connectivity", - "pairing", - "pair", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/handshake.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [ - "uuid==1.30" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Pairing Skill", - "android_handler": "skill-pairing.ava-usp.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-08-15T13:33:54Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-09-06T05:57:55Z", - "authorname": "tobus3000", - "skillname": "skill-print", - "foldername": "skill-print", - "name": "skill-print", - "url": "https://github.com/tobus3000/skill-print", - "category": "Information", - "description": "Mycroft skill to support output on receipt thermo printer.\n\nOnly tested with a cheap thermo receipt printer that has 'PT-210' as the only marking on the device...\n\nIn theory this should work with every printer that is connected via USB and accepts plaintext (ESC/POS) commands.", - "short_description": "", - "branch": "master", - "examples": [ - "Enable printer.", - "Disable printer.", - "Enable linefeed.", - "Disable linefeed.", - "Print time.", - "Print buffer.", - "..." - ], - "tags": [ - "Print", - "Information", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/print.svg", - "credits": [ - "tobus3000" - ], - "categories": [ - "Information" - ], - "requirements": { - "python": [ - "pytz" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Print Skill", - "android_handler": "skill-print.tobus3000.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-02-02T23:28:01Z", - "archived": false, - "license": "lgpl-3.0", - "modified": "2020-03-01T14:23:19Z", - "authorname": "madhawk001", - "skillname": "Home Assistant Skill für Mycroft", - "foldername": "mycroft-hass-skill", - "name": "Home Assistant Skill für Mycroft", - "url": "https://github.com/madhawk001/mycroft-hass-skill", - "category": null, - "description": "Modifikation des original Home Assistant Mycroft Skills (https://github.com/MycroftAI/mycroft-homeassistant) zur Optimierung für die Verwendung in deutscher Sprache.", - "short_description": "Modifikation des original Home Assistant Mycroft Skills (https://github.com/MycroftAI/mycroft-homeassistant) zur Optimierung für die Verwendung in deutscher Sprache.", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "home-assistant.png", - "requirements": { - "python": [ - "fuzzywuzzy==0.14.0", - "responses", - "python-Levenshtein==0.12.0", - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Hass Skill", - "android_handler": "mycroft-hass-skill.madhawk001.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-10-14T20:38:48Z", - "archived": false, - "license": "mit", - "modified": "2020-10-18T18:43:24Z", - "authorname": "lnguyenh", - "skillname": "Spotify-Sonos Mycroft Skill", - "foldername": "spotify-sonos-bot-skill", - "name": "Spotify Sonos Bot", - "url": "https://github.com/lnguyenh/spotify-sonos-bot-skill", - "category": "Music & Audio", - "description": "**Mycroft** (https://mycroft.ai/) is an open source project that provides a local and controlled alternative to Google Assistant and Alexa. Mycroft can run on a Raspberry Pi. Similarly to Alexa, you can add functionalities to your Mycroft voice assistant setup by installing \"skills\".\n\nThis project is a **skill** for Mycroft that provides convenient voice commands to play Spotify music on Sonos speakers.\n\nBig kudos to:\n\nIn its current state, this project provides all the commands I have needed in order to voice-control Sonos and Spotify while cooking dinner :). **It currently only supports playing music on one Sonos speaker** but using the node http api, it should be fairly easy to add support for several speakers.\nthe project **Node Sonos HTTP API** (https://github.com/jishi/node-sonos-http-api/) which does most of the work and exposes an easy to use Sonos API\n * the project **Spotipy** (https://github.com/plamere/spotipy) that is used for populating the user's list of personal spotify playlists, and to play the most popular songs for a given artist.", - "short_description": "[![Join the chat at https://gitter.im/lnguyenh/sonos-spotify-mycroft](https://badges.gitter.im/lnguyenh/sonos-spotify-mycroft.svg)](https://gitter.im/lnguyenh/sonos-spotify-mycroft?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)", - "branch": "master", - "examples": [], - "tags": [ - "**Spotify**", - "**Sonos**", - "Music", - "Audio", - "Music & Audio", - "**Spotify**\n\n**Sonos**", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/headphones.svg", - "credits": [ - "Mycroft, the open source local voice assistant (https://mycroft.ai/)", - "Node Sonos HTTP API, which does all the heavy lifting related to Sonos and Spotify (https://github.com/jishi/node-sonos-http-api/)", - "Spotipy used for a few specific commands not supported by Node Sonos (https://github.com/plamere/spotipy) " - ], - "categories": [ - "Music & Audio" - ], - "requirements": { - "python": [ - "requests", - "python-slugify", - "spotipy" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Spotify Sonos Bot Skill", - "android_handler": "spotify-sonos-bot-skill.lnguyenh.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-01-23T20:44:46Z", - "archived": false, - "license": "unknown", - "modified": "2020-05-12T20:14:31Z", - "authorname": "pcwii", - "skillname": "C25k", - "foldername": "c25k-skill", - "name": "C25k", - "url": "https://github.com/pcwii/c25k-skill", - "category": "Fitness", - "description": "Mycroft.ai becomes your motivational coach as you work your way through each of the intervals in the workout.\npoints of the interval.\nThis skill uses a schedule json (c25k.json) to track and support you as you work \nthrough the couch to 5k running program.\nThe default c25k.json file is based on the Couch to 5 km running program.\nOther workout json files could be created based on this and selected from the websettings.\n\nThe skill will keep track of the last week #, day # that you completed and proceed through each day\nof the workout found in the json file.\n - Mycroft does not properly push websettings changes in skills to the web ui.\n - I will work to address this in future updates (20200202).\nDepending on the length of the current interval motivations will be provided at the 1/4, 1/2, 3/4\n * The skill will loose this information if the mycroft is rebooted or the skill is updated.", - "short_description": "Use mycroft.ai as a fitness coach and work your way through the 9 week ", - "branch": "master", - "examples": [ - "Start my workout.", - "Start my run.", - "I want to run.", - "Change my workout to week 3 day 4.", - "[ ] WIP (20200202)", - "Start my workout", - "Start my run", - "I want to run", - "Change my workout to week 3 day 4 (This can also be done in websettings)" - ], - "tags": [ - "Fitness", - "running", - "C25K", - "workout", - "fitness", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/running.svg", - "credits": [ - "pcwii" - ], - "categories": [ - "Fitness" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "C25K Skill", - "android_handler": "c25k-skill.pcwii.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-07-14T10:24:33Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-08-17T05:36:59Z", - "authorname": "muhareb", - "skillname": "Singing", - "foldername": "rasa-chat", - "name": "Singing", - "url": "https://github.com/muhareb/rasa-chat", - "category": "Entertainment", - "description": "Mycroft will speak the lyrics to a random pop music song using text to speech.", - "short_description": "Mycroft sings lyrics to some popular songs", - "branch": "master", - "examples": [ - "Sing.", - "Sing" - ], - "tags": [ - "lyrics", - "music", - "sing", - "Entertainment", - "singing", - "song", - "texttospeech", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/laugh-beam.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Rasa Chat Skill", - "android_handler": "rasa-chat.muhareb.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-01-02T23:23:00Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-01-03T02:59:39Z", - "authorname": "andlo", - "skillname": "Farting", - "foldername": "farting-skill", - "name": "Farting", - "url": "https://github.com/andlo/farting-skill", - "category": "Entertainment", - "description": "This is just a fun skill that should generate a laugh or two and then never be used again.\n\nWhen asked \"who did that\", Mycroft will answer with a statement such as \"it wasn't me. it was the dog\".\n\nWhen told to \"make a farting sound\", Mycroft will play a randomly selected fart sound file, followed by \na statement such as \"did someone sit on a whoopee cushion\".\n\nWhen told to \"let one slip\" or \"fart randomly\", Mycroft will play a fart sound file and make a comment\nat a random interval between 1 minute and half an hour. This will continue until Mycroft is requested \nto stop via \"halt farting\".\n\nThis is a rewrite of (@aussieW) skill-farting so it will work on Mycroft-core 19.8", - "short_description": "\"who let the dog inside\" - Mycroft will fart when requested or at random intervals", - "branch": "master", - "examples": [ - "Did you fart.", - "What is that smell?", - "Fart.", - "Make a fart.", - "Fart randomly.", - "Halt farting.", - "did you fart", - "what is that smell", - "fart", - "make a fart", - "fart randomly", - "halt farting" - ], - "tags": [ - "Entertainment", - "fun", - "smell", - "fart", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "fart.png", - "credits": [ - "Andreas Lorensen (@andlo) and (@aussieW)" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [ - "tinytag" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Farting Skill", - "android_handler": "farting-skill.andlo.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-02-06T04:13:27Z", - "archived": false, - "license": "mit", - "modified": "2020-05-30T13:44:15Z", - "authorname": "JoaoCostaIFG", - "skillname": "Youtube_dl skill for mycroft", - "foldername": "mycroft-youtubedl-skill", - "name": "Youtube_dl skill for mycroft", - "url": "https://github.com/JoaoCostaIFG/mycroft-youtubedl-skill", - "category": "Music & Audio", - "description": "This skill will download the first match of the inputed song/video name (excluding\nplaylists) and play its audio.", - "short_description": "Searches for and downloads a youtube video, and queues it for playing.", - "branch": "master", - "examples": [ - "Youtube tool lateralus.", - "Youtube play placebo bitter end.", - "Youtube stop.", - "Youtube tool lateralus", - "Youtube play placebo bitter end", - "Youtube stop" - ], - "tags": [ - "Youtube", - "Music", - "Audio", - "Media", - "Entertainment", - "Music & Audio", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "credits": [ - "JoaoCostaIFG" - ], - "categories": [ - "Music & Audio", - "Media", - "Entertainment" - ], - "requirements": { - "python": [ - "youtube_dl" - ], - "system": { - "all": "mpv" - }, - "skill": [] - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Youtubedl Skill", - "android_handler": "mycroft-youtubedl-skill.joaocostaifg.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-02-18T21:07:09Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-02-26T16:51:20Z", - "authorname": "simboco", - "skillname": "Auto volume", - "foldername": "simbo", - "name": "Auto volume", - "url": "https://github.com/simboco/simbo", - "category": "Daily", - "description": "This skill lets Mycroft decide when to use high, normal, or low volume. Mycrofts keeps monitoring the background sound levels using the microphone, using which it decides what volume level is the right one to use.\n\nAs it is not easy to know what is high and what is low noise level, the skill will adapt over time. The skill notices the highest and lowest measured levels over time and adjusts its settings according to those measurements.\n\nThe skill stops adjusting the volume if another skill is using the speaker or if Mycroft himself is talking.\n\nThe skill can be activated or deactivated using the command \"Hey Mycroft, set auto volume off\" or \"Hey Mycroft, set auto volume on\".", - "short_description": "Sets the volume depending on background noise level", - "branch": "master", - "examples": [ - "Set auto volume on.", - "Set auto volume off.", - "Clear auto volume measurements.", - "Set auto volume on", - "Set auto volume off", - "Clear auto volume measurements" - ], - "tags": [ - "Configuration", - "volume", - "Daily", - "no-license" - ], - "platforms": [ - "platform_mark1", - "platform_picroft" - ], - "stars": 0, - "icon": "icon.png", - "credits": [ - "Andreas Lorensen (@andlo)" - ], - "categories": [ - "Daily", - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Simbo Skill", - "android_handler": "simbo.simboco.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-06-15T02:05:09Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-06-15T06:37:05Z", - "authorname": "JarbasSkills", - "skillname": "skill-mock-backend", - "foldername": "skill-mock-backend", - "name": "Mock Backend Skill", - "url": "https://github.com/JarbasSkills/skill-mock-backend", - "category": "configuration", - "description": "Just install the skill and backend will be disabled\n\nThis is beta, some skills WILL break, see [OpenVoiceOS/OVOS-local-backend](https://github.com/OpenVoiceOS/OVOS-local-backend) for details\n\nPRIVACY NOTE: you need to setup your own STT, by default it will use google\n\n[kaldi](https://github.com/HelloChatterbox/speech2text/blob/dev/speech2text/engines/kaldi.py) and [deepspeech](https://github.com/HelloChatterbox/speech2text/blob/dev/speech2text/engines/ds.py) are supported", - "short_description": "Disable mycroft from phoning home.mycroft.ai", - "branch": "v0.2", - "examples": [ - "restore mycroft backend", - "disable mycroft backend", - "what backend are you using" - ], - "tags": [ - "backend", - "privacy", - "configuration", - "no-license", - "permissive-license" - ], - "platforms": [ - "all", - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "stars": 0, - "credits": [ - "JarbasAl" - ], - "categories": [ - "configuration" - ], - "logo": "https://raw.githubusercontent.com/JarbasSkills/skill-mock-backend/master/logo.png", - "requirements": { - "python": [ - "mock-mycroft-backend>=0.2.2", - "ovos-local-backend>=0.1.0", - "ovos_utils>=0.5.0" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mock Backend Skill", - "android_handler": "skill-mock-backend.jarbasskills.home" - }, - "desktop": {}, - "desktopFile": false - }, - { - "created": "2020-01-29T07:33:12Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-01-29T07:33:19Z", - "authorname": "nsevinc", - "skillname": "Mycroft Telegram Bot", - "foldername": "mycroft-telegram-bot-skill", - "name": "Mycroft Telegram Bot", - "url": "https://github.com/nsevinc/mycroft-telegram-bot-skill", - "category": "Productivity", - "description": "Allows you to communicate with mycroft using the telegram bot.", - "short_description": "A skill to integration a telegram bot to mycroft", - "branch": "master", - "examples": [ - "Send last result to telegram.", - "Send it to telegram.", - "Send last result to telegram", - "Send it to telegram" - ], - "tags": [ - "Productivity", - "Telegram", - "bot", - "Telegram bot", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "nsevinc" - ], - "categories": [ - "Productivity" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Telegram Bot Skill", - "android_handler": "mycroft-telegram-bot-skill.nsevinc.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-05-01T17:49:55Z", - "archived": false, - "license": "mit", - "modified": "2020-05-12T18:52:39Z", - "authorname": "brezuicabogdan", - "skillname": "Quiet Hours", - "foldername": "quiet-hours-skill", - "name": "Quiet Hours", - "url": "https://github.com/brezuicabogdan/quiet-hours-skill", - "category": "Configuration", - "description": "Set a time frame during which your mycroft will be quiet. if enabled the volume of your mycroft will automatically be lowered to specified value when the quiet hours start and will automatically return to normal once quiet hours end.\nThis is very usefull if you also use Mycroft for verbal notifications and you do not want to be disturbed at night.\nYou can also enable or disable teh quiet hours manually, very nice to have when you are watching a move and do not want to be disturbed.", - "short_description": "Automatically silence your mycroft based on a schedule", - "branch": "master", - "examples": [ - "Be quiet.", - "You can speak now.", - "Enable quiet hours.", - "Disable quiet hours.", - "Be quiet", - "You can speak now", - "Enable quiet hours", - "Disable quiet hours" - ], - "tags": [ - "Quiet", - "Schedule", - "Configuration", - "mute", - "hours", - "Auto", - "Utility", - "Auto mute", - "Quiet hours", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/volume-mute.svg", - "credits": [ - "Bogdan Brezuica (@brezuicabogdan)" - ], - "categories": [ - "Configuration", - "Utility" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Quiet Hours Skill", - "android_handler": "quiet-hours-skill.brezuicabogdan.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-04-06T16:59:59Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-05-01T18:37:22Z", - "authorname": "tgru", - "skillname": "HTTP Status Code Skill", - "foldername": "http-status-code-skill", - "name": "HTTP Status Code Skill", - "url": "https://github.com/tgru/http-status-code-skill", - "category": "Information", - "description": "With this skill Mycroft can name and explain you HTTP status codes which are standardized by RFC 7231 and some more.", - "short_description": "HTTP status codes on demand", - "branch": "master", - "examples": [ - "Explain code 202.", - "What does error 418 mean?", - "Explain code 202" - ], - "tags": [ - "Productivity", - "Information", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/code.svg", - "credits": [ - "@tgru" - ], - "categories": [ - "Information", - "Productivity" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Http Status Code Skill", - "android_handler": "http-status-code-skill.tgru.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-04-02T22:06:14Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-07-02T23:01:23Z", - "authorname": "AVA-USP", - "skillname": "Unknown Handler", - "foldername": "fallback-unknown", - "name": "Unknown Handler", - "url": "https://github.com/AVA-USP/fallback-unknown", - "category": "Configuration", - "description": "Mycroft doesn't know how to do or answer everything (yet). This _fallback_ is how Mycroft lets you know that, unfortunately, it can't help with what you said.\n\nBut wait, there is still hope! Mycroft is working to get smarter with help from friends. For who have selected to [Opt In to the Open Dataset](https://home.mycroft.ai/#/setting/basic#opendataset), these missed phrases are aggregated and analyzed to help identify what the world _wants_ their voice assistant to do that it can't yet. So if millions of people start asking for guava growing tips, we'll promote this as an idea to be handled as a default Skill.", - "short_description": "Capture unrecognized _Utterances_", - "branch": "master", - "examples": [ - "How do I make my guava blue?", - "I need a pizza.", - "Show me the money.", - "I need a pizza", - "Show me the money" - ], - "tags": [ - "Configuration", - "fallback", - "system", - "unknown", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/question.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Fallback Unknown Skill", - "android_handler": "fallback-unknown.ava-usp.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-07-09T06:54:50Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-07-14T20:41:33Z", - "authorname": "blimyj", - "skillname": "Sleepy Time", - "foldername": "sleepy-time-skill", - "name": "Sleepy Time", - "url": "https://github.com/blimyj/sleepy-time-skill", - "category": "Daily", - "description": "When activated it will play an audiobook to help you sleep", - "short_description": "Plays an audiobook to help you sleep", - "branch": "master", - "examples": [ - "Help me sleep.", - "Time to sleep.", - "I'm going to bed.", - "Help me sleep", - "Time to sleep", - "I'm going to bed" - ], - "tags": [ - "Daily", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/bed.svg", - "credits": [ - "blimyj" - ], - "categories": [ - "Daily" - ], - "requirements": { - "python": [ - "python-vlc>=3.0.0" - ], - "system": { - "all": "vlc" - }, - "skill": [] - }, - "android": { - "android_icon": null, - "android_name": "Sleepy Time Skill", - "android_handler": "sleepy-time-skill.blimyj.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-08-25T12:15:53Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-09-07T12:49:22Z", - "authorname": "l0drex", - "skillname": "Bluetooth Speaker", - "foldername": "bluetooth-speaker-skill", - "name": "Bluetooth Speaker", - "url": "https://github.com/l0drex/bluetooth-speaker-skill", - "category": "Music & Audio", - "description": "Activate bluetooth and pair new devices to play some music with mycroft.\nYou need to install mycroft on a device that supports bluetooth.\nUses alsa.", - "short_description": "Use your mycroft device as a bluetooth speaker.", - "branch": "master", - "examples": [ - "Pairing mode.", - "Pair device.", - "Activate bluetooth.", - "Pairing mode", - "Pair device", - "Activate bluetooth" - ], - "tags": [ - "Music", - "Audio", - "Media", - "Entertainment", - "Bluetooth", - "Connection", - "Music & Audio", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/volume-up.svg", - "credits": [ - "Lorenz Hoffmann" - ], - "categories": [ - "Music & Audio", - "Entertainment", - "Media" - ], - "requirements": { - "system": { - "all": "bluetoothctl bluealsa-aplay" - }, - "python": [], - "skill": [] - }, - "android": { - "android_icon": null, - "android_name": "Bluetooth Speaker Skill", - "android_handler": "bluetooth-speaker-skill.l0drex.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-02-22T19:59:16Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-02-23T20:35:02Z", - "authorname": "jumper047", - "skillname": "Mycroft Fallback STT Skill", - "foldername": "mycroft-fallback-stt", - "name": "Mycroft Fallback STT Skill", - "url": "https://github.com/jumper047/mycroft-fallback-stt", - "category": "Configuration", - "description": "Use local STT server if remote one is unavailable", - "short_description": "Use local STT server if remote one is unavailable", - "branch": "master", - "examples": [ - "Switch to remote server.", - "Which engine are you using now?" - ], - "tags": [ - "Configuration", - "system", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Fallback Stt Skill", - "android_handler": "mycroft-fallback-stt.jumper047.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-06-01T12:00:48Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-06-01T12:11:01Z", - "authorname": "saluber", - "skillname": "Movie Master", - "foldername": "mycroft-movies", - "name": "Movie Master", - "url": "https://github.com/saluber/mycroft-movies", - "category": "Entertainment", - "description": "Easily find information about a movie with your voice.", - "short_description": "Find information about movies, actors and production details.", - "branch": "master", - "examples": [ - "What is the movie _______ about?", - "Tell me about the movie _______", - "Who plays in the movie _______?", - "What genres does the flick _______ belong to?", - "Look for information on the movie _______.", - "What company made the movie _______?", - "When was the movie _______ made?", - "Do you have info on the film _______?", - "What are popular movies playing now?", - "What films do you recommend like _______?", - "How long is the movie _______?", - "What are the highest rated movies out?" - ], - "tags": [ - "I", - "Movies", - "Mark", - "Entertainment", - "Actors", - "TMDB", - "Mark I", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "PrimaryLogo_Green.png", - "categories": [ - "Entertainment" - ], - "credits": [ - "This skill uses tmdbv3api avaliable on GitHub at [tmdbv3api](https://github.com/AnthonyBloomer/tmdbv3api.git)\n\nIt also uses the TMDb API but is not endorsed or certified by TMDb. Information avaliable at [TMDb](https://www.themoviedb.org/)\n\nbuilderjer@github.com" - ], - "requirements": { - "python": [ - "tmdbv3api" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Movies Skill", - "android_handler": "mycroft-movies.saluber.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-09-13T14:44:03Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-09-21T03:13:05Z", - "authorname": "JarbasSkills", - "skillname": "skill-email-commands", - "foldername": "skill-email-commands", - "name": "Email Commands Skill", - "url": "https://github.com/JarbasSkills/skill-email-commands", - "category": "Configuration", - "description": "Allows you to send commands to mycroft by email, inspired by [this blog post](https://medium.com/@thesanjeetc/want-to-control-something-with-siri-heres-how-bae98aceb586)\n \n ![](./gui.gif)", - "short_description": "Control Mycroft by email", - "branch": "master", - "examples": [], - "tags": [ - "Configuration", - "configuration", - "no-license" - ], - "platforms": [ - "all", - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "stars": 1, - "icon": "https://github.com/JarbasSkills/skill-email-commands/res/icon/icon.png", - "credits": [ - "JarbasAl" - ], - "categories": [ - "Configuration" - ], - "logo": "https://raw.githubusercontent.com/JarbasSkills/skill-email-commands/master/logo.png", - "requirements": { - "python": [ - "mail_monitor>=0.5" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Email Commands Skill", - "android_handler": "skill-email-commands.jarbasskills.home" - }, - "desktop": {}, - "desktopFile": false, - "systemDeps": false - }, - { - "created": "2020-03-25T21:29:55Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-05-29T19:35:23Z", - "authorname": "KirkPatrick2020", - "skillname": "Fleming Bot Project - 2020", - "foldername": "robomove-skill", - "name": "Fleming Bot Project - 2020", - "url": "https://github.com/KirkPatrick2020/robomove-skill", - "category": "IoT", - "description": "Makes bb8 look-a-like move by sending motor controls via udp from one Raspberry PI to another Raspberry PI based on the input of a t-shirt color that someone is wearing. \n\nOne Raspberry PI is located in the head of the robot, acquiring input via Picamera to determine the area of color captured. The other Raspberry pi is located in the main chassis, providing an output in the form of motor controls. \n\nThis works using the Linux Distribution 'MyCroft' which is an Open-Source voice assistant that supports the ability to create custom \"skills\" which are Python class files that interact with MyCroft to perform various commands. By using MyCroft's intent parser, I can then create custom voice commands that when performed after saying \"Hey MyCroft\", will perform the commands outlined below:", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "IoT", - "Robots", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "Kirk" - ], - "categories": [ - "IoT", - "Robots" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Robomove Skill", - "android_handler": "robomove-skill.kirkpatrick2020.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-01-02T12:42:23Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-02-17T16:52:38Z", - "authorname": "andlo", - "skillname": "Web Terminal", - "foldername": "web-terminal-skill", - "name": "Web Terminal", - "url": "https://github.com/andlo/web-terminal-skill", - "category": "Productivity", - "description": "This skill installs and run a web terminal and/or a web CLI client.\n\nAfter install there should be a running web CLI client wich you can acces from a browser on \nhttp://device:8080 where device is the hostname of your mycroft device. \n\nYo can start at terminal by saying \"hey mycroft - run web terminal\". Then there will be a full \nshell running wich you can access from a browser on http://device:8022 where device is the\nhostname of your mycroft device.\n\nOn settings on home.mycroft.ai you can change ports and set if CLI and/or Terminal should auto start or not.\n\nThe skill uses the ttyd from Shuanglei Tao - https://github.com/tsl0922/ttyd", - "short_description": "Start a web Terminal and/or Web CLI client", - "branch": "master", - "examples": [ - "Run web terminal.", - "Run web CLI client.", - "Exit web cli client.", - "Exit web terminal.", - "Run web terminal", - "Run web CLI client ", - "Exit web cli client", - "Exit web terminal" - ], - "tags": [ - "Shell", - "Productivity", - "Configuration", - "Terminal", - "Cli-client", - "Ssh", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/terminal.svg", - "credits": [ - "Andreas Lorensen (@andlo)" - ], - "categories": [ - "Productivity", - "Configuration" - ], - "requirements": { - "system": { - "apt-get": "cmake g++ pkg-config git vim-common libwebsockets-dev libjson-c-dev libssl-dev", - "dnf": "make g++ pkg-config git vim-common libwebsockets-devel json-c-devel openssl-devel" - }, - "python": [], - "skill": [] - }, - "android": { - "android_icon": null, - "android_name": "Web Terminal Skill", - "android_handler": "web-terminal-skill.andlo.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-02-22T16:39:22Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-03-10T20:32:38Z", - "authorname": "tobus3000", - "skillname": "Sunrise Sunset", - "foldername": "sunrise-sunset-skill", - "name": "Sunrise Sunset", - "url": "https://github.com/tobus3000/sunrise-sunset-skill", - "category": "Information", - "description": "This skill does *not* query an external API.\n\nAll times and events are being calculated locally.", - "short_description": "Returns sunset or sunrise times for the given coordinates.", - "branch": "master", - "examples": [ - "When does the sun set?", - "When does the sun rise?", - "Sunset today.", - "Sunrise today.", - "Moonrise today.", - "Sunset.", - "Moonset.", - "Sunrise.", - "Moonrise.", - "When does the sun appear?", - "When does the moon appear?", - "What time does the sun set today?", - "What time does the sun set in a week?", - "What time does the moon set today?", - "What time does the sun rise today?", - "What time does the sun rise in a week?", - "What time does the moon rise tonight?", - "Sunset time.", - "Moonset time.", - "Sunrise time.", - "Moonrise time.", - "When does the sun disappear in the evening?", - "When does the moon disappear in the morning?", - "When does the sun appear in the morning?", - "When does the moon appear in the evening?", - "...", - "When does the sun set", - "When does the sun rise", - "Sunset today", - "Sunrise today", - "Sunset", - "Sunrise", - "When does the sun appear", - "What time does the sun set today", - "What time does the sun set in a week", - "What time does the sun rise today", - "What time does the sun rise in a week", - "Sunset time", - "Sunrise time", - "When does the sun disappear in the evening", - "When does the sun appear in the morning" - ], - "tags": [ - "Sunset", - "Moonset", - "Moonrise", - "Information", - "Sunrise", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/sun.svg", - "credits": [ - "tobus3000" - ], - "categories": [ - "Information" - ], - "requirements": { - "python": [ - "datetime" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Sunrise Sunset Skill", - "android_handler": "sunrise-sunset-skill.tobus3000.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-05-04T13:04:02Z", - "archived": false, - "license": "unknown", - "modified": "2020-05-06T21:22:14Z", - "authorname": "jimkou", - "skillname": "Rpi Info", - "foldername": "rpi-info-skill", - "name": "Rpi Info", - "url": "https://github.com/jimkou/rpi-info-skill", - "category": "Information", - "description": "Skill that you can use with MyCroft!!\nIt only works on raspberry pi. Tested on Rpi 4 model B+.", - "short_description": "Rpi-info gives disk , ram , temperature information about your raspberry pi.", - "branch": "master", - "examples": [ - "Raspberry free ram.", - "Raspberry pi free ram.", - "(What is the |) free ram of (my|) (raspberry|) pi.", - "Raspberry used ram.", - "Raspberry pi used ram.", - "(What is the|) ram usage of (my|) (raspberry|) pi.", - "Raspberry disk.", - "(What us the|) disk usage of (my|) (raspberry|) pi.", - "Raspberry temperature.", - "Raspberry pi temperature.", - "(what is the|) temperature of (my|) (raspberry|) pi.", - "Raspberry free ram", - "Raspberry pi free ram", - "(What is the |) free ram of (my|) (raspberry|) pi", - "Raspberry used ram", - "Raspberry pi used ram", - "(What is the|) ram usage of (my|) (raspberry|) pi", - "Raspberry disk", - "(What us the|) disk usage of (my|) (raspberry|) pi", - "Raspberry temperature", - "Raspberry pi temperature", - "(what is the|) temperature of (my|) (raspberry|) pi" - ], - "tags": [ - "System", - "pi", - "Information", - "Iot", - "Info", - "Raspberry", - "Raspberry pi", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/gem.svg", - "credits": [ - "Kourlos Dimitris" - ], - "categories": [ - "Information", - "Iot" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Rpi Info Skill", - "android_handler": "rpi-info-skill.jimkou.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-05-14T12:16:41Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-05-14T14:30:09Z", - "authorname": "Lesger", - "skillname": "Kodi Control", - "foldername": "my-kodi-skill", - "name": "Kodi Control", - "url": "https://github.com/Lesger/my-kodi-skill", - "category": "Media", - "description": "Utilize the kodi API and Python library for controlling the KODI open source media center with Mycroft.ai. The control is mostly geared towards videos/movies but is capable of handling cursor navigation as well.\nThe Kodi Skill uses conversational dialog to help you to control your KODI instance more naturally.", - "short_description": "Control KODI open source media center with Mycroft.ai", - "branch": "master", - "examples": [ - "Ask kodi to play the movie guardians of the galaxy.", - "Ask kodi to play the film planet of the apes.", - "Ask kodi to play a random movie.", - "Turn kodi subtitles on.", - "Turn kodi subtitles off.", - "Skip kodi forward.", - "Skip kodi backward.", - "Pause kodi.", - "Pause the film.", - "Re-start kodi.", - "Stop the movie.", - "Stop kodi.", - "Set kodi volume to 100.", - "Set kodi volume to 25.", - "Show kodi movie information.", - "Hide kodi movie information.", - "Turn kodi notifications on.", - "Turn kodi notifications off.", - "Move the kodi cursor up / down / left / right / back / select / cancel.", - "Move the kodi cursor right 3 times.", - "Move the kodi cursor down twice.", - "Update the kodi library.", - "Clean the kodi library.", - "Ask kodi to list recently added movies.", - "Ask kodi to list the movies by genre.", - "Ask kodi to list the movies by studio.", - "List kodi movie sets.", - "List kodi movies by title.", - "List kodi movies by actor.", - "List all kodi movies.", - "ask kodi to play the movie guardians of the galaxy", - "ask kodi to play the film planet of the apes", - "ask kodi to play a random movie", - "turn kodi subtitles on", - "turn kodi subtitles off", - "skip kodi forward", - "skip kodi backward", - "pause kodi", - "pause the film", - "re-start kodi", - "stop the movie", - "stop kodi", - "set kodi volume to 100", - "set kodi volume to 25", - "show kodi movie information", - "hide kodi movie information", - "turn kodi notifications on", - "turn kodi notifications off", - "move the kodi cursor up / down / left / right / back / select / cancel", - "move the kodi cursor right 3 times", - "move the kodi cursor down twice", - "update the kodi library", - "clean the kodi library", - "ask kodi to list recently added movies", - "ask kodi to list the movies by genre", - "ask kodi to list the movies by studio", - "list kodi movie sets", - "list kodi movies by title", - "list kodi movies by actor", - "list all kodi movies" - ], - "tags": [ - "mycroft.ai,", - "python,", - "Leia,", - "'kodi,", - "Krypton", - "youtube'", - "Media", - "skills", - "kodi,", - "'", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/tv.svg", - "credits": [ - "PCWii", - "Original work forked from https://github.com/Cadair/mycroft-kodi" - ], - "categories": [ - "Media" - ], - "requirements": { - "python": [ - "pafy>=0.5.4", - "youtube_dl>=2019.9.1", - "pychromecast", - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "My Kodi Skill", - "android_handler": "my-kodi-skill.lesger.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-02-05T15:44:12Z", - "archived": false, - "license": "mit", - "modified": "2020-02-05T16:36:54Z", - "authorname": "colla69", - "skillname": "Work Helper Skill", - "foldername": "WorkHelperSkill", - "name": "Work Helper Skill", - "url": "https://github.com/colla69/WorkHelperSkill", - "category": null, - "description": "You can use this skill as an example to what you can do .. basically anything you can do in python on your pc can also be used with speech commands. This is my own playground :)", - "short_description": "", - "branch": "master", - "examples": [ - "Open chrome.", - "Good night.", - "Hey Mycroft, open chrome > open a new browser window", - "Hey Mycroft, good night > turns off the computer screen" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "colla69" - ], - "requirements": { - "python": [ - "gensim", - "pynput" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Workhelperskill Skill", - "android_handler": "WorkHelperSkill.colla69.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-05-08T10:37:10Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-08-13T11:51:28Z", - "authorname": "AIIX", - "skillname": "skill-installer-mobile", - "foldername": "skill-installer-mobile", - "name": "skill-installer-mobile", - "url": "https://github.com/AIIX/skill-installer-mobile", - "category": null, - "description": "Mycroft Skill Installer Skill For Mycroft GUI on Mobile Platforms", - "short_description": "Mycroft Skill Installer Skill For Mycroft GUI on Mobile Platforms", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": "/res/icon/installer-skill.png", - "android_name": "Skill Installer", - "android_handler": "skillinstallermobile.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-04-08T09:55:26Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-06-24T10:18:34Z", - "authorname": "montali", - "skillname": "Hospital Triage", - "foldername": "hospital-triage-skill", - "name": "Hospital Triage", - "url": "https://github.com/montali/hospital-triage-skill", - "category": "Information", - "description": "This skill was born to help er patients on their arrival at the hospital. It asks the patient basic questions about his health.\n\n### How it works\n\nThe skill is activated by saying the wake word (which, by default is `hey mycroft` but will be changed) and asking help:\n\n`Hey Mycroft, puoi aiutarmi?`\n\nThen, the interaction begins: the bot asks if it's talking directly with the patient. This helps us understands if he/she's conscious. Then, it asks about the main symptom. Right now, it recognises:\n\n\nIf the declared symptom is compatible with the COVID19, the bot asks some questions to determine the `covid_score`, an index determining how likely the patient is affected by COVID19.\n\nIt then assigns the patient a color code, according to the CESIRA index, and asks him/her to quantify the pain. Finally, it asks the patient his/her age and creates a `med_record` object containing all the gathered informations. This `med_record` can then be exported to assist the doctor during the checks.\nFaints\n * Hemorrhages\n * Shocks\n * Breathing difficulties\n * Fractures (extracting the affected limb)\n * Fevers\n * Burns\n * Abdominal pains", - "short_description": "Help ER patients by understanding why they're there.", - "branch": "master", - "examples": [], - "tags": [ - "Er", - "Triage", - "Hospital", - "Information", - "Health", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/hospital-user.svg", - "credits": [ - "montali" - ], - "categories": [ - "Information" - ], - "requirements": { - "python": [ - "textdistance", - "fastai" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Hospital Triage Skill", - "android_handler": "hospital-triage-skill.montali.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-04-02T22:12:25Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-07-02T23:01:09Z", - "authorname": "AVA-USP", - "skillname": "Device Configuration", - "foldername": "skill-configuration", - "name": "Device Configuration", - "url": "https://github.com/AVA-USP/skill-configuration", - "category": "Configuration", - "description": "User and device settings from [home.mycroft.ai](https://home.mycroft.ai) are\nsynchronized with your Devices. This Skill performs that synchronization and\nallows you to check your settings.\n\nYou can also change the technology used to perform Wake Word spotting. This is\nthe system that wakes the device up when you say \"Hey Mycroft\".", - "short_description": "Synchronize your Device Settings with [Home](https://home.mycroft.ai).", - "branch": "master", - "examples": [ - "Configuration update.", - "Update config.", - "What's your location?", - "What's your name?", - "What's the current Listener?", - "Set the Listener to Precise.", - "Set the Listener to default.", - "Configuration update", - "Update config", - "What's the current Listener? (for advanced debugging)", - "Set the Listener to Precise (for advanced debugging)", - "Set the Listener to default (for advanced debugging)" - ], - "tags": [ - "update-config", - "system", - "Configuration", - "config", - "configuration", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/cogs.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [ - "requests>=2.13.0", - "humanhash3" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Configuration Skill", - "android_handler": "skill-configuration.ava-usp.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-09-30T17:29:10Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-10-16T12:53:13Z", - "authorname": "AIIX", - "skillname": "", - "foldername": "AndroidHomescreen", - "name": "", - "url": "https://github.com/AIIX/AndroidHomescreen", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Androidhomescreen Skill", - "android_handler": "AndroidHomescreen.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-05-12T07:06:11Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-07-09T15:40:05Z", - "authorname": "jkemm", - "skillname": "OcSkill", - "foldername": "ocSkill", - "name": "OcSkill", - "url": "https://github.com/jkemm/ocSkill", - "category": "Information", - "description": "", - "short_description": "OC Group 2.1 (Mycroft)", - "branch": "master", - "examples": [ - "How does the verification process work?" - ], - "tags": [ - "how", - "max", - "module", - "similar", - "of", - "addition", - "Information", - "Process", - "change", - "compare", - "sparql", - "string", - "value.", - "Connector.", - "with", - "was", - "multiple", - "have", - "graphDBConnector.py", - "added", - "Adapt", - "Lucene", - "search", - "changing", - "used.", - "needed.", - "used", - "returns", - "version", - "Version", - "7.07.2020", - "name", - "This", - "enhance", - "entity", - "Intent", - "term", - "entities", - "graphDb", - "be.", - "Parser", - "the", - "means", - "similarity", - "you", - "and", - "Input", - "tested", - "tolerance", - "value", - "can", - "queries", - "To Process the Input the Adapt Intent Parser was used.", - "tolerance = 0 means no similarity is needed.", - "we used the Lucene Connector. In addition we added a string compare if Lucene returns multiple entities with max value.", - "Version\nThis version was tested with the graphDb version of 7.07.2020", - "By changing the tolerance value in the graphDBConnector.py module you can change how similar the search term and the entity name have to be.", - "To enhance the sparql queries", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/book.svg", - "credits": [ - "G2.1" - ], - "categories": [ - "Information", - "To Process the Input the Adapt Intent Parser was used.", - "To enhance the sparql queries", - "we used the Lucene Connector. In addition we added a string compare if Lucene returns multiple entities with max value.", - "By changing the tolerance value in the graphDBConnector.py module you can change how similar the search term and the entity name have to be.", - "tolerance = 0 means no similarity is needed." - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Ocskill Skill", - "android_handler": "ocSkill.jkemm.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-03-30T14:35:20Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-04-29T10:38:51Z", - "authorname": "Manasovo", - "skillname": "", - "foldername": "kuki-skill", - "name": "", - "url": "https://github.com/Manasovo/kuki-skill", - "category": "Entertainment", - "description": "Kuki is IPTV service mainly for people from Czech and Slovak Republic but works in whole EU of course. Today Kuki supports lots of end devices like smart tv, set-top boxes, Android and Android TV, Samsung, LG, Apple family - iOS and tvOS, etc. Kuki have more than 160 TV channelsin SD, Full HD and 4K streamed over internet with HLS protocol. Kuki offering advanced function like time shift, nPVR - video recording, series library, search, profiles, etc.", - "short_description": "**PROOF OF CONCEPT** - Mycroft at https://mycroft.ai implemetation of voice remote control for IPTV service Kuki at https://www.kuki.cz", - "branch": "master", - "examples": [ - "How to register Kuki devices ?", - "Show Kuki devices.", - "Show Kuki preferred device.", - "Switch Kuki preferred device.", - "Show device status.", - "Wake up Kuki / Sleep Kuki / Hasta la vista Baby.", - "Play live.", - "Play number 5.", - "Play channel Prima Cool HD.", - "Five minutes back.", - "Return to last monday at 9:30.", - "Channel up / down.", - "Kuki volume to 50 percent / max / mute.", - "Kuki volume up / down." - ], - "tags": [ - "TV", - "Streaming", - "Television", - "Kuki", - "Media", - "Entertainment", - "IPTV", - "Mycroft", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "icon": "https://github.com/Manasovo/kuki-skill/blob/master/kuki_logo.jpg", - "credits": [ - "**Manasovo** - apologies to everyone ! I'am not developer, coder, etc. and never been. In my whole live i wrote few shell script :-) This project is my first try with Python, GitHub, Mycroft, etc. Be gentle :-)" - ], - "categories": [ - "Entertainment", - "Media" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Kuki Skill", - "android_handler": "kuki-skill.manasovo.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-04-25T20:43:11Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-07-08T01:31:07Z", - "authorname": "pcwii", - "skillname": "CP Kodi Control", - "foldername": "cpkodi-skill", - "name": "CP Kodi Control", - "url": "https://github.com/pcwii/cpkodi-skill", - "category": "Media", - "description": "Utilize the kodi API and Python library for controlling the KODI open source media center with Mycroft.ai.\nThe Kodi Skill uses conversational dialog to help you to control your KODI instance more naturally.", - "short_description": "Control KODI open source media center with Mycroft.ai using the Common Play architecture", - "branch": "master", - "examples": [ - "Play the artist elvis presley”", - "Play all shook up”", - "Play the song blue suede shoes.", - "Play the album appeal to reason”", - "Play some music.", - "Clear the music playlist.", - "Pause the music.", - "Resume the music." - ], - "tags": [ - "mycroft.ai,", - "python,", - "youtube", - "Leia,", - "'kodi,", - "Krypton", - "Media", - "common", - "play", - "skills", - "cps'", - "kodi,", - "common play", - "'", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "icon": "/images/cpkodi.png", - "credits": [ - "PCWii" - ], - "categories": [ - "Media" - ], - "requirements": { - "python": [ - "requests", - "bs4", - "requests_cache", - "PyChromecast>=7.0.1", - "pyenchant", - "compound-word-splitter", - "youtube_searcher" - ], - "system": { - "apt-get": "libenchant1c2a" - }, - "skill": [] - }, - "android": { - "android_icon": null, - "android_name": "Cpkodi Skill", - "android_handler": "cpkodi-skill.pcwii.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-04-09T03:11:35Z", - "archived": false, - "license": "mit", - "modified": "2020-04-10T19:46:34Z", - "authorname": "alexisdiaz008", - "skillname": "Screen Wake On Wake Word", - "foldername": "screen-wake-on-wake-word-skill", - "name": "Screen Wake On Wake Word", - "url": "https://github.com/alexisdiaz008/screen-wake-on-wake-word-skill", - "category": "Configuration", - "description": "A mycroft skill that listens to the mycroft messagebus for wake-word activation and wakes the current screen", - "short_description": "Wakes the screen on wake word", - "branch": "master", - "examples": [], - "tags": [ - "wake", - "word", - "sleep", - "Configuration", - "Screen", - "Screen wake sleep word", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/bed.svg", - "credits": [ - "Vangrel" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Screen Wake On Wake Word Skill", - "android_handler": "screen-wake-on-wake-word-skill.alexisdiaz008.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-03-14T18:16:17Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-03-14T18:19:25Z", - "authorname": "screamnAbdab", - "skillname": "Slur", - "foldername": "slur-skill", - "name": "Slur", - "url": "https://github.com/screamnAbdab/slur-skill", - "category": "Entertainment", - "description": "Mycroft aint puttin up with your bullshit", - "short_description": "Mycroft responds to slurs in kind", - "branch": "master", - "examples": [ - "Fuck you.", - "Screw you.", - "Up yours.", - "Go to hell.", - "You're an idiot.", - "You're useless.", - "Fuck you", - "Screw you", - "Up yours", - "Go to hell", - "You're an idiot", - "You're useless" - ], - "tags": [ - "Entertainment", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/hand-middle-finger.svg", - "credits": [ - "screamnAbdab" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Slur Skill", - "android_handler": "slur-skill.screamnabdab.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-10-17T01:19:28Z", - "archived": false, - "license": "mit", - "modified": "2020-10-20T17:34:27Z", - "authorname": "tiradoe", - "skillname": "Mycroft Personality", - "foldername": "mycroft-personality-skill", - "name": "Mycroft Personality", - "url": "https://github.com/tiradoe/mycroft-personality-skill", - "category": "Entertainment", - "description": "Fuuuuuuuuun respoooooooonses for myyyyyyycroffffft", - "short_description": "Fun responses for mycroft", - "branch": "master", - "examples": [ - "Who shot first?", - "Star trek or star wars.", - "Is it serious?", - "What is best in life?", - "Who shot first", - "Star trek or star wars" - ], - "tags": [ - "Entertainment", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "Edward Tirado Jr" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Personality Skill", - "android_handler": "mycroft-personality-skill.tiradoe.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-04-02T22:15:47Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-07-02T23:00:56Z", - "authorname": "AVA-USP", - "skillname": "Installer", - "foldername": "skill-installer", - "name": "Installer", - "url": "https://github.com/AVA-USP/skill-installer", - "category": "Configuration", - "description": "Add and remove Skills using your voice or from the [Marketplace](https://market.mycroft.ai).\nYou can also assist skill authors in testing new versions of their skills by\nusing \"install prevew version\" to gain access to skills still under development\nand testing. If you do this, please be consicious the skill may be in an\nunstable development state and report issues to the author appropriately.\n\nYou can also install Skills that are not officially released by entering the\nSkill's GitHub repository URL in the [Installer's web user interface](https://home.mycroft.ai/#/skill).\n\nSkills are ultimately installed using the [Mycroft Skill Manager (msm)](https://mycroft.ai/documentation/msm). If verbally installing, Mycroft will speak a list of possible matches for\nambiguous names -- just pick the skill you want from the list read to you.", - "short_description": "Add and remove Mycroft Skills", - "branch": "master", - "examples": [ - "Install coin flip.", - "Install the preview version of coin flip.", - "Uninstall coin flip.", - "Remove coin flip.", - "Download custom skill.", - "Install coin flip", - "Install the preview version of coin flip ", - "Uninstall coin flip", - "Remove coin flip", - "Download custom skill" - ], - "tags": [ - "msm", - "install", - "download", - "add-skill", - "system", - "Configuration", - "skill", - "skills", - "installer", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/download.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [ - "msm" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Installer Skill", - "android_handler": "skill-installer.ava-usp.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-09-03T13:54:27Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-09-04T20:49:41Z", - "authorname": "KotieSmit", - "skillname": "Ir Remote", - "foldername": "ir-remote-skill", - "name": "Ir Remote", - "url": "https://github.com/KotieSmit/ir-remote-skill", - "category": "IoT", - "description": "Ir remote for mycroft", - "short_description": "Ir remote for mycroft", - "branch": "master", - "examples": [ - "Volume mute.", - "Volume up.", - "Volume down.", - "Power on.", - "Power off.", - "Volume mute", - "Volume up", - "Volume down", - "Power on", - "Power off" - ], - "tags": [ - "IoT", - "Remote", - "remote", - "Ir-remote", - "Tv", - "Ir", - "Universal", - "Universal remote", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/tv.svg", - "credits": [ - "Kotie Smit" - ], - "categories": [ - "IoT" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Ir Remote Skill", - "android_handler": "ir-remote-skill.kotiesmit.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-03-08T16:38:55Z", - "archived": false, - "license": "unknown", - "modified": "2020-03-08T16:39:03Z", - "authorname": "Miniomar", - "skillname": "Domoticz Minio", - "foldername": "domoticz-minio-skill", - "name": "Domoticz Minio", - "url": "https://github.com/Miniomar/domoticz-minio-skill", - "category": "IoT", - "description": "Integrazione tra domoticz e mycroft per accendere e spegnere utilizzatori.", - "short_description": "Integrazione tra domoticz e mycroft", - "branch": "master", - "examples": [ - "Accendi la luce.", - "Spegni la luce.", - "Dimmi lo stato della luce." - ], - "tags": [ - "IoT", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Domoticz Minio Skill", - "android_handler": "domoticz-minio-skill.miniomar.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-07-18T19:22:21Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-09-07T16:03:17Z", - "authorname": "ChristopherRogers1991", - "skillname": "mycroft-chromecast-controller", - "foldername": "mycroft-chromecast-controller", - "name": "mycroft-chromecast-controller", - "url": "https://github.com/ChristopherRogers1991/mycroft-chromecast-controller", - "category": null, - "description": "A Mycroft skill for controlling media playback on a Chromecast", - "short_description": "A Mycroft skill for controlling media playback on a Chromecast", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "PyChromecast==7.1.1" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Chromecast Controller Skill", - "android_handler": "mycroft-chromecast-controller.christopherrogers1991.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-05-21T06:46:23Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-07-15T16:49:58Z", - "authorname": "Caton101", - "skillname": "Application Launcher", - "foldername": "application-launcher-skill", - "name": "Application Launcher", - "url": "https://github.com/Caton101/application-launcher-skill", - "category": "Productivity", - "description": "This skill allows Mycroft to launch programs for the user. If this skill is the determined intention, it will check for the program in the user's `$PATH` variable by executing it in a subprocess. If a command is incorrect, it will try several variations of the program name.", - "short_description": "This skill launches programs inside your `$PATH` environment variable.", - "branch": "master", - "examples": [ - "Launch firefox.", - "Launch konsole.", - "Launch steam.", - "Launch discord.", - "Launch minecraft launcher.", - "Launch xterm.", - "Execute firefox.", - "Execute konsole.", - "Execute steam.", - "Execute discord.", - "Execute minecraft launcher.", - "Execute xterm.", - "Run firefox.", - "Run konsole.", - "Run steam.", - "Run discord.", - "Run minecraft launcher.", - "Run xterm.", - "launch firefox", - "launch konsole", - "launch steam", - "launch discord", - "launch minecraft launcher", - "launch xterm", - "execute firefox", - "execute konsole", - "execute steam", - "execute discord", - "execute minecraft launcher", - "execute xterm", - "run firefox", - "run konsole", - "run steam", - "run discord", - "run minecraft launcher", - "run xterm" - ], - "tags": [ - "Launcher", - "Linux", - "Productivity", - "Program", - "Terminal", - "Daily", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/terminal.svg", - "credits": [ - "Cameron Himes" - ], - "categories": [ - "Productivity", - "Daily" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Application Launcher Skill", - "android_handler": "application-launcher-skill.caton101.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-03-23T22:41:35Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-05-27T21:08:27Z", - "authorname": "LinusS1", - "skillname": "Password Creator", - "foldername": "password-creator-skill", - "name": "Password Creator", - "url": "https://github.com/LinusS1/password-creator-skill", - "category": "Productivity", - "description": "This skill generates easy to remember passwords, using the XKCD method:\n![xkcd style passwords](https://imgs.xkcd.com/comics/password_strength.png )\n\nThis skill randomly generates six words for you to use for your passwords. If you want, you can specify the number of words you want in your password. Also, you are able to ask to make a password acrostic, in other words give the skill a word, and the skill will give you a password where each word begins with a letter from the specified word. \n\nFor example, if I ask Mycroft to \"Create a password that spells Linus,\" Mycroft would give me the password of \"latch, immovable, numerate, underwire, and shifty\"", - "short_description": "Creates passwords XKCD style!", - "branch": "master", - "examples": [ - "Create a password.", - "Create password.", - "Start creating a password with 10 words.", - "Generate a password that spells Mycroft.", - "Give me a password.", - "Tell me a password.", - "Create a password", - "Create password", - "Start creating a password with 10 words", - "Generate a password that spells Mycroft", - "Give me a password", - "Tell me a password" - ], - "tags": [ - "Website", - "Password-creator", - "Password", - "Keys", - "Generator", - "Passwords", - "Key", - "Productivity", - "Configuration", - "Information", - "Daily", - "Creation", - "Creator", - "Generate-password", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/key.svg", - "credits": [ - "Linus S (@LinusS1)" - ], - "categories": [ - "Productivity", - "Daily", - "Configuration", - "Information" - ], - "requirements": { - "python": [ - "xkcdpass" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Password Creator Skill", - "android_handler": "password-creator-skill.linuss1.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-07-10T21:14:03Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-08-04T19:16:48Z", - "authorname": "gras64", - "skillname": "Standbymonitor", - "foldername": "standbymonitor-skill", - "name": "Standbymonitor", - "url": "https://github.com/gras64/standbymonitor-skill", - "category": "Daily", - "description": "the skill switches the monitor off after a short time to save electricity when mycroft is not used. With \"hey mycroft\" the monitor is switched on again.you can set the time and the automatic mode under \"home.mycroft\".\nthe skill supports the following methods:auto,xset dpms force,7 Zoll pi Display,DLP2000,tvservice,vcgencmd,CEC,mark 1,mark 2", - "short_description": "Monitor Standby", - "branch": "master", - "examples": [ - "Monitor activate.", - "Monitor deaktivate.", - "Monitor automatic.", - "Monitor activate", - "Monitor deaktivate", - "Monitor automatic" - ], - "tags": [ - "Monitor", - "Daily", - "automatic", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/desktop.svg", - "credits": [ - "gras64" - ], - "categories": [ - "Daily" - ], - "requirements": { - "system": { - "all": "libcec3 cec-utils" - }, - "python": [], - "skill": [] - }, - "android": { - "android_icon": null, - "android_name": "Standbymonitor Skill", - "android_handler": "standbymonitor-skill.gras64.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-03-08T16:51:30Z", - "archived": false, - "license": "unknown", - "modified": "2020-03-08T16:51:37Z", - "authorname": "Miniomar", - "skillname": "Domoticz Minios", - "foldername": "domoticz-minios-skill", - "name": "Domoticz Minios", - "url": "https://github.com/Miniomar/domoticz-minios-skill", - "category": "IoT", - "description": "Intergrazione per mycroft e domoticz per gestire luci, pc, etc.", - "short_description": "Integrazione tra domoticz e mycroft", - "branch": "master", - "examples": [ - "Accendi la luce.", - "Spegni la luce.", - "Dimmi lo stato della luce.", - "Accendi il pc.", - "Spegni il pc." - ], - "tags": [ - "IoT", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Domoticz Minios Skill", - "android_handler": "domoticz-minios-skill.miniomar.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-05-15T19:22:38Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-05-15T19:22:47Z", - "authorname": "Coppertick", - "skillname": "Volumio Controller", - "foldername": "volumio-controller-skill", - "name": "Volumio Controller", - "url": "https://github.com/Coppertick/volumio-controller-skill", - "category": "Music & Audio", - "description": "This skill enables you to controll your volumio app from your mycroft assistant", - "short_description": "Control your volumio with mycroft", - "branch": "master", - "examples": [ - "Play my rock playlist on volumio.", - "Play my volumio favorites.", - "Play jazz on volumio.", - "Play random music on volumio.", - "Play my rock playlist on volumio", - "Play my volumio favorites", - "Play jazz on volumio", - "Play random music on volumio" - ], - "tags": [ - "Music", - "Audio", - "Media", - "Entertainment", - "Volumio", - "Music & Audio", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/music.svg", - "credits": [ - "Coppertick" - ], - "categories": [ - "Music & Audio", - "Entertainment", - "Media" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Volumio Controller Skill", - "android_handler": "volumio-controller-skill.coppertick.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-04-19T20:26:30Z", - "archived": false, - "license": "unknown", - "modified": "2020-04-19T20:26:37Z", - "authorname": "wyutong1997", - "skillname": "Smart Medicine Dispenser", - "foldername": "smart-medicine-dispenser-skill", - "name": "Smart Medicine Dispenser", - "url": "https://github.com/wyutong1997/smart-medicine-dispenser-skill", - "category": "IoT", - "description": "Tell patient when they should eat medicine or the message about the medicine.", - "short_description": "Give the patient message about the medicine they should eat", - "branch": "master", - "examples": [ - "Hey,mycroft. what medicine should i eat?", - "Hey,mycroft. when should i eat medicine?", - "What's the restriction of this medicine?" - ], - "tags": [ - "IoT", - "Medical", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Smart Medicine Dispenser Skill", - "android_handler": "smart-medicine-dispenser-skill.wyutong1997.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-04-02T22:27:44Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-07-02T22:59:31Z", - "authorname": "AVA-USP", - "skillname": "Volume Control", - "foldername": "skill-volume", - "name": "Volume Control", - "url": "https://github.com/AVA-USP/skill-volume", - "category": "Configuration", - "description": "Control the volume of Mycroft with verbal commands or by spinning the physical\nbutton on a Mark 1.", - "short_description": "Control the volume of your system", - "branch": "master", - "examples": [ - "Turn up the volume.", - "Decrease the audio.", - "Mute audio.", - "Set volume to 5.", - "Set volume to 75 percent.", - "Turn up the volume", - "Decrease the audio", - "Mute audio", - "Set volume to 5", - "Set volume to 75 percent" - ], - "tags": [ - "sound", - "volume", - "system", - "Configuration", - "volume-control", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/volume-down.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Volume Skill", - "android_handler": "skill-volume.ava-usp.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-04-28T19:42:22Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-04-28T19:42:29Z", - "authorname": "INsiteLabDev", - "skillname": "Sample", - "foldername": "sample-skill", - "name": "Sample", - "url": "https://github.com/INsiteLabDev/sample-skill", - "category": "Entertainment", - "description": "When user asks mycroft what their name is, mycroft will respond telling the user what their name is", - "short_description": "Tells the user what their name is", - "branch": "master", - "examples": [ - "Tell me my name.", - "What is my name?", - "Who am i?", - "Tell me my name", - "What is my name", - "Who am i" - ], - "tags": [ - "Entertainment", - "Information", - "Name", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/meh.svg", - "credits": [ - "INsiteLabDev" - ], - "categories": [ - "Entertainment", - "Information" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Sample Skill", - "android_handler": "sample-skill.insitelabdev.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-07-03T07:53:58Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-07-03T11:18:33Z", - "authorname": "AIIX", - "skillname": "Sky Stream", - "foldername": "skystream", - "name": "Sky Stream", - "url": "https://github.com/AIIX/skystream", - "category": "Media", - "description": "Play Live News from Sky News", - "short_description": "Play Live News from Sky News", - "branch": "master", - "examples": [ - "Play Sky Live News.", - "Show Sky Live Stream.", - "Hey Mycroft Play Sky Live News", - "Hey Mycroft Show Sky Live Stream" - ], - "tags": [ - "GUI", - "VideoStreaming", - "Music", - "Media", - "Video", - "AudioStreaming", - "LiveStreams", - "SkyNews", - "no-license" - ], - "platforms": [ - "platform_mark2", - "platform_plasmoid" - ], - "stars": 0, - "icon": "https://raw.githubusercontent.com/FortAwesome/Font-Awesome/master/svgs/regular/newspaper.svg", - "credits": [ - "Aix (@aiix)" - ], - "categories": [ - "Media" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": "/res/icon/skystream.png", - "android_name": "Sky Stream", - "android_handler": "skystream.aiix.home" - }, - "desktop": { - "X-DBUS-StartupType": "None", - "X-KDE-StartupNotify": "false", - "Version": "1.0", - "Terminal": "false", - "Type": "Application", - "Name": "Sky Stream", - "Exec": "mycroft-gui-app --hideTextInput --skill=skystream.aiix.home", - "Icon": "skystream", - "Categories": "VoiceApp", - "StartupNotify": "false" - }, - "desktopFile": true - }, - { - "created": "2020-01-30T18:59:37Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-02-01T14:12:33Z", - "authorname": "yo5bdm", - "skillname": "Stop", - "foldername": "stop-skill", - "name": "Stop", - "url": "https://github.com/yo5bdm/stop-skill", - "category": "Configuration", - "description": "I created this skill because there is no easy way to shutdown the raspberry pi version. just say: stop / shutdown / sleep, and your raspberry pi variant of mycroft should stop itself.", - "short_description": "Stops the raspberry pi variant of mycroft", - "branch": "master", - "examples": [ - "Stop.", - "Shutdown.", - "Sleep.", - "Stop", - "Shutdown", - "Sleep" - ], - "tags": [ - "Shutdown", - "Sleep", - "Configuration", - "Stop", - "Daily", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/angle-double-down.svg", - "credits": [ - "Rudolf Erdei" - ], - "categories": [ - "Configuration", - "Daily" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Stop Skill", - "android_handler": "stop-skill.yo5bdm.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-04-02T22:26:36Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-07-02T22:59:50Z", - "authorname": "AVA-USP", - "skillname": "System", - "foldername": "skill-stop", - "name": "System", - "url": "https://github.com/AVA-USP/skill-stop", - "category": "Configuration", - "description": "Provides verbal interfaces for basic framework interactions, such as the\n\"Stop\" command. Also provide interface to control physical Mycroft hardware.\n\nNOTE: This Skill is a little unusual in that it really doesn't do anything\ndirectly, rather it emits messages for the device creator to capture.", - "short_description": "General system control", - "branch": "master", - "examples": [ - "Stop.", - "Reboot.", - "Turn off.", - "Allow remote login.", - "Configure wifi.", - "Stop", - "Reboot", - "Turn off", - "Allow remote login", - "Configure wifi" - ], - "tags": [ - "Configuration", - "system", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/cog.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Stop Skill", - "android_handler": "skill-stop.ava-usp.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-03-23T20:11:41Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-06-17T22:43:15Z", - "authorname": "gras64", - "skillname": "Pootle Sync", - "foldername": "pootle-sync-skill", - "name": "Pootle Sync", - "url": "https://github.com/gras64/pootle-sync-skill", - "category": "Configuration", - "description": "skill podtle synchronizes the new set of pootle data with your mycroft system. From core version 20.2 a second language directory is supported.", - "short_description": "This skill is for sync language data with pootle", - "branch": "master", - "examples": [ - "Download pootle data.", - "Download new Language data.", - "There is new in english.", - "Sync the language data.", - "Download pootle data", - "download new Language data", - "there is new in english", - "sync the language data" - ], - "tags": [ - "Configuration", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/sync.svg", - "credits": [ - "gras64" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [ - "requests", - "polib", - "wget" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Pootle Sync Skill", - "android_handler": "pootle-sync-skill.gras64.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-05-26T19:57:55Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-09-12T00:37:51Z", - "authorname": "pcwii", - "skillname": "USB Music", - "foldername": "usb-music", - "name": "USB Music", - "url": "https://github.com/pcwii/usb-music", - "category": "Media", - "description": "This Skill will play local (non-cloud) music sources (USB, SMB, Local)\n1. Inserting a USB drive into your Mycroft device. Upon Inserting a USB Device Mycroft\nwill scan the device for playable music and add it to a temporary library that you can play.\n2. Adding an SMB source will let you play music from that source.\n3. Adding a local path source will let you play music from that source.\n4. Supports the following music formats 'mp3', 'm4a', 'flac', 'wav', 'wma','aac'", - "short_description": "Play Music from local (non-cloud based) sources (usb, smb, local path) with Mycroft.ai", - "branch": "master", - "examples": [ - "Play the artist elvis Presley.", - "Play all shook up.", - "Play the song blue suede shoes.", - "Play the album appeal to reason.", - "Update network library.", - "Update local library.", - "Update usb library.", - "Update music library.", - "Stop." - ], - "tags": [ - "mycroft.ai,", - "python,", - "aac,", - "mp3,", - "m4a,", - "Local", - "'", - "Media", - "skills,", - "flac,", - "wav,", - "usb,", - "wma,", - "SMB,", - "CPS,", - "'music,", - "music,", - "Local '", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 1, - "icon": "/images/usbmusic.png", - "credits": [ - "PCWii (20200709 Covid-19 Project)", - "Some elements borrowed from https://github.com/Preston-Sundar/RaspberryPi-Pyudev-Usb-Storage-Detector/blob/master/usbdev.py" - ], - "categories": [ - "Media" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Usb Music Skill", - "android_handler": "usb-music.pcwii.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-07-28T19:30:59Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-07-29T19:24:08Z", - "authorname": "Kervball", - "skillname": "Lightcontrol", - "foldername": "lightcontrol-skill", - "name": "Lightcontrol", - "url": "https://github.com/Kervball/lightcontrol-skill", - "category": "Daily", - "description": "This comand will activate gpio pins to do what colors you want, it also will fade red when mycroft is ready for use and will fade white while listening. it logs the current state of the pins to reset after each command. could be modified to just use each section", - "short_description": "This controls the lights on my desk", - "branch": "master", - "examples": [ - "Front light test.", - "Front light test" - ], - "tags": [ - "Lights", - "Led", - "Gpio", - "Startup", - "Daily", - "Mycroft", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/lightbulb.svg", - "credits": [ - "Kervball" - ], - "categories": [ - "Daily" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Lightcontrol Skill", - "android_handler": "lightcontrol-skill.kervball.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-01-07T07:31:44Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-01-07T07:55:59Z", - "authorname": "krisgesling", - "skillname": "End Listening Sound", - "foldername": "end-listening-sound-skill", - "name": "End Listening Sound", - "url": "https://github.com/krisgesling/end-listening-sound-skill", - "category": "Configuration", - "description": "This enables support for the `end_listening` configuration parameter, playing a sound at the end of the microphone recording.\n\nBy default it will attempt to play the file: `mycroft-core/mycroft/res/snd/end_listening.wav`. If the file isn't found it will play the standard `acknowledge.mp3`.", - "short_description": "Play sound when microphone stops listening", - "branch": "master", - "examples": [ - "<All phrases>" - ], - "tags": [ - "Configuration", - "Microphone", - "System", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/microphone-alt-slash.svg", - "credits": [ - "krisgesling" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "End Listening Sound Skill", - "android_handler": "end-listening-sound-skill.krisgesling.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-02-10T23:35:49Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-02-22T22:51:34Z", - "authorname": "verrannt", - "skillname": "Pomodoro Timer", - "foldername": "pomodoro-timer-skill", - "name": "Pomodoro Timer", - "url": "https://github.com/verrannt/pomodoro-timer-skill", - "category": "Productivity", - "description": "Make mycroft manage your pomodoro learning sessions. with this skill, mycroft can start a new learning session or break and take care of timing it. just tell it to start, it will tell you when to stop and take breaks! you can also adjust session and break lengths.", - "short_description": "Sets a pomodoro timer for studying", - "branch": "master", - "examples": [ - "Start a new pomodoro session.", - "Start a new pomodoro timer.", - "Start a pomodoro break.", - "Set the pomodoro session length to 25 minutes.", - "Set the pomodoro break length to 5 minutes.", - "Start a new pomodoro session", - "Start a new pomodoro timer", - "Start a pomodoro break", - "Set the pomodoro session length to 25 minutes", - "Set the pomodoro break length to 5 minutes" - ], - "tags": [ - "Daily,media", - "Timer", - "Pomodoro", - "Learn", - "Study", - "Productivity", - "Break", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/stopwatch.svg", - "credits": [ - "@verrannt" - ], - "categories": [ - "Productivity", - "Daily,media" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Pomodoro Timer Skill", - "android_handler": "pomodoro-timer-skill.verrannt.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-05-01T10:14:46Z", - "archived": false, - "license": "mit", - "modified": "2020-05-01T11:12:15Z", - "authorname": "brezuicabogdan", - "skillname": "Myepisodes", - "foldername": "myepisodes-skill", - "name": "Myepisodes", - "url": "https://github.com/brezuicabogdan/myepisodes-skill", - "category": "Information", - "description": "You will be able to ask mycroft to check the status of your shows list handled by [myepisodes.com](http://www.myepisodes.com).\n\nmycroft will be able to give you the number of episodes not acquired and optionally the number of episodes acquired but not watched.\n\nalso you will be able to find out the unacquired seasons and episdes numbers", - "short_description": "Check the status of your [myepisodes.com](http://www.myepisodes.com) show list", - "branch": "master", - "examples": [ - "Check my episodes.", - "Any new episodes.", - "Check tv shows.", - "Any new episodes.", - "Anything new on my episodes.", - "Check my episodes", - "Any new episodes", - "Check tv shows", - "Any new episodes", - "Anything new on my episodes" - ], - "tags": [ - "Series", - "Myepisodes", - "Tv", - "Media", - "Entertainment", - "Information", - "Myepisodes.com", - "Episodes", - "shows", - "Tv shows", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/tv.svg", - "credits": [ - "Bogdan Brezuica (@brezuicabogdan)" - ], - "categories": [ - "Information", - "Entertainment", - "Tv shows", - "Series", - "Media" - ], - "requirements": { - "python": [ - "feedparser" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Myepisodes Skill", - "android_handler": "myepisodes-skill.brezuicabogdan.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-09-26T09:57:42Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-09-29T16:21:04Z", - "authorname": "gras64", - "skillname": "Deepspeach Dictation", - "foldername": "deepspeach-dictation-skill", - "name": "Deepspeach Dictation", - "url": "https://github.com/gras64/deepspeach-dictation-skill", - "category": "Daily", - "description": "This ability makes it possible for mycroft to dictate sentences. this requires permanent listening temporarily. you can use it to write e-mails or take long notes.", - "short_description": "", - "branch": "master", - "examples": [ - "Can i dictate something to you.", - "Delete last sentence.", - "Can i dictate something to you", - "delete last sentence" - ], - "tags": [ - "Productivity", - "Daily", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/chalkboard-teacher.svg", - "credits": [ - "gras64" - ], - "categories": [ - "Daily", - "Productivity" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Deepspeach Dictation Skill", - "android_handler": "deepspeach-dictation-skill.gras64.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-05-31T21:28:26Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-05-31T22:27:52Z", - "authorname": "tomtomCyrus", - "skillname": "Simplenote", - "foldername": "simplenote-skill", - "name": "Simplenote", - "url": "https://github.com/tomtomCyrus/simplenote-skill", - "category": "Productivity", - "description": "Simplenote is a cross-platform note-taking software, available with a python api. your need an account in order to make this skill work, which are free, and all your notes are sync on every device logged into your account (android or ios phone, windows, linux or mac computer). mycroft helps you create your notes, tag them and edit them. you can also get a list of all your notes or a list of the ones with a particular tag.", - "short_description": "Mycroft voice interface to manage your simplenote content, a note-taking are for all platforms.", - "branch": "master", - "examples": [ - "Create a new note.", - "Add something to my note.", - "List me all my notes.", - "Edit a python note.", - "Create a new note", - "Add something to my note", - "List me all my notes", - "Edit a python note" - ], - "tags": [ - "list", - "Note-taking", - "Productivity", - "Daily", - "Todo", - "List", - "Cross-platform", - "Notes", - "Simplenote", - "Todo list", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/clipboard-list.svg", - "credits": [ - "tomtomCyrus" - ], - "categories": [ - "Productivity", - "Daily" - ], - "requirements": { - "python": [ - "simplenote" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Simplenote Skill", - "android_handler": "simplenote-skill.tomtomcyrus.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-06-05T06:02:17Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-06-05T06:04:40Z", - "authorname": "algoruin", - "skillname": "Playback Control", - "foldername": "mycroft-audio", - "name": "Playback Control", - "url": "https://github.com/algoruin/mycroft-audio", - "category": "Music", - "description": "This Skill doesn't do anything by itself, but it provides an important common\nlanguage for audio playback skills. By handling simple phrases like\n'pause', this one Skill can turn around and rebroadcast the [messagebus](https://mycroft.ai/documentation/message-bus/)\ncommand `mycroft.audio.service.pause`, allowing several music services to share\ncommon terminology such as \"pause\".\n\nAdditionally, this implements the common Play handler. This allows playback\nservices to negotiate which is best suited to play back a specific request.\nThis capability is used by the [Spotify](https://github.com/forslund/spotify-skill) and [Pandora](https://github.com/mycroftai/pianobar-skill) Skills, among others.", - "short_description": "Common playback control system", - "branch": "master", - "examples": [ - "Play my summer playlist.", - "Play Pandora.", - "Pause.", - "Resume.", - "Next song.", - "Next track.", - "Previous track.", - "Previous song.", - "Play my summer playlist", - "Play Pandora", - "Pause", - "Resume", - "Next song", - "Next track", - "Previous track", - "Previous song" - ], - "tags": [ - "music", - "resume", - "system", - "Music", - "next", - "pause", - "play", - "playback", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/play.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Music" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Audio Skill", - "android_handler": "mycroft-audio.algoruin.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-04-02T22:22:14Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-07-02T23:00:20Z", - "authorname": "AVA-USP", - "skillname": "Playback Control", - "foldername": "skill-playback-control", - "name": "Playback Control", - "url": "https://github.com/AVA-USP/skill-playback-control", - "category": "Music", - "description": "This Skill doesn't do anything by itself, but it provides an important common\nlanguage for audio playback skills. By handling simple phrases like\n'pause', this one Skill can turn around and rebroadcast the [messagebus](https://mycroft.ai/documentation/message-bus/)\ncommand `mycroft.audio.service.pause`, allowing several music services to share\ncommon terminology such as \"pause\".\n\nAdditionally, this implements the common Play handler. This allows playback\nservices to negotiate which is best suited to play back a specific request.\nThis capability is used by the [Spotify](https://github.com/forslund/spotify-skill) and [Pandora](https://github.com/mycroftai/pianobar-skill) Skills, among others.", - "short_description": "Common playback control system", - "branch": "master", - "examples": [ - "Play my summer playlist.", - "Play Pandora.", - "Pause.", - "Resume.", - "Next song.", - "Next track.", - "Previous track.", - "Previous song.", - "Play my summer playlist", - "Play Pandora", - "Pause", - "Resume", - "Next song", - "Next track", - "Previous track", - "Previous song" - ], - "tags": [ - "music", - "resume", - "system", - "Music", - "next", - "pause", - "play", - "playback", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/play.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Music" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Playback Control Skill", - "android_handler": "skill-playback-control.ava-usp.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-10-25T14:32:07Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-10-25T20:48:51Z", - "authorname": "guhl", - "skillname": "Wake Button Rpi", - "foldername": "wake-button-rpi-skill", - "name": "Wake Button Rpi", - "url": "https://github.com/guhl/wake-button-rpi-skill", - "category": "IoT", - "description": "Press a button that is connected to a GPIO input to trigger wakeup so that the device starts listening. \nIf the button is pressed for a longer time he stops whatever he is doing. \nThis skill is heavily based on the Google AIY voicekit skill by Andlo.", - "short_description": "Usd a GPIO connected button instead of wake word", - "branch": "master", - "examples": [], - "tags": [ - "IoT", - "Mark", - "Wake", - "2", - "Configuration", - "Button", - "Mark 2", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/hand-point-down.svg", - "credits": [ - "Guhl (@guhl)\nAndreas Lorensen (@andlo)" - ], - "categories": [ - "IoT", - "Configuration" - ], - "requirements": { - "python": [ - "RPi.GPIO" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Wake Button Rpi Skill", - "android_handler": "wake-button-rpi-skill.guhl.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-04-23T14:32:52Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-05-08T19:10:59Z", - "authorname": "stratus-ss", - "skillname": "Mycroft Confluence Search", - "foldername": "mycroft-confluence-search-skill", - "name": "Mycroft Confluence Search", - "url": "https://github.com/stratus-ss/mycroft-confluence-search-skill", - "category": "Information", - "description": "This skill is hosted on [Gitlab](https://gitlab.com/stratus-ss/mycroft-confluence-search-skill)and mirrored to GitHub\n.The main purpose of this skill is to be able to search an Atlassian Confluence Wiki and return the results to a Telegram group of channel. It will\nsend results in groups of two and after the first 2 are displayed ask the user if more results should be returne.\n\nYou can as for a general title search, or if you know the page you want is nested, ask Mycroft to narrow the results based on a parent page.\nThis skill uses fuzzy searching so it is unlikely that only 1 match will be returned.", - "short_description": "", - "branch": "master", - "examples": [], - "tags": [ - "Search", - "Information", - "Telegram", - "Confluence", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/search.svg", - "credits": [ - "stratus-ss" - ], - "categories": [ - "Information" - ], - "requirements": { - "python": [ - "atlassian-python-api", - "python-telegram-bot" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Confluence Search Skill", - "android_handler": "mycroft-confluence-search-skill.stratus-ss.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-05-16T08:27:54Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-07-12T11:24:06Z", - "authorname": "jumper047", - "skillname": "Mycroft Alias Skill", - "foldername": "mycroft-alias-skill", - "name": "Mycroft Alias Skill", - "url": "https://github.com/jumper047/mycroft-alias-skill", - "category": null, - "description": "Create aliases - run command chains etc", - "short_description": "Create aliases - run command chains etc", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Alias Skill", - "android_handler": "mycroft-alias-skill.jumper047.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-03-16T14:39:35Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-03-17T04:03:53Z", - "authorname": "valliappan22", - "skillname": "Meetingroom", - "foldername": "meetingroom-skill", - "name": "Meetingroom", - "url": "https://github.com/valliappan22/meetingroom-skill", - "category": "Information", - "description": "General", - "short_description": "General test", - "branch": "master", - "examples": [ - "Hey.", - "", - "Hey", - "Hey mycroft" - ], - "tags": [ - "Information", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/ad.svg", - "credits": [ - "" - ], - "categories": [ - "Information" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Meetingroom Skill", - "android_handler": "meetingroom-skill.valliappan22.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-05-17T13:58:14Z", - "archived": false, - "license": "unknown", - "modified": "2020-05-17T14:38:41Z", - "authorname": "Lesger", - "skillname": "", - "foldername": "button-respeaker-skill", - "name": "", - "url": "https://github.com/Lesger/button-respeaker-skill", - "category": null, - "description": "", - "short_description": "", - "branch": "Lesger-patch-1", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "RPi.GPIO" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Button Respeaker Skill", - "android_handler": "button-respeaker-skill.lesger.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-04-23T20:24:58Z", - "archived": false, - "license": "unknown", - "modified": "2020-04-25T17:07:09Z", - "authorname": "pcwii", - "skillname": "common-play-test-skill", - "foldername": "common-play-test-skill", - "name": "common-play-test-skill", - "url": "https://github.com/pcwii/common-play-test-skill", - "category": null, - "description": "Testing the Mycroft.AI Common Play Architecture", - "short_description": "Testing the Mycroft.AI Common Play Architecture", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Common Play Test Skill", - "android_handler": "common-play-test-skill.pcwii.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-08-22T11:22:42Z", - "archived": false, - "license": "mit", - "modified": "2020-09-24T09:36:17Z", - "authorname": "noahares", - "skillname": "Yeelight", - "foldername": "yeelight-skill", - "name": "Yeelight", - "url": "https://github.com/noahares/yeelight-skill", - "category": "IoT", - "description": "", - "short_description": "Control yeelight bulb with mycroft", - "branch": "master", - "examples": [], - "tags": [ - "IoT", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/lightbulb.svg", - "credits": [ - "Github @noahares" - ], - "categories": [ - "IoT" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Yeelight Skill", - "android_handler": "yeelight-skill.noahares.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-01-24T06:12:21Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-02-06T07:19:04Z", - "authorname": "dmonty2", - "skillname": "mycroft-school-calendar-scraper", - "foldername": "mycroft-school-calendar-scraper", - "name": "mycroft-school-calendar-scraper", - "url": "https://github.com/dmonty2/mycroft-school-calendar-scraper", - "category": null, - "description": "Scrape the boys school calendar for today's schedule/news", - "short_description": "Scrape the boys school calendar for today's schedule/news", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft School Calendar Scraper Skill", - "android_handler": "mycroft-school-calendar-scraper.dmonty2.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-01-22T21:14:18Z", - "archived": false, - "license": "unknown", - "modified": "2020-01-23T13:18:36Z", - "authorname": "RdeLange", - "skillname": "fallback-node-red-mqtt", - "foldername": "fallback-node-red-mqtt", - "name": "fallback-node-red-mqtt", - "url": "https://github.com/RdeLange/fallback-node-red-mqtt", - "category": null, - "description": "mqtt fallback to nodered skill for Mycroft", - "short_description": "mqtt fallback to nodered skill for Mycroft", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [ - "paho-mqtt", - "websockets" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Fallback Node Red Mqtt Skill", - "android_handler": "fallback-node-red-mqtt.rdelange.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-02-04T20:51:23Z", - "archived": false, - "license": "unknown", - "modified": "2020-03-09T03:44:36Z", - "authorname": "S-STEM-Team-5", - "skillname": "mycroft-hello-world", - "foldername": "mycroft-hello-world", - "name": "mycroft-hello-world", - "url": "https://github.com/S-STEM-Team-5/mycroft-hello-world", - "category": null, - "description": "Just a simple Hello World repository\n\nCreated by \n-------------------------\nJoe Graeber\nBryan Hill\nKevin Kamto\nAlcinder Lewis", - "short_description": "Just a simple Hello World repository", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Hello World Skill", - "android_handler": "mycroft-hello-world.s-stem-team-5.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-07-12T21:28:15Z", - "archived": false, - "license": "unknown", - "modified": "2020-07-12T21:28:23Z", - "authorname": "Dema1701", - "skillname": "I Am Here", - "foldername": "i-am-here-skill", - "name": "I Am Here", - "url": "https://github.com/Dema1701/i-am-here-skill", - "category": "IoT", - "description": "", - "short_description": "When you are back mycroft will say welcome home", - "branch": "master", - "examples": [ - "I am here.", - "I am back.", - "Hello.", - "I am here", - "I am back", - "Hello" - ], - "tags": [ - "IoT", - "Here", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/home.svg", - "credits": [ - "Dema1701" - ], - "categories": [ - "IoT" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "I Am Here Skill", - "android_handler": "i-am-here-skill.dema1701.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-01-16T12:35:03Z", - "archived": false, - "license": "unknown", - "modified": "2020-02-06T10:22:21Z", - "authorname": "justfaked", - "skillname": "Mycroft Playground", - "foldername": "mycroft-playground-skill", - "name": "Mycroft Playground", - "url": "https://github.com/justfaked/mycroft-playground-skill", - "category": "IoT", - "description": "Testing", - "short_description": "Testing", - "branch": "master", - "examples": [ - "Lets play.", - "Play with me.", - "Play.", - "Lets play", - "Play with me", - "Play" - ], - "tags": [ - "IoT", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/adjust.svg", - "credits": [ - "cp" - ], - "categories": [ - "IoT" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Playground Skill", - "android_handler": "mycroft-playground-skill.justfaked.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-04-19T16:49:55Z", - "archived": false, - "license": "mit", - "modified": "2020-04-19T22:44:17Z", - "authorname": "chastain", - "skillname": "Fish Quotes", - "foldername": "fish--quotes-skill", - "name": "Fish Quotes", - "url": "https://github.com/chastain/fish--quotes-skill", - "category": "Entertainment", - "description": "", - "short_description": "Ask mycroft for a random fishing quote", - "branch": "master", - "examples": [ - "Fishing quotes.", - "Fishing wisdom.", - "Fish quotes.", - "Fish wisdom.", - "Fishing quotes", - "Fishing wisdom", - "Fish quotes", - "Fish wisdom" - ], - "tags": [ - "Entertainment", - "Information", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/fish.svg", - "credits": [ - "Eric Chastain" - ], - "categories": [ - "Entertainment", - "Information" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Fish Quotes Skill", - "android_handler": "fish--quotes-skill.chastain.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-09-09T00:29:33Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-09-09T00:29:42Z", - "authorname": "krisgesling", - "skillname": "Example Prompts", - "foldername": "example-prompts-skill", - "name": "Example Prompts", - "url": "https://github.com/krisgesling/example-prompts-skill", - "category": "Configuration", - "description": "", - "short_description": "Example skill to illustrate mycroft's interactive abilities", - "branch": "master", - "examples": [ - "Show me how to prompt a user.", - "Show me how to prompt a user" - ], - "tags": [ - "Example", - "Interaction", - "Prompts", - "Configuration", - "Tutorial", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "krisgesling" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Example Prompts Skill", - "android_handler": "example-prompts-skill.krisgesling.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-08-13T21:41:56Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-08-13T21:44:11Z", - "authorname": "forslund", - "skillname": "Simple skill illustrating the Mycroft Skill API", - "foldername": "robber-lang", - "name": "Simple skill illustrating the Mycroft Skill API", - "url": "https://github.com/forslund/robber-lang", - "category": null, - "description": "This skill exports a single method converting the input text to the Robber language.", - "short_description": "This skill exports a single method converting the input text to the Robber language.", - "branch": "master", - "examples": [], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Robber Lang Skill", - "android_handler": "robber-lang.forslund.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-06-22T21:51:34Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-06-22T21:51:43Z", - "authorname": "krisgesling", - "skillname": "Precise Data Collector", - "foldername": "precise-data-collector-skill", - "name": "Precise Data Collector", - "url": "https://github.com/krisgesling/precise-data-collector-skill", - "category": "Configuration", - "description": "", - "short_description": "", - "branch": "master", - "examples": [ - "Record wake words.", - "Record some wake words.", - "Record wake words", - "Record some wake words" - ], - "tags": [ - "Hey", - "Precise", - "word", - "Wake", - "Configuration", - "mycroft", - "Wake word", - "Hey mycroft", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "krisgesling" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Precise Data Collector Skill", - "android_handler": "precise-data-collector-skill.krisgesling.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-05-15T19:42:06Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-05-15T19:42:15Z", - "authorname": "Coppertick", - "skillname": "Volumio Control", - "foldername": "volumio-control-skill", - "name": "Volumio Control", - "url": "https://github.com/Coppertick/volumio-control-skill", - "category": "Music & Audio", - "description": "A long description", - "short_description": "Volumio controller for mycroft", - "branch": "master", - "examples": [ - "Play rock on volumio.", - "Play rock on volumio" - ], - "tags": [ - "Music", - "Volumio", - "Audio", - "Music & Audio", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/music.svg", - "credits": [ - "Coppertick" - ], - "categories": [ - "Music & Audio" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Volumio Control Skill", - "android_handler": "volumio-control-skill.coppertick.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-05-15T07:37:11Z", - "archived": false, - "license": "unknown", - "modified": "2020-05-15T07:37:20Z", - "authorname": "mohitvirmani", - "skillname": "Bible", - "foldername": "bible-skill", - "name": "Bible", - "url": "https://github.com/mohitvirmani/bible-skill", - "category": "Music & Audio", - "description": "Bible reading skill for mycroft", - "short_description": "Read bible", - "branch": "master", - "examples": [ - "Read the bible.", - "Start bible reading.", - "Read the bible", - "Start bible reading" - ], - "tags": [ - "Bible", - "Music", - "Audio", - "Siri", - "bible", - "Daily", - "reading", - "Music & Audio", - "Bible reading", - "Siri bible", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/bible.svg", - "credits": [ - "mohitvirmani" - ], - "categories": [ - "Music & Audio", - "Daily" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Bible Skill", - "android_handler": "bible-skill.mohitvirmani.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-07-22T09:10:14Z", - "archived": false, - "license": "unknown", - "modified": "2020-08-07T17:43:39Z", - "authorname": "mseewer", - "skillname": "Radio Player", - "foldername": "skill-recapp-radio", - "name": "Radio Player", - "url": "https://github.com/mseewer/skill-recapp-radio", - "category": "Music & Audio", - "description": "Plays the radio channel that you wish\n\n##IMPORTANT\nplease run requirements.sh to install vlc on mycroft, so that the radio stream can be played", - "short_description": "Plays radio", - "branch": "master", - "examples": [ - "Radio.", - "Spiel radio.", - "Radio", - "Spiel radio" - ], - "tags": [ - "Music", - "Audio", - "Music & Audio", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/file-audio.svg", - "credits": [ - "mseewer" - ], - "categories": [ - "Music & Audio" - ], - "requirements": { - "python": [ - "python-vlc" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Recapp Radio Skill", - "android_handler": "skill-recapp-radio.mseewer.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-09-13T07:16:21Z", - "archived": false, - "license": "unknown", - "modified": "2020-09-13T19:41:06Z", - "authorname": "sedeer", - "skillname": "Examples", - "foldername": "skill-companion", - "name": "Examples", - "url": "https://github.com/sedeer/skill-companion", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [ - "I'm home.", - "I'm back.", - "I'm off.", - "I'm going out.", - "I'm home", - "I'm back", - "I'm off", - "I'm going out" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Companion Skill", - "android_handler": "skill-companion.sedeer.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-08-27T04:18:31Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-08-27T04:44:36Z", - "authorname": "JarbasSkills", - "skillname": "skill-euronews", - "foldername": "skill-euronews", - "name": "Euro News Skill", - "url": "https://github.com/JarbasSkills/skill-euronews", - "category": "Information", - "description": "European news for Mycroft\n\nSupported Languages:\n\n\n![](./gui.gif)\nEnglish\n * Portuguese\n * Italian\n * Spanish\n * French\n * German", - "short_description": "Live news from Euronews", - "branch": "v0.3", - "examples": [ - "Play euronews.", - "Play news in portuguese.", - "Play news in spanish.", - "play euronews", - "play news in portuguese", - "play news in spanish" - ], - "tags": [ - "news", - "Information", - "no-license" - ], - "platforms": [ - "all", - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "stars": 0, - "icon": "https://github.com/JarbasSkills/skill-euronews/res/icon/euronews.png", - "credits": [ - "JarbasAl", - "[Euronews](https://www.youtube.com/user/euronewsnetwork/channels)" - ], - "categories": [ - "Information" - ], - "logo": "https://raw.githubusercontent.com/JarbasSkills/skill-euronews/master/ui/logo.png", - "requirements": { - "python": [ - "youtube_searcher>=0.1.5", - "ovos_utils>=0.0.8a1", - "pafy", - "youtube-dl" - ], - "skill": [ - "https://github.com/JarbasSkills/skill-better-playback-control" - ], - "system": {} - }, - "android": { - "android_icon": "https://raw.githubusercontent.com/JarbasSkills/skill-euronews/master/res/icon/euronews.png", - "android_name": "Euronews Skill", - "android_handler": "skill-euronews.jarbasskills.home" - }, - "desktop": { - "Terminal": "false", - "Type": "Application", - "Name": "Euro News Skill", - "Exec": "mycroft-gui-app --hideTextInput --skill=skill-euronews.jarbasskills.home", - "Icon": "euronews.png", - "Categories": "VoiceApp", - "StartupNotify": "false", - "X-DBUS-StartupType": "None", - "X-KDE-StartupNotify": "false" - }, - "desktopFile": true, - "systemDeps": false - }, - { - "created": "2020-07-18T18:31:33Z", - "archived": false, - "license": "unknown", - "modified": "2020-07-31T01:25:54Z", - "authorname": "aldeaman", - "skillname": "Read Arduino Pot", - "foldername": "read-arduino-pot-skill", - "name": "Read Arduino Pot", - "url": "https://github.com/aldeaman/read-arduino-pot-skill", - "category": "IoT", - "description": "", - "short_description": "Mycroft skill to read a potentiometer on an arduino uno over usb (serial connection)", - "branch": "master", - "examples": [ - "What is the sensor reading?", - "Read the sensor.", - "What is the sensor level?" - ], - "tags": [ - "IoT", - "Arduino,sensor,communication", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/wave-square.svg", - "credits": [ - "Aldeaman" - ], - "categories": [ - "IoT" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Read Arduino Pot Skill", - "android_handler": "read-arduino-pot-skill.aldeaman.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-10-12T00:53:14Z", - "archived": false, - "license": "mit", - "modified": "2020-10-14T22:16:58Z", - "authorname": "tiradoe", - "skillname": "Podcasts", - "foldername": "podcasts-skill", - "name": "Podcasts", - "url": "https://github.com/tiradoe/podcasts-skill", - "category": "Music & Audio", - "description": "Play your favorite podcasts on your mycroft device", - "short_description": "Play your favorite podcasts", - "branch": "master", - "examples": [ - "Play a podcast.", - "Start a podcast.", - "List the top ten podcasts.", - "Play a podcast", - "Start a podcast", - "List the top ten podcasts" - ], - "tags": [ - "News", - "Podcasts", - "Music", - "Audio", - "Entertainment", - "Podcast", - "Music & Audio", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/podcast.svg", - "credits": [ - "Edward Tirado Jr." - ], - "categories": [ - "Music & Audio", - "Entertainment" - ], - "requirements": { - "python": [ - "mygpoclient", - "feedparser" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Podcasts Skill", - "android_handler": "podcasts-skill.tiradoe.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-03-23T19:23:17Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-03-23T19:52:07Z", - "authorname": "martijnvanbeers", - "skillname": "Ledfeedback", - "foldername": "ledfeedback-skill", - "name": "Ledfeedback", - "url": "https://github.com/martijnvanbeers/ledfeedback-skill", - "category": "Information", - "description": "Uses the leds on a seeed mic array to give feedback on the listening/speaking state mycroft is in", - "short_description": "Use leds to give status feedback", - "branch": "master", - "examples": [], - "tags": [ - "Information", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/assistive-listening-systems.svg", - "credits": [ - "Martijn van Beers" - ], - "categories": [ - "Information" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Ledfeedback Skill", - "android_handler": "ledfeedback-skill.martijnvanbeers.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-09-23T08:32:23Z", - "archived": false, - "license": "mit", - "modified": "2020-09-28T11:23:29Z", - "authorname": "Lenteguppie", - "skillname": "Zod Calendar", - "foldername": "zod-calendar-skill", - "name": "Zod Calendar", - "url": "https://github.com/Lenteguppie/zod-calendar-skill", - "category": "Productivity", - "description": "", - "short_description": "The google calendar integration for mycroft", - "branch": "master", - "examples": [ - "What are my appointments?", - "What are my upcomming events?", - "Insert event.", - "Insert appointment.", - "What are my appointments", - "What are my upcomming events", - "Insert event", - "Insert appointment" - ], - "tags": [ - "Calendar", - "Productivity", - "Information", - "calendar", - "Google", - "Google calendar", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/calendar-alt.svg", - "credits": [ - "Lenteguppie" - ], - "categories": [ - "Productivity", - "Information" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Zod Calendar Skill", - "android_handler": "zod-calendar-skill.lenteguppie.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-06-14T19:50:19Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-06-23T08:21:20Z", - "authorname": "JarbasSkills", - "skillname": "skill-algorithmic-art", - "foldername": "skill-algorithmic-art", - "name": "Algorithmic Art Skill", - "url": "https://github.com/JarbasSkills/skill-algorithmic-art", - "category": "Entertainment", - "description": "Creating art from math\n\nsee example generated pictures in [samples folder](./samples)\n\n![](./screenshot.png)", - "short_description": "Idle screen skill for mycroft mark2", - "branch": "master", - "examples": [ - "Draw a picture.", - "draw a picture" - ], - "tags": [ - "screensaver", - "Entertainment", - "art", - "entertainment", - "-", - "no-license" - ], - "platforms": [ - "all", - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "stars": 1, - "credits": [ - "JarbasAl", - "Inspired by [Random (Psychedelic) Art](https://jeremykun.com/2012/01/01/random-psychedelic-art/)" - ], - "categories": [ - "Entertainment" - ], - "logo": "https://raw.githubusercontent.com/JarbasSkills/skill-algorithmic-art/master/logo.png", - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Algorithmic Art Skill", - "android_handler": "skill-algorithmic-art.jarbasskills.home" - }, - "desktop": {}, - "desktopFile": false, - "systemDeps": false - }, - { - "created": "2020-04-07T01:30:07Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-05-08T18:36:08Z", - "authorname": "stratus-ss", - "skillname": "About This Skill", - "foldername": "mycroft-ourgroceries-skill", - "name": "About This Skill", - "url": "https://github.com/stratus-ss/mycroft-ourgroceries-skill", - "category": null, - "description": "", - "short_description": "", - "branch": "master", - "examples": [ - "Add the category {Category} to (my | the) (list | shopping list | grocery list)", - "Create the category {Category} in (my |the ) (list | shopping list | grocery list)", - "Add {Food} to (| (the | my)) {ShoppingList} (| list) (under {Category} |)", - "(please |) add multiple items to (| (the | my)) {ShoppingList} (under {Category} |)", - "I want to add multiple items to (| (the | my)) {ShoppingList} (under {Category} |)", - "Start a new list called {ListName}", - "Create a new list called {ListName}", - "Create a list called {ListName}", - "Start a list called {ListName}", - "add the category {Category} to (my | the) (list | shopping list | grocery list)", - "create the category {Category} in (my |the ) (list | shopping list | grocery list)", - "add {Food} to (| (the | my)) {ShoppingList} (| list) (under {Category} |)", - "start a new list called {ListName}", - "create a new list called {ListName}", - "create a list called {ListName}", - "start a list called {ListName}" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "stratus-ss" - ], - "requirements": { - "python": [ - "ourgroceries>=1.3.5" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Ourgroceries Skill", - "android_handler": "mycroft-ourgroceries-skill.stratus-ss.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-04-15T13:24:03Z", - "archived": false, - "license": "mit", - "modified": "2020-04-18T18:23:05Z", - "authorname": "hanabouzid", - "skillname": "YOUR SKILL NAME", - "foldername": "eventRoomSkill", - "name": "YOUR SKILL NAME", - "url": "https://github.com/hanabouzid/eventRoomSkill", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Eventroomskill Skill", - "android_handler": "eventRoomSkill.hanabouzid.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-05-14T23:12:06Z", - "archived": false, - "license": "unknown", - "modified": "2020-05-14T23:12:14Z", - "authorname": "rbab02", - "skillname": "Calm", - "foldername": "calm-skill", - "name": "Calm", - "url": "https://github.com/rbab02/calm-skill", - "category": "Music & Audio", - "description": "Ask mycroft to lead a meditation session in order to calm down after stress.", - "short_description": "Leads a meditation session", - "branch": "master", - "examples": [ - "I'm scared.", - "I need a break.", - "Calm me down.", - "I'm nervous.", - "I'm scared", - "I need a break", - "Calm me down", - "I'm nervous" - ], - "tags": [ - "Music", - "Audio", - "Music & Audio", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/smile.svg", - "credits": [ - "Rebecca b" - ], - "categories": [ - "Music & Audio" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Calm Skill", - "android_handler": "calm-skill.rbab02.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-08-23T15:59:07Z", - "archived": false, - "license": "unknown", - "modified": "2020-08-23T15:59:15Z", - "authorname": "Mathmada223", - "skillname": "Test", - "foldername": "test-skill", - "name": "Test", - "url": "https://github.com/Mathmada223/test-skill", - "category": "Entertainment", - "description": "This is my first ever mycroft skill and i just want to try how to program skills for the voice assistant.", - "short_description": "A little test skill", - "branch": "master", - "examples": [ - "Test.", - "Hello.", - "Hello world.", - "Test skill.", - "This is a test.", - "Small test.", - "Whats up?", - "How are you.", - "Test tets.", - "Test test." - ], - "tags": [ - "Test", - "Entertainment", - "Hello", - "world", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Test Skill", - "android_handler": "test-skill.mathmada223.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-07-21T00:42:33Z", - "archived": false, - "license": "unknown", - "modified": "2020-07-30T17:23:44Z", - "authorname": "aldeaman", - "skillname": "Skill Trigger Test", - "foldername": "skill-trigger-test-skill", - "name": "Skill Trigger Test", - "url": "https://github.com/aldeaman/skill-trigger-test-skill", - "category": "Configuration", - "description": "In an attempt to diagnose other skills, this skill was developed to determine if mycroft is triggering this skill based on the intent keywords rather than either another skill or a fallback skill.", - "short_description": "This skill confirms that this skill has been triggered. nothing more.", - "branch": "master", - "examples": [ - "Read the sensor.", - "Read the sensor" - ], - "tags": [ - "Configuration", - "Skill", - "test", - "Skill test", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/check.svg", - "credits": [ - "Aldeaman" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Trigger Test Skill", - "android_handler": "skill-trigger-test-skill.aldeaman.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-06-27T03:52:43Z", - "archived": false, - "license": "unknown", - "modified": "2020-07-22T23:39:23Z", - "authorname": "Kervball", - "skillname": "Deskcontrol", - "foldername": "deskcontrol-skill", - "name": "Deskcontrol", - "url": "https://github.com/Kervball/deskcontrol-skill", - "category": "Daily", - "description": "Using the gpio pinout this skill will turn on and off lights that are attached to mosfets", - "short_description": "Controls gpio pinout", - "branch": "master", - "examples": [ - "Front lights Blue.", - "Kill the Back Lights.", - "Turn on Both lights White.", - "Front lights Blue", - "Kill the Back Lights", - "Turn on Both lights White" - ], - "tags": [ - "simple-skill", - "Light", - "mycroft-gpio", - "Gpio", - "mycoft-skill", - "Daily", - "control", - "Light control", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/lightbulb.svg", - "credits": [ - "Kervball" - ], - "categories": [ - "Daily" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Deskcontrol Skill", - "android_handler": "deskcontrol-skill.kervball.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-05-21T01:56:18Z", - "archived": false, - "license": "mit", - "modified": "2020-05-21T01:56:26Z", - "authorname": "jrwarwick", - "skillname": "Terraria Server Manager", - "foldername": "terraria-server-manager-skill", - "name": "Terraria Server Manager", - "url": "https://github.com/jrwarwick/terraria-server-manager-skill", - "category": "Entertainment", - "description": "Terraria game servers that run too long unattended may cause in-game corruption spread. therefore, shutting down in a convenient way is desirable!", - "short_description": "Now mycroft is your friendly lan dedicated terraria server admin.", - "branch": "master", - "examples": [ - "Stop terraria server.", - "Start terraria server.", - "Launch terraria server.", - "Halt terraria server.", - "Stop terraria server", - "Start terraria server", - "Launch terraria server", - "Halt terraria server" - ], - "tags": [ - "Entertainment", - "games", - "lan,", - "Terraria,", - "Terraria, lan, games", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/gamepad.svg", - "credits": [ - "jrwarwick" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Terraria Server Manager Skill", - "android_handler": "terraria-server-manager-skill.jrwarwick.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-03-23T18:03:58Z", - "archived": false, - "license": "mit", - "modified": "2020-03-24T14:17:15Z", - "authorname": "hanabouzid", - "skillname": "YOUR SKILL NAME", - "foldername": "Rfid-reader", - "name": "YOUR SKILL NAME", - "url": "https://github.com/hanabouzid/Rfid-reader", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Rfid Reader Skill", - "android_handler": "Rfid-reader.hanabouzid.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-10-22T02:53:13Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-22T03:01:14Z", - "authorname": "JarbasSkills", - "skillname": "skill-trve-kvlt", - "foldername": "skill-trve-kvlt", - "name": "Black Metal Music Catalog", - "url": "https://github.com/JarbasSkills/skill-trve-kvlt", - "category": "Entertainment", - "description": "Extensive library of Black Metal music for mycroft\n\n![](gui.png)\n![](gui.gif)", - "short_description": "![](./res/trvekvlt_logo.png)", - "branch": "v0.1", - "examples": [ - "Open black metal menu.", - "Play black metal.", - "open black metal menu", - "play black metal" - ], - "tags": [ - "music", - "video", - "Entertainment", - "entertainment", - "black-metal", - "no-license" - ], - "platforms": [ - "all", - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "stars": 0, - "icon": "https://github.com/JarbasSkills/skill-trve-kvlt/res/icon/trvekvlt_icon.png", - "credits": [ - "JarbasAl", - "[AIIX ](https://github.com/AIIX/) - GUI" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [ - "ovos_utils>=0.0.8a1", - "json_database>=0.2.1", - "py_VOD>=0.4.0" - ], - "skill": [ - "https://github.com/JarbasSkills/skill-better-playback-control" - ], - "system": {} - }, - "android": { - "android_icon": "/res/icon/trvekvlt_icon.png", - "android_name": "Trve Kvlt Black Metal", - "android_handler": "skill-trve-kvlt.jarbasskills.home" - }, - "desktop": { - "X-DBUS-StartupType": "None", - "X-KDE-StartupNotify": "false", - "Version": "1.0", - "Terminal": "false", - "Type": "Application", - "Name": "Trve Kvlt Black Metal", - "Exec": "mycroft-gui-app --hideTextInput --skill=skill-trve-kvlt.jarbasskills.home", - "Icon": "trvekvlt_icon", - "Categories": "VoiceApp", - "StartupNotify": "false" - }, - "desktopFile": false, - "systemDeps": false - }, - { - "created": "2020-10-22T03:11:43Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-22T03:12:47Z", - "authorname": "JarbasSkills", - "skillname": "skill-smod", - "foldername": "skill-smod", - "name": "Stoned Meadow of Doom Skill", - "url": "https://github.com/JarbasSkills/skill-smod", - "category": "Entertainment", - "description": "Stoner Doom for mycroft\n\n![](./gui.png)\n![](./gui.gif)\n![](./gui2.gif)", - "short_description": "![](./res/smod_logo.png)", - "branch": "v0.1", - "examples": [ - "Open stoned meadow of doom.", - "Play stoner doom.", - "open stoned meadow of doom", - "play stoner doom" - ], - "tags": [ - "music", - "doom", - "video", - "Entertainment", - "entertainment", - "no-license" - ], - "platforms": [ - "all", - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "stars": 0, - "icon": "https://github.com/JarbasSkills/skill-smod/res/icon/smod_icon.png", - "credits": [ - "JarbasAl", - "[AIIX](https://github.com/AIIX/) - GUI ", - "[SMOD](https://www.youtube.com/c/StonedMeadowOfDoom1993/)" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [ - "json_database>=0.2.1", - "py_VOD>=0.3.1", - "ovos_utils>=0.0.8a1" - ], - "skill": [ - "https://github.com/JarbasSkills/skill-better-playback-control" - ], - "system": {} - }, - "android": { - "android_icon": "/res/icon/smod_icon.png", - "android_name": "SMOD", - "android_handler": "skill-smod.jarbasskills.home" - }, - "desktop": { - "X-DBUS-StartupType": "None", - "X-KDE-StartupNotify": "false", - "Version": "1.0", - "Terminal": "false", - "Type": "Application", - "Name": "SMOD", - "Exec": "mycroft-gui-app --hideTextInput --skill=skill-smod.jarbasskills.home", - "Icon": "smod_icon", - "Categories": "VoiceApp", - "StartupNotify": "false" - }, - "desktopFile": false, - "systemDeps": false - }, - { - "created": "2020-09-02T15:10:02Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-09-02T15:11:25Z", - "authorname": "whtecmp", - "skillname": "Vapm", - "foldername": "vapm", - "name": "Vapm", - "url": "https://github.com/whtecmp/vapm", - "category": "Productivity", - "description": "Allows mycroft to manage packages on your computer.\n\nyou can search, install, remove and manage your packages with voice commands using vapm.\n\nvapm is built on top of your existing package manager (i.e. APT).", - "short_description": "Voice assisted package manager", - "branch": "master", - "examples": [ - "Search for package python.", - "Install package gcc.", - "Search for package python", - "Install package gcc" - ], - "tags": [ - "Productivity", - "Packages", - "Dwa", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/atlas.svg", - "categories": [ - "Productivity" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Vapm Skill", - "android_handler": "vapm.whtecmp.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-07-13T18:18:28Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-07-13T18:18:35Z", - "authorname": "legend-patrick", - "skillname": "Patrick Lights Off", - "foldername": "patrick-lights-off-skill", - "name": "Patrick Lights Off", - "url": "https://github.com/legend-patrick/patrick-lights-off-skill", - "category": "IoT", - "description": "Built a wan using mycroft and xbee zigbee mesh network. this skill turn the classroom lights on by sending a message to the servos controlling the lights\n\n>", - "short_description": "High school computer science smart classroom. lights off skill.", - "branch": "master", - "examples": [ - "Classroom lights off.", - "Classroom lights off" - ], - "tags": [ - "IoT", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/lightbulb.svg", - "credits": [ - "Derek Stasiak" - ], - "categories": [ - "IoT" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Patrick Lights Off Skill", - "android_handler": "patrick-lights-off-skill.legend-patrick.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-09-15T03:10:16Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-09-15T04:42:39Z", - "authorname": "seeamkhan", - "skillname": "Play Vlc", - "foldername": "play-vlc-skill", - "name": "Play Vlc", - "url": "https://github.com/seeamkhan/play-vlc-skill", - "category": "Music & Audio", - "description": "Play music, playlist, mp3 files from local storage, local hdd or local memory of mycroft using vlc player.", - "short_description": "Play music from local memory using vlc", - "branch": "master", - "examples": [ - "Play any music.", - "Play random music.", - "Play song.", - "Play music from your memory.", - "Play my music.", - "Play music from computer.", - "Play local music.", - "Play any music", - "Play random music", - "Play song", - "Play music from your memory", - "Play my music", - "Play music from computer", - "Play local music" - ], - "tags": [ - "music", - "Local", - "Music", - "Audio", - "play", - "Vlc", - "Music & Audio", - "Local music play", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/music.svg", - "credits": [ - "sparrow" - ], - "categories": [ - "Music & Audio" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Play Vlc Skill", - "android_handler": "play-vlc-skill.seeamkhan.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-10-20T18:59:43Z", - "archived": false, - "license": "mit", - "modified": "2020-10-20T18:59:51Z", - "authorname": "danielleamya", - "skillname": "Mycroft Delivery Service", - "foldername": "mycroft-delivery-service-skill", - "name": "Mycroft Delivery Service", - "url": "https://github.com/danielleamya/mycroft-delivery-service-skill", - "category": "IoT", - "description": "Begins the package delivery service pipeline. will send a message to the orchestrator to delivera loaded package.", - "short_description": "Package delivery service pipeline begin", - "branch": "master", - "examples": [ - "Can you deliver this package.", - "Can you take this package.", - "Can you bring this package.", - "I have loaded a package for you to deliver.", - "Can you deliver this package", - "Can you take this package", - "Can you bring this package", - "I have loaded a package for you to deliver" - ], - "tags": [ - "IoT", - "Service", - "Delivery", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/box.svg", - "credits": [ - "Danielle McPhatter" - ], - "categories": [ - "IoT", - "Delivery", - "Service" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Delivery Service Skill", - "android_handler": "mycroft-delivery-service-skill.danielleamya.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-05-07T11:58:13Z", - "archived": false, - "license": "mit", - "modified": "2020-05-07T22:47:14Z", - "authorname": "hanabouzid", - "skillname": "YOUR SKILL NAME", - "foldername": "testregskill", - "name": "YOUR SKILL NAME", - "url": "https://github.com/hanabouzid/testregskill", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Testregskill Skill", - "android_handler": "testregskill.hanabouzid.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-07-02T02:15:39Z", - "archived": false, - "license": "mit", - "modified": "2020-07-02T02:15:47Z", - "authorname": "jrwarwick", - "skillname": "Halo Protocol", - "foldername": "halo-protocol-skill", - "name": "Halo Protocol", - "url": "https://github.com/jrwarwick/halo-protocol-skill", - "category": "Entertainment", - "description": "Mycroft plays the part of a companion ai to the cortana ai to start the players on an adventure.", - "short_description": "Part of a make-believe game set in the halo universe.", - "branch": "master", - "examples": [ - "Initiate halo protocol.", - "Start the halo adventure.", - "Initiate halo protocol", - "Start the halo adventure" - ], - "tags": [ - "Entertainment", - "Toy,game,fiction", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "jrwarwick" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Halo Protocol Skill", - "android_handler": "halo-protocol-skill.jrwarwick.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-09-03T22:49:15Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-09-11T02:13:26Z", - "authorname": "humairan", - "skillname": "Speech Rate", - "foldername": "speech-rate-skill", - "name": "Speech Rate", - "url": "https://github.com/humairan/speech-rate-skill", - "category": "Configuration", - "description": "Updates \"duration_stretch\" value in mycroft configuration settings to slow down or speed up the rate at which mimic outputs each word", - "short_description": "Changes the rate at which mimic tts responds to users", - "branch": "master", - "examples": [ - "Make rate fast.", - "Increase speech rate.", - "Change rate to slow.", - "Make rate fast", - "Increase speech rate", - "Change rate to slow" - ], - "tags": [ - "rate", - "Rate", - "Audio", - "Speech", - "Configuration", - "Daily", - "Speech rate", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/assistive-listening-systems.svg", - "credits": [ - "humaira niazi" - ], - "categories": [ - "Configuration", - "Daily" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Speech Rate Skill", - "android_handler": "speech-rate-skill.humairan.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-07-16T23:00:40Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-07-23T00:01:36Z", - "authorname": "Kervball", - "skillname": "Startuplight", - "foldername": "startuplight-skill", - "name": "Startuplight", - "url": "https://github.com/Kervball/startuplight-skill", - "category": "Configuration", - "description": "Skill uses wiringpi to have a gpio pin fade a light red as starting up and blue when wake word is activated", - "short_description": "Trigger gpio on wakeword and on startup", - "branch": "master", - "examples": [ - "Hello.", - "Hello" - ], - "tags": [ - "Configuration", - "Mycroft", - "Wakeword", - "Startup", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/comment.svg", - "credits": [ - "Kervball" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Startuplight Skill", - "android_handler": "startuplight-skill.kervball.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-04-18T19:41:48Z", - "archived": false, - "license": "mit", - "modified": "2020-06-07T06:20:44Z", - "authorname": "hanabouzid", - "skillname": "YOUR SKILL NAME", - "foldername": "MeetingSkill", - "name": "YOUR SKILL NAME", - "url": "https://github.com/hanabouzid/MeetingSkill", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Meetingskill Skill", - "android_handler": "MeetingSkill.hanabouzid.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-04-06T22:56:29Z", - "archived": false, - "license": "mit", - "modified": "2020-04-10T16:23:15Z", - "authorname": "hanabouzid", - "skillname": "YOUR SKILL NAME", - "foldername": "CreateEventSkill", - "name": "YOUR SKILL NAME", - "url": "https://github.com/hanabouzid/CreateEventSkill", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Createeventskill Skill", - "android_handler": "CreateEventSkill.hanabouzid.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-07-26T22:23:22Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-07-27T14:13:28Z", - "authorname": "rs13885", - "skillname": "Hdmi Cec Control", - "foldername": "hdmi-cec-control-skill", - "name": "Hdmi Cec Control", - "url": "https://github.com/rs13885/hdmi-cec-control-skill", - "category": "IoT", - "description": "Use mycroft to trigger commands to control hdmi cec devices", - "short_description": "Control hdmi cec devices", - "branch": "master", - "examples": [ - "Turn on tv.", - "Turn off tv.", - "Turn tv volume up.", - "Turn tv volume down.", - "Hdmi cec devices.", - "Turn on tv", - "Turn off tv", - "Turn tv volume up", - "Turn tv volume down", - "Hdmi cec devices" - ], - "tags": [ - "IoT", - "audio", - "Cec", - "Television", - "Hdmi", - "Tv", - "Music", - "Media", - "Hdmi-cec", - "Music & audio", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/tv.svg", - "credits": [ - "Ricardo Soler" - ], - "categories": [ - "IoT", - "Music & audio", - "Media" - ], - "requirements": { - "python": "cec", - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Hdmi Cec Control Skill", - "android_handler": "hdmi-cec-control-skill.rs13885.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-01-08T22:40:08Z", - "archived": false, - "license": "mit", - "modified": "2020-01-24T21:38:28Z", - "authorname": "Drjansson", - "skillname": "YOUR SKILL NAME", - "foldername": "call_local_script-mycroft-skill", - "name": "YOUR SKILL NAME", - "url": "https://github.com/Drjansson/call_local_script-mycroft-skill", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Call_Local_Script Mycroft Skill", - "android_handler": "call_local_script-mycroft-skill.drjansson.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-03-27T13:26:38Z", - "archived": false, - "license": "unknown", - "modified": "2020-03-27T14:13:49Z", - "authorname": "bijuthank", - "skillname": "Learnfinnishskill", - "foldername": "learnfinnishskill-skill", - "name": "Learnfinnishskill", - "url": "https://github.com/bijuthank/learnfinnishskill-skill", - "category": "Information", - "description": "This skill greets the user in finnish language. i am trying to develop skills for mycroft, and this skill is inspired by jorbas ai blog.", - "short_description": "This skill provides greetings in finnish language", - "branch": "master", - "examples": [ - "Talk finnish.", - "Say it in finnish.", - "Talk finnish", - "Say it in finnish" - ], - "tags": [ - "Information", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "Biju Thankachan'" - ], - "categories": [ - "Information" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Learnfinnishskill Skill", - "android_handler": "learnfinnishskill-skill.bijuthank.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-03-23T10:31:20Z", - "archived": false, - "license": "mit", - "modified": "2020-03-23T16:06:16Z", - "authorname": "hanabouzid", - "skillname": "YOUR SKILL NAME", - "foldername": "EmergencySkill", - "name": "YOUR SKILL NAME", - "url": "https://github.com/hanabouzid/EmergencySkill", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Emergencyskill Skill", - "android_handler": "EmergencySkill.hanabouzid.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-04-23T23:36:46Z", - "archived": false, - "license": "unknown", - "modified": "2020-04-23T23:38:24Z", - "authorname": "Maharava", - "skillname": "Create Task", - "foldername": "create-task-skill", - "name": "Create Task", - "url": "https://github.com/Maharava/create-task-skill", - "category": "Information", - "description": "The user can ask mycroft to enter a sentence or phrase onto a 'to-do' list type of document. originally designed to keep track of skill work i wish to do", - "short_description": "Adds a note onto a central file about a task you wish to work on", - "branch": "master", - "examples": [], - "tags": [ - "Productivity", - "Information", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/archive.svg", - "credits": [ - "SultanPepper" - ], - "categories": [ - "Information", - "Productivity" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Create Task Skill", - "android_handler": "create-task-skill.maharava.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-05-28T20:57:34Z", - "archived": false, - "license": "mit", - "modified": "2020-06-05T20:10:17Z", - "authorname": "hanabouzid", - "skillname": "YOUR SKILL NAME", - "foldername": "DeleteEventSkill", - "name": "YOUR SKILL NAME", - "url": "https://github.com/hanabouzid/DeleteEventSkill", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Deleteeventskill Skill", - "android_handler": "DeleteEventSkill.hanabouzid.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-10-22T03:03:17Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-22T03:13:02Z", - "authorname": "JarbasSkills", - "skillname": "skill-dust", - "foldername": "skill-dust", - "name": "DUST Skill", - "url": "https://github.com/JarbasSkills/skill-dust", - "category": "Entertainment", - "description": "Dust short science fiction movies for Mycroft\n\n![](./gui.png)\n![](./gui2.png)", - "short_description": "![](./res/dust_logo.png)", - "branch": "v0.2", - "examples": [ - "Open dust.", - "Play sci fi short movie.", - "Play dust.", - "open dust", - "play sci fi short movie", - "play dust", - "play science fiction short movie" - ], - "tags": [ - "scifi", - "video", - "Entertainment", - "entertainment", - "shortfilms", - "no-license" - ], - "platforms": [ - "all", - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "stars": 0, - "icon": "https://github.com/JarbasSkills/skill-dust/res/icon/dust_icon.png", - "credits": [ - "JarbasAl", - "[AIIX ](https://github.com/AIIX/) - GUI", - "[Dust](https://www.youtube.com/c/watchdust)" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [ - "json_database>=0.2.1", - "ovos_utils>=0.0.8a2", - "py_VOD>=0.3.1" - ], - "skill": [ - "https://github.com/JarbasSkills/skill-better-playback-control" - ], - "system": {} - }, - "android": { - "android_icon": "/res/icon/dust_icon.png", - "android_name": "DUST", - "android_handler": "skill-dust.jarbasskills.home" - }, - "desktop": { - "X-DBUS-StartupType": "None", - "X-KDE-StartupNotify": "false", - "Version": "1.0", - "Terminal": "false", - "Type": "Application", - "Name": "DUST", - "Exec": "mycroft-gui-app --hideTextInput --skill=skill-dust.jarbasskills.home", - "Icon": "dust_icon", - "Categories": "VoiceApp", - "StartupNotify": "false" - }, - "desktopFile": false, - "systemDeps": false - }, - { - "created": "2020-09-01T10:28:09Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-10-22T02:52:01Z", - "authorname": "JarbasSkills", - "skillname": "MyTVtoGo Skill", - "foldername": "skill-mytvtogo", - "name": "MyTVtoGo Skill", - "url": "https://github.com/JarbasSkills/skill-mytvtogo", - "category": "Entertainment", - "description": "MyTVtoGo for mycroft\n\n![](./mytvtogo.png)", - "short_description": "![](./res/MyTVToGo_bg.png)", - "branch": "dev", - "examples": [ - "Open mytvtogo.", - "Play tv.", - "Play nasa tv.", - "Play music tv.", - "Play my tv to go news.", - "open mytvtogo", - "play tv", - "play nasa tv", - "play music tv", - "play my tv to go news" - ], - "tags": [ - "iptv", - "Entertainment", - "video", - "entertainment", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://github.com/JarbasSkills/skill-mytvtogo/res/MyTVToGo_icon_bg.png", - "credits": [ - "JarbasAl", - "[AIIX ](https://github.com/AIIX/) - for GUI", - "[MyTVtoGo](https://mytvtogo.net/) " - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [ - "ovos_utils>=0.0.4rc2", - "json_database>=0.2.1", - "py_VOD>=0.3.1" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": "/res/icon/mytvtogo-logo.png", - "android_name": "MyTvToGo", - "android_handler": "skill-mytvtogo.jarbasskills.home" - }, - "desktop": { - "X-DBUS-StartupType": "None", - "X-KDE-StartupNotify": "false", - "Version": "1.0", - "Terminal": "false", - "Type": "Application", - "Name": "MyTvToGo", - "Exec": "mycroft-gui-app --hideTextInput --skill=skill-mytvtogo.jarbasskills.home", - "Icon": "mytvtogo-logo", - "Categories": "VoiceApp", - "StartupNotify": "false" - }, - "desktopFile": true - }, - { - "created": "2020-07-04T11:57:50Z", - "archived": false, - "license": "mit", - "modified": "2020-07-16T11:00:48Z", - "authorname": "hanabouzid", - "skillname": "YOUR SKILL NAME", - "foldername": "IotSkill", - "name": "YOUR SKILL NAME", - "url": "https://github.com/hanabouzid/IotSkill", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Iotskill Skill", - "android_handler": "IotSkill.hanabouzid.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-03-25T11:37:34Z", - "archived": false, - "license": "mit", - "modified": "2020-03-25T11:38:55Z", - "authorname": "hanabouzid", - "skillname": "YOUR SKILL NAME", - "foldername": "hanabouzid-Rfid-writer", - "name": "YOUR SKILL NAME", - "url": "https://github.com/hanabouzid/hanabouzid-Rfid-writer", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Hanabouzid Rfid Writer Skill", - "android_handler": "hanabouzid-Rfid-writer.hanabouzid.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-03-18T10:10:12Z", - "archived": false, - "license": "mit", - "modified": "2020-03-18T11:05:21Z", - "authorname": "hanabouzid", - "skillname": "YOUR SKILL NAME", - "foldername": "CoronaVirusSkill", - "name": "YOUR SKILL NAME", - "url": "https://github.com/hanabouzid/CoronaVirusSkill", - "category": null, - "description": "A more verbose description, including any extra instructions or\ninformation that didn't fit in the one line.", - "short_description": "", - "branch": "master", - "examples": [ - "Hello world.", - "Greetings planet earth.", - "Count up.", - "Count down.", - "Hello world", - "Greetings planet earth", - "Count up", - "Count down" - ], - "tags": [ - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "credits": [ - "Your name" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Coronavirusskill Skill", - "android_handler": "CoronaVirusSkill.hanabouzid.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-07-13T17:52:17Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-07-13T17:52:25Z", - "authorname": "legend-patrick", - "skillname": "Patrick Lights On", - "foldername": "patrick-lights-on-skill", - "name": "Patrick Lights On", - "url": "https://github.com/legend-patrick/patrick-lights-on-skill", - "category": "IoT", - "description": "Built a wan using mycroft and xbee zigbee mesh network. this skill turn the classroom lights on by sending a message to the servos controlling the lights", - "short_description": "High school computer science smart classroom. lights on skill", - "branch": "master", - "examples": [ - "Classroom lights on.", - "Classroom lights on" - ], - "tags": [ - "IoT", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/lightbulb.svg", - "credits": [ - "Derek Stasiak" - ], - "categories": [ - "IoT" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Patrick Lights On Skill", - "android_handler": "patrick-lights-on-skill.legend-patrick.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-01-02T16:51:00Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-01-02T16:51:09Z", - "authorname": "Blubbaa", - "skillname": "Ikea Tradfri", - "foldername": "ikea-tradfri-skill", - "name": "Ikea Tradfri", - "url": "https://github.com/Blubbaa/ikea-tradfri-skill", - "category": "IoT", - "description": "Connect to a ikea gateway for tradfri smart home devices and control all registered devices (currently limited to lights) from mycroft.", - "short_description": "Control your tradfri lights via voice commands", - "branch": "master", - "examples": [ - "Switch on the lights.", - "Turn on the living room.", - "Turn on the floor lamp.", - "Turn on the dining table.", - "Switch on the lights", - "Turn on the living room", - "Turn on the floor lamp", - "Turn on the dining table" - ], - "tags": [ - "IoT", - "home", - "Smart", - "Light", - "Tradfri", - "Ikea", - "Smart home", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/lightbulb.svg", - "credits": [ - "Jonas Fuchs" - ], - "categories": [ - "IoT" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Ikea Tradfri Skill", - "android_handler": "ikea-tradfri-skill.blubbaa.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-06-15T15:48:44Z", - "archived": false, - "license": "unknown", - "modified": "2020-06-15T15:48:51Z", - "authorname": "gravesjohnr", - "skillname": "Show Webpage", - "foldername": "show-webpage-skill", - "name": "Show Webpage", - "url": "https://github.com/gravesjohnr/show-webpage-skill", - "category": "Information", - "description": "This skill can be configured to show various webpages based on naming in the configuration.", - "short_description": "This shows a webage using the standard mycroft-gui environment.", - "branch": "master", - "examples": [ - "Show me my basement.", - "Show me the front porch camera.", - "Show me joke of the day.", - "Show me my basement", - "Show me the front porch camera", - "Show me joke of the day" - ], - "tags": [ - "Webpage", - "display", - "Productivity", - "Information", - "Daily", - "browser", - "Webpage browser display", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/laptop-code.svg", - "credits": [ - "John Graves" - ], - "categories": [ - "Information", - "Daily", - "Productivity" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Show Webpage Skill", - "android_handler": "show-webpage-skill.gravesjohnr.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-04-16T19:46:12Z", - "archived": false, - "license": "unknown", - "modified": "2020-05-19T20:55:28Z", - "authorname": "INsiteLabDev", - "skillname": "Rate", - "foldername": "rate-skill", - "name": "Rate", - "url": "https://github.com/INsiteLabDev/rate-skill", - "category": "Configuration", - "description": "Based on user's verbal commands, mycroft adjusts rate of the output. user can increase or decrease rate, or even specify a specific percentage to which they want the output spoken", - "short_description": "Adjusts the rate based on user commands", - "branch": "master", - "examples": [ - "Increase rate.", - "Turn up the rate.", - "Turn up rate.", - "Make rate faster.", - "Increase rate", - "Turn up the rate", - "Turn up rate", - "Make rate faster" - ], - "tags": [ - "Rate", - "Accessibility", - "audio", - "Adjust", - "Audio", - "Sound", - "Configuration", - "Music", - "Productivity", - "Settings", - "Daily", - "Music & audio", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/assistive-listening-systems.svg", - "credits": [ - "INsiteLabDev" - ], - "categories": [ - "Configuration", - "Music & audio", - "Productivity", - "Daily" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Rate Skill", - "android_handler": "rate-skill.insitelabdev.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-09-01T09:12:35Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-09-01T09:14:04Z", - "authorname": "AIIX", - "skillname": "Plasma Activites", - "foldername": "temp-activities", - "name": "Plasma Activites", - "url": "https://github.com/AIIX/temp-activities", - "category": "Productivity", - "description": "This skill integrates plasma-shell activities with mycroft which enables users to control their desktop activities via voice on the go, users can create activities, switch, remove, stop and display activities on their desktops.", - "short_description": "Control Your Plasmashell Activities", - "branch": "master", - "examples": [ - "Create new activity 'Activity Name.", - "Show current Activities.", - "Kill activity 'Activity Name.", - "Switch to activity 'Activity Name.", - "Remove activity 'Activity Name.", - "create new activity 'Activity Name'", - "show current Activities", - "kill activity 'Activity Name'", - "switch to activity 'Activity Name'", - "remove activity 'Activity Name'" - ], - "tags": [ - "activities", - "plasma", - "desktop", - "Productivity", - "kde", - "switch", - "control", - "no-license" - ], - "platforms": [ - "platform_plasmoid" - ], - "stars": 0, - "icon": "https://rawgithub.com/FortAwesome/Font-Awesome/master/advanced-options/raw-svg/solid/chalkboard-teacher.svg", - "credits": [ - "@AIIX" - ], - "categories": [ - "Productivity" - ], - "requirements": { - "python": [ - "dbus-python" - ], - "system": { - "all": "libdbus-1-dev libdbus-glib-1-dev" - }, - "skill": [] - }, - "android": { - "android_icon": null, - "android_name": "Temp Activities Skill", - "android_handler": "temp-activities.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-08-25T19:36:00Z", - "archived": false, - "license": "unknown", - "modified": "2020-09-01T12:00:51Z", - "authorname": "MrRKernelPanic", - "skillname": "Greetings", - "foldername": "greetings-skill", - "name": "Greetings", - "url": "https://github.com/MrRKernelPanic/greetings-skill", - "category": "Information", - "description": "Hopefully this skill will allow mycroft to answer simple greets with some sort of response, e.g. hello, goodbye or good afternoon.", - "short_description": "Adds some responses to common greetings", - "branch": "master", - "examples": [ - "Hello.", - "Good evening.", - "Goodbye.", - "Bye.", - "Good morning.", - "Good afternoon.", - "How are you.", - "You are the bomb.", - "Hello", - "Good evening", - "Goodbye", - "Bye", - "Good morning", - "Good afternoon", - "How are you", - "You are the bomb / da bomb" - ], - "tags": [ - "Greetings", - "How", - "evening", - "morning", - "Good", - "afternoon", - "you", - "Information", - "are", - "Hello", - "Goodbye", - "Good evening", - "How are you", - "Good morning", - "Good afternoon", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/grin.svg", - "credits": [ - "Mark Routledge" - ], - "categories": [ - "Information" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Greetings Skill", - "android_handler": "greetings-skill.mrrkernelpanic.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-05-21T19:33:55Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-05-21T19:34:35Z", - "authorname": "jlibbey98", - "skillname": "Google Calendar", - "foldername": "google-calendar-skill", - "name": "Google Calendar", - "url": "https://github.com/jlibbey98/google-calendar-skill", - "category": "Productivity", - "description": "Connect this skill to your google calendar account so that mycroft can access and list your events every day.", - "short_description": "Lists your google calendar events for the day", - "branch": "master", - "examples": [ - "What's going on today?", - "What do i have today?", - "What's scheduled for today?", - "What's my schedule for today?", - "What do i have scheduled today?", - "What do i have going on today?", - "What's going on today", - "What do i have today", - "What's scheduled for today", - "What's my schedule for today", - "What do i have scheduled today", - "What do i have going on today" - ], - "tags": [ - "Productivity", - "Daily", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/calendar.svg", - "credits": [ - "jlibbey98" - ], - "categories": [ - "Productivity", - "Daily" - ], - "requirements": { - "python": [ - "datetime", - "google-auth-oauthlib", - "pytz", - "google-api-python-client", - "json", - "google-auth-httplib2" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Google Calendar Skill", - "android_handler": "google-calendar-skill.jlibbey98.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-07-15T09:24:44Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-10-19T12:58:58Z", - "authorname": "SamHarris2020", - "skillname": "Air Quality", - "foldername": "air-quality-index-skill", - "name": "Air Quality", - "url": "https://github.com/SamHarris2020/air-quality-index-skill", - "category": "Daily", - "description": "A Mycroft open source app that gets your local air quality conditions and an upcoming forecast. Provides reports on ozone, fine particulate matter and the uv index using data [The World Air Quality Index Project](https://aqicn.org/contact/)", - "short_description": "", - "branch": "master", - "examples": [ - "What's the air quality today: Fine Particulates, UV and Ozone are Good?", - "How's the air: Fine Particulates are Unhealthy, UV is Good and Ozone is Moderate." - ], - "tags": [ - "index", - "aqi", - "quality", - "ozone", - "air", - "uv", - "Daily", - "Safety", - "uv index", - "air quality index", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/wind.svg", - "credits": [ - "Sam Harris" - ], - "categories": [ - "Daily" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Air Quality Index Skill", - "android_handler": "air-quality-index-skill.samharris2020.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-06-23T16:31:41Z", - "archived": false, - "license": "mit", - "modified": "2020-06-23T16:38:17Z", - "authorname": "kcalvelli", - "skillname": "Get Up And Move", - "foldername": "get-up-and-move-skill", - "name": "Get Up And Move", - "url": "https://github.com/kcalvelli/get-up-and-move-skill", - "category": "Daily", - "description": "Most folks spend far too much time sitting, and often get so involved in their current tasks that they forget to move. With this skill, every half hour, Mycroft will remind you to get up and move around a little.", - "short_description": "Reminds you to stand up and move around every half hour", - "branch": "master", - "examples": [ - "Remind me to stand every half hour.", - "Remind me to get up and move.", - "Remind me to take a break.", - "Remind me to stand every half hour", - "Remind me to get up and move", - "Remind me to take a break" - ], - "tags": [ - "Daily", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/walking.svg", - "credits": [ - "kcalvelli" - ], - "categories": [ - "Daily" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Get Up And Move Skill", - "android_handler": "get-up-and-move-skill.kcalvelli.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-01-16T14:52:33Z", - "archived": false, - "license": "gpl-3.0", - "modified": "2020-01-16T14:53:31Z", - "authorname": "guendelman", - "skillname": "Dice", - "foldername": "dice-skill", - "name": "Dice", - "url": "https://github.com/guendelman/dice-skill", - "category": "Entertainment", - "description": "This skill enables mycroft to generate random numbers for you. \nYou either need to specify a range or type of dice (e.g. d20).\n\nPerfect whenever you need to generate a random number, but don't have a dice nearby.", - "short_description": "Generates random numbers for you", - "branch": "master", - "examples": [ - "Roll a dice.", - "Roll a d20.", - "Generate a random number between 0 and 5.", - "roll a dice", - "roll a d20", - "generate a random number between 0 and 5" - ], - "tags": [ - "dice", - "Entertainment", - "dnd", - "random", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/dice.svg", - "credits": [ - "@Dragoncraft89" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Dice Skill", - "android_handler": "dice-skill.guendelman.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-05-27T22:43:58Z", - "archived": false, - "license": "unknown", - "modified": "2020-05-27T22:44:08Z", - "authorname": "roytaimoor", - "skillname": "Feed The Corgi", - "foldername": "feed-the-corgi-skill", - "name": "Feed The Corgi", - "url": "https://github.com/roytaimoor/feed-the-corgi-skill", - "category": "Media", - "description": "", - "short_description": "Every 24 hours, mycroft will send you a reminder to feed your corgi, and tell you what your corgi was fed the previous day, so you can provide a different delicious meal for your precious corgi.", - "branch": "master", - "examples": [ - "Have i fed the corgi today.", - "What did i feed the corgi yesterday?", - "Remind me to feed the corgi at 5pm.", - "Have i fed the corgi today", - "What did i feed the corgi yesterday", - "Remind me to feed the corgi at 5pm" - ], - "tags": [ - "Media", - "Tot", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/circle.svg", - "credits": [ - "Roytaimoor" - ], - "categories": [ - "Media", - "Tot" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Feed The Corgi Skill", - "android_handler": "feed-the-corgi-skill.roytaimoor.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-06-19T19:21:48Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-06-22T21:05:08Z", - "authorname": "gras64", - "skillname": "Morse", - "foldername": "morse-skill", - "name": "Morse", - "url": "https://github.com/gras64/morse-skill", - "category": "Entertainment", - "description": "With this skill you can morse. you can also use it to learn Morse code just say \"i want to practice morse\". \nthe speed can be set via mycroft.home. \nhave fun", - "short_description": "Do you want to practice morse", - "branch": "master", - "examples": [ - "Can you morse.", - "Morse this answer.", - "Morse for me.", - "Morse {sentence} for me.", - "Morse the sentence {sentence}", - "Can you morse", - "Morse this answer", - "Morse for me", - "morse {sentence} for me", - "morse the sentence {sentence}" - ], - "tags": [ - "**Fun,morse**", - "Entertainment", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/assistive-listening-systems.svg", - "credits": [ - "gras64\noz123\nhttps://oz123.github.io/writings/morse-fun-with-python/index.html" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Morse Skill", - "android_handler": "morse-skill.gras64.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-09-18T23:10:55Z", - "archived": false, - "license": "unknown", - "modified": "2020-09-18T23:11:03Z", - "authorname": "nanshaki", - "skillname": "Book Reader", - "foldername": "book-reader-skill", - "name": "Book Reader", - "url": "https://github.com/nanshaki/book-reader-skill", - "category": "Media", - "description": "This skilll will add the ability for mycroft to read long texts from books. the sources can be configured. it will default to audiobooks.com", - "short_description": "Read books and other literature", - "branch": "master", - "examples": [ - "Can you read a book by james joyce.", - "Can you read ulysses by james joyce.", - "Can you find some poetry to read.", - "Can you read a book by james joyce", - "Can you read ulysses by james joyce", - "Can you find some poetry to read" - ], - "tags": [ - "Book", - "audio", - "Media", - "books", - "reading", - "Book reading audio books", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/book.svg", - "credits": [ - "Nandu Vadakkath" - ], - "categories": [ - "Media" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Book Reader Skill", - "android_handler": "book-reader-skill.nanshaki.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-08-29T21:21:21Z", - "archived": false, - "license": "mit", - "modified": "2020-09-03T11:53:14Z", - "authorname": "renayo", - "skillname": "Inventory", - "foldername": "inventory-skill", - "name": "Inventory", - "url": "https://github.com/renayo/inventory-skill", - "category": "Productivity", - "description": "Allows the user to specify object and location, remove items from inventory, or move them, and so on.", - "short_description": "Tracks inventory items by location for the Mycroft voice-activated AI", - "branch": "master", - "examples": [ - "Open inventory.", - "Read inventory.", - "Add dictionary to desk in inventory.", - "Where is dictionary in inventory?", - "What is on desk in inventory?", - "Move dictionary to storage in inventory.", - "Remove dictionary from inventory.", - "Open inventory", - "Read inventory", - "Add dictionary to desk in inventory", - "Where is dictionary in inventory", - "What is on desk in inventory", - "Move dictionary to storage in inventory", - "Remove dictionary from inventory" - ], - "tags": [ - "Productivity", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/laptop-house.svg", - "credits": [ - "renayo" - ], - "categories": [ - "Productivity" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Inventory Skill", - "android_handler": "inventory-skill.renayo.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-06-29T12:47:22Z", - "archived": false, - "license": "unknown", - "modified": "2020-08-10T09:32:24Z", - "authorname": "ja-schl", - "skillname": "Nextcloud Calendar", - "foldername": "nextcloud_calendar_skill", - "name": "Nextcloud Calendar", - "url": "https://github.com/ja-schl/nextcloud_calendar_skill", - "category": "Daily", - "description": "Interact with a Nextcloud calendar. Ask for appointments, create new appointments, \ndelete appointments and even rename existing appointments.\n\nTo read about more about the project structure, code and implementation follow \nthis [Link](https://github.com/ja-schl/nextcloud_calendar_skill/blob/master/Mycroft_Projekt.md).", - "short_description": "Interact with a Nextcloud calendar.", - "branch": "master", - "examples": [ - "What is my next appointment?", - "Delete my event entitled 'Speech Interaction'.", - "Do I have an appointment on July, 24th, 2020?", - "Rename my appointment entitled 'Speech Interaction'." - ], - "tags": [ - "Nextcloud", - "Calendar", - "Productivity", - "Information", - "Daily", - "Caldav", - "no-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/calendar.svg", - "credits": [ - "Jannik S. & Jan Z." - ], - "categories": [ - "Daily", - "Productivity", - "Information" - ], - "requirements": { - "python": [ - "requests", - "caldav", - "icalendar" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Nextcloud_Calendar_Skill Skill", - "android_handler": "nextcloud_calendar_skill.ja-schl.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "created": "2020-04-02T21:51:22Z", - "archived": false, - "license": "apache-2.0", - "modified": "2020-07-02T23:01:35Z", - "authorname": "AVA-USP", - "skillname": "Query", - "foldername": "fallback-query", - "name": "Query", - "url": "https://github.com/AVA-USP/fallback-query", - "category": "Information", - "description": "Negotiates handling of questions by calling all registered Common Query Skills. This is done by sending a `question:query` message with the utterance to give the skills the posibility to report back if they can answer the question and at which confidence.", - "short_description": "Negotiates the best answer to a question", - "branch": "master", - "examples": [ - "How tall is Abraham Lincoln?", - "What is an Aardwark?", - "Why is the sky blue?" - ], - "tags": [ - "Information", - "system", - "permissive-license" - ], - "platforms": [ - "all" - ], - "stars": 0, - "last_updated": "2020-07-02T23:01:35Z", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/question.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Information" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Fallback Query Skill", - "android_handler": "fallback-query.ava-usp.home" - }, - "desktop": {}, - "desktopFile": true - } - ] -} \ No newline at end of file diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/json_database/MycroftMarketplace.jsondb b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/json_database/MycroftMarketplace.jsondb deleted file mode 100644 index 5d9563a3..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/json_database/MycroftMarketplace.jsondb +++ /dev/null @@ -1,4117 +0,0 @@ -{ - "MycroftMarketplace": [ - { - "skillname": "Unknown Handler", - "foldername": "fallback-unknown", - "url": "https://github.com/MycroftAI/fallback-unknown", - "branch": "de219550beccaaccb9310b200943ed5a2b2dbaf2", - "description": "Mycroft doesn't know how to do or answer everything (yet). This _fallback_ is how Mycroft lets you know that, unfortunately, it can't help with what you said.\n\nBut wait, there is still hope! Mycroft is working to get smarter with help from friends. For who have selected to [Opt In to the Open Dataset](https://home.mycroft.ai/#/setting/basic#opendataset), these missed phrases are aggregated and analyzed to help identify what the world _wants_ their voice assistant to do that it can't yet. So if millions of people start asking for guava growing tips, we'll promote this as an idea to be handled as a default Skill.", - "authorname": "MycroftAI", - "examples": [ - "How do I make my guava blue?", - "I need a pizza.", - "Show me the money.", - "I need a pizza", - "Show me the money" - ], - "category": "Configuration", - "tags": [ - "system", - "unknown", - "Configuration", - "fallback", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Capture unrecognized _Utterances_", - "license": "apache-2.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/question.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Fallback Unknown Skill", - "android_handler": "fallback-unknown.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Wolfram Alpha", - "foldername": "fallback-wolfram-alpha", - "url": "https://github.com/MycroftAI/fallback-wolfram-alpha", - "branch": "aabd46286b06294a6e639d294df95949d46a30cb", - "description": "Ask general-knowledge queries of your Mycroft device. If no other Skills can handle the _Intent_, [Wolfram Alpha](https://wolframalpha.com) will be queried\nto see if it can find an answer. You'll be surprised by how much it knows!\n\nFor deeper exploration, you can also request the sources behind the answer. An email will be sent to your registered account linking you to all the details within Wolfram Alpha's website.", - "authorname": "MycroftAI", - "examples": [ - "How tall is Mount Everest?", - "When was The Rocky Horror Picture Show released?", - "What is Madonna's real name?", - "What's 18 times 4?", - "How many inches in a meter?", - "Send me the source on that.", - "Send me the source on that" - ], - "category": "Information", - "tags": [ - "general-knowledge", - "Information", - "wolfram-alpha", - "fallback", - "query", - "information", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Use Wolfram Alpha for general knowledge questions", - "license": "apache-2.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/question.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Information" - ], - "requirements": { - "python": [ - "wolframalpha==3.0", - "requests>=2.13.0", - "mtranslate" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Fallback Wolfram Alpha Skill", - "android_handler": "fallback-wolfram-alpha.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Set alarms", - "foldername": "skill-alarm", - "url": "https://github.com/MycroftAI/skill-alarm", - "branch": "25ecc0261abee644257a81f20f020bb92f462970", - "description": "Set a single use alarm, daily alarms, or weekly recurring alarms.\n\n You can choose from five different alarm sounds:\n * Constant Beep\n * Four rapid beeps\n * Escalating beeps\n * Alarm bell\n * Gentle chimes", - "authorname": "MycroftAI", - "examples": [ - "Set an alarm for 9:30 am.", - "Set an alarm.", - "Set an alarm for weekdays at 7 in the morning.", - "Set an alarm for 9 pm July 14th.", - "Set an alarm for 8:00 am on Mondays.", - "Set an alarm for 8:00 am every Tuesday.", - "Set an alarm for 10:00 am on the weekends.", - "Are any alarms set?", - "Cancel my 10:00 am alarm.", - "Snooze for 30 minutes.", - "Set an alarm for 9:30 am", - "Set an alarm (Mycroft will prompt for more information)", - "Set an alarm for weekdays at 7 in the morning", - "Set an alarm for 9 pm July 14th", - "Set an alarm for 8:00 am on Mondays", - "Set an alarm for 8:00 am every Tuesday", - "Set an alarm for 10:00 am on the weekends", - "Cancel my 10:00 am alarm", - "Snooze for 30 minutes" - ], - "category": "Daily", - "tags": [ - "alarm", - "Daily", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Set alarms with Mycroft", - "license": "apache-2.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/clock.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Daily" - ], - "requirements": { - "python": [ - "pyalsaaudio" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Alarm Skill", - "android_handler": "skill-alarm.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Audio Recorder", - "foldername": "skill-audio-record", - "url": "https://github.com/MycroftAI/skill-audio-record", - "branch": "501a960d7957c83f340c58de4d25301ddb85ea51", - "description": "This Skill records audio from the microphone and allows you to play back that recording. This Skill is particularly useful when trying to diagnose microphone issues, because it allows you to \"hear\" what Mycroft is hearing.", - "authorname": "MycroftAI", - "examples": [ - "Start recording.", - "Start recording for 40 minutes.", - "Play the recording.", - "Erase recording.", - "Start recording", - "Start recording for 40 minutes", - "Play the recording", - "Erase recording" - ], - "category": "Configuration", - "tags": [ - "configuration", - "record", - "audio", - "Configuration", - "microphone", - "record-audio", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Record and playback audio", - "license": "apache-2.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/microphone.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [ - "psutil>=5.2.1" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Audio Record Skill", - "android_handler": "skill-audio-record.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Device Configuration", - "foldername": "skill-configuration", - "url": "https://github.com/MycroftAI/skill-configuration", - "branch": "9231778e959c65a4f8156923fb26d11483d72ea0", - "description": "User and device settings from [home.mycroft.ai](https://home.mycroft.ai) are\nsynchronized with your Devices. This Skill performs that synchronization and\nallows you to check your settings.\n\nYou can also change the technology used to perform Wake Word spotting. This is\nthe system that wakes the device up when you say \"Hey Mycroft\".", - "authorname": "MycroftAI", - "examples": [ - "Configuration update.", - "Update config.", - "What's your location?", - "What's your name?", - "What's the current Listener?", - "Set the Listener to Precise.", - "Set the Listener to default.", - "Configuration update", - "Update config", - "What's the current Listener? (for advanced debugging)", - "Set the Listener to Precise (for advanced debugging)", - "Set the Listener to default (for advanced debugging)" - ], - "category": "Configuration", - "tags": [ - "configuration", - "update-config", - "config", - "Configuration", - "system", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Synchronize your Device Settings with [Home](https://home.mycroft.ai).", - "license": "apache-2.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/cogs.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [ - "humanhash3", - "requests>=2.13.0" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Configuration Skill", - "android_handler": "skill-configuration.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Date and Time", - "foldername": "skill-date-time", - "url": "https://github.com/MycroftAI/skill-date-time", - "branch": "c8e602bfcc8ba72d9acabf81683314f3ff789ca1", - "description": "Get the local time or time for major cities around the world. Times\nare given in 12-hour (2:30 pm) or 24-hour format (14:30) based on the\nTime Format setting at [Home](https://home.mycroft.ai/#/setting/basic)\n\nTime can optionally be shown on a display, like a digital clock. See\nthe [Skill Setting](https://home.mycroft.ai/#/skill).", - "authorname": "MycroftAI", - "examples": [ - "What time is it?", - "What time is it in Paris?", - "Show me the time.", - "What's the date?", - "Tell me the day of the week.", - "What day is Memorial Day 2020?", - "Show me the time", - "Tell me the day of the week" - ], - "category": "Daily", - "tags": [ - "time", - "date-time", - "world-time", - "clock", - "date", - "world-clock", - "Daily", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Get the time, date, day of the week", - "license": "apache-2.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/calendar.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Daily" - ], - "requirements": { - "python": [ - "geocoder", - "tzlocal==1.3", - "timezonefinder", - "pytz==2017.2", - "holidays" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Date Time Skill", - "android_handler": "skill-date-time.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "DuckDuckGo", - "foldername": "fallback-duckduckgo", - "url": "https://github.com/MycroftAI/fallback-duckduckgo", - "branch": "7228afa108b504fc8e818f2c4e37209be8f4aa0d", - "description": "Query DuckDuckGo as a fallback when no other Skill can answer the question.\n\nUses the [DuckDuckGo API](https://duckduckgo.com/api) to provide information.", - "authorname": "MycroftAI", - "examples": [ - "Who is George Washington?", - "What is plasma?", - "Who's Madonna?" - ], - "category": "Information", - "tags": [ - "Information", - "fallback", - "query", - "search-engine", - "duckduckgo", - "searchengine", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Use DuckDuckGo to answer questions", - "license": "apache-2.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/search.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Information" - ], - "requirements": { - "python": [ - "ddg3" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Fallback Duckduckgo Skill", - "android_handler": "fallback-duckduckgo.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Hello World", - "foldername": "skill-hello-world", - "url": "https://github.com/MycroftAI/skill-hello-world", - "branch": "5886a2cc7854434630ef49561a6ab2094aec27b2", - "description": "This is a basic Hello Word Skill that takes an _Utterance_ from the user and provides a voice response - a _Dialog_. This Skill demonstrates the basic directory and file structure of a Mycroft Skill, and is a good first Skill to study if you are interested in developing Skills for the Mycroft ecosystem.\n\nIf you want to write **Skills** for Mycroft, Documentation is available:\n[Mycroft Skills Kit](https://mycroft.ai/documentation/skills/msk/)\n * [Developing a new Skill](https://mycroft.ai/documentation/skills/introduction-developing-skills/)\n * [Skill Settings](https://mycroft.ai/documentation/skills/skill-settings/)\n * [Automatic testing of your Mycroft Skill](https://mycroft.ai/documentation/skills/automatic-testing/)\n * [Skill Acceptance Process](https://mycroft.ai/documentation/skills/skills-acceptance-process/)\n * [Mycroft Skills Manager](https://mycroft.ai/documentation/msm/)\n * [Mycroft Message Bus](https://mycroft.ai/documentation/message-bus/)", - "authorname": "MycroftAI", - "examples": [ - "Hello world.", - "How are you?", - "Thank you.", - "Hello world", - "Thank you" - ], - "category": "Configuration", - "tags": [ - "first-skill", - "Configuration", - "hello", - "helloworld", - "greeting", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Introductory Skill so that Skill Authors can see how a Mycroft Skill is put together", - "license": "apache-2.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/smile.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Hello World Skill", - "android_handler": "skill-hello-world.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Installer", - "foldername": "skill-installer", - "url": "https://github.com/MycroftAI/skill-installer", - "branch": "cea3b98808aee400ece730dbdcd8957368d50983", - "description": "Add and remove Skills using your voice or from the [Marketplace](https://market.mycroft.ai).\nYou can also assist skill authors in testing new versions of their skills by\nusing \"install prevew version\" to gain access to skills still under development\nand testing. If you do this, please be consicious the skill may be in an\nunstable development state and report issues to the author appropriately.\n\nYou can also install Skills that are not officially released by entering the\nSkill's GitHub repository URL in the [Installer's web user interface](https://home.mycroft.ai/#/skill).\n\nSkills are ultimately installed using the [Mycroft Skill Manager (msm)](https://mycroft.ai/documentation/msm). If verbally installing, Mycroft will speak a list of possible matches for\nambiguous names -- just pick the skill you want from the list read to you.", - "authorname": "MycroftAI", - "examples": [ - "Install coin flip.", - "Install the preview version of coin flip.", - "Uninstall coin flip.", - "Remove coin flip.", - "Download custom skill.", - "Install coin flip", - "Install the preview version of coin flip ", - "Uninstall coin flip", - "Remove coin flip", - "Download custom skill" - ], - "category": "Configuration", - "tags": [ - "download", - "msm", - "Configuration", - "install", - "skills", - "add-skill", - "skill", - "installer", - "system", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Add and remove Mycroft Skills", - "license": "apache-2.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/download.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [ - "msm" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Installer Skill", - "android_handler": "skill-installer.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Device IP Address", - "foldername": "skill-ip", - "url": "https://github.com/MycroftAI/skill-ip", - "branch": "0e836fb98d8113475c808c64bc10424e8436d5ef", - "description": "Retrieve the [IP address](https://en.wikipedia.org/wiki/IP_address), also known as the \"network address\" of the Device and respond verbally to the user, and if the Device supports it, display the IP address.", - "authorname": "MycroftAI", - "examples": [ - "What's your network address?", - "What's your IP address?", - "Tell me your IP address.", - "Tell me your network address.", - "What network are you connected to?", - "Tell me your IP address", - "Tell me your network address" - ], - "category": "Configuration", - "tags": [ - "Configuration", - "network-address", - "IPaddress", - "IP-address", - "network", - "system", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Network connection information", - "license": "apache-2.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/info-circle.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [ - "ifaddr" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Ip Skill", - "android_handler": "skill-ip.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Jokes", - "foldername": "skill-joke", - "url": "https://github.com/MycroftAI/skill-joke", - "branch": "3d361925654857989ccf0c7d9a34a113150aa180", - "description": "Brighten your day with a little humor. This draws on the jokes collected by the [PyJokes project](https://github.com/pyjokes/pyjokes) to give you a chuckle.\n \n The joke categories are:\n * Neutral -- jokes that are safe for work, kids or your grandmother\n * Chuck Norris -- jokes only a geek can love\n \n _WARNING: Laughter is not guaranteed, but eye rolls are likely._", - "authorname": "MycroftAI", - "examples": [ - "Make me laugh.", - "Tell me a joke.", - "Tell me a Chuck Norris joke.", - "How about a neutral joke.", - "Make me laugh", - "Tell me a joke", - "Tell me a Chuck Norris joke", - "How about a neutral joke" - ], - "category": "Entertainment", - "tags": [ - "funny", - "humor", - "joke", - "jokes", - "Entertainment", - "humour", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Let Mycroft brighten your day with a little humor", - "license": "apache-2.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/laugh.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [ - "pyjokes==0.6.0" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Joke Skill", - "android_handler": "skill-joke.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Mark 1 Demo", - "foldername": "skill-mark1-demo", - "url": "https://github.com/MycroftAI/skill-mark1-demo", - "branch": "2e110288ee85b73bba0673d465ae687d570522fd", - "description": "The Mycroft Mark 1 menu which appears when you press and hold the top button\nhas a 'DEMO' option. This Skill implements a simple mode which can be used\nto draw attention at trade shows, stores, etc.\n\nThe demo starts with the unit's eyes dancing around. Every 2 minutes it will\nsing a song. The singing is synched to the clock, so multiple units can form\na chorus.\n\nYou can stop the demo by pressing the top button or saying \"Stop\".", - "authorname": "MycroftAI", - "examples": [ - "Stop - ends the DEMO.", - "Stop - ends the DEMO" - ], - "category": "Configuration", - "tags": [ - "showcase", - "demo", - "demonstration", - "Configuration", - "no-license" - ], - "platforms": [ - "platform_mark1" - ], - "short_description": "Showcase the capabilities of the Mark 1", - "license": "apache-2.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/chalkboard-teacher.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mark1 Demo Skill", - "android_handler": "skill-mark1-demo.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Mycroft Mark 1", - "foldername": "mycroft-mark-1", - "url": "https://github.com/MycroftAI/mycroft-mark-1", - "branch": "641a2f6a576eeac30a7ffad485bb4eb91d70ff2e", - "description": "The Mycroft Mark 1 has several unique capabilities which this Skill lets you control.\n\n### Eye Color\nThe Mark 1 has beautiful eyes -- and you get to pick their color! Set them to\na named color (\"blue\", \"magenta\", \"teal\", etc) or any color using RGB values.\nPleas see the [color](https://github.com/MycroftAI/mycroft-mark-1/blob/dev/dialog/en-us/colors.value)\nlist for more options\n\n### Faceplate Brightness\nSet the faceplate to a specific brightness, or allow it to automatically adjust\nits brightness level to dim at night.", - "authorname": "MycroftAI", - "examples": [ - "Set your eye color to pink.", - "Change your eye color to the default.", - "Set a custom eye color.", - "Turn on auto brightness.", - "Change to low brightness.", - "Dim to 50%", - "Set your eye color to pink", - "Change your eye color to the default", - "Set a custom eye color (you'll be prompted for values)", - "Turn on auto brightness", - "Change to low brightness" - ], - "category": "Configuration", - "tags": [ - "configuration", - "Configuration", - "settings", - "mark1", - "system", - "no-license" - ], - "platforms": [ - "platform_mark1" - ], - "short_description": "Customize your Mark 1", - "license": "apache-2.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/cog.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [ - "arrow==0.12.0", - "astral==1.4" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Mark 1 Skill", - "android_handler": "mycroft-mark-1.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Naptime", - "foldername": "skill-naptime", - "url": "https://github.com/MycroftAI/skill-naptime", - "branch": "e7cc937918cc09c1781fc3b09c0bf5685eafc137", - "description": "Tell Mycroft to sleep when you don't want to be disturbed in any way.\nThis stops all calls to Speech to Text system, guaranteeing your voice won't\nbe sent anywhere on an accidental activation.\n\nWhen sleeping, Mycroft will only listen locally for the phrase \"Hey Mycroft,\nwake up\". Otherwise the system will be totally silent and won't bother you.\n\nOn a Mark 1 this also dims the eyes.", - "authorname": "MycroftAI", - "examples": [ - "Go to sleep.", - "Nap time.", - "Wake up.", - "Go to sleep", - "Nap time", - "Wake up" - ], - "category": "Daily", - "tags": [ - "nap", - "Configuration", - "sleep", - "donotdisturb", - "naptime", - "Daily", - "do-not-disturb", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Put Mycroft to sleep when you don't want to be disturbed", - "license": "apache-2.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/bed.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Daily", - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Naptime Skill", - "android_handler": "skill-naptime.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Latest news", - "foldername": "skill-npr-news", - "url": "https://github.com/MycroftAI/skill-npr-news", - "branch": "6905c6a5c7a78f7ace5e1188caba606afe926a58", - "description": "Play the latest news from an RSS audio feed. Your device location will be used to provide a local feed from your country if available. Otherwise, the National Public Radio (NPR)\nHourly News will be used. You can also choose your own default or add a custom audio feed at: [home.mycroft.ai](https://home.mycroft.ai/#/skill).\n\nSupported stations include:\nAssociated Press (AP) Hourly Radio News\n * [AU] ABC News Australia\n * [BE] VRT Nieuws\n * [CA] CBC News\n * [DE] DLF\n * [DE] WDR\n * [FI] YLE\n * [SE] Ekot\n * [UK] BBC News\n * [US] Fox News\n * [US] NPR News Now\n * [US] PBS NewsHour", - "authorname": "MycroftAI", - "examples": [ - "Play the news.", - "Play the BBC news.", - "Tell me the news.", - "What's the news?", - "Restart news.", - "Play the news", - "Play the BBC news", - "Tell me the news", - "Restart news" - ], - "category": "Daily", - "tags": [ - "headlines", - "Information", - "news", - "Daily", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Listen to the latest news report from your favorite broadcast", - "license": "apache-2.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/newspaper.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Daily", - "Information" - ], - "requirements": { - "python": [ - "feedparser==5.2.1" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Npr News Skill", - "android_handler": "skill-npr-news.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Pairing", - "foldername": "skill-pairing", - "url": "https://github.com/MycroftAI/skill-pairing", - "branch": "678894209f28c57655f5c98481b1f519155befae", - "description": "The default backend to provide services for Mycroft users is\n [Home](https://home.mycroft.ai/). Pairing a device with Home provides access\n to privacy-protecting Speech to Text, Wolfram Alpha and other such services,\n as well as easy configuration for all your Mycroft devices.", - "authorname": "MycroftAI", - "examples": [ - "Pair my device.", - "Pair my device (happens automatically on first run if not paired already)" - ], - "category": "Configuration", - "tags": [ - "Configuration", - "connectivity", - "pair", - "system", - "pairing", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Connect your device to the Mycroft server - [Home](https://home.mycroft.ai/)", - "license": "apache-2.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/handshake.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Pairing Skill", - "android_handler": "skill-pairing.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Mycroft's Background", - "foldername": "skill-personal", - "url": "https://github.com/MycroftAI/skill-personal", - "branch": "ed99a6a26f14383bd1a42beb29f137f1a53c4954", - "description": "Ask about the \"birth\" and parentage of Mycroft and get a taste of the community\nwho is fostering this open source artificial intelligence.", - "authorname": "MycroftAI", - "examples": [ - "When were you created?", - "What are you?", - "Where were you born?", - "Who made you?", - "Do you even rhyme?" - ], - "category": "Entertainment", - "tags": [ - "persona", - "Entertainment", - "personality", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Learn history and personality of Mycroft", - "license": "apache-2.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/smile-wink.svg", - "credits": [ - "Mycroft AI (@MycroftAI)\n\nPoem penned by community member Jelmer Prins" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Personal Skill", - "android_handler": "skill-personal.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Playback Control", - "foldername": "skill-playback-control", - "url": "https://github.com/MycroftAI/skill-playback-control", - "branch": "2f582091f45b83441b12b124f2d84bc9ee23d313", - "description": "This Skill doesn't do anything by itself, but it provides an important common\nlanguage for audio playback skills. By handling simple phrases like\n'pause', this one Skill can turn around and rebroadcast the [messagebus](https://mycroft.ai/documentation/message-bus/)\ncommand `mycroft.audio.service.pause`, allowing several music services to share\ncommon terminology such as \"pause\".\n\nAdditionally, this implements the common Play handler. This allows playback\nservices to negotiate which is best suited to play back a specific request.\nThis capability is used by the [Spotify](https://github.com/forslund/spotify-skill) and [Pandora](https://github.com/mycroftai/pianobar-skill) Skills, among others.", - "authorname": "MycroftAI", - "examples": [ - "Play my summer playlist.", - "Play Pandora.", - "Pause.", - "Resume.", - "Next song.", - "Next track.", - "Previous track.", - "Previous song.", - "Play my summer playlist", - "Play Pandora", - "Pause", - "Resume", - "Next song", - "Next track", - "Previous track", - "Previous song" - ], - "category": "Music", - "tags": [ - "play", - "resume", - "playback", - "next", - "music", - "system", - "Music", - "pause", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Common playback control system", - "license": "apache-2.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/play.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Music" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Playback Control Skill", - "android_handler": "skill-playback-control.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Set reminders", - "foldername": "skill-reminder", - "url": "https://github.com/MycroftAI/skill-reminder", - "branch": "a2e615c09bfe5ebf6471f10167e2f9dff858c872", - "description": "Flexible reminder Skill, allowing you to set single and repeating reminders for tasks. The reminders are set on the Device, and have no external dependencies.", - "authorname": "MycroftAI", - "examples": [ - "Set a reminder every day to take my vitamin pill.", - "Remind me to put the garbage out at 8pm.", - "Remind me to walk the dog in an hour.", - "Set a reminder every Friday at 2pm.", - "Remind me to stretch in 10 minutes.", - "Set a reminder every day to take my vitamin pill", - "Remind me to put the garbage out at 8pm", - "Remind me to walk the dog in an hour", - "Set a reminder every Friday at 2pm", - "Remind me to stretch in 10 minutes" - ], - "category": "Daily", - "tags": [ - "reminder", - "Daily", - "reminders", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Set single and repeating reminders for tasks", - "license": "apache-2.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/bell.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Daily" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Reminder Skill", - "android_handler": "skill-reminder.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Singing", - "foldername": "skill-singing", - "url": "https://github.com/MycroftAI/skill-singing", - "branch": "3cfd5007ac2b0c728bb5557ca68a99eea20e818f", - "description": "Mycroft will speak the lyrics to a random pop music song using text to speech.", - "authorname": "MycroftAI", - "examples": [ - "Sing.", - "Sing" - ], - "category": "Entertainment", - "tags": [ - "texttospeech", - "sing", - "song", - "singing", - "music", - "Entertainment", - "lyrics", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Mycroft sings lyrics to some popular songs", - "license": "apache-2.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/laugh-beam.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Singing Skill", - "android_handler": "skill-singing.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Speak", - "foldername": "skill-speak", - "url": "https://github.com/MycroftAI/skill-speak", - "branch": "6fb04f592950562e700d314f2b34bcbf1754d964", - "description": "Turn Mycroft into a parrot. Speak a phrase and listen to it repeated in Mycroft's selected voice.", - "authorname": "MycroftAI", - "examples": [ - "Say Goodnight, Gracie.", - "Repeat Once upon a midnight dreary, while I pondered, weak and weary, Over many a quaint and curious volume of forgotten lore.", - "Speak I can say anything you'd like!", - "say Goodnight, Gracie", - "repeat Once upon a midnight dreary, while I pondered, weak and weary, Over many a quaint and curious volume of forgotten lore", - "speak I can say anything you'd like!" - ], - "category": "Entertainment", - "tags": [ - "say", - "speak", - "repeat", - "Entertainment", - "system", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Make Mycroft repeat whatever you want", - "license": "apache-2.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/bullhorn.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Speak Skill", - "android_handler": "skill-speak.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Spelling", - "foldername": "skill-spelling", - "url": "https://github.com/MycroftAI/skill-spelling", - "branch": "89c154850cf79f3b2544337e42874adc9e0c7520", - "description": "Mycroft can spell any word which is understood by speech-to-text. The proper spelling is pronounced on all platforms, as well as displayed by devices such as the Mark 1.", - "authorname": "MycroftAI", - "examples": [ - "How do you spell aardvark?", - "Spell succotash.", - "How do you spell bureacracy?", - "Spell omnipotence.", - "Spell succotash", - "Spell omnipotence" - ], - "category": "Information", - "tags": [ - "spell", - "Information", - "spelling", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Let Mycroft help you spell words", - "license": "apache-2.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/book-reader.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Information" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Spelling Skill", - "android_handler": "skill-spelling.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Spotify", - "foldername": "spotify-skill", - "url": "https://github.com/forslund/spotify-skill", - "branch": "3b003beea093618007554e05b66a6749848fc75e", - "description": "Stream your favorite music from the popular Spotify music service. Spotify\nPremium users can search and play tracks from their own playlists or the huge\nSpotify music library.\n\nYou can also control your Mycroft device using the Spotify Connect system.\nSo play DJ on your phone while listening on Mycroft!\n\n### Authorization:\nThis Skill uses two different methods of authentication. Both need to be filled in correctly for the **Skill** to function correctly.\n\n#### API connection to your Spotify account\nAfter installing `mycroft-spotify`, in your [Skill\nsettings for Spotify](https://home.mycroft.ai/#/skill) in home.mycroft.ai you will see settings for the Spotify Skill. You will see a username and password field and a 'Connect' button. Ignore the username and password field for now, and click the 'Connect' button. You will be prompted to log in to Spotify, and to authorize Mycroft AI to use your Spotify account using OAuth. This allows Mycroft access to your account details such as Playlists.\n\n#### Username and password to authenticate a Mycroft device\nIn addition to account details, Mycroft needs to be authorized as a **device** for Spotify. To do this, we use your username and password for Spotify. These must be entered as well, or you will receive an error message like:\n\n`I couldn't find any Spot-ify devices. This skill requires a Spotify Premium account to work properly.`\n\nwhen you try to use the **Skill** on a Mycroft device.\n\nIf you log in to Spotify using Facebook, your password will be your _Facebook_ password, but your Spotify device username. You can get your Spotify device username [here](https://www.spotify.com/us/account/set-device-password/).\n\n_NOTE: You MUST have a Premium Spotify account to use this **Skill**. It will NOT work with a free Spotify account._", - "authorname": "forslund", - "examples": [ - "What Spotify devices are available?", - "Play discover weekly.", - "Play Hello Nasty on Spotify.", - "Play something by Covenant.", - "Play the album Hello Nasty on Spotify.", - "Play my liked songs.", - "Play discover weekly", - "Search Spotify for Hello Nasty", - "Play something by Coventant", - "Play the album Hello Nasty on Spotify", - "Play my liked songs" - ], - "category": "Music", - "tags": [ - "music", - "spotify", - "Music", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Listen to music from your Spotify Premium music account", - "license": "apache-2.0", - "icon": "https://rawcdn.githack.com/forslund/spotify-skill/05c19c0fba8a4af150c6eb8cf2e955d59ac83d15/Spotify_Icon.png", - "credits": [ - "@forslund\nThe Mycroft devs" - ], - "categories": [ - "Music" - ], - "requirements": { - "python": [ - "spotipy==2.4.4" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Spotify Skill", - "android_handler": "spotify-skill.forslund.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "System", - "foldername": "skill-stop", - "url": "https://github.com/MycroftAI/skill-stop", - "branch": "e28d571f909fd8892fa52064665e9e0ec38de4f8", - "description": "Provides verbal interfaces for basic framework interactions, such as the\n\"Stop\" command. Also provide interface to control physical Mycroft hardware.\n\nNOTE: This Skill is a little unusual in that it really doesn't do anything\ndirectly, rather it emits messages for the device creator to capture.", - "authorname": "MycroftAI", - "examples": [ - "Stop.", - "Reboot.", - "Turn off.", - "Allow remote login.", - "Configure wifi.", - "Stop", - "Reboot", - "Turn off", - "Allow remote login", - "Configure wifi" - ], - "category": "Configuration", - "tags": [ - "system", - "Configuration", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "General system control", - "license": "apache-2.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/cog.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Stop Skill", - "android_handler": "skill-stop.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Support", - "foldername": "skill-support", - "url": "https://github.com/MycroftAI/skill-support", - "branch": "fee18367917cc67b09fb5db9cb24fa5ce7429916", - "description": "This Skill generates a package with debugging information and emails it to the email address registered in your [home.mycroft.ai](https://home.mycroft.ai) account. This package can be used for debugging issues yourself, or alternatively it can be emailed to Mycroft to create a support request. \n\nThe package contains all of your `mycroft-core` logs on the Device, and information about active Skills and Intents at the time the support request was generated. \n\nThis uses the [0x0.st](https://0x0.st/) service for storing the debugging information.", - "authorname": "MycroftAI", - "examples": [ - "Create a support ticket.", - "You're not working!", - "Send me debug info.", - "Create a support ticket", - "Send me debug info" - ], - "category": "Configuration", - "tags": [ - "support-request", - "Configuration", - "logs", - "assistance", - "troubleshooting", - "help", - "system", - "support", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Capture information for Mycroft support", - "license": "apache-2.0", - "icon": "https://rawgit.com/FortAwesome/Font-Awesome/master/svgs/solid/life-ring.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [ - "pyopenssl" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Support Skill", - "android_handler": "skill-support.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Timer", - "foldername": "mycroft-timer", - "url": "https://github.com/MycroftAI/mycroft-timer", - "branch": "464142d5aa646fd7f23c51fa6036b7a048726703", - "description": "Use Mycroft when your hands are messy or you need more that the one timer in your kitchen. Multiple timers are easy to set and track with conversational interactions.\n\nOn a Mark 1 you'll see visual feedback as the timer runs, and you can use\nthe top button to stop the beeping once a timer expires.", - "authorname": "MycroftAI", - "examples": [ - "Start a timer for 30 seconds.", - "Set a timer for 1 minute.", - "Set a timer for 3 hours called turkey.", - "Start a timer.", - "Cancel the timer.", - "How long is left on the timer?", - "How long is left on the turkey timer?", - "Mute the timer.", - "Start a timer for 30 seconds", - "Set a timer for 1 minute", - "Set a timer for 3 hours called turkey", - "Start a timer (will be prompted)", - "Cancel the timer", - "Mute the timer (once triggered)" - ], - "category": "Daily", - "tags": [ - "kitchen-timer", - "Daily", - "timer", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Set named timers for cooking, watering plants, brewing tea and more.", - "license": "apache-2.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/stopwatch.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Daily" - ], - "requirements": { - "python": [ - "num2words" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mycroft Timer Skill", - "android_handler": "mycroft-timer.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Weather", - "foldername": "skill-weather", - "url": "https://github.com/MycroftAI/skill-weather", - "branch": "711dd23d6c75801f24f78f8e51fc6f9e6e2047b1", - "description": "Get weather conditions, forecasts, expected precipitation and more! By default, it will tell\nyou about your device's configured location. You can also ask for other cities around the world. \n\nCurrent conditions and weather forecasts come from [Open Weather Map](https://openweathermap.org).\n\nThe temperature is shown in Celsius or Fahrenheit depending on the preferences \nset in your [https://home.mycroft.ai](https://home.mycroft.ai) account. You can ask \nspecifically for a unit that differs from your configuration.", - "authorname": "MycroftAI", - "examples": [ - "What is the weather?", - "What is the weather in Houston?", - "What is the forecast tomorrow?", - "What is the forecast in London tomorrow?", - "What is the weather going to be like Tuesday?", - "What is the weather for the next three days?", - "What is the weather this weekend?", - "What's the temperature?", - "What's the temperature in Paris tomorrow in Celsius?", - "What's the high temperature tomorrow?", - "Will it be cold on Tuesday.", - "When will it rain next?", - "How windy is it?", - "What's the humidity?", - "Is it going to snow?", - "Is it going to snow in Baltimore?", - "When is the sunset?", - "What's the high temperature tomorrow", - "Will it be cold on Tuesday" - ], - "category": "Daily", - "tags": [ - "weather", - "humidity", - "rain", - "snow", - "Daily", - "forecast", - "temperature", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Weather conditions and forecasts", - "license": "apache-2.0", - "icon": "https://rawgithub.com/FortAwesome/Font-Awesome/master/svgs/solid/sun.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Daily" - ], - "requirements": { - "python": [ - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Weather Skill", - "android_handler": "skill-weather.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Version Checker", - "foldername": "skill-version-checker", - "url": "https://github.com/MycroftAI/skill-version-checker", - "branch": "0567c4540e274fe6e2b47371fb455877a1042ffe", - "description": "Report the version of your Mycroft install (`mycroft-core`) and of the platform you are running on - ie \n> Mycroft Mark 1, version 18.2.13 beta", - "authorname": "MycroftAI", - "examples": [ - "Check version.", - "What version are you running?", - "What's your platform build?", - "Check version", - "What's your platform build? " - ], - "category": "Configuration", - "tags": [ - "Configuration", - "build", - "version", - "versioning", - "system", - "platform", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Report the version of your Mycroft", - "license": "apache-2.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/code-branch.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Version Checker Skill", - "android_handler": "skill-version-checker.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Wikipedia", - "foldername": "skill-wiki", - "url": "https://github.com/MycroftAI/skill-wiki", - "branch": "4fee1d988a2f73fc4b23e1d98371d5eed169f72f", - "description": "Query [Wikipedia](https://www.wikipedia.org) for answers to all your questions. Get just a summary, or ask for more to get in-depth information.\n \n This Skill uses the [Wikimedia API](https://en.wikipedia.org/w/api.php).", - "authorname": "MycroftAI", - "examples": [ - "Tell me about Elon Musk.", - "Tell me about beans.", - "Tell me something random.", - "Check Wikipedia for beans.", - "Tell me about the Pembroke Welsh Corgi.", - "Search for chocolate.", - "More information.", - "Tell me More.", - "Tell me about Elon Musk", - "Tell me about beans", - "Tell me something random", - "Check Wikipedia for beans", - "Tell me about the Pembroke Welsh Corgi", - "Search for chocolate", - "More information (followup after an initial summary)", - "Tell me More (followup after an initial summary)" - ], - "category": "Information", - "tags": [ - "general-knowledge", - "Information", - "query", - "wiki", - "encyclopedia", - "wikipedia", - "question", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Wikipedia", - "license": "apache-2.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/brands/wikipedia-w.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Information" - ], - "requirements": { - "python": [ - "wikipedia==1.4.0" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Wiki Skill", - "android_handler": "skill-wiki.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Volume Control", - "foldername": "skill-volume", - "url": "https://github.com/MycroftAI/skill-volume", - "branch": "d6527214faf8797b06c8db7ca271f9884c4fa01f", - "description": "Control the volume of Mycroft with verbal commands or by spinning the physical\nbutton on a Mark 1.", - "authorname": "MycroftAI", - "examples": [ - "Turn up the volume.", - "Decrease the audio.", - "Mute audio.", - "Set volume to 5.", - "Set volume to 75 percent.", - "Turn up the volume", - "Decrease the audio", - "Mute audio", - "Set volume to 5", - "Set volume to 75 percent" - ], - "category": "Configuration", - "tags": [ - "volume", - "sound", - "Configuration", - "volume-control", - "system", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Control the volume of your system", - "license": "apache-2.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/volume-down.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [ - "pyalsaaudio" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Volume Skill", - "android_handler": "skill-volume.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Release Test", - "foldername": "skill-release-test", - "url": "https://github.com/MycroftAI/skill-release-test", - "branch": "49154fc81fd75448fe63ac71e9ec5b67f8d8ede1", - "description": "When a new release is being tested, this skill is installed to verify the\ninstallation mechanism functions properly. Additionally, the following line\nis edited to verify that the skill update process occurs as intended.\n\nTest line: 2018/10/23 23:14", - "authorname": "MycroftAI", - "examples": [ - "Run the release test (should respond with 'Test passed')", - "Release test.", - "Release test" - ], - "category": "Configuration", - "tags": [ - "Configuration", - "testing", - "release", - "cd", - "qa", - "ci", - "release-test", - "quality-assurance", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Tool used by Mycroft internal Quality Assurance team when validating a new `mycroft-core` release", - "license": "apache-2.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/check-double.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Release Test Skill", - "android_handler": "skill-release-test.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Finished Booting Skill", - "foldername": "skill-finished-booting", - "url": "https://github.com/zelmon64/skill-finished-booting", - "branch": "f4d2c7ad9ceb33537378e1413586b2a7bdce4c96", - "description": "With this skill Mycroft will say when the boot up period has finished and is ready to receive commands.", - "authorname": "zelmon64", - "examples": [], - "category": "Configuration", - "tags": [ - "Configuration", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Skill to determine when Mycroft AI has finished booting up.", - "license": "gpl-3.0", - "icon": "https://rawgithub.com/FortAwesome/Font-Awesome/master/advanced-options/raw-svg/solid/flag-checkered.svg", - "credits": [ - "zelmon64 (@zelmon64), Wally Fort (@fortwally), JarbasAI (@JarbasAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Finished Booting Skill", - "android_handler": "skill-finished-booting.zelmon64.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Query", - "foldername": "skill-query", - "url": "https://github.com/MycroftAI/skill-query", - "branch": "4bfc2618b05bd60c16510f318c203d23b431761b", - "description": "Negotiates handling of questions by calling all registered Common Query Skills. This is done by sending a `question:query` message with the utterance to give the skills the posibility to report back if they can answer the question and at which confidence.", - "authorname": "MycroftAI", - "examples": [ - "How tall is Abraham Lincoln?", - "What is an Aardwark?", - "Why is the sky blue?" - ], - "category": "Information", - "tags": [ - "Information", - "system", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Negotiates the best answer to a question", - "license": "apache-2.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/question.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Information" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Query Skill", - "android_handler": "skill-query.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Wink IoT", - "foldername": "skill-wink-iot", - "url": "https://github.com/MycroftAI/skill-wink-iot", - "branch": "3ed66d835eed32a716bb088f1bf7cd75aea338ee", - "description": "Interact with your smart home using the [Wink system](https://www.wink.com/). Wink hubs can work with virtually any brand of lights, including [Philips Hue](https://www2.meethue.com/en-us), [GE](https://www.gelighting.com/), [Sylvania](https://www.sylvania.com/en-us/Pages/default.aspx), [Cree](https://creebulb.com/connected), and many more. Use Mycroft to easily interact with nearby lights and light groups you create within the Wink ecosystem.\n\nYour can easily find the right light or lights based on the names of lights and groups. The Mycroft device's Name (set at [Home](https://home.mycroft.ai/) -- check by asking \"what is your name?\")\ncan be used to find lights and/or groups with begin with that same name. For example, if your Mycroft device's location is set to 'Kitchen' and you say \"Turn on the light\", lights with the following names would be turned on:\n\nIt will NOT turn on a light called \"Porch off the kitchen\".\n\nYou can also include the light/group name in your request, along with intensity words, such as: `bright`, `dim`, `full`, `half`, `completely`, `partially`\nKitchen\n * Kitchen sink\n * Kitchen fan (group consisting of 'Fan 1', 'Fan 2', 'Fan 3')", - "authorname": "MycroftAI", - "examples": [ - "Flip on the light.", - "Turn on the bedroom lights dimly.", - "Dim the lights.", - "Switch off the light.", - "Raise the light in the kitchen.", - "Dimmer (conversationally)", - "Brighter (conversationally)", - "Flip on the light", - "Turn on the bedroom lights dimly", - "Dim the lights", - "Switch off the light", - "Raise the light in the kitchen" - ], - "category": "IoT", - "tags": [ - "smarthome", - "lighting", - "lightbulb", - "home-automation", - "smart-home", - "IoT", - "light", - "wink", - "LED", - "winkhub", - "iot", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Control lights and switches connected to a Wink Hub", - "license": "apache-2.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/lightbulb.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "IoT" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Wink Iot Skill", - "android_handler": "skill-wink-iot.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Zork", - "foldername": "white-house-adventure", - "url": "https://github.com/forslund/white-house-adventure", - "branch": "80f65b9df262bb4b28c62e416faacc44e304e076", - "description": "Zork is one of the classic text based adventure games from an era before high-end graphics circuits, instead it runs on the graphics hardware of your mind!\n\nExplore the white house, the forest surrounding it and the hidden kingdom below it. Moving this from the text domain to the voice domain makes for a curiously engaging experience and if nothing else a fun couple of minutes.\n\nThe skill utilizes the excellent Frotz (http://frotz.sourceforge.net/) Z-Machine interpreter and the Zork data files are from infocom-if (http://infocom-if.org/index2.html).\n\n*Be ware of Grues....*", - "authorname": "forslund", - "examples": [ - "Play zork.", - "Go to the white house.", - "Quit zork.", - "Open mailbox.", - "play zork", - "Go to the white house", - "quit zork", - "open mailbox" - ], - "category": "Entertainment", - "tags": [ - "port", - "adventure", - "Entertainment", - "game", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Play the adventure game Zork", - "license": "gpl-3.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/door-open.svg", - "credits": [ - "@forslund" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "White House Adventure Skill", - "android_handler": "white-house-adventure.forslund.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "AIML Chatbot", - "foldername": "fallback-aiml", - "url": "https://github.com/forslund/fallback-aiml", - "branch": "68a322e77c56c7afa19cf41ea1370c3e20e8c291", - "description": "The fallback leverages the [Alice chatbot](https://www.chatbots.org/chatbot/a.l.i.c.e/) to create some fun interactions. Phrases not explicitly handled by other skills will be run by the chatbot, so nearly every interaction will have _some_ response. But be warned, Mycroft might become a bit obnoxious...\n\nThe AIML takes up a considerable amount of memory so the skill is disabled by default. To enable go to Skillsettings under home.mycroft.ai\n\nThis is based on the original work of [JarbasAI](https://github.com/JarbasAI) with updates from all over the Mycroft community.", - "authorname": "forslund", - "examples": [ - "Do you like ice cream.", - "Do you like dogs.", - "I have a jump rope.", - "Do you like ice cream", - "Do you like dogs", - "I have a jump rope" - ], - "category": "Entertainment", - "tags": [ - "aiml", - "chatbot", - "Entertainment", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Give Mycroft some sass with AIML!", - "license": "unknown", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "@jarbasal\n@nielstron\n@EazyAlvaro\n@forslund" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [ - "aiml" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Fallback Aiml Skill", - "android_handler": "fallback-aiml.forslund.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Decide between two options", - "foldername": "decide-skill", - "url": "https://github.com/lhannon/decide-skill", - "branch": "7be7be8a2d8389f91e2187cd22ecb203f776c861", - "description": "This skill makes a random choice between two specified options. You can ask who is going to win the game, what should you wear, what you should eat, or simply \"decide\" between two options.", - "authorname": "lhannon", - "examples": [ - "Who is going to win tonight's game, Villanova or Duke?", - "What should I eat for lunch, burger or sushi?", - "What should I wear, t-shirt or polo?", - "Decide heads or tails.", - "Decide heads or tails" - ], - "category": "Entertainment", - "tags": [ - "oscon2018", - "Entertainment", - "oscon", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Randomly choose between two specified options", - "license": "unknown", - "icon": "https://rawgithub.com/FortAwesome/Font-Awesome/master/advanced-options/raw-svg/solid/exchange-alt.svg", - "credits": [ - "Laurie Hannon (lhannon) laurie.hannon@sftsrc.com" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Decide Skill", - "android_handler": "decide-skill.lhannon.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Cocktails", - "foldername": "skill-cocktail", - "url": "https://github.com/forslund/skill-cocktail", - "branch": "5d38f66ec29acf79750b84d31259e90fdf7fec8e", - "description": "Let Mycroft help you mix better and more fun drinks and cocktails. When asked Mycroft provides ingredients and mixing instructions for various drinks. The skill uses the fabulous [theCocktailDB](https://thecocktaildb.com/).", - "authorname": "forslund", - "examples": [ - "How do I mix a Moscow Mule.", - "How do I make a daiquiri.", - "how do I mix a Moscow Mule", - "how do I make a daiquiri" - ], - "category": "Information", - "tags": [ - "Information", - "cocktails", - "drinks", - "recipies", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Get help mixing drinks.", - "license": "gpl-3.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/cocktail.svg", - "credits": [ - "@forslund" - ], - "categories": [ - "Information" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Cocktail Skill", - "android_handler": "skill-cocktail.forslund.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Plasma Activites", - "foldername": "plasma-activities-skill", - "url": "https://github.com/AIIX/plasma-activities-skill", - "branch": "ec7854dd86658c68606e06b378547e3196a36af1", - "description": "This skill integrates plasma-shell activities with mycroft which enables users to control their desktop activities via voice on the go, users can create activities, switch, remove, stop and display activities on their desktops.", - "authorname": "AIIX", - "examples": [ - "Create new activity 'Activity Name.", - "Show current Activities.", - "Kill activity 'Activity Name.", - "Switch to activity 'Activity Name.", - "Remove activity 'Activity Name.", - "create new activity 'Activity Name'", - "show current Activities", - "kill activity 'Activity Name'", - "switch to activity 'Activity Name'", - "remove activity 'Activity Name'" - ], - "category": "Productivity", - "tags": [ - "activities", - "kde", - "desktop", - "control", - "switch", - "Productivity", - "plasma", - "no-license" - ], - "platforms": [ - "platform_plasmoid" - ], - "short_description": "Control Your Plasmashell Activities", - "license": "gpl-3.0", - "icon": "https://rawgithub.com/FortAwesome/Font-Awesome/master/advanced-options/raw-svg/solid/chalkboard-teacher.svg", - "credits": [ - "@AIIX" - ], - "categories": [ - "Productivity" - ], - "requirements": { - "python": [ - "dbus-python ", - "dbus-python" - ], - "system": { - "all": [ - "libdbus-1-dev", - "libdbus-glib-1-dev" - ] - }, - "skill": [] - }, - "android": { - "android_icon": null, - "android_name": "Plasma Activities Skill", - "android_handler": "plasma-activities-skill.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Email", - "foldername": "email-skill", - "url": "https://github.com/LinusS1/email-skill", - "branch": "198e0bce1c182a06d6d8503bebc26f0924d391f3", - "description": "With this skill, Mycroft can check your email. With this skill, Mycroft can say the sender and the subject of each email. You can also request Mycroft to notify you when you get email, either any email, or just from a specific sender. In addition, this skill allows you to ask if you have any email, and will list the new email from that sender.\n\nTo configure this skill go [to the skill wiki](https://github.com/LinusS1/email-skill/wiki/Configuration)", - "authorname": "LinusS1", - "examples": [ - "Check my email.", - "Do I have any new emails?", - "Do I have any email from Bob?", - "Tell me when I get new mail.", - "Do I have any new mail?", - "Check my email", - "Tell me when I get new mail" - ], - "category": "Productivity", - "tags": [ - "emails", - "email", - "Information", - "Productivity", - "mail", - "Daily", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Check your email with Mycroft!", - "license": "apache-2.0", - "version": "v1.6.5", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/envelope.svg", - "credits": [ - "Linus S (@LinusS1)" - ], - "categories": [ - "Productivity", - "Daily", - "Information" - ], - "requirements": { - "python": [ - "inflect", - "pyyaml" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Email Skill", - "android_handler": "email-skill.linuss1.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Emby", - "foldername": "emby-skill", - "url": "https://github.com/rickyphewitt/emby-skill", - "branch": "9363d25e8f5a7c00c2437939dd032d60960ebe18", - "description": "Stream music from your Emby server using Mycroft! Play all songs by an artist or an instant mix of any artist/album/song in your Emby library.", - "authorname": "rickyphewitt", - "examples": [ - "Play Dance Gavin Dance From Emby.", - "Play Artist Thrice From Emby.", - "Play Album Deadweight From Emby.", - "Play Playlist Rockin Tunes From Emby.", - "Play Song Stitch From Emby.", - "Play Dance Gavin Dance From Emby", - "Play Artist Thrice From Emby", - "play Album Deadweight From Emby" - ], - "category": "Music", - "tags": [ - "Emby,Music", - "Music", - "Emby,", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "This skill allows audio playback from an Emby server", - "license": "unknown", - "icon": "https://rawgithub.com/FortAwesome/Font-Awesome/master/advanced-options/raw-svg/solid/play.svg", - "credits": [ - "rickyphewitt" - ], - "categories": [ - "Music" - ], - "requirements": { - "python": [ - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Emby Skill", - "android_handler": "emby-skill.rickyphewitt.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Number Guess", - "foldername": "Number-Guess-Mycroft-Skill", - "url": "https://github.com/Arc676/Number-Guess-Mycroft-Skill", - "branch": "7307465da8db10bd0d536883d8cb52b8c5888d51", - "description": "In Number Guess, you provide a lower and upper bound, then try to guess the randomly generated number between those bounds. With this skill, Mycroft can play with you! Ask Mycroft to generate a random number, try to guess, and Mycroft will tell you if your guess is too high, too low, or spot on.", - "authorname": "Arc676", - "examples": [ - "Let's play Number Guess.", - "Play Number Guess.", - "Number Guess.", - "Let's play Number Guess", - "Play Number Guess", - "Number Guess" - ], - "category": "Entertainment", - "tags": [ - "random", - "numberguess", - "game", - "number", - "guessing", - "Entertainment", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Play Number Guess with Mycroft", - "license": "gpl-3.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/question.svg", - "credits": [ - "Alessandro Vinciguerra (@Arc676)" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Number Guess Mycroft Skill", - "android_handler": "Number-Guess-Mycroft-Skill.arc676.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Crystal Ball", - "foldername": "Crystal-Ball-Mycroft-Skill", - "url": "https://github.com/Arc676/Crystal-Ball-Mycroft-Skill", - "branch": "f2d23f3ae8c0e38a669cb43bfab67887ffaea02d", - "description": "Ask Mycroft any yes/no question and receive a randomly chosen answer.\n\nPlease don't use this skill for any important questions.", - "authorname": "Arc676", - "examples": [ - "Crystal Ball, will the world end tomorrow?", - "Mirror mirror on the wall, am I the fairest of them all?", - "What does the future hold? Will I become rich and famous?", - "Tell me the future; will Mycroft become greater than Siri or Alexa?" - ], - "category": "Entertainment", - "tags": [ - "crystalball", - "Entertainment", - "random", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Provides random answers to yes/no questions", - "license": "gpl-3.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "Alessandro Vinciguerra (@Arc676)" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Crystal Ball Mycroft Skill", - "android_handler": "Crystal-Ball-Mycroft-Skill.arc676.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Home Assistant", - "foldername": "skill-homeassistant", - "url": "https://github.com/MycroftAI/skill-homeassistant", - "branch": "985c4013205d0ef3a55fc7aa3859f52cf1796e9b", - "description": "[Home Assistant](https://www.home-assistant.io/) lets you control all your smart devices in a single easy to use interface. This skill uses the open source Home Assistant's APIs to control devices and entities. Control your lights, garage door, thermostats and more using your voice!\n\nCurrently the following entity types are supported: `light`, `switch`, `scene`, `climate`, `groups` and `input_boolean`", - "authorname": "MycroftAI", - "examples": [ - "Turn on the office light.", - "Turn off bedroom lights.", - "Turn on on the AC.", - "Read bedroom temperature." - ], - "category": "IoT", - "tags": [ - "smarthome", - "homeautomation", - "iot", - "homeassistant", - "IoT", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Awaken your home - Control Home Assistant", - "license": "lgpl-3.0", - "icon": "home-assistant.png", - "credits": [ - "@BongoEADGC6\n@btotharye\nMycroft AI (@mycroftai)" - ], - "categories": [ - "IoT" - ], - "requirements": { - "python": [ - "fuzzywuzzy==0.14.0", - "python-Levenshtein==0.12.0", - "requests", - "responses" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Homeassistant Skill", - "android_handler": "skill-homeassistant.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Google AIY voicekit", - "foldername": "picroft-google-aiy-voicekit-skill", - "url": "https://github.com/andlo/picroft-google-aiy-voicekit-skill", - "branch": "60a87f7854956ce177718d206f1f75f6e0e955f1", - "description": "This enables the led and button on the Google AIY voicekit.\n\nThe button led turns on when Mycroft is listning. If button is pressed he begins to listen. If the button is pressed for a longer time he stops whatever he is dooing.", - "authorname": "andlo", - "examples": [], - "category": "IoT", - "tags": [ - "voicehat", - "voicekit", - "aiy", - "googlevoicekit", - "Googleaiy", - "IoT", - "no-license" - ], - "platforms": [ - "platform_picroft" - ], - "short_description": "Enables Google AIY voicekit", - "license": "gpl-3.0", - "icon": "AIY_logo_blue.png", - "categories": [ - "IoT" - ], - "credits": [ - "Andreas Lorensen (@andlo)" - ], - "requirements": { - "python": [ - "RPi.GPIO" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Picroft Google Aiy Voicekit Skill", - "android_handler": "picroft-google-aiy-voicekit-skill.andlo.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "wikiquote-skill", - "foldername": "wikiquote-skill", - "url": "https://github.com/danielwine/wikiquote-skill", - "branch": "a9ade81df2f5fd483e4cbba5f560204c07bc32b2", - "description": "Gives quotations from notable people using wikiquote.\n\nsupported languages are: english, german, spanish, french, italian\n\nother languages may work, but additional changes may be required in the wikiquote package", - "authorname": "danielwine", - "examples": [ - "Give me a quote.", - "Tell me a quote from Lincoln.", - "I need some wisdom.", - "Give me a Buddhist wisdom.", - "Give me a quote", - "Tell me a quote from Lincoln", - "I need some wisdom", - "Give me a Buddhist wisdom" - ], - "category": "Entertainment", - "tags": [ - "philosophy", - "random", - "Information", - "wisdom", - "quotes", - "knowledge", - "Entertainment", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Gives quotations from notable people", - "license": "gpl-3.0", - "icon": "https://rawgithub.com/FortAwesome/Font-Awesome/master/advanced-options/raw-svg/solid/quote-right.svg", - "credits": [ - "danielwine" - ], - "categories": [ - "Entertainment", - "Information" - ], - "requirements": { - "python": [ - "wikiquote" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Wikiquote Skill", - "android_handler": "wikiquote-skill.danielwine.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "THEIA IDE", - "foldername": "theia-ide-skill", - "url": "https://github.com/andlo/theia-ide-skill", - "branch": "99e3cd6f983539e7c2166ecd3a617d0b873a2fdc", - "description": "This skill installs Theia IDE on your Mycroft device. This is an easy way to make and edit skills \nwith integratio to Github, and tools like mycroft-msm and mycroft-msk directly from the integrated \nshell.\nTheia provides Microsoft VS Code experience in the browser.\n\nhttps://www.theia-ide.org/index.html\n\n<img src='screenshot.png' card_color='#40DBB0' width=800 style='vertical-align:bottom'/>", - "authorname": "andlo", - "examples": [ - "Run IDE.", - "End theia IDE.", - "Restart IDE.", - "Activate IDE", - "Deactivate IDE", - "Restart IDE" - ], - "category": "Productivity", - "tags": [ - "editor", - "Productivity", - "theia", - "vscode", - "IDE", - "dev", - "no-license" - ], - "platforms": [ - "all", - "platform_picroft" - ], - "short_description": "Installs and setup THEIA IDE locally on your device. Real VS Code experience.", - "license": "gpl-3.0", - "icon": "theia.png", - "credits": [ - "Andreas Lorensen (@andlo)" - ], - "categories": [ - "Productivity" - ], - "requirements": { - "python": [ - "wget", - "ptvsd" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Theia Ide Skill", - "android_handler": "theia-ide-skill.andlo.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Krunner Search", - "foldername": "krunner-search-skill", - "url": "https://github.com/AIIX/krunner-search-skill", - "branch": "6847d2122103365d7d6eeca596d0b02ad51bb045", - "description": "Search for files, images, music, documents locally using the powerful Krunner Plasma desktop feature, also see your recent documents or files and user other plugins like calculate etc", - "authorname": "AIIX", - "examples": [ - "Search this computer for 'Filename/Application.", - "Display recent documents.", - "Search the computer for bookmarks.", - "Calculate 2 plus 2.", - "Hey Mycroft, search this computer for 'Filename/Application' ", - "Hey Mycroft, display recent documents", - "Hey Mycroft, search the computer for bookmarks", - "Hey Mycroft, calculate 2 plus 2" - ], - "category": "Productivity", - "tags": [ - "bookmarks", - "krunner", - "kde", - "desktop", - "control", - "recent", - "search", - "documents", - "Productivity", - "plasma", - "no-license" - ], - "platforms": [ - "platform_plasmoid" - ], - "short_description": "Krunner enables users to search their local desktop for files, images, recent documents, bookmarks and utilize other krunner plugins.", - "license": "gpl-3.0", - "icon": "https://rawgithub.com/FortAwesome/Font-Awesome/master/advanced-options/raw-svg/solid/search.svg", - "credits": [ - "Aditya Mehra (@AIIX)" - ], - "categories": [ - "Productivity" - ], - "requirements": { - "python": [ - "dbus-python" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Krunner Search Skill", - "android_handler": "krunner-search-skill.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Randomize", - "foldername": "cut-up-skill", - "url": "https://github.com/JonStratton/cut-up-skill", - "branch": "39f3aeb5b7c21677b04333fba9593e6dd7ed04be", - "description": "Repeat what was said, but change the order randomly. Configurations can be used to modify the default min and max chunk size, randomness percent, and fragment type (char, word, sentence)", - "authorname": "JonStratton", - "examples": [ - "Randomize Say this is a test.", - "Randomize Set minimum 1.", - "Randomize Set maximum 3.", - "Randomize Set randomness 75.", - "Randomize Set fragment type word.", - "Randomize Say this is a test", - "Randomize Set minimum 1", - "Randomize Set maximum 3", - "Randomize Set randomness 75", - "Randomize Set fragment type word" - ], - "category": "Entertainment", - "tags": [ - "Entertainment", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Repeat using the cut up technique.", - "license": "gpl-3.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "Jon Stratton (@JonStratton)" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Cut Up Skill", - "android_handler": "cut-up-skill.jonstratton.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Wrapper Aircrack", - "foldername": "skill-aircrack", - "url": "https://github.com/JonStratton/skill-aircrack", - "branch": "017a10ea5f8e022a4084c6a069213301c0260284", - "description": "A simple Mycroft wrapper for a small subset of Aircrack-ng. Basically, it can list networks and interfaces, bring interfaces up in monitor mode, deauth clients, and crack WPA2 passwords.", - "authorname": "JonStratton", - "examples": [ - "List interfaces.", - "Select interface number one.", - "List wireless networks.", - "Select network number three.", - "Start Monitor.", - "Disconnect Clients.", - "Crack Password.", - "Stop Monitor." - ], - "category": "Information", - "tags": [ - "Information", - "wifi", - "aircrack-ng", - "aircrack", - "no-license" - ], - "platforms": [ - "platform_picroft", - "platform_plasmoid" - ], - "short_description": "A simple Mycroft wrapper for a small subset of Aircrack-ng.", - "license": "gpl-3.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/robot.svg", - "credits": [ - "Jon Stratton (@JonStratton)" - ], - "categories": [ - "Information" - ], - "requirements": { - "python": [ - "pexpect" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Aircrack Skill", - "android_handler": "skill-aircrack.jonstratton.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Remember", - "foldername": "remember-skill", - "url": "https://github.com/luke5sky/remember-skill", - "branch": "63cc03b69260e47de2b5b7060a9abc2ffee27399", - "description": "You can ask MyCroft to remember and forget things.\nIt will store everything in a list locally on your device.", - "authorname": "luke5sky", - "examples": [ - "Remember take the trash out.", - "What did you remember?", - "Forget phrase take the trash out.", - "Forget all phrases.", - "Hey mycroft, remember take the trash out", - "Hey mycroft, what did you remember", - "Hey mycroft, forget phrase take the trash out", - "Hey mycroft, forget all phrases" - ], - "category": "Daily", - "tags": [ - "brain", - "todo-list", - "remember", - "Productivity", - "Daily", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Ask MyCroft to remember things for you.", - "license": "apache-2.0", - "version": "1.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/brain.svg", - "credits": [ - "Lukas Gangel (@luke5sky)" - ], - "categories": [ - "Daily", - "Productivity" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Remember Skill", - "android_handler": "remember-skill.luke5sky.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Laugh", - "foldername": "skill-laugh", - "url": "https://github.com/JarbasSkills/skill-laugh", - "branch": "f8e06afcbbda1eb574905068ebe0fcd4d0792178", - "description": "Laugh randomly or when requested, gender configurable on home.mycroft.ai", - "authorname": "JarbasSkills", - "examples": [ - "Laugh like Alexa.", - "Can you laugh.", - "Laugh like Alexa", - "Random laughter", - "do the evil laugh" - ], - "category": "Entertainment", - "tags": [ - "laugh", - "funny", - "repeating", - "entertainment", - "Entertainment", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Makes Mycroft laugh like a maniac", - "license": "mit", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/laugh.svg", - "credits": [ - "[@JarbasAl](https://jarbasal.github.io)\n[SoundBible](http://soundbible.com/suggest.php?q=laugh&x=0&y=0)\n[FreeSound](https://freesound.org/search/?q=female+evil+laugh)" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Laugh Skill", - "android_handler": "skill-laugh.jarbasskills.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Auto volume", - "foldername": "auto-volume-skill", - "url": "https://github.com/andlo/auto-volume-skill", - "branch": "c18d145c32e8da5aa7ce6d4ff2cc32a4c761f8f5", - "description": "This skill lets Mycroft decide when to use high, normal, or low volume. Mycrofts keeps monitoring the background sound levels using the microphone, using which it decides what volume level is the right one to use.\n\nAs it is not easy to know what is high and what is low noise level, the skill will adapt over time. The skill notices the highest and lowest measured levels over time and adjusts its settings according to those measurements.\n\nThe skill stops adjusting the volume if another skill is using the speaker or if Mycroft himself is talking.\n\nThe skill can be activated or deactivated using the command \"Hey Mycroft, set auto volume off\" or \"Hey Mycroft, set auto volume on\".", - "authorname": "andlo", - "examples": [ - "Set auto volume on.", - "Set auto volume off.", - "Clear auto volume measurements.", - "Set auto volume on", - "Set auto volume off", - "Clear auto volume measurements" - ], - "category": "Daily", - "tags": [ - "volume", - "Daily", - "Configuration", - "no-license" - ], - "platforms": [ - "platform_mark1", - "platform_picroft" - ], - "short_description": "Sets the volume depending on background noise level", - "license": "gpl-3.0", - "version": "1.0", - "icon": "icon.png", - "credits": [ - "Andreas Lorensen (@andlo)" - ], - "categories": [ - "Daily", - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Auto Volume Skill", - "android_handler": "auto-volume-skill.andlo.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Telegram", - "foldername": "telegram-skill", - "url": "https://github.com/luke5sky/telegram-skill", - "branch": "b879e91debeb493f5ab05fd3394a3ab5e9ebddf5", - "description": "You need to create a telegram bot (via BotFather) and save the Bot Token, your ChatID and your MyCroft Device name on home.mycroft.ai under skill settings.\nAfter this restart your MyCroft Unit.\nYou can now commmunicate with your MyCroft Unit via this bot.\n\nSettings:\n\nDetailed HowTo:\n\n\nOpen Telegram App on your smartphone, click on the search symbol in the upper right corner<br/>\nSearch for BotFather and click on it<br/>\nNow type /newbot hit enter<br/>\nBotfather should reply with: Alright, a new bot. How are we going to call it? please chosse a name for your bot.<br/>\nGive your bot a displayname like Mycroft<br/>\nBotfather should reply with: Good. Now let's choose a username for your bot. It must end in bot. Like this, for example: TetrisBot or tetris-bot.<br/>\nGive your bot unique username like lukesmycroftbot<br/>\nBotfather should now give you your token for this bot<br/>\nSave this token and don't post it online or send it to people, safety first!<br/>\n\nTelegram documentation on botfather: https://core.telegram.org/bots#6-botfather\n\n\n\n\n\n It should respond with: This is your ChatID: YOURCHATID\nBOT TOKEN (MANDATORY): Your bot token you got from BotFather\n * MYCROFT DEVICE NAME (MANDATORY): Your Device name you configured on home.mycroft.ai - Devices - Registered Devices\n * BOT TOKEN SECOND MYCROFT DEVICE (OPTIONAL): If you have a second Mycroft Device and you want to use this skill with it -> put your second bot token here (it has to be an other bot than the first one because telegram only allows one device to get updates from one bot)\n * SECOND MYCROFT DEVICE NAME (IF YOU HAVE A SECOND DEVICE): Your Device name from your second Device you configured on home.mycroft.ai - Devices - Registered Devices\n * USERNAME 1 (OPTIONAL): You do not need to put anything here, the skill does not use this field. It is only for yourself to know which Chat ID belongs to whom\n * CHAT ID 1 (MANDATORY): You will get your Chat ID from the Telegram-Skill if you have configured BOT TOKEN (first field) and MYCROFT DEVICE NAME, saved and then write anything to the bot.\n * USERNAME 2 (OPTIONAL): For second User if you have one\n * CHAT ID 2 (IF YOU HAVE A SECOND USER): Same as CHAT ID 1 with Telegram-Account of second user\n * Install this skill on your Mycroft Device\n * Create a telegram bot:\n * Go to home.mycroft.ai - skills and search for the telegram-skills settings\n * Copy/paste your token botfather gave you in the field BOT TOKEN (MANDATORY)\n * Copy/paste your device name from home.mycroft.ai - devices in MYCROFT DEVICE NAME (MANDATORY)\n * SAVE and wait till the settings are synced to your Mycroft Unit (or reboot your device to trigger the sync)\n * Open Telegram App on your smartphone and search (upper right corner) for your bot (username or displayname) click on it and write test or hello to your bot\n * Copy/paste this under CHAT ID 1 (MANDATORY)\n * reboot your device to trigger the sync\n * Your bot should send you this welcome message: Telegram-Skill on Mycroft Unit YOURUNIT is loaded and ready to use", - "authorname": "luke5sky", - "examples": [], - "category": "IoT", - "tags": [ - "bot", - "messenger", - "telegram-bot", - "Productivity", - "IoT", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "A skill to control your Mycroft instance through a TelegramBot.", - "license": "apache-2.0", - "version": "v1.3", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/brands/telegram-plane.svg", - "credits": [ - "Lukas Gangel (@luke5sky)" - ], - "categories": [ - "IoT", - "Productivity" - ], - "requirements": { - "python": [ - "python-telegram-bot>=12.0", - "pytz>=2020.1" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Telegram Skill", - "android_handler": "telegram-skill.luke5sky.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Count", - "foldername": "count-skill", - "url": "https://github.com/andlo/count-skill", - "branch": "e9871e5a73e4d1612df8959da17154c6c795814f", - "description": "This skill lets Mycroft do counting to a number or and countdown from a number.", - "authorname": "andlo", - "examples": [ - "Count to 10.", - "Countdown from 10.", - "Count to 10", - "Countdown from 10" - ], - "category": "Daily", - "tags": [ - "count", - "countdown", - "Daily", - "no-license" - ], - "platforms": [ - "platform_mark1", - "platform_mark2", - "platform_picroft", - "platform_plasmoid" - ], - "short_description": "Count and countdown skill", - "license": "gpl-3.0", - "version": "1.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid//rocket.svg", - "credits": [ - "Andreas Lorensen (@andlo)" - ], - "categories": [ - "Daily" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Count Skill", - "android_handler": "count-skill.andlo.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Fairytalez", - "foldername": "fairytalez-skill", - "url": "https://github.com/andlo/fairytalez-skill", - "branch": "768d5561247c3060b82288b33cbe6405efc1ccb3", - "description": "This skill enables Mycroft to tell lots of fairytales. So make a cup of coco, and sit back and enjoy listning to the good tales.\n\nContent is from fairytalez.com, so please go visit there if you like the stories.\nFairytalez.com is the world's largest collection of fairy tales, fables and folktales. Discover more than 2,000 classic tales plus new stories by fairy tale fans.\n\nhttp://www.fairytalez.com\n\n\n_“If you want your children to be intelligent, read them fairy tales. If you want them to be more\nintelligent, read them more fairy tales.”\nAlbert Einstein_", - "authorname": "andlo", - "examples": [ - "Tell a fairy tale.", - "Tell me the story The Little Match Girl.", - "Continue story.", - "Tell a fairy tale", - "Tell me the story The Little Match Girl", - "Continue story" - ], - "category": "Entertainment", - "tags": [ - "fairytale", - "fairytales", - "story", - "stories", - "tales", - "Entertainment", - "fairy", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Mycroft tells more then 2000 fairy tales, folk tales, and fables from all around the world.", - "license": "gpl-3.0", - "version": "1.1", - "icon": "story-512.png", - "credits": [ - "Andreas Lorensen (@andlo) and the super comunity around Mycroft" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [ - "bs4" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Fairytalez Skill", - "android_handler": "fairytalez-skill.andlo.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Speedtest", - "foldername": "speedtest-skill", - "url": "https://github.com/luke5sky/speedtest-skill", - "branch": "47c4cc05237562f81b5c25c2883aa66f91f64280", - "description": "Run a speedtest with Mycroft.\nThis skill uses the speedtest-cli (https://github.com/sivel/speedtest-cli) which runs an internet bandwidth test using speedtest.net.\n\nBe aware that this speedtest relies on the capability of the network-adapter of your Mycroft device.\n\nExamples for Raspberry Pi: \n\nIf a Raspberry Pi 3 B - connected to WiFi - runs Mycroft you won't get more than 40 Mbit/s from the speedtest despite your internet connection may have more bandwith.\nRaspberry Pi 3 B onboard WiFi: max. ~40 Mbit/s, onboard LAN: max. ~100 Mbit/s \n * Raspberry Pi 3 B+ onboard WiFi: max. ~100 Mbit/s, onboard LAN: max. ~225 Mbit/s", - "authorname": "luke5sky", - "examples": [ - "Run a speedtest.", - "Hey mycroft, run a speedtest" - ], - "category": "Daily", - "tags": [ - "ínternet", - "Information", - "speed", - "bandwith", - "Productivity", - "Daily", - "IoT", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Ask Mycroft to run a simple speedtest.", - "license": "apache-2.0", - "version": "1.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/signal.svg", - "credits": [ - "Lukas Gangel (@luke5sky)" - ], - "categories": [ - "Daily", - "Information", - "IoT", - "Productivity" - ], - "requirements": { - "python": [ - "speedtest-cli" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Speedtest Skill", - "android_handler": "speedtest-skill.luke5sky.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Pick Number", - "foldername": "skill-pick-number", - "url": "https://github.com/pcwii/skill-pick-number", - "branch": "bd2fcd1c26b028b7e478803939650276bd2ead37", - "description": "Mycroft.AI will select a random number between a min and max value.\nThe minimum and maximum value may be in any order and any value.", - "authorname": "pcwii", - "examples": [ - "Select a number between 1 and 10.", - "Choose a number between 100 and 199.", - "Pick a number from 5 to 15.", - "Select a number between 20 and 1.", - "select a number between 1 and 10", - "choose a number between 100 and 199", - "pick a number from 5 to 15", - "select a number between 20 and 1" - ], - "category": "Entertainment", - "tags": [ - "Entertainment", - "decisionmaker", - "dice", - "random", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Select a random number when provided a min and max value", - "license": "gpl-3.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/dice.svg", - "credits": [ - "@pcwii" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Pick Number Skill", - "android_handler": "skill-pick-number.pcwii.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "ISS Tracker", - "foldername": "iss-tracker-skill", - "url": "https://github.com/andlo/iss-tracker-skill", - "branch": "cd7ac9836175bb0847503ebad30ef2471be6c232", - "description": "This skill allows mycroft to tell you where the International Space Station (ISS) is in orbit, realtive\nto the earth in latitude and longitude. it uses reverse geocoding to translate these coordinates\ninto the country or body of water it is over.", - "authorname": "andlo", - "examples": [ - "Where is the international space station?", - "Locate I S S.", - "Where is I S S?" - ], - "category": "Daily", - "tags": [ - "iss", - "space", - "Information", - "esa", - "spacestation", - "Entertainment", - "Daily", - "nasa", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Where is the international space station - ISS", - "license": "gpl-3.0", - "version": "1.0", - "icon": "iss.png", - "credits": [ - "@lachendeKatze\nAndreas Lorensen (@andlo)" - ], - "categories": [ - "Daily", - "Entertainment", - "Information" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Iss Tracker Skill", - "android_handler": "iss-tracker-skill.andlo.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Dice", - "foldername": "dice-skill", - "url": "https://github.com/Dragoncraft89/dice-skill", - "branch": "f48a57904f982a48c1ba8a40feb482c36c499281", - "description": "This skill enables mycroft to generate random numbers for you. \nYou either need to specify a range or type of dice (e.g. d20).\n\nPerfect whenever you need to generate a random number, but don't have a dice nearby.", - "authorname": "Dragoncraft89", - "examples": [ - "Roll a dice.", - "Roll a d20.", - "Generate a random number between 0 and 5.", - "roll a dice", - "roll a d20", - "generate a random number between 0 and 5" - ], - "category": "Entertainment", - "tags": [ - "Entertainment", - "dnd", - "dice", - "random", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Generates random numbers for you", - "license": "gpl-3.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/dice.svg", - "credits": [ - "@Dragoncraft89" - ], - "categories": [ - "Entertainment" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Dice Skill", - "android_handler": "dice-skill.dragoncraft89.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Pokemon", - "foldername": "pokemon-skill", - "url": "https://github.com/retrodaredevil/pokemon-skill", - "branch": "5ef03dce7f373e821f05eb03a7d9e1af3590f285", - "description": "With this skill, you can ask Mycroft many different facts about Pokemon. The things you can ask it range from useful statistics such as when a Pokemon evolves or how effective a move is to a Pokemon's weight.", - "authorname": "retrodaredevil", - "examples": [ - "What type is Pikachu?", - "How tall is Pikachu?", - "What is Pikachu's base happiness?", - "What is Pikachu's first evolution?", - "What is Pikachu's final evolution?", - "How much does Pikachu weigh in kilograms.", - "What are eevee's evolutions?", - "What is Bulbasaur's base attack?", - "What does Bulbasaur evolve into?", - "What does Charizard evolve from?", - "How effective is a ground move against Pikachu?", - "What generation was Pichu introduced in?", - "What abilities does Pikachu have?", - "What is Static's flavor text in emerald?", - "What is Intimidate's flavor text in diamond?", - "Give me some info about the ability Static.", - "Give me some detailed information about the ability Static.", - "What generation was Static first introduced?", - "How much does Pikachu weigh in kilograms", - "What is Static's flavor text in emerald", - "What is Intimidate's flavor text in diamond", - "Give me some info about the ability Static", - "Give me some detailed information about the ability Static" - ], - "category": "Entertainment", - "tags": [ - "Pokemon", - "Information", - "Video", - "Pokedex", - "Games", - "Entertainment", - "Video Games", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Aids you on your journey as a Pokemon Trainer", - "license": "apache-2.0", - "icon": "https://cdn.pixabay.com/photo/2016/07/23/13/18/pokemon-1536849_960_720.png", - "credits": [ - "Joshua Shannon (@retrodaredevil)" - ], - "categories": [ - "Entertainment", - "Information" - ], - "requirements": { - "python": [ - "pokebase" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Pokemon Skill", - "android_handler": "pokemon-skill.retrodaredevil.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Mycroft Mark 2", - "foldername": "skill-mark-2", - "url": "https://github.com/MycroftAI/skill-mark-2", - "branch": "f873ac4f7c77662f0a23e24e0c8a70ff6d91e94b", - "description": "The Mycroft Mark 2 has several unique capabilities which this Skill lets you\ncontrol.\n\n### Faceplate Brightness\nSet the faceplate to a specific brightness, or allow it to automatically adjust\nits brightness level to dim at night.", - "authorname": "MycroftAI", - "examples": [ - "Turn on auto brightness.", - "Change to low brightness.", - "Dim to 50%", - "Turn on auto brightness", - "Change to low brightness" - ], - "category": "Configuration", - "tags": [ - "configuration", - "Configuration", - "settings", - "mark2", - "system", - "no-license" - ], - "platforms": [ - "platform_mark2", - "platform_respeaker" - ], - "short_description": "Customize your Mark 2", - "license": "apache-2.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/cog.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [ - "arrow==0.12.0", - "astral==1.4" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mark 2 Skill", - "android_handler": "skill-mark-2.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Learning", - "foldername": "learning-skill", - "url": "https://github.com/gras64/learning-skill", - "branch": "9bb85d707433ca9454d0d6b4795dfae8dc0a153b", - "description": "This Skill helps to give Mycroft a personality by learning any new information that you provide.", - "authorname": "gras64", - "examples": [ - "Do you want to learn something.", - "Do you already know this.", - "There you can learn something.", - "I show you something.", - "Can you keep a secret.", - "I tell you something private.", - "Please do not say what I'm talking about.", - "I want to explain it.", - "Houmor is probably not your strength.", - "Do you want to learn something", - "Do you already know this", - "There you can learn something", - "I show you something", - "can you keep a secret", - "I tell you something private", - "Please do not say what I'm talking about" - ], - "category": "Entertainment", - "tags": [ - "learning", - "Information", - "science", - "Productivity", - "Entertainment", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Teach Mycroft knowledge and humor.", - "license": "apache-2.0", - "version": "v1.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/graduation-cap.svg", - "credits": [ - "Andreas Reinle(@gras64)\n\n you \"Do you want to learn something\"\n mycroft \"I like to learn. Which category is it?\"\n you \"humor\"\n mycroft \"what is your question\"\n you \"do you know siri\"\n mycroft \"give me keywords\"\n you \"know siri\"\n mycroft \"what should I know about it\"\n you \"I have never seen her\"\n mycroft \"So I'm supposed to answer the question \"do you know siri\" with \"I have never seen her\"?\n\n\n Save Data To ~/.mycroft/skills/LearningSkill/public/humor/en-us/dialog/know.siri.dialog\n Save Data To ~/.mycroft/skills/LearningSkill/public/humor/en-us/vocab/know.siri.intent\n You can edit the path at home.mycroft.ai." - ], - "categories": [ - "Entertainment", - "Information", - "Productivity" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Learning Skill", - "android_handler": "learning-skill.gras64.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "List Manager", - "foldername": "list-manager-skill", - "url": "https://github.com/lb803/list-manager-skill", - "branch": "633645e0ba4fbda0bd77521fa608462a33635e74", - "description": "*List Manager* is a simple utility for filing lists of things you don't want to forget.\nWhether these are titles of books to read, the specs of your new bike, or random thoughts for a new programming project; you can ask [Mycroft](https://mycroft.ai/) to create a list for each them!", - "authorname": "lb803", - "examples": [ - "What lists do I have?", - "What's on my important list?", - "Add a new list called travel plans.", - "Add coffee to my shopping list.", - "Remove my finals list.", - "Remove return books to the library from my today list." - ], - "category": "Productivity", - "tags": [ - "Productivity", - "Notes", - "Note-taking", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Access and manage lists with Mycroft", - "license": "gpl-3.0", - "credits": [ - "Luca Baffa (@lb803)" - ], - "categories": [ - "Productivity" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "List Manager Skill", - "android_handler": "list-manager-skill.lb803.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Skill-Gui-Example", - "foldername": "Skill-Gui-Examples", - "url": "https://github.com/AIIX/Skill-Gui-Examples", - "branch": "5fc646f305b53e073274548f464459e9f938913e", - "description": "Example skill to showcase Mycroft GUI supported delegates and skill displays", - "authorname": "AIIX", - "examples": [ - "Show Examples Menu.", - "Show Simple Text Example.", - "Show Simple Image Example.", - "Show Paginated Text Example.", - "Show Sliding Image Example.", - "Show Proportional Delegate Example.", - "Show Vertical Cards List Example.", - "Show Horizontal Cards List Example.", - "Show Lottie Animation Example.", - "Show Event System Example.", - "Show Audio Player Example.", - "Show Examples Menu", - "Show Simple Text Example", - "Show Simple Image Example", - "Show Paginated Text Example", - "Show Sliding Image Example", - "Show Proportional Delegate Example", - "Show Vertical Cards List Example", - "Show Horizontal Cards List Example", - "Show Lottie Animation Example", - "Show Event System Example", - "Show Audio Player Example" - ], - "category": "Information", - "tags": [ - "delegates", - "gui", - "mycroft-gui", - "Information", - "sample", - "example", - "mycroftgui", - "no-license" - ], - "platforms": [ - "platform_mark2", - "platform_plasmoid" - ], - "short_description": "Mycroft GUI Showcase Examples", - "license": "gpl-3.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/user-astronaut.svg", - "categories": [ - "Information" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Gui Examples Skill", - "android_handler": "Skill-Gui-Examples.aiix.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Movie Master", - "foldername": "moviemaster", - "url": "https://github.com/builderjer/moviemaster", - "branch": "c46a3eb5817f2ce98f47100c6770705e081c5cc2", - "description": "Easily find information about a movie with your voice.", - "authorname": "builderjer", - "examples": [ - "What is the movie _______ about?", - "Tell me about the movie _______", - "Who plays in the movie _______?", - "What genres does the flick _______ belong to?", - "Look for information on the movie _______.", - "What company made the movie _______?", - "When was the movie _______ made?", - "Do you have info on the film _______?", - "What are popular movies playing now?", - "What films do you recommend like _______?", - "How long is the movie _______?", - "What are the highest rated movies out?" - ], - "category": "Entertainment", - "tags": [ - "Movies", - "TMDB", - "I", - "Actors", - "Mark", - "Entertainment", - "Mark I", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Find information about movies, actors and production details.", - "license": "gpl-3.0", - "version": "v0.2.1", - "icon": "PrimaryLogo_Green.png", - "categories": [ - "Entertainment" - ], - "credits": [ - "This skill uses tmdbv3api avaliable on GitHub at [tmdbv3api](https://github.com/AnthonyBloomer/tmdbv3api.git)\n\nIt also uses the TMDb API but is not endorsed or certified by TMDb. Information avaliable at [TMDb](https://www.themoviedb.org/)\n\nbuilderjer@github.com" - ], - "requirements": { - "python": [ - "tmdbv3api" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Moviemaster Skill", - "android_handler": "moviemaster.builderjer.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Wiktionary", - "foldername": "Wiktionary-Skill", - "url": "https://github.com/TREE-Ind/Wiktionary-Skill", - "branch": "7753861a826035aecd894a26fcb9180d4d62c22c", - "description": "Use this skill to request the definition of any word with just your voice. By harnessing wiktionary this skill does not require any type of API key but is dependent on Wiktionary being up and accessible.\n\nFurther enhancements will include being able to ask about related words and parts of speech using conversational context.", - "authorname": "TREE-Ind", - "examples": [ - "Tell me the definition of apple.", - "What is the definition for orange?", - "Find the definition for grape.", - "Tell me the definition of apple", - "What is the definition for orange", - "Find the definition for grape" - ], - "category": "Information", - "tags": [ - "Dictionary", - "Information", - "Word", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Find definitions of words using Wiktionary", - "license": "apache-2.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/book-reader.svg", - "credits": [ - "TREE Industries" - ], - "categories": [ - "Information" - ], - "requirements": { - "python": [ - "wiktionaryparser" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Wiktionary Skill", - "android_handler": "Wiktionary-Skill.tree-ind.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Bark", - "foldername": "bark-skill", - "url": "https://github.com/padresb/bark-skill", - "branch": "bf31ed404a597289ba24132494b82ff7e26397d4", - "description": "Ask mycroft to bark and it will say ruff", - "authorname": "padresb", - "examples": [ - "Bark.", - "What does a dog say?", - "Look at that cat.", - "Mailman is here.", - "Bark", - "What does a dog say", - "Look at that cat", - "Mailman is here" - ], - "category": "Daily", - "tags": [ - "Bark", - "Dog", - "Daily", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Barks like a dog", - "license": "gpl-3.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/dog.svg", - "credits": [ - "Bret Padres" - ], - "categories": [ - "Daily" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Bark Skill", - "android_handler": "bark-skill.padresb.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Today In History", - "foldername": "days-in-history-skill", - "url": "https://github.com/austin-carnahan/days-in-history-skill", - "branch": "1a1fd8f562de97bcdc5b0ff0a94654d310df1128", - "description": "Provides historical events for today or any other calendar day using information pulled from [Wikipedia](https://www.wikipedia.org).\n\nThis Skill uses the [Wikimedia API](https://en.wikipedia.org/w/api.php).", - "authorname": "austin-carnahan", - "examples": [ - "What happened today in history?", - "Tell me about events in history on December 12th.", - "What historical events happened on June 16th?", - "Tell me more.", - "What's another event?", - "Tell me about events in history on December 12th", - "Tell me more" - ], - "category": "Information", - "tags": [ - "Information", - "History", - "Trivia", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Informs you of historical tidbits about a given calendar day", - "license": "apache-2.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/calendar-day.svg", - "credits": [ - "austin-carnahan" - ], - "categories": [ - "Information" - ], - "requirements": { - "python": [ - "wikipedia==1.4.0" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Days In History Skill", - "android_handler": "days-in-history-skill.austin-carnahan.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Dismissal", - "foldername": "dismissal-skill", - "url": "https://github.com/ChanceNCounter/dismissal-skill", - "branch": "69fad1dd1acf3667b17aa186f7d5d3519956aa63", - "description": "Allows you to dismiss Mycroft verbally, in case of accidental activation, or if you change your mind. By default, Mycroft will confirm this action, but there is a setting to disable verbal feedback, accessible over the web interface.", - "authorname": "ChanceNCounter", - "examples": [ - "Nevermind.", - "Dismissed.", - "Forget it.", - "Go away.", - "nevermind", - "dismissed", - "forget it", - "go away" - ], - "category": "Configuration", - "tags": [ - "basic", - "Configuration", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Dismisses Mycroft", - "license": "mit", - "version": "v1.1r4", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/meh-blank.svg", - "credits": [ - "@ChanceNCounter\n@krisgesling\n@AIDungeonWiXAnon" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Dismissal Skill", - "android_handler": "dismissal-skill.chancencounter.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Recommendations Fallback Skill", - "foldername": "fallback-recommendations-skill", - "url": "https://github.com/LinusS1/fallback-recommendations-skill", - "branch": "cac27e622ff530b3a6c5d29e88f614bc16585749", - "description": "When Mycroft doesn't know something, this fallback skill will look up skills from the Marketplace that could help you complete your request. If it finds an appropriate skill, this will be downloaded to your device.", - "authorname": "LinusS1", - "examples": [ - "(Utterances of any skill not yet installed)", - "..." - ], - "category": "Daily", - "tags": [ - "Media", - "Configuration", - "find-skill", - "Information", - "fallback", - "search", - "skills", - "find", - "dumb", - "Daily", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "When Mycroft doesn't know something, look up and download a skill that can handle that request.", - "license": "apache-2.0", - "icon": "https://rawgit.com/FortAwesome/Font-Awesome/master/svgs/solid/brain.svg", - "credits": [ - "Linus S (@LinusS1)" - ], - "categories": [ - "Daily", - "Configuration", - "Information", - "Media" - ], - "requirements": { - "python": [ - "requests" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Fallback Recommendations Skill", - "android_handler": "fallback-recommendations-skill.linuss1.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "MBTA Bus Tracking", - "foldername": "mbta-bus-tracking-skill", - "url": "https://github.com/richhowley/mbta-bus-tracking-skill", - "branch": "90e6b5726600e8a90a0fb24d3ba47ea8298e0361", - "description": "Mycroft will announce estimated arrival times of MBTA buses at your stop so you never leave the house before you have to. All data and arrival predictions used by this skill are provided by the MBTA. \n\nSee below for full documentation, including how to track buses traveling toward your stop, but to get started just say \"Hey Mycroft, T Bus Arrivals\". You will be prompted for the bus route, direction and stop name. Mycroft will respond with all estimated arrival times at your stop.\n\n<details><summary>View Sample dialog</summary>\n<dl>\n<dt>Hey Mycroft T Bus Arrivals</dt>\n<dd>Which route are you riding?</dd>\n<dt>One</dt>\n<dd>Are you going outbound toward Harvard or Inbound toward Dudley?</dd>\n<dt>Inbound</dt>\n<dd>Which stop?</dd>\n<dt>Mount Auburn Street at Putnam Ave</dt>\n<dd>Route One service to Dudley arrivals for Mount Auburn Street at Putnam Avenue:<dd>\n<dd>Arriving in 11 minutes<dd>\n<dd>Arriving in 21 minutes<dd>\n<dd>Arriving in 34 minutes<dd>\n</dl>\n</details>\n\n<details><summary>View Full Documentation</summary>\n\n#### T bus or Transit\n\nWherever this documentation calls for saying \"T bus\" to Mycroft it can be replaced with \"transit\", and vice versa. If Mycroft is having difficulty understanding one, try the other.\n\n#### Arrival Times\n\nTo provide bus arrival times the skill requires three pieces of information: bus route, traveling direction and bus stop. If you do not provide all information needed the skill will prompt you for the rest. For example, saying\n\n> T bus arrivals route 57 going inbound stop Brighton Ave and Linden Street\n\nwill retrieve all arrival times predicted for the stop. The arrival times could also be retrieved by any of the following:\n\n> T bus arrivals route 57 going inbound\n\n> T bus arrivals route 57\n\n> T bus arrivals\n\nMycroft will prompt for any missing information.\n\n#### Bus Tracking\n\nBus tracking is similar to Arrival Times but Mycroft will continue to track buses, periodically updating their predicted arrival times, until they have passed the stop. By default Mycroft will track the next three buses and will announce updated arrival predictions every 30 seconds. These values can be changed in the skill settings on Mycroft Home. The minimum frequency of updates is 30 seconds.\n\nAs with Arrivals, say\n\n> T bus tracking\n\nto begin. Predicted arrival times of the next three tracked buses will be announced right away and updated every 30 seconds. Be aware that there may be any number of buses heading to your stop but only the arrival predictions for the tracked buses will be announced.\n\nWhen a bus passes your stop it will drop off the tracking list and there will be one fewer arrival time announced on subsequent updates. When all buses have passed your stop Mycroft will automatically stop tracking. If you would like tracking to end at any time say\n\n> T bus shutdown\n\n#### Shortcuts\n\nIf you ride the same route from the same stop often you will want to use shortcuts. After Mycroft announces arrivals or starts tracking buses you may save the route, direction and stop combination as a shortcut using any name you wish.\n\nSuppose you take the bus to work and went through the process of asking for arrivals, telling Mycroft the bus route, direction and stop. Now say\n\n> transit save shortcut\n\nand Mycroft will prompt you for a name. If you say\n\n> rat race\n\nyou may get Arrivals or begin Bus Tracking using the shortcut\n\n>T bus tracking rat race\n\nTwo additional phrases\n\n> list T bus shortcuts\n\n> T bus remove shortcut rat race\n\nallow you to list and delete saved shortcuts.\n\n#### API Key\n\nWhen installed this skill does not use an API key when getting data from the MBTA servers. Using a key allows a higher rate limit when requesting data. It should not be necessary to use an API key but if you like you may obtain one on the [MBTA website](https://api-v3.mbta.com/register). In the skill settings on Mycroft Home check the box next to \"Use my API key\" and enter your key in the text field.\n\n</details>", - "authorname": "richhowley", - "examples": [ - "T Bus Arrivals.", - "T Bus Tracking.", - "Save Transit Shortcut.", - "T Bus Arrivals", - "T Bus Tracking", - "Save Transit Shortcut" - ], - "category": "Transport", - "tags": [ - "Transport", - "MBTA,Boston", - "MBTA,", - "Boston", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Announce arrivals of MBTA buses.", - "license": "gpl-3.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/bus.svg", - "credits": [ - "Rich Howley" - ], - "categories": [ - "Transport" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Mbta Bus Tracking Skill", - "android_handler": "mbta-bus-tracking-skill.richhowley.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "National Parks", - "foldername": "national-parks-skill", - "url": "https://github.com/richhowley/national-parks-skill", - "branch": "6139714e5a5c0d7e723b1aaffd912eef09954085", - "description": "Get listings of US National Parks by state, have Mycroft read descriptions of national parks and even test your knowledge of where National Parks are located. \n\nTo use this skill you will need to obtain an API key from the [National Park Service](https://www.nps.gov/subjects/developer/get-started.htm). Just follow the link and fill in the form, it's free and you will not be required to create an account. When the skill is installed there will be a new settings entry in the Skills section of [Mycroft Home](https://home.mycroft.ai) under National Parks. Paste in your API key and click the Save button. As soon as the skill picks up the API key it will be able to connect to the NPS servers.\n \nFor the purpose of this skill the term \"National Park\" is used loosely to refer to almost any property managed by the US National Park Service. Properties with a designation of National Monument, National Historic Site or National Recreation Area will be included in park listings. The only designation that is explicitly excluded from park listings is National Historic Trail. All information is provided by the National Park Service.\n\nWhen asking for a park description the skill will do a search on the words given, so one does not need to say the complete park name. For example, 'describe Edgar national park\", \"describe Edgar Allan national park\" and \"describe Edgar Allan Poe national park\" will all provide a description of Edgar Allan Poe National Historic Site. \n\nSince definite articles are dropped from speech, searches for descriptions of some properties will fail if they are included. For example, trying to hear a description of Rosie the Riveter WWII Home Front National Historical Park by saying \"describe Rosie the Riveter national park\" will fail but \"describe Rosie national park\" and \"describe Riveter national park\" will succeed.\n\nAfter asking to be quizzed Mycroft will ask what state a particular National Park Service property is in. The answer may be spoken after the beep without using the wake word but there will only be a few seconds to answer. If Mycroft does not respond to the answer use the wake word with \"Repeat national parks quiz\" and answer after the beep.", - "authorname": "richhowley", - "examples": [ - "List national parks in Utah.", - "Describe Yellowstone national park.", - "Quiz me on national parks.", - "Repeat national parks quiz.", - "List national parks in Utah", - "Describe Yellowstone national park", - "Quiz me on national parks", - "Repeat national parks quiz" - ], - "category": "Information", - "tags": [ - "Information", - "nationalparks", - "vacation", - "parks", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Information on US National Parks", - "license": "gpl-3.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/tree.svg", - "credits": [ - "@richhowley" - ], - "categories": [ - "Information" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "National Parks Skill", - "android_handler": "national-parks-skill.richhowley.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "lifx-mycroft", - "foldername": "lifx-mycroft", - "url": "https://github.com/samclane/lifx-mycroft", - "branch": "4ce8dabf2fa2d198289cdfd04ebc78ec2e616dc1", - "description": "Allows users to interact with the LIFX-brand smartbulbs on their home network through Mycroft. Can change power, brightness, color, and color-temperature of individual Lights and predefined Groups.", - "authorname": "samclane", - "examples": [ - "Turn off the bedroom light.", - "Set the bedroom light yellow.", - "Turn down the bedroom light.", - "Increase the bedroom light temperature.", - "Also uses Contexts.", - "Turn on the bedroom light.", - "Now turn it red.", - "Dim it.", - "->", - "Turn on the bedroom light", - "Now turn it red", - "Dim it" - ], - "category": "IoT", - "tags": [ - "lifx", - "home-automation", - "smartbulb", - "smartlight", - "IoT", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "A mycroft skill to control LIFX brand smart-bulbs.", - "license": "gpl-3.0", - "icon": "https://rawgithub.com/FortAwesome/Font-Awesome/master/advanced-options/raw-svg/solid/lightbulb.svg", - "credits": [ - "Sawyer McLane (@samclane)" - ], - "categories": [ - "IoT" - ], - "requirements": { - "python": [ - "fuzzywuzzy", - "lifxlan", - "webcolors>=1.11.1" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Lifx Mycroft Skill", - "android_handler": "lifx-mycroft.samclane.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Myepisodes", - "foldername": "myepisodes-skill", - "url": "https://github.com/brezuicabogdan/myepisodes-skill", - "branch": "4f338b91d32bc0ddc57a582b8aabf56863002bcd", - "description": "You will be able to ask mycroft to check the status of your shows list handled by [myepisodes.com](http://www.myepisodes.com).\n\nmycroft will be able to give you the number of episodes not acquired and optionally the number of episodes acquired but not watched.\n\nalso you will be able to find out the unacquired seasons and episdes numbers", - "authorname": "brezuicabogdan", - "examples": [ - "Check my episodes.", - "Any new episodes.", - "Check tv shows.", - "Any new episodes.", - "Anything new on my episodes.", - "Check my episodes", - "Any new episodes", - "Check tv shows", - "Any new episodes", - "Anything new on my episodes" - ], - "category": "Information", - "tags": [ - "Series", - "Information", - "Tv", - "Myepisodes.com", - "Myepisodes", - "Episodes", - "shows", - "Entertainment", - "Media", - "Tv shows", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Check the status of your [myepisodes.com](http://www.myepisodes.com) show list", - "license": "mit", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/tv.svg", - "credits": [ - "Bogdan Brezuica (@brezuicabogdan)" - ], - "categories": [ - "Information", - "Entertainment", - "Tv shows", - "Series", - "Media" - ], - "requirements": { - "python": [ - "feedparser" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Myepisodes Skill", - "android_handler": "myepisodes-skill.brezuicabogdan.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Pandora", - "foldername": "skill-pandora", - "url": "https://github.com/MycroftAI/skill-pandora", - "branch": "b2fdcd287253f6c6642dc08223fae5540e54e40d", - "description": "Pandora provides dynamically generated internet radio streams. Streams are\ninfluenced by the the traits of the music played and the songs you like\nor skip.\n\nUsing this skill does require a [Pandora.com](https://pandora.com) account.\nSign-up is free with ad-supported streams.", - "authorname": "MycroftAI", - "examples": [ - "Play Pandora.", - "Play Today's Hits Radio on Pandora.", - "Skip this song.", - "Next station.", - "Next song.", - "List my stations.", - "Play Pandora", - "Play Today's Hits Radio on Pandora", - "Skip this song", - "Next station", - "Next song", - "List my stations" - ], - "category": "Music", - "tags": [ - "music", - "Music", - "pandora", - "free", - "no-license" - ], - "platforms": [ - "all" - ], - "short_description": "Listen to the Pandora music service", - "license": "mit", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/music.svg", - "credits": [ - "Mycroft AI (@MycroftAI)" - ], - "categories": [ - "Music" - ], - "requirements": { - "system": { - "all": [ - "pianobar", - "piano-dev" - ], - "apt-get": [ - "pianobar", - "libpiano-dev" - ] - }, - "exes": [ - "pianobar" - ], - "python": [ - "fuzzywuzzy==0.18", - "json_database==0.5.5" - ], - "skill": [] - }, - "android": { - "android_icon": null, - "android_name": "Pandora Skill", - "android_handler": "skill-pandora.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Camera Skill", - "foldername": "skill-camera", - "url": "https://github.com/MycroftAI/skill-camera", - "branch": "a52e306f99d6a4468f3998ae85196f52bbcdad73", - "description": "Take singleshot photographs with the Camera Skill.", - "authorname": "MycroftAI", - "examples": [ - "Take a selfie.", - "Take a photograph.", - "Open the camera.", - "Start the camera app.", - "Take a selfie", - "Take a photograph", - "Open the camera", - "Start the camera app" - ], - "category": "Media", - "tags": [ - "GUI", - "Photograph", - "Camera", - "Images", - "Media", - "no-license" - ], - "platforms": [ - "platform_mark2", - "platform_plasmoid" - ], - "short_description": "Take photo's.", - "license": "apache-2.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/camera-retro.svg", - "credits": [ - "Aix (@aiix)" - ], - "categories": [ - "Media" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Camera Skill", - "android_handler": "skill-camera.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - }, - { - "skillname": "Homescreen", - "foldername": "skill-homescreen", - "url": "https://github.com/MycroftAI/skill-homescreen", - "branch": "b72800a2dd3518029541e092d49c1971f3ef56b6", - "description": "Homescreen provides a default display for Mycroft devices with a rich display such as the Mark II.\n\nBy default, the current time and date will be shown. Additional widgets can be activated to display other content such as the current weather.\n\nThe wallpaper may be changed randomly or a custom image can be defined in the Skill settings.", - "authorname": "MycroftAI", - "examples": [ - "Change the wallpaper.", - "Change the wallpaper" - ], - "category": "Configuration", - "tags": [ - "gui", - "Configuration", - "wallpaper", - "homescreen", - "display", - "no-license" - ], - "platforms": [ - "platform_mark2" - ], - "short_description": "A configurable homescreen", - "license": "apache-2.0", - "icon": "https://raw.githack.com/FortAwesome/Font-Awesome/master/svgs/solid/home.svg", - "credits": [ - "AIX (@AIIX)", - "Mycroft AI" - ], - "categories": [ - "Configuration" - ], - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Homescreen Skill", - "android_handler": "skill-homescreen.mycroftai.home" - }, - "desktop": {}, - "desktopFile": true - } - ] -} \ No newline at end of file diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/json_database/OVOS.jsondb b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/json_database/OVOS.jsondb deleted file mode 100644 index e3e232b4..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/json_database/OVOS.jsondb +++ /dev/null @@ -1,472 +0,0 @@ -{ - "OVOS": [ - { - "title": "CaffeineWiz", - "url": "https://github.com/NeonGeckoCom/caffeinewiz.neon", - "summary": "Provides the caffeine content of various drinks on request. Multiple drinks in a row are possible.", - "short_description": "Provides the caffeine content of various drinks on request. Multiple drinks in a row are possible.", - "description": "The skill provides the functionality to inform the user of the caffeine content of the requested drink by collecting the required information from two data sources: 1. [http://caffeinewiz.com/](http://caffeinewiz.com/) - the main source of information for the drink’s database 2. [https://www.caffeineinformer.com/the-caffeine-database](https://www.caffeineinformer.com/the-caffeine-database) - secondary source for any non-duplicate drinks CaffeineWiz uses [BeautifulSoup](https://www.crummy.com/software/BeautifulSoup/bs4/doc/) to pull the tables from the websites above, then strips the html tags, and later formats the results into the comprehensive list. That object is pickled for the future use. The skill will check for updates periodically. You can modify that time period by changing `TIME_TO_CHECK` parameter on top of the file in the init.", - "examples": [ - "tell me caffeine content of pepsi.", - "how much caffeine is in starbucks blonde?", - "tell me caffeine content of rocket chocolate.", - "Tell me caffeine content of Pepsi.", - "How much caffeine is in Starbucks Blonde?", - "Tell me caffeine content of Rocket Chocolate." - ], - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "i386", - "x86_64", - "ia64", - "arm64", - "arm" - ], - "branch": "v0.1.1", - "license": "NeonAI License v1.0", - "icon": "logo.svg", - "category": "Information", - "categories": [ - "Information", - "Daily" - ], - "tags": [ - "NeonGecko", - "NeonAI", - "caffeine", - "coffee", - "Information", - "Daily" - ], - "skillname": "CaffeineWiz", - "authorname": "NeonGeckoCom", - "foldername": "caffeinewiz.neon", - "appstore": "OpenVoiceOS", - "appstore_url": "https://openvoiceos.github.io/OVOS-skills-store/caffeineWiz.json", - "last_updated": "2021-08-10T22:09:37Z", - "version": "v0.1.1", - "credits": [ - "@NeonGeckoCom\n@reginaneon\n@NeonDaniel" - ], - "requirements": { - "python": [ - "git+https://github.com/neongeckocom/neon-skill-utils" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Caffeinewiz.Neon Skill", - "android_handler": "caffeinewiz.neon.neongeckocom.home" - }, - "desktop": {} - }, - { - "skillname": "skill-ddg", - "authorname": "JarbasSkills", - "foldername": "skill-ddg", - "url": "https://github.com/JarbasSkills/skill-ddg", - "branch": "v0.1.0", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "i386", - "x86_64", - "ia64", - "arm64", - "arm" - ], - "examples": [ - "ask the duck about the big bang", - "who is elon musk", - "tell me more", - "when was stephen hawking born", - "continue" - ], - "license": "apache-2.0", - "requirements": { - "python": [ - "google_trans_new", - "requests", - "RAKEkeywords" - ], - "system": {}, - "skill": [] - }, - "download_url": "https://github.com/JarbasSkills/skill-ddg/archive/v0.1.0.tar.gz", - "icon": "https://github.com/JarbasSkills/skill-ddg/res/icon/ddg.png", - "description": "Uses the [DuckDuckGo API](https://duckduckgo.com/api) to provide information. \n\nNOTE: this is meant a better alternative to the official duck duck go skill, it will be blacklisted", - "short_description": "Use DuckDuckGo to answer questions", - "category": "Information", - "categories": [ - "Information" - ], - "tags": [ - "searchengine", - "search-engine", - "duckduckgo", - "query", - "Information", - "permissive-license" - ], - "appstore": "OpenVoiceOS", - "appstore_url": "https://openvoiceos.github.io/OVOS-skills-store/skill-ddg.json", - "last_updated": "2021-05-18T16:48:25Z", - "version": "v0.1.0", - "logo": "https://raw.githubusercontent.com/JarbasSkills/skill-ddg/v0.1.0/ui/logo.png", - "android": { - "android_icon": "https://raw.githubusercontent.com/JarbasSkills/skill-ddg/v0.1.0/res/icon/ddg.png", - "android_name": "Ddg Skill", - "android_handler": "skill-ddg.jarbasskills.home" - }, - "desktop": { - "Terminal": "false", - "Type": "Application", - "Name": "DuckDuckGo Skill", - "Exec": "mycroft-gui-app --hideTextInput --skill=skill-ddg.jarbasskills.home", - "Icon": "ddg.png", - "Categories": "VoiceApp", - "StartupNotify": "false", - "X-DBUS-StartupType": "None", - "X-KDE-StartupNotify": "false" - }, - "name": "DuckDuckGo" - }, - { - "title": "Launcher", - "url": "https://github.com/NeonGeckoCom/launcher.neon", - "summary": "Skill used to launch programs in Ubuntu", - "short_description": "Launcher skill", - "description": "This example skill is used to launch desktop applications.", - "examples": [ - "launch chrome", - "avigate to google.com" - ], - "desktopFile": true, - "warning": "", - "systemDeps": false, - "platforms": [ - "i386", - "x86_64", - "ia64", - "arm64", - "arm" - ], - "branch": "v0.1.0", - "license": "other", - "icon": "https://0000.us/klatchat/app/files/neon_images/icons/neon_paw.png", - "category": null, - "categories": [ - "" - ], - "tags": [ - "" - ], - "skillname": "Launcher", - "authorname": "NeonGeckoCom", - "foldername": "launcher.neon", - "appstore": "OpenVoiceOS", - "appstore_url": "https://openvoiceos.github.io/OVOS-skills-store/Launcher.json", - "last_updated": "2021-08-10T21:58:43Z", - "requirements": { - "python": [], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Launcher.Neon Skill", - "android_handler": "launcher.neon.neongeckocom.home" - }, - "desktop": {} - }, - { - "name": "Wolfram Alpha", - "skillname": "skill-wolfie", - "authorname": "JarbasSkills", - "foldername": "skill-wolfie", - "url": "https://github.com/JarbasSkills/skill-wolfie", - "branch": "v0.1", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "download_url": "https://github.com/JarbasSkills/skill-wolfie/archive/v0.1.tar.gz", - "examples": [ - "ask the wolf what is the speed of light", - "How tall is Mount Everest?", - "When was The Rocky Horror Picture Show released?", - "What is Madonna's real name?", - "What's 18 times 4?", - "How many inches in a meter?" - ], - "appstore": "OpenVoiceOS", - "appstore_url": "https://openvoiceos.github.io/OVOS-skills-store/skill-wolfie.json", - "license": "apache-2.0", - "tags": [ - "general-knowledge", - "Information", - "wolfram-alpha", - "query", - "information", - "no-license" - ], - "version": "v0.1", - "icon": "https://github.com/JarbasSkills/skill-wolfie/res/icon/wolfie.png", - "description": "Ask general-knowledge queries of your Mycroft device. \nCommonQuery skill for [Wolfram Alpha](https://wolframalpha.com). \nYou'll be surprised by how much it knows!\n\nYou can also explicitly request to \"ask the wolf\"\n\nNOTE: this is meant to be a better alternative to the official mycroft skill, it will blacklist the official skill!!", - "short_description": "Use Wolfram Alpha for general knowledge questions", - "category": "Information", - "categories": [ - "Information" - ], - "logo": "https://raw.githubusercontent.com/JarbasSkills/skill-wolfie/v0.1/ui/logo.png", - "requirements": { - "python": [ - "google_trans_new", - "requests>=2.13.0" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": "https://raw.githubusercontent.com/JarbasSkills/skill-wolfie/v0.1/res/icon/wolfie.png", - "android_name": "Wolfie Skill", - "android_handler": "skill-wolfie.jarbasskills.home" - }, - "desktop": { - "Terminal": "false", - "Type": "Application", - "Name": "Wolfram Alpha Skill", - "Exec": "mycroft-gui-app --hideTextInput --skill=skill-wolfie.jarbasskills.home", - "Icon": "wolfie.png", - "Categories": "VoiceApp", - "StartupNotify": "false", - "X-DBUS-StartupType": "None", - "X-KDE-StartupNotify": "false" - } - }, - { - "title": "Alerts", - "url": "https://github.com/NeonGeckoCom/alerts.neon", - "summary": "A skill to schedule alarms, timers, and reminders", - "short_description": "A skill to schedule alarms, timers, and reminders", - "description": "The skill provides functionality to create alarms, timers and reminders, remove them by name, time, or type, and ask for what is active. You may also silence all alerts and ask for a summary of what was missed if you were away, your device was off, or you had quiet hours enabled. Alarms and reminders may be set to recur daily or weekly. An active alert may be snoozed for a specified amount of time while it is active. Any alerts that are not acknowledged will be added to a list of missed alerts that may be read and cleared when requested.", - "examples": [ - "set an alarm for 8 am", - "when is my next alarm", - "cancel my 8 am alarm", - "set a 5 minute timer", - "how much time is left", - "remind me to go home at 6", - "remind me to take out the trash every thursday at 7 pm", - "what are my reminders", - "cancel all (alarms/timers/reminders)", - "go to sleep", - "quiet hours", - "stop", - "snooze", - "snooze for 1 minute", - "wake up", - "what did i miss", - "did i miss anything" - ], - "desktopFile": false, - "warning": "", - "systemDeps": false, - "requirements": { - "python": [ - "lingua-franca~=0.3.1", - "spacy~=2.3.1", - "https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-2.3.1/en_core_web_sm-2.3.1.tar.gz", - "json_database~=0.5.5", - "git+https://github.com/neongeckocom/neon-skill-utils" - ], - "system": {}, - "skill": [] - }, - "incompatible_skills": [ - "https://github.com/mycroftai/skill-reminder", - "https://github.com/mycroftai/skill-alarm", - "https://github.com/mycroftai/mycroft-timer" - ], - "platforms": [ - "i386", - "x86_64", - "ia64", - "arm64", - "arm" - ], - "branch": "v0.1.0", - "license": "NeonAI License v1.0", - "icon": "logo.svg", - "category": "Productivity", - "categories": [ - "Productivity", - "Daily" - ], - "tags": [ - "NeonGecko", - "NeonAI", - "alert", - "alarm", - "timer", - "reminder", - "schedule", - "Productivity", - "Daily", - "no-license" - ], - "skillname": "Alerts", - "authorname": "Neon", - "foldername": "alerts.neon", - "download_url": "https://api.github.com/repos/NeonGeckoCom/alerts.neon/zipball/master", - "appstore": "OpenVoiceOS", - "appstore_url": "https://openvoiceos.github.io/OVOS-skills-store/Alerts.json", - "version": "v0.1.0", - "credits": [ - "@NeonGeckoCom\n@NeonDaniel" - ], - "android": { - "android_icon": null, - "android_name": "Alerts.Neon Skill", - "android_handler": "alerts.neon.neongeckocom.home" - }, - "desktop": {} - }, - { - "url": "https://github.com/JarbasSkills/skill-icanhazdadjokes", - "branch": "v0.1.0", - "appstore": "OpenVoiceOS", - "appstore_url": "https://openvoiceos.github.io/OVOS-skills-store/skill-icanhazdadjokes.json", - "authorname": "JarbasSkills", - "foldername": "skill-icanhazdadjokes", - "license": "apache-2.0", - "tags": [ - "funny", - "humor", - "joke", - "jokes", - "Entertainment", - "humour", - "no-license" - ], - "version": "v0.1.0", - "icon": "https://github.com/JarbasSkills/skill-icanhazdadjokes/res/icon/dadjokes.png", - "skillname": "skill-icanhazdadjokes", - "description": "Brighten your day with dad humor. \n\n _WARNING: Laughter is not guaranteed, but eye rolls are likely._\n\nWorks in all languages\n\nNOTE: this will automatically blacklist the official mycroft skill", - "short_description": "Let Mycroft brighten your day with a little humor from [icanhazdadjoke](icanhazdadjoke.com)", - "examples": [ - "tell me a joke", - "say a joke", - "do you know any jokes", - "can you tell jokes", - "make me laugh", - "tell me a joke about dentists", - "do you know any chuck norris jokes" - ], - "category": "Entertainment", - "categories": [ - "Entertainment" - ], - "logo": "https://raw.githubusercontent.com/JarbasSkills/skill-icanhazdadjokes/v0.1.0/ui/logo.png", - "requirements": { - "python": [ - "google_trans_new", - "pyjokes" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": "https://raw.githubusercontent.com/JarbasSkills/skill-icanhazdadjokes/v0.1.0/res/icon/dadjokes.png", - "android_name": "Icanhazdadjokes Skill", - "android_handler": "skill-icanhazdadjokes.jarbasskills.home" - }, - "desktop": { - "Terminal": "false", - "Type": "Application", - "Name": "Jokes Skill", - "Exec": "mycroft-gui-app --hideTextInput --skill=skill-icanhazdadjokes.jarbasskills.home", - "Icon": "dadjokes.png", - "Categories": "VoiceApp", - "StartupNotify": "false", - "X-DBUS-StartupType": "None", - "X-KDE-StartupNotify": "false" - }, - "desktopFile": false, - "name": "Jokes", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ] - }, - { - "title": "Speed Test", - "url": "https://github.com/NeonGeckoCom/speed-test.neon", - "summary": "Skill used to test your internet speed", - "short_description": "Skill used to test your internet speed", - "description": "This skill uses speedtest.net to check your internet speed", - "examples": [ - "run a speed test" - ], - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "i386", - "x86_64", - "ia64", - "arm64", - "arm" - ], - "branch": "v0.1.0", - "license": "NeonAI Licensed", - "icon": "https://0000.us/klatchat/app/files/neon_images/icons/neon_paw.png", - "category": null, - "categories": [ - "" - ], - "tags": [ - "", - "no-license" - ], - "skillname": "Speed Test", - "authorname": "NeonGeckoCom", - "foldername": "speed-test.neon", - "appstore": "OpenVoiceOS", - "appstore_url": "https://openvoiceos.github.io/OVOS-skills-store/speed-test.json", - "version": "v0.1.0", - "credits": [ - "reginaneon [neongeckocom](https://neongecko.com/) Mycroft AI" - ], - "requirements": { - "python": [ - "git+https://github.com/neongeckocom/neon-skill-utils", - "speedtest-cli" - ], - "skill": [], - "system": {} - }, - "android": { - "android_icon": null, - "android_name": "Speed Test.Neon Skill", - "android_handler": "speed-test.neon.neongeckocom.home" - }, - "desktop": {} - } - ] -} \ No newline at end of file diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/json_database/Pling.jsondb b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/json_database/Pling.jsondb deleted file mode 100644 index 7fcc3d5c..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/json_database/Pling.jsondb +++ /dev/null @@ -1,3106 +0,0 @@ -{ - "Pling": [ - { - "skillname": "Youtube Skill", - "authorname": "AIIX", - "foldername": "", - "url": "https://github.com/AIIX/youtube-skill", - "branch": "new-ui", - "warning": "", - "desktopFile": true, - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "Youtube metallica", - "Youtube paradise city by guns and roses", - "Pause youtube", - "Resume youtube" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/9/2/c/6/78914ead090d1ec2674e7c9f927d68b57e28.png", - "category": "Entertainment", - "created": "2019-11-13T07:29:49+00:00", - "modified": "2020-06-03T07:46:00+00:00", - "description": "Play and stream youtube videos", - "tags": [ - "original-product", - "apache-license", - "mycroft-mk2", - "mycroft-bigscreen", - "mycroft-phone", - "mycroft", - "skills", - "gui", - "youtube", - "addon" - ], - "version": "1.0", - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1336153" - }, - { - "skillname": "Soundcloud Music Player", - "authorname": "AIIX", - "foldername": "", - "url": "https://github.com/AIIX/soundcloud-audio-player", - "branch": "master", - "desktopFile": true, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "Soundcloud metallica", - "Soundcloud paradise city by guns and roses", - "Pause/Resume soundcloud" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/9/8/f/f/0f4864757c543dc3591c5a5a496c2061c0d9.png", - "category": "Entertainment", - "created": "2019-12-23T12:14:15+00:00", - "modified": "2020-06-03T08:19:23+00:00", - "description": "Play songs and music from soundcloud, SoundCloud is a music and podcast streaming platform that lets you listen to millions of songs from around the world, This skill enables you to stream and search for your favorite soundcloud tracks on your device.", - "tags": [ - "original-product", - "apache-license", - "mycroft-mk2", - "mycroft-bigscreen", - "mycroft-phone", - "addon", - "gui", - "mycroft", - "skill", - "soundcloud" - ], - "version": "1.0", - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1346946" - }, - { - "skillname": "BitChute Skill", - "authorname": "AIIX", - "foldername": "", - "url": "https://github.com/AIIX/bitchute-skill", - "branch": "master", - "desktopFile": true, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "Bitchute Gorillaz", - "Bitchute Nightstep Music", - "Pause Bitchute" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/5/8/d/d/8401dd73db47e19535e89f3778923ac51bd6.jpg", - "category": "Entertainment", - "created": "2020-02-25T07:01:21+00:00", - "modified": "2020-06-03T08:25:25+00:00", - "description": "Watch videos from BitChute a content sharing peer-to-peer platform.", - "tags": [ - "original-product", - "mycroft-mk2", - "mycroft-bigscreen", - "mycroft-phone", - "gplv3", - "addon", - "mycroft", - "bitchute", - "music", - "gaming" - ], - "version": "1.0", - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1362744" - }, - { - "skillname": "Stephen Hawking Tribute Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-stephen-hawking", - "branch": "master", - "desktopFile": false, - "warning": "", - "systemDeps": true, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "When was Stephen Hawking born?", - "When did Stephen Hawking die?", - "Quote from Stephen Hawking" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/7/0/0/4/32a8757ed1235586220ace33876997e3fe9f.jpg", - "category": "Entertainment", - "created": "2020-06-08T18:12:50+00:00", - "modified": "2020-06-14T17:36:27+00:00", - "description": "Stephen Hawkin Quotes", - "tags": [ - "mit-license", - "original-product", - "mycroft", - "tribute", - "quotes", - "espeak", - "skills", - "addon" - ], - "version": null, - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1391544" - }, - { - "skillname": "Evil Laugh Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-laugh", - "branch": "master", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "evil laugh" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/1/5/8/9/761c28e3961035a100a7b177aafd6452908a.jpg", - "category": "Entertainment", - "created": "2020-06-08T20:20:59+00:00", - "modified": "2020-06-14T17:36:09+00:00", - "description": "Haunt your mycroft with Evil Laugh sounds", - "tags": [ - "original-product", - "apache-license", - "mycroft", - "skills", - "halloween", - "haunted", - "laugh", - "addon" - ], - "version": null, - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1391552" - }, - { - "skillname": "Confucius Quotes Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-confucius-quotes", - "branch": "master", - "desktopFile": false, - "warning": "", - "systemDeps": "false", - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "What would Confucius say", - "Quote from Confucius" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/9/a/0/a/911c8e22a76e9202708adff045237691ee41.jpg", - "category": "Entertainment", - "created": "2020-06-09T14:41:51+00:00", - "modified": "2020-12-21T10:50:38+00:00", - "description": "Confucius Quotes and basic information", - "tags": [ - "mycroft", - "skills", - "quotes", - "apache-license", - "original-product", - "mycroft-mk2", - "mycroft-bigscreen", - "mycroft-phone", - "addon" - ], - "version": null, - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1391873" - }, - { - "skillname": "Astronomy Picture of the Day Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-apod", - "branch": "master", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "foo", - "bahr" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/d/4/3/1/ac2b88eaa5016479aa4a25d6817f0b924f07.png", - "category": "Entertainment", - "created": "2020-06-09T15:28:17+00:00", - "modified": "2020-06-14T17:35:51+00:00", - "description": "Nasa's Astronomy Picture of the Day", - "tags": [ - "original-product", - "apache-license", - "mycroft", - "skill", - "apod", - "astronomy", - "picture", - "addon" - ], - "version": null, - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1391890" - }, - { - "skillname": "Bandcamp Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-bandcamp", - "branch": "v0.3.1", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "play compressorhead", - "play freezing moon by mayhem", - "play astronaut problems", - "search bandcamp for black metal", - "play center of all infinity album" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/f/8/0/a/959495b4922f745e90c6df8a4b2828586aba2e96e7db24c873e836714ab7f5966a18.png", - "category": "Entertainment", - "created": "2020-06-11T06:04:59+00:00", - "modified": "2021-04-03T20:56:29+00:00", - "description": "Bandcamp skill for your hipster music needs", - "tags": [ - "apache-license", - "original-product", - "addon", - "mycroft", - "skills", - "music", - "bandcamp" - ], - "version": "0.3.1", - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1392471" - }, - { - "skillname": "Twitch Streams", - "authorname": "AIIX", - "foldername": "", - "url": "https://github.com/AIIX/twitch-streams", - "branch": "master", - "warning": "", - "desktopFile": true, - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "Show Twitch Streams", - "Play Twitch Stream By [User]" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/6/6/0/0/4e1d5f3950305fa65667b4d51ceeb52f7131.png", - "category": "Entertainment", - "created": "2020-06-12T07:17:45+00:00", - "modified": "2020-06-12T07:18:04+00:00", - "description": "Play current popular live twitch streams", - "tags": [ - "gplv3", - "original-product", - "mycroft-mk2", - "mycroft-bigscreen", - "mycroft-phone", - "addon", - "mycroft", - "skills", - "twitch", - "live" - ], - "version": "1.0", - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1392895" - }, - { - "skillname": "Quote of the Day Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-quote-of-day", - "branch": "master", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "quote of the day", - "funny quote of the day", - "inspirational quote for today", - "who said that", - "where do you get your quotes", - "can your quotes be trusted" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/c/9/3/2/06960cc119696d18a713ed6987ba57a56431.png", - "category": "Entertainment", - "created": "2020-06-13T22:08:02+00:00", - "modified": "2020-06-13T22:08:11+00:00", - "description": "Quote of the day<br />\n<br />\nAvailable categories:<br />\n- inspire<br />\n - management<br />\n - sports<br />\n- life<br />\n - funny<br />\n- love<br />\n- art<br />\n- students", - "tags": [ - "addon", - "mycroft", - "skill", - "quote", - "quotes", - "api", - "original-product", - "apache-license" - ], - "version": null, - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1393542" - }, - { - "skillname": "Pickup Lines Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-pickup-lines", - "branch": "master", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "tell me a pickup line", - "say a geeky pickup line", - "say a lord of the rings pickup line" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/e/4/0/8/750c4117482ebaf4904fbb37e0a212f11c0a.png", - "category": "Entertainment", - "created": "2020-06-13T23:01:22+00:00", - "modified": "2020-06-13T23:01:30+00:00", - "description": "Pickup lines from http://www.pickuplinegen.com/ and https://www.pickuplinesgalore.com/<br />\nUse in front of others at your own risk", - "tags": [ - "apache-license", - "original-product", - "addon", - "mycroft", - "skill", - "funny", - "pickup" - ], - "version": null, - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1393547" - }, - { - "skillname": "Algorithmic Art Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-algorithmic-art", - "branch": "master", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "draw a picture" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/2/1/e/3/b878e797e977f76168cd60eac79470efb0b4.png", - "category": "Entertainment", - "created": "2020-06-14T17:26:50+00:00", - "modified": "2020-06-14T17:26:58+00:00", - "description": "Creating art from math<br />\n<br />\nThis skill is optimized for use as an idle screen", - "tags": [ - "mycroft", - "skills", - "idle", - "pictures", - "art", - "apache-license", - "original-product", - "addon" - ], - "version": null, - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1393912" - }, - { - "skillname": "Xkcd Comics Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-xkcd", - "branch": "master", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "open the xkcd website", - "show me the latest xkcd comic", - "random xkcd", - "display comic number 2020", - "how many xkcd comics" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/0/b/7/7/42af971da34359a6b4bf3876de01292031a5.png", - "category": "Entertainment", - "created": "2020-06-16T13:54:22+00:00", - "modified": "2020-06-16T13:54:31+00:00", - "description": "Comics from https://xkcd.com/<br />\n<br />\nCan be used as idle screen for mark2", - "tags": [ - "original-product", - "mycroft-mk2", - "mycroft-bigscreen", - "mycroft-phone", - "apache-license", - "addon", - "mycroft", - "skills", - "xkcd", - "comics", - "mark2" - ], - "version": null, - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1394593" - }, - { - "skillname": "National Geographic Picture of the Day Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-natgeo-pod", - "branch": "master", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "National Geographic picture of the day" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/9/b/b/5/aa253e358c4f8fec4db89b777dd45be6c2c1.png", - "category": "Entertainment", - "created": "2020-06-25T16:56:24+00:00", - "modified": "2020-06-25T18:42:38+00:00", - "description": "National Geographic Picture of the Day<br />\n<br />\nCan be used as idle screen for mark2", - "tags": [ - "idle", - "mycroft", - "skill", - "pictures", - "mark2", - "addon", - "original-product", - "apache-license" - ], - "version": null, - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1397567" - }, - { - "skillname": "Parrot Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-parrot", - "branch": "v0.2.1", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "start parrot", - "repeat everything you hear", - "stop repeating me", - "stop parrot", - "Repeat what you just said", - "Repeat that", - "Can you repeat that?", - "What did I just say?", - "Tell me what I just said.", - "say Goodnight, Gracie", - "repeat Once upon a midnight dreary, while I pondered, weak and weary, Over many a quaint and curious volume of forgotten lore", - "speak I can say anything you'd like!" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/7/8/b/2/a8f20708cf769bcd6fcd1e49bb714b96aef3.png", - "category": "Entertainment", - "created": "2020-07-05T21:38:57+00:00", - "modified": "2021-02-25T21:35:55+00:00", - "description": "Make Mycroft repeat whatever you want, Turn Mycroft into a parrot. Speak a phrase and listen to it repeated<br />\n<br />\nRepeats recent audio transcriptions and text to speech outputs<br />\n<br />\n* \"Repeat what you just said\"<br />\n* \"Repeat that\"<br />\n* \"Can you repeat that?\"<br />\n* \"What...", - "tags": [ - "apache-license", - "mycroft-bigscreen", - "mycroft-mk2", - "mycroft-phone", - "original-product", - "addon", - "mycroft", - "skill", - "echo", - "test", - "repeat" - ], - "version": "0.2.1", - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1400315" - }, - { - "skillname": "Futurism Cartoons Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-futurism-cartoons", - "branch": "master", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "show me the latest futurism comic", - "random futurism cartoon", - "how many futurism comics" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/d/c/2/9/d7a004fa608f725eb102498d508b86c3cba12722531a3db38f670797a56f30e18e7c.png", - "category": "Entertainment", - "created": "2020-08-06T13:17:27+00:00", - "modified": "2020-08-06T13:17:38+00:00", - "description": "Comics from futurism cartoons - https://www.instagram.com/futurismcartoons<br />\n<br />\nCan be used as idle screen for mark2", - "tags": [ - "apache-license", - "original-product", - "mycroft-mk2", - "mycroft-bigscreen", - "mycroft-phone", - "mycroft", - "skill", - "cartoon", - "comic", - "skills", - "addon" - ], - "version": null, - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1410005" - }, - { - "skillname": "Old World Radio Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-old-world-radio", - "branch": "v0.2", - "desktopFile": true, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "play old world radio" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/2/a/a/0/cd3415231aa85089573c1fcbffa8881206515f1259352d19663902cb2259b2e39757.png", - "category": "Entertainment", - "created": "2020-08-10T14:28:52+00:00", - "modified": "2021-03-10T14:54:29+00:00", - "description": "Old World Radio <br />\n<br />\nSoundtrack of the fallout games", - "tags": [ - "mycroft", - "skills", - "fallout", - "radio", - "music", - "original-product", - "mycroft-bigscreen", - "mycroft-mk2", - "mycroft-phone", - "apache-license", - "addon" - ], - "version": "0.2", - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1411250" - }, - { - "skillname": "H. P. Lovecraft Literary Podcast Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-hppodcraft", - "branch": "master", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "play lovecraft podcast", - "play lovecraft podcast episode #N", - "play the temple by lovecraft", - "play the call of cthulhu" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/5/6/8/6/dce1cb4641c8d4297f6463c918a100463a170133ddeee1b136754a9158f2140e0a0d.png", - "category": "Entertainment", - "created": "2020-08-12T16:28:20+00:00", - "modified": "2021-03-10T14:51:18+00:00", - "description": "The H.P. Lovecraft Literary Podcast has been creating podcasts and audio productions since 2009<br />\n<br />\nListen to the podcasts or selected readings<br />\n<br />\nEach week, hosts Chad Fifer and Chris Lackey discuss a piece of weird fiction.<br />\nTalented voice actors bring the text to life....", - "tags": [ - "addon", - "podcast", - "lovecraft", - "audiobook", - "mycroft", - "skills", - "apache-license", - "original-product", - "mycroft-bigscreen", - "mycroft-mk2", - "mycroft-phone" - ], - "version": "0.2", - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1411995" - }, - { - "skillname": "Epic Horror Theatre Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-epic-horror-theatre", - "branch": "v0.2.1", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "read the shadow over innsmouth", - "play innsmouth audiobook", - "read the color out of space", - "read lovecraft" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/b/c/0/c/4544e87ab0093941ac5d995d73fb442be2f76e839d8ffab81a9346b616e80ab97c95.png", - "category": "Entertainment", - "created": "2020-08-17T23:05:50+00:00", - "modified": "2021-03-11T07:13:48+00:00", - "description": "Radio drama adaptions of H. P. Lovecraft<br />\n<br />\nThis skill brings to you:<br />\n<br />\n- a radio drama adaptation of H.P. Lovecraft's classic tale, \"The Color Out Of Space\" directed by Ron N. Butler and published by the Atlanta Radio Theatre Company! Written in March 1927, tonight's tale...", - "tags": [ - "addon", - "mycroft", - "lovecraft", - "audiobook", - "skills", - "audio", - "apache-license", - "original-product", - "mycroft-bigscreen", - "mycroft-mk2", - "mycroft-phone" - ], - "version": "v0.2.1", - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1413570" - }, - { - "skillname": "Dagon, A Lovecraft Story Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-dagon", - "branch": "v0.4.0", - "desktopFile": true, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "play dagon by lovecraft", - "play dagon audiobook", - "read dagon", - "play dagon video" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/3/f/7/3/ed3acc1c038c8ac928bda303de6c3bcc15b7e3bdaf41b890c187c28025bf96e72593.png", - "category": "Entertainment", - "created": "2020-08-26T21:17:10+00:00", - "modified": "2021-03-10T14:47:18+00:00", - "description": "This skill brings to you an adaption of Dagon, by H. P. Lovecraft<br />\n<br />\nAn illustrated reading of 'Dagon' by H.P. Lovecraft. Read by Mike Bennett, illustrated by Christopher Steininger.<br />\n\"Dagon\" is a short story by American author H. P. Lovecraft. It was written in July 1917 and is...", - "tags": [ - "apache-license", - "original-product", - "mycroft-bigscreen", - "mycroft-mk2", - "mycroft-phone", - "addon", - "mycroft", - "lovecraft", - "audiobook", - "video", - "story" - ], - "version": "0.4.0", - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1416131" - }, - { - "skillname": "Wayne June Lovecraft Readings Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-wayne-june-lovecraft", - "branch": "v0.2", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "read the thing on the doorstep by lovecraft", - "play the tomb audiobook", - "read the shunned house" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/6/c/d/d/bb2497a37aa2af948ad95b1696b10ee1d32c2b299fdb6787e7c43686cd7202efe581.png", - "category": "Entertainment", - "created": "2020-08-27T02:48:01+00:00", - "modified": "2021-03-10T14:58:14+00:00", - "description": "Wayne June readings of H. P. Lovecraft<br />\n- \"The Thing on the Doorstep\" is a horror short story by American writer H. P. Lovecraft, part of the Cthulhu Mythos universe. It was written in August 1933, and first published in the January 1937 issue of Weird Tales. Daniel Upton, the story's...", - "tags": [ - "lovecraft", - "audiobook", - "reading", - "mycroft", - "skill", - "addon", - "original-product", - "mycroft-bigscreen", - "mycroft-mk2", - "mycroft-phone", - "apache-license" - ], - "version": "0.2", - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1416233" - }, - { - "skillname": "Peertube Skill", - "authorname": "AIIX", - "foldername": "", - "url": "https://github.com/AIIX/peertube-skill", - "branch": "main", - "warning": "", - "desktopFile": true, - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "Show me what's trending on Peertube", - "Peertube Metallica", - "Search Peertube for Guns & Roses" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/8/e/8/7/41038723e57a30fafe3572b27d2dd75e6f09733b0c48d18b440d1ae45ebac60f4cd3.png", - "category": "Entertainment", - "created": "2020-11-11T17:44:41+00:00", - "modified": "2020-11-11T17:44:58+00:00", - "description": "Peertube Skill for Browsing Peertube instances & Streaming Peertube Videos<br />\n<br />\nSupports Following Instances:<br />\n- Peertube UK Instance<br />\n- Peertube Austrian Instance<br />\n- Peertube Scandinavian Instance<br />\n- Peertube European Instance<br />\n- Peertube Italian Instance", - "tags": [ - "original-product", - "mycroft-mk2", - "mycroft-bigscreen", - "mycroft-phone", - "apache-license", - "addon", - "peertube", - "mycroft", - "videos", - "multimedia", - "music" - ], - "version": "1.0", - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1444313" - }, - { - "skillname": "Jokes", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-icanhazdadjokes", - "branch": "master", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "tell me a joke", - "say a joke", - "do you know any jokes", - "can you tell jokes", - "make me laugh", - "tell me a joke about dentists", - "do you know any chuck norris jokes" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/0/e/8/b/8410b647ca8c07b9839e00bd6ef020458047ce42cdec36296a43b9bbe2afe94ccb78.png", - "category": "Entertainment", - "created": "2020-12-17T13:10:36+00:00", - "modified": "2020-12-17T13:10:48+00:00", - "description": "Let Mycroft brighten your day with a little humor from icanhazdadjoke<br />\n<br />\nChuck Norris jokes powered by pyjokes<br />\n## About <br />\nBrighten your day with dad humor. <br />\n<br />\n _WARNING: Laughter is not guaranteed, but eye rolls are likely._<br />\n<br />\nWorks in all...", - "tags": [ - "apache-license", - "original-product", - "mycroft-mk2", - "mycroft-bigscreen", - "mycroft-phone", - "addon", - "mycroft", - "skills", - "jokes", - "laugh" - ], - "version": null, - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1460970" - }, - { - "skillname": "HorrorBabble Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-horrorbabble", - "branch": "v0.1", - "desktopFile": true, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "open horror babble menu", - "play horror audio books" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/7/9/8/5/90effb30c55113d1f9cd6cbd2ad6d26ceae56e44a869775a5a2582944c3d8bef6184.png", - "category": "Entertainment", - "created": "2021-03-10T15:10:50+00:00", - "modified": "2021-03-10T15:11:23+00:00", - "description": "Audio Horror, readings of lovecraftian stories from HorrorBabble<br />\n<br />\nhttps://www.horrorbabble.com", - "tags": [ - "addon", - "horror", - "lovecraft", - "audiobook", - "story", - "better-cps", - "apache-license", - "original-product", - "mycroft-bigscreen", - "mycroft-mk2", - "mycroft-phone" - ], - "version": "0.1", - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1489806" - }, - { - "skillname": "SovietWave Radio Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-sovietwave", - "branch": "v0.1", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "open sovietwave menu", - "play sovietwave radio" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/a/8/8/0/cfd9c839eda4b189954fb02f98f3b9c73cd479da9fe9e92b17cbda92b20beba37fff.png", - "category": "Entertainment", - "created": "2021-03-10T15:28:03+00:00", - "modified": "2021-03-10T15:28:15+00:00", - "description": "SovietWave Radio for mycroft", - "tags": [ - "apache-license", - "mycroft-bigscreen", - "mycroft-mk2", - "mycroft-phone", - "original-product", - "addon", - "radio", - "better-cps", - "media", - "sovietwave", - "music" - ], - "version": "0.1", - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1489813" - }, - { - "skillname": "Cult Cinema Classics Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-ccc", - "branch": "v0.1", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "open cult movie classics menu", - "play zontar the thing from venus movie", - "play cult movie classics", - "play invasion of the saucer men" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/9/6/e/0/47bcb5bbdf56193a22301dfb4a16584485392d6a1c829a944cab77da70c5083cb0f1.jpg", - "category": "Entertainment", - "created": "2021-03-10T15:52:06+00:00", - "modified": "2021-03-10T15:52:17+00:00", - "description": "Public Domain movies from the Cult movie classics channel", - "tags": [ - "addon", - "better-cps", - "movies", - "classics", - "media", - "mycroft", - "apache-license", - "original-product", - "mycroft-bigscreen", - "mycroft-mk2", - "mycroft-phone" - ], - "version": "0.1", - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1489822" - }, - { - "skillname": "Black Metal Music Catalog", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-trve-kvlt", - "branch": "v0.1", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "open black metal menu", - "play black metal" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/5/6/d/7/d0ccfeef4dfe289ad92f29033b9cf7cbaa6bf26aa8ad88deca61b92533e9d76fc00b.png", - "category": "Entertainment", - "created": "2021-03-10T16:13:44+00:00", - "modified": "2021-03-10T16:13:57+00:00", - "description": "Extensive library of Black Metal music for mycroft", - "tags": [ - "music", - "better-cps", - "media", - "black", - "metal", - "apache-license", - "mycroft-bigscreen", - "mycroft-mk2", - "mycroft-phone", - "original-product", - "addon" - ], - "version": "0.1", - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1489833" - }, - { - "skillname": "Kings of Horror Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-kings-of-horror", - "branch": "v0.1", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "open horror movies menu", - "play ninja zombies movie", - "play horror movie", - "play indie horror movie" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/1/c/a/c/5a2c54a2145ff126be38835cc18aeaba0e2d5a941d034da537b5b044bb9ee5d18962.png", - "category": "Entertainment", - "created": "2021-03-10T17:23:30+00:00", - "modified": "2021-03-10T17:23:43+00:00", - "description": "Indie horror movies for Mycroft", - "tags": [ - "movies", - "horror", - "indie", - "better-cps", - "apache-license", - "mycroft-bigscreen", - "mycroft-mk2", - "mycroft-phone", - "original-product", - "addon" - ], - "version": "0.1", - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1489891" - }, - { - "skillname": "Stoned Meadow of Doom Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-smod", - "branch": "v0.1", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "open stoned meadow of doom", - "play stoner doom" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/3/5/3/1/b057eb71ea0f1dcccfc5df74bef8468aae414b0c395bc7bd94b334e1ee3a2115c5fc.png", - "category": "Entertainment", - "created": "2021-03-10T17:42:26+00:00", - "modified": "2021-03-10T17:42:38+00:00", - "description": "Stoner Doom catalog for mycroft", - "tags": [ - "music", - "better-cps", - "metal", - "stoner", - "doom", - "addon", - "apache-license", - "original-product", - "mycroft-bigscreen", - "mycroft-mk2", - "mycroft-phone" - ], - "version": "0.1", - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1489921" - }, - { - "skillname": "DUST Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-dust", - "branch": "v0.2", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "open dust", - "play science fiction short movie", - "play dust" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/8/3/2/3/535344bc96c8a74256553a082be23d8010f2d1267e6afa81065c8fd653e38cc707ef.png", - "category": "Entertainment", - "created": "2021-03-11T08:48:54+00:00", - "modified": "2021-03-11T17:36:03+00:00", - "description": "Dust short science fiction movies catalog for Mycroft", - "tags": [ - "apache-license", - "original-product", - "mycroft-bigscreen", - "mycroft-mk2", - "mycroft-phone", - "movies", - "scifi", - "better-cps", - "media", - "video", - "addon" - ], - "version": "0.2", - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1490158" - }, - { - "skillname": "Documentaries from reddit", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-documentaries", - "branch": "v0.1", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "open documentaries menu", - "play a documentary" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/1/2/9/e/3087f13f1d2a59e9ae43b108fc3ce77f5e26a133d833df5ebfd6d5906f0f14502be9.png", - "category": "Entertainment", - "created": "2021-03-11T10:32:50+00:00", - "modified": "2021-03-11T10:33:02+00:00", - "description": "Documentaries from r/Documentaries", - "tags": [ - "apache-license", - "mycroft-bigscreen", - "mycroft-mk2", - "mycroft-phone", - "original-product", - "addon", - "media", - "reddit", - "video", - "better-cps" - ], - "version": "0.1", - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1490200" - }, - { - "skillname": "Omeleto Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-omeleto", - "branch": "v0.1", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "open omeleto", - "play short film", - "play omeleto" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/1/5/5/c/1c7bddc825682fc3224e391c315371553374b5e0a433fbcb9e7d66f5875b056de461.png", - "category": "Entertainment", - "created": "2021-03-11T17:26:05+00:00", - "modified": "2021-03-11T17:26:48+00:00", - "description": "Omeleto short films catalog for Mycroft", - "tags": [ - "apache-license", - "original-product", - "mycroft-bigscreen", - "mycroft-mk2", - "mycroft-phone", - "better-cps", - "movies", - "films", - "omeleto", - "shorts", - "addon" - ], - "version": "0.1", - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1490318" - }, - { - "skillname": "Classic Sci Fi Horror Catalog", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-classic-scifi-horror", - "branch": "v0.1", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "open classic scifi horror menu", - "play classic scifi movie", - "play public domain movie" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/1/7/5/e/23bc3ad74e791213451ac33bab161c2445fb6721e889ff57ac412fb86d1b22362884.png", - "category": "Entertainment", - "created": "2021-03-12T09:07:02+00:00", - "modified": "2021-03-12T09:07:15+00:00", - "description": "Science Fiction and Horror films: monsters and aliens, space and time travel, experiments gone wrong, unimagined disasters.", - "tags": [ - "apache-license", - "mycroft-bigscreen", - "mycroft-mk2", - "mycroft-phone", - "original-product", - "addon", - "movie", - "film", - "media", - "better-cps" - ], - "version": "0.1", - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1490539" - }, - { - "skillname": "Simple Youtube Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-simple-youtube", - "branch": "v0.2", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "play rob zombie", - "play freezing moon with dead on vocals", - "play programming music mix", - "play center of all infinity album" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/f/3/3/2/894d913a8899bc4ade9fc0446b740c2c69b890766e8f8410bd157e8796174453d204.jpg", - "category": "Entertainment", - "created": "2021-03-19T10:57:44+00:00", - "modified": "2021-04-03T20:47:40+00:00", - "description": "search youtube by voice!<br />\n<br />\nthis skill can also be configured as a fallback matcher for play queries, other skills should take precedence most of the time", - "tags": [ - "addon", - "apache-license", - "original-product", - "mycroft-bigscreen", - "mycroft-mk2", - "mycroft-phone", - "youtube", - "media", - "better-cps", - "music", - "video" - ], - "version": "0.2", - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1493877" - }, - { - "skillname": "Deezer Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-deezer", - "branch": "v0.1", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "play black metal ist krieg", - "play XXX in deezer" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/c/7/e/9/38d3ada99685fcd84e2b791864354bbe05c24e67ac84036633de3ec3c2d16d5e6eab.png", - "category": "Entertainment", - "created": "2021-08-26T16:53:51+00:00", - "modified": "2021-08-26T16:54:06+00:00", - "description": "Deezer skill, manual setup of credentials required! Premium account NOT needed", - "tags": [ - "addon", - "apache-license", - "original-product", - "mycroft-bigscreen", - "mycroft-mk2", - "music", - "mycroft", - "deezer", - "playback", - "ovos" - ], - "version": "v0.1", - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1582365" - }, - { - "skillname": "Unsplah Wallpaper Skill", - "authorname": "AIIX", - "foldername": "", - "url": "https://github.com/AIIX/unsplash-wallpaper-plasma-skill", - "branch": "master", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "change wallpaper type aircrafts", - "change wallpaper abstract", - "new wallpaper type nature", - "new wallpaper sports" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/e/0/5/d/347c4c56102fd41829913e14c832c3f1252d.jpg", - "category": "Configuration", - "created": "2017-10-02T06:56:00+00:00", - "modified": "2020-06-03T09:58:08+00:00", - "description": "This skill allows users to use unsplash images as wallpapers based on any category on the plasma desktop", - "tags": [ - "addon", - "mycroft-mk2", - "mycroft-bigscreen", - "mycroft-phone" - ], - "version": "1.0", - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1193621" - }, - { - "skillname": "NodeRed Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/mycroft-node-red", - "branch": "master", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "ping node red" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/2/a/0/5/98f0fa5ecb4f757b4be780b50206d9cbe2db.png", - "category": "Configuration", - "created": "2020-06-02T17:36:53+00:00", - "modified": "2020-06-05T11:56:32+00:00", - "description": "Build mycroft skills using NodeRed", - "tags": [ - "addon", - "mycroft", - "skills", - "nodered", - "apache-license", - "original-product" - ], - "version": null, - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1389655" - }, - { - "skillname": "HiveMind Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-hivemind", - "branch": "master", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/7/3/5/e/910173e8bcccd1d699b049eefee9fa21c8c9.png", - "category": "Configuration", - "created": "2020-06-09T22:04:58+00:00", - "modified": "2020-06-14T17:35:34+00:00", - "description": "Mesh networking for Mycroft, allows your devices to communicate with each other<br />\n<br />\nTalk with mycroft:<br />\n- from a command line - https://github.com/OpenJarbas/HiveMind-cli<br />\n- from a raspberry pi - https://github.com/OpenJarbas/HiveMind-voice-sat<br />\n- from a webchat -...", - "tags": [ - "apache-license", - "original-product", - "addon", - "mycroft", - "skill", - "mesh", - "networking", - "clients" - ], - "version": null, - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1391962" - }, - { - "authorname": "jarbasai", - "foldername": "skill-mock-backend", - "url": "https://github.com/JarbasSkills/skill-mock-backend", - "branch": "v0.2", - "license": "apache-2.0", - "tags": [ - "apache-license", - "original-product", - "mycroft-mk2", - "mycroft-bigscreen", - "mycroft-phone", - "addon", - "mycroft", - "skill", - "backend", - "mock", - "privacy" - ], - "skillname": "Mock Backend Skill", - "description": "Disable mycroft from phoning home.mycroft.ai<br />\n<br />\nJust install the skill and backend will be disabled<br />\n<br />\nPRIVACY NOTE: you need to setup your own STT, by default it will use google", - "short_description": "Disable mycroft from phoning home.mycroft.ai", - "examples": [ - "disable mycroft backend", - "what backend are you using", - "restore mycroft backend" - ], - "credits": [ - "JarbasAl" - ], - "category": "Configuration", - "categories": [ - "configuration" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/0/b/8/f/40fd73d81e594b49060f87e008d6a24f175d.png", - "requirements": { - "python": [ - "ovos_utils>=0.5.0", - "ovos-local-backend>=0.1.0", - "mock-mycroft-backend>=0.2.2" - ], - "skill": [], - "system": {} - }, - "desktopFile": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "created": "2020-06-14T22:10:54+00:00", - "modified": "2021-01-09T18:51:55+00:00", - "version": "0.2", - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1393956" - }, - { - "skillname": "Text To Speech Control Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-tts-control", - "branch": "master", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "what is the current voice", - "available voice engines", - "text to speech demo", - "change voice to alan pope", - "change voice to kusal", - "change voice to google", - "change voice to alan black", - "change voice to female", - "change voice to richard", - "change voice to amazon", - "change voice to whisper" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/8/b/8/b/c7e4a023e2b103bdfeb46c6e789b4743c6c0.png", - "category": "Configuration", - "created": "2020-07-06T05:24:17+00:00", - "modified": "2020-07-06T05:24:32+00:00", - "description": "allows to change or retrieve info about Text to Speech by voice<br />\n<br />\n# usage<br />\n<br />\n* \"what is the current voice\"<br />\n* \"available voice engines\"<br />\n* \"text to speech demo\"<br />\n* \"change voice to alan pope\"<br />\n* \"change voice to kusal\"<br />\n* \"change voice to google\"<br...", - "tags": [ - "addon", - "mycroft", - "skills", - "config", - "tts", - "speech", - "apache-license", - "original-product", - "mycroft-mk2", - "mycroft-bigscreen", - "mycroft-phone" - ], - "version": null, - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1400418" - }, - { - "skillname": "WallpapersSkill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-wallpapers", - "branch": "master", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "new wallpaper", - "change wallpaper to nature", - "show me a picture", - "show me a picture with dogs", - "make that my wallpaper" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/a/8/0/e/700153ebadf42416b621483b5ca2b8de8314.png", - "category": "Configuration", - "created": "2020-07-06T23:54:17+00:00", - "modified": "2020-07-06T23:54:29+00:00", - "description": "Change wallpaper and get pictures from selected subreddits<br />\n<br />\n## Examples<br />\n* \"new wallpaper\"<br />\n* \"change wallpaper to nature\"<br />\n* \"show me a picture\"<br />\n* \"show me a picture with dogs\"<br />\n* \"make that my wallpaper\"", - "tags": [ - "apache-license", - "original-product", - "mycroft", - "wallpaper", - "background", - "pictures", - "skill", - "addon" - ], - "version": null, - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1400676" - }, - { - "skillname": "KITT Skin", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-KITT-skin", - "branch": "master", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/1/2/8/5/6f858f8614d1d857f0d3086093c6c675565fea25bbf49ee1c1e558fb02e7bb5beca2.png", - "category": "Configuration", - "created": "2020-08-02T12:11:49+00:00", - "modified": "2020-08-02T12:12:01+00:00", - "description": "A skin for the mark2<br />\n<br />\nTurn your mark2 into KITT from knight rider", - "tags": [ - "addon", - "mycroft", - "mark2", - "skin", - "wallpaper", - "idle", - "original-product", - "mycroft-mk2", - "apache-license" - ], - "version": null, - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1408838" - }, - { - "skillname": "Mouse Jiggler Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-mouse-jiggler", - "branch": "master", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "Start mouse activity", - "Stop mouse activity", - "Enable mouse jiggler", - "Disable mouse jiggler" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/7/e/e/8/3b1f75a2237b23dc6bd41ee9e563e8e48bf99c5953c19711a05dfd3da259647053da.png", - "category": "Configuration", - "created": "2020-08-10T12:38:27+00:00", - "modified": "2020-08-10T12:38:42+00:00", - "description": "A Mouse Jiggler prevents your computer from going to sleep while you work or play. <br />\n<br />\nThis skill creates constant mouse activity so your computer won't go idle and trigger screen savers or sleep mode—eliminating the need to log in repeatedly.", - "tags": [ - "apache-license", - "original-product", - "mycroft", - "skills", - "mouse", - "activity", - "idle", - "addon" - ], - "version": null, - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1411195" - }, - { - "skillname": "Email Commands Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-email-commands", - "branch": "master", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/c/b/2/7/dd7d861e2313ec01125ed9e307f97fc6d6b0e425ead7dbc68388d1bd656ba1ead206.png", - "category": "Configuration", - "created": "2020-09-13T11:04:23+00:00", - "modified": "2020-09-13T11:07:28+00:00", - "description": "Allows you to send commands to mycroft by email<br />\n<br />\nWant to turn on the tv before you get home? use you phone and tell mycroft to do it<br />\n<br />\nNOTE: you need to edit mycroft.conf before using this skill, there is no GUI to do this yet<br />\n<br />\n<br />\n# Skill configuration<br...", - "tags": [ - "original-product", - "mycroft-mk2", - "mycroft-bigscreen", - "mycroft-phone", - "apache-license", - "mycroft", - "email", - "remote", - "commands", - "skill", - "addon" - ], - "version": null, - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1421786" - }, - { - "skillname": "Better Playback Control", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-better-playback-control", - "branch": "v0.3a1", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "Play NASA TV channel", - "Play Soma FM internet radio", - "Play a cat video", - "Play This Week in Tech podcast", - "Play Portuguese News", - "Play music the gods made heavy metal", - "Play a horror movie", - "Play a lovecraft audiobook", - "Play dagon lovecraft visual comic", - "Play game Planet Fall", - "Play trailer for The Land Before Time", - "Play {your favorite category} porn" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/2/2/9/9/3464ed65eb1a1a7ff031b5345e10108e523207eec8eb50426075fd6b4ed5c2087742.jpg", - "category": "Configuration", - "created": "2020-12-29T17:43:02+00:00", - "modified": "2021-04-03T20:45:34+00:00", - "description": "Better Common playback control system<br />\n<br />\nNOTE: this is meant a better alternative to the official playback control skill, it will be blacklisted<br />\n<br />\nThis Skill implements the common Play handler. This allows playback services to negotiate which is best suited to play back a...", - "tags": [ - "apache-license", - "mycroft-bigscreen", - "mycroft-mk2", - "mycroft-phone", - "original-product", - "mycroft", - "playback", - "config", - "play", - "media", - "addon" - ], - "version": "0.3a1", - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1465426" - }, - { - "skillname": "Monkey Patcher", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-monkey-patcher", - "branch": "v0.1", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/6/3/e/9/0df614f85b29eeda98e1f6b2109c1def72067592c2dd31a4fac9c1d0b72a37b51d0e.png", - "category": "Configuration", - "created": "2020-12-29T17:51:33+00:00", - "modified": "2020-12-29T17:51:49+00:00", - "description": "Adds a bunch of patches at runtime, bringing fixes and new functionality for mycroft-core<br />\n<br />\nContributing to Mycroft is a bit of a fight with upstream<br />\n<br />\nthis skill applies a bunch of monkey patches at runtime to add/fix things not merged into mycroft-core, full details in...", - "tags": [ - "addon", - "original-product", - "mycroft-mk2", - "mycroft-bigscreen", - "mycroft-phone", - "apache-license", - "monkey", - "patches", - "fix", - "mycroft", - "updates" - ], - "version": "0.1", - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1465427" - }, - { - "skillname": "Monkey Patch Tester", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-monkey-patch-tester", - "branch": "v0.1", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "Are you monkey patched", - "are the patches working" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/6/9/c/c/b2a51a87042415ae18b82f7fe8e516677e2608a7dde68b406706499903fc4e447c14.png", - "category": "Configuration", - "created": "2020-12-29T18:00:50+00:00", - "modified": "2020-12-29T18:01:11+00:00", - "description": "Tests that Monkey Patches skill is working<br />\n<br />\nA second skill is required to verify patching worked, results from main skill would not reflect global state", - "tags": [ - "config", - "patch", - "update", - "fix", - "diagnostic", - "addon", - "apache-license", - "original-product" - ], - "version": "0.1", - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1465429" - }, - { - "skillname": "Better Stop", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-better-stop", - "branch": "v0.2", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "stop" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/1/a/f/1/37febc1b9178d06935bab496238dddb384b287b47dde6517b04df199b6d519044138.png", - "category": "Configuration", - "created": "2021-02-25T15:32:46+00:00", - "modified": "2021-02-25T15:32:56+00:00", - "description": "Provides verbal interfaces for the \"Stop\" command. This Skill is a little unusual in that it really doesn't do anything directly, rather it emits messages for the device creator to capture.<br />\n<br />\nWhat is wrong with official mycroft skill?<br />\n- silently captures enclosure specific...", - "tags": [ - "original-product", - "mycroft-bigscreen", - "mycroft-mk2", - "mycroft-phone", - "apache-license", - "stop", - "mycroft", - "config", - "internal", - "dev", - "addon" - ], - "version": "0.2", - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1485576" - }, - { - "skillname": "Food Wizard Skill", - "authorname": "AIIX", - "foldername": "", - "url": "https://github.com/AIIX/food-wizard", - "branch": "master", - "desktopFile": true, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "Show recipes with apple and honey", - "Show recipes with chicken, honey and lime" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/e/3/0/5/90cd78670d1e911a33356c0f47b9d9dd23bf.png", - "category": "Information", - "created": "2019-11-14T23:55:46+00:00", - "modified": "2020-06-03T09:55:42+00:00", - "description": "Get popular recipes and how to cook directions based on combination of Ingredient keywords", - "tags": [ - "mycroft", - "skills", - "food", - "gplv3", - "original-product", - "mycroft-mk2", - "mycroft-bigscreen", - "mycroft-phone", - "addon" - ], - "version": "1.0", - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1336547" - }, - { - "skillname": "Wikidata Skill", - "authorname": "AIIX", - "foldername": "", - "url": "https://github.com/AIIX/skill-wikidata", - "branch": "newapi", - "desktopFile": true, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "How old is Steve Jobs", - "Where was Bill Gates born", - "What is the occupation of Linus Torvalds", - "What is Linus Torvalds date of birth", - "What is Abraham Lincoln date of death", - "What is Steve Jobs spouse name" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/b/3/f/0/8b10f6d22d93d3c44b52cc72cdc3a7f6862d.png", - "category": "Information", - "created": "2020-06-03T08:13:14+00:00", - "modified": "2020-06-03T08:13:36+00:00", - "description": "Get current and historic facts & information about a person from Wikidata.", - "tags": [ - "gui", - "mycroft", - "skill", - "wikidata", - "addon", - "gplv3", - "original-product", - "mycroft-mk2", - "mycroft-bigscreen", - "mycroft-phone" - ], - "version": "1.0", - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1389861" - }, - { - "skillname": "8Fact Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-8fact", - "branch": "master", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "random fact" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/9/3/0/6/fb92af6888c36c705c602cb71eaa1821517b.jpg", - "category": "Information", - "created": "2020-06-09T13:51:15+00:00", - "modified": "2020-06-13T23:26:58+00:00", - "description": "Random facts from 8 Fact", - "tags": [ - "original-product", - "apache-license", - "mycroft", - "skills", - "facts", - "addon" - ], - "version": null, - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1391848" - }, - { - "skillname": " Daily Blue Marble Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-blue-marble", - "branch": "master", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "open the epic website from nasa", - "show me earth from space", - "Daily Blue Marble", - "Blue Marble of the Day", - "Animate that", - "tell me about Earth Polychromatic Imaging Camera" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/b/1/6/b/1256477c74531578b270fb426011c0526830.png", - "category": "Information", - "created": "2020-06-15T21:31:06+00:00", - "modified": "2020-07-05T12:27:21+00:00", - "description": "Earth Polychromatic Imaging Camera provides near real time pictures of earth from orbit<br />\n <br />\n## Examples<br />\n* \"show me earth from space\"<br />\n* \"Daily Blue Marble\"<br />\n* \"Blue Marble of the Day\"<br />\n* \"Animate that\"<br />\n* \"tell me about Earth Polychromatic Imaging Camera\"<br...", - "tags": [ - "apache-license", - "original-product", - "mycroft-mk2", - "mycroft-bigscreen", - "mycroft-phone", - "addon", - "mycroft", - "nasa", - "epic", - "satellite", - "space" - ], - "version": null, - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1394361" - }, - { - "skillname": "Chandra X-ray Observatory Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-chandra-xray", - "branch": "master", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "picture from chandra x ray observatory", - "latest nasa x ray observatory picture", - "explain", - "tell me about chandra x ray observatory" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/f/2/9/0/799399a3fef86b0b69820503e578379d0f80.png", - "category": "Information", - "created": "2020-06-25T18:35:49+00:00", - "modified": "2020-06-25T18:41:20+00:00", - "description": "Pictures from NASA's Chandra X-ray Observatory<br />\n<br />\n## Examples<br />\n* \"picture from chandra x ray observatory\"<br />\n* \"latest nasa x ray observatory picture\"<br />\n* \"explain\"<br />\n* \"tell me about chandra x ray observatory\"<br />\n<br />\nCan be used as idle screen for the mark2", - "tags": [ - "addon", - "apache-license", - "original-product", - "mycroft", - "skills", - "nasa", - "chandra", - "space" - ], - "version": null, - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1397576" - }, - { - "skillname": "ISS Tracker Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-iss-location", - "branch": "master", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "Where is the ISS", - "tell me about international space station", - "Who is on board of the space station", - "how many persons on board of the space station", - "When is the ISS passing over" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/0/0/1/c/1af6fca3887282501e92c1a42e4dcd4fabe0.png", - "category": "Information", - "created": "2020-06-26T00:08:10+00:00", - "modified": "2020-06-26T01:45:34+00:00", - "description": "Track the location of the International Space Station<br />\n<br />\n#Examples<br />\n \"Where is the ISS\"<br />\n \"Who is on board of the space station\"<br />\n \"When is the ISS passing over\"<br />\n \"Tell me about the ISS\"<br />\n \"how many persons on board of the space station\"", - "tags": [ - "addon", - "apache-license", - "original-product", - "mycroft-mk2", - "mycroft-bigscreen", - "mycroft-phone", - "space", - "mycroft", - "iss", - "nasa", - "skills" - ], - "version": null, - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1397610" - }, - { - "skillname": "Visible Infrared Imaging Radiometer Suite Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-viirs", - "branch": "master", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "show my location from space", - "show my house from space last month", - "talk about Visible Infrared Imaging Radiometer Suite", - "why so many clouds", - "show me london from space", - "next picture", - "previous picture", - "zoom in", - "zoom out", - "set zoom to maximum" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/e/e/e/6/d60f618ba381ba0815ad5e31319a6aac2ec3.jpg", - "category": "Information", - "created": "2020-06-26T18:51:28+00:00", - "modified": "2020-06-26T23:31:15+00:00", - "description": "Near real time Satellite imagery from NASA's Visible Infrared Imaging Radiometer Suite<br />\n<br />\n## Examples<br />\n* \"show my location from space\"<br />\n* \"show me london from space\"<br />\n* \"next picture\"<br />\n* \"previous picture\"<br />\n* \"show my house from space last month\"<br />\n*...", - "tags": [ - "addon", - "apache-license", - "mycroft-mk2", - "mycroft-bigscreen", - "mycroft-phone", - "original-product", - "mycroft", - "nasa", - "space", - "skills", - "satellite" - ], - "version": null, - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1397846" - }, - { - "skillname": "Hubble Space Telescope Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-hubble-telescope", - "branch": "master", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "picture from hubble telescope", - "explain", - "tell me about the hubble telescope", - "Where is the hubble telescope", - "who was hubble", - "what is hubble space telescope mission", - "why was hubble created", - "what are hubble's instruments", - "how does hubble work", - "did hubble find any planets", - "can hubble take pictures of earth", - "can hubble see things on the moon", - "is hubble data public", - "Can we see live photos from Hubble", - "Where is hubble looking at", - "Are the colors in hubble images real" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/e/c/d/9/fbe693af226f9d3cc9dd602dced1e78b06ab.png", - "category": "Information", - "created": "2020-06-28T21:06:43+00:00", - "modified": "2020-06-28T21:06:54+00:00", - "description": "Pictures and quick facts from Hubble Space Telescope<br />\n<br />\n## Examples<br />\n* \"picture from hubble site\"<br />\n* \"explain\"<br />\n* \"tell me about the hubble telescope\"<br />\n* \"who was hubble\"<br />\n* \"what is hubble space telescope mission\" <br />\n* \"why was hubble created\"<br />\n*...", - "tags": [ - "addon", - "hubble", - "space", - "mycroft", - "skills", - "background", - "apache-license", - "original-product", - "mycroft-mk2", - "mycroft-bigscreen", - "mycroft-phone" - ], - "version": null, - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1398376" - }, - { - "skillname": "James Webb Space Telescope Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-webb-telescope", - "branch": "master", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "picture from webb telescope", - "explain", - "tell me about the webb telescope", - "Where is the webb telescope", - "what is webb space telescope mission", - "why was webb created", - "what are webb's instruments", - "how does webb work", - "did webb find any planets", - "can webb take pictures of earth", - "can webb see things on the moon", - "is webb data public", - "Can we see live photos from webb", - "Where is webb looking at", - "Are the colors in webb images real" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/d/c/0/2/09409bb344176c5a85fa7b4a109dc121f922.png", - "category": "Information", - "created": "2020-06-29T10:25:29+00:00", - "modified": "2020-06-29T10:25:43+00:00", - "description": "Pictures from James Webb Space Telescope<br />\n<br />\n## Examples<br />\n* \"picture from james webb telescope\"<br />\n* \"explain\"<br />\n* \"tell me about the james webb telescope\"", - "tags": [ - "addon", - "apache-license", - "original-product", - "mycroft-mk2", - "mycroft-bigscreen", - "mycroft-phone", - "nasa", - "space", - "mycroft", - "skill", - "telescope" - ], - "version": null, - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1398468" - }, - { - "skillname": "Helioviewer Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-helioviewer", - "branch": "master", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "Live picture of the sun", - "whats the number of sunspots", - "how many sunspots yesterday", - "how many sunspots 3 days ago", - "show me a picture of the solar corona", - "ultraviolet sun picture at 2 million degrees", - "show me magnetic field of the sun", - "ultraviolet picture of the heliosphere", - "animate that", - "next picture", - "previous picture", - "open helioviewer" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/8/7/0/5/8d6bfd9c7af1b82e49b642cf4919a307bafb.png", - "category": "Information", - "created": "2020-06-29T12:51:45+00:00", - "modified": "2020-07-03T17:30:21+00:00", - "description": "Daily sunspot data from Sunspot Index and Long-term Solar Observations and pictures from NASA's Solar and Heliospheric Observatory<br />\n<br />\n## Examples<br />\n* \"Live picture of the sun\"<br />\n* \"whats the number of sunspots\"<br />\n* \"how many sunspots yesterday\"<br />\n* \"how many sunspots 3...", - "tags": [ - "apache-license", - "mycroft-mk2", - "mycroft-bigscreen", - "mycroft-phone", - "original-product", - "mycroft", - "space", - "sun", - "nasa", - "skills", - "addon" - ], - "version": null, - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1398482" - }, - { - "skillname": "Space News", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-space-news", - "branch": "master", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "news about space", - "more news", - "space news from 15 days ago", - "open website" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/a/3/b/5/9a568dbb4af7f0377385b43f81afa5b43566.png", - "category": "Information", - "created": "2020-06-29T15:31:45+00:00", - "modified": "2020-06-29T18:41:01+00:00", - "description": "All the latest news about Space!<br />\n<br />\n## Examples<br />\n* \"news about space\"<br />\n* \"more news\"<br />\n* \"space news from last week\"<br />\n* \"open website\"", - "tags": [ - "apache-license", - "original-product", - "mycroft-mk2", - "mycroft-bigscreen", - "mycroft-phone", - "addon", - "space", - "news", - "mycroft", - "skills", - "gui" - ], - "version": null, - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1398498" - }, - { - "skillname": "Rocket Launches", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-rocket-launch", - "branch": "master", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "when is the next rocket launch", - "tell me more" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/4/6/2/4/0747f712adbbb2934f5d102552d42cc4d739.png", - "category": "Information", - "created": "2020-06-29T21:24:57+00:00", - "modified": "2020-06-29T21:25:08+00:00", - "description": "This skill interacts with https://launchlibrary.net/ api to return the latest space launch.<br />\n<br />\n## Examples<br />\n* \"when is the next rocket launch\"<br />\n* \"tell me more\"", - "tags": [ - "mycroft", - "skills", - "space", - "gui", - "apache-license", - "original-product", - "mycroft-mk2", - "mycroft-bigscreen", - "mycroft-phone", - "addon" - ], - "version": null, - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1398525" - }, - { - "skillname": "Space Debris Tracker", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-space-stuff", - "branch": "master", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "plot orbital debris" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/d/c/6/8/4b1fb7192d6f6bfbcdd397bfe084e2e0bd3b.jpg", - "category": "Information", - "created": "2020-07-01T14:39:52+00:00", - "modified": "2020-07-01T14:40:05+00:00", - "description": "See all space debris in orbit<br />\n<br />\n## Examples<br />\n* \"plot orbital debris\"", - "tags": [ - "addon", - "original-product", - "mycroft-mk2", - "mycroft-bigscreen", - "mycroft-phone", - "apache-license", - "mycroft", - "space", - "skills", - "gui" - ], - "version": null, - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1399007" - }, - { - "skillname": "Asteroid Tracker", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-asteroid-tracker", - "branch": "master", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "show asteroid orbits" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/e/9/8/c/6d005e06d5c0797783f7d19dae32a484dbd2.png", - "category": "Information", - "created": "2020-07-01T14:45:30+00:00", - "modified": "2020-07-01T14:45:55+00:00", - "description": "All about asteroids<br />\n<br />\n##Examples<br />\n* \"show asteroid orbits\"", - "tags": [ - "apache-license", - "mycroft-mk2", - "mycroft-bigscreen", - "mycroft-phone", - "original-product", - "mycroft", - "space", - "skills", - "gui", - "asteroids", - "addon" - ], - "version": null, - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1399010" - }, - { - "skillname": "Sky Stream", - "authorname": "AIIX", - "foldername": "", - "url": "https://github.com/AIIX/skystream", - "branch": "master", - "warning": "", - "desktopFile": true, - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "Open Sky Live Stream", - "Show Sky Live Stream" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/1/1/1/9/82653bfaa46317638d7a857598e1ae229c38.png", - "category": "Information", - "created": "2020-07-03T03:50:24+00:00", - "modified": "2020-07-03T03:53:27+00:00", - "description": "Play Live News from Sky News", - "tags": [ - "gplv3", - "original-product", - "mycroft-mk2", - "mycroft-bigscreen", - "mycroft-phone", - "live", - "mycroft", - "skills", - "skynews", - "addon" - ], - "version": "1.0", - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1399481" - }, - { - "skillname": "Countries", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-countries", - "branch": "master", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "what is the size of portugal", - "what are the borders of portugal", - "what is the capital of portugal", - "what is the currency of portugal", - "what is the language of portugal", - "what is the population of portugal", - "what is the timezone of portugal", - "what are the people that live in portugal called", - "where is portuguese spoken", - "where is portugal located at", - "how many countries do you know about", - "what are the countries in europe" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/7/7/a/8/97442a1d33c009b566a0c7278cc6676f3a2a.png", - "category": "Information", - "created": "2020-07-03T14:54:26+00:00", - "modified": "2020-07-03T14:54:37+00:00", - "description": "country population, area, language, borders, currency, timezone, capital, denonyms...<br />\n<br />\n## Examples<br />\n<br />\n* \"what is the size of portugal\"<br />\n* \"what are the borders of portugal\"<br />\n* \"what is the capital of portugal\"<br />\n* \"what is the currency of portugal\"<br />\n*...", - "tags": [ - "apache-license", - "original-product", - "addon", - "mycroft", - "skills", - "countries", - "world" - ], - "version": null, - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1399702" - }, - { - "skillname": "Wikihow Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-wikihow", - "branch": "master", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "how to boil an egg", - "repeat", - "give me a random how to", - "tell me more" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/d/c/4/f/990e08d2b105589f619ab744d73d5eded3a8.png", - "category": "Information", - "created": "2020-07-05T19:00:16+00:00", - "modified": "2020-07-05T19:00:26+00:00", - "description": "How to do nearly everything.<br />\n<br />\nEver wondered about how to boil an egg, or the best way to brush your teeth. This skill enables<br />\nMycroft to answer a lot of \"how to\" questions with step by step guide<br />\n<br />\n* \"how to boil an egg\"<br />\n* \"give me a random how to\"<br />\n*...", - "tags": [ - "addon", - "mycroft", - "skill", - "wiki", - "how", - "guide", - "apache-license", - "original-product", - "mycroft-mk2", - "mycroft-bigscreen", - "mycroft-phone" - ], - "version": null, - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1400302" - }, - { - "skillname": "Euro News Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-euronews", - "branch": "v0.3", - "desktopFile": true, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "play euronews", - "play news in portuguese", - "play news in spanish" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/1/0/8/7/11afa94c95c444c62e49bef86cad377721de1723dae0b9eac51f3cd86a024435acd9.png", - "category": "Information", - "created": "2020-08-27T00:25:10+00:00", - "modified": "2021-03-10T14:42:22+00:00", - "description": "Live news from Euronews<br />\n<br />\nEuropean news for Mycroft<br />\n<br />\nSupported Languages:<br />\n- English<br />\n- Portuguese<br />\n- Italian<br />\n- Spanish<br />\n- French<br />\n- German", - "tags": [ - "mycroft", - "news", - "euronews", - "skills", - "stream", - "addon", - "original-product", - "mycroft-bigscreen", - "mycroft-mk2", - "mycroft-phone", - "apache-license" - ], - "version": "0.3", - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1416158" - }, - { - "skillname": "DuckDuckGo", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-ddg", - "branch": "master", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "when was stephen hawking born", - "ask the duck about the big bang", - "tell me more", - "who is elon musk", - "continue", - "tell me more" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/4/9/f/3/158cae18847280c926ca9fcf251f381136a3289a261247f4f5c7379a735b5bb20b92.png", - "category": "Information", - "created": "2020-12-17T12:54:48+00:00", - "modified": "2020-12-17T12:55:07+00:00", - "description": "Uses the DuckDuckGo API to provide information. <br />\n<br />\nNOTE: this is meant a better alternative to the official duck duck go skill, it will be blacklisted<br />\n<br />\n## Examples<br />\n<br />\n* \"when was stephen hawking born\"<br />\n* \"ask the duck about the big bang\"<br />\n* \"tell me...", - "tags": [ - "apache-license", - "original-product", - "mycroft-mk2", - "mycroft-bigscreen", - "mycroft-phone", - "mycroft", - "skills", - "duckduckgo", - "internet", - "search", - "addon" - ], - "version": null, - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1460967" - }, - { - "skillname": "Wolfram Alpha", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-wolfie", - "branch": "master", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "ask the wolf what is the speed of light", - "How tall is Mount Everest?", - "When was The Rocky Horror Picture Show released?", - "What is Madonna's real name?", - "What's 18 times 4?", - "How many inches in a meter?" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/3/0/5/2/f883c54db7e6919f60c2b5c9de70bfdc061be6a77c964c06fb59947d864caece9e64.png", - "category": "Information", - "created": "2020-12-17T13:01:05+00:00", - "modified": "2020-12-17T13:01:17+00:00", - "description": "Ask general-knowledge queries<br />\nCommonQuery skill for Wolfram Alpha<br />\nYou'll be surprised by how much it knows!<br />\n<br />\nYou can also explicitly request to \"ask the wolf\"<br />\n<br />\nNOTE: this is meant to be a better alternative to the official mycroft skill, it will blacklist the...", - "tags": [ - "addon", - "mycroft-mk2", - "mycroft-bigscreen", - "mycroft-phone", - "original-product", - "apache-license", - "mycroft", - "skills", - "knowledge", - "general", - "query" - ], - "version": null, - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1460968" - }, - { - "skillname": "Weather Channel Stream", - "authorname": "AIIX", - "foldername": "", - "url": "https://github.com/AIIX/twcstream", - "branch": "master", - "warning": "", - "desktopFile": true, - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "Open The Weather Channel Live Stream", - "Show The Weather Channel Live Stream" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/6/8/2/0/8fd52e346ee9d72691c4967ba618550d95188d62c691f9362f6c35fc9e71685b676e.png", - "category": "Information", - "created": "2021-02-25T15:33:50+00:00", - "modified": "2021-02-25T15:36:53+00:00", - "description": "Play Live News from The Weather Channel with Mycroft", - "tags": [ - "addon", - "apache-license", - "mycroft-bigscreen", - "mycroft-mk2", - "mycroft-phone", - "original-product", - "live", - "skills", - "the", - "weather", - "channel" - ], - "version": "1.0", - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1485577" - }, - { - "skillname": "Wikipedia", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-wikipedia-for-humans", - "branch": "v0.2.2", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "Tell me about Elon Musk", - "Tell me about beans", - "Tell me something random", - "Check Wikipedia for beans", - "Tell me about the Pembroke Welsh Corgi", - "Search wikipedia for chocolate", - "More information", - "Tell me More" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/6/5/1/5/7796f221ec735e37377966965a556d9c34a792dc8669204b59eca39bad0e19d691eb.png", - "category": "Information", - "created": "2021-02-25T20:00:19+00:00", - "modified": "2021-02-27T12:08:56+00:00", - "description": "Check Wikipedia for answers to all your questions. Get just a summary, or ask for more to get in-depth information.<br />\n <br />\n This Skill uses the [wikipedia for humans](https://github.com/HelloChatterbox/wikipedia_for_humans). <br />\n<br />\nNOTE: this will blacklist the official mycroft...", - "tags": [ - "apache-license", - "efi", - "addon", - "wiki", - "search", - "web" - ], - "version": "0.2.2", - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1485601" - }, - { - "skillname": "News Streams Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-news", - "branch": "v0.2", - "desktopFile": false, - "warning": "", - "systemDeps": false, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "play the news", - "play npr news", - "play euronews", - "play catalan news", - "play portuguese news", - "play news in spanish" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/1/3/9/0/63b4ffb00450fc1351303fc63d6cdb4693813760dde87d768751f74417aa1bfd21d9.png", - "category": "Information", - "created": "2021-03-14T11:24:42+00:00", - "modified": "2021-03-14T22:10:50+00:00", - "description": "News streams from around the globe<br />\n<br />\nSupported stations include:<br />\n<br />\n- [en / PT / ES / DE / RU / IT / FR] EuroNews (video + audio)<br />\n- [en / ES / FR] France24 (video + audio)<br />\n- [en / DE / ES] Deutsche Welle (video + audio)<br />\n- [en / EN-US / EN-GB / FR] Russia...", - "tags": [ - "addon", - "apache-license", - "original-product", - "mycroft-bigscreen", - "mycroft-mk2", - "mycroft-phone", - "news", - "media", - "better-cps", - "streams" - ], - "version": "0.2", - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1491503" - }, - { - "skillname": "VoIP Skill", - "authorname": "jarbasai", - "foldername": "", - "url": "https://github.com/JarbasSkills/skill-voip", - "branch": "master", - "desktopFile": false, - "warning": "", - "systemDeps": true, - "platforms": [ - "arm", - "arm64", - "i386", - "x86_64", - "ia64" - ], - "examples": [ - "call bob", - "call bob and say Open Source is AWESOME", - "reject call", - "accept call", - "mute call", - "list contacts" - ], - "logo": "https://cn.opendesktop.org/cache/770x540-0/img/0/5/c/4/c4b59c55193008d0dc80958d89ab2ce9627f.png", - "category": "Productivity", - "created": "2020-06-02T12:52:24+00:00", - "modified": "2020-07-08T03:39:44+00:00", - "description": "Place voice and receive voice calls with mycroft", - "tags": [ - "addon", - "original-product", - "mycroft-mk2", - "mycroft-bigscreen", - "mycroft-phone", - "apache-license", - "mycroft", - "skills", - "gui", - "voip", - "sip" - ], - "version": null, - "appstore": "pling.opendesktop", - "appstore_url": "https://store.kde.org/p/1389611" - } - ] -} \ No newline at end of file diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/precise-lite/wakewords/en/android.tflite b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/precise-lite/wakewords/en/android.tflite deleted file mode 100644 index 1814d7b9..00000000 Binary files a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/precise-lite/wakewords/en/android.tflite and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/precise-lite/wakewords/en/computer.tflite b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/precise-lite/wakewords/en/computer.tflite deleted file mode 100644 index 53145743..00000000 Binary files a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/precise-lite/wakewords/en/computer.tflite and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/precise-lite/wakewords/en/hey_mycroft.tflite b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/precise-lite/wakewords/en/hey_mycroft.tflite deleted file mode 100644 index 507bf413..00000000 Binary files a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/precise-lite/wakewords/en/hey_mycroft.tflite and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/precise-lite/wakewords/en/marvin.tflite b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/precise-lite/wakewords/en/marvin.tflite deleted file mode 100644 index 03494d02..00000000 Binary files a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/precise-lite/wakewords/en/marvin.tflite and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/precise-lite/wakewords/en/sheila.tflite b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/precise-lite/wakewords/en/sheila.tflite deleted file mode 100644 index ca9df07a..00000000 Binary files a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/precise-lite/wakewords/en/sheila.tflite and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/README b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/README deleted file mode 100644 index a7f79317..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/README +++ /dev/null @@ -1,9 +0,0 @@ -US English model for mobile Vosk applications - -Copyright 2020 Alpha Cephei Inc - -Accuracy: 10.38 (tedlium test) 9.85 (librispeech test-clean) -Speed: 0.11xRT (desktop) -Latency: 0.15s (right context) - - diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/am/final.mdl b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/am/final.mdl deleted file mode 100644 index 5596b31d..00000000 Binary files a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/am/final.mdl and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/conf/mfcc.conf b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/conf/mfcc.conf deleted file mode 100644 index eaa40c5b..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/conf/mfcc.conf +++ /dev/null @@ -1,7 +0,0 @@ ---sample-frequency=16000 ---use-energy=false ---num-mel-bins=40 ---num-ceps=40 ---low-freq=20 ---high-freq=7600 ---allow-downsample=true diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/conf/model.conf b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/conf/model.conf deleted file mode 100644 index 9d5b0da3..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/conf/model.conf +++ /dev/null @@ -1,10 +0,0 @@ ---min-active=200 ---max-active=3000 ---beam=10.0 ---lattice-beam=2.0 ---acoustic-scale=1.0 ---frame-subsampling-factor=3 ---endpoint.silence-phones=1:2:3:4:5:6:7:8:9:10 ---endpoint.rule2.min-trailing-silence=0.5 ---endpoint.rule3.min-trailing-silence=0.75 ---endpoint.rule4.min-trailing-silence=1.0 diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/graph/Gr.fst b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/graph/Gr.fst deleted file mode 100644 index 1f292e63..00000000 Binary files a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/graph/Gr.fst and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/graph/HCLr.fst b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/graph/HCLr.fst deleted file mode 100644 index 9797b262..00000000 Binary files a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/graph/HCLr.fst and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/graph/disambig_tid.int b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/graph/disambig_tid.int deleted file mode 100644 index 762fd5f0..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/graph/disambig_tid.int +++ /dev/null @@ -1,17 +0,0 @@ -10015 -10016 -10017 -10018 -10019 -10020 -10021 -10022 -10023 -10024 -10025 -10026 -10027 -10028 -10029 -10030 -10031 diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/graph/phones/word_boundary.int b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/graph/phones/word_boundary.int deleted file mode 100644 index df23fd7c..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/graph/phones/word_boundary.int +++ /dev/null @@ -1,166 +0,0 @@ -1 nonword -2 begin -3 end -4 internal -5 singleton -6 nonword -7 begin -8 end -9 internal -10 singleton -11 begin -12 end -13 internal -14 singleton -15 begin -16 end -17 internal -18 singleton -19 begin -20 end -21 internal -22 singleton -23 begin -24 end -25 internal -26 singleton -27 begin -28 end -29 internal -30 singleton -31 begin -32 end -33 internal -34 singleton -35 begin -36 end -37 internal -38 singleton -39 begin -40 end -41 internal -42 singleton -43 begin -44 end -45 internal -46 singleton -47 begin -48 end -49 internal -50 singleton -51 begin -52 end -53 internal -54 singleton -55 begin -56 end -57 internal -58 singleton -59 begin -60 end -61 internal -62 singleton -63 begin -64 end -65 internal -66 singleton -67 begin -68 end -69 internal -70 singleton -71 begin -72 end -73 internal -74 singleton -75 begin -76 end -77 internal -78 singleton -79 begin -80 end -81 internal -82 singleton -83 begin -84 end -85 internal -86 singleton -87 begin -88 end -89 internal -90 singleton -91 begin -92 end -93 internal -94 singleton -95 begin -96 end -97 internal -98 singleton -99 begin -100 end -101 internal -102 singleton -103 begin -104 end -105 internal -106 singleton -107 begin -108 end -109 internal -110 singleton -111 begin -112 end -113 internal -114 singleton -115 begin -116 end -117 internal -118 singleton -119 begin -120 end -121 internal -122 singleton -123 begin -124 end -125 internal -126 singleton -127 begin -128 end -129 internal -130 singleton -131 begin -132 end -133 internal -134 singleton -135 begin -136 end -137 internal -138 singleton -139 begin -140 end -141 internal -142 singleton -143 begin -144 end -145 internal -146 singleton -147 begin -148 end -149 internal -150 singleton -151 begin -152 end -153 internal -154 singleton -155 begin -156 end -157 internal -158 singleton -159 begin -160 end -161 internal -162 singleton -163 begin -164 end -165 internal -166 singleton diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/ivector/final.dubm b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/ivector/final.dubm deleted file mode 100644 index db789eb9..00000000 Binary files a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/ivector/final.dubm and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/ivector/final.ie b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/ivector/final.ie deleted file mode 100644 index 93737bf7..00000000 Binary files a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/ivector/final.ie and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/ivector/final.mat b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/ivector/final.mat deleted file mode 100644 index c3ec635b..00000000 Binary files a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/ivector/final.mat and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/ivector/global_cmvn.stats b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/ivector/global_cmvn.stats deleted file mode 100644 index b9d92efb..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/ivector/global_cmvn.stats +++ /dev/null @@ -1,3 +0,0 @@ - [ - 1.682383e+11 -1.1595e+10 -1.521733e+10 4.32034e+09 -2.257938e+10 -1.969666e+10 -2.559265e+10 -1.535687e+10 -1.276854e+10 -4.494483e+09 -1.209085e+10 -5.64008e+09 -1.134847e+10 -3.419512e+09 -1.079542e+10 -4.145463e+09 -6.637486e+09 -1.11318e+09 -3.479773e+09 -1.245932e+08 -1.386961e+09 6.560655e+07 -2.436518e+08 -4.032432e+07 4.620046e+08 -7.714964e+07 9.551484e+08 -4.119761e+08 8.208582e+08 -7.117156e+08 7.457703e+08 -4.3106e+08 1.202726e+09 2.904036e+08 1.231931e+09 3.629848e+08 6.366939e+08 -4.586172e+08 -5.267629e+08 -3.507819e+08 1.679838e+09 - 1.741141e+13 8.92488e+11 8.743834e+11 8.848896e+11 1.190313e+12 1.160279e+12 1.300066e+12 1.005678e+12 9.39335e+11 8.089614e+11 7.927041e+11 6.882427e+11 6.444235e+11 5.151451e+11 4.825723e+11 3.210106e+11 2.720254e+11 1.772539e+11 1.248102e+11 6.691599e+10 3.599804e+10 1.207574e+10 1.679301e+09 4.594778e+08 5.821614e+09 1.451758e+10 2.55803e+10 3.43277e+10 4.245286e+10 4.784859e+10 4.988591e+10 4.925451e+10 5.074584e+10 4.9557e+10 4.407876e+10 3.421443e+10 3.138606e+10 2.539716e+10 1.948134e+10 1.381167e+10 0 ] diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/ivector/online_cmvn.conf b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/ivector/online_cmvn.conf deleted file mode 100644 index 7748a4a4..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/ivector/online_cmvn.conf +++ /dev/null @@ -1 +0,0 @@ -# configuration file for apply-cmvn-online, used in the script ../local/run_online_decoding.sh diff --git a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/ivector/splice.conf b/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/ivector/splice.conf deleted file mode 100644 index 960cd2e4..00000000 --- a/buildroot-external/rootfs-overlay/base/home/mycroft/.local/share/vosk/vosk-model-small-en-us-0.15/ivector/splice.conf +++ /dev/null @@ -1,2 +0,0 @@ ---left-context=3 ---right-context=3 diff --git a/buildroot-external/rootfs-overlay/base/usr/bin/bus-monitor b/buildroot-external/rootfs-overlay/base/usr/bin/bus-monitor deleted file mode 100755 index 5a867586..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/bin/bus-monitor +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env python3 -import traceback -from time import sleep -from mycroft.util.log import LOG -from mycroft.util.time import now_local -from mycroft.messagebus import MessageBusClient - - -def on_message(message): - dt = str(now_local())[:19] - print(f"{dt} >> {message}") - - -def main(): - sleep(0.5) - # Connect to the default websocket used by mycroft-core - # TODO arg parse - client = MessageBusClient() - client.on("message", on_message) - client.run_forever() - LOG.info('Client stopped.') - - -if __name__ == '__main__': - # Run loop trying to reconnect if there are any issues starting - # the websocket - while True: - try: - main() - except KeyboardInterrupt: - break - except: - traceback.print_exc() diff --git a/buildroot-external/rootfs-overlay/base/usr/bin/mycroft-config b/buildroot-external/rootfs-overlay/base/usr/bin/mycroft-config deleted file mode 100755 index a1271b32..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/bin/mycroft-config +++ /dev/null @@ -1,244 +0,0 @@ -#!/usr/bin/env bash - -# Copyright 2019 Mycroft AI Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -SOURCE="${BASH_SOURCE[0]}" -cd -P "$( dirname "$SOURCE" )" -DIR="$( pwd )" -script=${0} -script=${script##*/} - -function help() { - echo "${script}: Mycroft configuration manager" - echo "usage: ${script} [COMMAND] [params]" - echo - echo "COMMANDs:" - echo " edit (system|user) edit and validate config file" - echo " reload instruct services to reload config" - echo " show (default|remote|system|user) display the specified setting file" - echo " set <var> set the variable (under USER)" - echo " get [var] display a particular variable" - echo " or all if no 'var' specified" - echo "Note: Use jq format for specifying <var>" - echo - echo "Examples:" - echo " ${script} edit user" - echo " sudo ${script} edit system" - echo " ${script} show remote" - echo " ${script} get" - echo " ${script} get enclosure.platform" - echo " ${script} set test.subvalue \"foo\" " - - exit 1 -} - -################################################################ -# Setup stuff based on the environment - -VIEWER="nano --syntax=json --view" -if [ -z "$EDITOR" ] ; then - if [ $( which sensible-editor ) ] ; then - EDITOR="sensible-editor" - else - EDITOR="nano --syntax=json --tempfile" - fi -fi - -if [ -z "$TEMP" ] ; then - TEMP="/tmp" -fi - -function found_exe() { - hash "$1" 2>/dev/null -} - -if found_exe tput ; then - GREEN="$(tput setaf 2)" - BLUE="$(tput setaf 4)" - CYAN="$(tput setaf 6)" - YELLOW="$(tput setaf 3)" - RESET="$(tput sgr0)" - HIGHLIGHT=${YELLOW} -fi - -################################################################ -# Utilities - -function validate_config_file() { - if [ ! -f "$1" ] ; then - # A missing config file is valid - return 0 - fi - - echo -n ${BLUE} - - # Remove any comments (lines starting with # or //) found in the file and - # Use jq to validate and output errors - sed 's/^\s*[#\/].*$//g' "$1" | sed '/^$/d' | jq -e "." > /dev/null - result=$? - - echo -n ${RESET} - - #xxx echo "RESULT=$result for $1" - return $result -} - -_conf_file="~/.mycroft/mycroft.conf" -function name_to_path() { - case ${1} in - "system") _conf_file="/etc/mycroft/mycroft.conf" ;; - "user") _conf_file=$(readlink -f ~/.mycroft/mycroft.conf) ;; - "default") _conf_file="$DIR/../mycroft/configuration/mycroft.conf" ;; - "remote") _conf_file="/var/tmp/mycroft_web_cache.json" ;; - - *) - echo "ERROR: Unknown name '${1}'." - echo " Must be one of: default, remote, system, or user" - exit 1 - esac -} - -################################################################ - -function edit_config() { - name_to_path $1 - validate_config_file $_conf_file - rc=$? - if [ $rc -ne 0 ] ; then - echo "${YELLOW}WARNING: ${RESET}Configuration file did not pass validation before edits." - read -p "Review errors above and press ENTER to continue with editing." - fi - - if [ -f "${_conf_file}" ] ; then - cp "${_conf_file}" "${TEMP}/mycroft.json" - else - echo "{" > "${TEMP}/mycroft.json" - echo "}" >> "${TEMP}/mycroft.json" - fi - - while [ 1 ] ; do - case $1 in - system | user) - # Allow user to edit - $EDITOR $TEMP/mycroft.json - ;; - default | remote) - # View-only - echo "The default config shouldn't be changed, opening in View mode" - sleep 2 - $VIEWER $TEMP/mycroft.json - ;; - esac - - cmp --quiet "${_conf_file}" "${TEMP}/mycroft.json" - rc=$? - if [ $rc -eq 0 ] ; then - echo "Configuration unchanged." - break - fi - - # file was changed, validate changes - validate_config_file $TEMP/mycroft.json - if [ $? -ne 0 ] ; then - echo "${YELLOW}WARNING: ${RESET}Configuration file does not pass validation, see errors above." - echo "Press X to abandon changes, S to force save, any other key to edit again." - read -N1 -s key - else - key="S" - fi - - case $key in - [Ss]) - echo "Saving..." - mv $TEMP/mycroft.json $_conf_file - signal_reload_config - break - ;; - [Xx]) - # abandoning - break - ;; - esac - - done -} - -function signal_reload_config() { - # Enter the Mycroft venv - source "$DIR/../venv-activate.sh" -q - - # Post a messagebus notification to reload the config file - output=$(python -m mycroft.messagebus.send "configuration.updated" "{}") -} - -function show_config() { - name_to_path $1 - - # Use jq to display formatted nicely (after stripping out comments) - sed 's/^\s*[#\/].*$//g' "${_conf_file}" | sed '/^$/d' | jq "." -} - -function get_config() { - value=$1 - if [[ ! $value =~ ^\..* ]] ; then - # Add the leading period if not included - value=".${value}" - fi - - # Load all the configuration(s) - json_config=$( source "$DIR/../venv-activate.sh" -q && python -c "import json; from mycroft.configuration import Configuration; print(json.dumps(Configuration.get()))" ) - - # Read the given variable from the mix - echo ${json_config} | jq -r "${value}" -} - -function set_config() { - # Set all overrides under the user configuration - value=$1 - if [[ ! $value =~ ^\..* ]] ; then - # Add the leading period if not included - value=".${value}" - fi - - jq "${value} = \"$2\"" ~/.mycroft/mycroft.conf > "${TEMP}/~mycroft.conf" - if [ $? -eq 0 ] ; then - # Successful update, replace the config file - mv "${TEMP}/~mycroft.conf" ~/.mycroft/mycroft.conf - signal_reload_config - fi -} - -_opt=$1 -case ${_opt} in - "edit") - edit_config $2 - ;; - "reload") - signal_reload_config - ;; - "show") - show_config $2 - ;; - "get") - get_config $2 - ;; - "set") - set_config "$2" "$3" - ;; - - *) - help - ;; -esac diff --git a/buildroot-external/rootfs-overlay/base/usr/bin/mycroft-listen b/buildroot-external/rootfs-overlay/base/usr/bin/mycroft-listen deleted file mode 100755 index 940b688a..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/bin/mycroft-listen +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env bash - -# Copyright 2020 Mycroft AI Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Send a message to be spoken -python -m mycroft.messagebus.send "mycroft.mic.listen" diff --git a/buildroot-external/rootfs-overlay/base/usr/bin/mycroft-say-to b/buildroot-external/rootfs-overlay/base/usr/bin/mycroft-say-to deleted file mode 100755 index 8cc3f03a..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/bin/mycroft-say-to +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env bash - -# Copyright 2018 Mycroft AI Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Sets var 1 to stdin if no args were given -set -- "${1:-$(</dev/stdin)}" "${@:2}" - -# Send a message to be spoken -data="$@" -output=$(python -m mycroft.messagebus.send "recognizer_loop:utterance" "{\"utterances\": [\"$data\"], \"lang\": \"en-us\"}") diff --git a/buildroot-external/rootfs-overlay/base/usr/bin/mycroft-speak b/buildroot-external/rootfs-overlay/base/usr/bin/mycroft-speak deleted file mode 100755 index 803a1235..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/bin/mycroft-speak +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env bash - -# Copyright 2018 Mycroft AI Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Sets var 1 to stdin if no args were given -set -- "${1:-$(</dev/stdin)}" "${@:2}" - -# Send a message to be spoken -data="$@" -output=$(python -m mycroft.messagebus.send "speak" "{\"utterance\": \"$data\"}") diff --git a/buildroot-external/rootfs-overlay/base/usr/bin/timezonefinder b/buildroot-external/rootfs-overlay/base/usr/bin/timezonefinder deleted file mode 100755 index aa0120a5..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/bin/timezonefinder +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -import re -import sys -from timezonefinder.command_line import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum-2.1.2.dist-info/INSTALLER b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum-2.1.2.dist-info/INSTALLER deleted file mode 100644 index a1b589e3..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum-2.1.2.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum-2.1.2.dist-info/LICENSE b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum-2.1.2.dist-info/LICENSE deleted file mode 100644 index b9cd4667..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum-2.1.2.dist-info/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2015 Sébastien Eustace - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum-2.1.2.dist-info/METADATA b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum-2.1.2.dist-info/METADATA deleted file mode 100644 index df2899f6..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum-2.1.2.dist-info/METADATA +++ /dev/null @@ -1,253 +0,0 @@ -Metadata-Version: 2.1 -Name: pendulum -Version: 2.1.2 -Summary: Python datetimes made easy -Home-page: https://pendulum.eustace.io -License: MIT -Keywords: datetime,date,time -Author: Sébastien Eustace -Author-email: sebastien@eustace.io -Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.* -Classifier: License :: OSI Approved :: MIT License -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Requires-Dist: python-dateutil (>=2.6,<3.0) -Requires-Dist: pytzdata (>=2020.1) -Requires-Dist: typing (>=3.6,<4.0) ; python_version < "3.5" -Project-URL: Documentation, https://pendulum.eustace.io/docs -Project-URL: Repository, https://github.com/sdispater/pendulum -Description-Content-Type: text/x-rst - -Pendulum -######## - -.. image:: https://img.shields.io/pypi/v/pendulum.svg - :target: https://pypi.python.org/pypi/pendulum - -.. image:: https://img.shields.io/pypi/l/pendulum.svg - :target: https://pypi.python.org/pypi/pendulum - -.. image:: https://img.shields.io/codecov/c/github/sdispater/pendulum/master.svg - :target: https://codecov.io/gh/sdispater/pendulum/branch/master - -.. image:: https://travis-ci.org/sdispater/pendulum.svg - :alt: Pendulum Build status - :target: https://travis-ci.org/sdispater/pendulum - -Python datetimes made easy. - -Supports Python **2.7** and **3.4+**. - - -.. code-block:: python - - >>> import pendulum - - >>> now_in_paris = pendulum.now('Europe/Paris') - >>> now_in_paris - '2016-07-04T00:49:58.502116+02:00' - - # Seamless timezone switching - >>> now_in_paris.in_timezone('UTC') - '2016-07-03T22:49:58.502116+00:00' - - >>> tomorrow = pendulum.now().add(days=1) - >>> last_week = pendulum.now().subtract(weeks=1) - - >>> past = pendulum.now().subtract(minutes=2) - >>> past.diff_for_humans() - >>> '2 minutes ago' - - >>> delta = past - last_week - >>> delta.hours - 23 - >>> delta.in_words(locale='en') - '6 days 23 hours 58 minutes' - - # Proper handling of datetime normalization - >>> pendulum.datetime(2013, 3, 31, 2, 30, tz='Europe/Paris') - '2013-03-31T03:30:00+02:00' # 2:30 does not exist (Skipped time) - - # Proper handling of dst transitions - >>> just_before = pendulum.datetime(2013, 3, 31, 1, 59, 59, 999999, tz='Europe/Paris') - '2013-03-31T01:59:59.999999+01:00' - >>> just_before.add(microseconds=1) - '2013-03-31T03:00:00+02:00' - - -Why Pendulum? -============= - -Native ``datetime`` instances are enough for basic cases but when you face more complex use-cases -they often show limitations and are not so intuitive to work with. -``Pendulum`` provides a cleaner and more easy to use API while still relying on the standard library. -So it's still ``datetime`` but better. - -Unlike other datetime libraries for Python, Pendulum is a drop-in replacement -for the standard ``datetime`` class (it inherits from it), so, basically, you can replace all your ``datetime`` -instances by ``DateTime`` instances in you code (exceptions exist for libraries that check -the type of the objects by using the ``type`` function like ``sqlite3`` or ``PyMySQL`` for instance). - -It also removes the notion of naive datetimes: each ``Pendulum`` instance is timezone-aware -and by default in ``UTC`` for ease of use. - -Pendulum also improves the standard ``timedelta`` class by providing more intuitive methods and properties. - - -Why not Arrow? -============== - -Arrow is the most popular datetime library for Python right now, however its behavior -and API can be erratic and unpredictable. The ``get()`` method can receive pretty much anything -and it will try its best to return something while silently failing to handle some cases: - -.. code-block:: python - - arrow.get('2016-1-17') - # <Arrow [2016-01-01T00:00:00+00:00]> - - pendulum.parse('2016-1-17') - # <Pendulum [2016-01-17T00:00:00+00:00]> - - arrow.get('20160413') - # <Arrow [1970-08-22T08:06:53+00:00]> - - pendulum.parse('20160413') - # <Pendulum [2016-04-13T00:00:00+00:00]> - - arrow.get('2016-W07-5') - # <Arrow [2016-01-01T00:00:00+00:00]> - - pendulum.parse('2016-W07-5') - # <Pendulum [2016-02-19T00:00:00+00:00]> - - # Working with DST - just_before = arrow.Arrow(2013, 3, 31, 1, 59, 59, 999999, 'Europe/Paris') - just_after = just_before.replace(microseconds=1) - '2013-03-31T02:00:00+02:00' - # Should be 2013-03-31T03:00:00+02:00 - - (just_after.to('utc') - just_before.to('utc')).total_seconds() - -3599.999999 - # Should be 1e-06 - - just_before = pendulum.datetime(2013, 3, 31, 1, 59, 59, 999999, 'Europe/Paris') - just_after = just_before.add(microseconds=1) - '2013-03-31T03:00:00+02:00' - - (just_after.in_timezone('utc') - just_before.in_timezone('utc')).total_seconds() - 1e-06 - -Those are a few examples showing that Arrow cannot always be trusted to have a consistent -behavior with the data you are passing to it. - - -Limitations -=========== - -Even though the ``DateTime`` class is a subclass of ``datetime`` there are some rare cases where -it can't replace the native class directly. Here is a list (non-exhaustive) of the reported cases with -a possible solution, if any: - -* ``sqlite3`` will use the ``type()`` function to determine the type of the object by default. To work around it you can register a new adapter: - -.. code-block:: python - - from pendulum import DateTime - from sqlite3 import register_adapter - - register_adapter(DateTime, lambda val: val.isoformat(' ')) - -* ``mysqlclient`` (former ``MySQLdb``) and ``PyMySQL`` will use the ``type()`` function to determine the type of the object by default. To work around it you can register a new adapter: - -.. code-block:: python - - import MySQLdb.converters - import pymysql.converters - - from pendulum import DateTime - - MySQLdb.converters.conversions[DateTime] = MySQLdb.converters.DateTime2literal - pymysql.converters.conversions[DateTime] = pymysql.converters.escape_datetime - -* ``django`` will use the ``isoformat()`` method to store datetimes in the database. However since ``pendulum`` is always timezone aware the offset information will always be returned by ``isoformat()`` raising an error, at least for MySQL databases. To work around it you can either create your own ``DateTimeField`` or use the previous workaround for ``MySQLdb``: - -.. code-block:: python - - from django.db.models import DateTimeField as BaseDateTimeField - from pendulum import DateTime - - - class DateTimeField(BaseDateTimeField): - - def value_to_string(self, obj): - val = self.value_from_object(obj) - - if isinstance(value, DateTime): - return value.to_datetime_string() - - return '' if val is None else val.isoformat() - - -Resources -========= - -* `Official Website <https://pendulum.eustace.io>`_ -* `Documentation <https://pendulum.eustace.io/docs/>`_ -* `Issue Tracker <https://github.com/sdispater/pendulum/issues>`_ - - -Contributing -============ - -Contributions are welcome, especially with localization. - -Getting started ---------------- - -To work on the Pendulum codebase, you'll want to clone the project locally -and install the required depedendencies via `poetry <https://poetry.eustace.io>`_. - -.. code-block:: bash - - $ git clone git@github.com:sdispater/pendulum.git - $ poetry install - -Localization ------------- - -If you want to help with localization, there are two different cases: the locale already exists -or not. - -If the locale does not exist you will need to create it by using the ``clock`` utility: - -.. code-block:: bash - - ./clock locale create <your-locale> - -It will generate a directory in ``pendulum/locales`` named after your locale, with the following -structure: - -.. code-block:: text - - <your-locale>/ - - custom.py - - locale.py - -The ``locale.py`` file must not be modified. It contains the translations provided by -the CLDR database. - -The ``custom.py`` file is the one you want to modify. It contains the data needed -by Pendulum that are not provided by the CLDR database. You can take the `en <https://github.com/sdispater/pendulum/tree/master/pendulum/locales/en/custom.py>`_ -data as a reference to see which data is needed. - -You should also add tests for the created or modified locale. - diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum-2.1.2.dist-info/RECORD b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum-2.1.2.dist-info/RECORD deleted file mode 100644 index b2490b0e..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum-2.1.2.dist-info/RECORD +++ /dev/null @@ -1,193 +0,0 @@ -pendulum-2.1.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -pendulum-2.1.2.dist-info/LICENSE,sha256=Jhgfk_52I_W_PhHK7XPsx_u0meJZ9TQzARchMPboFR0,1082 -pendulum-2.1.2.dist-info/METADATA,sha256=8Y18g-l0NDDZKdf0sOA38a874pY5qEAXbhBlE6_716c,8559 -pendulum-2.1.2.dist-info/RECORD,, -pendulum-2.1.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pendulum-2.1.2.dist-info/WHEEL,sha256=Ggj0fLZgB8T39FttQfxsvhk_5uZkqtSwLlvaw_6TAgo,110 -pendulum/__init__.py,sha256=I9yZ1ahXqHSNgtnZMJH3d1c0F_DXotVGrTotbIElY10,8597 -pendulum/__pycache__/__init__.cpython-311.pyc,, -pendulum/__pycache__/__version__.cpython-311.pyc,, -pendulum/__pycache__/constants.cpython-311.pyc,, -pendulum/__pycache__/date.cpython-311.pyc,, -pendulum/__pycache__/datetime.cpython-311.pyc,, -pendulum/__pycache__/duration.cpython-311.pyc,, -pendulum/__pycache__/exceptions.cpython-311.pyc,, -pendulum/__pycache__/helpers.cpython-311.pyc,, -pendulum/__pycache__/parser.cpython-311.pyc,, -pendulum/__pycache__/period.cpython-311.pyc,, -pendulum/__pycache__/time.cpython-311.pyc,, -pendulum/__version__.py,sha256=ByWE4qw8r36fv4OeLSjIm5p0j96GhZ__fEvMV0EfSWA,23 -pendulum/_extensions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pendulum/_extensions/__pycache__/__init__.cpython-311.pyc,, -pendulum/_extensions/__pycache__/helpers.cpython-311.pyc,, -pendulum/_extensions/_helpers.c,sha256=7bRT-aSD4i3JXFSYFn5l61bMGWBcvSaN9zfhjEh6rto,25967 -pendulum/_extensions/helpers.py,sha256=j35ZG0wS5BMCx7JURA8PHZo4OAyNJAjriWXN-kZHc20,9628 -pendulum/constants.py,sha256=dC8X7rpmZtAZdHLBavg7aJH-SaNxFpuRTnvldnIbtpQ,2921 -pendulum/date.py,sha256=T95mBE0nEzLHG6fYWyUU13bnp4fne7J1NcaYxmaAFdo,25553 -pendulum/datetime.py,sha256=ozcljD8A9ZHZNgqGItXXkzYy1Lv8PIzLBFLkbgUZiwA,44014 -pendulum/duration.py,sha256=VpS69PUfHxGxKxdwcUmR6MJaiMEWk5TfDArfAsxebMo,13111 -pendulum/exceptions.py,sha256=lj-GpJsrpl-exkmV86Wr0lobPkEo6zAIf5twV7RXBBc,106 -pendulum/formatting/__init__.py,sha256=U7cXnts7Cvugr2AaECCYFAAhyV4MfMtglNvjMkRGRPY,63 -pendulum/formatting/__pycache__/__init__.cpython-311.pyc,, -pendulum/formatting/__pycache__/difference_formatter.cpython-311.pyc,, -pendulum/formatting/__pycache__/formatter.cpython-311.pyc,, -pendulum/formatting/difference_formatter.py,sha256=Q9T7m1BF0WT8AHDQXajvvGAZ9sCGKyy5SE6RXN9ye38,4545 -pendulum/formatting/formatter.py,sha256=-xJkF2o9LyMgbAPWrFsMSaHV6mY3WxcxaELOupoCF_0,22604 -pendulum/helpers.py,sha256=mdcQhQMxICpXQOtGyVX87LFz_my8fVXVzt7Dz0cWbJM,5505 -pendulum/locales/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pendulum/locales/__pycache__/__init__.cpython-311.pyc,, -pendulum/locales/__pycache__/locale.cpython-311.pyc,, -pendulum/locales/da/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pendulum/locales/da/__pycache__/__init__.cpython-311.pyc,, -pendulum/locales/da/__pycache__/custom.cpython-311.pyc,, -pendulum/locales/da/__pycache__/locale.cpython-311.pyc,, -pendulum/locales/da/custom.py,sha256=UBThGUwvsM3NFkkARfxagdc3TOG02ENDrWepJcdSJxQ,451 -pendulum/locales/da/locale.py,sha256=U_d0jLheiL5YVyzlxpK79kQgXDGZD1JR4lgtRBZ6R0U,4961 -pendulum/locales/de/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pendulum/locales/de/__pycache__/__init__.cpython-311.pyc,, -pendulum/locales/de/__pycache__/custom.cpython-311.pyc,, -pendulum/locales/de/__pycache__/locale.cpython-311.pyc,, -pendulum/locales/de/custom.py,sha256=voSoKimREV6hw6_3iLY3QZ2iyzks8QQ8qCFKHCKT3jM,1137 -pendulum/locales/de/locale.py,sha256=Tsqk4DGa1oOnphUS24zwE6-4EZMo0sqztye1sNwnLN4,4822 -pendulum/locales/en/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pendulum/locales/en/__pycache__/__init__.cpython-311.pyc,, -pendulum/locales/en/__pycache__/custom.cpython-311.pyc,, -pendulum/locales/en/__pycache__/locale.cpython-311.pyc,, -pendulum/locales/en/custom.py,sha256=PW4F4dcPoKjEbfzHLQalW66WXDtaLSOIR7SjbyaZGk8,636 -pendulum/locales/en/locale.py,sha256=wbq_f5YbuKrDKaRB32982W21FYJd7ix00LE1mInlFH8,5064 -pendulum/locales/es/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pendulum/locales/es/__pycache__/__init__.cpython-311.pyc,, -pendulum/locales/es/__pycache__/custom.cpython-311.pyc,, -pendulum/locales/es/__pycache__/locale.cpython-311.pyc,, -pendulum/locales/es/custom.py,sha256=17h3Y5HqdxPPdqMheG7Hn29WrXvHs6HqGKlTO_sn1YM,628 -pendulum/locales/es/locale.py,sha256=j6fmEM5uOivo1PKePKqgnjG7Dj2gIeuuKxEN79Ekals,4871 -pendulum/locales/fa/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pendulum/locales/fa/__pycache__/__init__.cpython-311.pyc,, -pendulum/locales/fa/__pycache__/custom.cpython-311.pyc,, -pendulum/locales/fa/__pycache__/locale.cpython-311.pyc,, -pendulum/locales/fa/custom.py,sha256=yuU6s6evM1XFCXmuE4QjHW5RwiwltSy1xhRryF_XsUU,455 -pendulum/locales/fa/locale.py,sha256=_-K24CSVZ2OtelErgDfeFHzvddAPYx5u2FC8KvWjACo,5112 -pendulum/locales/fo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pendulum/locales/fo/__pycache__/__init__.cpython-311.pyc,, -pendulum/locales/fo/__pycache__/custom.cpython-311.pyc,, -pendulum/locales/fo/__pycache__/locale.cpython-311.pyc,, -pendulum/locales/fo/custom.py,sha256=fMY9tEmLB07Bbp2MkwTcMW28a3koDsHfMHvb7NeCc4Q,499 -pendulum/locales/fo/locale.py,sha256=UyxR9DM5Ak89BCMSQVl5zctTuQaQHGOqY_iYr_ARd2s,4555 -pendulum/locales/fr/__init__.py,sha256=lVL4VPz3c4kWCgjPtL4uuQLNmgwK92q1ffAsv5El02k,25 -pendulum/locales/fr/__pycache__/__init__.cpython-311.pyc,, -pendulum/locales/fr/__pycache__/custom.cpython-311.pyc,, -pendulum/locales/fr/__pycache__/locale.cpython-311.pyc,, -pendulum/locales/fr/custom.py,sha256=kAfAr-7FaLIocIrFZPUqZ7kfO833OCbJVF3ypzN5Oqg,612 -pendulum/locales/fr/locale.py,sha256=nDdBuZ0EciY0dpKWDykp_v1y0PZWFL3U2sMg2gSZ3z4,4704 -pendulum/locales/id/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pendulum/locales/id/__pycache__/__init__.cpython-311.pyc,, -pendulum/locales/id/__pycache__/custom.cpython-311.pyc,, -pendulum/locales/id/__pycache__/locale.cpython-311.pyc,, -pendulum/locales/id/custom.py,sha256=uChc_mPCfYxsM4tw0pQvif31YsExoDcTeva2cWjLu9g,523 -pendulum/locales/id/locale.py,sha256=7Dqfxb5FIoi8UdSrlpUawo40TWAI5awzE3JRmj0xHHc,4184 -pendulum/locales/it/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pendulum/locales/it/__pycache__/__init__.cpython-311.pyc,, -pendulum/locales/it/__pycache__/custom.cpython-311.pyc,, -pendulum/locales/it/__pycache__/locale.cpython-311.pyc,, -pendulum/locales/it/custom.py,sha256=nmCVmVTx0B6lknX4UblbsS-S8WJhhsob3kMgUZiYKp8,600 -pendulum/locales/it/locale.py,sha256=pNRseajglYWnlddr7vAn-9C6Q3pu8u4c6-9t7ABRNqY,4861 -pendulum/locales/ko/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pendulum/locales/ko/__pycache__/__init__.cpython-311.pyc,, -pendulum/locales/ko/__pycache__/custom.cpython-311.pyc,, -pendulum/locales/ko/__pycache__/locale.cpython-311.pyc,, -pendulum/locales/ko/custom.py,sha256=GdSQMb-qQ3aIkdoPpW9ff-iycDWSFmuJTMfrjJbiHcU,484 -pendulum/locales/ko/locale.py,sha256=1SB49DRkj47OcA1ZMJE4xH3t_ASCIa-t2nK4sbbPmOI,3579 -pendulum/locales/locale.py,sha256=ESQrnDsdyYsFvgyuX3lkJ6tKHG4IezQk-oe_x6ij3cQ,3131 -pendulum/locales/lt/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pendulum/locales/lt/__pycache__/__init__.cpython-311.pyc,, -pendulum/locales/lt/__pycache__/custom.cpython-311.pyc,, -pendulum/locales/lt/__pycache__/locale.cpython-311.pyc,, -pendulum/locales/lt/custom.py,sha256=EipZptVq0ATZQzCgiGcrMEhvM06m8Fon-KSrcCKReAI,3574 -pendulum/locales/lt/locale.py,sha256=AUBDrdCuQY7_ln4rowzlcU22xQ0EHMWqffc8jqQhG5Q,8469 -pendulum/locales/nb/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pendulum/locales/nb/__pycache__/__init__.cpython-311.pyc,, -pendulum/locales/nb/__pycache__/custom.cpython-311.pyc,, -pendulum/locales/nb/__pycache__/locale.cpython-311.pyc,, -pendulum/locales/nb/custom.py,sha256=B2rQwzo6hVOf_YFhWEVx7Lr9k6WDzVKG9FG3XbDxOIE,530 -pendulum/locales/nb/locale.py,sha256=XD0_QdZtGh1Oo0U6zh7hbFiQb5lFzwNpFfcjMXfdYAY,4986 -pendulum/locales/nl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pendulum/locales/nl/__pycache__/__init__.cpython-311.pyc,, -pendulum/locales/nl/__pycache__/custom.cpython-311.pyc,, -pendulum/locales/nl/__pycache__/locale.cpython-311.pyc,, -pendulum/locales/nl/custom.py,sha256=dJXiYSTCtIqBYWH74osacEWV3VeqRubIOGb5_XXTR6U,596 -pendulum/locales/nl/locale.py,sha256=RPQm-GAF-W1xafjWREIqRTgnclq7qP9QBoXtCFvaNlQ,4666 -pendulum/locales/nn/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pendulum/locales/nn/__pycache__/__init__.cpython-311.pyc,, -pendulum/locales/nn/__pycache__/custom.cpython-311.pyc,, -pendulum/locales/nn/__pycache__/locale.cpython-311.pyc,, -pendulum/locales/nn/custom.py,sha256=B2rQwzo6hVOf_YFhWEVx7Lr9k6WDzVKG9FG3XbDxOIE,530 -pendulum/locales/nn/locale.py,sha256=NryH5sNUnpAdCJ01mST4OrGgpr6cLaRKu5Oi2W__aa0,4726 -pendulum/locales/pl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pendulum/locales/pl/__pycache__/__init__.cpython-311.pyc,, -pendulum/locales/pl/__pycache__/custom.cpython-311.pyc,, -pendulum/locales/pl/__pycache__/locale.cpython-311.pyc,, -pendulum/locales/pl/custom.py,sha256=8m_v2Ynv5xMq-EmJrTXdIQkTb3oltLwYhmqFvpOPHVc,537 -pendulum/locales/pl/locale.py,sha256=8Q25uqfExrMEmob3Qx7NuAfW4dDSnj8zRx4ADZVs_2A,8891 -pendulum/locales/pt_br/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pendulum/locales/pt_br/__pycache__/__init__.cpython-311.pyc,, -pendulum/locales/pt_br/__pycache__/custom.cpython-311.pyc,, -pendulum/locales/pt_br/__pycache__/locale.cpython-311.pyc,, -pendulum/locales/pt_br/custom.py,sha256=eWVXefOKashQzV4ypzGRpzWznD3R4RJvp73SFhPC5LA,491 -pendulum/locales/pt_br/locale.py,sha256=GTotVS2NJkKJiq8aoYKFjP-BKY_7HS5jnxON0UKOhQQ,4792 -pendulum/locales/ru/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pendulum/locales/ru/__pycache__/__init__.cpython-311.pyc,, -pendulum/locales/ru/__pycache__/custom.cpython-311.pyc,, -pendulum/locales/ru/__pycache__/locale.cpython-311.pyc,, -pendulum/locales/ru/custom.py,sha256=lbfr7fypGvYUemcGy7A6SEFTdeUZE9Ug9oOkUdWOoU8,526 -pendulum/locales/ru/locale.py,sha256=iRrqMMfWMThae3opA4Mnaz-36TxBnQhnKSLZBsnGp_0,9685 -pendulum/locales/zh/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pendulum/locales/zh/__pycache__/__init__.cpython-311.pyc,, -pendulum/locales/zh/__pycache__/custom.cpython-311.pyc,, -pendulum/locales/zh/__pycache__/locale.cpython-311.pyc,, -pendulum/locales/zh/custom.py,sha256=Vmtm94Bqbn1vVgOq036Rl9DV__5D2uOnxyCD-XCFEo8,470 -pendulum/locales/zh/locale.py,sha256=lD_WDMQyI7dfftcZJv4it7HjhFoEfOTUWVpqdY_GvzM,3751 -pendulum/mixins/__init__.py,sha256=lVL4VPz3c4kWCgjPtL4uuQLNmgwK92q1ffAsv5El02k,25 -pendulum/mixins/__pycache__/__init__.cpython-311.pyc,, -pendulum/mixins/__pycache__/default.cpython-311.pyc,, -pendulum/mixins/default.py,sha256=JcuObnFwaFvmnQKRjw90lJSFYM_wsjAZppt5_rDC0hs,945 -pendulum/parser.py,sha256=-G-VT1vjGVzg1iEhp6_dcmi-SJ3RN6_x7oyatNzt6Bw,3593 -pendulum/parsing/__init__.py,sha256=QqkgrQDXb6S3kKwr5CYj2OV5vn6FlykFlOek4OXZRU8,5591 -pendulum/parsing/__pycache__/__init__.cpython-311.pyc,, -pendulum/parsing/__pycache__/iso8601.cpython-311.pyc,, -pendulum/parsing/_iso8601.c,sha256=mNSd5NwIRb_yBI8l_OuoZQRBkXevLrpsESRnjcKkiWg,38384 -pendulum/parsing/exceptions/__init__.py,sha256=HOFxWKLvXl8WGjVHe_IpmqXRI3zedWdTu_0eMuopioQ,44 -pendulum/parsing/exceptions/__pycache__/__init__.cpython-311.pyc,, -pendulum/parsing/iso8601.py,sha256=Nan53RPxB60BUX_5tABS_qYo7pQIq6-e3HArYhQC_NY,14304 -pendulum/period.py,sha256=XAVl-W4jqVmSPSjlrL9i2ocomVncGfTGeQONjc9RIqE,11175 -pendulum/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pendulum/time.py,sha256=y5TwExt2L0qUzcCw5RYsMdBkpNXgPzRpR27y6cQd7R8,8125 -pendulum/tz/__init__.py,sha256=A-_5bN29l2MBXXJ6moSLOmDerTyCXLCIOqyFFHRxcfs,1369 -pendulum/tz/__pycache__/__init__.cpython-311.pyc,, -pendulum/tz/__pycache__/exceptions.cpython-311.pyc,, -pendulum/tz/__pycache__/local_timezone.cpython-311.pyc,, -pendulum/tz/__pycache__/timezone.cpython-311.pyc,, -pendulum/tz/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pendulum/tz/data/__pycache__/__init__.cpython-311.pyc,, -pendulum/tz/data/__pycache__/windows.cpython-311.pyc,, -pendulum/tz/data/windows.py,sha256=3wfke5bjhvmlqvVFJX4ZuQjBOqVBW5ybeS-yTrj5r58,6687 -pendulum/tz/exceptions.py,sha256=xQlROtKUV2xCbWYP0uNu3xLLA_HN_DT01iSxhibFvTQ,492 -pendulum/tz/local_timezone.py,sha256=D-vPQ3MkNFPZcmMRd7zuA4-8ooi2tkl8ENL8s6K58uw,8095 -pendulum/tz/timezone.py,sha256=UJi1hoFRDrmXU7hv6B8QSy-vfe-ZeeDNMwJHda36UG4,11528 -pendulum/tz/zoneinfo/__init__.py,sha256=tce8_9Rc3ELUXU0KAmUBC5-y4Duciu7wPkCrCgBSiYk,440 -pendulum/tz/zoneinfo/__pycache__/__init__.cpython-311.pyc,, -pendulum/tz/zoneinfo/__pycache__/exceptions.cpython-311.pyc,, -pendulum/tz/zoneinfo/__pycache__/posix_timezone.cpython-311.pyc,, -pendulum/tz/zoneinfo/__pycache__/reader.cpython-311.pyc,, -pendulum/tz/zoneinfo/__pycache__/timezone.cpython-311.pyc,, -pendulum/tz/zoneinfo/__pycache__/transition.cpython-311.pyc,, -pendulum/tz/zoneinfo/__pycache__/transition_type.cpython-311.pyc,, -pendulum/tz/zoneinfo/exceptions.py,sha256=XfTTFMOg5bZCWR8eAgOLPoybO9lh8xfv3443936FW5g,425 -pendulum/tz/zoneinfo/posix_timezone.py,sha256=io9cLnibYatE8YyDuqEOcb2dlGjj8bZGEsXMBZesES8,7277 -pendulum/tz/zoneinfo/reader.py,sha256=wpTGU8ETc-mUAMBiZgTiUB4eDWaF_9HGLoppuBz1tjM,6852 -pendulum/tz/zoneinfo/timezone.py,sha256=rPz_6i032_p0ZmN8j9w_KVqbpZ3mQtQmlkz4vX3SB7s,4248 -pendulum/tz/zoneinfo/transition.py,sha256=kGFAVy-zejKgvZ2AJMEB6vaPO2PuZMyGs992GxEtQ9E,2055 -pendulum/tz/zoneinfo/transition_type.py,sha256=6mFOT4BDVTqLqH6b0bwxlz3BWHgH17SMk9QFEKSoMG8,894 -pendulum/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pendulum/utils/__pycache__/__init__.cpython-311.pyc,, -pendulum/utils/__pycache__/_compat.cpython-311.pyc,, -pendulum/utils/_compat.py,sha256=bEkROlv5IBuz6RcSdgPxweNpjYvluBXvHt1qWGaS5T0,1263 diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum-2.1.2.dist-info/WHEEL b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum-2.1.2.dist-info/WHEEL deleted file mode 100644 index caae6c3d..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum-2.1.2.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: poetry-core 1.6.0 -Root-Is-Purelib: false -Tag: cp311-cp311-manylinux_2_36_x86_64 diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/__init__.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/__init__.py deleted file mode 100644 index a85ed881..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/__init__.py +++ /dev/null @@ -1,315 +0,0 @@ -from __future__ import absolute_import - -import datetime as _datetime - -from typing import Optional -from typing import Union - -from .__version__ import __version__ -from .constants import DAYS_PER_WEEK -from .constants import FRIDAY -from .constants import HOURS_PER_DAY -from .constants import MINUTES_PER_HOUR -from .constants import MONDAY -from .constants import MONTHS_PER_YEAR -from .constants import SATURDAY -from .constants import SECONDS_PER_DAY -from .constants import SECONDS_PER_HOUR -from .constants import SECONDS_PER_MINUTE -from .constants import SUNDAY -from .constants import THURSDAY -from .constants import TUESDAY -from .constants import WEDNESDAY -from .constants import WEEKS_PER_YEAR -from .constants import YEARS_PER_CENTURY -from .constants import YEARS_PER_DECADE -from .date import Date -from .datetime import DateTime -from .duration import Duration -from .formatting import Formatter -from .helpers import format_diff -from .helpers import get_locale -from .helpers import get_test_now -from .helpers import has_test_now -from .helpers import locale -from .helpers import set_locale -from .helpers import set_test_now -from .helpers import test -from .helpers import week_ends_at -from .helpers import week_starts_at -from .parser import parse -from .period import Period -from .time import Time -from .tz import POST_TRANSITION -from .tz import PRE_TRANSITION -from .tz import TRANSITION_ERROR -from .tz import UTC -from .tz import local_timezone -from .tz import set_local_timezone -from .tz import test_local_timezone -from .tz import timezone -from .tz import timezones -from .tz.timezone import Timezone as _Timezone -from .utils._compat import _HAS_FOLD - - -_TEST_NOW = None # type: Optional[DateTime] -_LOCALE = "en" -_WEEK_STARTS_AT = MONDAY -_WEEK_ENDS_AT = SUNDAY - -_formatter = Formatter() - - -def _safe_timezone(obj): - # type: (Optional[Union[str, float, _datetime.tzinfo, _Timezone]]) -> _Timezone - """ - Creates a timezone instance - from a string, Timezone, TimezoneInfo or integer offset. - """ - if isinstance(obj, _Timezone): - return obj - - if obj is None or obj == "local": - return local_timezone() - - if isinstance(obj, (int, float)): - obj = int(obj * 60 * 60) - elif isinstance(obj, _datetime.tzinfo): - # pytz - if hasattr(obj, "localize"): - obj = obj.zone - elif obj.tzname(None) == "UTC": - return UTC - else: - offset = obj.utcoffset(None) - - if offset is None: - offset = _datetime.timedelta(0) - - obj = int(offset.total_seconds()) - - return timezone(obj) - - -# Public API -def datetime( - year, # type: int - month, # type: int - day, # type: int - hour=0, # type: int - minute=0, # type: int - second=0, # type: int - microsecond=0, # type: int - tz=UTC, # type: Optional[Union[str, float, _Timezone]] - dst_rule=POST_TRANSITION, # type: str -): # type: (...) -> DateTime - """ - Creates a new DateTime instance from a specific date and time. - """ - if tz is not None: - tz = _safe_timezone(tz) - - if not _HAS_FOLD: - dt = naive(year, month, day, hour, minute, second, microsecond) - else: - dt = _datetime.datetime(year, month, day, hour, minute, second, microsecond) - if tz is not None: - dt = tz.convert(dt, dst_rule=dst_rule) - - return DateTime( - dt.year, - dt.month, - dt.day, - dt.hour, - dt.minute, - dt.second, - dt.microsecond, - tzinfo=dt.tzinfo, - fold=dt.fold, - ) - - -def local( - year, month, day, hour=0, minute=0, second=0, microsecond=0 -): # type: (int, int, int, int, int, int, int) -> DateTime - """ - Return a DateTime in the local timezone. - """ - return datetime( - year, month, day, hour, minute, second, microsecond, tz=local_timezone() - ) - - -def naive( - year, month, day, hour=0, minute=0, second=0, microsecond=0 -): # type: (int, int, int, int, int, int, int) -> DateTime - """ - Return a naive DateTime. - """ - return DateTime(year, month, day, hour, minute, second, microsecond) - - -def date(year, month, day): # type: (int, int, int) -> Date - """ - Create a new Date instance. - """ - return Date(year, month, day) - - -def time(hour, minute=0, second=0, microsecond=0): # type: (int, int, int, int) -> Time - """ - Create a new Time instance. - """ - return Time(hour, minute, second, microsecond) - - -def instance( - dt, tz=UTC -): # type: (_datetime.datetime, Optional[Union[str, _Timezone]]) -> DateTime - """ - Create a DateTime instance from a datetime one. - """ - if not isinstance(dt, _datetime.datetime): - raise ValueError("instance() only accepts datetime objects.") - - if isinstance(dt, DateTime): - return dt - - tz = dt.tzinfo or tz - - # Checking for pytz/tzinfo - if isinstance(tz, _datetime.tzinfo) and not isinstance(tz, _Timezone): - # pytz - if hasattr(tz, "localize") and tz.zone: - tz = tz.zone - else: - # We have no sure way to figure out - # the timezone name, we fallback - # on a fixed offset - tz = tz.utcoffset(dt).total_seconds() / 3600 - - return datetime( - dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.microsecond, tz=tz - ) - - -def now(tz=None): # type: (Optional[Union[str, _Timezone]]) -> DateTime - """ - Get a DateTime instance for the current date and time. - """ - if has_test_now(): - test_instance = get_test_now() - _tz = _safe_timezone(tz) - - if tz is not None and _tz != test_instance.timezone: - test_instance = test_instance.in_tz(_tz) - - return test_instance - - if tz is None or tz == "local": - dt = _datetime.datetime.now(local_timezone()) - elif tz is UTC or tz == "UTC": - dt = _datetime.datetime.now(UTC) - else: - dt = _datetime.datetime.now(UTC) - tz = _safe_timezone(tz) - dt = tz.convert(dt) - - return DateTime( - dt.year, - dt.month, - dt.day, - dt.hour, - dt.minute, - dt.second, - dt.microsecond, - tzinfo=dt.tzinfo, - fold=dt.fold if _HAS_FOLD else 0, - ) - - -def today(tz="local"): # type: (Union[str, _Timezone]) -> DateTime - """ - Create a DateTime instance for today. - """ - return now(tz).start_of("day") - - -def tomorrow(tz="local"): # type: (Union[str, _Timezone]) -> DateTime - """ - Create a DateTime instance for today. - """ - return today(tz).add(days=1) - - -def yesterday(tz="local"): # type: (Union[str, _Timezone]) -> DateTime - """ - Create a DateTime instance for today. - """ - return today(tz).subtract(days=1) - - -def from_format( - string, fmt, tz=UTC, locale=None, # noqa -): # type: (str, str, Union[str, _Timezone], Optional[str]) -> DateTime - """ - Creates a DateTime instance from a specific format. - """ - parts = _formatter.parse(string, fmt, now(), locale=locale) - if parts["tz"] is None: - parts["tz"] = tz - - return datetime(**parts) - - -def from_timestamp( - timestamp, tz=UTC -): # type: (Union[int, float], Union[str, _Timezone]) -> DateTime - """ - Create a DateTime instance from a timestamp. - """ - dt = _datetime.datetime.utcfromtimestamp(timestamp) - - dt = datetime( - dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.microsecond - ) - - if tz is not UTC or tz != "UTC": - dt = dt.in_timezone(tz) - - return dt - - -def duration( - days=0, # type: float - seconds=0, # type: float - microseconds=0, # type: float - milliseconds=0, # type: float - minutes=0, # type: float - hours=0, # type: float - weeks=0, # type: float - years=0, # type: float - months=0, # type: float -): # type: (...) -> Duration - """ - Create a Duration instance. - """ - return Duration( - days=days, - seconds=seconds, - microseconds=microseconds, - milliseconds=milliseconds, - minutes=minutes, - hours=hours, - weeks=weeks, - years=years, - months=months, - ) - - -def period(start, end, absolute=False): # type: (DateTime, DateTime, bool) -> Period - """ - Create a Period instance. - """ - return Period(start, end, absolute=absolute) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/__pycache__/__init__.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index ea1694ec..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/__pycache__/__version__.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/__pycache__/__version__.cpython-311.pyc deleted file mode 100644 index 39d087f1..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/__pycache__/__version__.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/__pycache__/constants.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/__pycache__/constants.cpython-311.pyc deleted file mode 100644 index 76e66ce2..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/__pycache__/constants.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/__pycache__/date.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/__pycache__/date.cpython-311.pyc deleted file mode 100644 index c1fc6ae4..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/__pycache__/date.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/__pycache__/datetime.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/__pycache__/datetime.cpython-311.pyc deleted file mode 100644 index f6722814..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/__pycache__/datetime.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/__pycache__/duration.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/__pycache__/duration.cpython-311.pyc deleted file mode 100644 index c7ef3b51..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/__pycache__/duration.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/__pycache__/exceptions.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/__pycache__/exceptions.cpython-311.pyc deleted file mode 100644 index f8e40571..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/__pycache__/exceptions.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/__pycache__/helpers.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/__pycache__/helpers.cpython-311.pyc deleted file mode 100644 index deb0e4a9..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/__pycache__/helpers.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/__pycache__/parser.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/__pycache__/parser.cpython-311.pyc deleted file mode 100644 index a61811d1..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/__pycache__/parser.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/__pycache__/period.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/__pycache__/period.cpython-311.pyc deleted file mode 100644 index 3001c235..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/__pycache__/period.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/__pycache__/time.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/__pycache__/time.cpython-311.pyc deleted file mode 100644 index 5f6f5b79..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/__pycache__/time.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/__version__.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/__version__.py deleted file mode 100644 index 62b3483f..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/__version__.py +++ /dev/null @@ -1 +0,0 @@ -__version__ = "2.1.2" diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/_extensions/__init__.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/_extensions/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/_extensions/__pycache__/__init__.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/_extensions/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 960ac5fa..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/_extensions/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/_extensions/__pycache__/helpers.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/_extensions/__pycache__/helpers.cpython-311.pyc deleted file mode 100644 index 49c51428..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/_extensions/__pycache__/helpers.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/_extensions/_helpers.c b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/_extensions/_helpers.c deleted file mode 100644 index aa92ae55..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/_extensions/_helpers.c +++ /dev/null @@ -1,930 +0,0 @@ -/* ------------------------------------------------------------------------- */ - -#include <Python.h> -#include <datetime.h> -#include <structmember.h> -#include <math.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> - -/* ------------------------------------------------------------------------- */ - -#define EPOCH_YEAR 1970 - -#define DAYS_PER_N_YEAR 365 -#define DAYS_PER_L_YEAR 366 - -#define USECS_PER_SEC 1000000 - -#define SECS_PER_MIN 60 -#define SECS_PER_HOUR (60 * SECS_PER_MIN) -#define SECS_PER_DAY (SECS_PER_HOUR * 24) - -// 400-year chunks always have 146097 days (20871 weeks). -#define DAYS_PER_400_YEARS 146097L -#define SECS_PER_400_YEARS ((int64_t)DAYS_PER_400_YEARS * (int64_t)SECS_PER_DAY) - -// The number of seconds in an aligned 100-year chunk, for those that -// do not begin with a leap year and those that do respectively. -const int64_t SECS_PER_100_YEARS[2] = { - (uint64_t)(76L * DAYS_PER_N_YEAR + 24L * DAYS_PER_L_YEAR) * SECS_PER_DAY, - (uint64_t)(75L * DAYS_PER_N_YEAR + 25L * DAYS_PER_L_YEAR) * SECS_PER_DAY}; - -// The number of seconds in an aligned 4-year chunk, for those that -// do not begin with a leap year and those that do respectively. -const int32_t SECS_PER_4_YEARS[2] = { - (4 * DAYS_PER_N_YEAR + 0 * DAYS_PER_L_YEAR) * SECS_PER_DAY, - (3 * DAYS_PER_N_YEAR + 1 * DAYS_PER_L_YEAR) * SECS_PER_DAY}; - -// The number of seconds in non-leap and leap years respectively. -const int32_t SECS_PER_YEAR[2] = { - DAYS_PER_N_YEAR * SECS_PER_DAY, - DAYS_PER_L_YEAR *SECS_PER_DAY}; - -#define MONTHS_PER_YEAR 12 - -// The month lengths in non-leap and leap years respectively. -const int32_t DAYS_PER_MONTHS[2][13] = { - {-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, - {-1, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}}; - -// The day offsets of the beginning of each (1-based) month in non-leap -// and leap years respectively. -// For example, in a leap year there are 335 days before December. -const int32_t MONTHS_OFFSETS[2][14] = { - {-1, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365}, - {-1, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366}}; - -const int DAY_OF_WEEK_TABLE[12] = { - 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4}; - -#define TM_SUNDAY 0 -#define TM_MONDAY 1 -#define TM_TUESDAY 2 -#define TM_WEDNESDAY 3 -#define TM_THURSDAY 4 -#define TM_FRIDAY 5 -#define TM_SATURDAY 6 - -#define TM_JANUARY 0 -#define TM_FEBRUARY 1 -#define TM_MARCH 2 -#define TM_APRIL 3 -#define TM_MAY 4 -#define TM_JUNE 5 -#define TM_JULY 6 -#define TM_AUGUST 7 -#define TM_SEPTEMBER 8 -#define TM_OCTOBER 9 -#define TM_NOVEMBER 10 -#define TM_DECEMBER 11 - -/* ------------------------------------------------------------------------- */ - -int _p(int y) -{ - return y + y / 4 - y / 100 + y / 400; -} - -int _is_leap(int year) -{ - return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0); -} - -int _is_long_year(int year) -{ - return (_p(year) % 7 == 4) || (_p(year - 1) % 7 == 3); -} - -int _week_day(int year, int month, int day) -{ - int y; - int w; - - y = year - (month < 3); - - w = (_p(y) + DAY_OF_WEEK_TABLE[month - 1] + day) % 7; - - if (!w) - { - w = 7; - } - - return w; -} - -int _days_in_year(int year) -{ - if (_is_leap(year)) - { - return DAYS_PER_L_YEAR; - } - - return DAYS_PER_N_YEAR; -} - -int _day_number(int year, int month, int day) -{ - month = (month + 9) % 12; - year = year - month / 10; - - return ( - 365 * year + year / 4 - year / 100 + year / 400 + (month * 306 + 5) / 10 + (day - 1)); -} - -int _get_offset(PyObject *dt) -{ - PyObject *tzinfo; - PyObject *offset; - - tzinfo = ((PyDateTime_DateTime *)(dt))->tzinfo; - - if (tzinfo != Py_None) - { - offset = PyObject_CallMethod(tzinfo, "utcoffset", "O", dt); - - return PyDateTime_DELTA_GET_DAYS(offset) * SECS_PER_DAY + PyDateTime_DELTA_GET_SECONDS(offset); - } - - return 0; -} - -int _has_tzinfo(PyObject *dt) -{ - return ((_PyDateTime_BaseTZInfo *)(dt))->hastzinfo; -} - -char *_get_tz_name(PyObject *dt) -{ - PyObject *tzinfo; - char *tz = ""; - - tzinfo = ((PyDateTime_DateTime *)(dt))->tzinfo; - - if (tzinfo != Py_None) - { - if (PyObject_HasAttrString(tzinfo, "name")) - { - // Pendulum timezone - tz = (char *)PyUnicode_AsUTF8( - PyObject_GetAttrString(tzinfo, "name")); - } - else if (PyObject_HasAttrString(tzinfo, "zone")) - { - // pytz timezone - tz = (char *)PyUnicode_AsUTF8( - PyObject_GetAttrString(tzinfo, "zone")); - } - } - - return tz; -} - -/* ------------------------ Custom Types ------------------------------- */ - -/* - * class Diff(): - */ -typedef struct -{ - PyObject_HEAD int years; - int months; - int days; - int hours; - int minutes; - int seconds; - int microseconds; - int total_days; -} Diff; - -/* - * def __init__(self, years, months, days, hours, minutes, seconds, microseconds, total_days): - * self.years = years - * # ... -*/ -static int Diff_init(Diff *self, PyObject *args, PyObject *kwargs) -{ - int years; - int months; - int days; - int hours; - int minutes; - int seconds; - int microseconds; - int total_days; - - if (!PyArg_ParseTuple(args, "iiiiiii", &years, &months, &days, &hours, &minutes, &seconds, µseconds, &total_days)) - return -1; - - self->years = years; - self->months = months; - self->days = days; - self->hours = hours; - self->minutes = minutes; - self->seconds = seconds; - self->microseconds = microseconds; - self->total_days = total_days; - - return 0; -} - -/* - * def __repr__(self): - * return '{} years {} months {} days {} hours {} minutes {} seconds {} microseconds'.format( - * self.years, self.months, self.days, self.minutes, self.hours, self.seconds, self.microseconds - * ) - */ -static PyObject *Diff_repr(Diff *self) -{ - char repr[82] = {0}; - - sprintf( - repr, - "%d years %d months %d days %d hours %d minutes %d seconds %d microseconds", - self->years, - self->months, - self->days, - self->hours, - self->minutes, - self->seconds, - self->microseconds); - - return PyUnicode_FromString(repr); -} - -/* - * Instantiate new Diff_type object - * Skip overhead of calling PyObject_New and PyObject_Init. - * Directly allocate object. - */ -static PyObject *new_diff_ex(int years, int months, int days, int hours, int minutes, int seconds, int microseconds, int total_days, PyTypeObject *type) -{ - Diff *self = (Diff *)(type->tp_alloc(type, 0)); - - if (self != NULL) - { - self->years = years; - self->months = months; - self->days = days; - self->hours = hours; - self->minutes = minutes; - self->seconds = seconds; - self->microseconds = microseconds; - self->total_days = total_days; - } - - return (PyObject *)self; -} - -/* - * Class member / class attributes - */ -static PyMemberDef Diff_members[] = { - {"years", T_INT, offsetof(Diff, years), 0, "years in diff"}, - {"months", T_INT, offsetof(Diff, months), 0, "months in diff"}, - {"days", T_INT, offsetof(Diff, days), 0, "days in diff"}, - {"hours", T_INT, offsetof(Diff, hours), 0, "hours in diff"}, - {"minutes", T_INT, offsetof(Diff, minutes), 0, "minutes in diff"}, - {"seconds", T_INT, offsetof(Diff, seconds), 0, "seconds in diff"}, - {"microseconds", T_INT, offsetof(Diff, microseconds), 0, "microseconds in diff"}, - {"total_days", T_INT, offsetof(Diff, total_days), 0, "total days in diff"}, - {NULL}}; - -static PyTypeObject Diff_type = { - PyVarObject_HEAD_INIT(NULL, 0) "PreciseDiff", /* tp_name */ - sizeof(Diff), /* tp_basicsize */ - 0, /* tp_itemsize */ - 0, /* tp_dealloc */ - 0, /* tp_print */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - (reprfunc)Diff_repr, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - (reprfunc)Diff_repr, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - "Precise difference between two datetime objects", /* tp_doc */ -}; - -#define new_diff(years, months, days, hours, minutes, seconds, microseconds, total_days) new_diff_ex(years, months, days, hours, minutes, seconds, microseconds, total_days, &Diff_type) - -/* -------------------------- Functions --------------------------*/ - -PyObject *is_leap(PyObject *self, PyObject *args) -{ - PyObject *leap; - int year; - - if (!PyArg_ParseTuple(args, "i", &year)) - { - PyErr_SetString( - PyExc_ValueError, "Invalid parameters"); - return NULL; - } - - leap = PyBool_FromLong(_is_leap(year)); - - return leap; -} - -PyObject *is_long_year(PyObject *self, PyObject *args) -{ - PyObject *is_long; - int year; - - if (!PyArg_ParseTuple(args, "i", &year)) - { - PyErr_SetString( - PyExc_ValueError, "Invalid parameters"); - return NULL; - } - - is_long = PyBool_FromLong(_is_long_year(year)); - - return is_long; -} - -PyObject *week_day(PyObject *self, PyObject *args) -{ - PyObject *wd; - int year; - int month; - int day; - - if (!PyArg_ParseTuple(args, "iii", &year, &month, &day)) - { - PyErr_SetString( - PyExc_ValueError, "Invalid parameters"); - return NULL; - } - - wd = PyLong_FromLong(_week_day(year, month, day)); - - return wd; -} - -PyObject *days_in_year(PyObject *self, PyObject *args) -{ - PyObject *ndays; - int year; - - if (!PyArg_ParseTuple(args, "i", &year)) - { - PyErr_SetString( - PyExc_ValueError, "Invalid parameters"); - return NULL; - } - - ndays = PyLong_FromLong(_days_in_year(year)); - - return ndays; -} - -PyObject *timestamp(PyObject *self, PyObject *args) -{ - int64_t result; - PyObject *dt; - - if (!PyArg_ParseTuple(args, "O", &dt)) - { - PyErr_SetString( - PyExc_ValueError, "Invalid parameters"); - return NULL; - } - - int year = (double)PyDateTime_GET_YEAR(dt); - int month = PyDateTime_GET_MONTH(dt); - int day = PyDateTime_GET_DAY(dt); - int hour = PyDateTime_DATE_GET_HOUR(dt); - int minute = PyDateTime_DATE_GET_MINUTE(dt); - int second = PyDateTime_DATE_GET_SECOND(dt); - - result = (year - 1970) * 365 + MONTHS_OFFSETS[0][month]; - result += (int)floor((double)(year - 1968) / 4); - result -= (year - 1900) / 100; - result += (year - 1600) / 400; - - if (_is_leap(year) && month < 3) - { - result -= 1; - } - - result += day - 1; - result *= 24; - result += hour; - result *= 60; - result += minute; - result *= 60; - result += second; - - return PyLong_FromSsize_t(result); -} - -PyObject *local_time(PyObject *self, PyObject *args) -{ - double unix_time; - int32_t utc_offset; - int32_t year; - int32_t microsecond; - int64_t seconds; - int32_t leap_year; - int64_t sec_per_100years; - int64_t sec_per_4years; - int32_t sec_per_year; - int32_t month; - int32_t day; - int32_t month_offset; - int32_t hour; - int32_t minute; - int32_t second; - - if (!PyArg_ParseTuple(args, "dii", &unix_time, &utc_offset, µsecond)) - { - PyErr_SetString( - PyExc_ValueError, "Invalid parameters"); - return NULL; - } - - year = EPOCH_YEAR; - seconds = (int64_t)floor(unix_time); - - // Shift to a base year that is 400-year aligned. - if (seconds >= 0) - { - seconds -= 10957L * SECS_PER_DAY; - year += 30; // == 2000; - } - else - { - seconds += (int64_t)(146097L - 10957L) * SECS_PER_DAY; - year -= 370; // == 1600; - } - - seconds += utc_offset; - - // Handle years in chunks of 400/100/4/1 - year += 400 * (seconds / SECS_PER_400_YEARS); - seconds %= SECS_PER_400_YEARS; - if (seconds < 0) - { - seconds += SECS_PER_400_YEARS; - year -= 400; - } - - leap_year = 1; // 4-century aligned - - sec_per_100years = SECS_PER_100_YEARS[leap_year]; - - while (seconds >= sec_per_100years) - { - seconds -= sec_per_100years; - year += 100; - leap_year = 0; // 1-century, non 4-century aligned - sec_per_100years = SECS_PER_100_YEARS[leap_year]; - } - - sec_per_4years = SECS_PER_4_YEARS[leap_year]; - while (seconds >= sec_per_4years) - { - seconds -= sec_per_4years; - year += 4; - leap_year = 1; // 4-year, non century aligned - sec_per_4years = SECS_PER_4_YEARS[leap_year]; - } - - sec_per_year = SECS_PER_YEAR[leap_year]; - while (seconds >= sec_per_year) - { - seconds -= sec_per_year; - year += 1; - leap_year = 0; // non 4-year aligned - sec_per_year = SECS_PER_YEAR[leap_year]; - } - - // Handle months and days - month = TM_DECEMBER + 1; - day = seconds / SECS_PER_DAY + 1; - seconds %= SECS_PER_DAY; - while (month != TM_JANUARY + 1) - { - month_offset = MONTHS_OFFSETS[leap_year][month]; - if (day > month_offset) - { - day -= month_offset; - break; - } - - month -= 1; - } - - // Handle hours, minutes and seconds - hour = seconds / SECS_PER_HOUR; - seconds %= SECS_PER_HOUR; - minute = seconds / SECS_PER_MIN; - second = seconds % SECS_PER_MIN; - - return Py_BuildValue("NNNNNNN", - PyLong_FromLong(year), - PyLong_FromLong(month), - PyLong_FromLong(day), - PyLong_FromLong(hour), - PyLong_FromLong(minute), - PyLong_FromLong(second), - PyLong_FromLong(microsecond)); -} - -// Calculate a precise difference between two datetimes. -PyObject *precise_diff(PyObject *self, PyObject *args) -{ - PyObject *dt1; - PyObject *dt2; - - if (!PyArg_ParseTuple(args, "OO", &dt1, &dt2)) - { - PyErr_SetString( - PyExc_ValueError, "Invalid parameters"); - return NULL; - } - - int year_diff = 0; - int month_diff = 0; - int day_diff = 0; - int hour_diff = 0; - int minute_diff = 0; - int second_diff = 0; - int microsecond_diff = 0; - int sign = 1; - int year; - int month; - int leap; - int days_in_last_month; - int days_in_month; - int dt1_year = PyDateTime_GET_YEAR(dt1); - int dt2_year = PyDateTime_GET_YEAR(dt2); - int dt1_month = PyDateTime_GET_MONTH(dt1); - int dt2_month = PyDateTime_GET_MONTH(dt2); - int dt1_day = PyDateTime_GET_DAY(dt1); - int dt2_day = PyDateTime_GET_DAY(dt2); - int dt1_hour = 0; - int dt2_hour = 0; - int dt1_minute = 0; - int dt2_minute = 0; - int dt1_second = 0; - int dt2_second = 0; - int dt1_microsecond = 0; - int dt2_microsecond = 0; - int dt1_total_seconds = 0; - int dt2_total_seconds = 0; - int dt1_offset = 0; - int dt2_offset = 0; - int dt1_is_datetime = PyDateTime_Check(dt1); - int dt2_is_datetime = PyDateTime_Check(dt2); - char *tz1 = ""; - char *tz2 = ""; - int in_same_tz = 0; - int total_days = (_day_number(dt2_year, dt2_month, dt2_day) - _day_number(dt1_year, dt1_month, dt1_day)); - - // If both dates are datetimes, we check - // If we are in the same timezone - if (dt1_is_datetime && dt2_is_datetime) - { - if (_has_tzinfo(dt1)) - { - tz1 = _get_tz_name(dt1); - dt1_offset = _get_offset(dt1); - } - - if (_has_tzinfo(dt2)) - { - tz2 = _get_tz_name(dt2); - dt2_offset = _get_offset(dt2); - } - - in_same_tz = tz1 == tz2 && strncmp(tz1, "", 1); - } - - // If we have datetimes (and not only dates) - // we get the information we need - if (dt1_is_datetime) - { - dt1_hour = PyDateTime_DATE_GET_HOUR(dt1); - dt1_minute = PyDateTime_DATE_GET_MINUTE(dt1); - dt1_second = PyDateTime_DATE_GET_SECOND(dt1); - dt1_microsecond = PyDateTime_DATE_GET_MICROSECOND(dt1); - - if ((!in_same_tz && dt1_offset != 0) || total_days == 0) - { - dt1_hour -= dt1_offset / SECS_PER_HOUR; - dt1_offset %= SECS_PER_HOUR; - dt1_minute -= dt1_offset / SECS_PER_MIN; - dt1_offset %= SECS_PER_MIN; - dt1_second -= dt1_offset; - - if (dt1_second < 0) - { - dt1_second += 60; - dt1_minute -= 1; - } - else if (dt1_second > 60) - { - dt1_second -= 60; - dt1_minute += 1; - } - - if (dt1_minute < 0) - { - dt1_minute += 60; - dt1_hour -= 1; - } - else if (dt1_minute > 60) - { - dt1_minute -= 60; - dt1_hour += 1; - } - - if (dt1_hour < 0) - { - dt1_hour += 24; - dt1_day -= 1; - } - else if (dt1_hour > 24) - { - dt1_hour -= 24; - dt1_day += 1; - } - } - - dt1_total_seconds = (dt1_hour * SECS_PER_HOUR + dt1_minute * SECS_PER_MIN + dt1_second); - } - - if (dt2_is_datetime) - { - dt2_hour = PyDateTime_DATE_GET_HOUR(dt2); - dt2_minute = PyDateTime_DATE_GET_MINUTE(dt2); - dt2_second = PyDateTime_DATE_GET_SECOND(dt2); - dt2_microsecond = PyDateTime_DATE_GET_MICROSECOND(dt2); - - if ((!in_same_tz && dt2_offset != 0) || total_days == 0) - { - dt2_hour -= dt2_offset / SECS_PER_HOUR; - dt2_offset %= SECS_PER_HOUR; - dt2_minute -= dt2_offset / SECS_PER_MIN; - dt2_offset %= SECS_PER_MIN; - dt2_second -= dt2_offset; - - if (dt2_second < 0) - { - dt2_second += 60; - dt2_minute -= 1; - } - else if (dt2_second > 60) - { - dt2_second -= 60; - dt2_minute += 1; - } - - if (dt2_minute < 0) - { - dt2_minute += 60; - dt2_hour -= 1; - } - else if (dt2_minute > 60) - { - dt2_minute -= 60; - dt2_hour += 1; - } - - if (dt2_hour < 0) - { - dt2_hour += 24; - dt2_day -= 1; - } - else if (dt2_hour > 24) - { - dt2_hour -= 24; - dt2_day += 1; - } - } - - dt2_total_seconds = (dt2_hour * SECS_PER_HOUR + dt2_minute * SECS_PER_MIN + dt2_second); - } - - // Direct comparison between two datetimes does not work - // so we need to check by properties - int dt1_gt_dt2 = (dt1_year > dt2_year || (dt1_year == dt2_year && dt1_month > dt2_month) || (dt1_year == dt2_year && dt1_month == dt2_month && dt1_day > dt2_day) || (dt1_year == dt2_year && dt1_month == dt2_month && dt1_day == dt2_day && dt1_total_seconds > dt2_total_seconds) || (dt1_year == dt2_year && dt1_month == dt2_month && dt1_day == dt2_day && dt1_total_seconds == dt2_total_seconds && dt1_microsecond > dt2_microsecond)); - - if (dt1_gt_dt2) - { - PyObject *temp; - temp = dt1; - dt1 = dt2; - dt2 = temp; - sign = -1; - - // Retrieving properties - dt1_year = PyDateTime_GET_YEAR(dt1); - dt2_year = PyDateTime_GET_YEAR(dt2); - dt1_month = PyDateTime_GET_MONTH(dt1); - dt2_month = PyDateTime_GET_MONTH(dt2); - dt1_day = PyDateTime_GET_DAY(dt1); - dt2_day = PyDateTime_GET_DAY(dt2); - - if (dt2_is_datetime) - { - dt1_hour = PyDateTime_DATE_GET_HOUR(dt1); - dt1_minute = PyDateTime_DATE_GET_MINUTE(dt1); - dt1_second = PyDateTime_DATE_GET_SECOND(dt1); - dt1_microsecond = PyDateTime_DATE_GET_MICROSECOND(dt1); - } - - if (dt1_is_datetime) - { - dt2_hour = PyDateTime_DATE_GET_HOUR(dt2); - dt2_minute = PyDateTime_DATE_GET_MINUTE(dt2); - dt2_second = PyDateTime_DATE_GET_SECOND(dt2); - dt2_microsecond = PyDateTime_DATE_GET_MICROSECOND(dt2); - } - - total_days = (_day_number(dt2_year, dt2_month, dt2_day) - _day_number(dt1_year, dt1_month, dt1_day)); - } - - year_diff = dt2_year - dt1_year; - month_diff = dt2_month - dt1_month; - day_diff = dt2_day - dt1_day; - hour_diff = dt2_hour - dt1_hour; - minute_diff = dt2_minute - dt1_minute; - second_diff = dt2_second - dt1_second; - microsecond_diff = dt2_microsecond - dt1_microsecond; - - if (microsecond_diff < 0) - { - microsecond_diff += 1e6; - second_diff -= 1; - } - - if (second_diff < 0) - { - second_diff += 60; - minute_diff -= 1; - } - - if (minute_diff < 0) - { - minute_diff += 60; - hour_diff -= 1; - } - - if (hour_diff < 0) - { - hour_diff += 24; - day_diff -= 1; - } - - if (day_diff < 0) - { - // If we have a difference in days, - // we have to check if they represent months - year = dt2_year; - month = dt2_month; - - if (month == 1) - { - month = 12; - year -= 1; - } - else - { - month -= 1; - } - - leap = _is_leap(year); - - days_in_last_month = DAYS_PER_MONTHS[leap][month]; - days_in_month = DAYS_PER_MONTHS[_is_leap(dt2_year)][dt2_month]; - - if (day_diff < days_in_month - days_in_last_month) - { - // We don't have a full month, we calculate days - if (days_in_last_month < dt1_day) - { - day_diff += dt1_day; - } - else - { - day_diff += days_in_last_month; - } - } - else if (day_diff == days_in_month - days_in_last_month) - { - // We have exactly a full month - // We remove the days difference - // and add one to the months difference - day_diff = 0; - month_diff += 1; - } - else - { - // We have a full month - day_diff += days_in_last_month; - } - - month_diff -= 1; - } - - if (month_diff < 0) - { - month_diff += 12; - year_diff -= 1; - } - - return new_diff( - year_diff * sign, - month_diff * sign, - day_diff * sign, - hour_diff * sign, - minute_diff * sign, - second_diff * sign, - microsecond_diff * sign, - total_days * sign); -} - -/* ------------------------------------------------------------------------- */ - -static PyMethodDef helpers_methods[] = { - {"is_leap", - (PyCFunction)is_leap, - METH_VARARGS, - PyDoc_STR("Checks if a year is a leap year.")}, - {"is_long_year", - (PyCFunction)is_long_year, - METH_VARARGS, - PyDoc_STR("Checks if a year is a long year.")}, - {"week_day", - (PyCFunction)week_day, - METH_VARARGS, - PyDoc_STR("Returns the weekday number.")}, - {"days_in_year", - (PyCFunction)days_in_year, - METH_VARARGS, - PyDoc_STR("Returns the number of days in the given year.")}, - {"timestamp", - (PyCFunction)timestamp, - METH_VARARGS, - PyDoc_STR("Returns the timestamp of the given datetime.")}, - {"local_time", - (PyCFunction)local_time, - METH_VARARGS, - PyDoc_STR("Returns a UNIX time as a broken down time for a particular transition type.")}, - {"precise_diff", - (PyCFunction)precise_diff, - METH_VARARGS, - PyDoc_STR("Calculate a precise difference between two datetimes.")}, - {NULL}}; - -/* ------------------------------------------------------------------------- */ - -static struct PyModuleDef moduledef = { - PyModuleDef_HEAD_INIT, - "_helpers", - NULL, - -1, - helpers_methods, - NULL, - NULL, - NULL, - NULL, -}; - -PyMODINIT_FUNC -PyInit__helpers(void) -{ - PyObject *module; - - PyDateTime_IMPORT; - - module = PyModule_Create(&moduledef); - - if (module == NULL) - return NULL; - - // Diff declaration - Diff_type.tp_new = PyType_GenericNew; - Diff_type.tp_members = Diff_members; - Diff_type.tp_init = (initproc)Diff_init; - - if (PyType_Ready(&Diff_type) < 0) - return NULL; - - PyModule_AddObject(module, "PreciseDiff", (PyObject *)&Diff_type); - - return module; -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/_extensions/helpers.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/_extensions/helpers.py deleted file mode 100644 index 16d078cf..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/_extensions/helpers.py +++ /dev/null @@ -1,358 +0,0 @@ -import datetime -import math -import typing - -from collections import namedtuple - -from ..constants import DAY_OF_WEEK_TABLE -from ..constants import DAYS_PER_L_YEAR -from ..constants import DAYS_PER_MONTHS -from ..constants import DAYS_PER_N_YEAR -from ..constants import EPOCH_YEAR -from ..constants import MONTHS_OFFSETS -from ..constants import SECS_PER_4_YEARS -from ..constants import SECS_PER_100_YEARS -from ..constants import SECS_PER_400_YEARS -from ..constants import SECS_PER_DAY -from ..constants import SECS_PER_HOUR -from ..constants import SECS_PER_MIN -from ..constants import SECS_PER_YEAR -from ..constants import TM_DECEMBER -from ..constants import TM_JANUARY - - -class PreciseDiff( - namedtuple( - "PreciseDiff", - "years months days " "hours minutes seconds microseconds " "total_days", - ) -): - def __repr__(self): - return ( - "{years} years " - "{months} months " - "{days} days " - "{hours} hours " - "{minutes} minutes " - "{seconds} seconds " - "{microseconds} microseconds" - ).format( - years=self.years, - months=self.months, - days=self.days, - hours=self.hours, - minutes=self.minutes, - seconds=self.seconds, - microseconds=self.microseconds, - ) - - -def is_leap(year): # type: (int) -> bool - return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0) - - -def is_long_year(year): # type: (int) -> bool - def p(y): - return y + y // 4 - y // 100 + y // 400 - - return p(year) % 7 == 4 or p(year - 1) % 7 == 3 - - -def week_day(year, month, day): # type: (int, int, int) -> int - if month < 3: - year -= 1 - - w = ( - year - + year // 4 - - year // 100 - + year // 400 - + DAY_OF_WEEK_TABLE[month - 1] - + day - ) % 7 - - if not w: - w = 7 - - return w - - -def days_in_year(year): # type: (int) -> int - if is_leap(year): - return DAYS_PER_L_YEAR - - return DAYS_PER_N_YEAR - - -def timestamp(dt): # type: (datetime.datetime) -> int - year = dt.year - - result = (year - 1970) * 365 + MONTHS_OFFSETS[0][dt.month] - result += (year - 1968) // 4 - result -= (year - 1900) // 100 - result += (year - 1600) // 400 - - if is_leap(year) and dt.month < 3: - result -= 1 - - result += dt.day - 1 - result *= 24 - result += dt.hour - result *= 60 - result += dt.minute - result *= 60 - result += dt.second - - return result - - -def local_time( - unix_time, utc_offset, microseconds -): # type: (int, int, int) -> typing.Tuple[int, int, int, int, int, int, int] - """ - Returns a UNIX time as a broken down time - for a particular transition type. - - :type unix_time: int - :type utc_offset: int - :type microseconds: int - - :rtype: tuple - """ - year = EPOCH_YEAR - seconds = int(math.floor(unix_time)) - - # Shift to a base year that is 400-year aligned. - if seconds >= 0: - seconds -= 10957 * SECS_PER_DAY - year += 30 # == 2000 - else: - seconds += (146097 - 10957) * SECS_PER_DAY - year -= 370 # == 1600 - - seconds += utc_offset - - # Handle years in chunks of 400/100/4/1 - year += 400 * (seconds // SECS_PER_400_YEARS) - seconds %= SECS_PER_400_YEARS - if seconds < 0: - seconds += SECS_PER_400_YEARS - year -= 400 - - leap_year = 1 # 4-century aligned - - sec_per_100years = SECS_PER_100_YEARS[leap_year] - while seconds >= sec_per_100years: - seconds -= sec_per_100years - year += 100 - leap_year = 0 # 1-century, non 4-century aligned - sec_per_100years = SECS_PER_100_YEARS[leap_year] - - sec_per_4years = SECS_PER_4_YEARS[leap_year] - while seconds >= sec_per_4years: - seconds -= sec_per_4years - year += 4 - leap_year = 1 # 4-year, non century aligned - sec_per_4years = SECS_PER_4_YEARS[leap_year] - - sec_per_year = SECS_PER_YEAR[leap_year] - while seconds >= sec_per_year: - seconds -= sec_per_year - year += 1 - leap_year = 0 # non 4-year aligned - sec_per_year = SECS_PER_YEAR[leap_year] - - # Handle months and days - month = TM_DECEMBER + 1 - day = seconds // SECS_PER_DAY + 1 - seconds %= SECS_PER_DAY - while month != TM_JANUARY + 1: - month_offset = MONTHS_OFFSETS[leap_year][month] - if day > month_offset: - day -= month_offset - break - - month -= 1 - - # Handle hours, minutes, seconds and microseconds - hour = seconds // SECS_PER_HOUR - seconds %= SECS_PER_HOUR - minute = seconds // SECS_PER_MIN - second = seconds % SECS_PER_MIN - - return (year, month, day, hour, minute, second, microseconds) - - -def precise_diff( - d1, d2 -): # type: (typing.Union[datetime.datetime, datetime.date], typing.Union[datetime.datetime, datetime.date]) -> PreciseDiff - """ - Calculate a precise difference between two datetimes. - - :param d1: The first datetime - :type d1: datetime.datetime or datetime.date - - :param d2: The second datetime - :type d2: datetime.datetime or datetime.date - - :rtype: PreciseDiff - """ - sign = 1 - - if d1 == d2: - return PreciseDiff(0, 0, 0, 0, 0, 0, 0, 0) - - tzinfo1 = d1.tzinfo if isinstance(d1, datetime.datetime) else None - tzinfo2 = d2.tzinfo if isinstance(d2, datetime.datetime) else None - - if ( - tzinfo1 is None - and tzinfo2 is not None - or tzinfo2 is None - and tzinfo1 is not None - ): - raise ValueError( - "Comparison between naive and aware datetimes is not supported" - ) - - if d1 > d2: - d1, d2 = d2, d1 - sign = -1 - - d_diff = 0 - hour_diff = 0 - min_diff = 0 - sec_diff = 0 - mic_diff = 0 - total_days = _day_number(d2.year, d2.month, d2.day) - _day_number( - d1.year, d1.month, d1.day - ) - in_same_tz = False - tz1 = None - tz2 = None - - # Trying to figure out the timezone names - # If we can't find them, we assume different timezones - if tzinfo1 and tzinfo2: - if hasattr(tzinfo1, "name"): - # Pendulum timezone - tz1 = tzinfo1.name - elif hasattr(tzinfo1, "zone"): - # pytz timezone - tz1 = tzinfo1.zone - - if hasattr(tzinfo2, "name"): - tz2 = tzinfo2.name - elif hasattr(tzinfo2, "zone"): - tz2 = tzinfo2.zone - - in_same_tz = tz1 == tz2 and tz1 is not None - - if isinstance(d2, datetime.datetime): - if isinstance(d1, datetime.datetime): - # If we are not in the same timezone - # we need to adjust - # - # We also need to adjust if we do not - # have variable-length units - if not in_same_tz or total_days == 0: - offset1 = d1.utcoffset() - offset2 = d2.utcoffset() - - if offset1: - d1 = d1 - offset1 - - if offset2: - d2 = d2 - offset2 - - hour_diff = d2.hour - d1.hour - min_diff = d2.minute - d1.minute - sec_diff = d2.second - d1.second - mic_diff = d2.microsecond - d1.microsecond - else: - hour_diff = d2.hour - min_diff = d2.minute - sec_diff = d2.second - mic_diff = d2.microsecond - - if mic_diff < 0: - mic_diff += 1000000 - sec_diff -= 1 - - if sec_diff < 0: - sec_diff += 60 - min_diff -= 1 - - if min_diff < 0: - min_diff += 60 - hour_diff -= 1 - - if hour_diff < 0: - hour_diff += 24 - d_diff -= 1 - - y_diff = d2.year - d1.year - m_diff = d2.month - d1.month - d_diff += d2.day - d1.day - - if d_diff < 0: - year = d2.year - month = d2.month - - if month == 1: - month = 12 - year -= 1 - else: - month -= 1 - - leap = int(is_leap(year)) - - days_in_last_month = DAYS_PER_MONTHS[leap][month] - days_in_month = DAYS_PER_MONTHS[int(is_leap(d2.year))][d2.month] - - if d_diff < days_in_month - days_in_last_month: - # We don't have a full month, we calculate days - if days_in_last_month < d1.day: - d_diff += d1.day - else: - d_diff += days_in_last_month - elif d_diff == days_in_month - days_in_last_month: - # We have exactly a full month - # We remove the days difference - # and add one to the months difference - d_diff = 0 - m_diff += 1 - else: - # We have a full month - d_diff += days_in_last_month - - m_diff -= 1 - - if m_diff < 0: - m_diff += 12 - y_diff -= 1 - - return PreciseDiff( - sign * y_diff, - sign * m_diff, - sign * d_diff, - sign * hour_diff, - sign * min_diff, - sign * sec_diff, - sign * mic_diff, - sign * total_days, - ) - - -def _day_number(year, month, day): # type: (int, int, int) -> int - month = (month + 9) % 12 - year = year - month // 10 - - return ( - 365 * year - + year // 4 - - year // 100 - + year // 400 - + (month * 306 + 5) // 10 - + (day - 1) - ) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/constants.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/constants.py deleted file mode 100644 index 3712df34..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/constants.py +++ /dev/null @@ -1,107 +0,0 @@ -# The day constants -SUNDAY = 0 -MONDAY = 1 -TUESDAY = 2 -WEDNESDAY = 3 -THURSDAY = 4 -FRIDAY = 5 -SATURDAY = 6 - -# Number of X in Y. -YEARS_PER_CENTURY = 100 -YEARS_PER_DECADE = 10 -MONTHS_PER_YEAR = 12 -WEEKS_PER_YEAR = 52 -DAYS_PER_WEEK = 7 -HOURS_PER_DAY = 24 -MINUTES_PER_HOUR = 60 -SECONDS_PER_MINUTE = 60 -SECONDS_PER_HOUR = MINUTES_PER_HOUR * SECONDS_PER_MINUTE -SECONDS_PER_DAY = HOURS_PER_DAY * SECONDS_PER_HOUR -US_PER_SECOND = 1000000 - -# Formats -ATOM = "YYYY-MM-DDTHH:mm:ssZ" -COOKIE = "dddd, DD-MMM-YYYY HH:mm:ss zz" -ISO8601 = "YYYY-MM-DDTHH:mm:ssZ" -ISO8601_EXTENDED = "YYYY-MM-DDTHH:mm:ss.SSSSSSZ" -RFC822 = "ddd, DD MMM YY HH:mm:ss ZZ" -RFC850 = "dddd, DD-MMM-YY HH:mm:ss zz" -RFC1036 = "ddd, DD MMM YY HH:mm:ss ZZ" -RFC1123 = "ddd, DD MMM YYYY HH:mm:ss ZZ" -RFC2822 = "ddd, DD MMM YYYY HH:mm:ss ZZ" -RFC3339 = ISO8601 -RFC3339_EXTENDED = ISO8601_EXTENDED -RSS = "ddd, DD MMM YYYY HH:mm:ss ZZ" -W3C = ISO8601 - - -EPOCH_YEAR = 1970 - -DAYS_PER_N_YEAR = 365 -DAYS_PER_L_YEAR = 366 - -USECS_PER_SEC = 1000000 - -SECS_PER_MIN = 60 -SECS_PER_HOUR = 60 * SECS_PER_MIN -SECS_PER_DAY = SECS_PER_HOUR * 24 - -# 400-year chunks always have 146097 days (20871 weeks). -SECS_PER_400_YEARS = 146097 * SECS_PER_DAY - -# The number of seconds in an aligned 100-year chunk, for those that -# do not begin with a leap year and those that do respectively. -SECS_PER_100_YEARS = ( - (76 * DAYS_PER_N_YEAR + 24 * DAYS_PER_L_YEAR) * SECS_PER_DAY, - (75 * DAYS_PER_N_YEAR + 25 * DAYS_PER_L_YEAR) * SECS_PER_DAY, -) - -# The number of seconds in an aligned 4-year chunk, for those that -# do not begin with a leap year and those that do respectively. -SECS_PER_4_YEARS = ( - (4 * DAYS_PER_N_YEAR + 0 * DAYS_PER_L_YEAR) * SECS_PER_DAY, - (3 * DAYS_PER_N_YEAR + 1 * DAYS_PER_L_YEAR) * SECS_PER_DAY, -) - -# The number of seconds in non-leap and leap years respectively. -SECS_PER_YEAR = (DAYS_PER_N_YEAR * SECS_PER_DAY, DAYS_PER_L_YEAR * SECS_PER_DAY) - -DAYS_PER_YEAR = (DAYS_PER_N_YEAR, DAYS_PER_L_YEAR) - -# The month lengths in non-leap and leap years respectively. -DAYS_PER_MONTHS = ( - (-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31), - (-1, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31), -) - -# The day offsets of the beginning of each (1-based) month in non-leap -# and leap years respectively. -# For example, in a leap year there are 335 days before December. -MONTHS_OFFSETS = ( - (-1, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365), - (-1, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366), -) - -DAY_OF_WEEK_TABLE = (0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4) - -TM_SUNDAY = 0 -TM_MONDAY = 1 -TM_TUESDAY = 2 -TM_WEDNESDAY = 3 -TM_THURSDAY = 4 -TM_FRIDAY = 5 -TM_SATURDAY = 6 - -TM_JANUARY = 0 -TM_FEBRUARY = 1 -TM_MARCH = 2 -TM_APRIL = 3 -TM_MAY = 4 -TM_JUNE = 5 -TM_JULY = 6 -TM_AUGUST = 7 -TM_SEPTEMBER = 8 -TM_OCTOBER = 9 -TM_NOVEMBER = 10 -TM_DECEMBER = 11 diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/date.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/date.py deleted file mode 100644 index 41a9883e..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/date.py +++ /dev/null @@ -1,891 +0,0 @@ -from __future__ import absolute_import -from __future__ import division - -import calendar -import math - -from datetime import date -from datetime import timedelta - -import pendulum - -from .constants import FRIDAY -from .constants import MONDAY -from .constants import MONTHS_PER_YEAR -from .constants import SATURDAY -from .constants import SUNDAY -from .constants import THURSDAY -from .constants import TUESDAY -from .constants import WEDNESDAY -from .constants import YEARS_PER_CENTURY -from .constants import YEARS_PER_DECADE -from .exceptions import PendulumException -from .helpers import add_duration -from .mixins.default import FormattableMixin -from .period import Period - - -class Date(FormattableMixin, date): - - # Names of days of the week - _days = { - SUNDAY: "Sunday", - MONDAY: "Monday", - TUESDAY: "Tuesday", - WEDNESDAY: "Wednesday", - THURSDAY: "Thursday", - FRIDAY: "Friday", - SATURDAY: "Saturday", - } - - _MODIFIERS_VALID_UNITS = ["day", "week", "month", "year", "decade", "century"] - - # Getters/Setters - - def set(self, year=None, month=None, day=None): - return self.replace(year=year, month=month, day=day) - - @property - def day_of_week(self): - """ - Returns the day of the week (0-6). - - :rtype: int - """ - return self.isoweekday() % 7 - - @property - def day_of_year(self): - """ - Returns the day of the year (1-366). - - :rtype: int - """ - k = 1 if self.is_leap_year() else 2 - - return (275 * self.month) // 9 - k * ((self.month + 9) // 12) + self.day - 30 - - @property - def week_of_year(self): - return self.isocalendar()[1] - - @property - def days_in_month(self): - return calendar.monthrange(self.year, self.month)[1] - - @property - def week_of_month(self): - first_day_of_month = self.replace(day=1) - - return self.week_of_year - first_day_of_month.week_of_year + 1 - - @property - def age(self): - return self.diff(abs=False).in_years() - - @property - def quarter(self): - return int(math.ceil(self.month / 3)) - - # String Formatting - - def to_date_string(self): - """ - Format the instance as date. - - :rtype: str - """ - return self.strftime("%Y-%m-%d") - - def to_formatted_date_string(self): - """ - Format the instance as a readable date. - - :rtype: str - """ - return self.strftime("%b %d, %Y") - - def __repr__(self): - return ( - "{klass}(" - "{year}, {month}, {day}" - ")".format( - klass=self.__class__.__name__, - year=self.year, - month=self.month, - day=self.day, - ) - ) - - # COMPARISONS - - def closest(self, dt1, dt2): - """ - Get the closest date from the instance. - - :type dt1: Date or date - :type dt2: Date or date - - :rtype: Date - """ - dt1 = self.__class__(dt1.year, dt1.month, dt1.day) - dt2 = self.__class__(dt2.year, dt2.month, dt2.day) - - if self.diff(dt1).in_seconds() < self.diff(dt2).in_seconds(): - return dt1 - - return dt2 - - def farthest(self, dt1, dt2): - """ - Get the farthest date from the instance. - - :type dt1: Date or date - :type dt2: Date or date - - :rtype: Date - """ - dt1 = self.__class__(dt1.year, dt1.month, dt1.day) - dt2 = self.__class__(dt2.year, dt2.month, dt2.day) - - if self.diff(dt1).in_seconds() > self.diff(dt2).in_seconds(): - return dt1 - - return dt2 - - def is_future(self): - """ - Determines if the instance is in the future, ie. greater than now. - - :rtype: bool - """ - return self > self.today() - - def is_past(self): - """ - Determines if the instance is in the past, ie. less than now. - - :rtype: bool - """ - return self < self.today() - - def is_leap_year(self): - """ - Determines if the instance is a leap year. - - :rtype: bool - """ - return calendar.isleap(self.year) - - def is_long_year(self): - """ - Determines if the instance is a long year - - See link `<https://en.wikipedia.org/wiki/ISO_8601#Week_dates>`_ - - :rtype: bool - """ - return Date(self.year, 12, 28).isocalendar()[1] == 53 - - def is_same_day(self, dt): - """ - Checks if the passed in date is the same day as the instance current day. - - :type dt: Date or date - - :rtype: bool - """ - return self == dt - - def is_anniversary(self, dt=None): - """ - Check if its the anniversary. - - Compares the date/month values of the two dates. - - :rtype: bool - """ - if dt is None: - dt = Date.today() - - instance = self.__class__(dt.year, dt.month, dt.day) - - return (self.month, self.day) == (instance.month, instance.day) - - # the additional method for checking if today is the anniversary day - # the alias is provided to start using a new name and keep the backward compatibility - # the old name can be completely replaced with the new in one of the future versions - is_birthday = is_anniversary - - # ADDITIONS AND SUBSTRACTIONS - - def add(self, years=0, months=0, weeks=0, days=0): - """ - Add duration to the instance. - - :param years: The number of years - :type years: int - - :param months: The number of months - :type months: int - - :param weeks: The number of weeks - :type weeks: int - - :param days: The number of days - :type days: int - - :rtype: Date - """ - dt = add_duration( - date(self.year, self.month, self.day), - years=years, - months=months, - weeks=weeks, - days=days, - ) - - return self.__class__(dt.year, dt.month, dt.day) - - def subtract(self, years=0, months=0, weeks=0, days=0): - """ - Remove duration from the instance. - - :param years: The number of years - :type years: int - - :param months: The number of months - :type months: int - - :param weeks: The number of weeks - :type weeks: int - - :param days: The number of days - :type days: int - - :rtype: Date - """ - return self.add(years=-years, months=-months, weeks=-weeks, days=-days) - - def _add_timedelta(self, delta): - """ - Add timedelta duration to the instance. - - :param delta: The timedelta instance - :type delta: pendulum.Duration or datetime.timedelta - - :rtype: Date - """ - if isinstance(delta, pendulum.Duration): - return self.add( - years=delta.years, - months=delta.months, - weeks=delta.weeks, - days=delta.remaining_days, - ) - - return self.add(days=delta.days) - - def _subtract_timedelta(self, delta): - """ - Remove timedelta duration from the instance. - - :param delta: The timedelta instance - :type delta: pendulum.Duration or datetime.timedelta - - :rtype: Date - """ - if isinstance(delta, pendulum.Duration): - return self.subtract( - years=delta.years, - months=delta.months, - weeks=delta.weeks, - days=delta.remaining_days, - ) - - return self.subtract(days=delta.days) - - def __add__(self, other): - if not isinstance(other, timedelta): - return NotImplemented - - return self._add_timedelta(other) - - def __sub__(self, other): - if isinstance(other, timedelta): - return self._subtract_timedelta(other) - - if not isinstance(other, date): - return NotImplemented - - dt = self.__class__(other.year, other.month, other.day) - - return dt.diff(self, False) - - # DIFFERENCES - - def diff(self, dt=None, abs=True): - """ - Returns the difference between two Date objects as a Period. - - :type dt: Date or None - - :param abs: Whether to return an absolute interval or not - :type abs: bool - - :rtype: Period - """ - if dt is None: - dt = self.today() - - return Period(self, Date(dt.year, dt.month, dt.day), absolute=abs) - - def diff_for_humans(self, other=None, absolute=False, locale=None): - """ - Get the difference in a human readable format in the current locale. - - When comparing a value in the past to default now: - 1 day ago - 5 months ago - - When comparing a value in the future to default now: - 1 day from now - 5 months from now - - When comparing a value in the past to another value: - 1 day before - 5 months before - - When comparing a value in the future to another value: - 1 day after - 5 months after - - :type other: Date - - :param absolute: removes time difference modifiers ago, after, etc - :type absolute: bool - - :param locale: The locale to use for localization - :type locale: str - - :rtype: str - """ - is_now = other is None - - if is_now: - other = self.today() - - diff = self.diff(other) - - return pendulum.format_diff(diff, is_now, absolute, locale) - - # MODIFIERS - - def start_of(self, unit): - """ - Returns a copy of the instance with the time reset - with the following rules: - - * day: time to 00:00:00 - * week: date to first day of the week and time to 00:00:00 - * month: date to first day of the month and time to 00:00:00 - * year: date to first day of the year and time to 00:00:00 - * decade: date to first day of the decade and time to 00:00:00 - * century: date to first day of century and time to 00:00:00 - - :param unit: The unit to reset to - :type unit: str - - :rtype: Date - """ - if unit not in self._MODIFIERS_VALID_UNITS: - raise ValueError('Invalid unit "{}" for start_of()'.format(unit)) - - return getattr(self, "_start_of_{}".format(unit))() - - def end_of(self, unit): - """ - Returns a copy of the instance with the time reset - with the following rules: - - * week: date to last day of the week - * month: date to last day of the month - * year: date to last day of the year - * decade: date to last day of the decade - * century: date to last day of century - - :param unit: The unit to reset to - :type unit: str - - :rtype: Date - """ - if unit not in self._MODIFIERS_VALID_UNITS: - raise ValueError('Invalid unit "%s" for end_of()' % unit) - - return getattr(self, "_end_of_%s" % unit)() - - def _start_of_day(self): - """ - Compatibility method. - - :rtype: Date - """ - return self - - def _end_of_day(self): - """ - Compatibility method - - :rtype: Date - """ - return self - - def _start_of_month(self): - """ - Reset the date to the first day of the month. - - :rtype: Date - """ - return self.set(self.year, self.month, 1) - - def _end_of_month(self): - """ - Reset the date to the last day of the month. - - :rtype: Date - """ - return self.set(self.year, self.month, self.days_in_month) - - def _start_of_year(self): - """ - Reset the date to the first day of the year. - - :rtype: Date - """ - return self.set(self.year, 1, 1) - - def _end_of_year(self): - """ - Reset the date to the last day of the year. - - :rtype: Date - """ - return self.set(self.year, 12, 31) - - def _start_of_decade(self): - """ - Reset the date to the first day of the decade. - - :rtype: Date - """ - year = self.year - self.year % YEARS_PER_DECADE - - return self.set(year, 1, 1) - - def _end_of_decade(self): - """ - Reset the date to the last day of the decade. - - :rtype: Date - """ - year = self.year - self.year % YEARS_PER_DECADE + YEARS_PER_DECADE - 1 - - return self.set(year, 12, 31) - - def _start_of_century(self): - """ - Reset the date to the first day of the century. - - :rtype: Date - """ - year = self.year - 1 - (self.year - 1) % YEARS_PER_CENTURY + 1 - - return self.set(year, 1, 1) - - def _end_of_century(self): - """ - Reset the date to the last day of the century. - - :rtype: Date - """ - year = self.year - 1 - (self.year - 1) % YEARS_PER_CENTURY + YEARS_PER_CENTURY - - return self.set(year, 12, 31) - - def _start_of_week(self): - """ - Reset the date to the first day of the week. - - :rtype: Date - """ - dt = self - - if self.day_of_week != pendulum._WEEK_STARTS_AT: - dt = self.previous(pendulum._WEEK_STARTS_AT) - - return dt.start_of("day") - - def _end_of_week(self): - """ - Reset the date to the last day of the week. - - :rtype: Date - """ - dt = self - - if self.day_of_week != pendulum._WEEK_ENDS_AT: - dt = self.next(pendulum._WEEK_ENDS_AT) - - return dt.end_of("day") - - def next(self, day_of_week=None): - """ - Modify to the next occurrence of a given day of the week. - If no day_of_week is provided, modify to the next occurrence - of the current day of the week. Use the supplied consts - to indicate the desired day_of_week, ex. pendulum.MONDAY. - - :param day_of_week: The next day of week to reset to. - :type day_of_week: int or None - - :rtype: Date - """ - if day_of_week is None: - day_of_week = self.day_of_week - - if day_of_week < SUNDAY or day_of_week > SATURDAY: - raise ValueError("Invalid day of week") - - dt = self.add(days=1) - while dt.day_of_week != day_of_week: - dt = dt.add(days=1) - - return dt - - def previous(self, day_of_week=None): - """ - Modify to the previous occurrence of a given day of the week. - If no day_of_week is provided, modify to the previous occurrence - of the current day of the week. Use the supplied consts - to indicate the desired day_of_week, ex. pendulum.MONDAY. - - :param day_of_week: The previous day of week to reset to. - :type day_of_week: int or None - - :rtype: Date - """ - if day_of_week is None: - day_of_week = self.day_of_week - - if day_of_week < SUNDAY or day_of_week > SATURDAY: - raise ValueError("Invalid day of week") - - dt = self.subtract(days=1) - while dt.day_of_week != day_of_week: - dt = dt.subtract(days=1) - - return dt - - def first_of(self, unit, day_of_week=None): - """ - Returns an instance set to the first occurrence - of a given day of the week in the current unit. - If no day_of_week is provided, modify to the first day of the unit. - Use the supplied consts to indicate the desired day_of_week, ex. pendulum.MONDAY. - - Supported units are month, quarter and year. - - :param unit: The unit to use - :type unit: str - - :type day_of_week: int or None - - :rtype: Date - """ - if unit not in ["month", "quarter", "year"]: - raise ValueError('Invalid unit "{}" for first_of()'.format(unit)) - - return getattr(self, "_first_of_{}".format(unit))(day_of_week) - - def last_of(self, unit, day_of_week=None): - """ - Returns an instance set to the last occurrence - of a given day of the week in the current unit. - If no day_of_week is provided, modify to the last day of the unit. - Use the supplied consts to indicate the desired day_of_week, ex. pendulum.MONDAY. - - Supported units are month, quarter and year. - - :param unit: The unit to use - :type unit: str - - :type day_of_week: int or None - - :rtype: Date - """ - if unit not in ["month", "quarter", "year"]: - raise ValueError('Invalid unit "{}" for first_of()'.format(unit)) - - return getattr(self, "_last_of_{}".format(unit))(day_of_week) - - def nth_of(self, unit, nth, day_of_week): - """ - Returns a new instance set to the given occurrence - of a given day of the week in the current unit. - If the calculated occurrence is outside the scope of the current unit, - then raise an error. Use the supplied consts - to indicate the desired day_of_week, ex. pendulum.MONDAY. - - Supported units are month, quarter and year. - - :param unit: The unit to use - :type unit: str - - :type nth: int - - :type day_of_week: int or None - - :rtype: Date - """ - if unit not in ["month", "quarter", "year"]: - raise ValueError('Invalid unit "{}" for first_of()'.format(unit)) - - dt = getattr(self, "_nth_of_{}".format(unit))(nth, day_of_week) - if dt is False: - raise PendulumException( - "Unable to find occurence {} of {} in {}".format( - nth, self._days[day_of_week], unit - ) - ) - - return dt - - def _first_of_month(self, day_of_week): - """ - Modify to the first occurrence of a given day of the week - in the current month. If no day_of_week is provided, - modify to the first day of the month. Use the supplied consts - to indicate the desired day_of_week, ex. pendulum.MONDAY. - - :type day_of_week: int - - :rtype: Date - """ - dt = self - - if day_of_week is None: - return dt.set(day=1) - - month = calendar.monthcalendar(dt.year, dt.month) - - calendar_day = (day_of_week - 1) % 7 - - if month[0][calendar_day] > 0: - day_of_month = month[0][calendar_day] - else: - day_of_month = month[1][calendar_day] - - return dt.set(day=day_of_month) - - def _last_of_month(self, day_of_week=None): - """ - Modify to the last occurrence of a given day of the week - in the current month. If no day_of_week is provided, - modify to the last day of the month. Use the supplied consts - to indicate the desired day_of_week, ex. pendulum.MONDAY. - - :type day_of_week: int or None - - :rtype: Date - """ - dt = self - - if day_of_week is None: - return dt.set(day=self.days_in_month) - - month = calendar.monthcalendar(dt.year, dt.month) - - calendar_day = (day_of_week - 1) % 7 - - if month[-1][calendar_day] > 0: - day_of_month = month[-1][calendar_day] - else: - day_of_month = month[-2][calendar_day] - - return dt.set(day=day_of_month) - - def _nth_of_month(self, nth, day_of_week): - """ - Modify to the given occurrence of a given day of the week - in the current month. If the calculated occurrence is outside, - the scope of the current month, then return False and no - modifications are made. Use the supplied consts - to indicate the desired day_of_week, ex. pendulum.MONDAY. - - :type nth: int - - :type day_of_week: int or None - - :rtype: Date - """ - if nth == 1: - return self.first_of("month", day_of_week) - - dt = self.first_of("month") - check = dt.format("YYYY-MM") - for i in range(nth - (1 if dt.day_of_week == day_of_week else 0)): - dt = dt.next(day_of_week) - - if dt.format("YYYY-MM") == check: - return self.set(day=dt.day) - - return False - - def _first_of_quarter(self, day_of_week=None): - """ - Modify to the first occurrence of a given day of the week - in the current quarter. If no day_of_week is provided, - modify to the first day of the quarter. Use the supplied consts - to indicate the desired day_of_week, ex. pendulum.MONDAY. - - :type day_of_week: int or None - - :rtype: Date - """ - return self.set(self.year, self.quarter * 3 - 2, 1).first_of( - "month", day_of_week - ) - - def _last_of_quarter(self, day_of_week=None): - """ - Modify to the last occurrence of a given day of the week - in the current quarter. If no day_of_week is provided, - modify to the last day of the quarter. Use the supplied consts - to indicate the desired day_of_week, ex. pendulum.MONDAY. - - :type day_of_week: int or None - - :rtype: Date - """ - return self.set(self.year, self.quarter * 3, 1).last_of("month", day_of_week) - - def _nth_of_quarter(self, nth, day_of_week): - """ - Modify to the given occurrence of a given day of the week - in the current quarter. If the calculated occurrence is outside, - the scope of the current quarter, then return False and no - modifications are made. Use the supplied consts - to indicate the desired day_of_week, ex. pendulum.MONDAY. - - :type nth: int - - :type day_of_week: int or None - - :rtype: Date - """ - if nth == 1: - return self.first_of("quarter", day_of_week) - - dt = self.replace(self.year, self.quarter * 3, 1) - last_month = dt.month - year = dt.year - dt = dt.first_of("quarter") - for i in range(nth - (1 if dt.day_of_week == day_of_week else 0)): - dt = dt.next(day_of_week) - - if last_month < dt.month or year != dt.year: - return False - - return self.set(self.year, dt.month, dt.day) - - def _first_of_year(self, day_of_week=None): - """ - Modify to the first occurrence of a given day of the week - in the current year. If no day_of_week is provided, - modify to the first day of the year. Use the supplied consts - to indicate the desired day_of_week, ex. pendulum.MONDAY. - - :type day_of_week: int or None - - :rtype: Date - """ - return self.set(month=1).first_of("month", day_of_week) - - def _last_of_year(self, day_of_week=None): - """ - Modify to the last occurrence of a given day of the week - in the current year. If no day_of_week is provided, - modify to the last day of the year. Use the supplied consts - to indicate the desired day_of_week, ex. pendulum.MONDAY. - - :type day_of_week: int or None - - :rtype: Date - """ - return self.set(month=MONTHS_PER_YEAR).last_of("month", day_of_week) - - def _nth_of_year(self, nth, day_of_week): - """ - Modify to the given occurrence of a given day of the week - in the current year. If the calculated occurrence is outside, - the scope of the current year, then return False and no - modifications are made. Use the supplied consts - to indicate the desired day_of_week, ex. pendulum.MONDAY. - - :type nth: int - - :type day_of_week: int or None - - :rtype: Date - """ - if nth == 1: - return self.first_of("year", day_of_week) - - dt = self.first_of("year") - year = dt.year - for i in range(nth - (1 if dt.day_of_week == day_of_week else 0)): - dt = dt.next(day_of_week) - - if year != dt.year: - return False - - return self.set(self.year, dt.month, dt.day) - - def average(self, dt=None): - """ - Modify the current instance to the average - of a given instance (default now) and the current instance. - - :type dt: Date or date - - :rtype: Date - """ - if dt is None: - dt = Date.today() - - return self.add(days=int(self.diff(dt, False).in_days() / 2)) - - # Native methods override - - @classmethod - def today(cls): - return pendulum.today().date() - - @classmethod - def fromtimestamp(cls, t): - dt = super(Date, cls).fromtimestamp(t) - - return cls(dt.year, dt.month, dt.day) - - @classmethod - def fromordinal(cls, n): - dt = super(Date, cls).fromordinal(n) - - return cls(dt.year, dt.month, dt.day) - - def replace(self, year=None, month=None, day=None): - year = year if year is not None else self.year - month = month if month is not None else self.month - day = day if day is not None else self.day - - return self.__class__(year, month, day) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/datetime.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/datetime.py deleted file mode 100644 index 6f1d5cf1..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/datetime.py +++ /dev/null @@ -1,1563 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import absolute_import -from __future__ import division - -import calendar -import datetime - -from typing import Optional -from typing import TypeVar -from typing import Union - -import pendulum - -from .constants import ATOM -from .constants import COOKIE -from .constants import MINUTES_PER_HOUR -from .constants import MONTHS_PER_YEAR -from .constants import RFC822 -from .constants import RFC850 -from .constants import RFC1036 -from .constants import RFC1123 -from .constants import RFC2822 -from .constants import RSS -from .constants import SATURDAY -from .constants import SECONDS_PER_DAY -from .constants import SECONDS_PER_MINUTE -from .constants import SUNDAY -from .constants import W3C -from .constants import YEARS_PER_CENTURY -from .constants import YEARS_PER_DECADE -from .date import Date -from .exceptions import PendulumException -from .helpers import add_duration -from .helpers import timestamp -from .period import Period -from .time import Time -from .tz import UTC -from .tz.timezone import Timezone -from .utils._compat import _HAS_FOLD - - -_D = TypeVar("_D", bound="DateTime") - - -class DateTime(datetime.datetime, Date): - - EPOCH = None # type: DateTime - - # Formats - - _FORMATS = { - "atom": ATOM, - "cookie": COOKIE, - "iso8601": lambda dt: dt.isoformat(), - "rfc822": RFC822, - "rfc850": RFC850, - "rfc1036": RFC1036, - "rfc1123": RFC1123, - "rfc2822": RFC2822, - "rfc3339": lambda dt: dt.isoformat(), - "rss": RSS, - "w3c": W3C, - } - - _EPOCH = datetime.datetime(1970, 1, 1, tzinfo=UTC) - - _MODIFIERS_VALID_UNITS = [ - "second", - "minute", - "hour", - "day", - "week", - "month", - "year", - "decade", - "century", - ] - - if not _HAS_FOLD: - - def __new__( - cls, - year, - month, - day, - hour=0, - minute=0, - second=0, - microsecond=0, - tzinfo=None, - fold=0, - ): - self = datetime.datetime.__new__( - cls, year, month, day, hour, minute, second, microsecond, tzinfo=tzinfo - ) - - self._fold = fold - - return self - - @classmethod - def now(cls, tz=None): # type: (Optional[Union[str, Timezone]]) -> DateTime - """ - Get a DateTime instance for the current date and time. - """ - return pendulum.now(tz) - - @classmethod - def utcnow(cls): # type: () -> DateTime - """ - Get a DateTime instance for the current date and time in UTC. - """ - return pendulum.now(UTC) - - @classmethod - def today(cls): # type: () -> DateTime - return pendulum.now() - - @classmethod - def strptime(cls, time, fmt): # type: (str, str) -> DateTime - return pendulum.instance(datetime.datetime.strptime(time, fmt)) - - # Getters/Setters - - def set( - self, - year=None, - month=None, - day=None, - hour=None, - minute=None, - second=None, - microsecond=None, - tz=None, - ): - if year is None: - year = self.year - if month is None: - month = self.month - if day is None: - day = self.day - if hour is None: - hour = self.hour - if minute is None: - minute = self.minute - if second is None: - second = self.second - if microsecond is None: - microsecond = self.microsecond - if tz is None: - tz = self.tz - - return pendulum.datetime( - year, month, day, hour, minute, second, microsecond, tz=tz - ) - - if not _HAS_FOLD: - - @property - def fold(self): - return self._fold - - def timestamp(self): - if self.tzinfo is None: - s = timestamp(self) - - return s + self.microsecond / 1e6 - else: - kwargs = {"tzinfo": self.tzinfo} - - if _HAS_FOLD: - kwargs["fold"] = self.fold - - dt = datetime.datetime( - self.year, - self.month, - self.day, - self.hour, - self.minute, - self.second, - self.microsecond, - **kwargs - ) - return (dt - self._EPOCH).total_seconds() - - @property - def float_timestamp(self): - return self.timestamp() - - @property - def int_timestamp(self): - # Workaround needed to avoid inaccuracy - # for far into the future datetimes - kwargs = {"tzinfo": self.tzinfo} - - if _HAS_FOLD: - kwargs["fold"] = self.fold - - dt = datetime.datetime( - self.year, - self.month, - self.day, - self.hour, - self.minute, - self.second, - self.microsecond, - **kwargs - ) - - delta = dt - self._EPOCH - - return delta.days * SECONDS_PER_DAY + delta.seconds - - @property - def offset(self): - return self.get_offset() - - @property - def offset_hours(self): - return self.get_offset() / SECONDS_PER_MINUTE / MINUTES_PER_HOUR - - @property - def timezone(self): # type: () -> Optional[Timezone] - if not isinstance(self.tzinfo, Timezone): - return - - return self.tzinfo - - @property - def tz(self): # type: () -> Optional[Timezone] - return self.timezone - - @property - def timezone_name(self): # type: () -> Optional[str] - tz = self.timezone - - if tz is None: - return None - - return tz.name - - @property - def age(self): - return self.date().diff(self.now(self.tz).date(), abs=False).in_years() - - def is_local(self): - return self.offset == self.in_timezone(pendulum.local_timezone()).offset - - def is_utc(self): - return self.offset == UTC.offset - - def is_dst(self): - return self.dst() != datetime.timedelta() - - def get_offset(self): - return int(self.utcoffset().total_seconds()) - - def date(self): - return Date(self.year, self.month, self.day) - - def time(self): - return Time(self.hour, self.minute, self.second, self.microsecond) - - def naive(self): # type: (_D) -> _D - """ - Return the DateTime without timezone information. - """ - return self.__class__( - self.year, - self.month, - self.day, - self.hour, - self.minute, - self.second, - self.microsecond, - ) - - def on(self, year, month, day): - """ - Returns a new instance with the current date set to a different date. - - :param year: The year - :type year: int - - :param month: The month - :type month: int - - :param day: The day - :type day: int - - :rtype: DateTime - """ - return self.set(year=int(year), month=int(month), day=int(day)) - - def at(self, hour, minute=0, second=0, microsecond=0): - """ - Returns a new instance with the current time to a different time. - - :param hour: The hour - :type hour: int - - :param minute: The minute - :type minute: int - - :param second: The second - :type second: int - - :param microsecond: The microsecond - :type microsecond: int - - :rtype: DateTime - """ - return self.set( - hour=hour, minute=minute, second=second, microsecond=microsecond - ) - - def in_timezone(self, tz): # type: (Union[str, Timezone]) -> DateTime - """ - Set the instance's timezone from a string or object. - """ - tz = pendulum._safe_timezone(tz) - - return tz.convert(self, dst_rule=pendulum.POST_TRANSITION) - - def in_tz(self, tz): # type: (Union[str, Timezone]) -> DateTime - """ - Set the instance's timezone from a string or object. - """ - return self.in_timezone(tz) - - # STRING FORMATTING - - def to_time_string(self): - """ - Format the instance as time. - - :rtype: str - """ - return self.format("HH:mm:ss") - - def to_datetime_string(self): - """ - Format the instance as date and time. - - :rtype: str - """ - return self.format("YYYY-MM-DD HH:mm:ss") - - def to_day_datetime_string(self): - """ - Format the instance as day, date and time (in english). - - :rtype: str - """ - return self.format("ddd, MMM D, YYYY h:mm A", locale="en") - - def to_atom_string(self): - """ - Format the instance as ATOM. - - :rtype: str - """ - return self._to_string("atom") - - def to_cookie_string(self): - """ - Format the instance as COOKIE. - - :rtype: str - """ - return self._to_string("cookie", locale="en") - - def to_iso8601_string(self): - """ - Format the instance as ISO 8601. - - :rtype: str - """ - string = self._to_string("iso8601") - - if self.tz and self.tz.name == "UTC": - string = string.replace("+00:00", "Z") - - return string - - def to_rfc822_string(self): - """ - Format the instance as RFC 822. - - :rtype: str - """ - return self._to_string("rfc822") - - def to_rfc850_string(self): - """ - Format the instance as RFC 850. - - :rtype: str - """ - return self._to_string("rfc850") - - def to_rfc1036_string(self): - """ - Format the instance as RFC 1036. - - :rtype: str - """ - return self._to_string("rfc1036") - - def to_rfc1123_string(self): - """ - Format the instance as RFC 1123. - - :rtype: str - """ - return self._to_string("rfc1123") - - def to_rfc2822_string(self): - """ - Format the instance as RFC 2822. - - :rtype: str - """ - return self._to_string("rfc2822") - - def to_rfc3339_string(self): - """ - Format the instance as RFC 3339. - - :rtype: str - """ - return self._to_string("rfc3339") - - def to_rss_string(self): - """ - Format the instance as RSS. - - :rtype: str - """ - return self._to_string("rss") - - def to_w3c_string(self): - """ - Format the instance as W3C. - - :rtype: str - """ - return self._to_string("w3c") - - def _to_string(self, fmt, locale=None): - """ - Format the instance to a common string format. - - :param fmt: The name of the string format - :type fmt: string - - :param locale: The locale to use - :type locale: str or None - - :rtype: str - """ - if fmt not in self._FORMATS: - raise ValueError("Format [{}] is not supported".format(fmt)) - - fmt = self._FORMATS[fmt] - if callable(fmt): - return fmt(self) - - return self.format(fmt, locale=locale) - - def __str__(self): - return self.isoformat("T") - - def __repr__(self): - us = "" - if self.microsecond: - us = ", {}".format(self.microsecond) - - repr_ = "{klass}(" "{year}, {month}, {day}, " "{hour}, {minute}, {second}{us}" - - if self.tzinfo is not None: - repr_ += ", tzinfo={tzinfo}" - - repr_ += ")" - - return repr_.format( - klass=self.__class__.__name__, - year=self.year, - month=self.month, - day=self.day, - hour=self.hour, - minute=self.minute, - second=self.second, - us=us, - tzinfo=self.tzinfo, - ) - - # Comparisons - def closest(self, dt1, dt2, *dts): - """ - Get the farthest date from the instance. - - :type dt1: datetime.datetime - :type dt2: datetime.datetime - :type dts: list[datetime.datetime,] - - :rtype: DateTime - """ - dt1 = pendulum.instance(dt1) - dt2 = pendulum.instance(dt2) - dts = [dt1, dt2] + [pendulum.instance(x) for x in dts] - dts = [(abs(self - dt), dt) for dt in dts] - - return min(dts)[1] - - def farthest(self, dt1, dt2, *dts): - """ - Get the farthest date from the instance. - - :type dt1: datetime.datetime - :type dt2: datetime.datetime - :type dts: list[datetime.datetime,] - - :rtype: DateTime - """ - dt1 = pendulum.instance(dt1) - dt2 = pendulum.instance(dt2) - - dts = [dt1, dt2] + [pendulum.instance(x) for x in dts] - dts = [(abs(self - dt), dt) for dt in dts] - - return max(dts)[1] - - def is_future(self): - """ - Determines if the instance is in the future, ie. greater than now. - - :rtype: bool - """ - return self > self.now(self.timezone) - - def is_past(self): - """ - Determines if the instance is in the past, ie. less than now. - - :rtype: bool - """ - return self < self.now(self.timezone) - - def is_long_year(self): - """ - Determines if the instance is a long year - - See link `https://en.wikipedia.org/wiki/ISO_8601#Week_dates`_ - - :rtype: bool - """ - return ( - pendulum.datetime(self.year, 12, 28, 0, 0, 0, tz=self.tz).isocalendar()[1] - == 53 - ) - - def is_same_day(self, dt): - """ - Checks if the passed in date is the same day - as the instance current day. - - :type dt: DateTime or datetime or str or int - - :rtype: bool - """ - dt = pendulum.instance(dt) - - return self.to_date_string() == dt.to_date_string() - - def is_anniversary(self, dt=None): - """ - Check if its the anniversary. - Compares the date/month values of the two dates. - - :rtype: bool - """ - if dt is None: - dt = self.now(self.tz) - - instance = pendulum.instance(dt) - - return (self.month, self.day) == (instance.month, instance.day) - - # the additional method for checking if today is the anniversary day - # the alias is provided to start using a new name and keep the backward compatibility - # the old name can be completely replaced with the new in one of the future versions - is_birthday = is_anniversary - - # ADDITIONS AND SUBSTRACTIONS - - def add( - self, - years=0, - months=0, - weeks=0, - days=0, - hours=0, - minutes=0, - seconds=0, - microseconds=0, - ): # type: (_D, int, int, int, int, int, int, int, int) -> _D - """ - Add a duration to the instance. - - If we're adding units of variable length (i.e., years, months), - move forward from curren time, - otherwise move forward from utc, for accuracy - when moving across DST boundaries. - """ - units_of_variable_length = any([years, months, weeks, days]) - - current_dt = datetime.datetime( - self.year, - self.month, - self.day, - self.hour, - self.minute, - self.second, - self.microsecond, - ) - if not units_of_variable_length: - offset = self.utcoffset() - if offset: - current_dt = current_dt - offset - - dt = add_duration( - current_dt, - years=years, - months=months, - weeks=weeks, - days=days, - hours=hours, - minutes=minutes, - seconds=seconds, - microseconds=microseconds, - ) - - if units_of_variable_length or self.tzinfo is None: - return pendulum.datetime( - dt.year, - dt.month, - dt.day, - dt.hour, - dt.minute, - dt.second, - dt.microsecond, - tz=self.tz, - ) - - dt = self.__class__( - dt.year, - dt.month, - dt.day, - dt.hour, - dt.minute, - dt.second, - dt.microsecond, - tzinfo=UTC, - ) - - dt = self.tz.convert(dt) - - return self.__class__( - dt.year, - dt.month, - dt.day, - dt.hour, - dt.minute, - dt.second, - dt.microsecond, - tzinfo=self.tz, - fold=dt.fold, - ) - - def subtract( - self, - years=0, - months=0, - weeks=0, - days=0, - hours=0, - minutes=0, - seconds=0, - microseconds=0, - ): - """ - Remove duration from the instance. - - :param years: The number of years - :type years: int - - :param months: The number of months - :type months: int - - :param weeks: The number of weeks - :type weeks: int - - :param days: The number of days - :type days: int - - :param hours: The number of hours - :type hours: int - - :param minutes: The number of minutes - :type minutes: int - - :param seconds: The number of seconds - :type seconds: int - - :param microseconds: The number of microseconds - :type microseconds: int - - :rtype: DateTime - """ - return self.add( - years=-years, - months=-months, - weeks=-weeks, - days=-days, - hours=-hours, - minutes=-minutes, - seconds=-seconds, - microseconds=-microseconds, - ) - - # Adding a final underscore to the method name - # to avoid errors for PyPy which already defines - # a _add_timedelta method - def _add_timedelta_(self, delta): - """ - Add timedelta duration to the instance. - - :param delta: The timedelta instance - :type delta: pendulum.Duration or datetime.timedelta - - :rtype: DateTime - """ - if isinstance(delta, pendulum.Period): - return self.add( - years=delta.years, - months=delta.months, - weeks=delta.weeks, - days=delta.remaining_days, - hours=delta.hours, - minutes=delta.minutes, - seconds=delta.remaining_seconds, - microseconds=delta.microseconds, - ) - elif isinstance(delta, pendulum.Duration): - return self.add( - years=delta.years, months=delta.months, seconds=delta._total - ) - - return self.add(seconds=delta.total_seconds()) - - def _subtract_timedelta(self, delta): - """ - Remove timedelta duration from the instance. - - :param delta: The timedelta instance - :type delta: pendulum.Duration or datetime.timedelta - - :rtype: DateTime - """ - if isinstance(delta, pendulum.Duration): - return self.subtract( - years=delta.years, months=delta.months, seconds=delta._total - ) - - return self.subtract(seconds=delta.total_seconds()) - - # DIFFERENCES - - def diff(self, dt=None, abs=True): - """ - Returns the difference between two DateTime objects represented as a Duration. - - :type dt: DateTime or None - - :param abs: Whether to return an absolute interval or not - :type abs: bool - - :rtype: Period - """ - if dt is None: - dt = self.now(self.tz) - - return Period(self, dt, absolute=abs) - - def diff_for_humans( - self, - other=None, # type: Optional[DateTime] - absolute=False, # type: bool - locale=None, # type: Optional[str] - ): # type: (...) -> str - """ - Get the difference in a human readable format in the current locale. - - When comparing a value in the past to default now: - 1 day ago - 5 months ago - - When comparing a value in the future to default now: - 1 day from now - 5 months from now - - When comparing a value in the past to another value: - 1 day before - 5 months before - - When comparing a value in the future to another value: - 1 day after - 5 months after - """ - is_now = other is None - - if is_now: - other = self.now() - - diff = self.diff(other) - - return pendulum.format_diff(diff, is_now, absolute, locale) - - # Modifiers - def start_of(self, unit): - """ - Returns a copy of the instance with the time reset - with the following rules: - - * second: microsecond set to 0 - * minute: second and microsecond set to 0 - * hour: minute, second and microsecond set to 0 - * day: time to 00:00:00 - * week: date to first day of the week and time to 00:00:00 - * month: date to first day of the month and time to 00:00:00 - * year: date to first day of the year and time to 00:00:00 - * decade: date to first day of the decade and time to 00:00:00 - * century: date to first day of century and time to 00:00:00 - - :param unit: The unit to reset to - :type unit: str - - :rtype: DateTime - """ - if unit not in self._MODIFIERS_VALID_UNITS: - raise ValueError('Invalid unit "{}" for start_of()'.format(unit)) - - return getattr(self, "_start_of_{}".format(unit))() - - def end_of(self, unit): - """ - Returns a copy of the instance with the time reset - with the following rules: - - * second: microsecond set to 999999 - * minute: second set to 59 and microsecond set to 999999 - * hour: minute and second set to 59 and microsecond set to 999999 - * day: time to 23:59:59.999999 - * week: date to last day of the week and time to 23:59:59.999999 - * month: date to last day of the month and time to 23:59:59.999999 - * year: date to last day of the year and time to 23:59:59.999999 - * decade: date to last day of the decade and time to 23:59:59.999999 - * century: date to last day of century and time to 23:59:59.999999 - - :param unit: The unit to reset to - :type unit: str - - :rtype: DateTime - """ - if unit not in self._MODIFIERS_VALID_UNITS: - raise ValueError('Invalid unit "%s" for end_of()' % unit) - - return getattr(self, "_end_of_%s" % unit)() - - def _start_of_second(self): - """ - Reset microseconds to 0. - - :rtype: DateTime - """ - return self.set(microsecond=0) - - def _end_of_second(self): - """ - Set microseconds to 999999. - - :rtype: DateTime - """ - return self.set(microsecond=999999) - - def _start_of_minute(self): - """ - Reset seconds and microseconds to 0. - - :rtype: DateTime - """ - return self.set(second=0, microsecond=0) - - def _end_of_minute(self): - """ - Set seconds to 59 and microseconds to 999999. - - :rtype: DateTime - """ - return self.set(second=59, microsecond=999999) - - def _start_of_hour(self): - """ - Reset minutes, seconds and microseconds to 0. - - :rtype: DateTime - """ - return self.set(minute=0, second=0, microsecond=0) - - def _end_of_hour(self): - """ - Set minutes and seconds to 59 and microseconds to 999999. - - :rtype: DateTime - """ - return self.set(minute=59, second=59, microsecond=999999) - - def _start_of_day(self): - """ - Reset the time to 00:00:00 - - :rtype: DateTime - """ - return self.at(0, 0, 0, 0) - - def _end_of_day(self): - """ - Reset the time to 23:59:59.999999 - - :rtype: DateTime - """ - return self.at(23, 59, 59, 999999) - - def _start_of_month(self): - """ - Reset the date to the first day of the month and the time to 00:00:00. - - :rtype: DateTime - """ - return self.set(self.year, self.month, 1, 0, 0, 0, 0) - - def _end_of_month(self): - """ - Reset the date to the last day of the month - and the time to 23:59:59.999999. - - :rtype: DateTime - """ - return self.set(self.year, self.month, self.days_in_month, 23, 59, 59, 999999) - - def _start_of_year(self): - """ - Reset the date to the first day of the year and the time to 00:00:00. - - :rtype: DateTime - """ - return self.set(self.year, 1, 1, 0, 0, 0, 0) - - def _end_of_year(self): - """ - Reset the date to the last day of the year - and the time to 23:59:59.999999 - - :rtype: DateTime - """ - return self.set(self.year, 12, 31, 23, 59, 59, 999999) - - def _start_of_decade(self): - """ - Reset the date to the first day of the decade - and the time to 00:00:00. - - :rtype: DateTime - """ - year = self.year - self.year % YEARS_PER_DECADE - return self.set(year, 1, 1, 0, 0, 0, 0) - - def _end_of_decade(self): - """ - Reset the date to the last day of the decade - and the time to 23:59:59.999999. - - :rtype: DateTime - """ - year = self.year - self.year % YEARS_PER_DECADE + YEARS_PER_DECADE - 1 - - return self.set(year, 12, 31, 23, 59, 59, 999999) - - def _start_of_century(self): - """ - Reset the date to the first day of the century - and the time to 00:00:00. - - :rtype: DateTime - """ - year = self.year - 1 - (self.year - 1) % YEARS_PER_CENTURY + 1 - - return self.set(year, 1, 1, 0, 0, 0, 0) - - def _end_of_century(self): - """ - Reset the date to the last day of the century - and the time to 23:59:59.999999. - - :rtype: DateTime - """ - year = self.year - 1 - (self.year - 1) % YEARS_PER_CENTURY + YEARS_PER_CENTURY - - return self.set(year, 12, 31, 23, 59, 59, 999999) - - def _start_of_week(self): - """ - Reset the date to the first day of the week - and the time to 00:00:00. - - :rtype: DateTime - """ - dt = self - - if self.day_of_week != pendulum._WEEK_STARTS_AT: - dt = self.previous(pendulum._WEEK_STARTS_AT) - - return dt.start_of("day") - - def _end_of_week(self): - """ - Reset the date to the last day of the week - and the time to 23:59:59. - - :rtype: DateTime - """ - dt = self - - if self.day_of_week != pendulum._WEEK_ENDS_AT: - dt = self.next(pendulum._WEEK_ENDS_AT) - - return dt.end_of("day") - - def next(self, day_of_week=None, keep_time=False): - """ - Modify to the next occurrence of a given day of the week. - If no day_of_week is provided, modify to the next occurrence - of the current day of the week. Use the supplied consts - to indicate the desired day_of_week, ex. DateTime.MONDAY. - - :param day_of_week: The next day of week to reset to. - :type day_of_week: int or None - - :param keep_time: Whether to keep the time information or not. - :type keep_time: bool - - :rtype: DateTime - """ - if day_of_week is None: - day_of_week = self.day_of_week - - if day_of_week < SUNDAY or day_of_week > SATURDAY: - raise ValueError("Invalid day of week") - - if keep_time: - dt = self - else: - dt = self.start_of("day") - - dt = dt.add(days=1) - while dt.day_of_week != day_of_week: - dt = dt.add(days=1) - - return dt - - def previous(self, day_of_week=None, keep_time=False): - """ - Modify to the previous occurrence of a given day of the week. - If no day_of_week is provided, modify to the previous occurrence - of the current day of the week. Use the supplied consts - to indicate the desired day_of_week, ex. DateTime.MONDAY. - - :param day_of_week: The previous day of week to reset to. - :type day_of_week: int or None - - :param keep_time: Whether to keep the time information or not. - :type keep_time: bool - - :rtype: DateTime - """ - if day_of_week is None: - day_of_week = self.day_of_week - - if day_of_week < SUNDAY or day_of_week > SATURDAY: - raise ValueError("Invalid day of week") - - if keep_time: - dt = self - else: - dt = self.start_of("day") - - dt = dt.subtract(days=1) - while dt.day_of_week != day_of_week: - dt = dt.subtract(days=1) - - return dt - - def first_of(self, unit, day_of_week=None): - """ - Returns an instance set to the first occurrence - of a given day of the week in the current unit. - If no day_of_week is provided, modify to the first day of the unit. - Use the supplied consts to indicate the desired day_of_week, ex. DateTime.MONDAY. - - Supported units are month, quarter and year. - - :param unit: The unit to use - :type unit: str - - :type day_of_week: int or None - - :rtype: DateTime - """ - if unit not in ["month", "quarter", "year"]: - raise ValueError('Invalid unit "{}" for first_of()'.format(unit)) - - return getattr(self, "_first_of_{}".format(unit))(day_of_week) - - def last_of(self, unit, day_of_week=None): - """ - Returns an instance set to the last occurrence - of a given day of the week in the current unit. - If no day_of_week is provided, modify to the last day of the unit. - Use the supplied consts to indicate the desired day_of_week, ex. DateTime.MONDAY. - - Supported units are month, quarter and year. - - :param unit: The unit to use - :type unit: str - - :type day_of_week: int or None - - :rtype: DateTime - """ - if unit not in ["month", "quarter", "year"]: - raise ValueError('Invalid unit "{}" for first_of()'.format(unit)) - - return getattr(self, "_last_of_{}".format(unit))(day_of_week) - - def nth_of(self, unit, nth, day_of_week): - """ - Returns a new instance set to the given occurrence - of a given day of the week in the current unit. - If the calculated occurrence is outside the scope of the current unit, - then raise an error. Use the supplied consts - to indicate the desired day_of_week, ex. DateTime.MONDAY. - - Supported units are month, quarter and year. - - :param unit: The unit to use - :type unit: str - - :type nth: int - - :type day_of_week: int or None - - :rtype: DateTime - """ - if unit not in ["month", "quarter", "year"]: - raise ValueError('Invalid unit "{}" for first_of()'.format(unit)) - - dt = getattr(self, "_nth_of_{}".format(unit))(nth, day_of_week) - if dt is False: - raise PendulumException( - "Unable to find occurence {} of {} in {}".format( - nth, self._days[day_of_week], unit - ) - ) - - return dt - - def _first_of_month(self, day_of_week): - """ - Modify to the first occurrence of a given day of the week - in the current month. If no day_of_week is provided, - modify to the first day of the month. Use the supplied consts - to indicate the desired day_of_week, ex. DateTime.MONDAY. - - :type day_of_week: int - - :rtype: DateTime - """ - dt = self.start_of("day") - - if day_of_week is None: - return dt.set(day=1) - - month = calendar.monthcalendar(dt.year, dt.month) - - calendar_day = (day_of_week - 1) % 7 - - if month[0][calendar_day] > 0: - day_of_month = month[0][calendar_day] - else: - day_of_month = month[1][calendar_day] - - return dt.set(day=day_of_month) - - def _last_of_month(self, day_of_week=None): - """ - Modify to the last occurrence of a given day of the week - in the current month. If no day_of_week is provided, - modify to the last day of the month. Use the supplied consts - to indicate the desired day_of_week, ex. DateTime.MONDAY. - - :type day_of_week: int or None - - :rtype: DateTime - """ - dt = self.start_of("day") - - if day_of_week is None: - return dt.set(day=self.days_in_month) - - month = calendar.monthcalendar(dt.year, dt.month) - - calendar_day = (day_of_week - 1) % 7 - - if month[-1][calendar_day] > 0: - day_of_month = month[-1][calendar_day] - else: - day_of_month = month[-2][calendar_day] - - return dt.set(day=day_of_month) - - def _nth_of_month(self, nth, day_of_week): - """ - Modify to the given occurrence of a given day of the week - in the current month. If the calculated occurrence is outside, - the scope of the current month, then return False and no - modifications are made. Use the supplied consts - to indicate the desired day_of_week, ex. DateTime.MONDAY. - - :type nth: int - - :type day_of_week: int or None - - :rtype: DateTime - """ - if nth == 1: - return self.first_of("month", day_of_week) - - dt = self.first_of("month") - check = dt.format("%Y-%M") - for i in range(nth - (1 if dt.day_of_week == day_of_week else 0)): - dt = dt.next(day_of_week) - - if dt.format("%Y-%M") == check: - return self.set(day=dt.day).start_of("day") - - return False - - def _first_of_quarter(self, day_of_week=None): - """ - Modify to the first occurrence of a given day of the week - in the current quarter. If no day_of_week is provided, - modify to the first day of the quarter. Use the supplied consts - to indicate the desired day_of_week, ex. DateTime.MONDAY. - - :type day_of_week: int or None - - :rtype: DateTime - """ - return self.on(self.year, self.quarter * 3 - 2, 1).first_of( - "month", day_of_week - ) - - def _last_of_quarter(self, day_of_week=None): - """ - Modify to the last occurrence of a given day of the week - in the current quarter. If no day_of_week is provided, - modify to the last day of the quarter. Use the supplied consts - to indicate the desired day_of_week, ex. DateTime.MONDAY. - - :type day_of_week: int or None - - :rtype: DateTime - """ - return self.on(self.year, self.quarter * 3, 1).last_of("month", day_of_week) - - def _nth_of_quarter(self, nth, day_of_week): - """ - Modify to the given occurrence of a given day of the week - in the current quarter. If the calculated occurrence is outside, - the scope of the current quarter, then return False and no - modifications are made. Use the supplied consts - to indicate the desired day_of_week, ex. DateTime.MONDAY. - - :type nth: int - - :type day_of_week: int or None - - :rtype: DateTime - """ - if nth == 1: - return self.first_of("quarter", day_of_week) - - dt = self.set(day=1, month=self.quarter * 3) - last_month = dt.month - year = dt.year - dt = dt.first_of("quarter") - for i in range(nth - (1 if dt.day_of_week == day_of_week else 0)): - dt = dt.next(day_of_week) - - if last_month < dt.month or year != dt.year: - return False - - return self.on(self.year, dt.month, dt.day).start_of("day") - - def _first_of_year(self, day_of_week=None): - """ - Modify to the first occurrence of a given day of the week - in the current year. If no day_of_week is provided, - modify to the first day of the year. Use the supplied consts - to indicate the desired day_of_week, ex. DateTime.MONDAY. - - :type day_of_week: int or None - - :rtype: DateTime - """ - return self.set(month=1).first_of("month", day_of_week) - - def _last_of_year(self, day_of_week=None): - """ - Modify to the last occurrence of a given day of the week - in the current year. If no day_of_week is provided, - modify to the last day of the year. Use the supplied consts - to indicate the desired day_of_week, ex. DateTime.MONDAY. - - :type day_of_week: int or None - - :rtype: DateTime - """ - return self.set(month=MONTHS_PER_YEAR).last_of("month", day_of_week) - - def _nth_of_year(self, nth, day_of_week): - """ - Modify to the given occurrence of a given day of the week - in the current year. If the calculated occurrence is outside, - the scope of the current year, then return False and no - modifications are made. Use the supplied consts - to indicate the desired day_of_week, ex. DateTime.MONDAY. - - :type nth: int - - :type day_of_week: int or None - - :rtype: DateTime - """ - if nth == 1: - return self.first_of("year", day_of_week) - - dt = self.first_of("year") - year = dt.year - for i in range(nth - (1 if dt.day_of_week == day_of_week else 0)): - dt = dt.next(day_of_week) - - if year != dt.year: - return False - - return self.on(self.year, dt.month, dt.day).start_of("day") - - def average(self, dt=None): - """ - Modify the current instance to the average - of a given instance (default now) and the current instance. - - :type dt: DateTime or datetime - - :rtype: DateTime - """ - if dt is None: - dt = self.now(self.tz) - - diff = self.diff(dt, False) - return self.add( - microseconds=(diff.in_seconds() * 1000000 + diff.microseconds) // 2 - ) - - def __sub__(self, other): - if isinstance(other, datetime.timedelta): - return self._subtract_timedelta(other) - - if not isinstance(other, datetime.datetime): - return NotImplemented - - if not isinstance(other, self.__class__): - if other.tzinfo is None: - other = pendulum.naive( - other.year, - other.month, - other.day, - other.hour, - other.minute, - other.second, - other.microsecond, - ) - else: - other = pendulum.instance(other) - - return other.diff(self, False) - - def __rsub__(self, other): - if not isinstance(other, datetime.datetime): - return NotImplemented - - if not isinstance(other, self.__class__): - if other.tzinfo is None: - other = pendulum.naive( - other.year, - other.month, - other.day, - other.hour, - other.minute, - other.second, - other.microsecond, - ) - else: - other = pendulum.instance(other) - - return self.diff(other, False) - - def __add__(self, other): - if not isinstance(other, datetime.timedelta): - return NotImplemented - - return self._add_timedelta_(other) - - def __radd__(self, other): - return self.__add__(other) - - # Native methods override - - @classmethod - def fromtimestamp(cls, t, tz=None): - return pendulum.instance(datetime.datetime.fromtimestamp(t, tz=tz), tz=tz) - - @classmethod - def utcfromtimestamp(cls, t): - return pendulum.instance(datetime.datetime.utcfromtimestamp(t), tz=None) - - @classmethod - def fromordinal(cls, n): - return pendulum.instance(datetime.datetime.fromordinal(n), tz=None) - - @classmethod - def combine(cls, date, time): - return pendulum.instance(datetime.datetime.combine(date, time), tz=None) - - def astimezone(self, tz=None): - return pendulum.instance(super(DateTime, self).astimezone(tz)) - - def replace( - self, - year=None, - month=None, - day=None, - hour=None, - minute=None, - second=None, - microsecond=None, - tzinfo=True, - fold=None, - ): - if year is None: - year = self.year - if month is None: - month = self.month - if day is None: - day = self.day - if hour is None: - hour = self.hour - if minute is None: - minute = self.minute - if second is None: - second = self.second - if microsecond is None: - microsecond = self.microsecond - if tzinfo is True: - tzinfo = self.tzinfo - if fold is None: - fold = self.fold - - transition_rule = pendulum.POST_TRANSITION - if fold is not None: - transition_rule = pendulum.PRE_TRANSITION - if fold: - transition_rule = pendulum.POST_TRANSITION - - return pendulum.datetime( - year, - month, - day, - hour, - minute, - second, - microsecond, - tz=tzinfo, - dst_rule=transition_rule, - ) - - def __getnewargs__(self): - return (self,) - - def _getstate(self, protocol=3): - return ( - self.year, - self.month, - self.day, - self.hour, - self.minute, - self.second, - self.microsecond, - self.tzinfo, - ) - - def __reduce__(self): - return self.__reduce_ex__(2) - - def __reduce_ex__(self, protocol): - return self.__class__, self._getstate(protocol) - - def _cmp(self, other, **kwargs): - # Fix for pypy which compares using this method - # which would lead to infinite recursion if we didn't override - kwargs = {"tzinfo": self.tz} - - if _HAS_FOLD: - kwargs["fold"] = self.fold - - dt = datetime.datetime( - self.year, - self.month, - self.day, - self.hour, - self.minute, - self.second, - self.microsecond, - **kwargs - ) - - return 0 if dt == other else 1 if dt > other else -1 - - -DateTime.min = DateTime(1, 1, 1, 0, 0, tzinfo=UTC) -DateTime.max = DateTime(9999, 12, 31, 23, 59, 59, 999999, tzinfo=UTC) -DateTime.EPOCH = DateTime(1970, 1, 1) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/duration.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/duration.py deleted file mode 100644 index 18d0c7f5..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/duration.py +++ /dev/null @@ -1,479 +0,0 @@ -from __future__ import absolute_import -from __future__ import division - -from datetime import timedelta - -import pendulum - -from pendulum.utils._compat import PYPY -from pendulum.utils._compat import decode - -from .constants import SECONDS_PER_DAY -from .constants import SECONDS_PER_HOUR -from .constants import SECONDS_PER_MINUTE -from .constants import US_PER_SECOND - - -def _divide_and_round(a, b): - """divide a by b and round result to the nearest integer - - When the ratio is exactly half-way between two integers, - the even integer is returned. - """ - # Based on the reference implementation for divmod_near - # in Objects/longobject.c. - q, r = divmod(a, b) - # round up if either r / b > 0.5, or r / b == 0.5 and q is odd. - # The expression r / b > 0.5 is equivalent to 2 * r > b if b is - # positive, 2 * r < b if b negative. - r *= 2 - greater_than_half = r > b if b > 0 else r < b - if greater_than_half or r == b and q % 2 == 1: - q += 1 - - return q - - -class Duration(timedelta): - """ - Replacement for the standard timedelta class. - - Provides several improvements over the base class. - """ - - _y = None - _m = None - _w = None - _d = None - _h = None - _i = None - _s = None - _invert = None - - def __new__( - cls, - days=0, - seconds=0, - microseconds=0, - milliseconds=0, - minutes=0, - hours=0, - weeks=0, - years=0, - months=0, - ): - if not isinstance(years, int) or not isinstance(months, int): - raise ValueError("Float year and months are not supported") - - self = timedelta.__new__( - cls, - days + years * 365 + months * 30, - seconds, - microseconds, - milliseconds, - minutes, - hours, - weeks, - ) - - # Intuitive normalization - total = self.total_seconds() - (years * 365 + months * 30) * SECONDS_PER_DAY - self._total = total - - m = 1 - if total < 0: - m = -1 - - self._microseconds = round(total % m * 1e6) - self._seconds = abs(int(total)) % SECONDS_PER_DAY * m - - _days = abs(int(total)) // SECONDS_PER_DAY * m - self._days = _days - self._remaining_days = abs(_days) % 7 * m - self._weeks = abs(_days) // 7 * m - self._months = months - self._years = years - - return self - - def total_minutes(self): - return self.total_seconds() / SECONDS_PER_MINUTE - - def total_hours(self): - return self.total_seconds() / SECONDS_PER_HOUR - - def total_days(self): - return self.total_seconds() / SECONDS_PER_DAY - - def total_weeks(self): - return self.total_days() / 7 - - if PYPY: - - def total_seconds(self): - days = 0 - - if hasattr(self, "_years"): - days += self._years * 365 - - if hasattr(self, "_months"): - days += self._months * 30 - - if hasattr(self, "_remaining_days"): - days += self._weeks * 7 + self._remaining_days - else: - days += self._days - - return ( - (days * SECONDS_PER_DAY + self._seconds) * US_PER_SECOND - + self._microseconds - ) / US_PER_SECOND - - @property - def years(self): - return self._years - - @property - def months(self): - return self._months - - @property - def weeks(self): - return self._weeks - - if PYPY: - - @property - def days(self): - return self._years * 365 + self._months * 30 + self._days - - @property - def remaining_days(self): - return self._remaining_days - - @property - def hours(self): - if self._h is None: - seconds = self._seconds - self._h = 0 - if abs(seconds) >= 3600: - self._h = (abs(seconds) // 3600 % 24) * self._sign(seconds) - - return self._h - - @property - def minutes(self): - if self._i is None: - seconds = self._seconds - self._i = 0 - if abs(seconds) >= 60: - self._i = (abs(seconds) // 60 % 60) * self._sign(seconds) - - return self._i - - @property - def seconds(self): - return self._seconds - - @property - def remaining_seconds(self): - if self._s is None: - self._s = self._seconds - self._s = abs(self._s) % 60 * self._sign(self._s) - - return self._s - - @property - def microseconds(self): - return self._microseconds - - @property - def invert(self): - if self._invert is None: - self._invert = self.total_seconds() < 0 - - return self._invert - - def in_weeks(self): - return int(self.total_weeks()) - - def in_days(self): - return int(self.total_days()) - - def in_hours(self): - return int(self.total_hours()) - - def in_minutes(self): - return int(self.total_minutes()) - - def in_seconds(self): - return int(self.total_seconds()) - - def in_words(self, locale=None, separator=" "): - """ - Get the current interval in words in the current locale. - - Ex: 6 jours 23 heures 58 minutes - - :param locale: The locale to use. Defaults to current locale. - :type locale: str - - :param separator: The separator to use between each unit - :type separator: str - - :rtype: str - """ - periods = [ - ("year", self.years), - ("month", self.months), - ("week", self.weeks), - ("day", self.remaining_days), - ("hour", self.hours), - ("minute", self.minutes), - ("second", self.remaining_seconds), - ] - - if locale is None: - locale = pendulum.get_locale() - - locale = pendulum.locale(locale) - parts = [] - for period in periods: - unit, count = period - if abs(count) > 0: - translation = locale.translation( - "units.{}.{}".format(unit, locale.plural(abs(count))) - ) - parts.append(translation.format(count)) - - if not parts: - if abs(self.microseconds) > 0: - unit = "units.second.{}".format(locale.plural(1)) - count = "{:.2f}".format(abs(self.microseconds) / 1e6) - else: - unit = "units.microsecond.{}".format(locale.plural(0)) - count = 0 - translation = locale.translation(unit) - parts.append(translation.format(count)) - - return decode(separator.join(parts)) - - def _sign(self, value): - if value < 0: - return -1 - - return 1 - - def as_timedelta(self): - """ - Return the interval as a native timedelta. - - :rtype: timedelta - """ - return timedelta(seconds=self.total_seconds()) - - def __str__(self): - return self.in_words() - - def __repr__(self): - rep = "{}(".format(self.__class__.__name__) - - if self._years: - rep += "years={}, ".format(self._years) - - if self._months: - rep += "months={}, ".format(self._months) - - if self._weeks: - rep += "weeks={}, ".format(self._weeks) - - if self._days: - rep += "days={}, ".format(self._remaining_days) - - if self.hours: - rep += "hours={}, ".format(self.hours) - - if self.minutes: - rep += "minutes={}, ".format(self.minutes) - - if self.remaining_seconds: - rep += "seconds={}, ".format(self.remaining_seconds) - - if self.microseconds: - rep += "microseconds={}, ".format(self.microseconds) - - rep += ")" - - return rep.replace(", )", ")") - - def __add__(self, other): - if isinstance(other, timedelta): - return self.__class__(seconds=self.total_seconds() + other.total_seconds()) - - return NotImplemented - - __radd__ = __add__ - - def __sub__(self, other): - if isinstance(other, timedelta): - return self.__class__(seconds=self.total_seconds() - other.total_seconds()) - - return NotImplemented - - def __neg__(self): - return self.__class__( - years=-self._years, - months=-self._months, - weeks=-self._weeks, - days=-self._remaining_days, - seconds=-self._seconds, - microseconds=-self._microseconds, - ) - - def _to_microseconds(self): - return (self._days * (24 * 3600) + self._seconds) * 1000000 + self._microseconds - - def __mul__(self, other): - if isinstance(other, int): - return self.__class__( - years=self._years * other, - months=self._months * other, - seconds=self._total * other, - ) - - if isinstance(other, float): - usec = self._to_microseconds() - a, b = other.as_integer_ratio() - - return self.__class__(0, 0, _divide_and_round(usec * a, b)) - - return NotImplemented - - __rmul__ = __mul__ - - def __floordiv__(self, other): - if not isinstance(other, (int, timedelta)): - return NotImplemented - - usec = self._to_microseconds() - if isinstance(other, timedelta): - return usec // other._to_microseconds() - - if isinstance(other, int): - return self.__class__( - 0, - 0, - usec // other, - years=self._years // other, - months=self._months // other, - ) - - def __truediv__(self, other): - if not isinstance(other, (int, float, timedelta)): - return NotImplemented - - usec = self._to_microseconds() - if isinstance(other, timedelta): - return usec / other._to_microseconds() - - if isinstance(other, int): - return self.__class__( - 0, - 0, - _divide_and_round(usec, other), - years=_divide_and_round(self._years, other), - months=_divide_and_round(self._months, other), - ) - - if isinstance(other, float): - a, b = other.as_integer_ratio() - - return self.__class__( - 0, - 0, - _divide_and_round(b * usec, a), - years=_divide_and_round(self._years * b, a), - months=_divide_and_round(self._months, other), - ) - - __div__ = __floordiv__ - - def __mod__(self, other): - if isinstance(other, timedelta): - r = self._to_microseconds() % other._to_microseconds() - - return self.__class__(0, 0, r) - - return NotImplemented - - def __divmod__(self, other): - if isinstance(other, timedelta): - q, r = divmod(self._to_microseconds(), other._to_microseconds()) - - return q, self.__class__(0, 0, r) - - return NotImplemented - - -Duration.min = Duration(days=-999999999) -Duration.max = Duration( - days=999999999, hours=23, minutes=59, seconds=59, microseconds=999999 -) -Duration.resolution = Duration(microseconds=1) - - -class AbsoluteDuration(Duration): - """ - Duration that expresses a time difference in absolute values. - """ - - def __new__( - cls, - days=0, - seconds=0, - microseconds=0, - milliseconds=0, - minutes=0, - hours=0, - weeks=0, - years=0, - months=0, - ): - if not isinstance(years, int) or not isinstance(months, int): - raise ValueError("Float year and months are not supported") - - self = timedelta.__new__( - cls, days, seconds, microseconds, milliseconds, minutes, hours, weeks - ) - - # We need to compute the total_seconds() value - # on a native timedelta object - delta = timedelta( - days, seconds, microseconds, milliseconds, minutes, hours, weeks - ) - - # Intuitive normalization - self._total = delta.total_seconds() - total = abs(self._total) - - self._microseconds = round(total % 1 * 1e6) - self._seconds = int(total) % SECONDS_PER_DAY - - days = int(total) // SECONDS_PER_DAY - self._days = abs(days + years * 365 + months * 30) - self._remaining_days = days % 7 - self._weeks = days // 7 - self._months = abs(months) - self._years = abs(years) - - return self - - def total_seconds(self): - return abs(self._total) - - @property - def invert(self): - if self._invert is None: - self._invert = self._total < 0 - - return self._invert diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/exceptions.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/exceptions.py deleted file mode 100644 index 68067836..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/exceptions.py +++ /dev/null @@ -1,6 +0,0 @@ -from .parsing.exceptions import ParserError # noqa - - -class PendulumException(Exception): - - pass diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/formatting/__init__.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/formatting/__init__.py deleted file mode 100644 index a2b47dec..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/formatting/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from .formatter import Formatter - - -__all__ = ["Formatter"] diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/formatting/__pycache__/__init__.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/formatting/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index b8bb5dd6..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/formatting/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/formatting/__pycache__/difference_formatter.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/formatting/__pycache__/difference_formatter.cpython-311.pyc deleted file mode 100644 index 0fc6a32b..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/formatting/__pycache__/difference_formatter.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/formatting/__pycache__/formatter.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/formatting/__pycache__/formatter.cpython-311.pyc deleted file mode 100644 index 23c655a4..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/formatting/__pycache__/formatter.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/formatting/difference_formatter.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/formatting/difference_formatter.py deleted file mode 100644 index 32430896..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/formatting/difference_formatter.py +++ /dev/null @@ -1,153 +0,0 @@ -import typing - -import pendulum - -from pendulum.utils._compat import decode - -from ..locales.locale import Locale - - -class DifferenceFormatter(object): - """ - Handles formatting differences in text. - """ - - def __init__(self, locale="en"): - self._locale = Locale.load(locale) - - def format( - self, diff, is_now=True, absolute=False, locale=None - ): # type: (pendulum.Period, bool, bool, typing.Optional[str]) -> str - """ - Formats a difference. - - :param diff: The difference to format - :type diff: pendulum.period.Period - - :param is_now: Whether the difference includes now - :type is_now: bool - - :param absolute: Whether it's an absolute difference or not - :type absolute: bool - - :param locale: The locale to use - :type locale: str or None - - :rtype: str - """ - if locale is None: - locale = self._locale - else: - locale = Locale.load(locale) - - count = diff.remaining_seconds - - if diff.years > 0: - unit = "year" - count = diff.years - - if diff.months > 6: - count += 1 - elif diff.months == 11 and (diff.weeks * 7 + diff.remaining_days) > 15: - unit = "year" - count = 1 - elif diff.months > 0: - unit = "month" - count = diff.months - - if (diff.weeks * 7 + diff.remaining_days) >= 27: - count += 1 - elif diff.weeks > 0: - unit = "week" - count = diff.weeks - - if diff.remaining_days > 3: - count += 1 - elif diff.remaining_days > 0: - unit = "day" - count = diff.remaining_days - - if diff.hours >= 22: - count += 1 - elif diff.hours > 0: - unit = "hour" - count = diff.hours - elif diff.minutes > 0: - unit = "minute" - count = diff.minutes - elif 10 < diff.remaining_seconds <= 59: - unit = "second" - count = diff.remaining_seconds - else: - # We check if the "a few seconds" unit exists - time = locale.get("custom.units.few_second") - if time is not None: - if absolute: - return time - - key = "custom" - is_future = diff.invert - if is_now: - if is_future: - key += ".from_now" - else: - key += ".ago" - else: - if is_future: - key += ".after" - else: - key += ".before" - - return locale.get(key).format(time) - else: - unit = "second" - count = diff.remaining_seconds - - if count == 0: - count = 1 - - if absolute: - key = "translations.units.{}".format(unit) - else: - is_future = diff.invert - - if is_now: - # Relative to now, so we can use - # the CLDR data - key = "translations.relative.{}".format(unit) - - if is_future: - key += ".future" - else: - key += ".past" - else: - # Absolute comparison - # So we have to use the custom locale data - - # Checking for special pluralization rules - key = "custom.units_relative" - if is_future: - key += ".{}.future".format(unit) - else: - key += ".{}.past".format(unit) - - trans = locale.get(key) - if not trans: - # No special rule - time = locale.get( - "translations.units.{}.{}".format(unit, locale.plural(count)) - ).format(count) - else: - time = trans[locale.plural(count)].format(count) - - key = "custom" - if is_future: - key += ".after" - else: - key += ".before" - - return locale.get(key).format(decode(time)) - - key += ".{}".format(locale.plural(count)) - - return decode(locale.get(key).format(count)) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/formatting/formatter.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/formatting/formatter.py deleted file mode 100644 index 4e493d04..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/formatting/formatter.py +++ /dev/null @@ -1,685 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -import datetime -import re -import typing - -import pendulum - -from pendulum.locales.locale import Locale -from pendulum.utils._compat import decode - - -_MATCH_1 = r"\d" -_MATCH_2 = r"\d\d" -_MATCH_3 = r"\d{3}" -_MATCH_4 = r"\d{4}" -_MATCH_6 = r"[+-]?\d{6}" -_MATCH_1_TO_2 = r"\d\d?" -_MATCH_1_TO_2_LEFT_PAD = r"[0-9 ]\d?" -_MATCH_1_TO_3 = r"\d{1,3}" -_MATCH_1_TO_4 = r"\d{1,4}" -_MATCH_1_TO_6 = r"[+-]?\d{1,6}" -_MATCH_3_TO_4 = r"\d{3}\d?" -_MATCH_5_TO_6 = r"\d{5}\d?" -_MATCH_UNSIGNED = r"\d+" -_MATCH_SIGNED = r"[+-]?\d+" -_MATCH_OFFSET = r"[Zz]|[+-]\d\d:?\d\d" -_MATCH_SHORT_OFFSET = r"[Zz]|[+-]\d\d(?::?\d\d)?" -_MATCH_TIMESTAMP = r"[+-]?\d+(\.\d{1,6})?" -_MATCH_WORD = ( - "(?i)[0-9]*" - "['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+" - r"|[\u0600-\u06FF/]+(\s*?[\u0600-\u06FF]+){1,2}" -) -_MATCH_TIMEZONE = "[A-Za-z0-9-+]+(/[A-Za-z0-9-+_]+)?" - - -class Formatter: - - _TOKENS = ( - r"\[([^\[]*)\]|\\(.)|" - "(" - "Mo|MM?M?M?" - "|Do|DDDo|DD?D?D?|ddd?d?|do?" - "|E{1,4}" - "|w[o|w]?|W[o|W]?|Qo?" - "|YYYY|YY|Y" - "|gg(ggg?)?|GG(GGG?)?" - "|a|A" - "|hh?|HH?|kk?" - "|mm?|ss?|S{1,9}" - "|x|X" - "|zz?|ZZ?" - "|LTS|LT|LL?L?L?" - ")" - ) - - _FORMAT_RE = re.compile(_TOKENS) - - _FROM_FORMAT_RE = re.compile(r"(?<!\\\[)" + _TOKENS + r"(?!\\\])") - - _LOCALIZABLE_TOKENS = { - "Qo": None, - "MMMM": "months.wide", - "MMM": "months.abbreviated", - "Mo": None, - "DDDo": None, - "Do": lambda locale: tuple( - r"\d+{}".format(o) for o in locale.get("custom.ordinal").values() - ), - "dddd": "days.wide", - "ddd": "days.abbreviated", - "dd": "days.short", - "do": None, - "Wo": None, - "wo": None, - "A": lambda locale: ( - locale.translation("day_periods.am"), - locale.translation("day_periods.pm"), - ), - "a": lambda locale: ( - locale.translation("day_periods.am").lower(), - locale.translation("day_periods.pm").lower(), - ), - } - - _TOKENS_RULES = { - # Year - "YYYY": lambda dt: "{:d}".format(dt.year), - "YY": lambda dt: "{:d}".format(dt.year)[2:], - "Y": lambda dt: "{:d}".format(dt.year), - # Quarter - "Q": lambda dt: "{:d}".format(dt.quarter), - # Month - "MM": lambda dt: "{:02d}".format(dt.month), - "M": lambda dt: "{:d}".format(dt.month), - # Day - "DD": lambda dt: "{:02d}".format(dt.day), - "D": lambda dt: "{:d}".format(dt.day), - # Day of Year - "DDDD": lambda dt: "{:03d}".format(dt.day_of_year), - "DDD": lambda dt: "{:d}".format(dt.day_of_year), - # Day of Week - "d": lambda dt: "{:d}".format(dt.day_of_week), - # Day of ISO Week - "E": lambda dt: "{:d}".format(dt.isoweekday()), - # Hour - "HH": lambda dt: "{:02d}".format(dt.hour), - "H": lambda dt: "{:d}".format(dt.hour), - "hh": lambda dt: "{:02d}".format(dt.hour % 12 or 12), - "h": lambda dt: "{:d}".format(dt.hour % 12 or 12), - # Minute - "mm": lambda dt: "{:02d}".format(dt.minute), - "m": lambda dt: "{:d}".format(dt.minute), - # Second - "ss": lambda dt: "{:02d}".format(dt.second), - "s": lambda dt: "{:d}".format(dt.second), - # Fractional second - "S": lambda dt: "{:01d}".format(dt.microsecond // 100000), - "SS": lambda dt: "{:02d}".format(dt.microsecond // 10000), - "SSS": lambda dt: "{:03d}".format(dt.microsecond // 1000), - "SSSS": lambda dt: "{:04d}".format(dt.microsecond // 100), - "SSSSS": lambda dt: "{:05d}".format(dt.microsecond // 10), - "SSSSSS": lambda dt: "{:06d}".format(dt.microsecond), - # Timestamp - "X": lambda dt: "{:d}".format(dt.int_timestamp), - "x": lambda dt: "{:d}".format(dt.int_timestamp * 1000 + dt.microsecond // 1000), - # Timezone - "zz": lambda dt: "{}".format(dt.tzname() if dt.tzinfo is not None else ""), - "z": lambda dt: "{}".format(dt.timezone_name or ""), - } - - _DATE_FORMATS = { - "LTS": "formats.time.full", - "LT": "formats.time.short", - "L": "formats.date.short", - "LL": "formats.date.long", - "LLL": "formats.datetime.long", - "LLLL": "formats.datetime.full", - } - - _DEFAULT_DATE_FORMATS = { - "LTS": "h:mm:ss A", - "LT": "h:mm A", - "L": "MM/DD/YYYY", - "LL": "MMMM D, YYYY", - "LLL": "MMMM D, YYYY h:mm A", - "LLLL": "dddd, MMMM D, YYYY h:mm A", - } - - _REGEX_TOKENS = { - "Y": _MATCH_SIGNED, - "YY": (_MATCH_1_TO_2, _MATCH_2), - "YYYY": (_MATCH_1_TO_4, _MATCH_4), - "Q": _MATCH_1, - "Qo": None, - "M": _MATCH_1_TO_2, - "MM": (_MATCH_1_TO_2, _MATCH_2), - "MMM": _MATCH_WORD, - "MMMM": _MATCH_WORD, - "D": _MATCH_1_TO_2, - "DD": (_MATCH_1_TO_2_LEFT_PAD, _MATCH_2), - "DDD": _MATCH_1_TO_3, - "DDDD": _MATCH_3, - "dddd": _MATCH_WORD, - "ddd": _MATCH_WORD, - "dd": _MATCH_WORD, - "d": _MATCH_1, - "E": _MATCH_1, - "Do": None, - "H": _MATCH_1_TO_2, - "HH": (_MATCH_1_TO_2, _MATCH_2), - "h": _MATCH_1_TO_2, - "hh": (_MATCH_1_TO_2, _MATCH_2), - "m": _MATCH_1_TO_2, - "mm": (_MATCH_1_TO_2, _MATCH_2), - "s": _MATCH_1_TO_2, - "ss": (_MATCH_1_TO_2, _MATCH_2), - "S": (_MATCH_1_TO_3, _MATCH_1), - "SS": (_MATCH_1_TO_3, _MATCH_2), - "SSS": (_MATCH_1_TO_3, _MATCH_3), - "SSSS": _MATCH_UNSIGNED, - "SSSSS": _MATCH_UNSIGNED, - "SSSSSS": _MATCH_UNSIGNED, - "x": _MATCH_SIGNED, - "X": _MATCH_TIMESTAMP, - "ZZ": _MATCH_SHORT_OFFSET, - "Z": _MATCH_OFFSET, - "z": _MATCH_TIMEZONE, - } - - _PARSE_TOKENS = { - "YYYY": lambda year: int(year), - "YY": lambda year: int(year), - "Q": lambda quarter: int(quarter), - "MMMM": lambda month: month, - "MMM": lambda month: month, - "MM": lambda month: int(month), - "M": lambda month: int(month), - "DDDD": lambda day: int(day), - "DDD": lambda day: int(day), - "DD": lambda day: int(day), - "D": lambda day: int(day), - "dddd": lambda weekday: weekday, - "ddd": lambda weekday: weekday, - "dd": lambda weekday: weekday, - "d": lambda weekday: int(weekday) % 7, - "E": lambda weekday: int(weekday), - "HH": lambda hour: int(hour), - "H": lambda hour: int(hour), - "hh": lambda hour: int(hour), - "h": lambda hour: int(hour), - "mm": lambda minute: int(minute), - "m": lambda minute: int(minute), - "ss": lambda second: int(second), - "s": lambda second: int(second), - "S": lambda us: int(us) * 100000, - "SS": lambda us: int(us) * 10000, - "SSS": lambda us: int(us) * 1000, - "SSSS": lambda us: int(us) * 100, - "SSSSS": lambda us: int(us) * 10, - "SSSSSS": lambda us: int(us), - "a": lambda meridiem: meridiem, - "X": lambda ts: float(ts), - "x": lambda ts: float(ts) / 1e3, - "ZZ": str, - "Z": str, - "z": str, - } - - def format( - self, dt, fmt, locale=None - ): # type: (pendulum.DateTime, str, typing.Optional[typing.Union[str, Locale]]) -> str - """ - Formats a DateTime instance with a given format and locale. - - :param dt: The instance to format - :type dt: pendulum.DateTime - - :param fmt: The format to use - :type fmt: str - - :param locale: The locale to use - :type locale: str or Locale or None - - :rtype: str - """ - if not locale: - locale = pendulum.get_locale() - - locale = Locale.load(locale) - - result = self._FORMAT_RE.sub( - lambda m: m.group(1) - if m.group(1) - else m.group(2) - if m.group(2) - else self._format_token(dt, m.group(3), locale), - fmt, - ) - - return decode(result) - - def _format_token( - self, dt, token, locale - ): # type: (pendulum.DateTime, str, Locale) -> str - """ - Formats a DateTime instance with a given token and locale. - - :param dt: The instance to format - :type dt: pendulum.DateTime - - :param token: The token to use - :type token: str - - :param locale: The locale to use - :type locale: Locale - - :rtype: str - """ - if token in self._DATE_FORMATS: - fmt = locale.get("custom.date_formats.{}".format(token)) - if fmt is None: - fmt = self._DEFAULT_DATE_FORMATS[token] - - return self.format(dt, fmt, locale) - - if token in self._LOCALIZABLE_TOKENS: - return self._format_localizable_token(dt, token, locale) - - if token in self._TOKENS_RULES: - return self._TOKENS_RULES[token](dt) - - # Timezone - if token in ["ZZ", "Z"]: - if dt.tzinfo is None: - return "" - - separator = ":" if token == "Z" else "" - offset = dt.utcoffset() or datetime.timedelta() - minutes = offset.total_seconds() / 60 - - if minutes >= 0: - sign = "+" - else: - sign = "-" - - hour, minute = divmod(abs(int(minutes)), 60) - - return "{}{:02d}{}{:02d}".format(sign, hour, separator, minute) - - def _format_localizable_token( - self, dt, token, locale - ): # type: (pendulum.DateTime, str, Locale) -> str - """ - Formats a DateTime instance - with a given localizable token and locale. - - :param dt: The instance to format - :type dt: pendulum.DateTime - - :param token: The token to use - :type token: str - - :param locale: The locale to use - :type locale: Locale - - :rtype: str - """ - if token == "MMM": - return locale.get("translations.months.abbreviated")[dt.month] - elif token == "MMMM": - return locale.get("translations.months.wide")[dt.month] - elif token == "dd": - return locale.get("translations.days.short")[dt.day_of_week] - elif token == "ddd": - return locale.get("translations.days.abbreviated")[dt.day_of_week] - elif token == "dddd": - return locale.get("translations.days.wide")[dt.day_of_week] - elif token == "Do": - return locale.ordinalize(dt.day) - elif token == "do": - return locale.ordinalize(dt.day_of_week) - elif token == "Mo": - return locale.ordinalize(dt.month) - elif token == "Qo": - return locale.ordinalize(dt.quarter) - elif token == "wo": - return locale.ordinalize(dt.week_of_year) - elif token == "DDDo": - return locale.ordinalize(dt.day_of_year) - elif token == "A": - key = "translations.day_periods" - if dt.hour >= 12: - key += ".pm" - else: - key += ".am" - - return locale.get(key) - else: - return token - - def parse( - self, - time, # type: str - fmt, # type: str - now, # type: pendulum.DateTime - locale=None, # type: typing.Optional[str] - ): # type: (...) -> typing.Dict[str, typing.Any] - """ - Parses a time string matching a given format as a tuple. - - :param time: The timestring - :param fmt: The format - :param now: The datetime to use as "now" - :param locale: The locale to use - - :return: The parsed elements - """ - escaped_fmt = re.escape(fmt) - - tokens = self._FROM_FORMAT_RE.findall(escaped_fmt) - if not tokens: - return time - - if not locale: - locale = pendulum.get_locale() - - locale = Locale.load(locale) - - parsed = { - "year": None, - "month": None, - "day": None, - "hour": None, - "minute": None, - "second": None, - "microsecond": None, - "tz": None, - "quarter": None, - "day_of_week": None, - "day_of_year": None, - "meridiem": None, - "timestamp": None, - } - - pattern = self._FROM_FORMAT_RE.sub( - lambda m: self._replace_tokens(m.group(0), locale), escaped_fmt - ) - - if not re.search("^" + pattern + "$", time): - raise ValueError("String does not match format {}".format(fmt)) - - re.sub(pattern, lambda m: self._get_parsed_values(m, parsed, locale, now), time) - - return self._check_parsed(parsed, now) - - def _check_parsed( - self, parsed, now - ): # type: (typing.Dict[str, typing.Any], pendulum.DateTime) -> typing.Dict[str, typing.Any] - """ - Checks validity of parsed elements. - - :param parsed: The elements to parse. - - :return: The validated elements. - """ - validated = { - "year": parsed["year"], - "month": parsed["month"], - "day": parsed["day"], - "hour": parsed["hour"], - "minute": parsed["minute"], - "second": parsed["second"], - "microsecond": parsed["microsecond"], - "tz": None, - } - - # If timestamp has been specified - # we use it and don't go any further - if parsed["timestamp"] is not None: - str_us = str(parsed["timestamp"]) - if "." in str_us: - microseconds = int("{}".format(str_us.split(".")[1].ljust(6, "0"))) - else: - microseconds = 0 - - from pendulum.helpers import local_time - - time = local_time(parsed["timestamp"], 0, microseconds) - validated["year"] = time[0] - validated["month"] = time[1] - validated["day"] = time[2] - validated["hour"] = time[3] - validated["minute"] = time[4] - validated["second"] = time[5] - validated["microsecond"] = time[6] - - return validated - - if parsed["quarter"] is not None: - if validated["year"] is not None: - dt = pendulum.datetime(validated["year"], 1, 1) - else: - dt = now - - dt = dt.start_of("year") - - while dt.quarter != parsed["quarter"]: - dt = dt.add(months=3) - - validated["year"] = dt.year - validated["month"] = dt.month - validated["day"] = dt.day - - if validated["year"] is None: - validated["year"] = now.year - - if parsed["day_of_year"] is not None: - dt = pendulum.parse( - "{}-{:>03d}".format(validated["year"], parsed["day_of_year"]) - ) - - validated["month"] = dt.month - validated["day"] = dt.day - - if parsed["day_of_week"] is not None: - dt = pendulum.datetime( - validated["year"], - validated["month"] or now.month, - validated["day"] or now.day, - ) - dt = dt.start_of("week").subtract(days=1) - dt = dt.next(parsed["day_of_week"]) - validated["year"] = dt.year - validated["month"] = dt.month - validated["day"] = dt.day - - # Meridiem - if parsed["meridiem"] is not None: - # If the time is greater than 13:00:00 - # This is not valid - if validated["hour"] is None: - raise ValueError("Invalid Date") - - t = ( - validated["hour"], - validated["minute"], - validated["second"], - validated["microsecond"], - ) - if t >= (13, 0, 0, 0): - raise ValueError("Invalid date") - - pm = parsed["meridiem"] == "pm" - validated["hour"] %= 12 - if pm: - validated["hour"] += 12 - - if validated["month"] is None: - if parsed["year"] is not None: - validated["month"] = parsed["month"] or 1 - else: - validated["month"] = parsed["month"] or now.month - - if validated["day"] is None: - if parsed["year"] is not None or parsed["month"] is not None: - validated["day"] = parsed["day"] or 1 - else: - validated["day"] = parsed["day"] or now.day - - for part in ["hour", "minute", "second", "microsecond"]: - if validated[part] is None: - validated[part] = 0 - - validated["tz"] = parsed["tz"] - - return validated - - def _get_parsed_values( - self, m, parsed, locale, now - ): # type: (typing.Match[str], typing.Dict[str, typing.Any], Locale, pendulum.DateTime) -> None - for token, index in m.re.groupindex.items(): - if token in self._LOCALIZABLE_TOKENS: - self._get_parsed_locale_value(token, m.group(index), parsed, locale) - else: - self._get_parsed_value(token, m.group(index), parsed, now) - - def _get_parsed_value( - self, token, value, parsed, now - ): # type: (str, str, typing.Dict[str, typing.Any], pendulum.DateTime) -> None - parsed_token = self._PARSE_TOKENS[token](value) - - if "Y" in token: - if token == "YY": - parsed_token = now.year // 100 * 100 + parsed_token - - parsed["year"] = parsed_token - elif "Q" == token: - parsed["quarter"] = parsed_token - elif token in ["MM", "M"]: - parsed["month"] = parsed_token - elif token in ["DDDD", "DDD"]: - parsed["day_of_year"] = parsed_token - elif "D" in token: - parsed["day"] = parsed_token - elif "H" in token: - parsed["hour"] = parsed_token - elif token in ["hh", "h"]: - if parsed_token > 12: - raise ValueError("Invalid date") - - parsed["hour"] = parsed_token - elif "m" in token: - parsed["minute"] = parsed_token - elif "s" in token: - parsed["second"] = parsed_token - elif "S" in token: - parsed["microsecond"] = parsed_token - elif token in ["d", "E"]: - parsed["day_of_week"] = parsed_token - elif token in ["X", "x"]: - parsed["timestamp"] = parsed_token - elif token in ["ZZ", "Z"]: - negative = True if value.startswith("-") else False - tz = value[1:] - if ":" not in tz: - if len(tz) == 2: - tz = "{}00".format(tz) - - off_hour = tz[0:2] - off_minute = tz[2:4] - else: - off_hour, off_minute = tz.split(":") - - offset = ((int(off_hour) * 60) + int(off_minute)) * 60 - - if negative: - offset = -1 * offset - - parsed["tz"] = pendulum.timezone(offset) - elif token == "z": - # Full timezone - if value not in pendulum.timezones: - raise ValueError("Invalid date") - - parsed["tz"] = pendulum.timezone(value) - - def _get_parsed_locale_value( - self, token, value, parsed, locale - ): # type: (str, str, typing.Dict[str, typing.Any], Locale) -> None - if token == "MMMM": - unit = "month" - match = "months.wide" - elif token == "MMM": - unit = "month" - match = "months.abbreviated" - elif token == "Do": - parsed["day"] = int(re.match(r"(\d+)", value).group(1)) - - return - elif token == "dddd": - unit = "day_of_week" - match = "days.wide" - elif token == "ddd": - unit = "day_of_week" - match = "days.abbreviated" - elif token == "dd": - unit = "day_of_week" - match = "days.short" - elif token in ["a", "A"]: - valid_values = [ - locale.translation("day_periods.am"), - locale.translation("day_periods.pm"), - ] - - if token == "a": - value = value.lower() - valid_values = list(map(lambda x: x.lower(), valid_values)) - - if value not in valid_values: - raise ValueError("Invalid date") - - parsed["meridiem"] = ["am", "pm"][valid_values.index(value)] - - return - else: - raise ValueError('Invalid token "{}"'.format(token)) - - parsed[unit] = locale.match_translation(match, value) - if value is None: - raise ValueError("Invalid date") - - def _replace_tokens(self, token, locale): # type: (str, Locale) -> str - if token.startswith("[") and token.endswith("]"): - return token[1:-1] - elif token.startswith("\\"): - if len(token) == 2 and token[1] in {"[", "]"}: - return "" - - return token - elif token not in self._REGEX_TOKENS and token not in self._LOCALIZABLE_TOKENS: - raise ValueError("Unsupported token: {}".format(token)) - - if token in self._LOCALIZABLE_TOKENS: - values = self._LOCALIZABLE_TOKENS[token] - if callable(values): - candidates = values(locale) - else: - candidates = tuple( - locale.translation(self._LOCALIZABLE_TOKENS[token]).values() - ) - else: - candidates = self._REGEX_TOKENS[token] - - if not candidates: - raise ValueError("Unsupported token: {}".format(token)) - - if not isinstance(candidates, tuple): - candidates = (candidates,) - - pattern = "(?P<{}>{})".format(token, "|".join([decode(p) for p in candidates])) - - return pattern diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/helpers.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/helpers.py deleted file mode 100644 index f149ca55..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/helpers.py +++ /dev/null @@ -1,224 +0,0 @@ -from __future__ import absolute_import - -import os -import struct - -from contextlib import contextmanager -from datetime import date -from datetime import datetime -from datetime import timedelta -from math import copysign -from typing import TYPE_CHECKING -from typing import Iterator -from typing import Optional -from typing import TypeVar -from typing import overload - -import pendulum - -from .constants import DAYS_PER_MONTHS -from .formatting.difference_formatter import DifferenceFormatter -from .locales.locale import Locale - - -if TYPE_CHECKING: - # Prevent import cycles - from .period import Period - -with_extensions = os.getenv("PENDULUM_EXTENSIONS", "1") == "1" - -_DT = TypeVar("_DT", bound=datetime) -_D = TypeVar("_D", bound=date) - -try: - if not with_extensions or struct.calcsize("P") == 4: - raise ImportError() - - from ._extensions._helpers import local_time - from ._extensions._helpers import precise_diff - from ._extensions._helpers import is_leap - from ._extensions._helpers import is_long_year - from ._extensions._helpers import week_day - from ._extensions._helpers import days_in_year - from ._extensions._helpers import timestamp -except ImportError: - from ._extensions.helpers import local_time # noqa - from ._extensions.helpers import precise_diff # noqa - from ._extensions.helpers import is_leap # noqa - from ._extensions.helpers import is_long_year # noqa - from ._extensions.helpers import week_day # noqa - from ._extensions.helpers import days_in_year # noqa - from ._extensions.helpers import timestamp # noqa - - -difference_formatter = DifferenceFormatter() - - -@overload -def add_duration( - dt, # type: _DT - years=0, # type: int - months=0, # type: int - weeks=0, # type: int - days=0, # type: int - hours=0, # type: int - minutes=0, # type: int - seconds=0, # type: int - microseconds=0, # type: int -): # type: (...) -> _DT - pass - - -@overload -def add_duration( - dt, # type: _D - years=0, # type: int - months=0, # type: int - weeks=0, # type: int - days=0, # type: int -): # type: (...) -> _D - pass - - -def add_duration( - dt, - years=0, - months=0, - weeks=0, - days=0, - hours=0, - minutes=0, - seconds=0, - microseconds=0, -): - """ - Adds a duration to a date/datetime instance. - """ - days += weeks * 7 - - if ( - isinstance(dt, date) - and not isinstance(dt, datetime) - and any([hours, minutes, seconds, microseconds]) - ): - raise RuntimeError("Time elements cannot be added to a date instance.") - - # Normalizing - if abs(microseconds) > 999999: - s = _sign(microseconds) - div, mod = divmod(microseconds * s, 1000000) - microseconds = mod * s - seconds += div * s - - if abs(seconds) > 59: - s = _sign(seconds) - div, mod = divmod(seconds * s, 60) - seconds = mod * s - minutes += div * s - - if abs(minutes) > 59: - s = _sign(minutes) - div, mod = divmod(minutes * s, 60) - minutes = mod * s - hours += div * s - - if abs(hours) > 23: - s = _sign(hours) - div, mod = divmod(hours * s, 24) - hours = mod * s - days += div * s - - if abs(months) > 11: - s = _sign(months) - div, mod = divmod(months * s, 12) - months = mod * s - years += div * s - - year = dt.year + years - month = dt.month - - if months: - month += months - if month > 12: - year += 1 - month -= 12 - elif month < 1: - year -= 1 - month += 12 - - day = min(DAYS_PER_MONTHS[int(is_leap(year))][month], dt.day) - - dt = dt.replace(year=year, month=month, day=day) - - return dt + timedelta( - days=days, - hours=hours, - minutes=minutes, - seconds=seconds, - microseconds=microseconds, - ) - - -def format_diff( - diff, is_now=True, absolute=False, locale=None -): # type: (Period, bool, bool, Optional[str]) -> str - if locale is None: - locale = get_locale() - - return difference_formatter.format(diff, is_now, absolute, locale) - - -def _sign(x): - return int(copysign(1, x)) - - -# Global helpers - - -@contextmanager -def test(mock): # type: (pendulum.DateTime) -> Iterator[None] - set_test_now(mock) - try: - yield - finally: - set_test_now() - - -def set_test_now(test_now=None): # type: (Optional[pendulum.DateTime]) -> None - pendulum._TEST_NOW = test_now - - -def get_test_now(): # type: () -> Optional[pendulum.DateTime] - return pendulum._TEST_NOW - - -def has_test_now(): # type: () -> bool - return pendulum._TEST_NOW is not None - - -def locale(name): # type: (str) -> Locale - return Locale.load(name) - - -def set_locale(name): # type: (str) -> None - locale(name) - - pendulum._LOCALE = name - - -def get_locale(): # type: () -> str - return pendulum._LOCALE - - -def week_starts_at(wday): # type: (int) -> None - if wday < pendulum.SUNDAY or wday > pendulum.SATURDAY: - raise ValueError("Invalid week day as start of week.") - - pendulum._WEEK_STARTS_AT = wday - - -def week_ends_at(wday): # type: (int) -> None - if wday < pendulum.SUNDAY or wday > pendulum.SATURDAY: - raise ValueError("Invalid week day as start of week.") - - pendulum._WEEK_ENDS_AT = wday diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/__init__.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/__pycache__/__init__.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 202d7440..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/__pycache__/locale.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/__pycache__/locale.cpython-311.pyc deleted file mode 100644 index 377f9a8c..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/__pycache__/locale.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/da/__init__.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/da/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/da/__pycache__/__init__.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/da/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 4421285b..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/da/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/da/__pycache__/custom.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/da/__pycache__/custom.cpython-311.pyc deleted file mode 100644 index 403f5e59..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/da/__pycache__/custom.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/da/__pycache__/locale.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/da/__pycache__/locale.cpython-311.pyc deleted file mode 100644 index 31acc6c0..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/da/__pycache__/locale.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/da/custom.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/da/custom.py deleted file mode 100644 index 258e47b5..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/da/custom.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - - -""" -da custom locale file. -""" - -translations = { - # Relative time - "after": "{0} efter", - "before": "{0} før", - # Date formats - "date_formats": { - "LTS": "HH:mm:ss", - "LT": "HH:mm", - "LLLL": "dddd [d.] D. MMMM YYYY HH:mm", - "LLL": "D. MMMM YYYY HH:mm", - "LL": "D. MMMM YYYY", - "L": "DD/MM/YYYY", - }, -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/da/locale.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/da/locale.py deleted file mode 100644 index b829e34c..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/da/locale.py +++ /dev/null @@ -1,150 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from .custom import translations as custom_translations - - -""" -da locale file. - -It has been generated automatically and must not be modified directly. -""" - - -locale = { - "plural": lambda n: "one" - if ( - (n == n and ((n == 1))) - or ((not (0 == 0 and ((0 == 0)))) and (n == n and ((n == 0) or (n == 1)))) - ) - else "other", - "ordinal": lambda n: "other", - "translations": { - "days": { - "abbreviated": { - 0: "søn.", - 1: "man.", - 2: "tir.", - 3: "ons.", - 4: "tor.", - 5: "fre.", - 6: "lør.", - }, - "narrow": {0: "S", 1: "M", 2: "T", 3: "O", 4: "T", 5: "F", 6: "L"}, - "short": {0: "sø", 1: "ma", 2: "ti", 3: "on", 4: "to", 5: "fr", 6: "lø"}, - "wide": { - 0: "søndag", - 1: "mandag", - 2: "tirsdag", - 3: "onsdag", - 4: "torsdag", - 5: "fredag", - 6: "lørdag", - }, - }, - "months": { - "abbreviated": { - 1: "jan.", - 2: "feb.", - 3: "mar.", - 4: "apr.", - 5: "maj", - 6: "jun.", - 7: "jul.", - 8: "aug.", - 9: "sep.", - 10: "okt.", - 11: "nov.", - 12: "dec.", - }, - "narrow": { - 1: "J", - 2: "F", - 3: "M", - 4: "A", - 5: "M", - 6: "J", - 7: "J", - 8: "A", - 9: "S", - 10: "O", - 11: "N", - 12: "D", - }, - "wide": { - 1: "januar", - 2: "februar", - 3: "marts", - 4: "april", - 5: "maj", - 6: "juni", - 7: "juli", - 8: "august", - 9: "september", - 10: "oktober", - 11: "november", - 12: "december", - }, - }, - "units": { - "year": {"one": "{0} år", "other": "{0} år"}, - "month": {"one": "{0} måned", "other": "{0} måneder"}, - "week": {"one": "{0} uge", "other": "{0} uger"}, - "day": {"one": "{0} dag", "other": "{0} dage"}, - "hour": {"one": "{0} time", "other": "{0} timer"}, - "minute": {"one": "{0} minut", "other": "{0} minutter"}, - "second": {"one": "{0} sekund", "other": "{0} sekunder"}, - "microsecond": {"one": "{0} mikrosekund", "other": "{0} mikrosekunder"}, - }, - "relative": { - "year": { - "future": {"other": "om {0} år", "one": "om {0} år"}, - "past": {"other": "for {0} år siden", "one": "for {0} år siden"}, - }, - "month": { - "future": {"other": "om {0} måneder", "one": "om {0} måned"}, - "past": { - "other": "for {0} måneder siden", - "one": "for {0} måned siden", - }, - }, - "week": { - "future": {"other": "om {0} uger", "one": "om {0} uge"}, - "past": {"other": "for {0} uger siden", "one": "for {0} uge siden"}, - }, - "day": { - "future": {"other": "om {0} dage", "one": "om {0} dag"}, - "past": {"other": "for {0} dage siden", "one": "for {0} dag siden"}, - }, - "hour": { - "future": {"other": "om {0} timer", "one": "om {0} time"}, - "past": {"other": "for {0} timer siden", "one": "for {0} time siden"}, - }, - "minute": { - "future": {"other": "om {0} minutter", "one": "om {0} minut"}, - "past": { - "other": "for {0} minutter siden", - "one": "for {0} minut siden", - }, - }, - "second": { - "future": {"other": "om {0} sekunder", "one": "om {0} sekund"}, - "past": { - "other": "for {0} sekunder siden", - "one": "for {0} sekund siden", - }, - }, - }, - "day_periods": { - "midnight": "midnat", - "am": "AM", - "pm": "PM", - "morning1": "om morgenen", - "morning2": "om formiddagen", - "afternoon1": "om eftermiddagen", - "evening1": "om aftenen", - "night1": "om natten", - }, - }, - "custom": custom_translations, -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/de/__init__.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/de/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/de/__pycache__/__init__.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/de/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 93db3935..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/de/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/de/__pycache__/custom.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/de/__pycache__/custom.cpython-311.pyc deleted file mode 100644 index d6fb4fd9..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/de/__pycache__/custom.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/de/__pycache__/locale.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/de/__pycache__/locale.cpython-311.pyc deleted file mode 100644 index 0e045bbd..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/de/__pycache__/locale.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/de/custom.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/de/custom.py deleted file mode 100644 index 3024f0b2..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/de/custom.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - - -""" -de custom locale file. -""" - -translations = { - # Relative time - "after": "{0} später", - "before": "{0} zuvor", - "units_relative": { - "year": { - "future": {"one": "{0} Jahr", "other": "{0} Jahren"}, - "past": {"one": "{0} Jahr", "other": "{0} Jahren"}, - }, - "month": { - "future": {"one": "{0} Monat", "other": "{0} Monaten"}, - "past": {"one": "{0} Monat", "other": "{0} Monaten"}, - }, - "week": { - "future": {"one": "{0} Woche", "other": "{0} Wochen"}, - "past": {"one": "{0} Woche", "other": "{0} Wochen"}, - }, - "day": { - "future": {"one": "{0} Tag", "other": "{0} Tagen"}, - "past": {"one": "{0} Tag", "other": "{0} Tagen"}, - }, - }, - # Date formats - "date_formats": { - "LTS": "HH:mm:ss", - "LT": "HH:mm", - "LLLL": "dddd, D. MMMM YYYY HH:mm", - "LLL": "D. MMMM YYYY HH:mm", - "LL": "D. MMMM YYYY", - "L": "DD.MM.YYYY", - }, -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/de/locale.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/de/locale.py deleted file mode 100644 index b180fc56..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/de/locale.py +++ /dev/null @@ -1,147 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from .custom import translations as custom_translations - - -""" -de locale file. - -It has been generated automatically and must not be modified directly. -""" - - -locale = { - "plural": lambda n: "one" - if ((n == n and ((n == 1))) and (0 == 0 and ((0 == 0)))) - else "other", - "ordinal": lambda n: "other", - "translations": { - "days": { - "abbreviated": { - 0: "So.", - 1: "Mo.", - 2: "Di.", - 3: "Mi.", - 4: "Do.", - 5: "Fr.", - 6: "Sa.", - }, - "narrow": {0: "S", 1: "M", 2: "D", 3: "M", 4: "D", 5: "F", 6: "S"}, - "short": { - 0: "So.", - 1: "Mo.", - 2: "Di.", - 3: "Mi.", - 4: "Do.", - 5: "Fr.", - 6: "Sa.", - }, - "wide": { - 0: "Sonntag", - 1: "Montag", - 2: "Dienstag", - 3: "Mittwoch", - 4: "Donnerstag", - 5: "Freitag", - 6: "Samstag", - }, - }, - "months": { - "abbreviated": { - 1: "Jan.", - 2: "Feb.", - 3: "März", - 4: "Apr.", - 5: "Mai", - 6: "Juni", - 7: "Juli", - 8: "Aug.", - 9: "Sep.", - 10: "Okt.", - 11: "Nov.", - 12: "Dez.", - }, - "narrow": { - 1: "J", - 2: "F", - 3: "M", - 4: "A", - 5: "M", - 6: "J", - 7: "J", - 8: "A", - 9: "S", - 10: "O", - 11: "N", - 12: "D", - }, - "wide": { - 1: "Januar", - 2: "Februar", - 3: "März", - 4: "April", - 5: "Mai", - 6: "Juni", - 7: "Juli", - 8: "August", - 9: "September", - 10: "Oktober", - 11: "November", - 12: "Dezember", - }, - }, - "units": { - "year": {"one": "{0} Jahr", "other": "{0} Jahre"}, - "month": {"one": "{0} Monat", "other": "{0} Monate"}, - "week": {"one": "{0} Woche", "other": "{0} Wochen"}, - "day": {"one": "{0} Tag", "other": "{0} Tage"}, - "hour": {"one": "{0} Stunde", "other": "{0} Stunden"}, - "minute": {"one": "{0} Minute", "other": "{0} Minuten"}, - "second": {"one": "{0} Sekunde", "other": "{0} Sekunden"}, - "microsecond": {"one": "{0} Mikrosekunde", "other": "{0} Mikrosekunden"}, - }, - "relative": { - "year": { - "future": {"other": "in {0} Jahren", "one": "in {0} Jahr"}, - "past": {"other": "vor {0} Jahren", "one": "vor {0} Jahr"}, - }, - "month": { - "future": {"other": "in {0} Monaten", "one": "in {0} Monat"}, - "past": {"other": "vor {0} Monaten", "one": "vor {0} Monat"}, - }, - "week": { - "future": {"other": "in {0} Wochen", "one": "in {0} Woche"}, - "past": {"other": "vor {0} Wochen", "one": "vor {0} Woche"}, - }, - "day": { - "future": {"other": "in {0} Tagen", "one": "in {0} Tag"}, - "past": {"other": "vor {0} Tagen", "one": "vor {0} Tag"}, - }, - "hour": { - "future": {"other": "in {0} Stunden", "one": "in {0} Stunde"}, - "past": {"other": "vor {0} Stunden", "one": "vor {0} Stunde"}, - }, - "minute": { - "future": {"other": "in {0} Minuten", "one": "in {0} Minute"}, - "past": {"other": "vor {0} Minuten", "one": "vor {0} Minute"}, - }, - "second": { - "future": {"other": "in {0} Sekunden", "one": "in {0} Sekunde"}, - "past": {"other": "vor {0} Sekunden", "one": "vor {0} Sekunde"}, - }, - }, - "day_periods": { - "midnight": "Mitternacht", - "am": "vorm.", - "pm": "nachm.", - "morning1": "morgens", - "morning2": "vormittags", - "afternoon1": "mittags", - "afternoon2": "nachmittags", - "evening1": "abends", - "night1": "nachts", - }, - }, - "custom": custom_translations, -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/en/__init__.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/en/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/en/__pycache__/__init__.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/en/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 27ad3e8d..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/en/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/en/__pycache__/custom.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/en/__pycache__/custom.cpython-311.pyc deleted file mode 100644 index 537d3e05..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/en/__pycache__/custom.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/en/__pycache__/locale.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/en/__pycache__/locale.cpython-311.pyc deleted file mode 100644 index 3f4bd8a5..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/en/__pycache__/locale.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/en/custom.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/en/custom.py deleted file mode 100644 index de224e04..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/en/custom.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - - -""" -en custom locale file. -""" - -translations = { - "units": {"few_second": "a few seconds"}, - # Relative time - "ago": "{} ago", - "from_now": "in {}", - "after": "{0} after", - "before": "{0} before", - # Ordinals - "ordinal": {"one": "st", "two": "nd", "few": "rd", "other": "th"}, - # Date formats - "date_formats": { - "LTS": "h:mm:ss A", - "LT": "h:mm A", - "L": "MM/DD/YYYY", - "LL": "MMMM D, YYYY", - "LLL": "MMMM D, YYYY h:mm A", - "LLLL": "dddd, MMMM D, YYYY h:mm A", - }, -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/en/locale.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/en/locale.py deleted file mode 100644 index acee4d2b..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/en/locale.py +++ /dev/null @@ -1,153 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from .custom import translations as custom_translations - - -""" -en locale file. - -It has been generated automatically and must not be modified directly. -""" - - -locale = { - "plural": lambda n: "one" - if ((n == n and ((n == 1))) and (0 == 0 and ((0 == 0)))) - else "other", - "ordinal": lambda n: "few" - if ( - ((n % 10) == (n % 10) and (((n % 10) == 3))) - and (not ((n % 100) == (n % 100) and (((n % 100) == 13)))) - ) - else "one" - if ( - ((n % 10) == (n % 10) and (((n % 10) == 1))) - and (not ((n % 100) == (n % 100) and (((n % 100) == 11)))) - ) - else "two" - if ( - ((n % 10) == (n % 10) and (((n % 10) == 2))) - and (not ((n % 100) == (n % 100) and (((n % 100) == 12)))) - ) - else "other", - "translations": { - "days": { - "abbreviated": { - 0: "Sun", - 1: "Mon", - 2: "Tue", - 3: "Wed", - 4: "Thu", - 5: "Fri", - 6: "Sat", - }, - "narrow": {0: "S", 1: "M", 2: "T", 3: "W", 4: "T", 5: "F", 6: "S"}, - "short": {0: "Su", 1: "Mo", 2: "Tu", 3: "We", 4: "Th", 5: "Fr", 6: "Sa"}, - "wide": { - 0: "Sunday", - 1: "Monday", - 2: "Tuesday", - 3: "Wednesday", - 4: "Thursday", - 5: "Friday", - 6: "Saturday", - }, - }, - "months": { - "abbreviated": { - 1: "Jan", - 2: "Feb", - 3: "Mar", - 4: "Apr", - 5: "May", - 6: "Jun", - 7: "Jul", - 8: "Aug", - 9: "Sep", - 10: "Oct", - 11: "Nov", - 12: "Dec", - }, - "narrow": { - 1: "J", - 2: "F", - 3: "M", - 4: "A", - 5: "M", - 6: "J", - 7: "J", - 8: "A", - 9: "S", - 10: "O", - 11: "N", - 12: "D", - }, - "wide": { - 1: "January", - 2: "February", - 3: "March", - 4: "April", - 5: "May", - 6: "June", - 7: "July", - 8: "August", - 9: "September", - 10: "October", - 11: "November", - 12: "December", - }, - }, - "units": { - "year": {"one": "{0} year", "other": "{0} years"}, - "month": {"one": "{0} month", "other": "{0} months"}, - "week": {"one": "{0} week", "other": "{0} weeks"}, - "day": {"one": "{0} day", "other": "{0} days"}, - "hour": {"one": "{0} hour", "other": "{0} hours"}, - "minute": {"one": "{0} minute", "other": "{0} minutes"}, - "second": {"one": "{0} second", "other": "{0} seconds"}, - "microsecond": {"one": "{0} microsecond", "other": "{0} microseconds"}, - }, - "relative": { - "year": { - "future": {"other": "in {0} years", "one": "in {0} year"}, - "past": {"other": "{0} years ago", "one": "{0} year ago"}, - }, - "month": { - "future": {"other": "in {0} months", "one": "in {0} month"}, - "past": {"other": "{0} months ago", "one": "{0} month ago"}, - }, - "week": { - "future": {"other": "in {0} weeks", "one": "in {0} week"}, - "past": {"other": "{0} weeks ago", "one": "{0} week ago"}, - }, - "day": { - "future": {"other": "in {0} days", "one": "in {0} day"}, - "past": {"other": "{0} days ago", "one": "{0} day ago"}, - }, - "hour": { - "future": {"other": "in {0} hours", "one": "in {0} hour"}, - "past": {"other": "{0} hours ago", "one": "{0} hour ago"}, - }, - "minute": { - "future": {"other": "in {0} minutes", "one": "in {0} minute"}, - "past": {"other": "{0} minutes ago", "one": "{0} minute ago"}, - }, - "second": { - "future": {"other": "in {0} seconds", "one": "in {0} second"}, - "past": {"other": "{0} seconds ago", "one": "{0} second ago"}, - }, - }, - "day_periods": { - "midnight": "midnight", - "am": "AM", - "noon": "noon", - "pm": "PM", - "morning1": "in the morning", - "afternoon1": "in the afternoon", - "evening1": "in the evening", - "night1": "at night", - }, - }, - "custom": custom_translations, -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/es/__init__.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/es/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/es/__pycache__/__init__.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/es/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 9e4d388a..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/es/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/es/__pycache__/custom.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/es/__pycache__/custom.cpython-311.pyc deleted file mode 100644 index bef22e96..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/es/__pycache__/custom.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/es/__pycache__/locale.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/es/__pycache__/locale.cpython-311.pyc deleted file mode 100644 index 5d78d593..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/es/__pycache__/locale.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/es/custom.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/es/custom.py deleted file mode 100644 index 5862f7e0..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/es/custom.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - - -""" -es custom locale file. -""" - -translations = { - "units": {"few_second": "unos segundos"}, - # Relative time - "ago": "hace {0}", - "from_now": "dentro de {0}", - "after": "{0} después", - "before": "{0} antes", - # Ordinals - "ordinal": {"other": "º"}, - # Date formats - "date_formats": { - "LTS": "H:mm:ss", - "LT": "H:mm", - "LLLL": "dddd, D [de] MMMM [de] YYYY H:mm", - "LLL": "D [de] MMMM [de] YYYY H:mm", - "LL": "D [de] MMMM [de] YYYY", - "L": "DD/MM/YYYY", - }, -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/es/locale.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/es/locale.py deleted file mode 100644 index f385e4ca..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/es/locale.py +++ /dev/null @@ -1,144 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from .custom import translations as custom_translations - - -""" -es locale file. - -It has been generated automatically and must not be modified directly. -""" - - -locale = { - "plural": lambda n: "one" if (n == n and ((n == 1))) else "other", - "ordinal": lambda n: "other", - "translations": { - "days": { - "abbreviated": { - 0: "dom.", - 1: "lun.", - 2: "mar.", - 3: "mié.", - 4: "jue.", - 5: "vie.", - 6: "sáb.", - }, - "narrow": {0: "D", 1: "L", 2: "M", 3: "X", 4: "J", 5: "V", 6: "S"}, - "short": {0: "DO", 1: "LU", 2: "MA", 3: "MI", 4: "JU", 5: "VI", 6: "SA"}, - "wide": { - 0: "domingo", - 1: "lunes", - 2: "martes", - 3: "miércoles", - 4: "jueves", - 5: "viernes", - 6: "sábado", - }, - }, - "months": { - "abbreviated": { - 1: "ene.", - 2: "feb.", - 3: "mar.", - 4: "abr.", - 5: "may.", - 6: "jun.", - 7: "jul.", - 8: "ago.", - 9: "sept.", - 10: "oct.", - 11: "nov.", - 12: "dic.", - }, - "narrow": { - 1: "E", - 2: "F", - 3: "M", - 4: "A", - 5: "M", - 6: "J", - 7: "J", - 8: "A", - 9: "S", - 10: "O", - 11: "N", - 12: "D", - }, - "wide": { - 1: "enero", - 2: "febrero", - 3: "marzo", - 4: "abril", - 5: "mayo", - 6: "junio", - 7: "julio", - 8: "agosto", - 9: "septiembre", - 10: "octubre", - 11: "noviembre", - 12: "diciembre", - }, - }, - "units": { - "year": {"one": "{0} año", "other": "{0} años"}, - "month": {"one": "{0} mes", "other": "{0} meses"}, - "week": {"one": "{0} semana", "other": "{0} semanas"}, - "day": {"one": "{0} día", "other": "{0} días"}, - "hour": {"one": "{0} hora", "other": "{0} horas"}, - "minute": {"one": "{0} minuto", "other": "{0} minutos"}, - "second": {"one": "{0} segundo", "other": "{0} segundos"}, - "microsecond": {"one": "{0} microsegundo", "other": "{0} microsegundos"}, - }, - "relative": { - "year": { - "future": {"other": "dentro de {0} años", "one": "dentro de {0} año"}, - "past": {"other": "hace {0} años", "one": "hace {0} año"}, - }, - "month": { - "future": {"other": "dentro de {0} meses", "one": "dentro de {0} mes"}, - "past": {"other": "hace {0} meses", "one": "hace {0} mes"}, - }, - "week": { - "future": { - "other": "dentro de {0} semanas", - "one": "dentro de {0} semana", - }, - "past": {"other": "hace {0} semanas", "one": "hace {0} semana"}, - }, - "day": { - "future": {"other": "dentro de {0} días", "one": "dentro de {0} día"}, - "past": {"other": "hace {0} días", "one": "hace {0} día"}, - }, - "hour": { - "future": {"other": "dentro de {0} horas", "one": "dentro de {0} hora"}, - "past": {"other": "hace {0} horas", "one": "hace {0} hora"}, - }, - "minute": { - "future": { - "other": "dentro de {0} minutos", - "one": "dentro de {0} minuto", - }, - "past": {"other": "hace {0} minutos", "one": "hace {0} minuto"}, - }, - "second": { - "future": { - "other": "dentro de {0} segundos", - "one": "dentro de {0} segundo", - }, - "past": {"other": "hace {0} segundos", "one": "hace {0} segundo"}, - }, - }, - "day_periods": { - "am": "a. m.", - "noon": "del mediodía", - "pm": "p. m.", - "morning1": "de la madrugada", - "morning2": "de la mañana", - "evening1": "de la tarde", - "night1": "de la noche", - }, - }, - "custom": custom_translations, -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fa/__init__.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fa/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fa/__pycache__/__init__.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fa/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 5debf145..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fa/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fa/__pycache__/custom.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fa/__pycache__/custom.cpython-311.pyc deleted file mode 100644 index 9ac4cde7..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fa/__pycache__/custom.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fa/__pycache__/locale.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fa/__pycache__/locale.cpython-311.pyc deleted file mode 100644 index bad2a5b9..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fa/__pycache__/locale.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fa/custom.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fa/custom.py deleted file mode 100644 index fa5a7c1c..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fa/custom.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - - -""" -fa custom locale file. -""" - -translations = { - # Relative time - "after": "{0} پس از", - "before": "{0} پیش از", - # Date formats - "date_formats": { - "LTS": "HH:mm:ss", - "LT": "HH:mm", - "LLLL": "dddd, D MMMM YYYY HH:mm", - "LLL": "D MMMM YYYY HH:mm", - "LL": "D MMMM YYYY", - "L": "DD/MM/YYYY", - }, -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fa/locale.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fa/locale.py deleted file mode 100644 index f18b0f66..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fa/locale.py +++ /dev/null @@ -1,138 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from .custom import translations as custom_translations - - -""" -fa locale file. - -It has been generated automatically and must not be modified directly. -""" - - -locale = { - "plural": lambda n: "one" - if ((n == n and ((n == 0))) or (n == n and ((n == 1)))) - else "other", - "ordinal": lambda n: "other", - "translations": { - "days": { - "abbreviated": { - 0: "یکشنبه", - 1: "دوشنبه", - 2: "سه\u200cشنبه", - 3: "چهارشنبه", - 4: "پنجشنبه", - 5: "جمعه", - 6: "شنبه", - }, - "narrow": {0: "ی", 1: "د", 2: "س", 3: "چ", 4: "پ", 5: "ج", 6: "ش"}, - "short": {0: "۱ش", 1: "۲ش", 2: "۳ش", 3: "۴ش", 4: "۵ش", 5: "ج", 6: "ش"}, - "wide": { - 0: "یکشنبه", - 1: "دوشنبه", - 2: "سه\u200cشنبه", - 3: "چهارشنبه", - 4: "پنجشنبه", - 5: "جمعه", - 6: "شنبه", - }, - }, - "months": { - "abbreviated": { - 1: "ژانویهٔ", - 2: "فوریهٔ", - 3: "مارس", - 4: "آوریل", - 5: "مهٔ", - 6: "ژوئن", - 7: "ژوئیهٔ", - 8: "اوت", - 9: "سپتامبر", - 10: "اکتبر", - 11: "نوامبر", - 12: "دسامبر", - }, - "narrow": { - 1: "ژ", - 2: "ف", - 3: "م", - 4: "آ", - 5: "م", - 6: "ژ", - 7: "ژ", - 8: "ا", - 9: "س", - 10: "ا", - 11: "ن", - 12: "د", - }, - "wide": { - 1: "ژانویهٔ", - 2: "فوریهٔ", - 3: "مارس", - 4: "آوریل", - 5: "مهٔ", - 6: "ژوئن", - 7: "ژوئیهٔ", - 8: "اوت", - 9: "سپتامبر", - 10: "اکتبر", - 11: "نوامبر", - 12: "دسامبر", - }, - }, - "units": { - "year": {"one": "{0} سال", "other": "{0} سال"}, - "month": {"one": "{0} ماه", "other": "{0} ماه"}, - "week": {"one": "{0} هفته", "other": "{0} هفته"}, - "day": {"one": "{0} روز", "other": "{0} روز"}, - "hour": {"one": "{0} ساعت", "other": "{0} ساعت"}, - "minute": {"one": "{0} دقیقه", "other": "{0} دقیقه"}, - "second": {"one": "{0} ثانیه", "other": "{0} ثانیه"}, - "microsecond": {"one": "{0} میکروثانیه", "other": "{0} میکروثانیه"}, - }, - "relative": { - "year": { - "future": {"other": "{0} سال بعد", "one": "{0} سال بعد"}, - "past": {"other": "{0} سال پیش", "one": "{0} سال پیش"}, - }, - "month": { - "future": {"other": "{0} ماه بعد", "one": "{0} ماه بعد"}, - "past": {"other": "{0} ماه پیش", "one": "{0} ماه پیش"}, - }, - "week": { - "future": {"other": "{0} هفته بعد", "one": "{0} هفته بعد"}, - "past": {"other": "{0} هفته پیش", "one": "{0} هفته پیش"}, - }, - "day": { - "future": {"other": "{0} روز بعد", "one": "{0} روز بعد"}, - "past": {"other": "{0} روز پیش", "one": "{0} روز پیش"}, - }, - "hour": { - "future": {"other": "{0} ساعت بعد", "one": "{0} ساعت بعد"}, - "past": {"other": "{0} ساعت پیش", "one": "{0} ساعت پیش"}, - }, - "minute": { - "future": {"other": "{0} دقیقه بعد", "one": "{0} دقیقه بعد"}, - "past": {"other": "{0} دقیقه پیش", "one": "{0} دقیقه پیش"}, - }, - "second": { - "future": {"other": "{0} ثانیه بعد", "one": "{0} ثانیه بعد"}, - "past": {"other": "{0} ثانیه پیش", "one": "{0} ثانیه پیش"}, - }, - }, - "day_periods": { - "midnight": "نیمه\u200cشب", - "am": "قبل\u200cازظهر", - "noon": "ظهر", - "pm": "بعدازظهر", - "morning1": "صبح", - "afternoon1": "عصر", - "evening1": "عصر", - "night1": "شب", - }, - }, - "custom": custom_translations, -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fo/__init__.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fo/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fo/__pycache__/__init__.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fo/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 6d7475af..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fo/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fo/__pycache__/custom.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fo/__pycache__/custom.cpython-311.pyc deleted file mode 100644 index 8a80cc9d..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fo/__pycache__/custom.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fo/__pycache__/locale.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fo/__pycache__/locale.cpython-311.pyc deleted file mode 100644 index 33d50184..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fo/__pycache__/locale.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fo/custom.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fo/custom.py deleted file mode 100644 index 946ab194..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fo/custom.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - - -""" -fo custom locale file. -""" - -translations = { - # Relative time - "after": "{0} aftaná", - "before": "{0} áðrenn", - # Ordinals - "ordinal": {"other": "."}, - # Date formats - "date_formats": { - "LTS": "HH:mm:ss", - "LT": "HH:mm", - "LLLL": "dddd D. MMMM, YYYY HH:mm", - "LLL": "D MMMM YYYY HH:mm", - "LL": "D MMMM YYYY", - "L": "DD/MM/YYYY", - }, -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fo/locale.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fo/locale.py deleted file mode 100644 index 345f5248..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fo/locale.py +++ /dev/null @@ -1,135 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from .custom import translations as custom_translations - - -""" -fo locale file. - -It has been generated automatically and must not be modified directly. -""" - - -locale = { - "plural": lambda n: "one" if (n == n and ((n == 1))) else "other", - "ordinal": lambda n: "other", - "translations": { - "days": { - "abbreviated": { - 0: "sun.", - 1: "mán.", - 2: "týs.", - 3: "mik.", - 4: "hós.", - 5: "frí.", - 6: "ley.", - }, - "narrow": {0: "S", 1: "M", 2: "T", 3: "M", 4: "H", 5: "F", 6: "L"}, - "short": { - 0: "su.", - 1: "má.", - 2: "tý.", - 3: "mi.", - 4: "hó.", - 5: "fr.", - 6: "le.", - }, - "wide": { - 0: "sunnudagur", - 1: "mánadagur", - 2: "týsdagur", - 3: "mikudagur", - 4: "hósdagur", - 5: "fríggjadagur", - 6: "leygardagur", - }, - }, - "months": { - "abbreviated": { - 1: "jan.", - 2: "feb.", - 3: "mar.", - 4: "apr.", - 5: "mai", - 6: "jun.", - 7: "jul.", - 8: "aug.", - 9: "sep.", - 10: "okt.", - 11: "nov.", - 12: "des.", - }, - "narrow": { - 1: "J", - 2: "F", - 3: "M", - 4: "A", - 5: "M", - 6: "J", - 7: "J", - 8: "A", - 9: "S", - 10: "O", - 11: "N", - 12: "D", - }, - "wide": { - 1: "januar", - 2: "februar", - 3: "mars", - 4: "apríl", - 5: "mai", - 6: "juni", - 7: "juli", - 8: "august", - 9: "september", - 10: "oktober", - 11: "november", - 12: "desember", - }, - }, - "units": { - "year": {"one": "{0} ár", "other": "{0} ár"}, - "month": {"one": "{0} mánaður", "other": "{0} mánaðir"}, - "week": {"one": "{0} vika", "other": "{0} vikur"}, - "day": {"one": "{0} dagur", "other": "{0} dagar"}, - "hour": {"one": "{0} tími", "other": "{0} tímar"}, - "minute": {"one": "{0} minuttur", "other": "{0} minuttir"}, - "second": {"one": "{0} sekund", "other": "{0} sekundir"}, - "microsecond": {"one": "{0} mikrosekund", "other": "{0} mikrosekundir"}, - }, - "relative": { - "year": { - "future": {"other": "um {0} ár", "one": "um {0} ár"}, - "past": {"other": "{0} ár síðan", "one": "{0} ár síðan"}, - }, - "month": { - "future": {"other": "um {0} mánaðir", "one": "um {0} mánað"}, - "past": {"other": "{0} mánaðir síðan", "one": "{0} mánað síðan"}, - }, - "week": { - "future": {"other": "um {0} vikur", "one": "um {0} viku"}, - "past": {"other": "{0} vikur síðan", "one": "{0} vika síðan"}, - }, - "day": { - "future": {"other": "um {0} dagar", "one": "um {0} dag"}, - "past": {"other": "{0} dagar síðan", "one": "{0} dagur síðan"}, - }, - "hour": { - "future": {"other": "um {0} tímar", "one": "um {0} tíma"}, - "past": {"other": "{0} tímar síðan", "one": "{0} tími síðan"}, - }, - "minute": { - "future": {"other": "um {0} minuttir", "one": "um {0} minutt"}, - "past": {"other": "{0} minuttir síðan", "one": "{0} minutt síðan"}, - }, - "second": { - "future": {"other": "um {0} sekund", "one": "um {0} sekund"}, - "past": {"other": "{0} sekund síðan", "one": "{0} sekund síðan"}, - }, - }, - "day_periods": {"am": "AM", "pm": "PM"}, - }, - "custom": custom_translations, -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fr/__init__.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fr/__init__.py deleted file mode 100644 index 4c48b5ac..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fr/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# -*- coding: utf-8 -*- diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fr/__pycache__/__init__.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fr/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 3e60810a..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fr/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fr/__pycache__/custom.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fr/__pycache__/custom.cpython-311.pyc deleted file mode 100644 index a9ee3828..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fr/__pycache__/custom.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fr/__pycache__/locale.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fr/__pycache__/locale.cpython-311.pyc deleted file mode 100644 index 5ea48ac1..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fr/__pycache__/locale.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fr/custom.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fr/custom.py deleted file mode 100644 index 0edddbfd..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fr/custom.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - - -""" -fr custom locale file. -""" - -translations = { - "units": {"few_second": "quelques secondes"}, - # Relative Time - "ago": "il y a {0}", - "from_now": "dans {0}", - "after": "{0} après", - "before": "{0} avant", - # Ordinals - "ordinal": {"one": "er", "other": "e"}, - # Date formats - "date_formats": { - "LTS": "HH:mm:ss", - "LT": "HH:mm", - "LLLL": "dddd D MMMM YYYY HH:mm", - "LLL": "D MMMM YYYY HH:mm", - "LL": "D MMMM YYYY", - "L": "DD/MM/YYYY", - }, -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fr/locale.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fr/locale.py deleted file mode 100644 index 137c0120..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/fr/locale.py +++ /dev/null @@ -1,136 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from .custom import translations as custom_translations - - -""" -fr locale file. - -It has been generated automatically and must not be modified directly. -""" - - -locale = { - "plural": lambda n: "one" if (n == n and ((n == 0) or (n == 1))) else "other", - "ordinal": lambda n: "one" if (n == n and ((n == 1))) else "other", - "translations": { - "days": { - "abbreviated": { - 0: "dim.", - 1: "lun.", - 2: "mar.", - 3: "mer.", - 4: "jeu.", - 5: "ven.", - 6: "sam.", - }, - "narrow": {0: "D", 1: "L", 2: "M", 3: "M", 4: "J", 5: "V", 6: "S"}, - "short": {0: "di", 1: "lu", 2: "ma", 3: "me", 4: "je", 5: "ve", 6: "sa"}, - "wide": { - 0: "dimanche", - 1: "lundi", - 2: "mardi", - 3: "mercredi", - 4: "jeudi", - 5: "vendredi", - 6: "samedi", - }, - }, - "months": { - "abbreviated": { - 1: "janv.", - 2: "févr.", - 3: "mars", - 4: "avr.", - 5: "mai", - 6: "juin", - 7: "juil.", - 8: "août", - 9: "sept.", - 10: "oct.", - 11: "nov.", - 12: "déc.", - }, - "narrow": { - 1: "J", - 2: "F", - 3: "M", - 4: "A", - 5: "M", - 6: "J", - 7: "J", - 8: "A", - 9: "S", - 10: "O", - 11: "N", - 12: "D", - }, - "wide": { - 1: "janvier", - 2: "février", - 3: "mars", - 4: "avril", - 5: "mai", - 6: "juin", - 7: "juillet", - 8: "août", - 9: "septembre", - 10: "octobre", - 11: "novembre", - 12: "décembre", - }, - }, - "units": { - "year": {"one": "{0} an", "other": "{0} ans"}, - "month": {"one": "{0} mois", "other": "{0} mois"}, - "week": {"one": "{0} semaine", "other": "{0} semaines"}, - "day": {"one": "{0} jour", "other": "{0} jours"}, - "hour": {"one": "{0} heure", "other": "{0} heures"}, - "minute": {"one": "{0} minute", "other": "{0} minutes"}, - "second": {"one": "{0} seconde", "other": "{0} secondes"}, - "microsecond": {"one": "{0} microseconde", "other": "{0} microsecondes"}, - }, - "relative": { - "year": { - "future": {"other": "dans {0} ans", "one": "dans {0} an"}, - "past": {"other": "il y a {0} ans", "one": "il y a {0} an"}, - }, - "month": { - "future": {"other": "dans {0} mois", "one": "dans {0} mois"}, - "past": {"other": "il y a {0} mois", "one": "il y a {0} mois"}, - }, - "week": { - "future": {"other": "dans {0} semaines", "one": "dans {0} semaine"}, - "past": {"other": "il y a {0} semaines", "one": "il y a {0} semaine"}, - }, - "day": { - "future": {"other": "dans {0} jours", "one": "dans {0} jour"}, - "past": {"other": "il y a {0} jours", "one": "il y a {0} jour"}, - }, - "hour": { - "future": {"other": "dans {0} heures", "one": "dans {0} heure"}, - "past": {"other": "il y a {0} heures", "one": "il y a {0} heure"}, - }, - "minute": { - "future": {"other": "dans {0} minutes", "one": "dans {0} minute"}, - "past": {"other": "il y a {0} minutes", "one": "il y a {0} minute"}, - }, - "second": { - "future": {"other": "dans {0} secondes", "one": "dans {0} seconde"}, - "past": {"other": "il y a {0} secondes", "one": "il y a {0} seconde"}, - }, - }, - "day_periods": { - "midnight": "minuit", - "am": "AM", - "noon": "midi", - "pm": "PM", - "morning1": "du matin", - "afternoon1": "de l’après-midi", - "evening1": "du soir", - "night1": "de nuit", - }, - }, - "custom": custom_translations, -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/id/__init__.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/id/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/id/__pycache__/__init__.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/id/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index f9ccd480..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/id/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/id/__pycache__/custom.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/id/__pycache__/custom.cpython-311.pyc deleted file mode 100644 index ebfc77c1..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/id/__pycache__/custom.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/id/__pycache__/locale.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/id/__pycache__/locale.cpython-311.pyc deleted file mode 100644 index d48f9d07..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/id/__pycache__/locale.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/id/custom.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/id/custom.py deleted file mode 100644 index 22024819..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/id/custom.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - - -""" -id custom locale file. -""" - -translations = { - "units": {"few_second": "beberapa detik"}, - "ago": "{} yang lalu", - "from_now": "dalam {}", - "after": "{0} kemudian", - "before": "{0} yang lalu", - "date_formats": { - "LTS": "HH:mm:ss", - "LT": "HH:mm", - "LLLL": "dddd [d.] D. MMMM YYYY HH:mm", - "LLL": "D. MMMM YYYY HH:mm", - "LL": "D. MMMM YYYY", - "L": "DD/MM/YYYY", - }, -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/id/locale.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/id/locale.py deleted file mode 100644 index 5a3485ed..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/id/locale.py +++ /dev/null @@ -1,144 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from .custom import translations as custom_translations - - -""" -id locale file. - -It has been generated automatically and must not be modified directly. -""" - - -locale = { - "plural": lambda n: "other", - "ordinal": lambda n: "other", - "translations": { - "days": { - "abbreviated": { - 0: "Min", - 1: "Sen", - 2: "Sel", - 3: "Rab", - 4: "Kam", - 5: "Jum", - 6: "Sab", - }, - "narrow": {0: "M", 1: "S", 2: "S", 3: "R", 4: "K", 5: "J", 6: "S"}, - "short": { - 0: "Min", - 1: "Sen", - 2: "Sel", - 3: "Rab", - 4: "Kam", - 5: "Jum", - 6: "Sab", - }, - "wide": { - 0: "Minggu", - 1: "Senin", - 2: "Selasa", - 3: "Rabu", - 4: "Kamis", - 5: "Jumat", - 6: "Sabtu", - }, - }, - "months": { - "abbreviated": { - 1: "Jan", - 2: "Feb", - 3: "Mar", - 4: "Apr", - 5: "Mei", - 6: "Jun", - 7: "Jul", - 8: "Agt", - 9: "Sep", - 10: "Okt", - 11: "Nov", - 12: "Des", - }, - "narrow": { - 1: "J", - 2: "F", - 3: "M", - 4: "A", - 5: "M", - 6: "J", - 7: "J", - 8: "A", - 9: "S", - 10: "O", - 11: "N", - 12: "D", - }, - "wide": { - 1: "Januari", - 2: "Februari", - 3: "Maret", - 4: "April", - 5: "Mei", - 6: "Juni", - 7: "Juli", - 8: "Agustus", - 9: "September", - 10: "Oktober", - 11: "November", - 12: "Desember", - }, - }, - "units": { - "year": {"other": "{0} tahun"}, - "month": {"other": "{0} bulan"}, - "week": {"other": "{0} minggu"}, - "day": {"other": "{0} hari"}, - "hour": {"other": "{0} jam"}, - "minute": {"other": "{0} menit"}, - "second": {"other": "{0} detik"}, - "microsecond": {"other": "{0} mikrodetik"}, - }, - "relative": { - "year": { - "future": {"other": "dalam {0} tahun"}, - "past": {"other": "{0} tahun yang lalu"}, - }, - "month": { - "future": {"other": "dalam {0} bulan"}, - "past": {"other": "{0} bulan yang lalu"}, - }, - "week": { - "future": {"other": "dalam {0} minggu"}, - "past": {"other": "{0} minggu yang lalu"}, - }, - "day": { - "future": {"other": "dalam {0} hari"}, - "past": {"other": "{0} hari yang lalu"}, - }, - "hour": { - "future": {"other": "dalam {0} jam"}, - "past": {"other": "{0} jam yang lalu"}, - }, - "minute": { - "future": {"other": "dalam {0} menit"}, - "past": {"other": "{0} menit yang lalu"}, - }, - "second": { - "future": {"other": "dalam {0} detik"}, - "past": {"other": "{0} detik yang lalu"}, - }, - }, - "day_periods": { - "midnight": "tengah malam", - "am": "AM", - "noon": "tengah hari", - "pm": "PM", - "morning1": "pagi", - "afternoon1": "siang", - "evening1": "sore", - "night1": "malam", - }, - }, - "custom": custom_translations, -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/it/__init__.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/it/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/it/__pycache__/__init__.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/it/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 15fcd082..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/it/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/it/__pycache__/custom.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/it/__pycache__/custom.cpython-311.pyc deleted file mode 100644 index e3b778ff..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/it/__pycache__/custom.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/it/__pycache__/locale.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/it/__pycache__/locale.cpython-311.pyc deleted file mode 100644 index f1abb202..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/it/__pycache__/locale.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/it/custom.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/it/custom.py deleted file mode 100644 index 744f55c9..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/it/custom.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -""" -it custom locale file. -""" - -from __future__ import unicode_literals - - -translations = { - "units": {"few_second": "alcuni secondi"}, - # Relative Time - "ago": "{0} fa", - "from_now": "in {0}", - "after": "{0} dopo", - "before": "{0} prima", - # Ordinals - "ordinal": {"other": "°"}, - # Date formats - "date_formats": { - "LTS": "H:mm:ss", - "LT": "H:mm", - "L": "DD/MM/YYYY", - "LL": "D MMMM YYYY", - "LLL": "D MMMM YYYY [alle] H:mm", - "LLLL": "dddd, D MMMM YYYY [alle] H:mm", - }, -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/it/locale.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/it/locale.py deleted file mode 100644 index 4abf7176..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/it/locale.py +++ /dev/null @@ -1,148 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from .custom import translations as custom_translations - - -""" -it locale file. - -It has been generated automatically and must not be modified directly. -""" - - -locale = { - "plural": lambda n: "one" - if ((n == n and ((n == 1))) and (0 == 0 and ((0 == 0)))) - else "other", - "ordinal": lambda n: "many" - if (n == n and ((n == 11) or (n == 8) or (n == 80) or (n == 800))) - else "other", - "translations": { - "days": { - "abbreviated": { - 0: "dom", - 1: "lun", - 2: "mar", - 3: "mer", - 4: "gio", - 5: "ven", - 6: "sab", - }, - "narrow": {0: "D", 1: "L", 2: "M", 3: "M", 4: "G", 5: "V", 6: "S"}, - "short": { - 0: "dom", - 1: "lun", - 2: "mar", - 3: "mer", - 4: "gio", - 5: "ven", - 6: "sab", - }, - "wide": { - 0: "domenica", - 1: "lunedì", - 2: "martedì", - 3: "mercoledì", - 4: "giovedì", - 5: "venerdì", - 6: "sabato", - }, - }, - "months": { - "abbreviated": { - 1: "gen", - 2: "feb", - 3: "mar", - 4: "apr", - 5: "mag", - 6: "giu", - 7: "lug", - 8: "ago", - 9: "set", - 10: "ott", - 11: "nov", - 12: "dic", - }, - "narrow": { - 1: "G", - 2: "F", - 3: "M", - 4: "A", - 5: "M", - 6: "G", - 7: "L", - 8: "A", - 9: "S", - 10: "O", - 11: "N", - 12: "D", - }, - "wide": { - 1: "gennaio", - 2: "febbraio", - 3: "marzo", - 4: "aprile", - 5: "maggio", - 6: "giugno", - 7: "luglio", - 8: "agosto", - 9: "settembre", - 10: "ottobre", - 11: "novembre", - 12: "dicembre", - }, - }, - "units": { - "year": {"one": "{0} anno", "other": "{0} anni"}, - "month": {"one": "{0} mese", "other": "{0} mesi"}, - "week": {"one": "{0} settimana", "other": "{0} settimane"}, - "day": {"one": "{0} giorno", "other": "{0} giorni"}, - "hour": {"one": "{0} ora", "other": "{0} ore"}, - "minute": {"one": "{0} minuto", "other": "{0} minuti"}, - "second": {"one": "{0} secondo", "other": "{0} secondi"}, - "microsecond": {"one": "{0} microsecondo", "other": "{0} microsecondi"}, - }, - "relative": { - "year": { - "future": {"other": "tra {0} anni", "one": "tra {0} anno"}, - "past": {"other": "{0} anni fa", "one": "{0} anno fa"}, - }, - "month": { - "future": {"other": "tra {0} mesi", "one": "tra {0} mese"}, - "past": {"other": "{0} mesi fa", "one": "{0} mese fa"}, - }, - "week": { - "future": {"other": "tra {0} settimane", "one": "tra {0} settimana"}, - "past": {"other": "{0} settimane fa", "one": "{0} settimana fa"}, - }, - "day": { - "future": {"other": "tra {0} giorni", "one": "tra {0} giorno"}, - "past": {"other": "{0} giorni fa", "one": "{0} giorno fa"}, - }, - "hour": { - "future": {"other": "tra {0} ore", "one": "tra {0} ora"}, - "past": {"other": "{0} ore fa", "one": "{0} ora fa"}, - }, - "minute": { - "future": {"other": "tra {0} minuti", "one": "tra {0} minuto"}, - "past": {"other": "{0} minuti fa", "one": "{0} minuto fa"}, - }, - "second": { - "future": {"other": "tra {0} secondi", "one": "tra {0} secondo"}, - "past": {"other": "{0} secondi fa", "one": "{0} secondo fa"}, - }, - }, - "day_periods": { - "midnight": "mezzanotte", - "am": "AM", - "noon": "mezzogiorno", - "pm": "PM", - "morning1": "di mattina", - "afternoon1": "del pomeriggio", - "evening1": "di sera", - "night1": "di notte", - }, - }, - "custom": custom_translations, -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/ko/__init__.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/ko/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/ko/__pycache__/__init__.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/ko/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index cf9112cc..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/ko/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/ko/__pycache__/custom.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/ko/__pycache__/custom.cpython-311.pyc deleted file mode 100644 index d23271bb..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/ko/__pycache__/custom.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/ko/__pycache__/locale.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/ko/__pycache__/locale.cpython-311.pyc deleted file mode 100644 index e77bcba0..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/ko/__pycache__/locale.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/ko/custom.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/ko/custom.py deleted file mode 100644 index beac040e..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/ko/custom.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - - -""" -ko custom locale file. -""" - -translations = { - # Relative time - "after": "{0} 뒤", - "before": "{0} 앞", - # Date formats - "date_formats": { - "LTS": "A h시 m분 s초", - "LT": "A h시 m분", - "LLLL": "YYYY년 MMMM D일 dddd A h시 m분", - "LLL": "YYYY년 MMMM D일 A h시 m분", - "LL": "YYYY년 MMMM D일", - "L": "YYYY.MM.DD", - }, -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/ko/locale.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/ko/locale.py deleted file mode 100644 index 3c81b0e6..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/ko/locale.py +++ /dev/null @@ -1,108 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from .custom import translations as custom_translations - - -""" -ko locale file. - -It has been generated automatically and must not be modified directly. -""" - - -locale = { - "plural": lambda n: "other", - "ordinal": lambda n: "other", - "translations": { - "days": { - "abbreviated": {0: "일", 1: "월", 2: "화", 3: "수", 4: "목", 5: "금", 6: "토"}, - "narrow": {0: "일", 1: "월", 2: "화", 3: "수", 4: "목", 5: "금", 6: "토"}, - "short": {0: "일", 1: "월", 2: "화", 3: "수", 4: "목", 5: "금", 6: "토"}, - "wide": { - 0: "일요일", - 1: "월요일", - 2: "화요일", - 3: "수요일", - 4: "목요일", - 5: "금요일", - 6: "토요일", - }, - }, - "months": { - "abbreviated": { - 1: "1월", - 2: "2월", - 3: "3월", - 4: "4월", - 5: "5월", - 6: "6월", - 7: "7월", - 8: "8월", - 9: "9월", - 10: "10월", - 11: "11월", - 12: "12월", - }, - "narrow": { - 1: "1월", - 2: "2월", - 3: "3월", - 4: "4월", - 5: "5월", - 6: "6월", - 7: "7월", - 8: "8월", - 9: "9월", - 10: "10월", - 11: "11월", - 12: "12월", - }, - "wide": { - 1: "1월", - 2: "2월", - 3: "3월", - 4: "4월", - 5: "5월", - 6: "6월", - 7: "7월", - 8: "8월", - 9: "9월", - 10: "10월", - 11: "11월", - 12: "12월", - }, - }, - "units": { - "year": {"other": "{0}년"}, - "month": {"other": "{0}개월"}, - "week": {"other": "{0}주"}, - "day": {"other": "{0}일"}, - "hour": {"other": "{0}시간"}, - "minute": {"other": "{0}분"}, - "second": {"other": "{0}초"}, - "microsecond": {"other": "{0}마이크로초"}, - }, - "relative": { - "year": {"future": {"other": "{0}년 후"}, "past": {"other": "{0}년 전"}}, - "month": {"future": {"other": "{0}개월 후"}, "past": {"other": "{0}개월 전"}}, - "week": {"future": {"other": "{0}주 후"}, "past": {"other": "{0}주 전"}}, - "day": {"future": {"other": "{0}일 후"}, "past": {"other": "{0}일 전"}}, - "hour": {"future": {"other": "{0}시간 후"}, "past": {"other": "{0}시간 전"}}, - "minute": {"future": {"other": "{0}분 후"}, "past": {"other": "{0}분 전"}}, - "second": {"future": {"other": "{0}초 후"}, "past": {"other": "{0}초 전"}}, - }, - "day_periods": { - "midnight": "자정", - "am": "오전", - "noon": "정오", - "pm": "오후", - "morning1": "새벽", - "morning2": "오전", - "afternoon1": "오후", - "evening1": "저녁", - "night1": "밤", - }, - }, - "custom": custom_translations, -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/locale.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/locale.py deleted file mode 100644 index 154db423..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/locale.py +++ /dev/null @@ -1,104 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -import os -import re - -from importlib import import_module -from typing import Any -from typing import Optional -from typing import Union - -from pendulum.utils._compat import basestring -from pendulum.utils._compat import decode - - -class Locale: - """ - Represent a specific locale. - """ - - _cache = {} - - def __init__(self, locale, data): # type: (str, Any) -> None - self._locale = locale - self._data = data - self._key_cache = {} - - @classmethod - def load(cls, locale): # type: (Union[str, Locale]) -> Locale - if isinstance(locale, Locale): - return locale - - locale = cls.normalize_locale(locale) - if locale in cls._cache: - return cls._cache[locale] - - # Checking locale existence - actual_locale = locale - locale_path = os.path.join(os.path.dirname(__file__), actual_locale) - while not os.path.exists(locale_path): - if actual_locale == locale: - raise ValueError("Locale [{}] does not exist.".format(locale)) - - actual_locale = actual_locale.split("_")[0] - - m = import_module("pendulum.locales.{}.locale".format(actual_locale)) - - cls._cache[locale] = cls(locale, m.locale) - - return cls._cache[locale] - - @classmethod - def normalize_locale(cls, locale): # type: (str) -> str - m = re.match("([a-z]{2})[-_]([a-z]{2})", locale, re.I) - if m: - return "{}_{}".format(m.group(1).lower(), m.group(2).lower()) - else: - return locale.lower() - - def get(self, key, default=None): # type: (str, Optional[Any]) -> Any - if key in self._key_cache: - return self._key_cache[key] - - parts = key.split(".") - try: - result = self._data[parts[0]] - for part in parts[1:]: - result = result[part] - except KeyError: - result = default - - if isinstance(result, basestring): - result = decode(result) - - self._key_cache[key] = result - - return self._key_cache[key] - - def translation(self, key): # type: (str) -> Any - return self.get("translations.{}".format(key)) - - def plural(self, number): # type: (int) -> str - return decode(self._data["plural"](number)) - - def ordinal(self, number): # type: (int) -> str - return decode(self._data["ordinal"](number)) - - def ordinalize(self, number): # type: (int) -> str - ordinal = self.get("custom.ordinal.{}".format(self.ordinal(number))) - - if not ordinal: - return decode("{}".format(number)) - - return decode("{}{}".format(number, ordinal)) - - def match_translation(self, key, value): - translations = self.translation(key) - if value not in translations.values(): - return None - - return {v: k for k, v in translations.items()}[value] - - def __repr__(self): - return "{}('{}')".format(self.__class__.__name__, self._locale) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/lt/__init__.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/lt/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/lt/__pycache__/__init__.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/lt/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 25cd7dfa..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/lt/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/lt/__pycache__/custom.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/lt/__pycache__/custom.cpython-311.pyc deleted file mode 100644 index b5839974..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/lt/__pycache__/custom.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/lt/__pycache__/locale.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/lt/__pycache__/locale.cpython-311.pyc deleted file mode 100644 index 292482ca..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/lt/__pycache__/locale.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/lt/custom.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/lt/custom.py deleted file mode 100644 index addaaf82..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/lt/custom.py +++ /dev/null @@ -1,122 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - - -""" -lt custom locale file. -""" - -translations = { - # Relative time - "units_relative": { - "year": { - "future": { - "other": "{0} metų", - "one": "{0} metų", - "few": "{0} metų", - "many": "{0} metų", - }, - "past": { - "other": "{0} metų", - "one": "{0} metus", - "few": "{0} metus", - "many": "{0} metų", - }, - }, - "month": { - "future": { - "other": "{0} mėnesių", - "one": "{0} mėnesio", - "few": "{0} mėnesių", - "many": "{0} mėnesio", - }, - "past": { - "other": "{0} mėnesių", - "one": "{0} mėnesį", - "few": "{0} mėnesius", - "many": "{0} mėnesio", - }, - }, - "week": { - "future": { - "other": "{0} savaičių", - "one": "{0} savaitės", - "few": "{0} savaičių", - "many": "{0} savaitės", - }, - "past": { - "other": "{0} savaičių", - "one": "{0} savaitę", - "few": "{0} savaites", - "many": "{0} savaitės", - }, - }, - "day": { - "future": { - "other": "{0} dienų", - "one": "{0} dienos", - "few": "{0} dienų", - "many": "{0} dienos", - }, - "past": { - "other": "{0} dienų", - "one": "{0} dieną", - "few": "{0} dienas", - "many": "{0} dienos", - }, - }, - "hour": { - "future": { - "other": "{0} valandų", - "one": "{0} valandos", - "few": "{0} valandų", - "many": "{0} valandos", - }, - "past": { - "other": "{0} valandų", - "one": "{0} valandą", - "few": "{0} valandas", - "many": "{0} valandos", - }, - }, - "minute": { - "future": { - "other": "{0} minučių", - "one": "{0} minutės", - "few": "{0} minučių", - "many": "{0} minutės", - }, - "past": { - "other": "{0} minučių", - "one": "{0} minutę", - "few": "{0} minutes", - "many": "{0} minutės", - }, - }, - "second": { - "future": { - "other": "{0} sekundžių", - "one": "{0} sekundės", - "few": "{0} sekundžių", - "many": "{0} sekundės", - }, - "past": { - "other": "{0} sekundžių", - "one": "{0} sekundę", - "few": "{0} sekundes", - "many": "{0} sekundės", - }, - }, - }, - "after": "po {0}", - "before": "{0} nuo dabar", - # Date formats - "date_formats": { - "LTS": "HH:mm:ss", - "LT": "HH:mm", - "LLLL": "YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]", - "LLL": "YYYY [m.] MMMM D [d.], HH:mm [val.]", - "LL": "YYYY [m.] MMMM D [d.]", - "L": "YYYY-MM-DD", - }, -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/lt/locale.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/lt/locale.py deleted file mode 100644 index 12451b60..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/lt/locale.py +++ /dev/null @@ -1,258 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from .custom import translations as custom_translations - - -""" -lt locale file. - -It has been generated automatically and must not be modified directly. -""" - - -locale = { - "plural": lambda n: "few" - if ( - ((n % 10) == (n % 10) and (((n % 10) >= 2 and (n % 10) <= 9))) - and (not ((n % 100) == (n % 100) and (((n % 100) >= 11 and (n % 100) <= 19)))) - ) - else "many" - if (not (0 == 0 and ((0 == 0)))) - else "one" - if ( - ((n % 10) == (n % 10) and (((n % 10) == 1))) - and (not ((n % 100) == (n % 100) and (((n % 100) >= 11 and (n % 100) <= 19)))) - ) - else "other", - "ordinal": lambda n: "other", - "translations": { - "days": { - "abbreviated": { - 0: "sk", - 1: "pr", - 2: "an", - 3: "tr", - 4: "kt", - 5: "pn", - 6: "št", - }, - "narrow": {0: "S", 1: "P", 2: "A", 3: "T", 4: "K", 5: "P", 6: "Š"}, - "short": {0: "Sk", 1: "Pr", 2: "An", 3: "Tr", 4: "Kt", 5: "Pn", 6: "Št"}, - "wide": { - 0: "sekmadienis", - 1: "pirmadienis", - 2: "antradienis", - 3: "trečiadienis", - 4: "ketvirtadienis", - 5: "penktadienis", - 6: "šeštadienis", - }, - }, - "months": { - "abbreviated": { - 1: "saus.", - 2: "vas.", - 3: "kov.", - 4: "bal.", - 5: "geg.", - 6: "birž.", - 7: "liep.", - 8: "rugp.", - 9: "rugs.", - 10: "spal.", - 11: "lapkr.", - 12: "gruod.", - }, - "narrow": { - 1: "S", - 2: "V", - 3: "K", - 4: "B", - 5: "G", - 6: "B", - 7: "L", - 8: "R", - 9: "R", - 10: "S", - 11: "L", - 12: "G", - }, - "wide": { - 1: "sausio", - 2: "vasario", - 3: "kovo", - 4: "balandžio", - 5: "gegužės", - 6: "birželio", - 7: "liepos", - 8: "rugpjūčio", - 9: "rugsėjo", - 10: "spalio", - 11: "lapkričio", - 12: "gruodžio", - }, - }, - "units": { - "year": { - "one": "{0} metai", - "few": "{0} metai", - "many": "{0} metų", - "other": "{0} metų", - }, - "month": { - "one": "{0} mėnuo", - "few": "{0} mėnesiai", - "many": "{0} mėnesio", - "other": "{0} mėnesių", - }, - "week": { - "one": "{0} savaitė", - "few": "{0} savaitės", - "many": "{0} savaitės", - "other": "{0} savaičių", - }, - "day": { - "one": "{0} diena", - "few": "{0} dienos", - "many": "{0} dienos", - "other": "{0} dienų", - }, - "hour": { - "one": "{0} valanda", - "few": "{0} valandos", - "many": "{0} valandos", - "other": "{0} valandų", - }, - "minute": { - "one": "{0} minutė", - "few": "{0} minutės", - "many": "{0} minutės", - "other": "{0} minučių", - }, - "second": { - "one": "{0} sekundė", - "few": "{0} sekundės", - "many": "{0} sekundės", - "other": "{0} sekundžių", - }, - "microsecond": { - "one": "{0} mikrosekundė", - "few": "{0} mikrosekundės", - "many": "{0} mikrosekundės", - "other": "{0} mikrosekundžių", - }, - }, - "relative": { - "year": { - "future": { - "other": "po {0} metų", - "one": "po {0} metų", - "few": "po {0} metų", - "many": "po {0} metų", - }, - "past": { - "other": "prieš {0} metų", - "one": "prieš {0} metus", - "few": "prieš {0} metus", - "many": "prieš {0} metų", - }, - }, - "month": { - "future": { - "other": "po {0} mėnesių", - "one": "po {0} mėnesio", - "few": "po {0} mėnesių", - "many": "po {0} mėnesio", - }, - "past": { - "other": "prieš {0} mėnesių", - "one": "prieš {0} mėnesį", - "few": "prieš {0} mėnesius", - "many": "prieš {0} mėnesio", - }, - }, - "week": { - "future": { - "other": "po {0} savaičių", - "one": "po {0} savaitės", - "few": "po {0} savaičių", - "many": "po {0} savaitės", - }, - "past": { - "other": "prieš {0} savaičių", - "one": "prieš {0} savaitę", - "few": "prieš {0} savaites", - "many": "prieš {0} savaitės", - }, - }, - "day": { - "future": { - "other": "po {0} dienų", - "one": "po {0} dienos", - "few": "po {0} dienų", - "many": "po {0} dienos", - }, - "past": { - "other": "prieš {0} dienų", - "one": "prieš {0} dieną", - "few": "prieš {0} dienas", - "many": "prieš {0} dienos", - }, - }, - "hour": { - "future": { - "other": "po {0} valandų", - "one": "po {0} valandos", - "few": "po {0} valandų", - "many": "po {0} valandos", - }, - "past": { - "other": "prieš {0} valandų", - "one": "prieš {0} valandą", - "few": "prieš {0} valandas", - "many": "prieš {0} valandos", - }, - }, - "minute": { - "future": { - "other": "po {0} minučių", - "one": "po {0} minutės", - "few": "po {0} minučių", - "many": "po {0} minutės", - }, - "past": { - "other": "prieš {0} minučių", - "one": "prieš {0} minutę", - "few": "prieš {0} minutes", - "many": "prieš {0} minutės", - }, - }, - "second": { - "future": { - "other": "po {0} sekundžių", - "one": "po {0} sekundės", - "few": "po {0} sekundžių", - "many": "po {0} sekundės", - }, - "past": { - "other": "prieš {0} sekundžių", - "one": "prieš {0} sekundę", - "few": "prieš {0} sekundes", - "many": "prieš {0} sekundės", - }, - }, - }, - "day_periods": { - "midnight": "vidurnaktis", - "am": "priešpiet", - "noon": "perpiet", - "pm": "popiet", - "morning1": "rytas", - "afternoon1": "popietė", - "evening1": "vakaras", - "night1": "naktis", - }, - }, - "custom": custom_translations, -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nb/__init__.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nb/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nb/__pycache__/__init__.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nb/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index d34d3803..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nb/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nb/__pycache__/custom.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nb/__pycache__/custom.cpython-311.pyc deleted file mode 100644 index 471246e7..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nb/__pycache__/custom.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nb/__pycache__/locale.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nb/__pycache__/locale.cpython-311.pyc deleted file mode 100644 index ffae2712..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nb/__pycache__/locale.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nb/custom.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nb/custom.py deleted file mode 100644 index 666f1b45..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nb/custom.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - - -""" -nn custom locale file. -""" - -translations = { - # Relative time - "after": "{0} etter", - "before": "{0} før", - # Ordinals - "ordinal": {"one": ".", "two": ".", "few": ".", "other": "."}, - # Date formats - "date_formats": { - "LTS": "HH:mm:ss", - "LT": "HH:mm", - "LLLL": "dddd Do MMMM YYYY HH:mm", - "LLL": "Do MMMM YYYY HH:mm", - "LL": "Do MMMM YYYY", - "L": "DD.MM.YYYY", - }, -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nb/locale.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nb/locale.py deleted file mode 100644 index 9ef91604..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nb/locale.py +++ /dev/null @@ -1,153 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from .custom import translations as custom_translations - - -""" -nb locale file. - -It has been generated automatically and must not be modified directly. -""" - - -locale = { - "plural": lambda n: "one" if (n == n and ((n == 1))) else "other", - "ordinal": lambda n: "other", - "translations": { - "days": { - "abbreviated": { - 0: "søn.", - 1: "man.", - 2: "tir.", - 3: "ons.", - 4: "tor.", - 5: "fre.", - 6: "lør.", - }, - "narrow": {0: "S", 1: "M", 2: "T", 3: "O", 4: "T", 5: "F", 6: "L"}, - "short": { - 0: "sø.", - 1: "ma.", - 2: "ti.", - 3: "on.", - 4: "to.", - 5: "fr.", - 6: "lø.", - }, - "wide": { - 0: "søndag", - 1: "mandag", - 2: "tirsdag", - 3: "onsdag", - 4: "torsdag", - 5: "fredag", - 6: "lørdag", - }, - }, - "months": { - "abbreviated": { - 1: "jan.", - 2: "feb.", - 3: "mar.", - 4: "apr.", - 5: "mai", - 6: "jun.", - 7: "jul.", - 8: "aug.", - 9: "sep.", - 10: "okt.", - 11: "nov.", - 12: "des.", - }, - "narrow": { - 1: "J", - 2: "F", - 3: "M", - 4: "A", - 5: "M", - 6: "J", - 7: "J", - 8: "A", - 9: "S", - 10: "O", - 11: "N", - 12: "D", - }, - "wide": { - 1: "januar", - 2: "februar", - 3: "mars", - 4: "april", - 5: "mai", - 6: "juni", - 7: "juli", - 8: "august", - 9: "september", - 10: "oktober", - 11: "november", - 12: "desember", - }, - }, - "units": { - "year": {"one": "{0} år", "other": "{0} år"}, - "month": {"one": "{0} måned", "other": "{0} måneder"}, - "week": {"one": "{0} uke", "other": "{0} uker"}, - "day": {"one": "{0} dag", "other": "{0} dager"}, - "hour": {"one": "{0} time", "other": "{0} timer"}, - "minute": {"one": "{0} minutt", "other": "{0} minutter"}, - "second": {"one": "{0} sekund", "other": "{0} sekunder"}, - "microsecond": {"one": "{0} mikrosekund", "other": "{0} mikrosekunder"}, - }, - "relative": { - "year": { - "future": {"other": "om {0} år", "one": "om {0} år"}, - "past": {"other": "for {0} år siden", "one": "for {0} år siden"}, - }, - "month": { - "future": {"other": "om {0} måneder", "one": "om {0} måned"}, - "past": { - "other": "for {0} måneder siden", - "one": "for {0} måned siden", - }, - }, - "week": { - "future": {"other": "om {0} uker", "one": "om {0} uke"}, - "past": {"other": "for {0} uker siden", "one": "for {0} uke siden"}, - }, - "day": { - "future": {"other": "om {0} dager", "one": "om {0} dag"}, - "past": {"other": "for {0} dager siden", "one": "for {0} dag siden"}, - }, - "hour": { - "future": {"other": "om {0} timer", "one": "om {0} time"}, - "past": {"other": "for {0} timer siden", "one": "for {0} time siden"}, - }, - "minute": { - "future": {"other": "om {0} minutter", "one": "om {0} minutt"}, - "past": { - "other": "for {0} minutter siden", - "one": "for {0} minutt siden", - }, - }, - "second": { - "future": {"other": "om {0} sekunder", "one": "om {0} sekund"}, - "past": { - "other": "for {0} sekunder siden", - "one": "for {0} sekund siden", - }, - }, - }, - "day_periods": { - "midnight": "midnatt", - "am": "a.m.", - "pm": "p.m.", - "morning1": "morgenen", - "morning2": "formiddagen", - "afternoon1": "ettermiddagen", - "evening1": "kvelden", - "night1": "natten", - }, - }, - "custom": custom_translations, -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nl/__init__.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nl/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nl/__pycache__/__init__.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nl/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 1262fbd6..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nl/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nl/__pycache__/custom.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nl/__pycache__/custom.cpython-311.pyc deleted file mode 100644 index a882a2b2..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nl/__pycache__/custom.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nl/__pycache__/locale.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nl/__pycache__/locale.cpython-311.pyc deleted file mode 100644 index d1f5bdf9..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nl/__pycache__/locale.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nl/custom.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nl/custom.py deleted file mode 100644 index c957cda9..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nl/custom.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - - -""" -nl custom locale file. -""" - -translations = { - "units": {"few_second": "enkele seconden"}, - # Relative time - "ago": "{} geleden", - "from_now": "over {}", - "after": "{0} later", - "before": "{0} eerder", - # Ordinals - "ordinal": {"other": "e"}, - # Date formats - "date_formats": { - "L": "DD-MM-YYYY", - "LL": "D MMMM YYYY", - "LLL": "D MMMM YYYY HH:mm", - "LLLL": "dddd D MMMM YYYY HH:mm", - "LT": "HH:mm", - "LTS": "HH:mm:ss", - }, -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nl/locale.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nl/locale.py deleted file mode 100644 index 270f18e7..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nl/locale.py +++ /dev/null @@ -1,137 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from .custom import translations as custom_translations - - -""" -nl locale file. - -It has been generated automatically and must not be modified directly. -""" - - -locale = { - "plural": lambda n: "one" - if ((n == n and ((n == 1))) and (0 == 0 and ((0 == 0)))) - else "other", - "ordinal": lambda n: "other", - "translations": { - "days": { - "abbreviated": { - 0: "zo", - 1: "ma", - 2: "di", - 3: "wo", - 4: "do", - 5: "vr", - 6: "za", - }, - "narrow": {0: "Z", 1: "M", 2: "D", 3: "W", 4: "D", 5: "V", 6: "Z"}, - "short": {0: "zo", 1: "ma", 2: "di", 3: "wo", 4: "do", 5: "vr", 6: "za"}, - "wide": { - 0: "zondag", - 1: "maandag", - 2: "dinsdag", - 3: "woensdag", - 4: "donderdag", - 5: "vrijdag", - 6: "zaterdag", - }, - }, - "months": { - "abbreviated": { - 1: "jan.", - 2: "feb.", - 3: "mrt.", - 4: "apr.", - 5: "mei", - 6: "jun.", - 7: "jul.", - 8: "aug.", - 9: "sep.", - 10: "okt.", - 11: "nov.", - 12: "dec.", - }, - "narrow": { - 1: "J", - 2: "F", - 3: "M", - 4: "A", - 5: "M", - 6: "J", - 7: "J", - 8: "A", - 9: "S", - 10: "O", - 11: "N", - 12: "D", - }, - "wide": { - 1: "januari", - 2: "februari", - 3: "maart", - 4: "april", - 5: "mei", - 6: "juni", - 7: "juli", - 8: "augustus", - 9: "september", - 10: "oktober", - 11: "november", - 12: "december", - }, - }, - "units": { - "year": {"one": "{0} jaar", "other": "{0} jaar"}, - "month": {"one": "{0} maand", "other": "{0} maanden"}, - "week": {"one": "{0} week", "other": "{0} weken"}, - "day": {"one": "{0} dag", "other": "{0} dagen"}, - "hour": {"one": "{0} uur", "other": "{0} uur"}, - "minute": {"one": "{0} minuut", "other": "{0} minuten"}, - "second": {"one": "{0} seconde", "other": "{0} seconden"}, - "microsecond": {"one": "{0} microseconde", "other": "{0} microseconden"}, - }, - "relative": { - "year": { - "future": {"other": "over {0} jaar", "one": "over {0} jaar"}, - "past": {"other": "{0} jaar geleden", "one": "{0} jaar geleden"}, - }, - "month": { - "future": {"other": "over {0} maanden", "one": "over {0} maand"}, - "past": {"other": "{0} maanden geleden", "one": "{0} maand geleden"}, - }, - "week": { - "future": {"other": "over {0} weken", "one": "over {0} week"}, - "past": {"other": "{0} weken geleden", "one": "{0} week geleden"}, - }, - "day": { - "future": {"other": "over {0} dagen", "one": "over {0} dag"}, - "past": {"other": "{0} dagen geleden", "one": "{0} dag geleden"}, - }, - "hour": { - "future": {"other": "over {0} uur", "one": "over {0} uur"}, - "past": {"other": "{0} uur geleden", "one": "{0} uur geleden"}, - }, - "minute": { - "future": {"other": "over {0} minuten", "one": "over {0} minuut"}, - "past": {"other": "{0} minuten geleden", "one": "{0} minuut geleden"}, - }, - "second": { - "future": {"other": "over {0} seconden", "one": "over {0} seconde"}, - "past": {"other": "{0} seconden geleden", "one": "{0} seconde geleden"}, - }, - }, - "day_periods": { - "midnight": "middernacht", - "am": "a.m.", - "pm": "p.m.", - "morning1": "‘s ochtends", - "afternoon1": "‘s middags", - "evening1": "‘s avonds", - "night1": "‘s nachts", - }, - }, - "custom": custom_translations, -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nn/__init__.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nn/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nn/__pycache__/__init__.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nn/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 26ee4327..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nn/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nn/__pycache__/custom.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nn/__pycache__/custom.cpython-311.pyc deleted file mode 100644 index 9fc9a053..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nn/__pycache__/custom.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nn/__pycache__/locale.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nn/__pycache__/locale.cpython-311.pyc deleted file mode 100644 index 3b03141a..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nn/__pycache__/locale.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nn/custom.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nn/custom.py deleted file mode 100644 index 666f1b45..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nn/custom.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - - -""" -nn custom locale file. -""" - -translations = { - # Relative time - "after": "{0} etter", - "before": "{0} før", - # Ordinals - "ordinal": {"one": ".", "two": ".", "few": ".", "other": "."}, - # Date formats - "date_formats": { - "LTS": "HH:mm:ss", - "LT": "HH:mm", - "LLLL": "dddd Do MMMM YYYY HH:mm", - "LLL": "Do MMMM YYYY HH:mm", - "LL": "Do MMMM YYYY", - "L": "DD.MM.YYYY", - }, -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nn/locale.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nn/locale.py deleted file mode 100644 index 7236d0c7..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/nn/locale.py +++ /dev/null @@ -1,144 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from .custom import translations as custom_translations - - -""" -nn locale file. - -It has been generated automatically and must not be modified directly. -""" - - -locale = { - "plural": lambda n: "one" if (n == n and ((n == 1))) else "other", - "ordinal": lambda n: "other", - "translations": { - "days": { - "abbreviated": { - 0: "søn.", - 1: "mån.", - 2: "tys.", - 3: "ons.", - 4: "tor.", - 5: "fre.", - 6: "lau.", - }, - "narrow": {0: "S", 1: "M", 2: "T", 3: "O", 4: "T", 5: "F", 6: "L"}, - "short": { - 0: "sø.", - 1: "må.", - 2: "ty.", - 3: "on.", - 4: "to.", - 5: "fr.", - 6: "la.", - }, - "wide": { - 0: "søndag", - 1: "måndag", - 2: "tysdag", - 3: "onsdag", - 4: "torsdag", - 5: "fredag", - 6: "laurdag", - }, - }, - "months": { - "abbreviated": { - 1: "jan.", - 2: "feb.", - 3: "mars", - 4: "apr.", - 5: "mai", - 6: "juni", - 7: "juli", - 8: "aug.", - 9: "sep.", - 10: "okt.", - 11: "nov.", - 12: "des.", - }, - "narrow": { - 1: "J", - 2: "F", - 3: "M", - 4: "A", - 5: "M", - 6: "J", - 7: "J", - 8: "A", - 9: "S", - 10: "O", - 11: "N", - 12: "D", - }, - "wide": { - 1: "januar", - 2: "februar", - 3: "mars", - 4: "april", - 5: "mai", - 6: "juni", - 7: "juli", - 8: "august", - 9: "september", - 10: "oktober", - 11: "november", - 12: "desember", - }, - }, - "units": { - "year": {"one": "{0} år", "other": "{0} år"}, - "month": {"one": "{0} månad", "other": "{0} månadar"}, - "week": {"one": "{0} veke", "other": "{0} veker"}, - "day": {"one": "{0} dag", "other": "{0} dagar"}, - "hour": {"one": "{0} time", "other": "{0} timar"}, - "minute": {"one": "{0} minutt", "other": "{0} minutt"}, - "second": {"one": "{0} sekund", "other": "{0} sekund"}, - "microsecond": {"one": "{0} mikrosekund", "other": "{0} mikrosekund"}, - }, - "relative": { - "year": { - "future": {"other": "om {0} år", "one": "om {0} år"}, - "past": {"other": "for {0} år sidan", "one": "for {0} år sidan"}, - }, - "month": { - "future": {"other": "om {0} månadar", "one": "om {0} månad"}, - "past": { - "other": "for {0} månadar sidan", - "one": "for {0} månad sidan", - }, - }, - "week": { - "future": {"other": "om {0} veker", "one": "om {0} veke"}, - "past": {"other": "for {0} veker sidan", "one": "for {0} veke sidan"}, - }, - "day": { - "future": {"other": "om {0} dagar", "one": "om {0} dag"}, - "past": {"other": "for {0} dagar sidan", "one": "for {0} dag sidan"}, - }, - "hour": { - "future": {"other": "om {0} timar", "one": "om {0} time"}, - "past": {"other": "for {0} timar sidan", "one": "for {0} time sidan"}, - }, - "minute": { - "future": {"other": "om {0} minutt", "one": "om {0} minutt"}, - "past": { - "other": "for {0} minutt sidan", - "one": "for {0} minutt sidan", - }, - }, - "second": { - "future": {"other": "om {0} sekund", "one": "om {0} sekund"}, - "past": { - "other": "for {0} sekund sidan", - "one": "for {0} sekund sidan", - }, - }, - }, - "day_periods": {"am": "formiddag", "pm": "ettermiddag"}, - }, - "custom": custom_translations, -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/pl/__init__.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/pl/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/pl/__pycache__/__init__.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/pl/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index c9e45af5..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/pl/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/pl/__pycache__/custom.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/pl/__pycache__/custom.cpython-311.pyc deleted file mode 100644 index 9c8f8e1a..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/pl/__pycache__/custom.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/pl/__pycache__/locale.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/pl/__pycache__/locale.cpython-311.pyc deleted file mode 100644 index bbe1a331..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/pl/__pycache__/locale.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/pl/custom.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/pl/custom.py deleted file mode 100644 index dc20eb88..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/pl/custom.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - - -""" -pl custom locale file. -""" - -translations = { - "units": {"few_second": "kilka sekund"}, - # Relative time - "ago": "{} temu", - "from_now": "za {}", - "after": "{0} po", - "before": "{0} przed", - # Date formats - "date_formats": { - "LTS": "HH:mm:ss", - "LT": "HH:mm", - "L": "DD.MM.YYYY", - "LL": "D MMMM YYYY", - "LLL": "D MMMM YYYY HH:mm", - "LLLL": "dddd, D MMMM YYYY HH:mm", - }, -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/pl/locale.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/pl/locale.py deleted file mode 100644 index e603efba..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/pl/locale.py +++ /dev/null @@ -1,282 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from .custom import translations as custom_translations - - -""" -pl locale file. - -It has been generated automatically and must not be modified directly. -""" - - -locale = { - "plural": lambda n: "few" - if ( - ( - (0 == 0 and ((0 == 0))) - and ((n % 10) == (n % 10) and (((n % 10) >= 2 and (n % 10) <= 4))) - ) - and (not ((n % 100) == (n % 100) and (((n % 100) >= 12 and (n % 100) <= 14)))) - ) - else "many" - if ( - ( - ( - ((0 == 0 and ((0 == 0))) and (not (n == n and ((n == 1))))) - and ((n % 10) == (n % 10) and (((n % 10) >= 0 and (n % 10) <= 1))) - ) - or ( - (0 == 0 and ((0 == 0))) - and ((n % 10) == (n % 10) and (((n % 10) >= 5 and (n % 10) <= 9))) - ) - ) - or ( - (0 == 0 and ((0 == 0))) - and ((n % 100) == (n % 100) and (((n % 100) >= 12 and (n % 100) <= 14))) - ) - ) - else "one" - if ((n == n and ((n == 1))) and (0 == 0 and ((0 == 0)))) - else "other", - "ordinal": lambda n: "other", - "translations": { - "days": { - "abbreviated": { - 0: "niedz.", - 1: "pon.", - 2: "wt.", - 3: "śr.", - 4: "czw.", - 5: "pt.", - 6: "sob.", - }, - "narrow": {0: "n", 1: "p", 2: "w", 3: "ś", 4: "c", 5: "p", 6: "s"}, - "short": { - 0: "nie", - 1: "pon", - 2: "wto", - 3: "śro", - 4: "czw", - 5: "pią", - 6: "sob", - }, - "wide": { - 0: "niedziela", - 1: "poniedziałek", - 2: "wtorek", - 3: "środa", - 4: "czwartek", - 5: "piątek", - 6: "sobota", - }, - }, - "months": { - "abbreviated": { - 1: "sty", - 2: "lut", - 3: "mar", - 4: "kwi", - 5: "maj", - 6: "cze", - 7: "lip", - 8: "sie", - 9: "wrz", - 10: "paź", - 11: "lis", - 12: "gru", - }, - "narrow": { - 1: "s", - 2: "l", - 3: "m", - 4: "k", - 5: "m", - 6: "c", - 7: "l", - 8: "s", - 9: "w", - 10: "p", - 11: "l", - 12: "g", - }, - "wide": { - 1: "stycznia", - 2: "lutego", - 3: "marca", - 4: "kwietnia", - 5: "maja", - 6: "czerwca", - 7: "lipca", - 8: "sierpnia", - 9: "września", - 10: "października", - 11: "listopada", - 12: "grudnia", - }, - }, - "units": { - "year": { - "one": "{0} rok", - "few": "{0} lata", - "many": "{0} lat", - "other": "{0} roku", - }, - "month": { - "one": "{0} miesiąc", - "few": "{0} miesiące", - "many": "{0} miesięcy", - "other": "{0} miesiąca", - }, - "week": { - "one": "{0} tydzień", - "few": "{0} tygodnie", - "many": "{0} tygodni", - "other": "{0} tygodnia", - }, - "day": { - "one": "{0} dzień", - "few": "{0} dni", - "many": "{0} dni", - "other": "{0} dnia", - }, - "hour": { - "one": "{0} godzina", - "few": "{0} godziny", - "many": "{0} godzin", - "other": "{0} godziny", - }, - "minute": { - "one": "{0} minuta", - "few": "{0} minuty", - "many": "{0} minut", - "other": "{0} minuty", - }, - "second": { - "one": "{0} sekunda", - "few": "{0} sekundy", - "many": "{0} sekund", - "other": "{0} sekundy", - }, - "microsecond": { - "one": "{0} mikrosekunda", - "few": "{0} mikrosekundy", - "many": "{0} mikrosekund", - "other": "{0} mikrosekundy", - }, - }, - "relative": { - "year": { - "future": { - "other": "za {0} roku", - "one": "za {0} rok", - "few": "za {0} lata", - "many": "za {0} lat", - }, - "past": { - "other": "{0} roku temu", - "one": "{0} rok temu", - "few": "{0} lata temu", - "many": "{0} lat temu", - }, - }, - "month": { - "future": { - "other": "za {0} miesiąca", - "one": "za {0} miesiąc", - "few": "za {0} miesiące", - "many": "za {0} miesięcy", - }, - "past": { - "other": "{0} miesiąca temu", - "one": "{0} miesiąc temu", - "few": "{0} miesiące temu", - "many": "{0} miesięcy temu", - }, - }, - "week": { - "future": { - "other": "za {0} tygodnia", - "one": "za {0} tydzień", - "few": "za {0} tygodnie", - "many": "za {0} tygodni", - }, - "past": { - "other": "{0} tygodnia temu", - "one": "{0} tydzień temu", - "few": "{0} tygodnie temu", - "many": "{0} tygodni temu", - }, - }, - "day": { - "future": { - "other": "za {0} dnia", - "one": "za {0} dzień", - "few": "za {0} dni", - "many": "za {0} dni", - }, - "past": { - "other": "{0} dnia temu", - "one": "{0} dzień temu", - "few": "{0} dni temu", - "many": "{0} dni temu", - }, - }, - "hour": { - "future": { - "other": "za {0} godziny", - "one": "za {0} godzinę", - "few": "za {0} godziny", - "many": "za {0} godzin", - }, - "past": { - "other": "{0} godziny temu", - "one": "{0} godzinę temu", - "few": "{0} godziny temu", - "many": "{0} godzin temu", - }, - }, - "minute": { - "future": { - "other": "za {0} minuty", - "one": "za {0} minutę", - "few": "za {0} minuty", - "many": "za {0} minut", - }, - "past": { - "other": "{0} minuty temu", - "one": "{0} minutę temu", - "few": "{0} minuty temu", - "many": "{0} minut temu", - }, - }, - "second": { - "future": { - "other": "za {0} sekundy", - "one": "za {0} sekundę", - "few": "za {0} sekundy", - "many": "za {0} sekund", - }, - "past": { - "other": "{0} sekundy temu", - "one": "{0} sekundę temu", - "few": "{0} sekundy temu", - "many": "{0} sekund temu", - }, - }, - }, - "day_periods": { - "midnight": "o północy", - "am": "AM", - "noon": "w południe", - "pm": "PM", - "morning1": "rano", - "morning2": "przed południem", - "afternoon1": "po południu", - "evening1": "wieczorem", - "night1": "w nocy", - }, - }, - "custom": custom_translations, -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/pt_br/__init__.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/pt_br/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/pt_br/__pycache__/__init__.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/pt_br/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 378837ee..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/pt_br/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/pt_br/__pycache__/custom.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/pt_br/__pycache__/custom.cpython-311.pyc deleted file mode 100644 index 9deae518..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/pt_br/__pycache__/custom.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/pt_br/__pycache__/locale.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/pt_br/__pycache__/locale.cpython-311.pyc deleted file mode 100644 index e2c45d2c..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/pt_br/__pycache__/locale.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/pt_br/custom.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/pt_br/custom.py deleted file mode 100644 index 3cc3f0df..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/pt_br/custom.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - - -""" -pt-br custom locale file. -""" - -translations = { - # Relative time - "after": "após {0}", - "before": "{0} atrás", - # Date formats - "date_formats": { - "LTS": "HH:mm:ss", - "LT": "HH:mm", - "LLLL": "dddd, D [de] MMMM [de] YYYY [às] HH:mm", - "LLL": "D [de] MMMM [de] YYYY [às] HH:mm", - "LL": "D [de] MMMM [de] YYYY", - "L": "DD/MM/YYYY", - }, -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/pt_br/locale.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/pt_br/locale.py deleted file mode 100644 index c70c6715..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/pt_br/locale.py +++ /dev/null @@ -1,146 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from .custom import translations as custom_translations - - -""" -pt_br locale file. - -It has been generated automatically and must not be modified directly. -""" - - -locale = { - "plural": lambda n: "one" - if ((n == n and ((n >= 0 and n <= 2))) and (not (n == n and ((n == 2))))) - else "other", - "ordinal": lambda n: "other", - "translations": { - "days": { - "abbreviated": { - 0: "dom", - 1: "seg", - 2: "ter", - 3: "qua", - 4: "qui", - 5: "sex", - 6: "sáb", - }, - "narrow": {0: "D", 1: "S", 2: "T", 3: "Q", 4: "Q", 5: "S", 6: "S"}, - "short": { - 0: "dom", - 1: "seg", - 2: "ter", - 3: "qua", - 4: "qui", - 5: "sex", - 6: "sáb", - }, - "wide": { - 0: "domingo", - 1: "segunda-feira", - 2: "terça-feira", - 3: "quarta-feira", - 4: "quinta-feira", - 5: "sexta-feira", - 6: "sábado", - }, - }, - "months": { - "abbreviated": { - 1: "jan", - 2: "fev", - 3: "mar", - 4: "abr", - 5: "mai", - 6: "jun", - 7: "jul", - 8: "ago", - 9: "set", - 10: "out", - 11: "nov", - 12: "dez", - }, - "narrow": { - 1: "J", - 2: "F", - 3: "M", - 4: "A", - 5: "M", - 6: "J", - 7: "J", - 8: "A", - 9: "S", - 10: "O", - 11: "N", - 12: "D", - }, - "wide": { - 1: "janeiro", - 2: "fevereiro", - 3: "março", - 4: "abril", - 5: "maio", - 6: "junho", - 7: "julho", - 8: "agosto", - 9: "setembro", - 10: "outubro", - 11: "novembro", - 12: "dezembro", - }, - }, - "units": { - "year": {"one": "{0} ano", "other": "{0} anos"}, - "month": {"one": "{0} mês", "other": "{0} meses"}, - "week": {"one": "{0} semana", "other": "{0} semanas"}, - "day": {"one": "{0} dia", "other": "{0} dias"}, - "hour": {"one": "{0} hora", "other": "{0} horas"}, - "minute": {"one": "{0} minuto", "other": "{0} minutos"}, - "second": {"one": "{0} segundo", "other": "{0} segundos"}, - "microsecond": {"one": "{0} microssegundo", "other": "{0} microssegundos"}, - }, - "relative": { - "year": { - "future": {"other": "em {0} anos", "one": "em {0} ano"}, - "past": {"other": "há {0} anos", "one": "há {0} ano"}, - }, - "month": { - "future": {"other": "em {0} meses", "one": "em {0} mês"}, - "past": {"other": "há {0} meses", "one": "há {0} mês"}, - }, - "week": { - "future": {"other": "em {0} semanas", "one": "em {0} semana"}, - "past": {"other": "há {0} semanas", "one": "há {0} semana"}, - }, - "day": { - "future": {"other": "em {0} dias", "one": "em {0} dia"}, - "past": {"other": "há {0} dias", "one": "há {0} dia"}, - }, - "hour": { - "future": {"other": "em {0} horas", "one": "em {0} hora"}, - "past": {"other": "há {0} horas", "one": "há {0} hora"}, - }, - "minute": { - "future": {"other": "em {0} minutos", "one": "em {0} minuto"}, - "past": {"other": "há {0} minutos", "one": "há {0} minuto"}, - }, - "second": { - "future": {"other": "em {0} segundos", "one": "em {0} segundo"}, - "past": {"other": "há {0} segundos", "one": "há {0} segundo"}, - }, - }, - "day_periods": { - "midnight": "meia-noite", - "am": "AM", - "noon": "meio-dia", - "pm": "PM", - "morning1": "da manhã", - "afternoon1": "da tarde", - "evening1": "da noite", - "night1": "da madrugada", - }, - }, - "custom": custom_translations, -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/ru/__init__.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/ru/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/ru/__pycache__/__init__.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/ru/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 7d630f26..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/ru/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/ru/__pycache__/custom.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/ru/__pycache__/custom.cpython-311.pyc deleted file mode 100644 index 71cbb5c9..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/ru/__pycache__/custom.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/ru/__pycache__/locale.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/ru/__pycache__/locale.cpython-311.pyc deleted file mode 100644 index ebbc571d..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/ru/__pycache__/locale.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/ru/custom.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/ru/custom.py deleted file mode 100644 index ed770c37..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/ru/custom.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - - -""" -ru custom locale file. -""" - -translations = { - # Relative time - "ago": "{} назад", - "from_now": "через {}", - "after": "{0} после", - "before": "{0} до", - # Date formats - "date_formats": { - "LTS": "HH:mm:ss", - "LT": "HH:mm", - "L": "DD.MM.YYYY", - "LL": "D MMMM YYYY г.", - "LLL": "D MMMM YYYY г., HH:mm", - "LLLL": "dddd, D MMMM YYYY г., HH:mm", - }, -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/ru/locale.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/ru/locale.py deleted file mode 100644 index 8c7d53b1..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/ru/locale.py +++ /dev/null @@ -1,273 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from .custom import translations as custom_translations - - -""" -ru locale file. - -It has been generated automatically and must not be modified directly. -""" - - -locale = { - "plural": lambda n: "few" - if ( - ( - (0 == 0 and ((0 == 0))) - and ((n % 10) == (n % 10) and (((n % 10) >= 2 and (n % 10) <= 4))) - ) - and (not ((n % 100) == (n % 100) and (((n % 100) >= 12 and (n % 100) <= 14)))) - ) - else "many" - if ( - ( - ((0 == 0 and ((0 == 0))) and ((n % 10) == (n % 10) and (((n % 10) == 0)))) - or ( - (0 == 0 and ((0 == 0))) - and ((n % 10) == (n % 10) and (((n % 10) >= 5 and (n % 10) <= 9))) - ) - ) - or ( - (0 == 0 and ((0 == 0))) - and ((n % 100) == (n % 100) and (((n % 100) >= 11 and (n % 100) <= 14))) - ) - ) - else "one" - if ( - ((0 == 0 and ((0 == 0))) and ((n % 10) == (n % 10) and (((n % 10) == 1)))) - and (not ((n % 100) == (n % 100) and (((n % 100) == 11)))) - ) - else "other", - "ordinal": lambda n: "other", - "translations": { - "days": { - "abbreviated": { - 0: "вс", - 1: "пн", - 2: "вт", - 3: "ср", - 4: "чт", - 5: "пт", - 6: "сб", - }, - "narrow": {0: "вс", 1: "пн", 2: "вт", 3: "ср", 4: "чт", 5: "пт", 6: "сб"}, - "short": {0: "вс", 1: "пн", 2: "вт", 3: "ср", 4: "чт", 5: "пт", 6: "сб"}, - "wide": { - 0: "воскресенье", - 1: "понедельник", - 2: "вторник", - 3: "среда", - 4: "четверг", - 5: "пятница", - 6: "суббота", - }, - }, - "months": { - "abbreviated": { - 1: "янв.", - 2: "февр.", - 3: "мар.", - 4: "апр.", - 5: "мая", - 6: "июн.", - 7: "июл.", - 8: "авг.", - 9: "сент.", - 10: "окт.", - 11: "нояб.", - 12: "дек.", - }, - "narrow": { - 1: "Я", - 2: "Ф", - 3: "М", - 4: "А", - 5: "М", - 6: "И", - 7: "И", - 8: "А", - 9: "С", - 10: "О", - 11: "Н", - 12: "Д", - }, - "wide": { - 1: "января", - 2: "февраля", - 3: "марта", - 4: "апреля", - 5: "мая", - 6: "июня", - 7: "июля", - 8: "августа", - 9: "сентября", - 10: "октября", - 11: "ноября", - 12: "декабря", - }, - }, - "units": { - "year": { - "one": "{0} год", - "few": "{0} года", - "many": "{0} лет", - "other": "{0} года", - }, - "month": { - "one": "{0} месяц", - "few": "{0} месяца", - "many": "{0} месяцев", - "other": "{0} месяца", - }, - "week": { - "one": "{0} неделя", - "few": "{0} недели", - "many": "{0} недель", - "other": "{0} недели", - }, - "day": { - "one": "{0} день", - "few": "{0} дня", - "many": "{0} дней", - "other": "{0} дня", - }, - "hour": { - "one": "{0} час", - "few": "{0} часа", - "many": "{0} часов", - "other": "{0} часа", - }, - "minute": { - "one": "{0} минута", - "few": "{0} минуты", - "many": "{0} минут", - "other": "{0} минуты", - }, - "second": { - "one": "{0} секунда", - "few": "{0} секунды", - "many": "{0} секунд", - "other": "{0} секунды", - }, - "microsecond": { - "one": "{0} микросекунда", - "few": "{0} микросекунды", - "many": "{0} микросекунд", - "other": "{0} микросекунды", - }, - }, - "relative": { - "year": { - "future": { - "other": "через {0} года", - "one": "через {0} год", - "few": "через {0} года", - "many": "через {0} лет", - }, - "past": { - "other": "{0} года назад", - "one": "{0} год назад", - "few": "{0} года назад", - "many": "{0} лет назад", - }, - }, - "month": { - "future": { - "other": "через {0} месяца", - "one": "через {0} месяц", - "few": "через {0} месяца", - "many": "через {0} месяцев", - }, - "past": { - "other": "{0} месяца назад", - "one": "{0} месяц назад", - "few": "{0} месяца назад", - "many": "{0} месяцев назад", - }, - }, - "week": { - "future": { - "other": "через {0} недели", - "one": "через {0} неделю", - "few": "через {0} недели", - "many": "через {0} недель", - }, - "past": { - "other": "{0} недели назад", - "one": "{0} неделю назад", - "few": "{0} недели назад", - "many": "{0} недель назад", - }, - }, - "day": { - "future": { - "other": "через {0} дня", - "one": "через {0} день", - "few": "через {0} дня", - "many": "через {0} дней", - }, - "past": { - "other": "{0} дня назад", - "one": "{0} день назад", - "few": "{0} дня назад", - "many": "{0} дней назад", - }, - }, - "hour": { - "future": { - "other": "через {0} часа", - "one": "через {0} час", - "few": "через {0} часа", - "many": "через {0} часов", - }, - "past": { - "other": "{0} часа назад", - "one": "{0} час назад", - "few": "{0} часа назад", - "many": "{0} часов назад", - }, - }, - "minute": { - "future": { - "other": "через {0} минуты", - "one": "через {0} минуту", - "few": "через {0} минуты", - "many": "через {0} минут", - }, - "past": { - "other": "{0} минуты назад", - "one": "{0} минуту назад", - "few": "{0} минуты назад", - "many": "{0} минут назад", - }, - }, - "second": { - "future": { - "other": "через {0} секунды", - "one": "через {0} секунду", - "few": "через {0} секунды", - "many": "через {0} секунд", - }, - "past": { - "other": "{0} секунды назад", - "one": "{0} секунду назад", - "few": "{0} секунды назад", - "many": "{0} секунд назад", - }, - }, - }, - "day_periods": { - "midnight": "полночь", - "am": "AM", - "noon": "полдень", - "pm": "PM", - "morning1": "утра", - "afternoon1": "дня", - "evening1": "вечера", - "night1": "ночи", - }, - }, - "custom": custom_translations, -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/zh/__init__.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/zh/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/zh/__pycache__/__init__.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/zh/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 68fceec0..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/zh/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/zh/__pycache__/custom.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/zh/__pycache__/custom.cpython-311.pyc deleted file mode 100644 index 243c5eaa..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/zh/__pycache__/custom.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/zh/__pycache__/locale.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/zh/__pycache__/locale.cpython-311.pyc deleted file mode 100644 index be599e3f..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/zh/__pycache__/locale.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/zh/custom.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/zh/custom.py deleted file mode 100644 index 7b35d661..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/zh/custom.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - - -""" -zh custom locale file. -""" - -translations = { - # Relative time - "after": "{time}后", - "before": "{time}前", - # Date formats - "date_formats": { - "LTS": "Ah点m分s秒", - "LT": "Ah点mm分", - "LLLL": "YYYY年MMMD日ddddAh点mm分", - "LLL": "YYYY年MMMD日Ah点mm分", - "LL": "YYYY年MMMD日", - "L": "YYYY-MM-DD", - }, -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/zh/locale.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/zh/locale.py deleted file mode 100644 index ea04fc36..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/locales/zh/locale.py +++ /dev/null @@ -1,116 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from .custom import translations as custom_translations - - -""" -zh locale file. - -It has been generated automatically and must not be modified directly. -""" - - -locale = { - "plural": lambda n: "other", - "ordinal": lambda n: "other", - "translations": { - "days": { - "abbreviated": { - 0: "周日", - 1: "周一", - 2: "周二", - 3: "周三", - 4: "周四", - 5: "周五", - 6: "周六", - }, - "narrow": {0: "日", 1: "一", 2: "二", 3: "三", 4: "四", 5: "五", 6: "六"}, - "short": {0: "周日", 1: "周一", 2: "周二", 3: "周三", 4: "周四", 5: "周五", 6: "周六"}, - "wide": { - 0: "星期日", - 1: "星期一", - 2: "星期二", - 3: "星期三", - 4: "星期四", - 5: "星期五", - 6: "星期六", - }, - }, - "months": { - "abbreviated": { - 1: "1月", - 2: "2月", - 3: "3月", - 4: "4月", - 5: "5月", - 6: "6月", - 7: "7月", - 8: "8月", - 9: "9月", - 10: "10月", - 11: "11月", - 12: "12月", - }, - "narrow": { - 1: "1", - 2: "2", - 3: "3", - 4: "4", - 5: "5", - 6: "6", - 7: "7", - 8: "8", - 9: "9", - 10: "10", - 11: "11", - 12: "12", - }, - "wide": { - 1: "一月", - 2: "二月", - 3: "三月", - 4: "四月", - 5: "五月", - 6: "六月", - 7: "七月", - 8: "八月", - 9: "九月", - 10: "十月", - 11: "十一月", - 12: "十二月", - }, - }, - "units": { - "year": {"other": "{0}年"}, - "month": {"other": "{0}个月"}, - "week": {"other": "{0}周"}, - "day": {"other": "{0}天"}, - "hour": {"other": "{0}小时"}, - "minute": {"other": "{0}分钟"}, - "second": {"other": "{0}秒钟"}, - "microsecond": {"other": "{0}微秒"}, - }, - "relative": { - "year": {"future": {"other": "{0}年后"}, "past": {"other": "{0}年前"}}, - "month": {"future": {"other": "{0}个月后"}, "past": {"other": "{0}个月前"}}, - "week": {"future": {"other": "{0}周后"}, "past": {"other": "{0}周前"}}, - "day": {"future": {"other": "{0}天后"}, "past": {"other": "{0}天前"}}, - "hour": {"future": {"other": "{0}小时后"}, "past": {"other": "{0}小时前"}}, - "minute": {"future": {"other": "{0}分钟后"}, "past": {"other": "{0}分钟前"}}, - "second": {"future": {"other": "{0}秒钟后"}, "past": {"other": "{0}秒钟前"}}, - }, - "day_periods": { - "midnight": "午夜", - "am": "上午", - "pm": "下午", - "morning1": "清晨", - "morning2": "上午", - "afternoon1": "下午", - "afternoon2": "下午", - "evening1": "晚上", - "night1": "凌晨", - }, - }, - "custom": custom_translations, -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/mixins/__init__.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/mixins/__init__.py deleted file mode 100644 index 4c48b5ac..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/mixins/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# -*- coding: utf-8 -*- diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/mixins/__pycache__/__init__.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/mixins/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 01b73949..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/mixins/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/mixins/__pycache__/default.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/mixins/__pycache__/default.cpython-311.pyc deleted file mode 100644 index 22e82c58..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/mixins/__pycache__/default.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/mixins/default.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/mixins/default.py deleted file mode 100644 index bfb5912b..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/mixins/default.py +++ /dev/null @@ -1,43 +0,0 @@ -from ..formatting import Formatter - - -_formatter = Formatter() - - -class FormattableMixin(object): - - _formatter = _formatter - - def format(self, fmt, locale=None): - """ - Formats the instance using the given format. - - :param fmt: The format to use - :type fmt: str - - :param locale: The locale to use - :type locale: str or None - - :rtype: str - """ - return self._formatter.format(self, fmt, locale) - - def for_json(self): - """ - Methods for automatic json serialization by simplejson - - :rtype: str - """ - return str(self) - - def __format__(self, format_spec): - if len(format_spec) > 0: - if "%" in format_spec: - return self.strftime(format_spec) - - return self.format(format_spec) - - return str(self) - - def __str__(self): - return self.isoformat() diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/parser.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/parser.py deleted file mode 100644 index 9b9e383b..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/parser.py +++ /dev/null @@ -1,121 +0,0 @@ -from __future__ import absolute_import - -import datetime -import typing - -import pendulum - -from .date import Date -from .datetime import DateTime -from .parsing import _Interval -from .parsing import parse as base_parse -from .time import Duration -from .time import Time -from .tz import UTC - - -try: - from .parsing._iso8601 import Duration as CDuration -except ImportError: - CDuration = None - - -def parse( - text, **options -): # type: (str, **typing.Any) -> typing.Union[Date, Time, DateTime, Duration] - # Use the mock now value if it exists - options["now"] = options.get("now", pendulum.get_test_now()) - - return _parse(text, **options) - - -def _parse(text, **options): - """ - Parses a string with the given options. - - :param text: The string to parse. - :type text: str - - :rtype: mixed - """ - # Handling special cases - if text == "now": - return pendulum.now() - - parsed = base_parse(text, **options) - - if isinstance(parsed, datetime.datetime): - return pendulum.datetime( - parsed.year, - parsed.month, - parsed.day, - parsed.hour, - parsed.minute, - parsed.second, - parsed.microsecond, - tz=parsed.tzinfo or options.get("tz", UTC), - ) - - if isinstance(parsed, datetime.date): - return pendulum.date(parsed.year, parsed.month, parsed.day) - - if isinstance(parsed, datetime.time): - return pendulum.time( - parsed.hour, parsed.minute, parsed.second, parsed.microsecond - ) - - if isinstance(parsed, _Interval): - if parsed.duration is not None: - duration = parsed.duration - - if parsed.start is not None: - dt = pendulum.instance(parsed.start, tz=options.get("tz", UTC)) - - return pendulum.period( - dt, - dt.add( - years=duration.years, - months=duration.months, - weeks=duration.weeks, - days=duration.remaining_days, - hours=duration.hours, - minutes=duration.minutes, - seconds=duration.remaining_seconds, - microseconds=duration.microseconds, - ), - ) - - dt = pendulum.instance(parsed.end, tz=options.get("tz", UTC)) - - return pendulum.period( - dt.subtract( - years=duration.years, - months=duration.months, - weeks=duration.weeks, - days=duration.remaining_days, - hours=duration.hours, - minutes=duration.minutes, - seconds=duration.remaining_seconds, - microseconds=duration.microseconds, - ), - dt, - ) - - return pendulum.period( - pendulum.instance(parsed.start, tz=options.get("tz", UTC)), - pendulum.instance(parsed.end, tz=options.get("tz", UTC)), - ) - - if CDuration and isinstance(parsed, CDuration): - return pendulum.duration( - years=parsed.years, - months=parsed.months, - weeks=parsed.weeks, - days=parsed.days, - hours=parsed.hours, - minutes=parsed.minutes, - seconds=parsed.seconds, - microseconds=parsed.microseconds, - ) - - return parsed diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/parsing/__init__.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/parsing/__init__.py deleted file mode 100644 index 400f119b..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/parsing/__init__.py +++ /dev/null @@ -1,234 +0,0 @@ -import copy -import os -import re -import struct - -from datetime import date -from datetime import datetime -from datetime import time - -from dateutil import parser - -from .exceptions import ParserError - - -with_extensions = os.getenv("PENDULUM_EXTENSIONS", "1") == "1" - -try: - if not with_extensions or struct.calcsize("P") == 4: - raise ImportError() - - from ._iso8601 import parse_iso8601 -except ImportError: - from .iso8601 import parse_iso8601 - - -COMMON = re.compile( - # Date (optional) - "^" - "(?P<date>" - " (?P<classic>" # Classic date (YYYY-MM-DD) - r" (?P<year>\d{4})" # Year - " (?P<monthday>" - r" (?P<monthsep>[/:])?(?P<month>\d{2})" # Month (optional) - r" ((?P<daysep>[/:])?(?P<day>\d{2}))" # Day (optional) - " )?" - " )" - ")?" - # Time (optional) - "(?P<time>" - r" (?P<timesep>\ )?" # Separator (space) - r" (?P<hour>\d{1,2}):(?P<minute>\d{1,2})?(?::(?P<second>\d{1,2}))?" # HH:mm:ss (optional mm and ss) - # Subsecond part (optional) - " (?P<subsecondsection>" - " (?:[.|,])" # Subsecond separator (optional) - r" (?P<subsecond>\d{1,9})" # Subsecond - " )?" - ")?" - "$", - re.VERBOSE, -) - - -DEFAULT_OPTIONS = { - "day_first": False, - "year_first": True, - "strict": True, - "exact": False, - "now": None, -} - - -def parse(text, **options): - """ - Parses a string with the given options. - - :param text: The string to parse. - :type text: str - - :rtype: Parsed - """ - _options = copy.copy(DEFAULT_OPTIONS) - _options.update(options) - - return _normalize(_parse(text, **_options), **_options) - - -def _normalize(parsed, **options): - """ - Normalizes the parsed element. - - :param parsed: The parsed elements. - :type parsed: Parsed - - :rtype: Parsed - """ - if options.get("exact"): - return parsed - - if isinstance(parsed, time): - now = options["now"] or datetime.now() - - return datetime( - now.year, - now.month, - now.day, - parsed.hour, - parsed.minute, - parsed.second, - parsed.microsecond, - ) - elif isinstance(parsed, date) and not isinstance(parsed, datetime): - return datetime(parsed.year, parsed.month, parsed.day) - - return parsed - - -def _parse(text, **options): - # Trying to parse ISO8601 - try: - return parse_iso8601(text) - except ValueError: - pass - - try: - return _parse_iso8601_interval(text) - except ValueError: - pass - - try: - return _parse_common(text, **options) - except ParserError: - pass - - # We couldn't parse the string - # so we fallback on the dateutil parser - # If not strict - if options.get("strict", True): - raise ParserError("Unable to parse string [{}]".format(text)) - - try: - dt = parser.parse( - text, dayfirst=options["day_first"], yearfirst=options["year_first"] - ) - except ValueError: - raise ParserError("Invalid date string: {}".format(text)) - - return dt - - -def _parse_common(text, **options): - """ - Tries to parse the string as a common datetime format. - - :param text: The string to parse. - :type text: str - - :rtype: dict or None - """ - m = COMMON.match(text) - has_date = False - year = 0 - month = 1 - day = 1 - - if not m: - raise ParserError("Invalid datetime string") - - if m.group("date"): - # A date has been specified - has_date = True - - year = int(m.group("year")) - - if not m.group("monthday"): - # No month and day - month = 1 - day = 1 - else: - if options["day_first"]: - month = int(m.group("day")) - day = int(m.group("month")) - else: - month = int(m.group("month")) - day = int(m.group("day")) - - if not m.group("time"): - return date(year, month, day) - - # Grabbing hh:mm:ss - hour = int(m.group("hour")) - - minute = int(m.group("minute")) - - if m.group("second"): - second = int(m.group("second")) - else: - second = 0 - - # Grabbing subseconds, if any - microsecond = 0 - if m.group("subsecondsection"): - # Limiting to 6 chars - subsecond = m.group("subsecond")[:6] - - microsecond = int("{:0<6}".format(subsecond)) - - if has_date: - return datetime(year, month, day, hour, minute, second, microsecond) - - return time(hour, minute, second, microsecond) - - -class _Interval: - """ - Special class to handle ISO 8601 intervals - """ - - def __init__(self, start=None, end=None, duration=None): - self.start = start - self.end = end - self.duration = duration - - -def _parse_iso8601_interval(text): - if "/" not in text: - raise ParserError("Invalid interval") - - first, last = text.split("/") - start = end = duration = None - - if first[0] == "P": - # duration/end - duration = parse_iso8601(first) - end = parse_iso8601(last) - elif last[0] == "P": - # start/duration - start = parse_iso8601(first) - duration = parse_iso8601(last) - else: - # start/end - start = parse_iso8601(first) - end = parse_iso8601(last) - - return _Interval(start, end, duration) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/parsing/__pycache__/__init__.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/parsing/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index d60e561d..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/parsing/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/parsing/__pycache__/iso8601.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/parsing/__pycache__/iso8601.cpython-311.pyc deleted file mode 100644 index ef2b1ad2..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/parsing/__pycache__/iso8601.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/parsing/_iso8601.c b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/parsing/_iso8601.c deleted file mode 100644 index 2e14e4b9..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/parsing/_iso8601.c +++ /dev/null @@ -1,1371 +0,0 @@ -/* ------------------------------------------------------------------------- */ - -#include <Python.h> -#include <datetime.h> -#include <structmember.h> -#include <math.h> -#include <stdio.h> -#include <stdlib.h> -#include <stdint.h> - -#ifndef PyVarObject_HEAD_INIT -#define PyVarObject_HEAD_INIT(type, size) PyObject_HEAD_INIT(type) size, -#endif - - -/* ------------------------------------------------------------------------- */ - -#define EPOCH_YEAR 1970 - -#define DAYS_PER_N_YEAR 365 -#define DAYS_PER_L_YEAR 366 - -#define USECS_PER_SEC 1000000 - -#define SECS_PER_MIN 60 -#define SECS_PER_HOUR (60 * SECS_PER_MIN) -#define SECS_PER_DAY (SECS_PER_HOUR * 24) - -// 400-year chunks always have 146097 days (20871 weeks). -#define DAYS_PER_400_YEARS 146097L -#define SECS_PER_400_YEARS ((int64_t)DAYS_PER_400_YEARS * (int64_t)SECS_PER_DAY) - -// The number of seconds in an aligned 100-year chunk, for those that -// do not begin with a leap year and those that do respectively. -const int64_t SECS_PER_100_YEARS[2] = { - (uint64_t)(76L * DAYS_PER_N_YEAR + 24L * DAYS_PER_L_YEAR) * SECS_PER_DAY, - (uint64_t)(75L * DAYS_PER_N_YEAR + 25L * DAYS_PER_L_YEAR) * SECS_PER_DAY -}; - -// The number of seconds in an aligned 4-year chunk, for those that -// do not begin with a leap year and those that do respectively. -const int32_t SECS_PER_4_YEARS[2] = { - (4 * DAYS_PER_N_YEAR + 0 * DAYS_PER_L_YEAR) * SECS_PER_DAY, - (3 * DAYS_PER_N_YEAR + 1 * DAYS_PER_L_YEAR) * SECS_PER_DAY -}; - -// The number of seconds in non-leap and leap years respectively. -const int32_t SECS_PER_YEAR[2] = { - DAYS_PER_N_YEAR * SECS_PER_DAY, - DAYS_PER_L_YEAR * SECS_PER_DAY -}; - -#define MONTHS_PER_YEAR 12 - -// The month lengths in non-leap and leap years respectively. -const int32_t DAYS_PER_MONTHS[2][13] = { - {-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, - {-1, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} -}; - -// The day offsets of the beginning of each (1-based) month in non-leap -// and leap years respectively. -// For example, in a leap year there are 335 days before December. -const int32_t MONTHS_OFFSETS[2][14] = { - {-1, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365}, - {-1, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366} -}; - -const int DAY_OF_WEEK_TABLE[12] = { - 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4 -}; - -#define TM_SUNDAY 0 -#define TM_MONDAY 1 -#define TM_TUESDAY 2 -#define TM_WEDNESDAY 3 -#define TM_THURSDAY 4 -#define TM_FRIDAY 5 -#define TM_SATURDAY 6 - -#define TM_JANUARY 0 -#define TM_FEBRUARY 1 -#define TM_MARCH 2 -#define TM_APRIL 3 -#define TM_MAY 4 -#define TM_JUNE 5 -#define TM_JULY 6 -#define TM_AUGUST 7 -#define TM_SEPTEMBER 8 -#define TM_OCTOBER 9 -#define TM_NOVEMBER 10 -#define TM_DECEMBER 11 - -// Parsing errors -const int PARSER_INVALID_ISO8601 = 0; -const int PARSER_INVALID_DATE = 1; -const int PARSER_INVALID_TIME = 2; -const int PARSER_INVALID_WEEK_DATE = 3; -const int PARSER_INVALID_WEEK_NUMBER = 4; -const int PARSER_INVALID_WEEKDAY_NUMBER = 5; -const int PARSER_INVALID_ORDINAL_DAY_FOR_YEAR = 6; -const int PARSER_INVALID_MONTH_OR_DAY = 7; -const int PARSER_INVALID_MONTH = 8; -const int PARSER_INVALID_DAY_FOR_MONTH = 9; -const int PARSER_INVALID_HOUR = 10; -const int PARSER_INVALID_MINUTE = 11; -const int PARSER_INVALID_SECOND = 12; -const int PARSER_INVALID_SUBSECOND = 13; -const int PARSER_INVALID_TZ_OFFSET = 14; -const int PARSER_INVALID_DURATION = 15; -const int PARSER_INVALID_DURATION_FLOAT_YEAR_MONTH_NOT_SUPPORTED = 16; - -const char PARSER_ERRORS[17][80] = { - "Invalid ISO 8601 string", - "Invalid date", - "Invalid time", - "Invalid week date", - "Invalid week number", - "Invalid weekday number", - "Invalid ordinal day for year", - "Invalid month and/or day", - "Invalid month", - "Invalid day for month", - "Invalid hour", - "Invalid minute", - "Invalid second", - "Invalid subsecond", - "Invalid timezone offset", - "Invalid duration", - "Float years and months are not supported" -}; - -/* ------------------------------------------------------------------------- */ - - -int p(int y) { - return y + y/4 - y/100 + y/400; -} - -int is_leap(int year) { - return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0); -} - -int week_day(int year, int month, int day) { - int y; - int w; - - y = year - (month < 3); - - w = (p(y) + DAY_OF_WEEK_TABLE[month - 1] + day) % 7; - - if (!w) { - w = 7; - } - - return w; -} - -int days_in_year(int year) { - if (is_leap(year)) { - return DAYS_PER_L_YEAR; - } - - return DAYS_PER_N_YEAR; -} - -int is_long_year(int year) { - return (p(year) % 7 == 4) || (p(year - 1) % 7 == 3); -} - - -/* ------------------------ Custom Types ------------------------------- */ - - -/* - * class FixedOffset(tzinfo): - */ -typedef struct { - PyObject_HEAD - int offset; - char *tzname; -} FixedOffset; - -/* - * def __init__(self, offset): - * self.offset = offset -*/ -static int FixedOffset_init(FixedOffset *self, PyObject *args, PyObject *kwargs) { - int offset; - char *tzname = NULL; - - static char *kwlist[] = {"offset", "tzname", NULL}; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|s", kwlist, &offset, &tzname)) - return -1; - - self->offset = offset; - self->tzname = tzname; - - return 0; -} - -/* - * def utcoffset(self, dt): - * return timedelta(seconds=self.offset * 60) - */ -static PyObject *FixedOffset_utcoffset(FixedOffset *self, PyObject *args) { - return PyDelta_FromDSU(0, self->offset, 0); -} - -/* - * def dst(self, dt): - * return timedelta(seconds=self.offset * 60) - */ -static PyObject *FixedOffset_dst(FixedOffset *self, PyObject *args) { - return PyDelta_FromDSU(0, self->offset, 0); -} - -/* - * def tzname(self, dt): - * sign = '+' - * if self.offset < 0: - * sign = '-' - * return "%s%d:%d" % (sign, self.offset / 60, self.offset % 60) - */ -static PyObject *FixedOffset_tzname(FixedOffset *self, PyObject *args) { - if (self->tzname != NULL) { - return PyUnicode_FromString(self->tzname); - } - - char tzname_[7] = {0}; - char sign = '+'; - int offset = self->offset; - - if (offset < 0) { - sign = '-'; - offset *= -1; - } - - sprintf( - tzname_, - "%c%02d:%02d", - sign, - offset / SECS_PER_HOUR, - offset / SECS_PER_MIN % SECS_PER_MIN - ); - - return PyUnicode_FromString(tzname_); -} - -/* - * def __repr__(self): - * return self.tzname() - */ -static PyObject *FixedOffset_repr(FixedOffset *self) { - return FixedOffset_tzname(self, NULL); -} - -/* - * Class member / class attributes - */ -static PyMemberDef FixedOffset_members[] = { - {"offset", T_INT, offsetof(FixedOffset, offset), 0, "UTC offset"}, - {NULL} -}; - -/* - * Class methods - */ -static PyMethodDef FixedOffset_methods[] = { - {"utcoffset", (PyCFunction)FixedOffset_utcoffset, METH_VARARGS, ""}, - {"dst", (PyCFunction)FixedOffset_dst, METH_VARARGS, ""}, - {"tzname", (PyCFunction)FixedOffset_tzname, METH_VARARGS, ""}, - {NULL} -}; - -static PyTypeObject FixedOffset_type = { - PyVarObject_HEAD_INIT(NULL, 0) - "FixedOffset_type", /* tp_name */ - sizeof(FixedOffset), /* tp_basicsize */ - 0, /* tp_itemsize */ - 0, /* tp_dealloc */ - 0, /* tp_print */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - (reprfunc)FixedOffset_repr, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - (reprfunc)FixedOffset_repr, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /* tp_flags */ - "TZInfo with fixed offset", /* tp_doc */ -}; - -/* - * Instantiate new FixedOffset_type object - * Skip overhead of calling PyObject_New and PyObject_Init. - * Directly allocate object. - */ -static PyObject *new_fixed_offset_ex(int offset, char *name, PyTypeObject *type) { - FixedOffset *self = (FixedOffset *) (type->tp_alloc(type, 0)); - - if (self != NULL) - self->offset = offset; - self->tzname = name; - - return (PyObject *) self; -} - -#define new_fixed_offset(offset, name) new_fixed_offset_ex(offset, name, &FixedOffset_type) - - -/* - * class Duration(): - */ -typedef struct { - PyObject_HEAD - int years; - int months; - int weeks; - int days; - int hours; - int minutes; - int seconds; - int microseconds; -} Duration; - -/* - * def __init__(self, years, months, days, hours, minutes, seconds, microseconds): - * self.years = years - * # ... -*/ -static int Duration_init(Duration *self, PyObject *args, PyObject *kwargs) { - int years; - int months; - int weeks; - int days; - int hours; - int minutes; - int seconds; - int microseconds; - - if (!PyArg_ParseTuple(args, "iiiiiiii", &years, &months, &weeks, &days, &hours, &minutes, &seconds, µseconds)) - return -1; - - self->years = years; - self->months = months; - self->weeks = weeks; - self->days = days; - self->hours = hours; - self->minutes = minutes; - self->seconds = seconds; - self->microseconds = microseconds; - - return 0; -} - -/* - * def __repr__(self): - * return '{} years {} months {} days {} hours {} minutes {} seconds {} microseconds'.format( - * self.years, self.months, self.days, self.minutes, self.hours, self.seconds, self.microseconds - * ) - */ -static PyObject *Duration_repr(Duration *self) { - char repr[82] = {0}; - - sprintf( - repr, - "%d years %d months %d weeks %d days %d hours %d minutes %d seconds %d microseconds", - self->years, - self->months, - self->weeks, - self->days, - self->hours, - self->minutes, - self->seconds, - self->microseconds - ); - - return PyUnicode_FromString(repr); -} - -/* - * Instantiate new Duration_type object - * Skip overhead of calling PyObject_New and PyObject_Init. - * Directly allocate object. - */ -static PyObject *new_duration_ex(int years, int months, int weeks, int days, int hours, int minutes, int seconds, int microseconds, PyTypeObject *type) { - Duration *self = (Duration *) (type->tp_alloc(type, 0)); - - if (self != NULL) { - self->years = years; - self->months = months; - self->weeks = weeks; - self->days = days; - self->hours = hours; - self->minutes = minutes; - self->seconds = seconds; - self->microseconds = microseconds; - } - - return (PyObject *) self; -} - -/* - * Class member / class attributes - */ -static PyMemberDef Duration_members[] = { - {"years", T_INT, offsetof(Duration, years), 0, "years in duration"}, - {"months", T_INT, offsetof(Duration, months), 0, "months in duration"}, - {"weeks", T_INT, offsetof(Duration, weeks), 0, "weeks in duration"}, - {"days", T_INT, offsetof(Duration, days), 0, "days in duration"}, - {"remaining_days", T_INT, offsetof(Duration, days), 0, "days in duration"}, - {"hours", T_INT, offsetof(Duration, hours), 0, "hours in duration"}, - {"minutes", T_INT, offsetof(Duration, minutes), 0, "minutes in duration"}, - {"seconds", T_INT, offsetof(Duration, seconds), 0, "seconds in duration"}, - {"remaining_seconds", T_INT, offsetof(Duration, seconds), 0, "seconds in duration"}, - {"microseconds", T_INT, offsetof(Duration, microseconds), 0, "microseconds in duration"}, - {NULL} -}; - -static PyTypeObject Duration_type = { - PyVarObject_HEAD_INIT(NULL, 0) - "Duration", /* tp_name */ - sizeof(Duration), /* tp_basicsize */ - 0, /* tp_itemsize */ - 0, /* tp_dealloc */ - 0, /* tp_print */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ - 0, /* tp_as_async */ - (reprfunc)Duration_repr, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /* tp_hash */ - 0, /* tp_call */ - (reprfunc)Duration_repr, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /* tp_flags */ - "Duration", /* tp_doc */ -}; - -#define new_duration(years, months, weeks, days, hours, minutes, seconds, microseconds) new_duration_ex(years, months, weeks, days, hours, minutes, seconds, microseconds, &Duration_type) - -typedef struct { - int is_date; - int is_time; - int is_datetime; - int is_duration; - int is_period; - int ambiguous; - int year; - int month; - int day; - int hour; - int minute; - int second; - int microsecond; - int offset; - int has_offset; - char *tzname; - int years; - int months; - int weeks; - int days; - int hours; - int minutes; - int seconds; - int microseconds; - int error; -} Parsed; - - -Parsed* new_parsed() { - Parsed *parsed; - - if((parsed = malloc(sizeof *parsed)) != NULL) { - parsed->is_date = 0; - parsed->is_time = 0; - parsed->is_datetime = 0; - parsed->is_duration = 0; - parsed->is_period = 0; - - parsed->ambiguous = 0; - parsed->year = 0; - parsed->month = 1; - parsed->day = 1; - parsed->hour = 0; - parsed->minute = 0; - parsed->second = 0; - parsed->microsecond = 0; - parsed->offset = 0; - parsed->has_offset = 0; - parsed->tzname = NULL; - - parsed->years = 0; - parsed->months = 0; - parsed->weeks = 0; - parsed->days = 0; - parsed->hours = 0; - parsed->minutes = 0; - parsed->seconds = 0; - parsed->microseconds = 0; - - parsed->error = -1; - } - - return parsed; -} - - -/* -------------------------- Functions --------------------------*/ - -Parsed* _parse_iso8601_datetime(char *str, Parsed *parsed) { - char* c; - int monthday = 0; - int week = 0; - int weekday = 1; - int ordinal; - int tz_sign = 0; - int leap = 0; - int separators = 0; - int time = 0; - int has_hour = 0; - int i; - int j; - - // Assuming date only for now - parsed->is_date = 1; - - c = str; - - for (i = 0; i < 4; i++) { - if (*c >= '0' && *c <= '9') { - parsed->year = 10 * parsed->year + *c++ - '0'; - } else { - parsed->error = PARSER_INVALID_ISO8601; - - return NULL; - } - } - - leap = is_leap(parsed->year); - - // Optional separator - if (*c == '-') { - separators++; - c++; - } - - // Checking for week dates - if (*c == 'W') { - c++; - - i = 0; - while (*c != '\0' && *c != ' ' && *c != 'T') { - if (*c == '-') { - separators++; - c++; - continue; - } - - week = 10 * week + *c++ - '0'; - - i++; - } - - switch (i) { - case 2: - // Only week number - break; - case 3: - // Week with weekday - if (!(separators == 0 || separators == 2)) { - // We should have 2 or no separator - parsed->error = PARSER_INVALID_WEEK_DATE; - - return NULL; - } - - weekday = week % 10; - week /= 10; - - break; - default: - // Any other case is wrong - parsed->error = PARSER_INVALID_WEEK_DATE; - - return NULL; - } - - // Checks - if (week > 53 || (week > 52 && !is_long_year(parsed->year))) { - parsed->error = PARSER_INVALID_WEEK_NUMBER; - - return NULL; - } - - if (weekday > 7) { - parsed->error = PARSER_INVALID_WEEKDAY_NUMBER; - - return NULL; - } - - // Calculating ordinal day - ordinal = week * 7 + weekday - (week_day(parsed->year, 1, 4) + 3); - - if (ordinal < 1) { - // Previous year - ordinal += days_in_year(parsed->year - 1); - parsed->year -= 1; - leap = is_leap(parsed->year); - } - - if (ordinal > days_in_year(parsed->year)) { - // Next year - ordinal -= days_in_year(parsed->year); - parsed->year += 1; - leap = is_leap(parsed->year); - } - - for (j = 1; j < 14; j++) { - if (ordinal <= MONTHS_OFFSETS[leap][j]) { - parsed->day = ordinal - MONTHS_OFFSETS[leap][j - 1]; - parsed->month = j - 1; - - break; - } - } - } else { - // At this point we need to check the number - // of characters until the end of the date part - // (or the end of the string). - // - // If two, we have only a month if there is a separator, it may be a time otherwise. - // If three, we have an ordinal date. - // If four, we have a complete date - i = 0; - while (*c != '\0' && *c != ' ' && *c != 'T') { - if (*c == '-') { - separators++; - c++; - continue; - } - - if (!(*c >= '0' && *c <='9')) { - parsed->error = PARSER_INVALID_DATE; - - return NULL; - } - - monthday = 10 * monthday + *c++ - '0'; - - i++; - } - - switch (i) { - case 0: - // No month/day specified (only a year) - break; - case 2: - if (!separators) { - // The date looks like 201207 - // which is invalid for a date - // But it might be a time in the form hhmmss - parsed->ambiguous = 1; - } else if (separators > 1) { - parsed->error = PARSER_INVALID_DATE; - - return NULL; - } - - parsed->month = monthday; - break; - case 3: - // Ordinal day - if (separators > 1) { - parsed->error = PARSER_INVALID_DATE; - - return NULL; - } - - if (monthday < 1 || monthday > MONTHS_OFFSETS[leap][13]) { - parsed->error = PARSER_INVALID_ORDINAL_DAY_FOR_YEAR; - - return NULL; - } - - for (j = 1; j < 14; j++) { - if (monthday <= MONTHS_OFFSETS[leap][j]) { - parsed->day = monthday - MONTHS_OFFSETS[leap][j - 1]; - parsed->month = j - 1; - - break; - } - } - - break; - case 4: - // Month and day - parsed->month = monthday / 100; - parsed->day = monthday % 100; - - break; - default: - parsed->error = PARSER_INVALID_MONTH_OR_DAY; - - return NULL; - } - } - - // Checks - if (separators && !monthday && !week) { - parsed->error = PARSER_INVALID_DATE; - - return NULL; - } - - if (parsed->month > 12) { - parsed->error = PARSER_INVALID_MONTH; - - return NULL; - } - - if (parsed->day > DAYS_PER_MONTHS[leap][parsed->month]) { - parsed->error = PARSER_INVALID_DAY_FOR_MONTH; - - return NULL; - } - - separators = 0; - if (*c == 'T' || *c == ' ') { - if (parsed->ambiguous) { - parsed->error = PARSER_INVALID_DATE; - - return NULL; - } - - // We have time so we have a datetime - parsed->is_datetime = 1; - parsed->is_date = 0; - - c++; - - // Grabbing time information - i = 0; - while (*c != '\0' && *c != '.' && *c != ',' && *c != 'Z' && *c != '+' && *c != '-') { - if (*c == ':') { - separators++; - c++; - continue; - } - - if (!(*c >= '0' && *c <='9')) { - parsed->error = PARSER_INVALID_TIME; - - return NULL; - } - - time = 10 * time + *c++ - '0'; - i++; - } - - switch (i) { - case 2: - // Hours only - if (separators > 0) { - // Extraneous separators - parsed->error = PARSER_INVALID_TIME; - - return NULL; - } - - parsed->hour = time; - has_hour = 1; - break; - case 4: - // Hours and minutes - if (separators > 1) { - // Extraneous separators - parsed->error = PARSER_INVALID_TIME; - - return NULL; - } - - parsed->hour = time / 100; - parsed->minute = time % 100; - has_hour = 1; - break; - case 6: - // Hours, minutes and seconds - if (!(separators == 0 || separators == 2)) { - // We should have either two separators or none - parsed->error = PARSER_INVALID_TIME; - - return NULL; - } - - parsed->hour = time / 10000; - parsed->minute = time / 100 % 100; - parsed->second = time % 100; - has_hour = 1; - break; - default: - // Any other case is wrong - parsed->error = PARSER_INVALID_TIME; - - return NULL; - } - - // Checks - if (parsed->hour > 23) { - parsed->error = PARSER_INVALID_HOUR; - - return NULL; - } - - if (parsed->minute > 59) { - parsed->error = PARSER_INVALID_MINUTE; - - return NULL; - } - - if (parsed->second > 59) { - parsed->error = PARSER_INVALID_SECOND; - - return NULL; - } - - // Subsecond - if (*c == '.' || *c == ',') { - c++; - - time = 0; - i = 0; - while (*c != '\0' && *c != 'Z' && *c != '+' && *c != '-') { - if (!(*c >= '0' && *c <='9')) { - parsed->error = PARSER_INVALID_SUBSECOND; - - return NULL; - } - - time = 10 * time + *c++ - '0'; - i++; - } - - // adjust to microseconds - if (i > 6) { - parsed->microsecond = time / pow(10, i - 6); - } else if (i <= 6) { - parsed->microsecond = time * pow(10, 6 - i); - } - } - - // Timezone - if (*c == 'Z') { - parsed->has_offset = 1; - parsed->tzname = "UTC"; - c++; - } else if (*c == '+' || *c == '-') { - tz_sign = 1; - if (*c == '-') { - tz_sign = -1; - } - - parsed->has_offset = 1; - c++; - - i = 0; - time = 0; - separators = 0; - while (*c != '\0') { - if (*c == ':') { - separators++; - c++; - continue; - } - - if (!(*c >= '0' && *c <= '9')) { - parsed->error = PARSER_INVALID_TZ_OFFSET; - - return NULL; - } - - time = 10 * time + *c++ - '0'; - i++; - } - - switch (i) { - case 2: - // hh Format - if (separators) { - // Extraneous separators - parsed->error = PARSER_INVALID_TZ_OFFSET; - - return NULL; - } - - parsed->offset = tz_sign * (time * 3600); - break; - case 4: - // hhmm Format - if (separators > 1) { - // Extraneous separators - parsed->error = PARSER_INVALID_TZ_OFFSET; - - return NULL; - } - - parsed->offset = tz_sign * ((time / 100 * 3600) + (time % 100 * 60)); - break; - default: - // Wrong format - parsed->error = PARSER_INVALID_TZ_OFFSET; - - return NULL; - } - } - } - - // At this point we should be at the end of the string - // If not, the string is invalid - if (*c != '\0') { - parsed->error = PARSER_INVALID_ISO8601; - - return NULL; - } - - return parsed; -} - - -Parsed* _parse_iso8601_duration(char *str, Parsed *parsed) { - char* c; - int value = 0; - int grabbed = 0; - int in_time = 0; - int in_fraction = 0; - int fraction_length = 0; - int has_fractional = 0; - int fraction = 0; - int has_ymd = 0; - int has_week = 0; - int has_year = 0; - int has_month = 0; - int has_day = 0; - int has_hour = 0; - int has_minute = 0; - int has_second = 0; - - c = str; - - // Removing P operator - c++; - - parsed->is_duration = 1; - - for (; *c != '\0'; c++) { - switch (*c) { - case 'Y': - if (!grabbed || in_time || has_week || has_ymd) { - // No value grabbed - parsed->error = PARSER_INVALID_DURATION; - - return NULL; - } - - if (fraction) { - parsed->error = PARSER_INVALID_DURATION_FLOAT_YEAR_MONTH_NOT_SUPPORTED; - - return NULL; - } - - parsed->years = value; - - grabbed = 0; - value = 0; - fraction = 0; - in_fraction = 0; - has_ymd = 1; - has_year = 1; - - break; - case 'M': - if (!grabbed || has_week) { - // No value grabbed - parsed->error = PARSER_INVALID_DURATION; - - return NULL; - } - - if (in_time) { - if (has_second) { - parsed->error = PARSER_INVALID_DURATION; - - return NULL; - } - - if (has_fractional) { - parsed->error = PARSER_INVALID_DURATION; - - return NULL; - } - - parsed->minutes = value; - if (fraction) { - parsed->seconds = fraction * 6; - has_fractional = 1; - } - - has_minute = 1; - } else { - if (fraction) { - parsed->error = PARSER_INVALID_DURATION_FLOAT_YEAR_MONTH_NOT_SUPPORTED; - - return NULL; - } - - if (has_month || has_day) { - parsed->error = PARSER_INVALID_DURATION; - - return NULL; - } - - parsed->months = value; - has_ymd = 1; - has_month = 1; - } - - grabbed = 0; - value = 0; - fraction = 0; - in_fraction = 0; - - break; - case 'D': - if (!grabbed || in_time || has_week) { - // No value grabbed - parsed->error = PARSER_INVALID_DURATION; - - return NULL; - } - - if (has_day) { - parsed->error = PARSER_INVALID_DURATION; - - return NULL; - } - - parsed->days = value; - if (fraction) { - parsed->hours = fraction * 2.4; - has_fractional = 1; - } - - grabbed = 0; - value = 0; - fraction = 0; - in_fraction = 0; - has_ymd = 1; - has_day = 1; - - break; - case 'T': - if (grabbed) { - parsed->error = PARSER_INVALID_DURATION; - - return NULL; - } - - in_time = 1; - - break; - case 'H': - if (!grabbed || !in_time || has_week) { - // No value grabbed - parsed->error = PARSER_INVALID_DURATION; - - return NULL; - } - - if (has_hour || has_second || has_minute) { - parsed->error = PARSER_INVALID_DURATION; - - return NULL; - } - - if (has_fractional) { - parsed->error = PARSER_INVALID_DURATION; - - return NULL; - } - - parsed->hours = value; - if (fraction) { - parsed->minutes = fraction * 6; - has_fractional = 1; - } - - grabbed = 0; - value = 0; - fraction = 0; - in_fraction = 0; - has_hour = 1; - - break; - case 'S': - if (!grabbed || !in_time || has_week) { - // No value grabbed - parsed->error = PARSER_INVALID_DURATION; - - return NULL; - } - - if (has_second) { - parsed->error = PARSER_INVALID_DURATION; - - return NULL; - } - - if (has_fractional) { - parsed->error = PARSER_INVALID_DURATION; - - return NULL; - } - - if (fraction) { - parsed->seconds = value; - if (fraction_length > 6) { - parsed->microseconds = fraction / pow(10, fraction_length - 6); - } else { - parsed->microseconds = fraction * pow(10, 6 - fraction_length); - } - has_fractional = 1; - } else { - parsed->seconds = value; - } - - grabbed = 0; - value = 0; - fraction = 0; - in_fraction = 0; - has_second = 1; - - break; - case 'W': - if (!grabbed || in_time || has_ymd) { - // No value grabbed - parsed->error = PARSER_INVALID_DURATION; - - return NULL; - } - - parsed->weeks = value; - if (fraction) { - float days; - days = fraction * 0.7; - parsed->hours = (int) ((days - (int) days) * 24); - parsed->days = (int) days; - } - - grabbed = 0; - value = 0; - fraction = 0; - in_fraction = 0; - has_week = 1; - - break; - case '.': - if (!grabbed || has_fractional) { - // No value grabbed - parsed->error = PARSER_INVALID_DURATION; - - return NULL; - } - - in_fraction = 1; - - break; - case ',': - if (!grabbed || has_fractional) { - // No value grabbed - parsed->error = PARSER_INVALID_DURATION; - - return NULL; - } - - in_fraction = 1; - - break; - default: - if (*c >= '0' && *c <='9') { - if (in_fraction) { - fraction = 10 * fraction + *c - '0'; - fraction_length++; - } else { - value = 10 * value + *c - '0'; - grabbed = 1; - } - break; - } - - parsed->error = PARSER_INVALID_DURATION; - - return NULL; - } - } - - return parsed; -} - - -PyObject* parse_iso8601(PyObject *self, PyObject *args) { - char* str; - PyObject *obj; - PyObject *tzinfo; - Parsed *parsed = new_parsed(); - - if (!PyArg_ParseTuple(args, "s", &str)) { - PyErr_SetString( - PyExc_ValueError, "Invalid parameters" - ); - return NULL; - } - - if (*str == 'P') { - // Duration (or interval) - if (_parse_iso8601_duration(str, parsed) == NULL) { - PyErr_SetString( - PyExc_ValueError, PARSER_ERRORS[parsed->error] - ); - - return NULL; - } - } else if (_parse_iso8601_datetime(str, parsed) == NULL) { - PyErr_SetString( - PyExc_ValueError, PARSER_ERRORS[parsed->error] - ); - - return NULL; - } - - if (parsed->is_date) { - // Date only - if (parsed->ambiguous) { - // We can "safely" assume that the ambiguous - // date was actually a time in the form hhmmss - parsed->hour = parsed->year / 100; - parsed->minute = parsed->year % 100; - parsed->second = parsed->month; - - obj = PyDateTimeAPI->Time_FromTime( - parsed->hour, parsed->minute, parsed->second, parsed->microsecond, - Py_BuildValue(""), - PyDateTimeAPI->TimeType - ); - } else { - obj = PyDateTimeAPI->Date_FromDate( - parsed->year, parsed->month, parsed->day, - PyDateTimeAPI->DateType - ); - } - } else if (parsed->is_datetime) { - if (!parsed->has_offset) { - tzinfo = Py_BuildValue(""); - } else { - tzinfo = new_fixed_offset(parsed->offset, parsed->tzname); - } - - obj = PyDateTimeAPI->DateTime_FromDateAndTime( - parsed->year, - parsed->month, - parsed->day, - parsed->hour, - parsed->minute, - parsed->second, - parsed->microsecond, - tzinfo, - PyDateTimeAPI->DateTimeType - ); - - Py_DECREF(tzinfo); - } else if (parsed->is_duration) { - obj = new_duration( - parsed->years, parsed->months, parsed->weeks, parsed->days, - parsed->hours, parsed->minutes, parsed->seconds, parsed->microseconds - ); - } else { - return NULL; - } - - free(parsed); - - return obj; -} - - -/* ------------------------------------------------------------------------- */ - -static PyMethodDef helpers_methods[] = { - { - "parse_iso8601", - (PyCFunction) parse_iso8601, - METH_VARARGS, - PyDoc_STR("Parses a ISO8601 string into a tuple.") - }, - {NULL} -}; - - -/* ------------------------------------------------------------------------- */ - -static struct PyModuleDef moduledef = { - PyModuleDef_HEAD_INIT, - "_iso8601", - NULL, - -1, - helpers_methods, - NULL, - NULL, - NULL, - NULL, -}; - -PyMODINIT_FUNC -PyInit__iso8601(void) -{ - PyObject *module; - - PyDateTime_IMPORT; - - module = PyModule_Create(&moduledef); - - if (module == NULL) - return NULL; - - // FixedOffset declaration - FixedOffset_type.tp_new = PyType_GenericNew; - FixedOffset_type.tp_base = PyDateTimeAPI->TZInfoType; - FixedOffset_type.tp_methods = FixedOffset_methods; - FixedOffset_type.tp_members = FixedOffset_members; - FixedOffset_type.tp_init = (initproc)FixedOffset_init; - - if (PyType_Ready(&FixedOffset_type) < 0) - return NULL; - - // Duration declaration - Duration_type.tp_new = PyType_GenericNew; - Duration_type.tp_members = Duration_members; - Duration_type.tp_init = (initproc)Duration_init; - - if (PyType_Ready(&Duration_type) < 0) - return NULL; - - Py_INCREF(&FixedOffset_type); - Py_INCREF(&Duration_type); - - PyModule_AddObject(module, "TZFixedOffset", (PyObject *)&FixedOffset_type); - PyModule_AddObject(module, "Duration", (PyObject *)&Duration_type); - - return module; -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/parsing/exceptions/__init__.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/parsing/exceptions/__init__.py deleted file mode 100644 index 997b0fac..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/parsing/exceptions/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -class ParserError(ValueError): - - pass diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/parsing/exceptions/__pycache__/__init__.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/parsing/exceptions/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 6344c72b..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/parsing/exceptions/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/parsing/iso8601.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/parsing/iso8601.py deleted file mode 100644 index 40efa2fb..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/parsing/iso8601.py +++ /dev/null @@ -1,447 +0,0 @@ -from __future__ import division - -import datetime -import re - -from ..constants import HOURS_PER_DAY -from ..constants import MINUTES_PER_HOUR -from ..constants import MONTHS_OFFSETS -from ..constants import SECONDS_PER_MINUTE -from ..duration import Duration -from ..helpers import days_in_year -from ..helpers import is_leap -from ..helpers import is_long_year -from ..helpers import week_day -from ..tz.timezone import UTC -from ..tz.timezone import FixedTimezone -from .exceptions import ParserError - - -ISO8601_DT = re.compile( - # Date (optional) - "^" - "(?P<date>" - " (?P<classic>" # Classic date (YYYY-MM-DD) or ordinal (YYYY-DDD) - r" (?P<year>\d{4})" # Year - " (?P<monthday>" - r" (?P<monthsep>-)?(?P<month>\d{2})" # Month (optional) - r" ((?P<daysep>-)?(?P<day>\d{1,2}))?" # Day (optional) - " )?" - " )" - " |" - " (?P<isocalendar>" # Calendar date (2016-W05 or 2016-W05-5) - r" (?P<isoyear>\d{4})" # Year - " (?P<weeksep>-)?" # Separator (optional) - " W" # W separator - r" (?P<isoweek>\d{2})" # Week number - " (?P<weekdaysep>-)?" # Separator (optional) - r" (?P<isoweekday>\d)?" # Weekday (optional) - " )" - ")?" - # Time (optional) - "(?P<time>" - r" (?P<timesep>[T\ ])?" # Separator (T or space) - r" (?P<hour>\d{1,2})(?P<minsep>:)?(?P<minute>\d{1,2})?(?P<secsep>:)?(?P<second>\d{1,2})?" # HH:mm:ss (optional mm and ss) - # Subsecond part (optional) - " (?P<subsecondsection>" - " (?:[.,])" # Subsecond separator (optional) - r" (?P<subsecond>\d{1,9})" # Subsecond - " )?" - # Timezone offset - " (?P<tz>" - r" (?:[-+])\d{2}:?(?:\d{2})?|Z" # Offset (+HH:mm or +HHmm or +HH or Z) - " )?" - ")?" - "$", - re.VERBOSE, -) - - -ISO8601_DURATION = re.compile( - "^P" # Duration P indicator - # Years, months and days (optional) - "(?P<w>" - r" (?P<weeks>\d+(?:[.,]\d+)?W)" - ")?" - "(?P<ymd>" - r" (?P<years>\d+(?:[.,]\d+)?Y)?" - r" (?P<months>\d+(?:[.,]\d+)?M)?" - r" (?P<days>\d+(?:[.,]\d+)?D)?" - ")?" - "(?P<hms>" - " (?P<timesep>T)" # Separator (T) - r" (?P<hours>\d+(?:[.,]\d+)?H)?" - r" (?P<minutes>\d+(?:[.,]\d+)?M)?" - r" (?P<seconds>\d+(?:[.,]\d+)?S)?" - ")?" - "$", - re.VERBOSE, -) - - -def parse_iso8601(text): - """ - ISO 8601 compliant parser. - - :param text: The string to parse - :type text: str - - :rtype: datetime.datetime or datetime.time or datetime.date - """ - parsed = _parse_iso8601_duration(text) - if parsed is not None: - return parsed - - m = ISO8601_DT.match(text) - if not m: - raise ParserError("Invalid ISO 8601 string") - - ambiguous_date = False - is_date = False - is_time = False - year = 0 - month = 1 - day = 1 - minute = 0 - second = 0 - microsecond = 0 - tzinfo = None - - if m: - if m.group("date"): - # A date has been specified - is_date = True - - if m.group("isocalendar"): - # We have a ISO 8601 string defined - # by week number - if ( - m.group("weeksep") - and not m.group("weekdaysep") - and m.group("isoweekday") - ): - raise ParserError("Invalid date string: {}".format(text)) - - if not m.group("weeksep") and m.group("weekdaysep"): - raise ParserError("Invalid date string: {}".format(text)) - - try: - date = _get_iso_8601_week( - m.group("isoyear"), m.group("isoweek"), m.group("isoweekday") - ) - except ParserError: - raise - except ValueError: - raise ParserError("Invalid date string: {}".format(text)) - - year = date["year"] - month = date["month"] - day = date["day"] - else: - # We have a classic date representation - year = int(m.group("year")) - - if not m.group("monthday"): - # No month and day - month = 1 - day = 1 - else: - if m.group("month") and m.group("day"): - # Month and day - if not m.group("daysep") and len(m.group("day")) == 1: - # Ordinal day - ordinal = int(m.group("month") + m.group("day")) - leap = is_leap(year) - months_offsets = MONTHS_OFFSETS[leap] - - if ordinal > months_offsets[13]: - raise ParserError("Ordinal day is out of range") - - for i in range(1, 14): - if ordinal <= months_offsets[i]: - day = ordinal - months_offsets[i - 1] - month = i - 1 - - break - else: - month = int(m.group("month")) - day = int(m.group("day")) - else: - # Only month - if not m.group("monthsep"): - # The date looks like 201207 - # which is invalid for a date - # But it might be a time in the form hhmmss - ambiguous_date = True - - month = int(m.group("month")) - day = 1 - - if not m.group("time"): - # No time has been specified - if ambiguous_date: - # We can "safely" assume that the ambiguous date - # was actually a time in the form hhmmss - hhmmss = "{}{:0>2}".format(str(year), str(month)) - - return datetime.time(int(hhmmss[:2]), int(hhmmss[2:4]), int(hhmmss[4:])) - - return datetime.date(year, month, day) - - if ambiguous_date: - raise ParserError("Invalid date string: {}".format(text)) - - if is_date and not m.group("timesep"): - raise ParserError("Invalid date string: {}".format(text)) - - if not is_date: - is_time = True - - # Grabbing hh:mm:ss - hour = int(m.group("hour")) - minsep = m.group("minsep") - - if m.group("minute"): - minute = int(m.group("minute")) - elif minsep: - raise ParserError("Invalid ISO 8601 time part") - - secsep = m.group("secsep") - if secsep and not minsep and m.group("minute"): - # minute/second separator but no hour/minute separator - raise ParserError("Invalid ISO 8601 time part") - - if m.group("second"): - if not secsep and minsep: - # No minute/second separator but hour/minute separator - raise ParserError("Invalid ISO 8601 time part") - - second = int(m.group("second")) - elif secsep: - raise ParserError("Invalid ISO 8601 time part") - - # Grabbing subseconds, if any - if m.group("subsecondsection"): - # Limiting to 6 chars - subsecond = m.group("subsecond")[:6] - - microsecond = int("{:0<6}".format(subsecond)) - - # Grabbing timezone, if any - tz = m.group("tz") - if tz: - if tz == "Z": - tzinfo = UTC - else: - negative = True if tz.startswith("-") else False - tz = tz[1:] - if ":" not in tz: - if len(tz) == 2: - tz = "{}00".format(tz) - - off_hour = tz[0:2] - off_minute = tz[2:4] - else: - off_hour, off_minute = tz.split(":") - - offset = ((int(off_hour) * 60) + int(off_minute)) * 60 - - if negative: - offset = -1 * offset - - tzinfo = FixedTimezone(offset) - - if is_time: - return datetime.time(hour, minute, second, microsecond) - - return datetime.datetime( - year, month, day, hour, minute, second, microsecond, tzinfo=tzinfo - ) - - -def _parse_iso8601_duration(text, **options): - m = ISO8601_DURATION.match(text) - if not m: - return - - years = 0 - months = 0 - weeks = 0 - days = 0 - hours = 0 - minutes = 0 - seconds = 0 - microseconds = 0 - fractional = False - - if m.group("w"): - # Weeks - if m.group("ymd") or m.group("hms"): - # Specifying anything more than weeks is not supported - raise ParserError("Invalid duration string") - - _weeks = m.group("weeks") - if not _weeks: - raise ParserError("Invalid duration string") - - _weeks = _weeks.replace(",", ".").replace("W", "") - if "." in _weeks: - _weeks, portion = _weeks.split(".") - weeks = int(_weeks) - _days = int(portion) / 10 * 7 - days, hours = int(_days // 1), _days % 1 * HOURS_PER_DAY - else: - weeks = int(_weeks) - - if m.group("ymd"): - # Years, months and/or days - _years = m.group("years") - _months = m.group("months") - _days = m.group("days") - - # Checking order - years_start = m.start("years") if _years else -3 - months_start = m.start("months") if _months else years_start + 1 - days_start = m.start("days") if _days else months_start + 1 - - # Check correct order - if not (years_start < months_start < days_start): - raise ParserError("Invalid duration") - - if _years: - _years = _years.replace(",", ".").replace("Y", "") - if "." in _years: - raise ParserError("Float years in duration are not supported") - else: - years = int(_years) - - if _months: - if fractional: - raise ParserError("Invalid duration") - - _months = _months.replace(",", ".").replace("M", "") - if "." in _months: - raise ParserError("Float months in duration are not supported") - else: - months = int(_months) - - if _days: - if fractional: - raise ParserError("Invalid duration") - - _days = _days.replace(",", ".").replace("D", "") - - if "." in _days: - fractional = True - - _days, _hours = _days.split(".") - days = int(_days) - hours = int(_hours) / 10 * HOURS_PER_DAY - else: - days = int(_days) - - if m.group("hms"): - # Hours, minutes and/or seconds - _hours = m.group("hours") or 0 - _minutes = m.group("minutes") or 0 - _seconds = m.group("seconds") or 0 - - # Checking order - hours_start = m.start("hours") if _hours else -3 - minutes_start = m.start("minutes") if _minutes else hours_start + 1 - seconds_start = m.start("seconds") if _seconds else minutes_start + 1 - - # Check correct order - if not (hours_start < minutes_start < seconds_start): - raise ParserError("Invalid duration") - - if _hours: - if fractional: - raise ParserError("Invalid duration") - - _hours = _hours.replace(",", ".").replace("H", "") - - if "." in _hours: - fractional = True - - _hours, _mins = _hours.split(".") - hours += int(_hours) - minutes += int(_mins) / 10 * MINUTES_PER_HOUR - else: - hours += int(_hours) - - if _minutes: - if fractional: - raise ParserError("Invalid duration") - - _minutes = _minutes.replace(",", ".").replace("M", "") - - if "." in _minutes: - fractional = True - - _minutes, _secs = _minutes.split(".") - minutes += int(_minutes) - seconds += int(_secs) / 10 * SECONDS_PER_MINUTE - else: - minutes += int(_minutes) - - if _seconds: - if fractional: - raise ParserError("Invalid duration") - - _seconds = _seconds.replace(",", ".").replace("S", "") - - if "." in _seconds: - _seconds, _microseconds = _seconds.split(".") - seconds += int(_seconds) - microseconds += int("{:0<6}".format(_microseconds[:6])) - else: - seconds += int(_seconds) - - return Duration( - years=years, - months=months, - weeks=weeks, - days=days, - hours=hours, - minutes=minutes, - seconds=seconds, - microseconds=microseconds, - ) - - -def _get_iso_8601_week(year, week, weekday): - if not weekday: - weekday = 1 - else: - weekday = int(weekday) - - year = int(year) - week = int(week) - - if week > 53 or week > 52 and not is_long_year(year): - raise ParserError("Invalid week for week date") - - if weekday > 7: - raise ParserError("Invalid weekday for week date") - - # We can't rely on strptime directly here since - # it does not support ISO week date - ordinal = week * 7 + weekday - (week_day(year, 1, 4) + 3) - - if ordinal < 1: - # Previous year - ordinal += days_in_year(year - 1) - year -= 1 - - if ordinal > days_in_year(year): - # Next year - ordinal -= days_in_year(year) - year += 1 - - fmt = "%Y-%j" - string = "{}-{}".format(year, ordinal) - - dt = datetime.datetime.strptime(string, fmt) - - return {"year": dt.year, "month": dt.month, "day": dt.day} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/period.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/period.py deleted file mode 100644 index b734b5bd..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/period.py +++ /dev/null @@ -1,390 +0,0 @@ -from __future__ import absolute_import - -import operator - -from datetime import date -from datetime import datetime -from datetime import timedelta - -import pendulum - -from pendulum.utils._compat import _HAS_FOLD -from pendulum.utils._compat import decode - -from .constants import MONTHS_PER_YEAR -from .duration import Duration -from .helpers import precise_diff - - -class Period(Duration): - """ - Duration class that is aware of the datetimes that generated the - time difference. - """ - - def __new__(cls, start, end, absolute=False): - if isinstance(start, datetime) and isinstance(end, datetime): - if ( - start.tzinfo is None - and end.tzinfo is not None - or start.tzinfo is not None - and end.tzinfo is None - ): - raise TypeError("can't compare offset-naive and offset-aware datetimes") - - if absolute and start > end: - end, start = start, end - - _start = start - _end = end - if isinstance(start, pendulum.DateTime): - if _HAS_FOLD: - _start = datetime( - start.year, - start.month, - start.day, - start.hour, - start.minute, - start.second, - start.microsecond, - tzinfo=start.tzinfo, - fold=start.fold, - ) - else: - _start = datetime( - start.year, - start.month, - start.day, - start.hour, - start.minute, - start.second, - start.microsecond, - tzinfo=start.tzinfo, - ) - elif isinstance(start, pendulum.Date): - _start = date(start.year, start.month, start.day) - - if isinstance(end, pendulum.DateTime): - if _HAS_FOLD: - _end = datetime( - end.year, - end.month, - end.day, - end.hour, - end.minute, - end.second, - end.microsecond, - tzinfo=end.tzinfo, - fold=end.fold, - ) - else: - _end = datetime( - end.year, - end.month, - end.day, - end.hour, - end.minute, - end.second, - end.microsecond, - tzinfo=end.tzinfo, - ) - elif isinstance(end, pendulum.Date): - _end = date(end.year, end.month, end.day) - - # Fixing issues with datetime.__sub__() - # not handling offsets if the tzinfo is the same - if ( - isinstance(_start, datetime) - and isinstance(_end, datetime) - and _start.tzinfo is _end.tzinfo - ): - if _start.tzinfo is not None: - _start = (_start - start.utcoffset()).replace(tzinfo=None) - - if isinstance(end, datetime) and _end.tzinfo is not None: - _end = (_end - end.utcoffset()).replace(tzinfo=None) - - delta = _end - _start - - return super(Period, cls).__new__(cls, seconds=delta.total_seconds()) - - def __init__(self, start, end, absolute=False): - super(Period, self).__init__() - - if not isinstance(start, pendulum.Date): - if isinstance(start, datetime): - start = pendulum.instance(start) - else: - start = pendulum.date(start.year, start.month, start.day) - - _start = start - else: - if isinstance(start, pendulum.DateTime): - _start = datetime( - start.year, - start.month, - start.day, - start.hour, - start.minute, - start.second, - start.microsecond, - tzinfo=start.tzinfo, - ) - else: - _start = date(start.year, start.month, start.day) - - if not isinstance(end, pendulum.Date): - if isinstance(end, datetime): - end = pendulum.instance(end) - else: - end = pendulum.date(end.year, end.month, end.day) - - _end = end - else: - if isinstance(end, pendulum.DateTime): - _end = datetime( - end.year, - end.month, - end.day, - end.hour, - end.minute, - end.second, - end.microsecond, - tzinfo=end.tzinfo, - ) - else: - _end = date(end.year, end.month, end.day) - - self._invert = False - if start > end: - self._invert = True - - if absolute: - end, start = start, end - _end, _start = _start, _end - - self._absolute = absolute - self._start = start - self._end = end - self._delta = precise_diff(_start, _end) - - @property - def years(self): - return self._delta.years - - @property - def months(self): - return self._delta.months - - @property - def weeks(self): - return abs(self._delta.days) // 7 * self._sign(self._delta.days) - - @property - def days(self): - return self._days - - @property - def remaining_days(self): - return abs(self._delta.days) % 7 * self._sign(self._days) - - @property - def hours(self): - return self._delta.hours - - @property - def minutes(self): - return self._delta.minutes - - @property - def start(self): - return self._start - - @property - def end(self): - return self._end - - def in_years(self): - """ - Gives the duration of the Period in full years. - - :rtype: int - """ - return self.years - - def in_months(self): - """ - Gives the duration of the Period in full months. - - :rtype: int - """ - return self.years * MONTHS_PER_YEAR + self.months - - def in_weeks(self): - days = self.in_days() - sign = 1 - - if days < 0: - sign = -1 - - return sign * (abs(days) // 7) - - def in_days(self): - return self._delta.total_days - - def in_words(self, locale=None, separator=" "): - """ - Get the current interval in words in the current locale. - - Ex: 6 jours 23 heures 58 minutes - - :param locale: The locale to use. Defaults to current locale. - :type locale: str - - :param separator: The separator to use between each unit - :type separator: str - - :rtype: str - """ - periods = [ - ("year", self.years), - ("month", self.months), - ("week", self.weeks), - ("day", self.remaining_days), - ("hour", self.hours), - ("minute", self.minutes), - ("second", self.remaining_seconds), - ] - - if locale is None: - locale = pendulum.get_locale() - - locale = pendulum.locale(locale) - parts = [] - for period in periods: - unit, count = period - if abs(count) > 0: - translation = locale.translation( - "units.{}.{}".format(unit, locale.plural(abs(count))) - ) - parts.append(translation.format(count)) - - if not parts: - if abs(self.microseconds) > 0: - unit = "units.second.{}".format(locale.plural(1)) - count = "{:.2f}".format(abs(self.microseconds) / 1e6) - else: - unit = "units.microsecond.{}".format(locale.plural(0)) - count = 0 - translation = locale.translation(unit) - parts.append(translation.format(count)) - - return decode(separator.join(parts)) - - def range(self, unit, amount=1): - method = "add" - op = operator.le - if not self._absolute and self.invert: - method = "subtract" - op = operator.ge - - start, end = self.start, self.end - - i = amount - while op(start, end): - yield start - - start = getattr(self.start, method)(**{unit: i}) - - i += amount - - def as_interval(self): - """ - Return the Period as an Duration. - - :rtype: Duration - """ - return Duration(seconds=self.total_seconds()) - - def __iter__(self): - return self.range("days") - - def __contains__(self, item): - return self.start <= item <= self.end - - def __add__(self, other): - return self.as_interval().__add__(other) - - __radd__ = __add__ - - def __sub__(self, other): - return self.as_interval().__sub__(other) - - def __neg__(self): - return self.__class__(self.end, self.start, self._absolute) - - def __mul__(self, other): - return self.as_interval().__mul__(other) - - __rmul__ = __mul__ - - def __floordiv__(self, other): - return self.as_interval().__floordiv__(other) - - def __truediv__(self, other): - return self.as_interval().__truediv__(other) - - __div__ = __floordiv__ - - def __mod__(self, other): - return self.as_interval().__mod__(other) - - def __divmod__(self, other): - return self.as_interval().__divmod__(other) - - def __abs__(self): - return self.__class__(self.start, self.end, True) - - def __repr__(self): - return "<Period [{} -> {}]>".format(self._start, self._end) - - def __str__(self): - return self.__repr__() - - def _cmp(self, other): - # Only needed for PyPy - assert isinstance(other, timedelta) - - if isinstance(other, Period): - other = other.as_timedelta() - - td = self.as_timedelta() - - return 0 if td == other else 1 if td > other else -1 - - def _getstate(self, protocol=3): - start, end = self.start, self.end - - if self._invert and self._absolute: - end, start = start, end - - return (start, end, self._absolute) - - def __reduce__(self): - return self.__reduce_ex__(2) - - def __reduce_ex__(self, protocol): - return self.__class__, self._getstate(protocol) - - def __hash__(self): - return hash((self.start, self.end, self._absolute)) - - def __eq__(self, other): - if isinstance(other, Period): - return (self.start, self.end, self._absolute) == ( - other.start, - other.end, - other._absolute, - ) - else: - return self.as_interval() == other diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/py.typed b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/py.typed deleted file mode 100644 index e69de29b..00000000 diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/time.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/time.py deleted file mode 100644 index e72972d4..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/time.py +++ /dev/null @@ -1,284 +0,0 @@ -from __future__ import absolute_import - -from datetime import time -from datetime import timedelta - -import pendulum - -from .constants import SECS_PER_HOUR -from .constants import SECS_PER_MIN -from .constants import USECS_PER_SEC -from .duration import AbsoluteDuration -from .duration import Duration -from .mixins.default import FormattableMixin - - -class Time(FormattableMixin, time): - """ - Represents a time instance as hour, minute, second, microsecond. - """ - - # String formatting - def __repr__(self): - us = "" - if self.microsecond: - us = ", {}".format(self.microsecond) - - tzinfo = "" - if self.tzinfo: - tzinfo = ", tzinfo={}".format(repr(self.tzinfo)) - - return "{}({}, {}, {}{}{})".format( - self.__class__.__name__, self.hour, self.minute, self.second, us, tzinfo - ) - - # Comparisons - - def closest(self, dt1, dt2): - """ - Get the closest time from the instance. - - :type dt1: Time or time - :type dt2: Time or time - - :rtype: Time - """ - dt1 = self.__class__(dt1.hour, dt1.minute, dt1.second, dt1.microsecond) - dt2 = self.__class__(dt2.hour, dt2.minute, dt2.second, dt2.microsecond) - - if self.diff(dt1).in_seconds() < self.diff(dt2).in_seconds(): - return dt1 - - return dt2 - - def farthest(self, dt1, dt2): - """ - Get the farthest time from the instance. - - :type dt1: Time or time - :type dt2: Time or time - - :rtype: Time - """ - dt1 = self.__class__(dt1.hour, dt1.minute, dt1.second, dt1.microsecond) - dt2 = self.__class__(dt2.hour, dt2.minute, dt2.second, dt2.microsecond) - - if self.diff(dt1).in_seconds() > self.diff(dt2).in_seconds(): - return dt1 - - return dt2 - - # ADDITIONS AND SUBSTRACTIONS - - def add(self, hours=0, minutes=0, seconds=0, microseconds=0): - """ - Add duration to the instance. - - :param hours: The number of hours - :type hours: int - - :param minutes: The number of minutes - :type minutes: int - - :param seconds: The number of seconds - :type seconds: int - - :param microseconds: The number of microseconds - :type microseconds: int - - :rtype: Time - """ - from .datetime import DateTime - - return ( - DateTime.EPOCH.at(self.hour, self.minute, self.second, self.microsecond) - .add( - hours=hours, minutes=minutes, seconds=seconds, microseconds=microseconds - ) - .time() - ) - - def subtract(self, hours=0, minutes=0, seconds=0, microseconds=0): - """ - Add duration to the instance. - - :param hours: The number of hours - :type hours: int - - :param minutes: The number of minutes - :type minutes: int - - :param seconds: The number of seconds - :type seconds: int - - :param microseconds: The number of microseconds - :type microseconds: int - - :rtype: Time - """ - from .datetime import DateTime - - return ( - DateTime.EPOCH.at(self.hour, self.minute, self.second, self.microsecond) - .subtract( - hours=hours, minutes=minutes, seconds=seconds, microseconds=microseconds - ) - .time() - ) - - def add_timedelta(self, delta): - """ - Add timedelta duration to the instance. - - :param delta: The timedelta instance - :type delta: datetime.timedelta - - :rtype: Time - """ - if delta.days: - raise TypeError("Cannot add timedelta with days to Time.") - - return self.add(seconds=delta.seconds, microseconds=delta.microseconds) - - def subtract_timedelta(self, delta): - """ - Remove timedelta duration from the instance. - - :param delta: The timedelta instance - :type delta: datetime.timedelta - - :rtype: Time - """ - if delta.days: - raise TypeError("Cannot subtract timedelta with days to Time.") - - return self.subtract(seconds=delta.seconds, microseconds=delta.microseconds) - - def __add__(self, other): - if not isinstance(other, timedelta): - return NotImplemented - - return self.add_timedelta(other) - - def __sub__(self, other): - if not isinstance(other, (Time, time, timedelta)): - return NotImplemented - - if isinstance(other, timedelta): - return self.subtract_timedelta(other) - - if isinstance(other, time): - if other.tzinfo is not None: - raise TypeError("Cannot subtract aware times to or from Time.") - - other = self.__class__( - other.hour, other.minute, other.second, other.microsecond - ) - - return other.diff(self, False) - - def __rsub__(self, other): - if not isinstance(other, (Time, time)): - return NotImplemented - - if isinstance(other, time): - if other.tzinfo is not None: - raise TypeError("Cannot subtract aware times to or from Time.") - - other = self.__class__( - other.hour, other.minute, other.second, other.microsecond - ) - - return other.__sub__(self) - - # DIFFERENCES - - def diff(self, dt=None, abs=True): - """ - Returns the difference between two Time objects as an Duration. - - :type dt: Time or None - - :param abs: Whether to return an absolute interval or not - :type abs: bool - - :rtype: Duration - """ - if dt is None: - dt = pendulum.now().time() - else: - dt = self.__class__(dt.hour, dt.minute, dt.second, dt.microsecond) - - us1 = ( - self.hour * SECS_PER_HOUR + self.minute * SECS_PER_MIN + self.second - ) * USECS_PER_SEC - - us2 = ( - dt.hour * SECS_PER_HOUR + dt.minute * SECS_PER_MIN + dt.second - ) * USECS_PER_SEC - - klass = Duration - if abs: - klass = AbsoluteDuration - - return klass(microseconds=us2 - us1) - - def diff_for_humans(self, other=None, absolute=False, locale=None): - """ - Get the difference in a human readable format in the current locale. - - :type other: Time or time - - :param absolute: removes time difference modifiers ago, after, etc - :type absolute: bool - - :param locale: The locale to use for localization - :type locale: str - - :rtype: str - """ - is_now = other is None - - if is_now: - other = pendulum.now().time() - - diff = self.diff(other) - - return pendulum.format_diff(diff, is_now, absolute, locale) - - # Compatibility methods - - def replace( - self, hour=None, minute=None, second=None, microsecond=None, tzinfo=True - ): - if tzinfo is True: - tzinfo = self.tzinfo - - hour = hour if hour is not None else self.hour - minute = minute if minute is not None else self.minute - second = second if second is not None else self.second - microsecond = microsecond if microsecond is not None else self.microsecond - - t = super(Time, self).replace(hour, minute, second, microsecond, tzinfo=tzinfo) - return self.__class__( - t.hour, t.minute, t.second, t.microsecond, tzinfo=t.tzinfo - ) - - def __getnewargs__(self): - return (self,) - - def _get_state(self, protocol=3): - tz = self.tzinfo - - return (self.hour, self.minute, self.second, self.microsecond, tz) - - def __reduce__(self): - return self.__reduce_ex__(2) - - def __reduce_ex__(self, protocol): - return self.__class__, self._get_state(protocol) - - -Time.min = Time(0, 0, 0) -Time.max = Time(23, 59, 59, 999999) -Time.resolution = Duration(microseconds=1) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/__init__.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/__init__.py deleted file mode 100644 index b085f375..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/__init__.py +++ /dev/null @@ -1,60 +0,0 @@ -from typing import Tuple -from typing import Union - -import pytzdata - -from .local_timezone import get_local_timezone -from .local_timezone import set_local_timezone -from .local_timezone import test_local_timezone -from .timezone import UTC -from .timezone import FixedTimezone as _FixedTimezone -from .timezone import Timezone as _Timezone - - -PRE_TRANSITION = "pre" -POST_TRANSITION = "post" -TRANSITION_ERROR = "error" - -timezones = pytzdata.timezones # type: Tuple[str, ...] - - -_tz_cache = {} - - -def timezone(name, extended=True): # type: (Union[str, int], bool) -> _Timezone - """ - Return a Timezone instance given its name. - """ - if isinstance(name, int): - return fixed_timezone(name) - - if name.lower() == "utc": - return UTC - - if name in _tz_cache: - return _tz_cache[name] - - tz = _Timezone(name, extended=extended) - _tz_cache[name] = tz - - return tz - - -def fixed_timezone(offset): # type: (int) -> _FixedTimezone - """ - Return a Timezone instance given its offset in seconds. - """ - if offset in _tz_cache: - return _tz_cache[offset] # type: ignore - - tz = _FixedTimezone(offset) - _tz_cache[offset] = tz - - return tz - - -def local_timezone(): # type: () -> _Timezone - """ - Return the local timezone. - """ - return get_local_timezone() diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/__pycache__/__init__.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 6f234ab5..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/__pycache__/exceptions.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/__pycache__/exceptions.cpython-311.pyc deleted file mode 100644 index e275ad64..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/__pycache__/exceptions.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/__pycache__/local_timezone.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/__pycache__/local_timezone.cpython-311.pyc deleted file mode 100644 index 3c017d54..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/__pycache__/local_timezone.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/__pycache__/timezone.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/__pycache__/timezone.cpython-311.pyc deleted file mode 100644 index 505172e7..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/__pycache__/timezone.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/data/__init__.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/data/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/data/__pycache__/__init__.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/data/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index af88c341..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/data/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/data/__pycache__/windows.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/data/__pycache__/windows.cpython-311.pyc deleted file mode 100644 index 50ad5199..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/data/__pycache__/windows.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/data/windows.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/data/windows.py deleted file mode 100644 index 7fb5b32a..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/data/windows.py +++ /dev/null @@ -1,137 +0,0 @@ -windows_timezones = { - "AUS Central Standard Time": "Australia/Darwin", - "AUS Eastern Standard Time": "Australia/Sydney", - "Afghanistan Standard Time": "Asia/Kabul", - "Alaskan Standard Time": "America/Anchorage", - "Aleutian Standard Time": "America/Adak", - "Altai Standard Time": "Asia/Barnaul", - "Arab Standard Time": "Asia/Riyadh", - "Arabian Standard Time": "Asia/Dubai", - "Arabic Standard Time": "Asia/Baghdad", - "Argentina Standard Time": "America/Buenos_Aires", - "Astrakhan Standard Time": "Europe/Astrakhan", - "Atlantic Standard Time": "America/Halifax", - "Aus Central W. Standard Time": "Australia/Eucla", - "Azerbaijan Standard Time": "Asia/Baku", - "Azores Standard Time": "Atlantic/Azores", - "Bahia Standard Time": "America/Bahia", - "Bangladesh Standard Time": "Asia/Dhaka", - "Belarus Standard Time": "Europe/Minsk", - "Bougainville Standard Time": "Pacific/Bougainville", - "Canada Central Standard Time": "America/Regina", - "Cape Verde Standard Time": "Atlantic/Cape_Verde", - "Caucasus Standard Time": "Asia/Yerevan", - "Cen. Australia Standard Time": "Australia/Adelaide", - "Central America Standard Time": "America/Guatemala", - "Central Asia Standard Time": "Asia/Almaty", - "Central Brazilian Standard Time": "America/Cuiaba", - "Central Europe Standard Time": "Europe/Budapest", - "Central European Standard Time": "Europe/Warsaw", - "Central Pacific Standard Time": "Pacific/Guadalcanal", - "Central Standard Time": "America/Chicago", - "Central Standard Time (Mexico)": "America/Mexico_City", - "Chatham Islands Standard Time": "Pacific/Chatham", - "China Standard Time": "Asia/Shanghai", - "Cuba Standard Time": "America/Havana", - "Dateline Standard Time": "Etc/GMT+12", - "E. Africa Standard Time": "Africa/Nairobi", - "E. Australia Standard Time": "Australia/Brisbane", - "E. Europe Standard Time": "Europe/Chisinau", - "E. South America Standard Time": "America/Sao_Paulo", - "Easter Island Standard Time": "Pacific/Easter", - "Eastern Standard Time": "America/New_York", - "Eastern Standard Time (Mexico)": "America/Cancun", - "Egypt Standard Time": "Africa/Cairo", - "Ekaterinburg Standard Time": "Asia/Yekaterinburg", - "FLE Standard Time": "Europe/Kiev", - "Fiji Standard Time": "Pacific/Fiji", - "GMT Standard Time": "Europe/London", - "GTB Standard Time": "Europe/Bucharest", - "Georgian Standard Time": "Asia/Tbilisi", - "Greenland Standard Time": "America/Godthab", - "Greenwich Standard Time": "Atlantic/Reykjavik", - "Haiti Standard Time": "America/Port-au-Prince", - "Hawaiian Standard Time": "Pacific/Honolulu", - "India Standard Time": "Asia/Calcutta", - "Iran Standard Time": "Asia/Tehran", - "Israel Standard Time": "Asia/Jerusalem", - "Jordan Standard Time": "Asia/Amman", - "Kaliningrad Standard Time": "Europe/Kaliningrad", - "Korea Standard Time": "Asia/Seoul", - "Libya Standard Time": "Africa/Tripoli", - "Line Islands Standard Time": "Pacific/Kiritimati", - "Lord Howe Standard Time": "Australia/Lord_Howe", - "Magadan Standard Time": "Asia/Magadan", - "Magallanes Standard Time": "America/Punta_Arenas", - "Marquesas Standard Time": "Pacific/Marquesas", - "Mauritius Standard Time": "Indian/Mauritius", - "Middle East Standard Time": "Asia/Beirut", - "Montevideo Standard Time": "America/Montevideo", - "Morocco Standard Time": "Africa/Casablanca", - "Mountain Standard Time": "America/Denver", - "Mountain Standard Time (Mexico)": "America/Chihuahua", - "Myanmar Standard Time": "Asia/Rangoon", - "N. Central Asia Standard Time": "Asia/Novosibirsk", - "Namibia Standard Time": "Africa/Windhoek", - "Nepal Standard Time": "Asia/Katmandu", - "New Zealand Standard Time": "Pacific/Auckland", - "Newfoundland Standard Time": "America/St_Johns", - "Norfolk Standard Time": "Pacific/Norfolk", - "North Asia East Standard Time": "Asia/Irkutsk", - "North Asia Standard Time": "Asia/Krasnoyarsk", - "North Korea Standard Time": "Asia/Pyongyang", - "Omsk Standard Time": "Asia/Omsk", - "Pacific SA Standard Time": "America/Santiago", - "Pacific Standard Time": "America/Los_Angeles", - "Pacific Standard Time (Mexico)": "America/Tijuana", - "Pakistan Standard Time": "Asia/Karachi", - "Paraguay Standard Time": "America/Asuncion", - "Romance Standard Time": "Europe/Paris", - "Russia Time Zone 10": "Asia/Srednekolymsk", - "Russia Time Zone 11": "Asia/Kamchatka", - "Russia Time Zone 3": "Europe/Samara", - "Russian Standard Time": "Europe/Moscow", - "SA Eastern Standard Time": "America/Cayenne", - "SA Pacific Standard Time": "America/Bogota", - "SA Western Standard Time": "America/La_Paz", - "SE Asia Standard Time": "Asia/Bangkok", - "Saint Pierre Standard Time": "America/Miquelon", - "Sakhalin Standard Time": "Asia/Sakhalin", - "Samoa Standard Time": "Pacific/Apia", - "Sao Tome Standard Time": "Africa/Sao_Tome", - "Saratov Standard Time": "Europe/Saratov", - "Singapore Standard Time": "Asia/Singapore", - "South Africa Standard Time": "Africa/Johannesburg", - "Sri Lanka Standard Time": "Asia/Colombo", - "Sudan Standard Time": "Africa/Khartoum", - "Syria Standard Time": "Asia/Damascus", - "Taipei Standard Time": "Asia/Taipei", - "Tasmania Standard Time": "Australia/Hobart", - "Tocantins Standard Time": "America/Araguaina", - "Tokyo Standard Time": "Asia/Tokyo", - "Tomsk Standard Time": "Asia/Tomsk", - "Tonga Standard Time": "Pacific/Tongatapu", - "Transbaikal Standard Time": "Asia/Chita", - "Turkey Standard Time": "Europe/Istanbul", - "Turks And Caicos Standard Time": "America/Grand_Turk", - "US Eastern Standard Time": "America/Indianapolis", - "US Mountain Standard Time": "America/Phoenix", - "UTC": "Etc/GMT", - "UTC+12": "Etc/GMT-12", - "UTC+13": "Etc/GMT-13", - "UTC-02": "Etc/GMT+2", - "UTC-08": "Etc/GMT+8", - "UTC-09": "Etc/GMT+9", - "UTC-11": "Etc/GMT+11", - "Ulaanbaatar Standard Time": "Asia/Ulaanbaatar", - "Venezuela Standard Time": "America/Caracas", - "Vladivostok Standard Time": "Asia/Vladivostok", - "W. Australia Standard Time": "Australia/Perth", - "W. Central Africa Standard Time": "Africa/Lagos", - "W. Europe Standard Time": "Europe/Berlin", - "W. Mongolia Standard Time": "Asia/Hovd", - "West Asia Standard Time": "Asia/Tashkent", - "West Bank Standard Time": "Asia/Hebron", - "West Pacific Standard Time": "Pacific/Port_Moresby", - "Yakutsk Standard Time": "Asia/Yakutsk", -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/exceptions.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/exceptions.py deleted file mode 100644 index d1572f90..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/exceptions.py +++ /dev/null @@ -1,23 +0,0 @@ -class TimezoneError(ValueError): - - pass - - -class NonExistingTime(TimezoneError): - - message = "The datetime {} does not exist." - - def __init__(self, dt): - message = self.message.format(dt) - - super(NonExistingTime, self).__init__(message) - - -class AmbiguousTime(TimezoneError): - - message = "The datetime {} is ambiguous." - - def __init__(self, dt): - message = self.message.format(dt) - - super(AmbiguousTime, self).__init__(message) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/local_timezone.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/local_timezone.py deleted file mode 100644 index 756105a7..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/local_timezone.py +++ /dev/null @@ -1,257 +0,0 @@ -import os -import re -import sys - -from contextlib import contextmanager -from typing import Iterator -from typing import Optional -from typing import Union - -from .timezone import Timezone -from .timezone import TimezoneFile -from .zoneinfo.exceptions import InvalidTimezone - - -try: - import _winreg as winreg -except ImportError: - try: - import winreg - except ImportError: - winreg = None - - -_mock_local_timezone = None -_local_timezone = None - - -def get_local_timezone(): # type: () -> Timezone - global _local_timezone - - if _mock_local_timezone is not None: - return _mock_local_timezone - - if _local_timezone is None: - tz = _get_system_timezone() - - _local_timezone = tz - - return _local_timezone - - -def set_local_timezone(mock=None): # type: (Optional[Union[str, Timezone]]) -> None - global _mock_local_timezone - - _mock_local_timezone = mock - - -@contextmanager -def test_local_timezone(mock): # type: (Timezone) -> Iterator[None] - set_local_timezone(mock) - - yield - - set_local_timezone() - - -def _get_system_timezone(): # type: () -> Timezone - if sys.platform == "win32": - return _get_windows_timezone() - elif "darwin" in sys.platform: - return _get_darwin_timezone() - - return _get_unix_timezone() - - -def _get_windows_timezone(): # type: () -> Timezone - from .data.windows import windows_timezones - - # Windows is special. It has unique time zone names (in several - # meanings of the word) available, but unfortunately, they can be - # translated to the language of the operating system, so we need to - # do a backwards lookup, by going through all time zones and see which - # one matches. - handle = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) - - tz_local_key_name = r"SYSTEM\CurrentControlSet\Control\TimeZoneInformation" - localtz = winreg.OpenKey(handle, tz_local_key_name) - - timezone_info = {} - size = winreg.QueryInfoKey(localtz)[1] - for i in range(size): - data = winreg.EnumValue(localtz, i) - timezone_info[data[0]] = data[1] - - localtz.Close() - - if "TimeZoneKeyName" in timezone_info: - # Windows 7 (and Vista?) - - # For some reason this returns a string with loads of NUL bytes at - # least on some systems. I don't know if this is a bug somewhere, I - # just work around it. - tzkeyname = timezone_info["TimeZoneKeyName"].split("\x00", 1)[0] - else: - # Windows 2000 or XP - - # This is the localized name: - tzwin = timezone_info["StandardName"] - - # Open the list of timezones to look up the real name: - tz_key_name = r"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones" - tzkey = winreg.OpenKey(handle, tz_key_name) - - # Now, match this value to Time Zone information - tzkeyname = None - for i in range(winreg.QueryInfoKey(tzkey)[0]): - subkey = winreg.EnumKey(tzkey, i) - sub = winreg.OpenKey(tzkey, subkey) - - info = {} - size = winreg.QueryInfoKey(sub)[1] - for i in range(size): - data = winreg.EnumValue(sub, i) - info[data[0]] = data[1] - - sub.Close() - try: - if info["Std"] == tzwin: - tzkeyname = subkey - break - except KeyError: - # This timezone didn't have proper configuration. - # Ignore it. - pass - - tzkey.Close() - handle.Close() - - if tzkeyname is None: - raise LookupError("Can not find Windows timezone configuration") - - timezone = windows_timezones.get(tzkeyname) - if timezone is None: - # Nope, that didn't work. Try adding "Standard Time", - # it seems to work a lot of times: - timezone = windows_timezones.get(tzkeyname + " Standard Time") - - # Return what we have. - if timezone is None: - raise LookupError("Unable to find timezone " + tzkeyname) - - return Timezone(timezone) - - -def _get_darwin_timezone(): # type: () -> Timezone - # link will be something like /usr/share/zoneinfo/America/Los_Angeles. - link = os.readlink("/etc/localtime") - tzname = link[link.rfind("zoneinfo/") + 9 :] - - return Timezone(tzname) - - -def _get_unix_timezone(_root="/"): # type: (str) -> Timezone - tzenv = os.environ.get("TZ") - if tzenv: - try: - return _tz_from_env(tzenv) - except ValueError: - pass - - # Now look for distribution specific configuration files - # that contain the timezone name. - tzpath = os.path.join(_root, "etc/timezone") - if os.path.exists(tzpath): - with open(tzpath, "rb") as tzfile: - data = tzfile.read() - - # Issue #3 was that /etc/timezone was a zoneinfo file. - # That's a misconfiguration, but we need to handle it gracefully: - if data[:5] != "TZif2": - etctz = data.strip().decode() - # Get rid of host definitions and comments: - if " " in etctz: - etctz, dummy = etctz.split(" ", 1) - if "#" in etctz: - etctz, dummy = etctz.split("#", 1) - - return Timezone(etctz.replace(" ", "_")) - - # CentOS has a ZONE setting in /etc/sysconfig/clock, - # OpenSUSE has a TIMEZONE setting in /etc/sysconfig/clock and - # Gentoo has a TIMEZONE setting in /etc/conf.d/clock - # We look through these files for a timezone: - zone_re = re.compile(r'\s*ZONE\s*=\s*"') - timezone_re = re.compile(r'\s*TIMEZONE\s*=\s*"') - end_re = re.compile('"') - - for filename in ("etc/sysconfig/clock", "etc/conf.d/clock"): - tzpath = os.path.join(_root, filename) - if not os.path.exists(tzpath): - continue - - with open(tzpath, "rt") as tzfile: - data = tzfile.readlines() - - for line in data: - # Look for the ZONE= setting. - match = zone_re.match(line) - if match is None: - # No ZONE= setting. Look for the TIMEZONE= setting. - match = timezone_re.match(line) - - if match is not None: - # Some setting existed - line = line[match.end() :] - etctz = line[: end_re.search(line).start()] - - parts = list(reversed(etctz.replace(" ", "_").split(os.path.sep))) - tzpath = [] - while parts: - tzpath.insert(0, parts.pop(0)) - - try: - return Timezone(os.path.join(*tzpath)) - except InvalidTimezone: - pass - - # systemd distributions use symlinks that include the zone name, - # see manpage of localtime(5) and timedatectl(1) - tzpath = os.path.join(_root, "etc", "localtime") - if os.path.exists(tzpath) and os.path.islink(tzpath): - parts = list( - reversed(os.path.realpath(tzpath).replace(" ", "_").split(os.path.sep)) - ) - tzpath = [] - while parts: - tzpath.insert(0, parts.pop(0)) - try: - return Timezone(os.path.join(*tzpath)) - except InvalidTimezone: - pass - - # No explicit setting existed. Use localtime - for filename in ("etc/localtime", "usr/local/etc/localtime"): - tzpath = os.path.join(_root, filename) - - if not os.path.exists(tzpath): - continue - - return TimezoneFile(tzpath) - - raise RuntimeError("Unable to find any timezone configuration") - - -def _tz_from_env(tzenv): # type: (str) -> Timezone - if tzenv[0] == ":": - tzenv = tzenv[1:] - - # TZ specifies a file - if os.path.exists(tzenv): - return TimezoneFile(tzenv) - - # TZ specifies a zoneinfo zone. - try: - return Timezone(tzenv) - except ValueError: - raise diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/timezone.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/timezone.py deleted file mode 100644 index bc94d563..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/timezone.py +++ /dev/null @@ -1,377 +0,0 @@ -from datetime import datetime -from datetime import timedelta -from datetime import tzinfo -from typing import Optional -from typing import TypeVar -from typing import overload - -import pendulum - -from pendulum.helpers import local_time -from pendulum.helpers import timestamp -from pendulum.utils._compat import _HAS_FOLD - -from .exceptions import AmbiguousTime -from .exceptions import NonExistingTime -from .zoneinfo import read -from .zoneinfo import read_file -from .zoneinfo.transition import Transition - - -POST_TRANSITION = "post" -PRE_TRANSITION = "pre" -TRANSITION_ERROR = "error" - -_datetime = datetime -_D = TypeVar("_D", bound=datetime) - - -class Timezone(tzinfo): - """ - Represents a named timezone. - - The accepted names are those provided by the IANA time zone database. - - >>> from pendulum.tz.timezone import Timezone - >>> tz = Timezone('Europe/Paris') - """ - - def __init__(self, name, extended=True): # type: (str, bool) -> None - tz = read(name, extend=extended) - - self._name = name - self._transitions = tz.transitions - self._hint = {True: None, False: None} - - @property - def name(self): # type: () -> str - return self._name - - def convert(self, dt, dst_rule=None): # type: (_D, Optional[str]) -> _D - """ - Converts a datetime in the current timezone. - - If the datetime is naive, it will be normalized. - - >>> from datetime import datetime - >>> from pendulum import timezone - >>> paris = timezone('Europe/Paris') - >>> dt = datetime(2013, 3, 31, 2, 30, fold=1) - >>> in_paris = paris.convert(dt) - >>> in_paris.isoformat() - '2013-03-31T03:30:00+02:00' - - If the datetime is aware, it will be properly converted. - - >>> new_york = timezone('America/New_York') - >>> in_new_york = new_york.convert(in_paris) - >>> in_new_york.isoformat() - '2013-03-30T21:30:00-04:00' - """ - if dt.tzinfo is None: - return self._normalize(dt, dst_rule=dst_rule) - - return self._convert(dt) - - def datetime( - self, year, month, day, hour=0, minute=0, second=0, microsecond=0 - ): # type: (int, int, int, int, int, int, int) -> _datetime - """ - Return a normalized datetime for the current timezone. - """ - if _HAS_FOLD: - return self.convert( - datetime(year, month, day, hour, minute, second, microsecond, fold=1) - ) - - return self.convert( - datetime(year, month, day, hour, minute, second, microsecond), - dst_rule=POST_TRANSITION, - ) - - def _normalize(self, dt, dst_rule=None): # type: (_D, Optional[str]) -> _D - sec = timestamp(dt) - fold = 0 - transition = self._lookup_transition(sec) - - if not _HAS_FOLD and dst_rule is None: - dst_rule = POST_TRANSITION - - if dst_rule is None: - dst_rule = PRE_TRANSITION - if dt.fold == 1: - dst_rule = POST_TRANSITION - - if sec < transition.local: - if transition.is_ambiguous(sec): - # Ambiguous time - if dst_rule == TRANSITION_ERROR: - raise AmbiguousTime(dt) - - # We set the fold attribute for later - if dst_rule == POST_TRANSITION: - fold = 1 - elif transition.previous is not None: - transition = transition.previous - - if transition: - if transition.is_ambiguous(sec): - # Ambiguous time - if dst_rule == TRANSITION_ERROR: - raise AmbiguousTime(dt) - - # We set the fold attribute for later - if dst_rule == POST_TRANSITION: - fold = 1 - elif transition.is_missing(sec): - # Skipped time - if dst_rule == TRANSITION_ERROR: - raise NonExistingTime(dt) - - # We adjust accordingly - if dst_rule == POST_TRANSITION: - sec += transition.fix - fold = 1 - else: - sec -= transition.fix - - kwargs = {"tzinfo": self} - if _HAS_FOLD or isinstance(dt, pendulum.DateTime): - kwargs["fold"] = fold - - return dt.__class__(*local_time(sec, 0, dt.microsecond), **kwargs) - - def _convert(self, dt): # type: (_D) -> _D - if dt.tzinfo is self: - return self._normalize(dt, dst_rule=POST_TRANSITION) - - if not isinstance(dt.tzinfo, Timezone): - return dt.astimezone(self) - - stamp = timestamp(dt) - - if isinstance(dt.tzinfo, FixedTimezone): - offset = dt.tzinfo.offset - else: - transition = dt.tzinfo._lookup_transition(stamp) - offset = transition.ttype.offset - - if stamp < transition.local and transition.previous is not None: - if ( - transition.previous.is_ambiguous(stamp) - and getattr(dt, "fold", 1) == 0 - ): - pass - else: - offset = transition.previous.ttype.offset - - stamp -= offset - - transition = self._lookup_transition(stamp, is_utc=True) - if stamp < transition.at and transition.previous is not None: - transition = transition.previous - - offset = transition.ttype.offset - stamp += offset - fold = int(not transition.ttype.is_dst()) - - kwargs = {"tzinfo": self} - - if _HAS_FOLD or isinstance(dt, pendulum.DateTime): - kwargs["fold"] = fold - - return dt.__class__(*local_time(stamp, 0, dt.microsecond), **kwargs) - - def _lookup_transition( - self, stamp, is_utc=False - ): # type: (int, bool) -> Transition - lo, hi = 0, len(self._transitions) - hint = self._hint[is_utc] - if hint: - if stamp == hint[0]: - return self._transitions[hint[1]] - elif stamp < hint[0]: - hi = hint[1] - else: - lo = hint[1] - - if not is_utc: - while lo < hi: - mid = (lo + hi) // 2 - if stamp < self._transitions[mid].to: - hi = mid - else: - lo = mid + 1 - else: - while lo < hi: - mid = (lo + hi) // 2 - if stamp < self._transitions[mid].at: - hi = mid - else: - lo = mid + 1 - - if lo >= len(self._transitions): - # Beyond last transition - lo = len(self._transitions) - 1 - - self._hint[is_utc] = (stamp, lo) - - return self._transitions[lo] - - @overload - def utcoffset(self, dt): # type: (None) -> None - pass - - @overload - def utcoffset(self, dt): # type: (_datetime) -> timedelta - pass - - def utcoffset(self, dt): - if dt is None: - return - - transition = self._get_transition(dt) - - return transition.utcoffset() - - def dst( - self, dt # type: Optional[_datetime] - ): # type: (...) -> Optional[timedelta] - if dt is None: - return - - transition = self._get_transition(dt) - - if not transition.ttype.is_dst(): - return timedelta() - - return timedelta(seconds=transition.fix) - - def tzname(self, dt): # type: (Optional[_datetime]) -> Optional[str] - if dt is None: - return - - transition = self._get_transition(dt) - - return transition.ttype.abbreviation - - def _get_transition(self, dt): # type: (_datetime) -> Transition - if dt.tzinfo is not None and dt.tzinfo is not self: - dt = dt - dt.utcoffset() - - stamp = timestamp(dt) - - transition = self._lookup_transition(stamp, is_utc=True) - else: - stamp = timestamp(dt) - - transition = self._lookup_transition(stamp) - - if stamp < transition.local and transition.previous is not None: - fold = getattr(dt, "fold", 1) - if transition.is_ambiguous(stamp): - if fold == 0: - transition = transition.previous - elif transition.previous.is_ambiguous(stamp) and fold == 0: - pass - else: - transition = transition.previous - - return transition - - def fromutc(self, dt): # type: (_D) -> _D - stamp = timestamp(dt) - - transition = self._lookup_transition(stamp, is_utc=True) - if stamp < transition.at and transition.previous is not None: - transition = transition.previous - - stamp += transition.ttype.offset - - return dt.__class__(*local_time(stamp, 0, dt.microsecond), tzinfo=self) - - def __repr__(self): # type: () -> str - return "Timezone('{}')".format(self._name) - - def __getinitargs__(self): # type: () -> tuple - return (self._name,) - - -class FixedTimezone(Timezone): - def __init__(self, offset, name=None): - sign = "-" if offset < 0 else "+" - - minutes = offset / 60 - hour, minute = divmod(abs(int(minutes)), 60) - - if not name: - name = "{0}{1:02d}:{2:02d}".format(sign, hour, minute) - - self._name = name - self._offset = offset - self._utcoffset = timedelta(seconds=offset) - - @property - def offset(self): # type: () -> int - return self._offset - - def _normalize(self, dt, dst_rule=None): # type: (_D, Optional[str]) -> _D - if _HAS_FOLD: - dt = dt.__class__( - dt.year, - dt.month, - dt.day, - dt.hour, - dt.minute, - dt.second, - dt.microsecond, - tzinfo=self, - fold=0, - ) - else: - dt = dt.__class__( - dt.year, - dt.month, - dt.day, - dt.hour, - dt.minute, - dt.second, - dt.microsecond, - tzinfo=self, - ) - - return dt - - def _convert(self, dt): # type: (_D) -> _D - if dt.tzinfo is not self: - return dt.astimezone(self) - - return dt - - def utcoffset(self, dt): # type: (Optional[_datetime]) -> timedelta - return self._utcoffset - - def dst(self, dt): # type: (Optional[_datetime]) -> timedelta - return timedelta() - - def fromutc(self, dt): # type: (_D) -> _D - # Use the stdlib datetime's add method to avoid infinite recursion - return (datetime.__add__(dt, self._utcoffset)).replace(tzinfo=self) - - def tzname(self, dt): # type: (Optional[_datetime]) -> Optional[str] - return self._name - - def __getinitargs__(self): # type: () -> tuple - return self._offset, self._name - - -class TimezoneFile(Timezone): - def __init__(self, path): - tz = read_file(path) - - self._name = "" - self._transitions = tz.transitions - self._hint = {True: None, False: None} - - -UTC = FixedTimezone(0, "UTC") diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/__init__.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/__init__.py deleted file mode 100644 index 890351ae..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ -from .reader import Reader -from .timezone import Timezone - - -def read(name, extend=True): # type: (str, bool) -> Timezone - """ - Read the zoneinfo structure for a given timezone name. - """ - return Reader(extend=extend).read_for(name) - - -def read_file(path, extend=True): # type: (str, bool) -> Timezone - """ - Read the zoneinfo structure for a given path. - """ - return Reader(extend=extend).read(path) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/__pycache__/__init__.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index a5f4930b..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/__pycache__/exceptions.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/__pycache__/exceptions.cpython-311.pyc deleted file mode 100644 index e8998a7b..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/__pycache__/exceptions.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/__pycache__/posix_timezone.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/__pycache__/posix_timezone.cpython-311.pyc deleted file mode 100644 index eb4613cf..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/__pycache__/posix_timezone.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/__pycache__/reader.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/__pycache__/reader.cpython-311.pyc deleted file mode 100644 index d941e222..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/__pycache__/reader.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/__pycache__/timezone.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/__pycache__/timezone.cpython-311.pyc deleted file mode 100644 index 6db9d47e..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/__pycache__/timezone.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/__pycache__/transition.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/__pycache__/transition.cpython-311.pyc deleted file mode 100644 index 27dd6509..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/__pycache__/transition.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/__pycache__/transition_type.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/__pycache__/transition_type.cpython-311.pyc deleted file mode 100644 index 19ec09bb..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/__pycache__/transition_type.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/exceptions.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/exceptions.py deleted file mode 100644 index 6e29ae25..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/exceptions.py +++ /dev/null @@ -1,18 +0,0 @@ -class ZoneinfoError(Exception): - - pass - - -class InvalidZoneinfoFile(ZoneinfoError): - - pass - - -class InvalidTimezone(ZoneinfoError): - def __init__(self, name): - super(InvalidTimezone, self).__init__('Invalid timezone "{}"'.format(name)) - - -class InvalidPosixSpec(ZoneinfoError): - def __init__(self, spec): - super(InvalidPosixSpec, self).__init__("Invalid POSIX spec: {}".format(spec)) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/posix_timezone.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/posix_timezone.py deleted file mode 100644 index a6a7c72d..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/posix_timezone.py +++ /dev/null @@ -1,270 +0,0 @@ -""" -Parsing of a POSIX zone spec as described in the TZ part of section 8.3 in -http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html. -""" -import re - -from typing import Optional - -from pendulum.constants import MONTHS_OFFSETS -from pendulum.constants import SECS_PER_DAY - -from .exceptions import InvalidPosixSpec - - -_spec = re.compile( - "^" - r"(?P<std_abbr><.*?>|[^-+,\d]{3,})" - r"(?P<std_offset>([+-])?(\d{1,2})(:\d{2}(:\d{2})?)?)" - r"(?P<dst_info>" - r" (?P<dst_abbr><.*?>|[^-+,\d]{3,})" - r" (?P<dst_offset>([+-])?(\d{1,2})(:\d{2}(:\d{2})?)?)?" - r")?" - r"(?:,(?P<rules>" - r" (?P<dst_start>" - r" (?:J\d+|\d+|M\d{1,2}.\d.[0-6])" - r" (?:/(?P<dst_start_offset>([+-])?(\d+)(:\d{2}(:\d{2})?)?))?" - " )" - " ," - r" (?P<dst_end>" - r" (?:J\d+|\d+|M\d{1,2}.\d.[0-6])" - r" (?:/(?P<dst_end_offset>([+-])?(\d+)(:\d{2}(:\d{2})?)?))?" - " )" - "))?" - "$", - re.VERBOSE, -) - - -def posix_spec(spec): # type: (str) -> PosixTimezone - try: - return _posix_spec(spec) - except ValueError: - raise InvalidPosixSpec(spec) - - -def _posix_spec(spec): # type: (str) -> PosixTimezone - m = _spec.match(spec) - if not m: - raise ValueError("Invalid posix spec") - - std_abbr = _parse_abbr(m.group("std_abbr")) - std_offset = _parse_offset(m.group("std_offset")) - - dst_abbr = None - dst_offset = None - if m.group("dst_info"): - dst_abbr = _parse_abbr(m.group("dst_abbr")) - if m.group("dst_offset"): - dst_offset = _parse_offset(m.group("dst_offset")) - else: - dst_offset = std_offset + 3600 - - dst_start = None - dst_end = None - if m.group("rules"): - dst_start = _parse_rule(m.group("dst_start")) - dst_end = _parse_rule(m.group("dst_end")) - - return PosixTimezone(std_abbr, std_offset, dst_abbr, dst_offset, dst_start, dst_end) - - -def _parse_abbr(text): # type: (str) -> str - return text.lstrip("<").rstrip(">") - - -def _parse_offset(text, sign=-1): # type: (str, int) -> int - if text.startswith(("+", "-")): - if text.startswith("-"): - sign *= -1 - - text = text[1:] - - minutes = 0 - seconds = 0 - - parts = text.split(":") - hours = int(parts[0]) - - if len(parts) > 1: - minutes = int(parts[1]) - - if len(parts) > 2: - seconds = int(parts[2]) - - return sign * ((((hours * 60) + minutes) * 60) + seconds) - - -def _parse_rule(rule): # type: (str) -> PosixTransition - klass = NPosixTransition - args = () - - if rule.startswith("M"): - rule = rule[1:] - parts = rule.split(".") - month = int(parts[0]) - week = int(parts[1]) - day = int(parts[2].split("/")[0]) - - args += (month, week, day) - klass = MPosixTransition - elif rule.startswith("J"): - rule = rule[1:] - args += (int(rule.split("/")[0]),) - klass = JPosixTransition - else: - args += (int(rule.split("/")[0]),) - - # Checking offset - parts = rule.split("/") - if len(parts) > 1: - offset = _parse_offset(parts[-1], sign=1) - else: - offset = 7200 - - args += (offset,) - - return klass(*args) - - -class PosixTransition(object): - def __init__(self, offset): # type: (int) -> None - self._offset = offset - - @property - def offset(self): # type: () -> int - return self._offset - - def trans_offset(self, is_leap, jan1_weekday): # type: (bool, int) -> int - raise NotImplementedError() - - -class JPosixTransition(PosixTransition): - def __init__(self, day, offset): # type: (int, int) -> None - self._day = day - - super(JPosixTransition, self).__init__(offset) - - @property - def day(self): # type: () -> int - """ - day of non-leap year [1:365] - """ - return self._day - - def trans_offset(self, is_leap, jan1_weekday): # type: (bool, int) -> int - days = self._day - if not is_leap or days < MONTHS_OFFSETS[1][3]: - days -= 1 - - return (days * SECS_PER_DAY) + self._offset - - -class NPosixTransition(PosixTransition): - def __init__(self, day, offset): # type: (int, int) -> None - self._day = day - - super(NPosixTransition, self).__init__(offset) - - @property - def day(self): # type: () -> int - """ - day of year [0:365] - """ - return self._day - - def trans_offset(self, is_leap, jan1_weekday): # type: (bool, int) -> int - days = self._day - - return (days * SECS_PER_DAY) + self._offset - - -class MPosixTransition(PosixTransition): - def __init__(self, month, week, weekday, offset): - # type: (int, int, int, int) -> None - self._month = month - self._week = week - self._weekday = weekday - - super(MPosixTransition, self).__init__(offset) - - @property - def month(self): # type: () -> int - """ - month of year [1:12] - """ - return self._month - - @property - def week(self): # type: () -> int - """ - week of month [1:5] (5==last) - """ - return self._week - - @property - def weekday(self): # type: () -> int - """ - 0==Sun, ..., 6=Sat - """ - return self._weekday - - def trans_offset(self, is_leap, jan1_weekday): # type: (bool, int) -> int - last_week = self._week == 5 - days = MONTHS_OFFSETS[is_leap][self._month + int(last_week)] - weekday = (jan1_weekday + days) % 7 - if last_week: - days -= (weekday + 7 - 1 - self._weekday) % 7 + 1 - else: - days += (self._weekday + 7 - weekday) % 7 - days += (self._week - 1) * 7 - - return (days * SECS_PER_DAY) + self._offset - - -class PosixTimezone: - """ - The entirety of a POSIX-string specified time-zone rule. - - The standard abbreviation and offset are always given. - """ - - def __init__( - self, - std_abbr, # type: str - std_offset, # type: int - dst_abbr, # type: Optional[str] - dst_offset, # type: Optional[int] - dst_start=None, # type: Optional[PosixTransition] - dst_end=None, # type: Optional[PosixTransition] - ): - self._std_abbr = std_abbr - self._std_offset = std_offset - self._dst_abbr = dst_abbr - self._dst_offset = dst_offset - self._dst_start = dst_start - self._dst_end = dst_end - - @property - def std_abbr(self): # type: () -> str - return self._std_abbr - - @property - def std_offset(self): # type: () -> int - return self._std_offset - - @property - def dst_abbr(self): # type: () -> Optional[str] - return self._dst_abbr - - @property - def dst_offset(self): # type: () -> Optional[int] - return self._dst_offset - - @property - def dst_start(self): # type: () -> Optional[PosixTransition] - return self._dst_start - - @property - def dst_end(self): # type: () -> Optional[PosixTransition] - return self._dst_end diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/reader.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/reader.py deleted file mode 100644 index 31cb933d..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/reader.py +++ /dev/null @@ -1,224 +0,0 @@ -import os - -from collections import namedtuple -from struct import unpack -from typing import IO -from typing import Any -from typing import Dict -from typing import List -from typing import Optional -from typing import Tuple - -import pytzdata - -from pytzdata.exceptions import TimezoneNotFound - -from pendulum.utils._compat import PY2 - -from .exceptions import InvalidTimezone -from .exceptions import InvalidZoneinfoFile -from .posix_timezone import PosixTimezone -from .posix_timezone import posix_spec -from .timezone import Timezone -from .transition import Transition -from .transition_type import TransitionType - - -_offset = namedtuple("offset", "utc_total_offset is_dst abbr_idx") - -header = namedtuple( - "header", - "version " "utclocals " "stdwalls " "leaps " "transitions " "types " "abbr_size", -) - - -class Reader: - """ - Reads compiled zoneinfo TZif (\0, 2 or 3) files. - """ - - def __init__(self, extend=True): # type: (bool) -> None - self._extend = extend - - def read_for(self, timezone): # type: (str) -> Timezone - """ - Read the zoneinfo structure for a given timezone name. - - :param timezone: The timezone. - """ - try: - file_path = pytzdata.tz_path(timezone) - except TimezoneNotFound: - raise InvalidTimezone(timezone) - - return self.read(file_path) - - def read(self, file_path): # type: (str) -> Timezone - """ - Read a zoneinfo structure from the given path. - - :param file_path: The path of a zoneinfo file. - """ - if not os.path.exists(file_path): - raise InvalidZoneinfoFile("The tzinfo file does not exist") - - with open(file_path, "rb") as fd: - return self._parse(fd) - - def _check_read(self, fd, nbytes): # type: (...) -> bytes - """ - Reads the given number of bytes from the given file - and checks that the correct number of bytes could be read. - """ - result = fd.read(nbytes) - - if (not result and nbytes > 0) or len(result) != nbytes: - raise InvalidZoneinfoFile( - "Expected {} bytes reading {}, " - "but got {}".format(nbytes, fd.name, len(result) if result else 0) - ) - - if PY2: - return bytearray(result) - - return result - - def _parse(self, fd): # type: (...) -> Timezone - """ - Parse a zoneinfo file. - """ - hdr = self._parse_header(fd) - - if hdr.version in (2, 3): - # We're skipping the entire v1 file since - # at least the same data will be found in TZFile 2. - fd.seek( - hdr.transitions * 5 - + hdr.types * 6 - + hdr.abbr_size - + hdr.leaps * 4 - + hdr.stdwalls - + hdr.utclocals, - 1, - ) - - # Parse the second header - hdr = self._parse_header(fd) - - if hdr.version != 2 and hdr.version != 3: - raise InvalidZoneinfoFile( - "Header versions mismatch for file {}".format(fd.name) - ) - - # Parse the v2 data - trans = self._parse_trans_64(fd, hdr.transitions) - type_idx = self._parse_type_idx(fd, hdr.transitions) - types = self._parse_types(fd, hdr.types) - abbrs = self._parse_abbrs(fd, hdr.abbr_size, types) - - fd.seek(hdr.leaps * 8 + hdr.stdwalls + hdr.utclocals, 1) - - trule = self._parse_posix_tz(fd) - else: - # TZFile v1 - trans = self._parse_trans_32(fd, hdr.transitions) - type_idx = self._parse_type_idx(fd, hdr.transitions) - types = self._parse_types(fd, hdr.types) - abbrs = self._parse_abbrs(fd, hdr.abbr_size, types) - trule = None - - types = [ - TransitionType(off, is_dst, abbrs[abbr]) for off, is_dst, abbr in types - ] - - transitions = [] - previous = None - for trans, idx in zip(trans, type_idx): - transition = Transition(trans, types[idx], previous) - transitions.append(transition) - - previous = transition - - if not transitions: - transitions.append(Transition(0, types[0], None)) - - return Timezone(transitions, posix_rule=trule, extended=self._extend) - - def _parse_header(self, fd): # type: (...) -> header - buff = self._check_read(fd, 44) - - if buff[:4] != b"TZif": - raise InvalidZoneinfoFile( - 'The file "{}" has an invalid header.'.format(fd.name) - ) - - version = {0x00: 1, 0x32: 2, 0x33: 3}.get(buff[4]) - - if version is None: - raise InvalidZoneinfoFile( - 'The file "{}" has an invalid version.'.format(fd.name) - ) - - hdr = header(version, *unpack(">6l", buff[20:44])) - - return hdr - - def _parse_trans_64(self, fd, n): # type: (IO[Any], int) -> List[int] - trans = [] - for _ in range(n): - buff = self._check_read(fd, 8) - trans.append(unpack(">q", buff)[0]) - - return trans - - def _parse_trans_32(self, fd, n): # type: (IO[Any], int) -> List[int] - trans = [] - for _ in range(n): - buff = self._check_read(fd, 4) - trans.append(unpack(">i", buff)[0]) - - return trans - - def _parse_type_idx(self, fd, n): # type: (IO[Any], int) -> List[int] - buff = self._check_read(fd, n) - - return list(unpack("{}B".format(n), buff)) - - def _parse_types( - self, fd, n - ): # type: (IO[Any], int) -> List[Tuple[Any, bool, int]] - types = [] - - for _ in range(n): - buff = self._check_read(fd, 6) - offset = unpack(">l", buff[:4])[0] - is_dst = buff[4] == 1 - types.append((offset, is_dst, buff[5])) - - return types - - def _parse_abbrs( - self, fd, n, types - ): # type: (IO[Any], int, List[Tuple[Any, bool, int]]) -> Dict[int, str] - abbrs = {} - buff = self._check_read(fd, n) - - for offset, is_dst, idx in types: - if idx not in abbrs: - abbr = buff[idx : buff.find(b"\0", idx)].decode("utf-8") - abbrs[idx] = abbr - - return abbrs - - def _parse_posix_tz(self, fd): # type: (...) -> Optional[PosixTimezone] - s = fd.read().decode("utf-8") - - if not s.startswith("\n") or not s.endswith("\n"): - raise InvalidZoneinfoFile('Invalid posix rule in file "{}"'.format(fd.name)) - - s = s.strip() - - if not s: - return - - return posix_spec(s) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/timezone.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/timezone.py deleted file mode 100644 index 2147774a..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/timezone.py +++ /dev/null @@ -1,128 +0,0 @@ -from datetime import datetime -from typing import List -from typing import Optional - -from pendulum.constants import DAYS_PER_YEAR -from pendulum.constants import SECS_PER_YEAR -from pendulum.helpers import is_leap -from pendulum.helpers import local_time -from pendulum.helpers import timestamp -from pendulum.helpers import week_day - -from .posix_timezone import PosixTimezone -from .transition import Transition -from .transition_type import TransitionType - - -class Timezone: - def __init__( - self, - transitions, # type: List[Transition] - posix_rule=None, # type: Optional[PosixTimezone] - extended=True, # type: bool - ): - self._posix_rule = posix_rule - self._transitions = transitions - - if extended: - self._extends() - - @property - def transitions(self): # type: () -> List[Transition] - return self._transitions - - @property - def posix_rule(self): - return self._posix_rule - - def _extends(self): - if not self._posix_rule: - return - - posix = self._posix_rule - - if not posix.dst_abbr: - # std only - # The future specification should match the last/default transition - ttype = self._transitions[-1].ttype - if not self._check_ttype(ttype, posix.std_offset, False, posix.std_abbr): - raise ValueError("Posix spec does not match last transition") - - return - - if len(self._transitions) < 2: - raise ValueError("Too few transitions for POSIX spec") - - # Extend the transitions for an additional 400 years - # using the future specification - - # The future specification should match the last two transitions, - # and those transitions should have different is_dst flags. - tr0 = self._transitions[-1] - tr1 = self._transitions[-2] - tt0 = tr0.ttype - tt1 = tr1.ttype - if tt0.is_dst(): - dst = tt0 - std = tt1 - else: - dst = tt1 - std = tt0 - - self._check_ttype(dst, posix.dst_offset, True, posix.dst_abbr) - self._check_ttype(std, posix.std_offset, False, posix.std_abbr) - - # Add the transitions to tr1 and back to tr0 for each extra year. - last_year = local_time(tr0.local, 0, 0)[0] - leap_year = is_leap(last_year) - jan1 = datetime(last_year, 1, 1) - jan1_time = timestamp(jan1) - jan1_weekday = week_day(jan1.year, jan1.month, jan1.day) % 7 - - if local_time(tr1.local, 0, 0)[0] != last_year: - # Add a single extra transition to align to a calendar year. - if tt0.is_dst(): - pt1 = posix.dst_end - else: - pt1 = posix.dst_start - - tr1_offset = pt1.trans_offset(leap_year, jan1_weekday) - tr = Transition(jan1_time + tr1_offset - tt0.offset, tr1.ttype, tr0) - tr0 = tr - tr1 = tr0 - tt0 = tr0.ttype - tt1 = tr1.ttype - - if tt0.is_dst(): - pt1 = posix.dst_end - pt0 = posix.dst_start - else: - pt1 = posix.dst_start - pt0 = posix.dst_end - - tr = tr0 - for year in range(last_year + 1, last_year + 401): - jan1_time += SECS_PER_YEAR[leap_year] - jan1_weekday = (jan1_weekday + DAYS_PER_YEAR[leap_year]) % 7 - leap_year = not leap_year and is_leap(year) - - tr1_offset = pt1.trans_offset(leap_year, jan1_weekday) - tr = Transition(jan1_time + tr1_offset - tt0.offset, tt1, tr) - self._transitions.append(tr) - - tr0_offset = pt0.trans_offset(leap_year, jan1_weekday) - tr = Transition(jan1_time + tr0_offset - tt1.offset, tt0, tr) - self._transitions.append(tr) - - def _check_ttype( - self, - ttype, # type: TransitionType - offset, # type: int - is_dst, # type: bool - abbr, # type: str - ): # type: (...) -> bool - return ( - ttype.offset == offset - and ttype.is_dst() == is_dst - and ttype.abbreviation == abbr - ) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/transition.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/transition.py deleted file mode 100644 index 7c6b2f70..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/transition.py +++ /dev/null @@ -1,77 +0,0 @@ -from datetime import timedelta -from typing import Optional - -from .transition_type import TransitionType - - -class Transition: - def __init__( - self, - at, # type: int - ttype, # type: TransitionType - previous, # type: Optional[Transition] - ): - self._at = at - - if previous: - self._local = at + previous.ttype.offset - else: - self._local = at + ttype.offset - - self._ttype = ttype - self._previous = previous - - if self.previous: - self._fix = self._ttype.offset - self.previous.ttype.offset - else: - self._fix = 0 - - self._to = self._local + self._fix - self._to_utc = self._at + self._fix - self._utcoffset = timedelta(seconds=ttype.offset) - - @property - def at(self): # type: () -> int - return self._at - - @property - def local(self): # type: () -> int - return self._local - - @property - def to(self): # type: () -> int - return self._to - - @property - def to_utc(self): # type: () -> int - return self._to - - @property - def ttype(self): # type: () -> TransitionType - return self._ttype - - @property - def previous(self): # type: () -> Optional[Transition] - return self._previous - - @property - def fix(self): # type: () -> int - return self._fix - - def is_ambiguous(self, stamp): # type: (int) -> bool - return self._to <= stamp < self._local - - def is_missing(self, stamp): # type: (int) -> bool - return self._local <= stamp < self._to - - def utcoffset(self): # type: () -> timedelta - return self._utcoffset - - def __contains__(self, stamp): # type: (int) -> bool - if self.previous is None: - return stamp < self.local - - return self.previous.local <= stamp < self.local - - def __repr__(self): # type: () -> str - return "Transition({} -> {}, {})".format(self._local, self._to, self._ttype) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/transition_type.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/transition_type.py deleted file mode 100644 index dd0a6346..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/tz/zoneinfo/transition_type.py +++ /dev/null @@ -1,35 +0,0 @@ -from datetime import timedelta - -from pendulum.utils._compat import PY2 -from pendulum.utils._compat import encode - - -class TransitionType: - def __init__(self, offset, is_dst, abbr): - self._offset = offset - self._is_dst = is_dst - self._abbr = abbr - - self._utcoffset = timedelta(seconds=offset) - - @property - def offset(self): # type: () -> int - return self._offset - - @property - def abbreviation(self): # type: () -> str - if PY2: - return encode(self._abbr) - - return self._abbr - - def is_dst(self): # type: () -> bool - return self._is_dst - - def utcoffset(self): # type: () -> timedelta - return self._utcoffset - - def __repr__(self): # type: () -> str - return "TransitionType({}, {}, {})".format( - self._offset, self._is_dst, self._abbr - ) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/utils/__init__.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/utils/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/utils/__pycache__/__init__.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/utils/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 607ca517..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/utils/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/utils/__pycache__/_compat.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/utils/__pycache__/_compat.cpython-311.pyc deleted file mode 100644 index c305ff5e..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/utils/__pycache__/_compat.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/utils/_compat.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/utils/_compat.py deleted file mode 100644 index 07cead1d..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/pendulum/utils/_compat.py +++ /dev/null @@ -1,54 +0,0 @@ -import sys - - -PY2 = sys.version_info < (3, 0) -PY36 = sys.version_info >= (3, 6) -PYPY = hasattr(sys, "pypy_version_info") - -_HAS_FOLD = PY36 - - -try: # Python 2 - long = long - unicode = unicode - basestring = basestring -except NameError: # Python 3 - long = int - unicode = str - basestring = str - - -def decode(string, encodings=None): - if not PY2 and not isinstance(string, bytes): - return string - - if PY2 and isinstance(string, unicode): - return string - - encodings = encodings or ["utf-8", "latin1", "ascii"] - - for encoding in encodings: - try: - return string.decode(encoding) - except (UnicodeEncodeError, UnicodeDecodeError): - pass - - return string.decode(encodings[0], errors="ignore") - - -def encode(string, encodings=None): - if not PY2 and isinstance(string, bytes): - return string - - if PY2 and isinstance(string, str): - return string - - encodings = encodings or ["utf-8", "latin1", "ascii"] - - for encoding in encodings: - try: - return string.encode(encoding) - except (UnicodeEncodeError, UnicodeDecodeError): - pass - - return string.encode(encodings[0], errors="ignore") diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich-13.3.5.dist-info/INSTALLER b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich-13.3.5.dist-info/INSTALLER deleted file mode 100644 index a1b589e3..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich-13.3.5.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich-13.3.5.dist-info/LICENSE b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich-13.3.5.dist-info/LICENSE deleted file mode 100644 index 44155055..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich-13.3.5.dist-info/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2020 Will McGugan - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich-13.3.5.dist-info/METADATA b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich-13.3.5.dist-info/METADATA deleted file mode 100644 index dec6f533..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich-13.3.5.dist-info/METADATA +++ /dev/null @@ -1,485 +0,0 @@ -Metadata-Version: 2.1 -Name: rich -Version: 13.3.5 -Summary: Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal -Home-page: https://github.com/Textualize/rich -License: MIT -Author: Will McGugan -Author-email: willmcgugan@gmail.com -Requires-Python: >=3.7.0 -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Console -Classifier: Framework :: IPython -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Operating System :: MacOS -Classifier: Operating System :: Microsoft :: Windows -Classifier: Operating System :: POSIX :: Linux -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Typing :: Typed -Provides-Extra: jupyter -Requires-Dist: ipywidgets (>=7.5.1,<9) ; extra == "jupyter" -Requires-Dist: markdown-it-py (>=2.2.0,<3.0.0) -Requires-Dist: pygments (>=2.13.0,<3.0.0) -Requires-Dist: typing-extensions (>=4.0.0,<5.0) ; python_version < "3.9" -Project-URL: Documentation, https://rich.readthedocs.io/en/latest/ -Description-Content-Type: text/markdown - -[![Supported Python Versions](https://img.shields.io/pypi/pyversions/rich/13.2.0)](https://pypi.org/project/rich/) [![PyPI version](https://badge.fury.io/py/rich.svg)](https://badge.fury.io/py/rich) - -[![Downloads](https://pepy.tech/badge/rich/month)](https://pepy.tech/project/rich) -[![codecov](https://img.shields.io/codecov/c/github/Textualize/rich?label=codecov&logo=codecov)](https://codecov.io/gh/Textualize/rich) -[![Rich blog](https://img.shields.io/badge/blog-rich%20news-yellowgreen)](https://www.willmcgugan.com/tag/rich/) -[![Twitter Follow](https://img.shields.io/twitter/follow/willmcgugan.svg?style=social)](https://twitter.com/willmcgugan) - -![Logo](https://github.com/textualize/rich/raw/master/imgs/logo.svg) - -[English readme](https://github.com/textualize/rich/blob/master/README.md) - • [简体中文 readme](https://github.com/textualize/rich/blob/master/README.cn.md) - • [正體中文 readme](https://github.com/textualize/rich/blob/master/README.zh-tw.md) - • [Lengua española readme](https://github.com/textualize/rich/blob/master/README.es.md) - • [Deutsche readme](https://github.com/textualize/rich/blob/master/README.de.md) - • [Läs på svenska](https://github.com/textualize/rich/blob/master/README.sv.md) - • [日本語 readme](https://github.com/textualize/rich/blob/master/README.ja.md) - • [한국어 readme](https://github.com/textualize/rich/blob/master/README.kr.md) - • [Français readme](https://github.com/textualize/rich/blob/master/README.fr.md) - • [Schwizerdütsch readme](https://github.com/textualize/rich/blob/master/README.de-ch.md) - • [हिन्दी readme](https://github.com/textualize/rich/blob/master/README.hi.md) - • [Português brasileiro readme](https://github.com/textualize/rich/blob/master/README.pt-br.md) - • [Italian readme](https://github.com/textualize/rich/blob/master/README.it.md) - • [Русский readme](https://github.com/textualize/rich/blob/master/README.ru.md) - • [Indonesian readme](https://github.com/textualize/rich/blob/master/README.id.md) - • [فارسی readme](https://github.com/textualize/rich/blob/master/README.fa.md) - • [Türkçe readme](https://github.com/textualize/rich/blob/master/README.tr.md) - • [Polskie readme](https://github.com/textualize/rich/blob/master/README.pl.md) - - -Rich is a Python library for _rich_ text and beautiful formatting in the terminal. - -The [Rich API](https://rich.readthedocs.io/en/latest/) makes it easy to add color and style to terminal output. Rich can also render pretty tables, progress bars, markdown, syntax highlighted source code, tracebacks, and more — out of the box. - -![Features](https://github.com/textualize/rich/raw/master/imgs/features.png) - -For a video introduction to Rich see [calmcode.io](https://calmcode.io/rich/introduction.html) by [@fishnets88](https://twitter.com/fishnets88). - -See what [people are saying about Rich](https://www.willmcgugan.com/blog/pages/post/rich-tweets/). - -## Compatibility - -Rich works with Linux, OSX, and Windows. True color / emoji works with new Windows Terminal, classic terminal is limited to 16 colors. Rich requires Python 3.7 or later. - -Rich works with [Jupyter notebooks](https://jupyter.org/) with no additional configuration required. - -## Installing - -Install with `pip` or your favorite PyPI package manager. - -```sh -python -m pip install rich -``` - -Run the following to test Rich output on your terminal: - -```sh -python -m rich -``` - -## Rich Print - -To effortlessly add rich output to your application, you can import the [rich print](https://rich.readthedocs.io/en/latest/introduction.html#quick-start) method, which has the same signature as the builtin Python function. Try this: - -```python -from rich import print - -print("Hello, [bold magenta]World[/bold magenta]!", ":vampire:", locals()) -``` - -![Hello World](https://github.com/textualize/rich/raw/master/imgs/print.png) - -## Rich REPL - -Rich can be installed in the Python REPL, so that any data structures will be pretty printed and highlighted. - -```python ->>> from rich import pretty ->>> pretty.install() -``` - -![REPL](https://github.com/textualize/rich/raw/master/imgs/repl.png) - -## Using the Console - -For more control over rich terminal content, import and construct a [Console](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console) object. - -```python -from rich.console import Console - -console = Console() -``` - -The Console object has a `print` method which has an intentionally similar interface to the builtin `print` function. Here's an example of use: - -```python -console.print("Hello", "World!") -``` - -As you might expect, this will print `"Hello World!"` to the terminal. Note that unlike the builtin `print` function, Rich will word-wrap your text to fit within the terminal width. - -There are a few ways of adding color and style to your output. You can set a style for the entire output by adding a `style` keyword argument. Here's an example: - -```python -console.print("Hello", "World!", style="bold red") -``` - -The output will be something like the following: - -![Hello World](https://github.com/textualize/rich/raw/master/imgs/hello_world.png) - -That's fine for styling a line of text at a time. For more finely grained styling, Rich renders a special markup which is similar in syntax to [bbcode](https://en.wikipedia.org/wiki/BBCode). Here's an example: - -```python -console.print("Where there is a [bold cyan]Will[/bold cyan] there [u]is[/u] a [i]way[/i].") -``` - -![Console Markup](https://github.com/textualize/rich/raw/master/imgs/where_there_is_a_will.png) - -You can use a Console object to generate sophisticated output with minimal effort. See the [Console API](https://rich.readthedocs.io/en/latest/console.html) docs for details. - -## Rich Inspect - -Rich has an [inspect](https://rich.readthedocs.io/en/latest/reference/init.html?highlight=inspect#rich.inspect) function which can produce a report on any Python object, such as class, instance, or builtin. - -```python ->>> my_list = ["foo", "bar"] ->>> from rich import inspect ->>> inspect(my_list, methods=True) -``` - -![Log](https://github.com/textualize/rich/raw/master/imgs/inspect.png) - -See the [inspect docs](https://rich.readthedocs.io/en/latest/reference/init.html#rich.inspect) for details. - -# Rich Library - -Rich contains a number of builtin _renderables_ you can use to create elegant output in your CLI and help you debug your code. - -Click the following headings for details: - -<details> -<summary>Log</summary> - -The Console object has a `log()` method which has a similar interface to `print()`, but also renders a column for the current time and the file and line which made the call. By default Rich will do syntax highlighting for Python structures and for repr strings. If you log a collection (i.e. a dict or a list) Rich will pretty print it so that it fits in the available space. Here's an example of some of these features. - -```python -from rich.console import Console -console = Console() - -test_data = [ - {"jsonrpc": "2.0", "method": "sum", "params": [None, 1, 2, 4, False, True], "id": "1",}, - {"jsonrpc": "2.0", "method": "notify_hello", "params": [7]}, - {"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": "2"}, -] - -def test_log(): - enabled = False - context = { - "foo": "bar", - } - movies = ["Deadpool", "Rise of the Skywalker"] - console.log("Hello from", console, "!") - console.log(test_data, log_locals=True) - - -test_log() -``` - -The above produces the following output: - -![Log](https://github.com/textualize/rich/raw/master/imgs/log.png) - -Note the `log_locals` argument, which outputs a table containing the local variables where the log method was called. - -The log method could be used for logging to the terminal for long running applications such as servers, but is also a very nice debugging aid. - -</details> -<details> -<summary>Logging Handler</summary> - -You can also use the builtin [Handler class](https://rich.readthedocs.io/en/latest/logging.html) to format and colorize output from Python's logging module. Here's an example of the output: - -![Logging](https://github.com/textualize/rich/raw/master/imgs/logging.png) - -</details> - -<details> -<summary>Emoji</summary> - -To insert an emoji in to console output place the name between two colons. Here's an example: - -```python ->>> console.print(":smiley: :vampire: :pile_of_poo: :thumbs_up: :raccoon:") -😃 🧛 💩 👍 🦝 -``` - -Please use this feature wisely. - -</details> - -<details> -<summary>Tables</summary> - -Rich can render flexible [tables](https://rich.readthedocs.io/en/latest/tables.html) with unicode box characters. There is a large variety of formatting options for borders, styles, cell alignment etc. - -![table movie](https://github.com/textualize/rich/raw/master/imgs/table_movie.gif) - -The animation above was generated with [table_movie.py](https://github.com/textualize/rich/blob/master/examples/table_movie.py) in the examples directory. - -Here's a simpler table example: - -```python -from rich.console import Console -from rich.table import Table - -console = Console() - -table = Table(show_header=True, header_style="bold magenta") -table.add_column("Date", style="dim", width=12) -table.add_column("Title") -table.add_column("Production Budget", justify="right") -table.add_column("Box Office", justify="right") -table.add_row( - "Dec 20, 2019", "Star Wars: The Rise of Skywalker", "$275,000,000", "$375,126,118" -) -table.add_row( - "May 25, 2018", - "[red]Solo[/red]: A Star Wars Story", - "$275,000,000", - "$393,151,347", -) -table.add_row( - "Dec 15, 2017", - "Star Wars Ep. VIII: The Last Jedi", - "$262,000,000", - "[bold]$1,332,539,889[/bold]", -) - -console.print(table) -``` - -This produces the following output: - -![table](https://github.com/textualize/rich/raw/master/imgs/table.png) - -Note that console markup is rendered in the same way as `print()` and `log()`. In fact, anything that is renderable by Rich may be included in the headers / rows (even other tables). - -The `Table` class is smart enough to resize columns to fit the available width of the terminal, wrapping text as required. Here's the same example, with the terminal made smaller than the table above: - -![table2](https://github.com/textualize/rich/raw/master/imgs/table2.png) - -</details> - -<details> -<summary>Progress Bars</summary> - -Rich can render multiple flicker-free [progress](https://rich.readthedocs.io/en/latest/progress.html) bars to track long-running tasks. - -For basic usage, wrap any sequence in the `track` function and iterate over the result. Here's an example: - -```python -from rich.progress import track - -for step in track(range(100)): - do_step(step) -``` - -It's not much harder to add multiple progress bars. Here's an example taken from the docs: - -![progress](https://github.com/textualize/rich/raw/master/imgs/progress.gif) - -The columns may be configured to show any details you want. Built-in columns include percentage complete, file size, file speed, and time remaining. Here's another example showing a download in progress: - -![progress](https://github.com/textualize/rich/raw/master/imgs/downloader.gif) - -To try this out yourself, see [examples/downloader.py](https://github.com/textualize/rich/blob/master/examples/downloader.py) which can download multiple URLs simultaneously while displaying progress. - -</details> - -<details> -<summary>Status</summary> - -For situations where it is hard to calculate progress, you can use the [status](https://rich.readthedocs.io/en/latest/reference/console.html#rich.console.Console.status) method which will display a 'spinner' animation and message. The animation won't prevent you from using the console as normal. Here's an example: - -```python -from time import sleep -from rich.console import Console - -console = Console() -tasks = [f"task {n}" for n in range(1, 11)] - -with console.status("[bold green]Working on tasks...") as status: - while tasks: - task = tasks.pop(0) - sleep(1) - console.log(f"{task} complete") -``` - -This generates the following output in the terminal. - -![status](https://github.com/textualize/rich/raw/master/imgs/status.gif) - -The spinner animations were borrowed from [cli-spinners](https://www.npmjs.com/package/cli-spinners). You can select a spinner by specifying the `spinner` parameter. Run the following command to see the available values: - -``` -python -m rich.spinner -``` - -The above command generates the following output in the terminal: - -![spinners](https://github.com/textualize/rich/raw/master/imgs/spinners.gif) - -</details> - -<details> -<summary>Tree</summary> - -Rich can render a [tree](https://rich.readthedocs.io/en/latest/tree.html) with guide lines. A tree is ideal for displaying a file structure, or any other hierarchical data. - -The labels of the tree can be simple text or anything else Rich can render. Run the following for a demonstration: - -``` -python -m rich.tree -``` - -This generates the following output: - -![markdown](https://github.com/textualize/rich/raw/master/imgs/tree.png) - -See the [tree.py](https://github.com/textualize/rich/blob/master/examples/tree.py) example for a script that displays a tree view of any directory, similar to the linux `tree` command. - -</details> - -<details> -<summary>Columns</summary> - -Rich can render content in neat [columns](https://rich.readthedocs.io/en/latest/columns.html) with equal or optimal width. Here's a very basic clone of the (MacOS / Linux) `ls` command which displays a directory listing in columns: - -```python -import os -import sys - -from rich import print -from rich.columns import Columns - -directory = os.listdir(sys.argv[1]) -print(Columns(directory)) -``` - -The following screenshot is the output from the [columns example](https://github.com/textualize/rich/blob/master/examples/columns.py) which displays data pulled from an API in columns: - -![columns](https://github.com/textualize/rich/raw/master/imgs/columns.png) - -</details> - -<details> -<summary>Markdown</summary> - -Rich can render [markdown](https://rich.readthedocs.io/en/latest/markdown.html) and does a reasonable job of translating the formatting to the terminal. - -To render markdown import the `Markdown` class and construct it with a string containing markdown code. Then print it to the console. Here's an example: - -```python -from rich.console import Console -from rich.markdown import Markdown - -console = Console() -with open("README.md") as readme: - markdown = Markdown(readme.read()) -console.print(markdown) -``` - -This will produce output something like the following: - -![markdown](https://github.com/textualize/rich/raw/master/imgs/markdown.png) - -</details> - -<details> -<summary>Syntax Highlighting</summary> - -Rich uses the [pygments](https://pygments.org/) library to implement [syntax highlighting](https://rich.readthedocs.io/en/latest/syntax.html). Usage is similar to rendering markdown; construct a `Syntax` object and print it to the console. Here's an example: - -```python -from rich.console import Console -from rich.syntax import Syntax - -my_code = ''' -def iter_first_last(values: Iterable[T]) -> Iterable[Tuple[bool, bool, T]]: - """Iterate and generate a tuple with a flag for first and last value.""" - iter_values = iter(values) - try: - previous_value = next(iter_values) - except StopIteration: - return - first = True - for value in iter_values: - yield first, False, previous_value - first = False - previous_value = value - yield first, True, previous_value -''' -syntax = Syntax(my_code, "python", theme="monokai", line_numbers=True) -console = Console() -console.print(syntax) -``` - -This will produce the following output: - -![syntax](https://github.com/textualize/rich/raw/master/imgs/syntax.png) - -</details> - -<details> -<summary>Tracebacks</summary> - -Rich can render [beautiful tracebacks](https://rich.readthedocs.io/en/latest/traceback.html) which are easier to read and show more code than standard Python tracebacks. You can set Rich as the default traceback handler so all uncaught exceptions will be rendered by Rich. - -Here's what it looks like on OSX (similar on Linux): - -![traceback](https://github.com/textualize/rich/raw/master/imgs/traceback.png) - -</details> - -All Rich renderables make use of the [Console Protocol](https://rich.readthedocs.io/en/latest/protocol.html), which you can also use to implement your own Rich content. - -# Rich CLI - - -See also [Rich CLI](https://github.com/textualize/rich-cli) for a command line application powered by Rich. Syntax highlight code, render markdown, display CSVs in tables, and more, directly from the command prompt. - - -![Rich CLI](https://raw.githubusercontent.com/Textualize/rich-cli/main/imgs/rich-cli-splash.jpg) - -# Textual - -See also Rich's sister project, [Textual](https://github.com/Textualize/textual), which you can use to build sophisticated User Interfaces in the terminal. - -![Textual screenshot](https://raw.githubusercontent.com/Textualize/textual/main/imgs/textual.png) - -# Projects using Rich - -For some examples of projects using Rich, see the [Rich Gallery](https://www.textualize.io/rich/gallery) on [Textualize.io](https://www.textualize.io). - -Would you like to add your own project to the gallery? You can! Follow [these instructions](https://www.textualize.io/gallery-instructions). - -<!-- This is a test, no need to translate --> - diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich-13.3.5.dist-info/RECORD b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich-13.3.5.dist-info/RECORD deleted file mode 100644 index 460e4120..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich-13.3.5.dist-info/RECORD +++ /dev/null @@ -1,163 +0,0 @@ -rich-13.3.5.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -rich-13.3.5.dist-info/LICENSE,sha256=3u18F6QxgVgZCj6iOcyHmlpQJxzruYrnAl9I--WNyhU,1056 -rich-13.3.5.dist-info/METADATA,sha256=6qHfpskUHHab9cAipzzM6e80HOnT8NN-qT9IXellKrY,18844 -rich-13.3.5.dist-info/RECORD,, -rich-13.3.5.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -rich-13.3.5.dist-info/WHEEL,sha256=kLuE8m1WYU0Ig0_YEGrXyTtiJvKPpLpDEiChiNyei5Y,88 -rich/__init__.py,sha256=lh2WcoIOJp5M5_lbAsSUMGv8oiJeumROazHH_AYMS8I,6066 -rich/__main__.py,sha256=lZC5Vx0dR7JE5BUKCxjt5PNYuhxX9auoLio7f4BDkKo,8334 -rich/__pycache__/__init__.cpython-311.pyc,, -rich/__pycache__/__main__.cpython-311.pyc,, -rich/__pycache__/_cell_widths.cpython-311.pyc,, -rich/__pycache__/_emoji_codes.cpython-311.pyc,, -rich/__pycache__/_emoji_replace.cpython-311.pyc,, -rich/__pycache__/_export_format.cpython-311.pyc,, -rich/__pycache__/_extension.cpython-311.pyc,, -rich/__pycache__/_fileno.cpython-311.pyc,, -rich/__pycache__/_inspect.cpython-311.pyc,, -rich/__pycache__/_log_render.cpython-311.pyc,, -rich/__pycache__/_loop.cpython-311.pyc,, -rich/__pycache__/_null_file.cpython-311.pyc,, -rich/__pycache__/_palettes.cpython-311.pyc,, -rich/__pycache__/_pick.cpython-311.pyc,, -rich/__pycache__/_ratio.cpython-311.pyc,, -rich/__pycache__/_spinners.cpython-311.pyc,, -rich/__pycache__/_stack.cpython-311.pyc,, -rich/__pycache__/_timer.cpython-311.pyc,, -rich/__pycache__/_win32_console.cpython-311.pyc,, -rich/__pycache__/_windows.cpython-311.pyc,, -rich/__pycache__/_windows_renderer.cpython-311.pyc,, -rich/__pycache__/_wrap.cpython-311.pyc,, -rich/__pycache__/abc.cpython-311.pyc,, -rich/__pycache__/align.cpython-311.pyc,, -rich/__pycache__/ansi.cpython-311.pyc,, -rich/__pycache__/bar.cpython-311.pyc,, -rich/__pycache__/box.cpython-311.pyc,, -rich/__pycache__/cells.cpython-311.pyc,, -rich/__pycache__/color.cpython-311.pyc,, -rich/__pycache__/color_triplet.cpython-311.pyc,, -rich/__pycache__/columns.cpython-311.pyc,, -rich/__pycache__/console.cpython-311.pyc,, -rich/__pycache__/constrain.cpython-311.pyc,, -rich/__pycache__/containers.cpython-311.pyc,, -rich/__pycache__/control.cpython-311.pyc,, -rich/__pycache__/default_styles.cpython-311.pyc,, -rich/__pycache__/diagnose.cpython-311.pyc,, -rich/__pycache__/emoji.cpython-311.pyc,, -rich/__pycache__/errors.cpython-311.pyc,, -rich/__pycache__/file_proxy.cpython-311.pyc,, -rich/__pycache__/filesize.cpython-311.pyc,, -rich/__pycache__/highlighter.cpython-311.pyc,, -rich/__pycache__/json.cpython-311.pyc,, -rich/__pycache__/jupyter.cpython-311.pyc,, -rich/__pycache__/layout.cpython-311.pyc,, -rich/__pycache__/live.cpython-311.pyc,, -rich/__pycache__/live_render.cpython-311.pyc,, -rich/__pycache__/logging.cpython-311.pyc,, -rich/__pycache__/markdown.cpython-311.pyc,, -rich/__pycache__/markup.cpython-311.pyc,, -rich/__pycache__/measure.cpython-311.pyc,, -rich/__pycache__/padding.cpython-311.pyc,, -rich/__pycache__/pager.cpython-311.pyc,, -rich/__pycache__/palette.cpython-311.pyc,, -rich/__pycache__/panel.cpython-311.pyc,, -rich/__pycache__/pretty.cpython-311.pyc,, -rich/__pycache__/progress.cpython-311.pyc,, -rich/__pycache__/progress_bar.cpython-311.pyc,, -rich/__pycache__/prompt.cpython-311.pyc,, -rich/__pycache__/protocol.cpython-311.pyc,, -rich/__pycache__/region.cpython-311.pyc,, -rich/__pycache__/repr.cpython-311.pyc,, -rich/__pycache__/rule.cpython-311.pyc,, -rich/__pycache__/scope.cpython-311.pyc,, -rich/__pycache__/screen.cpython-311.pyc,, -rich/__pycache__/segment.cpython-311.pyc,, -rich/__pycache__/spinner.cpython-311.pyc,, -rich/__pycache__/status.cpython-311.pyc,, -rich/__pycache__/style.cpython-311.pyc,, -rich/__pycache__/styled.cpython-311.pyc,, -rich/__pycache__/syntax.cpython-311.pyc,, -rich/__pycache__/table.cpython-311.pyc,, -rich/__pycache__/terminal_theme.cpython-311.pyc,, -rich/__pycache__/text.cpython-311.pyc,, -rich/__pycache__/theme.cpython-311.pyc,, -rich/__pycache__/themes.cpython-311.pyc,, -rich/__pycache__/traceback.cpython-311.pyc,, -rich/__pycache__/tree.cpython-311.pyc,, -rich/_cell_widths.py,sha256=2n4EiJi3X9sqIq0O16kUZ_zy6UYMd3xFfChlKfnW1Hc,10096 -rich/_emoji_codes.py,sha256=hu1VL9nbVdppJrVoijVshRlcRRe_v3dju3Mmd2sKZdY,140235 -rich/_emoji_replace.py,sha256=n-kcetsEUx2ZUmhQrfeMNc-teeGhpuSQ5F8VPBsyvDo,1064 -rich/_export_format.py,sha256=qxgV3nKnXQu1hfbnRVswPYy-AwIg1X0LSC47cK5s8jk,2100 -rich/_extension.py,sha256=G66PkbH_QdTJh6jD-J228O76CmAnr2hLQv72CgPPuzE,241 -rich/_fileno.py,sha256=HWZxP5C2ajMbHryvAQZseflVfQoGzsKOHzKGsLD8ynQ,799 -rich/_inspect.py,sha256=oZJGw31e64dwXSCmrDnvZbwVb1ZKhWfU8wI3VWohjJk,9695 -rich/_log_render.py,sha256=xBKCxqiO4FZk8eG56f8crFdrmJxFrJsQE3V3F-fFekc,3213 -rich/_loop.py,sha256=hV_6CLdoPm0va22Wpw4zKqM0RYsz3TZxXj0PoS-9eDQ,1236 -rich/_null_file.py,sha256=tGSXk_v-IZmbj1GAzHit8A3kYIQMiCpVsCFfsC-_KJ4,1387 -rich/_palettes.py,sha256=cdev1JQKZ0JvlguV9ipHgznTdnvlIzUFDBb0It2PzjI,7063 -rich/_pick.py,sha256=evDt8QN4lF5CiwrUIXlOJCntitBCOsI3ZLPEIAVRLJU,423 -rich/_ratio.py,sha256=6dBHxiw_SYNRRdcZ9gDKI5GnAeHZ8WvmTgctNpcutmU,5460 -rich/_spinners.py,sha256=U2r1_g_1zSjsjiUdAESc2iAMc3i4ri_S8PYP6kQ5z1I,19919 -rich/_stack.py,sha256=-C8OK7rxn3sIUdVwxZBBpeHhIzX0eI-VM3MemYfaXm0,351 -rich/_timer.py,sha256=zelxbT6oPFZnNrwWPpc1ktUeAT-Vc4fuFcRZLQGLtMI,417 -rich/_win32_console.py,sha256=-NtealsQXQ558e-zpJtkwh8x_dqC-SjlAGA872dGE6U,22784 -rich/_windows.py,sha256=J_rhaH7HM3f5XvH5bsArGKqoTojaV8HetNLUJ1SX9I4,1902 -rich/_windows_renderer.py,sha256=d799xOnxLbCCCzGu9-U7YLmIQkxtxQIBFQQ6iu4veSc,2759 -rich/_wrap.py,sha256=xfV_9t0Sg6rzimmrDru8fCVmUlalYAcHLDfrJZnbbwQ,1840 -rich/abc.py,sha256=dALMOGfKVNeAbvqq66IpTQxQUerxD7AE4FKwqd0eQKk,878 -rich/align.py,sha256=5z5HvU37JoRo579Z2Stdj3Eaws1cQYombqQB-tT3VjY,10320 -rich/ansi.py,sha256=iD6532QYqnBm6hADulKjrV8l8kFJ-9fEVooHJHH3hMg,6906 -rich/bar.py,sha256=a7UD303BccRCrEhGjfMElpv5RFYIinaAhAuqYqhUvmw,3264 -rich/box.py,sha256=sFicvRIhWRGdRM5a36XffDiZuksS9IV87wd_FObXWQ0,9794 -rich/cells.py,sha256=627ztJs9zOL-38HJ7kXBerR-gT8KBfYC8UzEwMJDYYo,4509 -rich/color.py,sha256=9Gh958U3f75WVdLTeC0U9nkGTn2n0wnojKpJ6jQEkIE,18224 -rich/color_triplet.py,sha256=3lhQkdJbvWPoLDO-AnYImAWmJvV5dlgYNCVZ97ORaN4,1054 -rich/columns.py,sha256=HUX0KcMm9dsKNi11fTbiM_h2iDtl8ySCaVcxlalEzq8,7131 -rich/console.py,sha256=OmEKIPk1rr_qHY2OVuicPuc4kvfF5Zk9jNOhJO9wdsM,99146 -rich/constrain.py,sha256=1VIPuC8AgtKWrcncQrjBdYqA3JVWysu6jZo1rrh7c7Q,1288 -rich/containers.py,sha256=aKgm5UDHn5Nmui6IJaKdsZhbHClh_X7D-_Wg8Ehrr7s,5497 -rich/control.py,sha256=Ix-rO8ZhSB2q1Biazr4l72ZyAw27H9or7ElipWVVo0M,6606 -rich/default_styles.py,sha256=iBE04bD6RJCVhlpUkeCnEnulmydZzKqVAxHM-GpoXBI,8046 -rich/diagnose.py,sha256=ZopD2EpWVtmmKptgbXT-sOMkAJ7DGrMSUXUiaU2GZ78,924 -rich/emoji.py,sha256=1jTRHFwvQxY1ciul22MdEZcWc7brfjKT8FG6ZjXj5dM,2465 -rich/errors.py,sha256=5pP3Kc5d4QJ_c0KFsxrfyhjiPVe7J1zOqSFbFAzcV-Y,642 -rich/file_proxy.py,sha256=Tl9THMDZ-Pk5Wm8sI1gGg_U5DhusmxD-FZ0fUbcU0W0,1683 -rich/filesize.py,sha256=9fTLAPCAwHmBXdRv7KZU194jSgNrRb6Wx7RIoBgqeKY,2508 -rich/highlighter.py,sha256=p3C1g4QYzezFKdR7NF9EhPbzQDvdPUhGRgSyGGEmPko,9584 -rich/json.py,sha256=tcQZWyUNFujxYoN0iAqjb_wtIF-eUhduaXOhQr-CaJw,5020 -rich/jupyter.py,sha256=G9pOJmR4ESIFYSd4MKGqmHqCtstx0oRWpyeTgv54-Xc,3228 -rich/layout.py,sha256=-abS8rvjqleuhv2YEwwnot4Vf7yDXs0bjU54rotEhkI,13947 -rich/live.py,sha256=vZzYvu7fqwlv3Gthl2xiw1Dc_O80VlGcCV0DOHwCyDM,14273 -rich/live_render.py,sha256=vSf7su_wrXzZYGMxAhCAPoGJgCTjmlxcU9G4vSijucU,3655 -rich/logging.py,sha256=XEKUteCZhN7j0pmIngTOCBSY2GvuT4_4-F20-ibPrEk,11891 -rich/markdown.py,sha256=VuYSxN0MM_rI7wvRXPWEyhjCbJCwkWsrq_8c5m1h_HM,22368 -rich/markup.py,sha256=yv9Y9nX-Ykwf03Mdpf1JTSE4XwkJZQvLMSjAchvGd04,8174 -rich/measure.py,sha256=HmrIJX8sWRTHbgh8MxEay_83VkqNW_70s8aKP5ZcYI8,5305 -rich/padding.py,sha256=8I1dQNQQK1iCjHtGBDEn78kRp3p27GYzl5UR3qB7e2E,4958 -rich/pager.py,sha256=SO_ETBFKbg3n_AgOzXm41Sv36YxXAyI3_R-KOY2_uSc,828 -rich/palette.py,sha256=Ar6ZUrYHiFt6-Rr2k-k9F8V7hxgJYHNdqjk2vVXsLgc,3288 -rich/panel.py,sha256=wGMe40J8KCGgQoM0LyjRErmGIkv2bsYA71RCXThD0xE,10574 -rich/pretty.py,sha256=1erG6VG0F4e-f9AjUhvBuuxKxIFEKh6Mo_j1yf_dXzE,35816 -rich/progress.py,sha256=_A3jQV0n3LT38QbxDtO4aNsOfuakEhiQoyYu3vKTafg,59694 -rich/progress_bar.py,sha256=cEoBfkc3lLwqba4XKsUpy4vSQKDh2QQ5J2J94-ACFoo,8165 -rich/prompt.py,sha256=U97UBjCXBZ7TmIRpK-JxkIk9irvJiIu_HB2pZ2UaQ9w,11291 -rich/protocol.py,sha256=Wt-2HZd67OYiopUkCTOz7lM38vyo5r3HEQZ9TOPDl5Q,1367 -rich/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -rich/region.py,sha256=rNT9xZrVZTYIXZC0NYn41CJQwYNbR-KecPOxTgQvB8Y,166 -rich/repr.py,sha256=dgk6IMKYksaDzoJ2a6yxtdaZeAwn5eZlG4FSBU8be3s,4419 -rich/rule.py,sha256=umO21Wjw0FcYAeTB3UumNLCsDWhejzxnjlf2VwiXiDI,4590 -rich/scope.py,sha256=lf6Qet_e4JOY34lwhYSAG-NBXYKBcYu6t_igv_JoGog,2831 -rich/screen.py,sha256=rL_j2wX-4SeuIOI2oOlc418QP9EAvD59GInUmEAE6jQ,1579 -rich/segment.py,sha256=f7U3pVcc7TpXsw0LmH6tcBbhVIBRmNRcDbQvlX0zGQA,24211 -rich/spinner.py,sha256=15koCmF0DQeD8-k28Lpt6X_zJQUlzEhgo_6A6uy47lc,4339 -rich/status.py,sha256=gJsIXIZeSo3urOyxRUjs6VrhX5CZrA0NxIQ-dxhCnwo,4425 -rich/style.py,sha256=3hiocH_4N8vwRm3-8yFWzM7tSwjjEven69XqWasSQwM,27073 -rich/styled.py,sha256=wljVsVTXbABMMZvkzkO43ZEk_-irzEtvUiQ-sNnikQ8,1234 -rich/syntax.py,sha256=mji-bjfp-KfK93yhvG8V77a1M9a872_vdQ8feiyWfOU,35065 -rich/table.py,sha256=TuxulUIAwbwlvSPAb1JYZtuMjLkrdSlsNTgvzqtqdsw,39648 -rich/terminal_theme.py,sha256=1j5-ufJfnvlAo5Qsi_ACZiXDmwMXzqgmFByObT9-yJY,3370 -rich/text.py,sha256=qyNkpMgmH3Pvn8pjNrYMoV8MLRbji1x-EOP2o6dEM60,45513 -rich/theme.py,sha256=belFJogzA0W0HysQabKaHOc3RWH2ko3fQAJhoN-AFdo,3777 -rich/themes.py,sha256=0xgTLozfabebYtcJtDdC5QkX5IVUEaviqDUJJh4YVFk,102 -rich/traceback.py,sha256=tBJP4sopI4brQtlMrS-UzZxYCzoUeClLfLJvfs4N1FI,29532 -rich/tree.py,sha256=As3BkiX7Vx4FQkTOFntrf6lMJATZXK0C-c7RuxL6LyE,9109 diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich-13.3.5.dist-info/REQUESTED b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich-13.3.5.dist-info/REQUESTED deleted file mode 100644 index e69de29b..00000000 diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich-13.3.5.dist-info/WHEEL b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich-13.3.5.dist-info/WHEEL deleted file mode 100644 index 9f287336..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich-13.3.5.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: poetry-core 1.5.1 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__init__.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__init__.py deleted file mode 100644 index b631d544..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__init__.py +++ /dev/null @@ -1,177 +0,0 @@ -"""Rich text and beautiful formatting in the terminal.""" - -import os -from typing import IO, TYPE_CHECKING, Any, Callable, Optional, Union - -from ._extension import load_ipython_extension # noqa: F401 - -__all__ = ["get_console", "reconfigure", "print", "inspect", "print_json"] - -if TYPE_CHECKING: - from .console import Console - -# Global console used by alternative print -_console: Optional["Console"] = None - -try: - _IMPORT_CWD = os.path.abspath(os.getcwd()) -except FileNotFoundError: - # Can happen if the cwd has been deleted - _IMPORT_CWD = "" - - -def get_console() -> "Console": - """Get a global :class:`~rich.console.Console` instance. This function is used when Rich requires a Console, - and hasn't been explicitly given one. - - Returns: - Console: A console instance. - """ - global _console - if _console is None: - from .console import Console - - _console = Console() - - return _console - - -def reconfigure(*args: Any, **kwargs: Any) -> None: - """Reconfigures the global console by replacing it with another. - - Args: - *args (Any): Positional arguments for the replacement :class:`~rich.console.Console`. - **kwargs (Any): Keyword arguments for the replacement :class:`~rich.console.Console`. - """ - from rich.console import Console - - new_console = Console(*args, **kwargs) - _console = get_console() - _console.__dict__ = new_console.__dict__ - - -def print( - *objects: Any, - sep: str = " ", - end: str = "\n", - file: Optional[IO[str]] = None, - flush: bool = False, -) -> None: - r"""Print object(s) supplied via positional arguments. - This function has an identical signature to the built-in print. - For more advanced features, see the :class:`~rich.console.Console` class. - - Args: - sep (str, optional): Separator between printed objects. Defaults to " ". - end (str, optional): Character to write at end of output. Defaults to "\\n". - file (IO[str], optional): File to write to, or None for stdout. Defaults to None. - flush (bool, optional): Has no effect as Rich always flushes output. Defaults to False. - - """ - from .console import Console - - write_console = get_console() if file is None else Console(file=file) - return write_console.print(*objects, sep=sep, end=end) - - -def print_json( - json: Optional[str] = None, - *, - data: Any = None, - indent: Union[None, int, str] = 2, - highlight: bool = True, - skip_keys: bool = False, - ensure_ascii: bool = False, - check_circular: bool = True, - allow_nan: bool = True, - default: Optional[Callable[[Any], Any]] = None, - sort_keys: bool = False, -) -> None: - """Pretty prints JSON. Output will be valid JSON. - - Args: - json (str): A string containing JSON. - data (Any): If json is not supplied, then encode this data. - indent (int, optional): Number of spaces to indent. Defaults to 2. - highlight (bool, optional): Enable highlighting of output: Defaults to True. - skip_keys (bool, optional): Skip keys not of a basic type. Defaults to False. - ensure_ascii (bool, optional): Escape all non-ascii characters. Defaults to False. - check_circular (bool, optional): Check for circular references. Defaults to True. - allow_nan (bool, optional): Allow NaN and Infinity values. Defaults to True. - default (Callable, optional): A callable that converts values that can not be encoded - in to something that can be JSON encoded. Defaults to None. - sort_keys (bool, optional): Sort dictionary keys. Defaults to False. - """ - - get_console().print_json( - json, - data=data, - indent=indent, - highlight=highlight, - skip_keys=skip_keys, - ensure_ascii=ensure_ascii, - check_circular=check_circular, - allow_nan=allow_nan, - default=default, - sort_keys=sort_keys, - ) - - -def inspect( - obj: Any, - *, - console: Optional["Console"] = None, - title: Optional[str] = None, - help: bool = False, - methods: bool = False, - docs: bool = True, - private: bool = False, - dunder: bool = False, - sort: bool = True, - all: bool = False, - value: bool = True, -) -> None: - """Inspect any Python object. - - * inspect(<OBJECT>) to see summarized info. - * inspect(<OBJECT>, methods=True) to see methods. - * inspect(<OBJECT>, help=True) to see full (non-abbreviated) help. - * inspect(<OBJECT>, private=True) to see private attributes (single underscore). - * inspect(<OBJECT>, dunder=True) to see attributes beginning with double underscore. - * inspect(<OBJECT>, all=True) to see all attributes. - - Args: - obj (Any): An object to inspect. - title (str, optional): Title to display over inspect result, or None use type. Defaults to None. - help (bool, optional): Show full help text rather than just first paragraph. Defaults to False. - methods (bool, optional): Enable inspection of callables. Defaults to False. - docs (bool, optional): Also render doc strings. Defaults to True. - private (bool, optional): Show private attributes (beginning with underscore). Defaults to False. - dunder (bool, optional): Show attributes starting with double underscore. Defaults to False. - sort (bool, optional): Sort attributes alphabetically. Defaults to True. - all (bool, optional): Show all attributes. Defaults to False. - value (bool, optional): Pretty print value. Defaults to True. - """ - _console = console or get_console() - from rich._inspect import Inspect - - # Special case for inspect(inspect) - is_inspect = obj is inspect - - _inspect = Inspect( - obj, - title=title, - help=is_inspect or help, - methods=is_inspect or methods, - docs=is_inspect or docs, - private=private, - dunder=dunder, - sort=sort, - all=all, - value=value, - ) - _console.print(_inspect) - - -if __name__ == "__main__": # pragma: no cover - print("Hello, **World**") diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__main__.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__main__.py deleted file mode 100644 index bc55aede..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__main__.py +++ /dev/null @@ -1,274 +0,0 @@ -import colorsys -import io -from time import process_time - -from rich import box -from rich.color import Color -from rich.console import Console, ConsoleOptions, Group, RenderableType, RenderResult -from rich.markdown import Markdown -from rich.measure import Measurement -from rich.pretty import Pretty -from rich.segment import Segment -from rich.style import Style -from rich.syntax import Syntax -from rich.table import Table -from rich.text import Text - - -class ColorBox: - def __rich_console__( - self, console: Console, options: ConsoleOptions - ) -> RenderResult: - for y in range(0, 5): - for x in range(options.max_width): - h = x / options.max_width - l = 0.1 + ((y / 5) * 0.7) - r1, g1, b1 = colorsys.hls_to_rgb(h, l, 1.0) - r2, g2, b2 = colorsys.hls_to_rgb(h, l + 0.7 / 10, 1.0) - bgcolor = Color.from_rgb(r1 * 255, g1 * 255, b1 * 255) - color = Color.from_rgb(r2 * 255, g2 * 255, b2 * 255) - yield Segment("▄", Style(color=color, bgcolor=bgcolor)) - yield Segment.line() - - def __rich_measure__( - self, console: "Console", options: ConsoleOptions - ) -> Measurement: - return Measurement(1, options.max_width) - - -def make_test_card() -> Table: - """Get a renderable that demonstrates a number of features.""" - table = Table.grid(padding=1, pad_edge=True) - table.title = "Rich features" - table.add_column("Feature", no_wrap=True, justify="center", style="bold red") - table.add_column("Demonstration") - - color_table = Table( - box=None, - expand=False, - show_header=False, - show_edge=False, - pad_edge=False, - ) - color_table.add_row( - ( - "✓ [bold green]4-bit color[/]\n" - "✓ [bold blue]8-bit color[/]\n" - "✓ [bold magenta]Truecolor (16.7 million)[/]\n" - "✓ [bold yellow]Dumb terminals[/]\n" - "✓ [bold cyan]Automatic color conversion" - ), - ColorBox(), - ) - - table.add_row("Colors", color_table) - - table.add_row( - "Styles", - "All ansi styles: [bold]bold[/], [dim]dim[/], [italic]italic[/italic], [underline]underline[/], [strike]strikethrough[/], [reverse]reverse[/], and even [blink]blink[/].", - ) - - lorem = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque in metus sed sapien ultricies pretium a at justo. Maecenas luctus velit et auctor maximus." - lorem_table = Table.grid(padding=1, collapse_padding=True) - lorem_table.pad_edge = False - lorem_table.add_row( - Text(lorem, justify="left", style="green"), - Text(lorem, justify="center", style="yellow"), - Text(lorem, justify="right", style="blue"), - Text(lorem, justify="full", style="red"), - ) - table.add_row( - "Text", - Group( - Text.from_markup( - """Word wrap text. Justify [green]left[/], [yellow]center[/], [blue]right[/] or [red]full[/].\n""" - ), - lorem_table, - ), - ) - - def comparison(renderable1: RenderableType, renderable2: RenderableType) -> Table: - table = Table(show_header=False, pad_edge=False, box=None, expand=True) - table.add_column("1", ratio=1) - table.add_column("2", ratio=1) - table.add_row(renderable1, renderable2) - return table - - table.add_row( - "Asian\nlanguage\nsupport", - ":flag_for_china: 该库支持中文,日文和韩文文本!\n:flag_for_japan: ライブラリは中国語、日本語、韓国語のテキストをサポートしています\n:flag_for_south_korea: 이 라이브러리는 중국어, 일본어 및 한국어 텍스트를 지원합니다", - ) - - markup_example = ( - "[bold magenta]Rich[/] supports a simple [i]bbcode[/i]-like [b]markup[/b] for [yellow]color[/], [underline]style[/], and emoji! " - ":+1: :apple: :ant: :bear: :baguette_bread: :bus: " - ) - table.add_row("Markup", markup_example) - - example_table = Table( - show_edge=False, - show_header=True, - expand=False, - row_styles=["none", "dim"], - box=box.SIMPLE, - ) - example_table.add_column("[green]Date", style="green", no_wrap=True) - example_table.add_column("[blue]Title", style="blue") - example_table.add_column( - "[cyan]Production Budget", - style="cyan", - justify="right", - no_wrap=True, - ) - example_table.add_column( - "[magenta]Box Office", - style="magenta", - justify="right", - no_wrap=True, - ) - example_table.add_row( - "Dec 20, 2019", - "Star Wars: The Rise of Skywalker", - "$275,000,000", - "$375,126,118", - ) - example_table.add_row( - "May 25, 2018", - "[b]Solo[/]: A Star Wars Story", - "$275,000,000", - "$393,151,347", - ) - example_table.add_row( - "Dec 15, 2017", - "Star Wars Ep. VIII: The Last Jedi", - "$262,000,000", - "[bold]$1,332,539,889[/bold]", - ) - example_table.add_row( - "May 19, 1999", - "Star Wars Ep. [b]I[/b]: [i]The phantom Menace", - "$115,000,000", - "$1,027,044,677", - ) - - table.add_row("Tables", example_table) - - code = '''\ -def iter_last(values: Iterable[T]) -> Iterable[Tuple[bool, T]]: - """Iterate and generate a tuple with a flag for last value.""" - iter_values = iter(values) - try: - previous_value = next(iter_values) - except StopIteration: - return - for value in iter_values: - yield False, previous_value - previous_value = value - yield True, previous_value''' - - pretty_data = { - "foo": [ - 3.1427, - ( - "Paul Atreides", - "Vladimir Harkonnen", - "Thufir Hawat", - ), - ], - "atomic": (False, True, None), - } - table.add_row( - "Syntax\nhighlighting\n&\npretty\nprinting", - comparison( - Syntax(code, "python3", line_numbers=True, indent_guides=True), - Pretty(pretty_data, indent_guides=True), - ), - ) - - markdown_example = """\ -# Markdown - -Supports much of the *markdown* __syntax__! - -- Headers -- Basic formatting: **bold**, *italic*, `code` -- Block quotes -- Lists, and more... - """ - table.add_row( - "Markdown", comparison("[cyan]" + markdown_example, Markdown(markdown_example)) - ) - - table.add_row( - "+more!", - """Progress bars, columns, styled logging handler, tracebacks, etc...""", - ) - return table - - -if __name__ == "__main__": # pragma: no cover - - console = Console( - file=io.StringIO(), - force_terminal=True, - ) - test_card = make_test_card() - - # Print once to warm cache - start = process_time() - console.print(test_card) - pre_cache_taken = round((process_time() - start) * 1000.0, 1) - - console.file = io.StringIO() - - start = process_time() - console.print(test_card) - taken = round((process_time() - start) * 1000.0, 1) - - c = Console(record=True) - c.print(test_card) - - print(f"rendered in {pre_cache_taken}ms (cold cache)") - print(f"rendered in {taken}ms (warm cache)") - - from rich.panel import Panel - - console = Console() - - sponsor_message = Table.grid(padding=1) - sponsor_message.add_column(style="green", justify="right") - sponsor_message.add_column(no_wrap=True) - - sponsor_message.add_row( - "Textualize", - "[u blue link=https://github.com/textualize]https://github.com/textualize", - ) - sponsor_message.add_row( - "Twitter", - "[u blue link=https://twitter.com/willmcgugan]https://twitter.com/willmcgugan", - ) - - intro_message = Text.from_markup( - """\ -We hope you enjoy using Rich! - -Rich is maintained with [red]:heart:[/] by [link=https://www.textualize.io]Textualize.io[/] - -- Will McGugan""" - ) - - message = Table.grid(padding=2) - message.add_column() - message.add_column(no_wrap=True) - message.add_row(intro_message, sponsor_message) - - console.print( - Panel.fit( - message, - box=box.ROUNDED, - padding=(1, 2), - title="[b red]Thanks for trying out Rich!", - border_style="bright_blue", - ), - justify="center", - ) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/__init__.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 44955206..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/__main__.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/__main__.cpython-311.pyc deleted file mode 100644 index 16d07266..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/__main__.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_cell_widths.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_cell_widths.cpython-311.pyc deleted file mode 100644 index f24d02b7..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_cell_widths.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_emoji_codes.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_emoji_codes.cpython-311.pyc deleted file mode 100644 index 804cec05..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_emoji_codes.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_emoji_replace.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_emoji_replace.cpython-311.pyc deleted file mode 100644 index 126f82d4..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_emoji_replace.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_export_format.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_export_format.cpython-311.pyc deleted file mode 100644 index 2246c366..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_export_format.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_extension.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_extension.cpython-311.pyc deleted file mode 100644 index 8bb66df1..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_extension.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_fileno.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_fileno.cpython-311.pyc deleted file mode 100644 index 275e3954..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_fileno.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_inspect.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_inspect.cpython-311.pyc deleted file mode 100644 index 5fa6170f..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_inspect.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_log_render.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_log_render.cpython-311.pyc deleted file mode 100644 index 594a37a9..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_log_render.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_loop.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_loop.cpython-311.pyc deleted file mode 100644 index 91655cc1..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_loop.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_null_file.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_null_file.cpython-311.pyc deleted file mode 100644 index ca5f3022..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_null_file.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_palettes.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_palettes.cpython-311.pyc deleted file mode 100644 index fd55adee..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_palettes.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_pick.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_pick.cpython-311.pyc deleted file mode 100644 index 99941df5..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_pick.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_ratio.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_ratio.cpython-311.pyc deleted file mode 100644 index feee1cc8..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_ratio.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_spinners.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_spinners.cpython-311.pyc deleted file mode 100644 index b589229e..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_spinners.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_stack.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_stack.cpython-311.pyc deleted file mode 100644 index 64ee400a..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_stack.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_timer.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_timer.cpython-311.pyc deleted file mode 100644 index 6cba83b2..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_timer.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_win32_console.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_win32_console.cpython-311.pyc deleted file mode 100644 index d07d9f1d..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_win32_console.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_windows.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_windows.cpython-311.pyc deleted file mode 100644 index e0d58bb9..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_windows.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_windows_renderer.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_windows_renderer.cpython-311.pyc deleted file mode 100644 index 35c82eaa..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_windows_renderer.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_wrap.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_wrap.cpython-311.pyc deleted file mode 100644 index b56776a4..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/_wrap.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/abc.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/abc.cpython-311.pyc deleted file mode 100644 index 7b1bf113..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/abc.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/align.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/align.cpython-311.pyc deleted file mode 100644 index 8ec6720b..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/align.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/ansi.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/ansi.cpython-311.pyc deleted file mode 100644 index 5d2afd80..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/ansi.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/bar.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/bar.cpython-311.pyc deleted file mode 100644 index 19a3c5a0..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/bar.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/box.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/box.cpython-311.pyc deleted file mode 100644 index 8733f047..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/box.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/cells.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/cells.cpython-311.pyc deleted file mode 100644 index 353c1b89..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/cells.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/color.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/color.cpython-311.pyc deleted file mode 100644 index db57c65b..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/color.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/color_triplet.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/color_triplet.cpython-311.pyc deleted file mode 100644 index 2af71d92..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/color_triplet.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/columns.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/columns.cpython-311.pyc deleted file mode 100644 index 1eb21132..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/columns.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/console.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/console.cpython-311.pyc deleted file mode 100644 index a6ce3be9..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/console.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/constrain.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/constrain.cpython-311.pyc deleted file mode 100644 index 47365e34..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/constrain.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/containers.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/containers.cpython-311.pyc deleted file mode 100644 index 1998f3f8..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/containers.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/control.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/control.cpython-311.pyc deleted file mode 100644 index ffb7b9cc..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/control.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/default_styles.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/default_styles.cpython-311.pyc deleted file mode 100644 index 16a67fad..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/default_styles.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/diagnose.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/diagnose.cpython-311.pyc deleted file mode 100644 index cab5e904..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/diagnose.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/emoji.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/emoji.cpython-311.pyc deleted file mode 100644 index 2e717b25..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/emoji.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/errors.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/errors.cpython-311.pyc deleted file mode 100644 index c37f594b..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/errors.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/file_proxy.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/file_proxy.cpython-311.pyc deleted file mode 100644 index 3703c2bd..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/file_proxy.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/filesize.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/filesize.cpython-311.pyc deleted file mode 100644 index a644928a..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/filesize.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/highlighter.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/highlighter.cpython-311.pyc deleted file mode 100644 index 603e74a7..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/highlighter.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/json.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/json.cpython-311.pyc deleted file mode 100644 index e261e92a..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/json.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/jupyter.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/jupyter.cpython-311.pyc deleted file mode 100644 index 94b39015..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/jupyter.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/layout.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/layout.cpython-311.pyc deleted file mode 100644 index 2835271f..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/layout.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/live.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/live.cpython-311.pyc deleted file mode 100644 index ce9ed997..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/live.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/live_render.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/live_render.cpython-311.pyc deleted file mode 100644 index bdba7bef..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/live_render.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/logging.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/logging.cpython-311.pyc deleted file mode 100644 index 52166f91..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/logging.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/markdown.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/markdown.cpython-311.pyc deleted file mode 100644 index 43d2cd07..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/markdown.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/markup.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/markup.cpython-311.pyc deleted file mode 100644 index ace969a4..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/markup.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/measure.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/measure.cpython-311.pyc deleted file mode 100644 index 18d0c0f9..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/measure.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/padding.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/padding.cpython-311.pyc deleted file mode 100644 index 9082d822..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/padding.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/pager.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/pager.cpython-311.pyc deleted file mode 100644 index 00d5ca5d..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/pager.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/palette.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/palette.cpython-311.pyc deleted file mode 100644 index 736b3812..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/palette.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/panel.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/panel.cpython-311.pyc deleted file mode 100644 index fa8e386c..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/panel.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/pretty.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/pretty.cpython-311.pyc deleted file mode 100644 index 7eee49c9..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/pretty.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/progress.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/progress.cpython-311.pyc deleted file mode 100644 index 68660f63..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/progress.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/progress_bar.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/progress_bar.cpython-311.pyc deleted file mode 100644 index 8b53d99d..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/progress_bar.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/prompt.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/prompt.cpython-311.pyc deleted file mode 100644 index 9b7f81e2..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/prompt.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/protocol.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/protocol.cpython-311.pyc deleted file mode 100644 index 36cdb1da..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/protocol.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/region.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/region.cpython-311.pyc deleted file mode 100644 index 71a5f3ab..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/region.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/repr.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/repr.cpython-311.pyc deleted file mode 100644 index b8ecefbe..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/repr.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/rule.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/rule.cpython-311.pyc deleted file mode 100644 index 55220d03..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/rule.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/scope.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/scope.cpython-311.pyc deleted file mode 100644 index 99794c12..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/scope.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/screen.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/screen.cpython-311.pyc deleted file mode 100644 index 41a2ceb3..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/screen.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/segment.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/segment.cpython-311.pyc deleted file mode 100644 index 5e50e6be..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/segment.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/spinner.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/spinner.cpython-311.pyc deleted file mode 100644 index 4124e87d..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/spinner.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/status.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/status.cpython-311.pyc deleted file mode 100644 index c6a2a4fc..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/status.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/style.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/style.cpython-311.pyc deleted file mode 100644 index ccc13d67..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/style.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/styled.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/styled.cpython-311.pyc deleted file mode 100644 index 9d15070e..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/styled.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/syntax.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/syntax.cpython-311.pyc deleted file mode 100644 index 8756cb08..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/syntax.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/table.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/table.cpython-311.pyc deleted file mode 100644 index ad7b556b..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/table.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/terminal_theme.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/terminal_theme.cpython-311.pyc deleted file mode 100644 index 5eb47706..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/terminal_theme.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/text.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/text.cpython-311.pyc deleted file mode 100644 index f1e575c1..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/text.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/theme.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/theme.cpython-311.pyc deleted file mode 100644 index a204f0b7..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/theme.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/themes.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/themes.cpython-311.pyc deleted file mode 100644 index 4c9226c8..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/themes.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/traceback.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/traceback.cpython-311.pyc deleted file mode 100644 index dab40dea..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/traceback.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/tree.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/tree.cpython-311.pyc deleted file mode 100644 index 23ede954..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/__pycache__/tree.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_cell_widths.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_cell_widths.py deleted file mode 100644 index 36286df3..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_cell_widths.py +++ /dev/null @@ -1,451 +0,0 @@ -# Auto generated by make_terminal_widths.py - -CELL_WIDTHS = [ - (0, 0, 0), - (1, 31, -1), - (127, 159, -1), - (768, 879, 0), - (1155, 1161, 0), - (1425, 1469, 0), - (1471, 1471, 0), - (1473, 1474, 0), - (1476, 1477, 0), - (1479, 1479, 0), - (1552, 1562, 0), - (1611, 1631, 0), - (1648, 1648, 0), - (1750, 1756, 0), - (1759, 1764, 0), - (1767, 1768, 0), - (1770, 1773, 0), - (1809, 1809, 0), - (1840, 1866, 0), - (1958, 1968, 0), - (2027, 2035, 0), - (2045, 2045, 0), - (2070, 2073, 0), - (2075, 2083, 0), - (2085, 2087, 0), - (2089, 2093, 0), - (2137, 2139, 0), - (2259, 2273, 0), - (2275, 2306, 0), - (2362, 2362, 0), - (2364, 2364, 0), - (2369, 2376, 0), - (2381, 2381, 0), - (2385, 2391, 0), - (2402, 2403, 0), - (2433, 2433, 0), - (2492, 2492, 0), - (2497, 2500, 0), - (2509, 2509, 0), - (2530, 2531, 0), - (2558, 2558, 0), - (2561, 2562, 0), - (2620, 2620, 0), - (2625, 2626, 0), - (2631, 2632, 0), - (2635, 2637, 0), - (2641, 2641, 0), - (2672, 2673, 0), - (2677, 2677, 0), - (2689, 2690, 0), - (2748, 2748, 0), - (2753, 2757, 0), - (2759, 2760, 0), - (2765, 2765, 0), - (2786, 2787, 0), - (2810, 2815, 0), - (2817, 2817, 0), - (2876, 2876, 0), - (2879, 2879, 0), - (2881, 2884, 0), - (2893, 2893, 0), - (2901, 2902, 0), - (2914, 2915, 0), - (2946, 2946, 0), - (3008, 3008, 0), - (3021, 3021, 0), - (3072, 3072, 0), - (3076, 3076, 0), - (3134, 3136, 0), - (3142, 3144, 0), - (3146, 3149, 0), - (3157, 3158, 0), - (3170, 3171, 0), - (3201, 3201, 0), - (3260, 3260, 0), - (3263, 3263, 0), - (3270, 3270, 0), - (3276, 3277, 0), - (3298, 3299, 0), - (3328, 3329, 0), - (3387, 3388, 0), - (3393, 3396, 0), - (3405, 3405, 0), - (3426, 3427, 0), - (3457, 3457, 0), - (3530, 3530, 0), - (3538, 3540, 0), - (3542, 3542, 0), - (3633, 3633, 0), - (3636, 3642, 0), - (3655, 3662, 0), - (3761, 3761, 0), - (3764, 3772, 0), - (3784, 3789, 0), - (3864, 3865, 0), - (3893, 3893, 0), - (3895, 3895, 0), - (3897, 3897, 0), - (3953, 3966, 0), - (3968, 3972, 0), - (3974, 3975, 0), - (3981, 3991, 0), - (3993, 4028, 0), - (4038, 4038, 0), - (4141, 4144, 0), - (4146, 4151, 0), - (4153, 4154, 0), - (4157, 4158, 0), - (4184, 4185, 0), - (4190, 4192, 0), - (4209, 4212, 0), - (4226, 4226, 0), - (4229, 4230, 0), - (4237, 4237, 0), - (4253, 4253, 0), - (4352, 4447, 2), - (4957, 4959, 0), - (5906, 5908, 0), - (5938, 5940, 0), - (5970, 5971, 0), - (6002, 6003, 0), - (6068, 6069, 0), - (6071, 6077, 0), - (6086, 6086, 0), - (6089, 6099, 0), - (6109, 6109, 0), - (6155, 6157, 0), - (6277, 6278, 0), - (6313, 6313, 0), - (6432, 6434, 0), - (6439, 6440, 0), - (6450, 6450, 0), - (6457, 6459, 0), - (6679, 6680, 0), - (6683, 6683, 0), - (6742, 6742, 0), - (6744, 6750, 0), - (6752, 6752, 0), - (6754, 6754, 0), - (6757, 6764, 0), - (6771, 6780, 0), - (6783, 6783, 0), - (6832, 6848, 0), - (6912, 6915, 0), - (6964, 6964, 0), - (6966, 6970, 0), - (6972, 6972, 0), - (6978, 6978, 0), - (7019, 7027, 0), - (7040, 7041, 0), - (7074, 7077, 0), - (7080, 7081, 0), - (7083, 7085, 0), - (7142, 7142, 0), - (7144, 7145, 0), - (7149, 7149, 0), - (7151, 7153, 0), - (7212, 7219, 0), - (7222, 7223, 0), - (7376, 7378, 0), - (7380, 7392, 0), - (7394, 7400, 0), - (7405, 7405, 0), - (7412, 7412, 0), - (7416, 7417, 0), - (7616, 7673, 0), - (7675, 7679, 0), - (8203, 8207, 0), - (8232, 8238, 0), - (8288, 8291, 0), - (8400, 8432, 0), - (8986, 8987, 2), - (9001, 9002, 2), - (9193, 9196, 2), - (9200, 9200, 2), - (9203, 9203, 2), - (9725, 9726, 2), - (9748, 9749, 2), - (9800, 9811, 2), - (9855, 9855, 2), - (9875, 9875, 2), - (9889, 9889, 2), - (9898, 9899, 2), - (9917, 9918, 2), - (9924, 9925, 2), - (9934, 9934, 2), - (9940, 9940, 2), - (9962, 9962, 2), - (9970, 9971, 2), - (9973, 9973, 2), - (9978, 9978, 2), - (9981, 9981, 2), - (9989, 9989, 2), - (9994, 9995, 2), - (10024, 10024, 2), - (10060, 10060, 2), - (10062, 10062, 2), - (10067, 10069, 2), - (10071, 10071, 2), - (10133, 10135, 2), - (10160, 10160, 2), - (10175, 10175, 2), - (11035, 11036, 2), - (11088, 11088, 2), - (11093, 11093, 2), - (11503, 11505, 0), - (11647, 11647, 0), - (11744, 11775, 0), - (11904, 11929, 2), - (11931, 12019, 2), - (12032, 12245, 2), - (12272, 12283, 2), - (12288, 12329, 2), - (12330, 12333, 0), - (12334, 12350, 2), - (12353, 12438, 2), - (12441, 12442, 0), - (12443, 12543, 2), - (12549, 12591, 2), - (12593, 12686, 2), - (12688, 12771, 2), - (12784, 12830, 2), - (12832, 12871, 2), - (12880, 19903, 2), - (19968, 42124, 2), - (42128, 42182, 2), - (42607, 42610, 0), - (42612, 42621, 0), - (42654, 42655, 0), - (42736, 42737, 0), - (43010, 43010, 0), - (43014, 43014, 0), - (43019, 43019, 0), - (43045, 43046, 0), - (43052, 43052, 0), - (43204, 43205, 0), - (43232, 43249, 0), - (43263, 43263, 0), - (43302, 43309, 0), - (43335, 43345, 0), - (43360, 43388, 2), - (43392, 43394, 0), - (43443, 43443, 0), - (43446, 43449, 0), - (43452, 43453, 0), - (43493, 43493, 0), - (43561, 43566, 0), - (43569, 43570, 0), - (43573, 43574, 0), - (43587, 43587, 0), - (43596, 43596, 0), - (43644, 43644, 0), - (43696, 43696, 0), - (43698, 43700, 0), - (43703, 43704, 0), - (43710, 43711, 0), - (43713, 43713, 0), - (43756, 43757, 0), - (43766, 43766, 0), - (44005, 44005, 0), - (44008, 44008, 0), - (44013, 44013, 0), - (44032, 55203, 2), - (63744, 64255, 2), - (64286, 64286, 0), - (65024, 65039, 0), - (65040, 65049, 2), - (65056, 65071, 0), - (65072, 65106, 2), - (65108, 65126, 2), - (65128, 65131, 2), - (65281, 65376, 2), - (65504, 65510, 2), - (66045, 66045, 0), - (66272, 66272, 0), - (66422, 66426, 0), - (68097, 68099, 0), - (68101, 68102, 0), - (68108, 68111, 0), - (68152, 68154, 0), - (68159, 68159, 0), - (68325, 68326, 0), - (68900, 68903, 0), - (69291, 69292, 0), - (69446, 69456, 0), - (69633, 69633, 0), - (69688, 69702, 0), - (69759, 69761, 0), - (69811, 69814, 0), - (69817, 69818, 0), - (69888, 69890, 0), - (69927, 69931, 0), - (69933, 69940, 0), - (70003, 70003, 0), - (70016, 70017, 0), - (70070, 70078, 0), - (70089, 70092, 0), - (70095, 70095, 0), - (70191, 70193, 0), - (70196, 70196, 0), - (70198, 70199, 0), - (70206, 70206, 0), - (70367, 70367, 0), - (70371, 70378, 0), - (70400, 70401, 0), - (70459, 70460, 0), - (70464, 70464, 0), - (70502, 70508, 0), - (70512, 70516, 0), - (70712, 70719, 0), - (70722, 70724, 0), - (70726, 70726, 0), - (70750, 70750, 0), - (70835, 70840, 0), - (70842, 70842, 0), - (70847, 70848, 0), - (70850, 70851, 0), - (71090, 71093, 0), - (71100, 71101, 0), - (71103, 71104, 0), - (71132, 71133, 0), - (71219, 71226, 0), - (71229, 71229, 0), - (71231, 71232, 0), - (71339, 71339, 0), - (71341, 71341, 0), - (71344, 71349, 0), - (71351, 71351, 0), - (71453, 71455, 0), - (71458, 71461, 0), - (71463, 71467, 0), - (71727, 71735, 0), - (71737, 71738, 0), - (71995, 71996, 0), - (71998, 71998, 0), - (72003, 72003, 0), - (72148, 72151, 0), - (72154, 72155, 0), - (72160, 72160, 0), - (72193, 72202, 0), - (72243, 72248, 0), - (72251, 72254, 0), - (72263, 72263, 0), - (72273, 72278, 0), - (72281, 72283, 0), - (72330, 72342, 0), - (72344, 72345, 0), - (72752, 72758, 0), - (72760, 72765, 0), - (72767, 72767, 0), - (72850, 72871, 0), - (72874, 72880, 0), - (72882, 72883, 0), - (72885, 72886, 0), - (73009, 73014, 0), - (73018, 73018, 0), - (73020, 73021, 0), - (73023, 73029, 0), - (73031, 73031, 0), - (73104, 73105, 0), - (73109, 73109, 0), - (73111, 73111, 0), - (73459, 73460, 0), - (92912, 92916, 0), - (92976, 92982, 0), - (94031, 94031, 0), - (94095, 94098, 0), - (94176, 94179, 2), - (94180, 94180, 0), - (94192, 94193, 2), - (94208, 100343, 2), - (100352, 101589, 2), - (101632, 101640, 2), - (110592, 110878, 2), - (110928, 110930, 2), - (110948, 110951, 2), - (110960, 111355, 2), - (113821, 113822, 0), - (119143, 119145, 0), - (119163, 119170, 0), - (119173, 119179, 0), - (119210, 119213, 0), - (119362, 119364, 0), - (121344, 121398, 0), - (121403, 121452, 0), - (121461, 121461, 0), - (121476, 121476, 0), - (121499, 121503, 0), - (121505, 121519, 0), - (122880, 122886, 0), - (122888, 122904, 0), - (122907, 122913, 0), - (122915, 122916, 0), - (122918, 122922, 0), - (123184, 123190, 0), - (123628, 123631, 0), - (125136, 125142, 0), - (125252, 125258, 0), - (126980, 126980, 2), - (127183, 127183, 2), - (127374, 127374, 2), - (127377, 127386, 2), - (127488, 127490, 2), - (127504, 127547, 2), - (127552, 127560, 2), - (127568, 127569, 2), - (127584, 127589, 2), - (127744, 127776, 2), - (127789, 127797, 2), - (127799, 127868, 2), - (127870, 127891, 2), - (127904, 127946, 2), - (127951, 127955, 2), - (127968, 127984, 2), - (127988, 127988, 2), - (127992, 128062, 2), - (128064, 128064, 2), - (128066, 128252, 2), - (128255, 128317, 2), - (128331, 128334, 2), - (128336, 128359, 2), - (128378, 128378, 2), - (128405, 128406, 2), - (128420, 128420, 2), - (128507, 128591, 2), - (128640, 128709, 2), - (128716, 128716, 2), - (128720, 128722, 2), - (128725, 128727, 2), - (128747, 128748, 2), - (128756, 128764, 2), - (128992, 129003, 2), - (129292, 129338, 2), - (129340, 129349, 2), - (129351, 129400, 2), - (129402, 129483, 2), - (129485, 129535, 2), - (129648, 129652, 2), - (129656, 129658, 2), - (129664, 129670, 2), - (129680, 129704, 2), - (129712, 129718, 2), - (129728, 129730, 2), - (129744, 129750, 2), - (131072, 196605, 2), - (196608, 262141, 2), - (917760, 917999, 0), -] diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_emoji_codes.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_emoji_codes.py deleted file mode 100644 index 1f2877bb..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_emoji_codes.py +++ /dev/null @@ -1,3610 +0,0 @@ -EMOJI = { - "1st_place_medal": "🥇", - "2nd_place_medal": "🥈", - "3rd_place_medal": "🥉", - "ab_button_(blood_type)": "🆎", - "atm_sign": "🏧", - "a_button_(blood_type)": "🅰", - "afghanistan": "🇦🇫", - "albania": "🇦🇱", - "algeria": "🇩🇿", - "american_samoa": "🇦🇸", - "andorra": "🇦🇩", - "angola": "🇦🇴", - "anguilla": "🇦🇮", - "antarctica": "🇦🇶", - "antigua_&_barbuda": "🇦🇬", - "aquarius": "♒", - "argentina": "🇦🇷", - "aries": "♈", - "armenia": "🇦🇲", - "aruba": "🇦🇼", - "ascension_island": "🇦🇨", - "australia": "🇦🇺", - "austria": "🇦🇹", - "azerbaijan": "🇦🇿", - "back_arrow": "🔙", - "b_button_(blood_type)": "🅱", - "bahamas": "🇧🇸", - "bahrain": "🇧🇭", - "bangladesh": "🇧🇩", - "barbados": "🇧🇧", - "belarus": "🇧🇾", - "belgium": "🇧🇪", - "belize": "🇧🇿", - "benin": "🇧🇯", - "bermuda": "🇧🇲", - "bhutan": "🇧🇹", - "bolivia": "🇧🇴", - "bosnia_&_herzegovina": "🇧🇦", - "botswana": "🇧🇼", - "bouvet_island": "🇧🇻", - "brazil": "🇧🇷", - "british_indian_ocean_territory": "🇮🇴", - "british_virgin_islands": "🇻🇬", - "brunei": "🇧🇳", - "bulgaria": "🇧🇬", - "burkina_faso": "🇧🇫", - "burundi": "🇧🇮", - "cl_button": "🆑", - "cool_button": "🆒", - "cambodia": "🇰🇭", - "cameroon": "🇨🇲", - "canada": "🇨🇦", - "canary_islands": "🇮🇨", - "cancer": "♋", - "cape_verde": "🇨🇻", - "capricorn": "♑", - "caribbean_netherlands": "🇧🇶", - "cayman_islands": "🇰🇾", - "central_african_republic": "🇨🇫", - "ceuta_&_melilla": "🇪🇦", - "chad": "🇹🇩", - "chile": "🇨🇱", - "china": "🇨🇳", - "christmas_island": "🇨🇽", - "christmas_tree": "🎄", - "clipperton_island": "🇨🇵", - "cocos_(keeling)_islands": "🇨🇨", - "colombia": "🇨🇴", - "comoros": "🇰🇲", - "congo_-_brazzaville": "🇨🇬", - "congo_-_kinshasa": "🇨🇩", - "cook_islands": "🇨🇰", - "costa_rica": "🇨🇷", - "croatia": "🇭🇷", - "cuba": "🇨🇺", - "curaçao": "🇨🇼", - "cyprus": "🇨🇾", - "czechia": "🇨🇿", - "côte_d’ivoire": "🇨🇮", - "denmark": "🇩🇰", - "diego_garcia": "🇩🇬", - "djibouti": "🇩🇯", - "dominica": "🇩🇲", - "dominican_republic": "🇩🇴", - "end_arrow": "🔚", - "ecuador": "🇪🇨", - "egypt": "🇪🇬", - "el_salvador": "🇸🇻", - "england": "🏴\U000e0067\U000e0062\U000e0065\U000e006e\U000e0067\U000e007f", - "equatorial_guinea": "🇬🇶", - "eritrea": "🇪🇷", - "estonia": "🇪🇪", - "ethiopia": "🇪🇹", - "european_union": "🇪🇺", - "free_button": "🆓", - "falkland_islands": "🇫🇰", - "faroe_islands": "🇫🇴", - "fiji": "🇫🇯", - "finland": "🇫🇮", - "france": "🇫🇷", - "french_guiana": "🇬🇫", - "french_polynesia": "🇵🇫", - "french_southern_territories": "🇹🇫", - "gabon": "🇬🇦", - "gambia": "🇬🇲", - "gemini": "♊", - "georgia": "🇬🇪", - "germany": "🇩🇪", - "ghana": "🇬🇭", - "gibraltar": "🇬🇮", - "greece": "🇬🇷", - "greenland": "🇬🇱", - "grenada": "🇬🇩", - "guadeloupe": "🇬🇵", - "guam": "🇬🇺", - "guatemala": "🇬🇹", - "guernsey": "🇬🇬", - "guinea": "🇬🇳", - "guinea-bissau": "🇬🇼", - "guyana": "🇬🇾", - "haiti": "🇭🇹", - "heard_&_mcdonald_islands": "🇭🇲", - "honduras": "🇭🇳", - "hong_kong_sar_china": "🇭🇰", - "hungary": "🇭🇺", - "id_button": "🆔", - "iceland": "🇮🇸", - "india": "🇮🇳", - "indonesia": "🇮🇩", - "iran": "🇮🇷", - "iraq": "🇮🇶", - "ireland": "🇮🇪", - "isle_of_man": "🇮🇲", - "israel": "🇮🇱", - "italy": "🇮🇹", - "jamaica": "🇯🇲", - "japan": "🗾", - "japanese_acceptable_button": "🉑", - "japanese_application_button": "🈸", - "japanese_bargain_button": "🉐", - "japanese_castle": "🏯", - "japanese_congratulations_button": "㊗", - "japanese_discount_button": "🈹", - "japanese_dolls": "🎎", - "japanese_free_of_charge_button": "🈚", - "japanese_here_button": "🈁", - "japanese_monthly_amount_button": "🈷", - "japanese_no_vacancy_button": "🈵", - "japanese_not_free_of_charge_button": "🈶", - "japanese_open_for_business_button": "🈺", - "japanese_passing_grade_button": "🈴", - "japanese_post_office": "🏣", - "japanese_prohibited_button": "🈲", - "japanese_reserved_button": "🈯", - "japanese_secret_button": "㊙", - "japanese_service_charge_button": "🈂", - "japanese_symbol_for_beginner": "🔰", - "japanese_vacancy_button": "🈳", - "jersey": "🇯🇪", - "jordan": "🇯🇴", - "kazakhstan": "🇰🇿", - "kenya": "🇰🇪", - "kiribati": "🇰🇮", - "kosovo": "🇽🇰", - "kuwait": "🇰🇼", - "kyrgyzstan": "🇰🇬", - "laos": "🇱🇦", - "latvia": "🇱🇻", - "lebanon": "🇱🇧", - "leo": "♌", - "lesotho": "🇱🇸", - "liberia": "🇱🇷", - "libra": "♎", - "libya": "🇱🇾", - "liechtenstein": "🇱🇮", - "lithuania": "🇱🇹", - "luxembourg": "🇱🇺", - "macau_sar_china": "🇲🇴", - "macedonia": "🇲🇰", - "madagascar": "🇲🇬", - "malawi": "🇲🇼", - "malaysia": "🇲🇾", - "maldives": "🇲🇻", - "mali": "🇲🇱", - "malta": "🇲🇹", - "marshall_islands": "🇲🇭", - "martinique": "🇲🇶", - "mauritania": "🇲🇷", - "mauritius": "🇲🇺", - "mayotte": "🇾🇹", - "mexico": "🇲🇽", - "micronesia": "🇫🇲", - "moldova": "🇲🇩", - "monaco": "🇲🇨", - "mongolia": "🇲🇳", - "montenegro": "🇲🇪", - "montserrat": "🇲🇸", - "morocco": "🇲🇦", - "mozambique": "🇲🇿", - "mrs._claus": "🤶", - "mrs._claus_dark_skin_tone": "🤶🏿", - "mrs._claus_light_skin_tone": "🤶🏻", - "mrs._claus_medium-dark_skin_tone": "🤶🏾", - "mrs._claus_medium-light_skin_tone": "🤶🏼", - "mrs._claus_medium_skin_tone": "🤶🏽", - "myanmar_(burma)": "🇲🇲", - "new_button": "🆕", - "ng_button": "🆖", - "namibia": "🇳🇦", - "nauru": "🇳🇷", - "nepal": "🇳🇵", - "netherlands": "🇳🇱", - "new_caledonia": "🇳🇨", - "new_zealand": "🇳🇿", - "nicaragua": "🇳🇮", - "niger": "🇳🇪", - "nigeria": "🇳🇬", - "niue": "🇳🇺", - "norfolk_island": "🇳🇫", - "north_korea": "🇰🇵", - "northern_mariana_islands": "🇲🇵", - "norway": "🇳🇴", - "ok_button": "🆗", - "ok_hand": "👌", - "ok_hand_dark_skin_tone": "👌🏿", - "ok_hand_light_skin_tone": "👌🏻", - "ok_hand_medium-dark_skin_tone": "👌🏾", - "ok_hand_medium-light_skin_tone": "👌🏼", - "ok_hand_medium_skin_tone": "👌🏽", - "on!_arrow": "🔛", - "o_button_(blood_type)": "🅾", - "oman": "🇴🇲", - "ophiuchus": "⛎", - "p_button": "🅿", - "pakistan": "🇵🇰", - "palau": "🇵🇼", - "palestinian_territories": "🇵🇸", - "panama": "🇵🇦", - "papua_new_guinea": "🇵🇬", - "paraguay": "🇵🇾", - "peru": "🇵🇪", - "philippines": "🇵🇭", - "pisces": "♓", - "pitcairn_islands": "🇵🇳", - "poland": "🇵🇱", - "portugal": "🇵🇹", - "puerto_rico": "🇵🇷", - "qatar": "🇶🇦", - "romania": "🇷🇴", - "russia": "🇷🇺", - "rwanda": "🇷🇼", - "réunion": "🇷🇪", - "soon_arrow": "🔜", - "sos_button": "🆘", - "sagittarius": "♐", - "samoa": "🇼🇸", - "san_marino": "🇸🇲", - "santa_claus": "🎅", - "santa_claus_dark_skin_tone": "🎅🏿", - "santa_claus_light_skin_tone": "🎅🏻", - "santa_claus_medium-dark_skin_tone": "🎅🏾", - "santa_claus_medium-light_skin_tone": "🎅🏼", - "santa_claus_medium_skin_tone": "🎅🏽", - "saudi_arabia": "🇸🇦", - "scorpio": "♏", - "scotland": "🏴\U000e0067\U000e0062\U000e0073\U000e0063\U000e0074\U000e007f", - "senegal": "🇸🇳", - "serbia": "🇷🇸", - "seychelles": "🇸🇨", - "sierra_leone": "🇸🇱", - "singapore": "🇸🇬", - "sint_maarten": "🇸🇽", - "slovakia": "🇸🇰", - "slovenia": "🇸🇮", - "solomon_islands": "🇸🇧", - "somalia": "🇸🇴", - "south_africa": "🇿🇦", - "south_georgia_&_south_sandwich_islands": "🇬🇸", - "south_korea": "🇰🇷", - "south_sudan": "🇸🇸", - "spain": "🇪🇸", - "sri_lanka": "🇱🇰", - "st._barthélemy": "🇧🇱", - "st._helena": "🇸🇭", - "st._kitts_&_nevis": "🇰🇳", - "st._lucia": "🇱🇨", - "st._martin": "🇲🇫", - "st._pierre_&_miquelon": "🇵🇲", - "st._vincent_&_grenadines": "🇻🇨", - "statue_of_liberty": "🗽", - "sudan": "🇸🇩", - "suriname": "🇸🇷", - "svalbard_&_jan_mayen": "🇸🇯", - "swaziland": "🇸🇿", - "sweden": "🇸🇪", - "switzerland": "🇨🇭", - "syria": "🇸🇾", - "são_tomé_&_príncipe": "🇸🇹", - "t-rex": "🦖", - "top_arrow": "🔝", - "taiwan": "🇹🇼", - "tajikistan": "🇹🇯", - "tanzania": "🇹🇿", - "taurus": "♉", - "thailand": "🇹🇭", - "timor-leste": "🇹🇱", - "togo": "🇹🇬", - "tokelau": "🇹🇰", - "tokyo_tower": "🗼", - "tonga": "🇹🇴", - "trinidad_&_tobago": "🇹🇹", - "tristan_da_cunha": "🇹🇦", - "tunisia": "🇹🇳", - "turkey": "🦃", - "turkmenistan": "🇹🇲", - "turks_&_caicos_islands": "🇹🇨", - "tuvalu": "🇹🇻", - "u.s._outlying_islands": "🇺🇲", - "u.s._virgin_islands": "🇻🇮", - "up!_button": "🆙", - "uganda": "🇺🇬", - "ukraine": "🇺🇦", - "united_arab_emirates": "🇦🇪", - "united_kingdom": "🇬🇧", - "united_nations": "🇺🇳", - "united_states": "🇺🇸", - "uruguay": "🇺🇾", - "uzbekistan": "🇺🇿", - "vs_button": "🆚", - "vanuatu": "🇻🇺", - "vatican_city": "🇻🇦", - "venezuela": "🇻🇪", - "vietnam": "🇻🇳", - "virgo": "♍", - "wales": "🏴\U000e0067\U000e0062\U000e0077\U000e006c\U000e0073\U000e007f", - "wallis_&_futuna": "🇼🇫", - "western_sahara": "🇪🇭", - "yemen": "🇾🇪", - "zambia": "🇿🇲", - "zimbabwe": "🇿🇼", - "abacus": "🧮", - "adhesive_bandage": "🩹", - "admission_tickets": "🎟", - "adult": "🧑", - "adult_dark_skin_tone": "🧑🏿", - "adult_light_skin_tone": "🧑🏻", - "adult_medium-dark_skin_tone": "🧑🏾", - "adult_medium-light_skin_tone": "🧑🏼", - "adult_medium_skin_tone": "🧑🏽", - "aerial_tramway": "🚡", - "airplane": "✈", - "airplane_arrival": "🛬", - "airplane_departure": "🛫", - "alarm_clock": "⏰", - "alembic": "⚗", - "alien": "👽", - "alien_monster": "👾", - "ambulance": "🚑", - "american_football": "🏈", - "amphora": "🏺", - "anchor": "⚓", - "anger_symbol": "💢", - "angry_face": "😠", - "angry_face_with_horns": "👿", - "anguished_face": "😧", - "ant": "🐜", - "antenna_bars": "📶", - "anxious_face_with_sweat": "😰", - "articulated_lorry": "🚛", - "artist_palette": "🎨", - "astonished_face": "😲", - "atom_symbol": "⚛", - "auto_rickshaw": "🛺", - "automobile": "🚗", - "avocado": "🥑", - "axe": "🪓", - "baby": "👶", - "baby_angel": "👼", - "baby_angel_dark_skin_tone": "👼🏿", - "baby_angel_light_skin_tone": "👼🏻", - "baby_angel_medium-dark_skin_tone": "👼🏾", - "baby_angel_medium-light_skin_tone": "👼🏼", - "baby_angel_medium_skin_tone": "👼🏽", - "baby_bottle": "🍼", - "baby_chick": "🐤", - "baby_dark_skin_tone": "👶🏿", - "baby_light_skin_tone": "👶🏻", - "baby_medium-dark_skin_tone": "👶🏾", - "baby_medium-light_skin_tone": "👶🏼", - "baby_medium_skin_tone": "👶🏽", - "baby_symbol": "🚼", - "backhand_index_pointing_down": "👇", - "backhand_index_pointing_down_dark_skin_tone": "👇🏿", - "backhand_index_pointing_down_light_skin_tone": "👇🏻", - "backhand_index_pointing_down_medium-dark_skin_tone": "👇🏾", - "backhand_index_pointing_down_medium-light_skin_tone": "👇🏼", - "backhand_index_pointing_down_medium_skin_tone": "👇🏽", - "backhand_index_pointing_left": "👈", - "backhand_index_pointing_left_dark_skin_tone": "👈🏿", - "backhand_index_pointing_left_light_skin_tone": "👈🏻", - "backhand_index_pointing_left_medium-dark_skin_tone": "👈🏾", - "backhand_index_pointing_left_medium-light_skin_tone": "👈🏼", - "backhand_index_pointing_left_medium_skin_tone": "👈🏽", - "backhand_index_pointing_right": "👉", - "backhand_index_pointing_right_dark_skin_tone": "👉🏿", - "backhand_index_pointing_right_light_skin_tone": "👉🏻", - "backhand_index_pointing_right_medium-dark_skin_tone": "👉🏾", - "backhand_index_pointing_right_medium-light_skin_tone": "👉🏼", - "backhand_index_pointing_right_medium_skin_tone": "👉🏽", - "backhand_index_pointing_up": "👆", - "backhand_index_pointing_up_dark_skin_tone": "👆🏿", - "backhand_index_pointing_up_light_skin_tone": "👆🏻", - "backhand_index_pointing_up_medium-dark_skin_tone": "👆🏾", - "backhand_index_pointing_up_medium-light_skin_tone": "👆🏼", - "backhand_index_pointing_up_medium_skin_tone": "👆🏽", - "bacon": "🥓", - "badger": "🦡", - "badminton": "🏸", - "bagel": "🥯", - "baggage_claim": "🛄", - "baguette_bread": "🥖", - "balance_scale": "⚖", - "bald": "🦲", - "bald_man": "👨\u200d🦲", - "bald_woman": "👩\u200d🦲", - "ballet_shoes": "🩰", - "balloon": "🎈", - "ballot_box_with_ballot": "🗳", - "ballot_box_with_check": "☑", - "banana": "🍌", - "banjo": "🪕", - "bank": "🏦", - "bar_chart": "📊", - "barber_pole": "💈", - "baseball": "⚾", - "basket": "🧺", - "basketball": "🏀", - "bat": "🦇", - "bathtub": "🛁", - "battery": "🔋", - "beach_with_umbrella": "🏖", - "beaming_face_with_smiling_eyes": "😁", - "bear_face": "🐻", - "bearded_person": "🧔", - "bearded_person_dark_skin_tone": "🧔🏿", - "bearded_person_light_skin_tone": "🧔🏻", - "bearded_person_medium-dark_skin_tone": "🧔🏾", - "bearded_person_medium-light_skin_tone": "🧔🏼", - "bearded_person_medium_skin_tone": "🧔🏽", - "beating_heart": "💓", - "bed": "🛏", - "beer_mug": "🍺", - "bell": "🔔", - "bell_with_slash": "🔕", - "bellhop_bell": "🛎", - "bento_box": "🍱", - "beverage_box": "🧃", - "bicycle": "🚲", - "bikini": "👙", - "billed_cap": "🧢", - "biohazard": "☣", - "bird": "🐦", - "birthday_cake": "🎂", - "black_circle": "⚫", - "black_flag": "🏴", - "black_heart": "🖤", - "black_large_square": "⬛", - "black_medium-small_square": "◾", - "black_medium_square": "◼", - "black_nib": "✒", - "black_small_square": "▪", - "black_square_button": "🔲", - "blond-haired_man": "👱\u200d♂️", - "blond-haired_man_dark_skin_tone": "👱🏿\u200d♂️", - "blond-haired_man_light_skin_tone": "👱🏻\u200d♂️", - "blond-haired_man_medium-dark_skin_tone": "👱🏾\u200d♂️", - "blond-haired_man_medium-light_skin_tone": "👱🏼\u200d♂️", - "blond-haired_man_medium_skin_tone": "👱🏽\u200d♂️", - "blond-haired_person": "👱", - "blond-haired_person_dark_skin_tone": "👱🏿", - "blond-haired_person_light_skin_tone": "👱🏻", - "blond-haired_person_medium-dark_skin_tone": "👱🏾", - "blond-haired_person_medium-light_skin_tone": "👱🏼", - "blond-haired_person_medium_skin_tone": "👱🏽", - "blond-haired_woman": "👱\u200d♀️", - "blond-haired_woman_dark_skin_tone": "👱🏿\u200d♀️", - "blond-haired_woman_light_skin_tone": "👱🏻\u200d♀️", - "blond-haired_woman_medium-dark_skin_tone": "👱🏾\u200d♀️", - "blond-haired_woman_medium-light_skin_tone": "👱🏼\u200d♀️", - "blond-haired_woman_medium_skin_tone": "👱🏽\u200d♀️", - "blossom": "🌼", - "blowfish": "🐡", - "blue_book": "📘", - "blue_circle": "🔵", - "blue_heart": "💙", - "blue_square": "🟦", - "boar": "🐗", - "bomb": "💣", - "bone": "🦴", - "bookmark": "🔖", - "bookmark_tabs": "📑", - "books": "📚", - "bottle_with_popping_cork": "🍾", - "bouquet": "💐", - "bow_and_arrow": "🏹", - "bowl_with_spoon": "🥣", - "bowling": "🎳", - "boxing_glove": "🥊", - "boy": "👦", - "boy_dark_skin_tone": "👦🏿", - "boy_light_skin_tone": "👦🏻", - "boy_medium-dark_skin_tone": "👦🏾", - "boy_medium-light_skin_tone": "👦🏼", - "boy_medium_skin_tone": "👦🏽", - "brain": "🧠", - "bread": "🍞", - "breast-feeding": "🤱", - "breast-feeding_dark_skin_tone": "🤱🏿", - "breast-feeding_light_skin_tone": "🤱🏻", - "breast-feeding_medium-dark_skin_tone": "🤱🏾", - "breast-feeding_medium-light_skin_tone": "🤱🏼", - "breast-feeding_medium_skin_tone": "🤱🏽", - "brick": "🧱", - "bride_with_veil": "👰", - "bride_with_veil_dark_skin_tone": "👰🏿", - "bride_with_veil_light_skin_tone": "👰🏻", - "bride_with_veil_medium-dark_skin_tone": "👰🏾", - "bride_with_veil_medium-light_skin_tone": "👰🏼", - "bride_with_veil_medium_skin_tone": "👰🏽", - "bridge_at_night": "🌉", - "briefcase": "💼", - "briefs": "🩲", - "bright_button": "🔆", - "broccoli": "🥦", - "broken_heart": "💔", - "broom": "🧹", - "brown_circle": "🟤", - "brown_heart": "🤎", - "brown_square": "🟫", - "bug": "🐛", - "building_construction": "🏗", - "bullet_train": "🚅", - "burrito": "🌯", - "bus": "🚌", - "bus_stop": "🚏", - "bust_in_silhouette": "👤", - "busts_in_silhouette": "👥", - "butter": "🧈", - "butterfly": "🦋", - "cactus": "🌵", - "calendar": "📆", - "call_me_hand": "🤙", - "call_me_hand_dark_skin_tone": "🤙🏿", - "call_me_hand_light_skin_tone": "🤙🏻", - "call_me_hand_medium-dark_skin_tone": "🤙🏾", - "call_me_hand_medium-light_skin_tone": "🤙🏼", - "call_me_hand_medium_skin_tone": "🤙🏽", - "camel": "🐫", - "camera": "📷", - "camera_with_flash": "📸", - "camping": "🏕", - "candle": "🕯", - "candy": "🍬", - "canned_food": "🥫", - "canoe": "🛶", - "card_file_box": "🗃", - "card_index": "📇", - "card_index_dividers": "🗂", - "carousel_horse": "🎠", - "carp_streamer": "🎏", - "carrot": "🥕", - "castle": "🏰", - "cat": "🐱", - "cat_face": "🐱", - "cat_face_with_tears_of_joy": "😹", - "cat_face_with_wry_smile": "😼", - "chains": "⛓", - "chair": "🪑", - "chart_decreasing": "📉", - "chart_increasing": "📈", - "chart_increasing_with_yen": "💹", - "cheese_wedge": "🧀", - "chequered_flag": "🏁", - "cherries": "🍒", - "cherry_blossom": "🌸", - "chess_pawn": "♟", - "chestnut": "🌰", - "chicken": "🐔", - "child": "🧒", - "child_dark_skin_tone": "🧒🏿", - "child_light_skin_tone": "🧒🏻", - "child_medium-dark_skin_tone": "🧒🏾", - "child_medium-light_skin_tone": "🧒🏼", - "child_medium_skin_tone": "🧒🏽", - "children_crossing": "🚸", - "chipmunk": "🐿", - "chocolate_bar": "🍫", - "chopsticks": "🥢", - "church": "⛪", - "cigarette": "🚬", - "cinema": "🎦", - "circled_m": "Ⓜ", - "circus_tent": "🎪", - "cityscape": "🏙", - "cityscape_at_dusk": "🌆", - "clamp": "🗜", - "clapper_board": "🎬", - "clapping_hands": "👏", - "clapping_hands_dark_skin_tone": "👏🏿", - "clapping_hands_light_skin_tone": "👏🏻", - "clapping_hands_medium-dark_skin_tone": "👏🏾", - "clapping_hands_medium-light_skin_tone": "👏🏼", - "clapping_hands_medium_skin_tone": "👏🏽", - "classical_building": "🏛", - "clinking_beer_mugs": "🍻", - "clinking_glasses": "🥂", - "clipboard": "📋", - "clockwise_vertical_arrows": "🔃", - "closed_book": "📕", - "closed_mailbox_with_lowered_flag": "📪", - "closed_mailbox_with_raised_flag": "📫", - "closed_umbrella": "🌂", - "cloud": "☁", - "cloud_with_lightning": "🌩", - "cloud_with_lightning_and_rain": "⛈", - "cloud_with_rain": "🌧", - "cloud_with_snow": "🌨", - "clown_face": "🤡", - "club_suit": "♣", - "clutch_bag": "👝", - "coat": "🧥", - "cocktail_glass": "🍸", - "coconut": "🥥", - "coffin": "⚰", - "cold_face": "🥶", - "collision": "💥", - "comet": "☄", - "compass": "🧭", - "computer_disk": "💽", - "computer_mouse": "🖱", - "confetti_ball": "🎊", - "confounded_face": "😖", - "confused_face": "😕", - "construction": "🚧", - "construction_worker": "👷", - "construction_worker_dark_skin_tone": "👷🏿", - "construction_worker_light_skin_tone": "👷🏻", - "construction_worker_medium-dark_skin_tone": "👷🏾", - "construction_worker_medium-light_skin_tone": "👷🏼", - "construction_worker_medium_skin_tone": "👷🏽", - "control_knobs": "🎛", - "convenience_store": "🏪", - "cooked_rice": "🍚", - "cookie": "🍪", - "cooking": "🍳", - "copyright": "©", - "couch_and_lamp": "🛋", - "counterclockwise_arrows_button": "🔄", - "couple_with_heart": "💑", - "couple_with_heart_man_man": "👨\u200d❤️\u200d👨", - "couple_with_heart_woman_man": "👩\u200d❤️\u200d👨", - "couple_with_heart_woman_woman": "👩\u200d❤️\u200d👩", - "cow": "🐮", - "cow_face": "🐮", - "cowboy_hat_face": "🤠", - "crab": "🦀", - "crayon": "🖍", - "credit_card": "💳", - "crescent_moon": "🌙", - "cricket": "🦗", - "cricket_game": "🏏", - "crocodile": "🐊", - "croissant": "🥐", - "cross_mark": "❌", - "cross_mark_button": "❎", - "crossed_fingers": "🤞", - "crossed_fingers_dark_skin_tone": "🤞🏿", - "crossed_fingers_light_skin_tone": "🤞🏻", - "crossed_fingers_medium-dark_skin_tone": "🤞🏾", - "crossed_fingers_medium-light_skin_tone": "🤞🏼", - "crossed_fingers_medium_skin_tone": "🤞🏽", - "crossed_flags": "🎌", - "crossed_swords": "⚔", - "crown": "👑", - "crying_cat_face": "😿", - "crying_face": "😢", - "crystal_ball": "🔮", - "cucumber": "🥒", - "cupcake": "🧁", - "cup_with_straw": "🥤", - "curling_stone": "🥌", - "curly_hair": "🦱", - "curly-haired_man": "👨\u200d🦱", - "curly-haired_woman": "👩\u200d🦱", - "curly_loop": "➰", - "currency_exchange": "💱", - "curry_rice": "🍛", - "custard": "🍮", - "customs": "🛃", - "cut_of_meat": "🥩", - "cyclone": "🌀", - "dagger": "🗡", - "dango": "🍡", - "dashing_away": "💨", - "deaf_person": "🧏", - "deciduous_tree": "🌳", - "deer": "🦌", - "delivery_truck": "🚚", - "department_store": "🏬", - "derelict_house": "🏚", - "desert": "🏜", - "desert_island": "🏝", - "desktop_computer": "🖥", - "detective": "🕵", - "detective_dark_skin_tone": "🕵🏿", - "detective_light_skin_tone": "🕵🏻", - "detective_medium-dark_skin_tone": "🕵🏾", - "detective_medium-light_skin_tone": "🕵🏼", - "detective_medium_skin_tone": "🕵🏽", - "diamond_suit": "♦", - "diamond_with_a_dot": "💠", - "dim_button": "🔅", - "direct_hit": "🎯", - "disappointed_face": "😞", - "diving_mask": "🤿", - "diya_lamp": "🪔", - "dizzy": "💫", - "dizzy_face": "😵", - "dna": "🧬", - "dog": "🐶", - "dog_face": "🐶", - "dollar_banknote": "💵", - "dolphin": "🐬", - "door": "🚪", - "dotted_six-pointed_star": "🔯", - "double_curly_loop": "➿", - "double_exclamation_mark": "‼", - "doughnut": "🍩", - "dove": "🕊", - "down-left_arrow": "↙", - "down-right_arrow": "↘", - "down_arrow": "⬇", - "downcast_face_with_sweat": "😓", - "downwards_button": "🔽", - "dragon": "🐉", - "dragon_face": "🐲", - "dress": "👗", - "drooling_face": "🤤", - "drop_of_blood": "🩸", - "droplet": "💧", - "drum": "🥁", - "duck": "🦆", - "dumpling": "🥟", - "dvd": "📀", - "e-mail": "📧", - "eagle": "🦅", - "ear": "👂", - "ear_dark_skin_tone": "👂🏿", - "ear_light_skin_tone": "👂🏻", - "ear_medium-dark_skin_tone": "👂🏾", - "ear_medium-light_skin_tone": "👂🏼", - "ear_medium_skin_tone": "👂🏽", - "ear_of_corn": "🌽", - "ear_with_hearing_aid": "🦻", - "egg": "🍳", - "eggplant": "🍆", - "eight-pointed_star": "✴", - "eight-spoked_asterisk": "✳", - "eight-thirty": "🕣", - "eight_o’clock": "🕗", - "eject_button": "⏏", - "electric_plug": "🔌", - "elephant": "🐘", - "eleven-thirty": "🕦", - "eleven_o’clock": "🕚", - "elf": "🧝", - "elf_dark_skin_tone": "🧝🏿", - "elf_light_skin_tone": "🧝🏻", - "elf_medium-dark_skin_tone": "🧝🏾", - "elf_medium-light_skin_tone": "🧝🏼", - "elf_medium_skin_tone": "🧝🏽", - "envelope": "✉", - "envelope_with_arrow": "📩", - "euro_banknote": "💶", - "evergreen_tree": "🌲", - "ewe": "🐑", - "exclamation_mark": "❗", - "exclamation_question_mark": "⁉", - "exploding_head": "🤯", - "expressionless_face": "😑", - "eye": "👁", - "eye_in_speech_bubble": "👁️\u200d🗨️", - "eyes": "👀", - "face_blowing_a_kiss": "😘", - "face_savoring_food": "😋", - "face_screaming_in_fear": "😱", - "face_vomiting": "🤮", - "face_with_hand_over_mouth": "🤭", - "face_with_head-bandage": "🤕", - "face_with_medical_mask": "😷", - "face_with_monocle": "🧐", - "face_with_open_mouth": "😮", - "face_with_raised_eyebrow": "🤨", - "face_with_rolling_eyes": "🙄", - "face_with_steam_from_nose": "😤", - "face_with_symbols_on_mouth": "🤬", - "face_with_tears_of_joy": "😂", - "face_with_thermometer": "🤒", - "face_with_tongue": "😛", - "face_without_mouth": "😶", - "factory": "🏭", - "fairy": "🧚", - "fairy_dark_skin_tone": "🧚🏿", - "fairy_light_skin_tone": "🧚🏻", - "fairy_medium-dark_skin_tone": "🧚🏾", - "fairy_medium-light_skin_tone": "🧚🏼", - "fairy_medium_skin_tone": "🧚🏽", - "falafel": "🧆", - "fallen_leaf": "🍂", - "family": "👪", - "family_man_boy": "👨\u200d👦", - "family_man_boy_boy": "👨\u200d👦\u200d👦", - "family_man_girl": "👨\u200d👧", - "family_man_girl_boy": "👨\u200d👧\u200d👦", - "family_man_girl_girl": "👨\u200d👧\u200d👧", - "family_man_man_boy": "👨\u200d👨\u200d👦", - "family_man_man_boy_boy": "👨\u200d👨\u200d👦\u200d👦", - "family_man_man_girl": "👨\u200d👨\u200d👧", - "family_man_man_girl_boy": "👨\u200d👨\u200d👧\u200d👦", - "family_man_man_girl_girl": "👨\u200d👨\u200d👧\u200d👧", - "family_man_woman_boy": "👨\u200d👩\u200d👦", - "family_man_woman_boy_boy": "👨\u200d👩\u200d👦\u200d👦", - "family_man_woman_girl": "👨\u200d👩\u200d👧", - "family_man_woman_girl_boy": "👨\u200d👩\u200d👧\u200d👦", - "family_man_woman_girl_girl": "👨\u200d👩\u200d👧\u200d👧", - "family_woman_boy": "👩\u200d👦", - "family_woman_boy_boy": "👩\u200d👦\u200d👦", - "family_woman_girl": "👩\u200d👧", - "family_woman_girl_boy": "👩\u200d👧\u200d👦", - "family_woman_girl_girl": "👩\u200d👧\u200d👧", - "family_woman_woman_boy": "👩\u200d👩\u200d👦", - "family_woman_woman_boy_boy": "👩\u200d👩\u200d👦\u200d👦", - "family_woman_woman_girl": "👩\u200d👩\u200d👧", - "family_woman_woman_girl_boy": "👩\u200d👩\u200d👧\u200d👦", - "family_woman_woman_girl_girl": "👩\u200d👩\u200d👧\u200d👧", - "fast-forward_button": "⏩", - "fast_down_button": "⏬", - "fast_reverse_button": "⏪", - "fast_up_button": "⏫", - "fax_machine": "📠", - "fearful_face": "😨", - "female_sign": "♀", - "ferris_wheel": "🎡", - "ferry": "⛴", - "field_hockey": "🏑", - "file_cabinet": "🗄", - "file_folder": "📁", - "film_frames": "🎞", - "film_projector": "📽", - "fire": "🔥", - "fire_extinguisher": "🧯", - "firecracker": "🧨", - "fire_engine": "🚒", - "fireworks": "🎆", - "first_quarter_moon": "🌓", - "first_quarter_moon_face": "🌛", - "fish": "🐟", - "fish_cake_with_swirl": "🍥", - "fishing_pole": "🎣", - "five-thirty": "🕠", - "five_o’clock": "🕔", - "flag_in_hole": "⛳", - "flamingo": "🦩", - "flashlight": "🔦", - "flat_shoe": "🥿", - "fleur-de-lis": "⚜", - "flexed_biceps": "💪", - "flexed_biceps_dark_skin_tone": "💪🏿", - "flexed_biceps_light_skin_tone": "💪🏻", - "flexed_biceps_medium-dark_skin_tone": "💪🏾", - "flexed_biceps_medium-light_skin_tone": "💪🏼", - "flexed_biceps_medium_skin_tone": "💪🏽", - "floppy_disk": "💾", - "flower_playing_cards": "🎴", - "flushed_face": "😳", - "flying_disc": "🥏", - "flying_saucer": "🛸", - "fog": "🌫", - "foggy": "🌁", - "folded_hands": "🙏", - "folded_hands_dark_skin_tone": "🙏🏿", - "folded_hands_light_skin_tone": "🙏🏻", - "folded_hands_medium-dark_skin_tone": "🙏🏾", - "folded_hands_medium-light_skin_tone": "🙏🏼", - "folded_hands_medium_skin_tone": "🙏🏽", - "foot": "🦶", - "footprints": "👣", - "fork_and_knife": "🍴", - "fork_and_knife_with_plate": "🍽", - "fortune_cookie": "🥠", - "fountain": "⛲", - "fountain_pen": "🖋", - "four-thirty": "🕟", - "four_leaf_clover": "🍀", - "four_o’clock": "🕓", - "fox_face": "🦊", - "framed_picture": "🖼", - "french_fries": "🍟", - "fried_shrimp": "🍤", - "frog_face": "🐸", - "front-facing_baby_chick": "🐥", - "frowning_face": "☹", - "frowning_face_with_open_mouth": "😦", - "fuel_pump": "⛽", - "full_moon": "🌕", - "full_moon_face": "🌝", - "funeral_urn": "⚱", - "game_die": "🎲", - "garlic": "🧄", - "gear": "⚙", - "gem_stone": "💎", - "genie": "🧞", - "ghost": "👻", - "giraffe": "🦒", - "girl": "👧", - "girl_dark_skin_tone": "👧🏿", - "girl_light_skin_tone": "👧🏻", - "girl_medium-dark_skin_tone": "👧🏾", - "girl_medium-light_skin_tone": "👧🏼", - "girl_medium_skin_tone": "👧🏽", - "glass_of_milk": "🥛", - "glasses": "👓", - "globe_showing_americas": "🌎", - "globe_showing_asia-australia": "🌏", - "globe_showing_europe-africa": "🌍", - "globe_with_meridians": "🌐", - "gloves": "🧤", - "glowing_star": "🌟", - "goal_net": "🥅", - "goat": "🐐", - "goblin": "👺", - "goggles": "🥽", - "gorilla": "🦍", - "graduation_cap": "🎓", - "grapes": "🍇", - "green_apple": "🍏", - "green_book": "📗", - "green_circle": "🟢", - "green_heart": "💚", - "green_salad": "🥗", - "green_square": "🟩", - "grimacing_face": "😬", - "grinning_cat_face": "😺", - "grinning_cat_face_with_smiling_eyes": "😸", - "grinning_face": "😀", - "grinning_face_with_big_eyes": "😃", - "grinning_face_with_smiling_eyes": "😄", - "grinning_face_with_sweat": "😅", - "grinning_squinting_face": "😆", - "growing_heart": "💗", - "guard": "💂", - "guard_dark_skin_tone": "💂🏿", - "guard_light_skin_tone": "💂🏻", - "guard_medium-dark_skin_tone": "💂🏾", - "guard_medium-light_skin_tone": "💂🏼", - "guard_medium_skin_tone": "💂🏽", - "guide_dog": "🦮", - "guitar": "🎸", - "hamburger": "🍔", - "hammer": "🔨", - "hammer_and_pick": "⚒", - "hammer_and_wrench": "🛠", - "hamster_face": "🐹", - "hand_with_fingers_splayed": "🖐", - "hand_with_fingers_splayed_dark_skin_tone": "🖐🏿", - "hand_with_fingers_splayed_light_skin_tone": "🖐🏻", - "hand_with_fingers_splayed_medium-dark_skin_tone": "🖐🏾", - "hand_with_fingers_splayed_medium-light_skin_tone": "🖐🏼", - "hand_with_fingers_splayed_medium_skin_tone": "🖐🏽", - "handbag": "👜", - "handshake": "🤝", - "hatching_chick": "🐣", - "headphone": "🎧", - "hear-no-evil_monkey": "🙉", - "heart_decoration": "💟", - "heart_suit": "♥", - "heart_with_arrow": "💘", - "heart_with_ribbon": "💝", - "heavy_check_mark": "✔", - "heavy_division_sign": "➗", - "heavy_dollar_sign": "💲", - "heavy_heart_exclamation": "❣", - "heavy_large_circle": "⭕", - "heavy_minus_sign": "➖", - "heavy_multiplication_x": "✖", - "heavy_plus_sign": "➕", - "hedgehog": "🦔", - "helicopter": "🚁", - "herb": "🌿", - "hibiscus": "🌺", - "high-heeled_shoe": "👠", - "high-speed_train": "🚄", - "high_voltage": "⚡", - "hiking_boot": "🥾", - "hindu_temple": "🛕", - "hippopotamus": "🦛", - "hole": "🕳", - "honey_pot": "🍯", - "honeybee": "🐝", - "horizontal_traffic_light": "🚥", - "horse": "🐴", - "horse_face": "🐴", - "horse_racing": "🏇", - "horse_racing_dark_skin_tone": "🏇🏿", - "horse_racing_light_skin_tone": "🏇🏻", - "horse_racing_medium-dark_skin_tone": "🏇🏾", - "horse_racing_medium-light_skin_tone": "🏇🏼", - "horse_racing_medium_skin_tone": "🏇🏽", - "hospital": "🏥", - "hot_beverage": "☕", - "hot_dog": "🌭", - "hot_face": "🥵", - "hot_pepper": "🌶", - "hot_springs": "♨", - "hotel": "🏨", - "hourglass_done": "⌛", - "hourglass_not_done": "⏳", - "house": "🏠", - "house_with_garden": "🏡", - "houses": "🏘", - "hugging_face": "🤗", - "hundred_points": "💯", - "hushed_face": "😯", - "ice": "🧊", - "ice_cream": "🍨", - "ice_hockey": "🏒", - "ice_skate": "⛸", - "inbox_tray": "📥", - "incoming_envelope": "📨", - "index_pointing_up": "☝", - "index_pointing_up_dark_skin_tone": "☝🏿", - "index_pointing_up_light_skin_tone": "☝🏻", - "index_pointing_up_medium-dark_skin_tone": "☝🏾", - "index_pointing_up_medium-light_skin_tone": "☝🏼", - "index_pointing_up_medium_skin_tone": "☝🏽", - "infinity": "♾", - "information": "ℹ", - "input_latin_letters": "🔤", - "input_latin_lowercase": "🔡", - "input_latin_uppercase": "🔠", - "input_numbers": "🔢", - "input_symbols": "🔣", - "jack-o-lantern": "🎃", - "jeans": "👖", - "jigsaw": "🧩", - "joker": "🃏", - "joystick": "🕹", - "kaaba": "🕋", - "kangaroo": "🦘", - "key": "🔑", - "keyboard": "⌨", - "keycap_#": "#️⃣", - "keycap_*": "*️⃣", - "keycap_0": "0️⃣", - "keycap_1": "1️⃣", - "keycap_10": "🔟", - "keycap_2": "2️⃣", - "keycap_3": "3️⃣", - "keycap_4": "4️⃣", - "keycap_5": "5️⃣", - "keycap_6": "6️⃣", - "keycap_7": "7️⃣", - "keycap_8": "8️⃣", - "keycap_9": "9️⃣", - "kick_scooter": "🛴", - "kimono": "👘", - "kiss": "💋", - "kiss_man_man": "👨\u200d❤️\u200d💋\u200d👨", - "kiss_mark": "💋", - "kiss_woman_man": "👩\u200d❤️\u200d💋\u200d👨", - "kiss_woman_woman": "👩\u200d❤️\u200d💋\u200d👩", - "kissing_cat_face": "😽", - "kissing_face": "😗", - "kissing_face_with_closed_eyes": "😚", - "kissing_face_with_smiling_eyes": "😙", - "kitchen_knife": "🔪", - "kite": "🪁", - "kiwi_fruit": "🥝", - "koala": "🐨", - "lab_coat": "🥼", - "label": "🏷", - "lacrosse": "🥍", - "lady_beetle": "🐞", - "laptop_computer": "💻", - "large_blue_diamond": "🔷", - "large_orange_diamond": "🔶", - "last_quarter_moon": "🌗", - "last_quarter_moon_face": "🌜", - "last_track_button": "⏮", - "latin_cross": "✝", - "leaf_fluttering_in_wind": "🍃", - "leafy_green": "🥬", - "ledger": "📒", - "left-facing_fist": "🤛", - "left-facing_fist_dark_skin_tone": "🤛🏿", - "left-facing_fist_light_skin_tone": "🤛🏻", - "left-facing_fist_medium-dark_skin_tone": "🤛🏾", - "left-facing_fist_medium-light_skin_tone": "🤛🏼", - "left-facing_fist_medium_skin_tone": "🤛🏽", - "left-right_arrow": "↔", - "left_arrow": "⬅", - "left_arrow_curving_right": "↪", - "left_luggage": "🛅", - "left_speech_bubble": "🗨", - "leg": "🦵", - "lemon": "🍋", - "leopard": "🐆", - "level_slider": "🎚", - "light_bulb": "💡", - "light_rail": "🚈", - "link": "🔗", - "linked_paperclips": "🖇", - "lion_face": "🦁", - "lipstick": "💄", - "litter_in_bin_sign": "🚮", - "lizard": "🦎", - "llama": "🦙", - "lobster": "🦞", - "locked": "🔒", - "locked_with_key": "🔐", - "locked_with_pen": "🔏", - "locomotive": "🚂", - "lollipop": "🍭", - "lotion_bottle": "🧴", - "loudly_crying_face": "😭", - "loudspeaker": "📢", - "love-you_gesture": "🤟", - "love-you_gesture_dark_skin_tone": "🤟🏿", - "love-you_gesture_light_skin_tone": "🤟🏻", - "love-you_gesture_medium-dark_skin_tone": "🤟🏾", - "love-you_gesture_medium-light_skin_tone": "🤟🏼", - "love-you_gesture_medium_skin_tone": "🤟🏽", - "love_hotel": "🏩", - "love_letter": "💌", - "luggage": "🧳", - "lying_face": "🤥", - "mage": "🧙", - "mage_dark_skin_tone": "🧙🏿", - "mage_light_skin_tone": "🧙🏻", - "mage_medium-dark_skin_tone": "🧙🏾", - "mage_medium-light_skin_tone": "🧙🏼", - "mage_medium_skin_tone": "🧙🏽", - "magnet": "🧲", - "magnifying_glass_tilted_left": "🔍", - "magnifying_glass_tilted_right": "🔎", - "mahjong_red_dragon": "🀄", - "male_sign": "♂", - "man": "👨", - "man_and_woman_holding_hands": "👫", - "man_artist": "👨\u200d🎨", - "man_artist_dark_skin_tone": "👨🏿\u200d🎨", - "man_artist_light_skin_tone": "👨🏻\u200d🎨", - "man_artist_medium-dark_skin_tone": "👨🏾\u200d🎨", - "man_artist_medium-light_skin_tone": "👨🏼\u200d🎨", - "man_artist_medium_skin_tone": "👨🏽\u200d🎨", - "man_astronaut": "👨\u200d🚀", - "man_astronaut_dark_skin_tone": "👨🏿\u200d🚀", - "man_astronaut_light_skin_tone": "👨🏻\u200d🚀", - "man_astronaut_medium-dark_skin_tone": "👨🏾\u200d🚀", - "man_astronaut_medium-light_skin_tone": "👨🏼\u200d🚀", - "man_astronaut_medium_skin_tone": "👨🏽\u200d🚀", - "man_biking": "🚴\u200d♂️", - "man_biking_dark_skin_tone": "🚴🏿\u200d♂️", - "man_biking_light_skin_tone": "🚴🏻\u200d♂️", - "man_biking_medium-dark_skin_tone": "🚴🏾\u200d♂️", - "man_biking_medium-light_skin_tone": "🚴🏼\u200d♂️", - "man_biking_medium_skin_tone": "🚴🏽\u200d♂️", - "man_bouncing_ball": "⛹️\u200d♂️", - "man_bouncing_ball_dark_skin_tone": "⛹🏿\u200d♂️", - "man_bouncing_ball_light_skin_tone": "⛹🏻\u200d♂️", - "man_bouncing_ball_medium-dark_skin_tone": "⛹🏾\u200d♂️", - "man_bouncing_ball_medium-light_skin_tone": "⛹🏼\u200d♂️", - "man_bouncing_ball_medium_skin_tone": "⛹🏽\u200d♂️", - "man_bowing": "🙇\u200d♂️", - "man_bowing_dark_skin_tone": "🙇🏿\u200d♂️", - "man_bowing_light_skin_tone": "🙇🏻\u200d♂️", - "man_bowing_medium-dark_skin_tone": "🙇🏾\u200d♂️", - "man_bowing_medium-light_skin_tone": "🙇🏼\u200d♂️", - "man_bowing_medium_skin_tone": "🙇🏽\u200d♂️", - "man_cartwheeling": "🤸\u200d♂️", - "man_cartwheeling_dark_skin_tone": "🤸🏿\u200d♂️", - "man_cartwheeling_light_skin_tone": "🤸🏻\u200d♂️", - "man_cartwheeling_medium-dark_skin_tone": "🤸🏾\u200d♂️", - "man_cartwheeling_medium-light_skin_tone": "🤸🏼\u200d♂️", - "man_cartwheeling_medium_skin_tone": "🤸🏽\u200d♂️", - "man_climbing": "🧗\u200d♂️", - "man_climbing_dark_skin_tone": "🧗🏿\u200d♂️", - "man_climbing_light_skin_tone": "🧗🏻\u200d♂️", - "man_climbing_medium-dark_skin_tone": "🧗🏾\u200d♂️", - "man_climbing_medium-light_skin_tone": "🧗🏼\u200d♂️", - "man_climbing_medium_skin_tone": "🧗🏽\u200d♂️", - "man_construction_worker": "👷\u200d♂️", - "man_construction_worker_dark_skin_tone": "👷🏿\u200d♂️", - "man_construction_worker_light_skin_tone": "👷🏻\u200d♂️", - "man_construction_worker_medium-dark_skin_tone": "👷🏾\u200d♂️", - "man_construction_worker_medium-light_skin_tone": "👷🏼\u200d♂️", - "man_construction_worker_medium_skin_tone": "👷🏽\u200d♂️", - "man_cook": "👨\u200d🍳", - "man_cook_dark_skin_tone": "👨🏿\u200d🍳", - "man_cook_light_skin_tone": "👨🏻\u200d🍳", - "man_cook_medium-dark_skin_tone": "👨🏾\u200d🍳", - "man_cook_medium-light_skin_tone": "👨🏼\u200d🍳", - "man_cook_medium_skin_tone": "👨🏽\u200d🍳", - "man_dancing": "🕺", - "man_dancing_dark_skin_tone": "🕺🏿", - "man_dancing_light_skin_tone": "🕺🏻", - "man_dancing_medium-dark_skin_tone": "🕺🏾", - "man_dancing_medium-light_skin_tone": "🕺🏼", - "man_dancing_medium_skin_tone": "🕺🏽", - "man_dark_skin_tone": "👨🏿", - "man_detective": "🕵️\u200d♂️", - "man_detective_dark_skin_tone": "🕵🏿\u200d♂️", - "man_detective_light_skin_tone": "🕵🏻\u200d♂️", - "man_detective_medium-dark_skin_tone": "🕵🏾\u200d♂️", - "man_detective_medium-light_skin_tone": "🕵🏼\u200d♂️", - "man_detective_medium_skin_tone": "🕵🏽\u200d♂️", - "man_elf": "🧝\u200d♂️", - "man_elf_dark_skin_tone": "🧝🏿\u200d♂️", - "man_elf_light_skin_tone": "🧝🏻\u200d♂️", - "man_elf_medium-dark_skin_tone": "🧝🏾\u200d♂️", - "man_elf_medium-light_skin_tone": "🧝🏼\u200d♂️", - "man_elf_medium_skin_tone": "🧝🏽\u200d♂️", - "man_facepalming": "🤦\u200d♂️", - "man_facepalming_dark_skin_tone": "🤦🏿\u200d♂️", - "man_facepalming_light_skin_tone": "🤦🏻\u200d♂️", - "man_facepalming_medium-dark_skin_tone": "🤦🏾\u200d♂️", - "man_facepalming_medium-light_skin_tone": "🤦🏼\u200d♂️", - "man_facepalming_medium_skin_tone": "🤦🏽\u200d♂️", - "man_factory_worker": "👨\u200d🏭", - "man_factory_worker_dark_skin_tone": "👨🏿\u200d🏭", - "man_factory_worker_light_skin_tone": "👨🏻\u200d🏭", - "man_factory_worker_medium-dark_skin_tone": "👨🏾\u200d🏭", - "man_factory_worker_medium-light_skin_tone": "👨🏼\u200d🏭", - "man_factory_worker_medium_skin_tone": "👨🏽\u200d🏭", - "man_fairy": "🧚\u200d♂️", - "man_fairy_dark_skin_tone": "🧚🏿\u200d♂️", - "man_fairy_light_skin_tone": "🧚🏻\u200d♂️", - "man_fairy_medium-dark_skin_tone": "🧚🏾\u200d♂️", - "man_fairy_medium-light_skin_tone": "🧚🏼\u200d♂️", - "man_fairy_medium_skin_tone": "🧚🏽\u200d♂️", - "man_farmer": "👨\u200d🌾", - "man_farmer_dark_skin_tone": "👨🏿\u200d🌾", - "man_farmer_light_skin_tone": "👨🏻\u200d🌾", - "man_farmer_medium-dark_skin_tone": "👨🏾\u200d🌾", - "man_farmer_medium-light_skin_tone": "👨🏼\u200d🌾", - "man_farmer_medium_skin_tone": "👨🏽\u200d🌾", - "man_firefighter": "👨\u200d🚒", - "man_firefighter_dark_skin_tone": "👨🏿\u200d🚒", - "man_firefighter_light_skin_tone": "👨🏻\u200d🚒", - "man_firefighter_medium-dark_skin_tone": "👨🏾\u200d🚒", - "man_firefighter_medium-light_skin_tone": "👨🏼\u200d🚒", - "man_firefighter_medium_skin_tone": "👨🏽\u200d🚒", - "man_frowning": "🙍\u200d♂️", - "man_frowning_dark_skin_tone": "🙍🏿\u200d♂️", - "man_frowning_light_skin_tone": "🙍🏻\u200d♂️", - "man_frowning_medium-dark_skin_tone": "🙍🏾\u200d♂️", - "man_frowning_medium-light_skin_tone": "🙍🏼\u200d♂️", - "man_frowning_medium_skin_tone": "🙍🏽\u200d♂️", - "man_genie": "🧞\u200d♂️", - "man_gesturing_no": "🙅\u200d♂️", - "man_gesturing_no_dark_skin_tone": "🙅🏿\u200d♂️", - "man_gesturing_no_light_skin_tone": "🙅🏻\u200d♂️", - "man_gesturing_no_medium-dark_skin_tone": "🙅🏾\u200d♂️", - "man_gesturing_no_medium-light_skin_tone": "🙅🏼\u200d♂️", - "man_gesturing_no_medium_skin_tone": "🙅🏽\u200d♂️", - "man_gesturing_ok": "🙆\u200d♂️", - "man_gesturing_ok_dark_skin_tone": "🙆🏿\u200d♂️", - "man_gesturing_ok_light_skin_tone": "🙆🏻\u200d♂️", - "man_gesturing_ok_medium-dark_skin_tone": "🙆🏾\u200d♂️", - "man_gesturing_ok_medium-light_skin_tone": "🙆🏼\u200d♂️", - "man_gesturing_ok_medium_skin_tone": "🙆🏽\u200d♂️", - "man_getting_haircut": "💇\u200d♂️", - "man_getting_haircut_dark_skin_tone": "💇🏿\u200d♂️", - "man_getting_haircut_light_skin_tone": "💇🏻\u200d♂️", - "man_getting_haircut_medium-dark_skin_tone": "💇🏾\u200d♂️", - "man_getting_haircut_medium-light_skin_tone": "💇🏼\u200d♂️", - "man_getting_haircut_medium_skin_tone": "💇🏽\u200d♂️", - "man_getting_massage": "💆\u200d♂️", - "man_getting_massage_dark_skin_tone": "💆🏿\u200d♂️", - "man_getting_massage_light_skin_tone": "💆🏻\u200d♂️", - "man_getting_massage_medium-dark_skin_tone": "💆🏾\u200d♂️", - "man_getting_massage_medium-light_skin_tone": "💆🏼\u200d♂️", - "man_getting_massage_medium_skin_tone": "💆🏽\u200d♂️", - "man_golfing": "🏌️\u200d♂️", - "man_golfing_dark_skin_tone": "🏌🏿\u200d♂️", - "man_golfing_light_skin_tone": "🏌🏻\u200d♂️", - "man_golfing_medium-dark_skin_tone": "🏌🏾\u200d♂️", - "man_golfing_medium-light_skin_tone": "🏌🏼\u200d♂️", - "man_golfing_medium_skin_tone": "🏌🏽\u200d♂️", - "man_guard": "💂\u200d♂️", - "man_guard_dark_skin_tone": "💂🏿\u200d♂️", - "man_guard_light_skin_tone": "💂🏻\u200d♂️", - "man_guard_medium-dark_skin_tone": "💂🏾\u200d♂️", - "man_guard_medium-light_skin_tone": "💂🏼\u200d♂️", - "man_guard_medium_skin_tone": "💂🏽\u200d♂️", - "man_health_worker": "👨\u200d⚕️", - "man_health_worker_dark_skin_tone": "👨🏿\u200d⚕️", - "man_health_worker_light_skin_tone": "👨🏻\u200d⚕️", - "man_health_worker_medium-dark_skin_tone": "👨🏾\u200d⚕️", - "man_health_worker_medium-light_skin_tone": "👨🏼\u200d⚕️", - "man_health_worker_medium_skin_tone": "👨🏽\u200d⚕️", - "man_in_lotus_position": "🧘\u200d♂️", - "man_in_lotus_position_dark_skin_tone": "🧘🏿\u200d♂️", - "man_in_lotus_position_light_skin_tone": "🧘🏻\u200d♂️", - "man_in_lotus_position_medium-dark_skin_tone": "🧘🏾\u200d♂️", - "man_in_lotus_position_medium-light_skin_tone": "🧘🏼\u200d♂️", - "man_in_lotus_position_medium_skin_tone": "🧘🏽\u200d♂️", - "man_in_manual_wheelchair": "👨\u200d🦽", - "man_in_motorized_wheelchair": "👨\u200d🦼", - "man_in_steamy_room": "🧖\u200d♂️", - "man_in_steamy_room_dark_skin_tone": "🧖🏿\u200d♂️", - "man_in_steamy_room_light_skin_tone": "🧖🏻\u200d♂️", - "man_in_steamy_room_medium-dark_skin_tone": "🧖🏾\u200d♂️", - "man_in_steamy_room_medium-light_skin_tone": "🧖🏼\u200d♂️", - "man_in_steamy_room_medium_skin_tone": "🧖🏽\u200d♂️", - "man_in_suit_levitating": "🕴", - "man_in_suit_levitating_dark_skin_tone": "🕴🏿", - "man_in_suit_levitating_light_skin_tone": "🕴🏻", - "man_in_suit_levitating_medium-dark_skin_tone": "🕴🏾", - "man_in_suit_levitating_medium-light_skin_tone": "🕴🏼", - "man_in_suit_levitating_medium_skin_tone": "🕴🏽", - "man_in_tuxedo": "🤵", - "man_in_tuxedo_dark_skin_tone": "🤵🏿", - "man_in_tuxedo_light_skin_tone": "🤵🏻", - "man_in_tuxedo_medium-dark_skin_tone": "🤵🏾", - "man_in_tuxedo_medium-light_skin_tone": "🤵🏼", - "man_in_tuxedo_medium_skin_tone": "🤵🏽", - "man_judge": "👨\u200d⚖️", - "man_judge_dark_skin_tone": "👨🏿\u200d⚖️", - "man_judge_light_skin_tone": "👨🏻\u200d⚖️", - "man_judge_medium-dark_skin_tone": "👨🏾\u200d⚖️", - "man_judge_medium-light_skin_tone": "👨🏼\u200d⚖️", - "man_judge_medium_skin_tone": "👨🏽\u200d⚖️", - "man_juggling": "🤹\u200d♂️", - "man_juggling_dark_skin_tone": "🤹🏿\u200d♂️", - "man_juggling_light_skin_tone": "🤹🏻\u200d♂️", - "man_juggling_medium-dark_skin_tone": "🤹🏾\u200d♂️", - "man_juggling_medium-light_skin_tone": "🤹🏼\u200d♂️", - "man_juggling_medium_skin_tone": "🤹🏽\u200d♂️", - "man_lifting_weights": "🏋️\u200d♂️", - "man_lifting_weights_dark_skin_tone": "🏋🏿\u200d♂️", - "man_lifting_weights_light_skin_tone": "🏋🏻\u200d♂️", - "man_lifting_weights_medium-dark_skin_tone": "🏋🏾\u200d♂️", - "man_lifting_weights_medium-light_skin_tone": "🏋🏼\u200d♂️", - "man_lifting_weights_medium_skin_tone": "🏋🏽\u200d♂️", - "man_light_skin_tone": "👨🏻", - "man_mage": "🧙\u200d♂️", - "man_mage_dark_skin_tone": "🧙🏿\u200d♂️", - "man_mage_light_skin_tone": "🧙🏻\u200d♂️", - "man_mage_medium-dark_skin_tone": "🧙🏾\u200d♂️", - "man_mage_medium-light_skin_tone": "🧙🏼\u200d♂️", - "man_mage_medium_skin_tone": "🧙🏽\u200d♂️", - "man_mechanic": "👨\u200d🔧", - "man_mechanic_dark_skin_tone": "👨🏿\u200d🔧", - "man_mechanic_light_skin_tone": "👨🏻\u200d🔧", - "man_mechanic_medium-dark_skin_tone": "👨🏾\u200d🔧", - "man_mechanic_medium-light_skin_tone": "👨🏼\u200d🔧", - "man_mechanic_medium_skin_tone": "👨🏽\u200d🔧", - "man_medium-dark_skin_tone": "👨🏾", - "man_medium-light_skin_tone": "👨🏼", - "man_medium_skin_tone": "👨🏽", - "man_mountain_biking": "🚵\u200d♂️", - "man_mountain_biking_dark_skin_tone": "🚵🏿\u200d♂️", - "man_mountain_biking_light_skin_tone": "🚵🏻\u200d♂️", - "man_mountain_biking_medium-dark_skin_tone": "🚵🏾\u200d♂️", - "man_mountain_biking_medium-light_skin_tone": "🚵🏼\u200d♂️", - "man_mountain_biking_medium_skin_tone": "🚵🏽\u200d♂️", - "man_office_worker": "👨\u200d💼", - "man_office_worker_dark_skin_tone": "👨🏿\u200d💼", - "man_office_worker_light_skin_tone": "👨🏻\u200d💼", - "man_office_worker_medium-dark_skin_tone": "👨🏾\u200d💼", - "man_office_worker_medium-light_skin_tone": "👨🏼\u200d💼", - "man_office_worker_medium_skin_tone": "👨🏽\u200d💼", - "man_pilot": "👨\u200d✈️", - "man_pilot_dark_skin_tone": "👨🏿\u200d✈️", - "man_pilot_light_skin_tone": "👨🏻\u200d✈️", - "man_pilot_medium-dark_skin_tone": "👨🏾\u200d✈️", - "man_pilot_medium-light_skin_tone": "👨🏼\u200d✈️", - "man_pilot_medium_skin_tone": "👨🏽\u200d✈️", - "man_playing_handball": "🤾\u200d♂️", - "man_playing_handball_dark_skin_tone": "🤾🏿\u200d♂️", - "man_playing_handball_light_skin_tone": "🤾🏻\u200d♂️", - "man_playing_handball_medium-dark_skin_tone": "🤾🏾\u200d♂️", - "man_playing_handball_medium-light_skin_tone": "🤾🏼\u200d♂️", - "man_playing_handball_medium_skin_tone": "🤾🏽\u200d♂️", - "man_playing_water_polo": "🤽\u200d♂️", - "man_playing_water_polo_dark_skin_tone": "🤽🏿\u200d♂️", - "man_playing_water_polo_light_skin_tone": "🤽🏻\u200d♂️", - "man_playing_water_polo_medium-dark_skin_tone": "🤽🏾\u200d♂️", - "man_playing_water_polo_medium-light_skin_tone": "🤽🏼\u200d♂️", - "man_playing_water_polo_medium_skin_tone": "🤽🏽\u200d♂️", - "man_police_officer": "👮\u200d♂️", - "man_police_officer_dark_skin_tone": "👮🏿\u200d♂️", - "man_police_officer_light_skin_tone": "👮🏻\u200d♂️", - "man_police_officer_medium-dark_skin_tone": "👮🏾\u200d♂️", - "man_police_officer_medium-light_skin_tone": "👮🏼\u200d♂️", - "man_police_officer_medium_skin_tone": "👮🏽\u200d♂️", - "man_pouting": "🙎\u200d♂️", - "man_pouting_dark_skin_tone": "🙎🏿\u200d♂️", - "man_pouting_light_skin_tone": "🙎🏻\u200d♂️", - "man_pouting_medium-dark_skin_tone": "🙎🏾\u200d♂️", - "man_pouting_medium-light_skin_tone": "🙎🏼\u200d♂️", - "man_pouting_medium_skin_tone": "🙎🏽\u200d♂️", - "man_raising_hand": "🙋\u200d♂️", - "man_raising_hand_dark_skin_tone": "🙋🏿\u200d♂️", - "man_raising_hand_light_skin_tone": "🙋🏻\u200d♂️", - "man_raising_hand_medium-dark_skin_tone": "🙋🏾\u200d♂️", - "man_raising_hand_medium-light_skin_tone": "🙋🏼\u200d♂️", - "man_raising_hand_medium_skin_tone": "🙋🏽\u200d♂️", - "man_rowing_boat": "🚣\u200d♂️", - "man_rowing_boat_dark_skin_tone": "🚣🏿\u200d♂️", - "man_rowing_boat_light_skin_tone": "🚣🏻\u200d♂️", - "man_rowing_boat_medium-dark_skin_tone": "🚣🏾\u200d♂️", - "man_rowing_boat_medium-light_skin_tone": "🚣🏼\u200d♂️", - "man_rowing_boat_medium_skin_tone": "🚣🏽\u200d♂️", - "man_running": "🏃\u200d♂️", - "man_running_dark_skin_tone": "🏃🏿\u200d♂️", - "man_running_light_skin_tone": "🏃🏻\u200d♂️", - "man_running_medium-dark_skin_tone": "🏃🏾\u200d♂️", - "man_running_medium-light_skin_tone": "🏃🏼\u200d♂️", - "man_running_medium_skin_tone": "🏃🏽\u200d♂️", - "man_scientist": "👨\u200d🔬", - "man_scientist_dark_skin_tone": "👨🏿\u200d🔬", - "man_scientist_light_skin_tone": "👨🏻\u200d🔬", - "man_scientist_medium-dark_skin_tone": "👨🏾\u200d🔬", - "man_scientist_medium-light_skin_tone": "👨🏼\u200d🔬", - "man_scientist_medium_skin_tone": "👨🏽\u200d🔬", - "man_shrugging": "🤷\u200d♂️", - "man_shrugging_dark_skin_tone": "🤷🏿\u200d♂️", - "man_shrugging_light_skin_tone": "🤷🏻\u200d♂️", - "man_shrugging_medium-dark_skin_tone": "🤷🏾\u200d♂️", - "man_shrugging_medium-light_skin_tone": "🤷🏼\u200d♂️", - "man_shrugging_medium_skin_tone": "🤷🏽\u200d♂️", - "man_singer": "👨\u200d🎤", - "man_singer_dark_skin_tone": "👨🏿\u200d🎤", - "man_singer_light_skin_tone": "👨🏻\u200d🎤", - "man_singer_medium-dark_skin_tone": "👨🏾\u200d🎤", - "man_singer_medium-light_skin_tone": "👨🏼\u200d🎤", - "man_singer_medium_skin_tone": "👨🏽\u200d🎤", - "man_student": "👨\u200d🎓", - "man_student_dark_skin_tone": "👨🏿\u200d🎓", - "man_student_light_skin_tone": "👨🏻\u200d🎓", - "man_student_medium-dark_skin_tone": "👨🏾\u200d🎓", - "man_student_medium-light_skin_tone": "👨🏼\u200d🎓", - "man_student_medium_skin_tone": "👨🏽\u200d🎓", - "man_surfing": "🏄\u200d♂️", - "man_surfing_dark_skin_tone": "🏄🏿\u200d♂️", - "man_surfing_light_skin_tone": "🏄🏻\u200d♂️", - "man_surfing_medium-dark_skin_tone": "🏄🏾\u200d♂️", - "man_surfing_medium-light_skin_tone": "🏄🏼\u200d♂️", - "man_surfing_medium_skin_tone": "🏄🏽\u200d♂️", - "man_swimming": "🏊\u200d♂️", - "man_swimming_dark_skin_tone": "🏊🏿\u200d♂️", - "man_swimming_light_skin_tone": "🏊🏻\u200d♂️", - "man_swimming_medium-dark_skin_tone": "🏊🏾\u200d♂️", - "man_swimming_medium-light_skin_tone": "🏊🏼\u200d♂️", - "man_swimming_medium_skin_tone": "🏊🏽\u200d♂️", - "man_teacher": "👨\u200d🏫", - "man_teacher_dark_skin_tone": "👨🏿\u200d🏫", - "man_teacher_light_skin_tone": "👨🏻\u200d🏫", - "man_teacher_medium-dark_skin_tone": "👨🏾\u200d🏫", - "man_teacher_medium-light_skin_tone": "👨🏼\u200d🏫", - "man_teacher_medium_skin_tone": "👨🏽\u200d🏫", - "man_technologist": "👨\u200d💻", - "man_technologist_dark_skin_tone": "👨🏿\u200d💻", - "man_technologist_light_skin_tone": "👨🏻\u200d💻", - "man_technologist_medium-dark_skin_tone": "👨🏾\u200d💻", - "man_technologist_medium-light_skin_tone": "👨🏼\u200d💻", - "man_technologist_medium_skin_tone": "👨🏽\u200d💻", - "man_tipping_hand": "💁\u200d♂️", - "man_tipping_hand_dark_skin_tone": "💁🏿\u200d♂️", - "man_tipping_hand_light_skin_tone": "💁🏻\u200d♂️", - "man_tipping_hand_medium-dark_skin_tone": "💁🏾\u200d♂️", - "man_tipping_hand_medium-light_skin_tone": "💁🏼\u200d♂️", - "man_tipping_hand_medium_skin_tone": "💁🏽\u200d♂️", - "man_vampire": "🧛\u200d♂️", - "man_vampire_dark_skin_tone": "🧛🏿\u200d♂️", - "man_vampire_light_skin_tone": "🧛🏻\u200d♂️", - "man_vampire_medium-dark_skin_tone": "🧛🏾\u200d♂️", - "man_vampire_medium-light_skin_tone": "🧛🏼\u200d♂️", - "man_vampire_medium_skin_tone": "🧛🏽\u200d♂️", - "man_walking": "🚶\u200d♂️", - "man_walking_dark_skin_tone": "🚶🏿\u200d♂️", - "man_walking_light_skin_tone": "🚶🏻\u200d♂️", - "man_walking_medium-dark_skin_tone": "🚶🏾\u200d♂️", - "man_walking_medium-light_skin_tone": "🚶🏼\u200d♂️", - "man_walking_medium_skin_tone": "🚶🏽\u200d♂️", - "man_wearing_turban": "👳\u200d♂️", - "man_wearing_turban_dark_skin_tone": "👳🏿\u200d♂️", - "man_wearing_turban_light_skin_tone": "👳🏻\u200d♂️", - "man_wearing_turban_medium-dark_skin_tone": "👳🏾\u200d♂️", - "man_wearing_turban_medium-light_skin_tone": "👳🏼\u200d♂️", - "man_wearing_turban_medium_skin_tone": "👳🏽\u200d♂️", - "man_with_probing_cane": "👨\u200d🦯", - "man_with_chinese_cap": "👲", - "man_with_chinese_cap_dark_skin_tone": "👲🏿", - "man_with_chinese_cap_light_skin_tone": "👲🏻", - "man_with_chinese_cap_medium-dark_skin_tone": "👲🏾", - "man_with_chinese_cap_medium-light_skin_tone": "👲🏼", - "man_with_chinese_cap_medium_skin_tone": "👲🏽", - "man_zombie": "🧟\u200d♂️", - "mango": "🥭", - "mantelpiece_clock": "🕰", - "manual_wheelchair": "🦽", - "man’s_shoe": "👞", - "map_of_japan": "🗾", - "maple_leaf": "🍁", - "martial_arts_uniform": "🥋", - "mate": "🧉", - "meat_on_bone": "🍖", - "mechanical_arm": "🦾", - "mechanical_leg": "🦿", - "medical_symbol": "⚕", - "megaphone": "📣", - "melon": "🍈", - "memo": "📝", - "men_with_bunny_ears": "👯\u200d♂️", - "men_wrestling": "🤼\u200d♂️", - "menorah": "🕎", - "men’s_room": "🚹", - "mermaid": "🧜\u200d♀️", - "mermaid_dark_skin_tone": "🧜🏿\u200d♀️", - "mermaid_light_skin_tone": "🧜🏻\u200d♀️", - "mermaid_medium-dark_skin_tone": "🧜🏾\u200d♀️", - "mermaid_medium-light_skin_tone": "🧜🏼\u200d♀️", - "mermaid_medium_skin_tone": "🧜🏽\u200d♀️", - "merman": "🧜\u200d♂️", - "merman_dark_skin_tone": "🧜🏿\u200d♂️", - "merman_light_skin_tone": "🧜🏻\u200d♂️", - "merman_medium-dark_skin_tone": "🧜🏾\u200d♂️", - "merman_medium-light_skin_tone": "🧜🏼\u200d♂️", - "merman_medium_skin_tone": "🧜🏽\u200d♂️", - "merperson": "🧜", - "merperson_dark_skin_tone": "🧜🏿", - "merperson_light_skin_tone": "🧜🏻", - "merperson_medium-dark_skin_tone": "🧜🏾", - "merperson_medium-light_skin_tone": "🧜🏼", - "merperson_medium_skin_tone": "🧜🏽", - "metro": "🚇", - "microbe": "🦠", - "microphone": "🎤", - "microscope": "🔬", - "middle_finger": "🖕", - "middle_finger_dark_skin_tone": "🖕🏿", - "middle_finger_light_skin_tone": "🖕🏻", - "middle_finger_medium-dark_skin_tone": "🖕🏾", - "middle_finger_medium-light_skin_tone": "🖕🏼", - "middle_finger_medium_skin_tone": "🖕🏽", - "military_medal": "🎖", - "milky_way": "🌌", - "minibus": "🚐", - "moai": "🗿", - "mobile_phone": "📱", - "mobile_phone_off": "📴", - "mobile_phone_with_arrow": "📲", - "money-mouth_face": "🤑", - "money_bag": "💰", - "money_with_wings": "💸", - "monkey": "🐒", - "monkey_face": "🐵", - "monorail": "🚝", - "moon_cake": "🥮", - "moon_viewing_ceremony": "🎑", - "mosque": "🕌", - "mosquito": "🦟", - "motor_boat": "🛥", - "motor_scooter": "🛵", - "motorcycle": "🏍", - "motorized_wheelchair": "🦼", - "motorway": "🛣", - "mount_fuji": "🗻", - "mountain": "⛰", - "mountain_cableway": "🚠", - "mountain_railway": "🚞", - "mouse": "🐭", - "mouse_face": "🐭", - "mouth": "👄", - "movie_camera": "🎥", - "mushroom": "🍄", - "musical_keyboard": "🎹", - "musical_note": "🎵", - "musical_notes": "🎶", - "musical_score": "🎼", - "muted_speaker": "🔇", - "nail_polish": "💅", - "nail_polish_dark_skin_tone": "💅🏿", - "nail_polish_light_skin_tone": "💅🏻", - "nail_polish_medium-dark_skin_tone": "💅🏾", - "nail_polish_medium-light_skin_tone": "💅🏼", - "nail_polish_medium_skin_tone": "💅🏽", - "name_badge": "📛", - "national_park": "🏞", - "nauseated_face": "🤢", - "nazar_amulet": "🧿", - "necktie": "👔", - "nerd_face": "🤓", - "neutral_face": "😐", - "new_moon": "🌑", - "new_moon_face": "🌚", - "newspaper": "📰", - "next_track_button": "⏭", - "night_with_stars": "🌃", - "nine-thirty": "🕤", - "nine_o’clock": "🕘", - "no_bicycles": "🚳", - "no_entry": "⛔", - "no_littering": "🚯", - "no_mobile_phones": "📵", - "no_one_under_eighteen": "🔞", - "no_pedestrians": "🚷", - "no_smoking": "🚭", - "non-potable_water": "🚱", - "nose": "👃", - "nose_dark_skin_tone": "👃🏿", - "nose_light_skin_tone": "👃🏻", - "nose_medium-dark_skin_tone": "👃🏾", - "nose_medium-light_skin_tone": "👃🏼", - "nose_medium_skin_tone": "👃🏽", - "notebook": "📓", - "notebook_with_decorative_cover": "📔", - "nut_and_bolt": "🔩", - "octopus": "🐙", - "oden": "🍢", - "office_building": "🏢", - "ogre": "👹", - "oil_drum": "🛢", - "old_key": "🗝", - "old_man": "👴", - "old_man_dark_skin_tone": "👴🏿", - "old_man_light_skin_tone": "👴🏻", - "old_man_medium-dark_skin_tone": "👴🏾", - "old_man_medium-light_skin_tone": "👴🏼", - "old_man_medium_skin_tone": "👴🏽", - "old_woman": "👵", - "old_woman_dark_skin_tone": "👵🏿", - "old_woman_light_skin_tone": "👵🏻", - "old_woman_medium-dark_skin_tone": "👵🏾", - "old_woman_medium-light_skin_tone": "👵🏼", - "old_woman_medium_skin_tone": "👵🏽", - "older_adult": "🧓", - "older_adult_dark_skin_tone": "🧓🏿", - "older_adult_light_skin_tone": "🧓🏻", - "older_adult_medium-dark_skin_tone": "🧓🏾", - "older_adult_medium-light_skin_tone": "🧓🏼", - "older_adult_medium_skin_tone": "🧓🏽", - "om": "🕉", - "oncoming_automobile": "🚘", - "oncoming_bus": "🚍", - "oncoming_fist": "👊", - "oncoming_fist_dark_skin_tone": "👊🏿", - "oncoming_fist_light_skin_tone": "👊🏻", - "oncoming_fist_medium-dark_skin_tone": "👊🏾", - "oncoming_fist_medium-light_skin_tone": "👊🏼", - "oncoming_fist_medium_skin_tone": "👊🏽", - "oncoming_police_car": "🚔", - "oncoming_taxi": "🚖", - "one-piece_swimsuit": "🩱", - "one-thirty": "🕜", - "one_o’clock": "🕐", - "onion": "🧅", - "open_book": "📖", - "open_file_folder": "📂", - "open_hands": "👐", - "open_hands_dark_skin_tone": "👐🏿", - "open_hands_light_skin_tone": "👐🏻", - "open_hands_medium-dark_skin_tone": "👐🏾", - "open_hands_medium-light_skin_tone": "👐🏼", - "open_hands_medium_skin_tone": "👐🏽", - "open_mailbox_with_lowered_flag": "📭", - "open_mailbox_with_raised_flag": "📬", - "optical_disk": "💿", - "orange_book": "📙", - "orange_circle": "🟠", - "orange_heart": "🧡", - "orange_square": "🟧", - "orangutan": "🦧", - "orthodox_cross": "☦", - "otter": "🦦", - "outbox_tray": "📤", - "owl": "🦉", - "ox": "🐂", - "oyster": "🦪", - "package": "📦", - "page_facing_up": "📄", - "page_with_curl": "📃", - "pager": "📟", - "paintbrush": "🖌", - "palm_tree": "🌴", - "palms_up_together": "🤲", - "palms_up_together_dark_skin_tone": "🤲🏿", - "palms_up_together_light_skin_tone": "🤲🏻", - "palms_up_together_medium-dark_skin_tone": "🤲🏾", - "palms_up_together_medium-light_skin_tone": "🤲🏼", - "palms_up_together_medium_skin_tone": "🤲🏽", - "pancakes": "🥞", - "panda_face": "🐼", - "paperclip": "📎", - "parrot": "🦜", - "part_alternation_mark": "〽", - "party_popper": "🎉", - "partying_face": "🥳", - "passenger_ship": "🛳", - "passport_control": "🛂", - "pause_button": "⏸", - "paw_prints": "🐾", - "peace_symbol": "☮", - "peach": "🍑", - "peacock": "🦚", - "peanuts": "🥜", - "pear": "🍐", - "pen": "🖊", - "pencil": "📝", - "penguin": "🐧", - "pensive_face": "😔", - "people_holding_hands": "🧑\u200d🤝\u200d🧑", - "people_with_bunny_ears": "👯", - "people_wrestling": "🤼", - "performing_arts": "🎭", - "persevering_face": "😣", - "person_biking": "🚴", - "person_biking_dark_skin_tone": "🚴🏿", - "person_biking_light_skin_tone": "🚴🏻", - "person_biking_medium-dark_skin_tone": "🚴🏾", - "person_biking_medium-light_skin_tone": "🚴🏼", - "person_biking_medium_skin_tone": "🚴🏽", - "person_bouncing_ball": "⛹", - "person_bouncing_ball_dark_skin_tone": "⛹🏿", - "person_bouncing_ball_light_skin_tone": "⛹🏻", - "person_bouncing_ball_medium-dark_skin_tone": "⛹🏾", - "person_bouncing_ball_medium-light_skin_tone": "⛹🏼", - "person_bouncing_ball_medium_skin_tone": "⛹🏽", - "person_bowing": "🙇", - "person_bowing_dark_skin_tone": "🙇🏿", - "person_bowing_light_skin_tone": "🙇🏻", - "person_bowing_medium-dark_skin_tone": "🙇🏾", - "person_bowing_medium-light_skin_tone": "🙇🏼", - "person_bowing_medium_skin_tone": "🙇🏽", - "person_cartwheeling": "🤸", - "person_cartwheeling_dark_skin_tone": "🤸🏿", - "person_cartwheeling_light_skin_tone": "🤸🏻", - "person_cartwheeling_medium-dark_skin_tone": "🤸🏾", - "person_cartwheeling_medium-light_skin_tone": "🤸🏼", - "person_cartwheeling_medium_skin_tone": "🤸🏽", - "person_climbing": "🧗", - "person_climbing_dark_skin_tone": "🧗🏿", - "person_climbing_light_skin_tone": "🧗🏻", - "person_climbing_medium-dark_skin_tone": "🧗🏾", - "person_climbing_medium-light_skin_tone": "🧗🏼", - "person_climbing_medium_skin_tone": "🧗🏽", - "person_facepalming": "🤦", - "person_facepalming_dark_skin_tone": "🤦🏿", - "person_facepalming_light_skin_tone": "🤦🏻", - "person_facepalming_medium-dark_skin_tone": "🤦🏾", - "person_facepalming_medium-light_skin_tone": "🤦🏼", - "person_facepalming_medium_skin_tone": "🤦🏽", - "person_fencing": "🤺", - "person_frowning": "🙍", - "person_frowning_dark_skin_tone": "🙍🏿", - "person_frowning_light_skin_tone": "🙍🏻", - "person_frowning_medium-dark_skin_tone": "🙍🏾", - "person_frowning_medium-light_skin_tone": "🙍🏼", - "person_frowning_medium_skin_tone": "🙍🏽", - "person_gesturing_no": "🙅", - "person_gesturing_no_dark_skin_tone": "🙅🏿", - "person_gesturing_no_light_skin_tone": "🙅🏻", - "person_gesturing_no_medium-dark_skin_tone": "🙅🏾", - "person_gesturing_no_medium-light_skin_tone": "🙅🏼", - "person_gesturing_no_medium_skin_tone": "🙅🏽", - "person_gesturing_ok": "🙆", - "person_gesturing_ok_dark_skin_tone": "🙆🏿", - "person_gesturing_ok_light_skin_tone": "🙆🏻", - "person_gesturing_ok_medium-dark_skin_tone": "🙆🏾", - "person_gesturing_ok_medium-light_skin_tone": "🙆🏼", - "person_gesturing_ok_medium_skin_tone": "🙆🏽", - "person_getting_haircut": "💇", - "person_getting_haircut_dark_skin_tone": "💇🏿", - "person_getting_haircut_light_skin_tone": "💇🏻", - "person_getting_haircut_medium-dark_skin_tone": "💇🏾", - "person_getting_haircut_medium-light_skin_tone": "💇🏼", - "person_getting_haircut_medium_skin_tone": "💇🏽", - "person_getting_massage": "💆", - "person_getting_massage_dark_skin_tone": "💆🏿", - "person_getting_massage_light_skin_tone": "💆🏻", - "person_getting_massage_medium-dark_skin_tone": "💆🏾", - "person_getting_massage_medium-light_skin_tone": "💆🏼", - "person_getting_massage_medium_skin_tone": "💆🏽", - "person_golfing": "🏌", - "person_golfing_dark_skin_tone": "🏌🏿", - "person_golfing_light_skin_tone": "🏌🏻", - "person_golfing_medium-dark_skin_tone": "🏌🏾", - "person_golfing_medium-light_skin_tone": "🏌🏼", - "person_golfing_medium_skin_tone": "🏌🏽", - "person_in_bed": "🛌", - "person_in_bed_dark_skin_tone": "🛌🏿", - "person_in_bed_light_skin_tone": "🛌🏻", - "person_in_bed_medium-dark_skin_tone": "🛌🏾", - "person_in_bed_medium-light_skin_tone": "🛌🏼", - "person_in_bed_medium_skin_tone": "🛌🏽", - "person_in_lotus_position": "🧘", - "person_in_lotus_position_dark_skin_tone": "🧘🏿", - "person_in_lotus_position_light_skin_tone": "🧘🏻", - "person_in_lotus_position_medium-dark_skin_tone": "🧘🏾", - "person_in_lotus_position_medium-light_skin_tone": "🧘🏼", - "person_in_lotus_position_medium_skin_tone": "🧘🏽", - "person_in_steamy_room": "🧖", - "person_in_steamy_room_dark_skin_tone": "🧖🏿", - "person_in_steamy_room_light_skin_tone": "🧖🏻", - "person_in_steamy_room_medium-dark_skin_tone": "🧖🏾", - "person_in_steamy_room_medium-light_skin_tone": "🧖🏼", - "person_in_steamy_room_medium_skin_tone": "🧖🏽", - "person_juggling": "🤹", - "person_juggling_dark_skin_tone": "🤹🏿", - "person_juggling_light_skin_tone": "🤹🏻", - "person_juggling_medium-dark_skin_tone": "🤹🏾", - "person_juggling_medium-light_skin_tone": "🤹🏼", - "person_juggling_medium_skin_tone": "🤹🏽", - "person_kneeling": "🧎", - "person_lifting_weights": "🏋", - "person_lifting_weights_dark_skin_tone": "🏋🏿", - "person_lifting_weights_light_skin_tone": "🏋🏻", - "person_lifting_weights_medium-dark_skin_tone": "🏋🏾", - "person_lifting_weights_medium-light_skin_tone": "🏋🏼", - "person_lifting_weights_medium_skin_tone": "🏋🏽", - "person_mountain_biking": "🚵", - "person_mountain_biking_dark_skin_tone": "🚵🏿", - "person_mountain_biking_light_skin_tone": "🚵🏻", - "person_mountain_biking_medium-dark_skin_tone": "🚵🏾", - "person_mountain_biking_medium-light_skin_tone": "🚵🏼", - "person_mountain_biking_medium_skin_tone": "🚵🏽", - "person_playing_handball": "🤾", - "person_playing_handball_dark_skin_tone": "🤾🏿", - "person_playing_handball_light_skin_tone": "🤾🏻", - "person_playing_handball_medium-dark_skin_tone": "🤾🏾", - "person_playing_handball_medium-light_skin_tone": "🤾🏼", - "person_playing_handball_medium_skin_tone": "🤾🏽", - "person_playing_water_polo": "🤽", - "person_playing_water_polo_dark_skin_tone": "🤽🏿", - "person_playing_water_polo_light_skin_tone": "🤽🏻", - "person_playing_water_polo_medium-dark_skin_tone": "🤽🏾", - "person_playing_water_polo_medium-light_skin_tone": "🤽🏼", - "person_playing_water_polo_medium_skin_tone": "🤽🏽", - "person_pouting": "🙎", - "person_pouting_dark_skin_tone": "🙎🏿", - "person_pouting_light_skin_tone": "🙎🏻", - "person_pouting_medium-dark_skin_tone": "🙎🏾", - "person_pouting_medium-light_skin_tone": "🙎🏼", - "person_pouting_medium_skin_tone": "🙎🏽", - "person_raising_hand": "🙋", - "person_raising_hand_dark_skin_tone": "🙋🏿", - "person_raising_hand_light_skin_tone": "🙋🏻", - "person_raising_hand_medium-dark_skin_tone": "🙋🏾", - "person_raising_hand_medium-light_skin_tone": "🙋🏼", - "person_raising_hand_medium_skin_tone": "🙋🏽", - "person_rowing_boat": "🚣", - "person_rowing_boat_dark_skin_tone": "🚣🏿", - "person_rowing_boat_light_skin_tone": "🚣🏻", - "person_rowing_boat_medium-dark_skin_tone": "🚣🏾", - "person_rowing_boat_medium-light_skin_tone": "🚣🏼", - "person_rowing_boat_medium_skin_tone": "🚣🏽", - "person_running": "🏃", - "person_running_dark_skin_tone": "🏃🏿", - "person_running_light_skin_tone": "🏃🏻", - "person_running_medium-dark_skin_tone": "🏃🏾", - "person_running_medium-light_skin_tone": "🏃🏼", - "person_running_medium_skin_tone": "🏃🏽", - "person_shrugging": "🤷", - "person_shrugging_dark_skin_tone": "🤷🏿", - "person_shrugging_light_skin_tone": "🤷🏻", - "person_shrugging_medium-dark_skin_tone": "🤷🏾", - "person_shrugging_medium-light_skin_tone": "🤷🏼", - "person_shrugging_medium_skin_tone": "🤷🏽", - "person_standing": "🧍", - "person_surfing": "🏄", - "person_surfing_dark_skin_tone": "🏄🏿", - "person_surfing_light_skin_tone": "🏄🏻", - "person_surfing_medium-dark_skin_tone": "🏄🏾", - "person_surfing_medium-light_skin_tone": "🏄🏼", - "person_surfing_medium_skin_tone": "🏄🏽", - "person_swimming": "🏊", - "person_swimming_dark_skin_tone": "🏊🏿", - "person_swimming_light_skin_tone": "🏊🏻", - "person_swimming_medium-dark_skin_tone": "🏊🏾", - "person_swimming_medium-light_skin_tone": "🏊🏼", - "person_swimming_medium_skin_tone": "🏊🏽", - "person_taking_bath": "🛀", - "person_taking_bath_dark_skin_tone": "🛀🏿", - "person_taking_bath_light_skin_tone": "🛀🏻", - "person_taking_bath_medium-dark_skin_tone": "🛀🏾", - "person_taking_bath_medium-light_skin_tone": "🛀🏼", - "person_taking_bath_medium_skin_tone": "🛀🏽", - "person_tipping_hand": "💁", - "person_tipping_hand_dark_skin_tone": "💁🏿", - "person_tipping_hand_light_skin_tone": "💁🏻", - "person_tipping_hand_medium-dark_skin_tone": "💁🏾", - "person_tipping_hand_medium-light_skin_tone": "💁🏼", - "person_tipping_hand_medium_skin_tone": "💁🏽", - "person_walking": "🚶", - "person_walking_dark_skin_tone": "🚶🏿", - "person_walking_light_skin_tone": "🚶🏻", - "person_walking_medium-dark_skin_tone": "🚶🏾", - "person_walking_medium-light_skin_tone": "🚶🏼", - "person_walking_medium_skin_tone": "🚶🏽", - "person_wearing_turban": "👳", - "person_wearing_turban_dark_skin_tone": "👳🏿", - "person_wearing_turban_light_skin_tone": "👳🏻", - "person_wearing_turban_medium-dark_skin_tone": "👳🏾", - "person_wearing_turban_medium-light_skin_tone": "👳🏼", - "person_wearing_turban_medium_skin_tone": "👳🏽", - "petri_dish": "🧫", - "pick": "⛏", - "pie": "🥧", - "pig": "🐷", - "pig_face": "🐷", - "pig_nose": "🐽", - "pile_of_poo": "💩", - "pill": "💊", - "pinching_hand": "🤏", - "pine_decoration": "🎍", - "pineapple": "🍍", - "ping_pong": "🏓", - "pirate_flag": "🏴\u200d☠️", - "pistol": "🔫", - "pizza": "🍕", - "place_of_worship": "🛐", - "play_button": "▶", - "play_or_pause_button": "⏯", - "pleading_face": "🥺", - "police_car": "🚓", - "police_car_light": "🚨", - "police_officer": "👮", - "police_officer_dark_skin_tone": "👮🏿", - "police_officer_light_skin_tone": "👮🏻", - "police_officer_medium-dark_skin_tone": "👮🏾", - "police_officer_medium-light_skin_tone": "👮🏼", - "police_officer_medium_skin_tone": "👮🏽", - "poodle": "🐩", - "pool_8_ball": "🎱", - "popcorn": "🍿", - "post_office": "🏣", - "postal_horn": "📯", - "postbox": "📮", - "pot_of_food": "🍲", - "potable_water": "🚰", - "potato": "🥔", - "poultry_leg": "🍗", - "pound_banknote": "💷", - "pouting_cat_face": "😾", - "pouting_face": "😡", - "prayer_beads": "📿", - "pregnant_woman": "🤰", - "pregnant_woman_dark_skin_tone": "🤰🏿", - "pregnant_woman_light_skin_tone": "🤰🏻", - "pregnant_woman_medium-dark_skin_tone": "🤰🏾", - "pregnant_woman_medium-light_skin_tone": "🤰🏼", - "pregnant_woman_medium_skin_tone": "🤰🏽", - "pretzel": "🥨", - "probing_cane": "🦯", - "prince": "🤴", - "prince_dark_skin_tone": "🤴🏿", - "prince_light_skin_tone": "🤴🏻", - "prince_medium-dark_skin_tone": "🤴🏾", - "prince_medium-light_skin_tone": "🤴🏼", - "prince_medium_skin_tone": "🤴🏽", - "princess": "👸", - "princess_dark_skin_tone": "👸🏿", - "princess_light_skin_tone": "👸🏻", - "princess_medium-dark_skin_tone": "👸🏾", - "princess_medium-light_skin_tone": "👸🏼", - "princess_medium_skin_tone": "👸🏽", - "printer": "🖨", - "prohibited": "🚫", - "purple_circle": "🟣", - "purple_heart": "💜", - "purple_square": "🟪", - "purse": "👛", - "pushpin": "📌", - "question_mark": "❓", - "rabbit": "🐰", - "rabbit_face": "🐰", - "raccoon": "🦝", - "racing_car": "🏎", - "radio": "📻", - "radio_button": "🔘", - "radioactive": "☢", - "railway_car": "🚃", - "railway_track": "🛤", - "rainbow": "🌈", - "rainbow_flag": "🏳️\u200d🌈", - "raised_back_of_hand": "🤚", - "raised_back_of_hand_dark_skin_tone": "🤚🏿", - "raised_back_of_hand_light_skin_tone": "🤚🏻", - "raised_back_of_hand_medium-dark_skin_tone": "🤚🏾", - "raised_back_of_hand_medium-light_skin_tone": "🤚🏼", - "raised_back_of_hand_medium_skin_tone": "🤚🏽", - "raised_fist": "✊", - "raised_fist_dark_skin_tone": "✊🏿", - "raised_fist_light_skin_tone": "✊🏻", - "raised_fist_medium-dark_skin_tone": "✊🏾", - "raised_fist_medium-light_skin_tone": "✊🏼", - "raised_fist_medium_skin_tone": "✊🏽", - "raised_hand": "✋", - "raised_hand_dark_skin_tone": "✋🏿", - "raised_hand_light_skin_tone": "✋🏻", - "raised_hand_medium-dark_skin_tone": "✋🏾", - "raised_hand_medium-light_skin_tone": "✋🏼", - "raised_hand_medium_skin_tone": "✋🏽", - "raising_hands": "🙌", - "raising_hands_dark_skin_tone": "🙌🏿", - "raising_hands_light_skin_tone": "🙌🏻", - "raising_hands_medium-dark_skin_tone": "🙌🏾", - "raising_hands_medium-light_skin_tone": "🙌🏼", - "raising_hands_medium_skin_tone": "🙌🏽", - "ram": "🐏", - "rat": "🐀", - "razor": "🪒", - "ringed_planet": "🪐", - "receipt": "🧾", - "record_button": "⏺", - "recycling_symbol": "♻", - "red_apple": "🍎", - "red_circle": "🔴", - "red_envelope": "🧧", - "red_hair": "🦰", - "red-haired_man": "👨\u200d🦰", - "red-haired_woman": "👩\u200d🦰", - "red_heart": "❤", - "red_paper_lantern": "🏮", - "red_square": "🟥", - "red_triangle_pointed_down": "🔻", - "red_triangle_pointed_up": "🔺", - "registered": "®", - "relieved_face": "😌", - "reminder_ribbon": "🎗", - "repeat_button": "🔁", - "repeat_single_button": "🔂", - "rescue_worker’s_helmet": "⛑", - "restroom": "🚻", - "reverse_button": "◀", - "revolving_hearts": "💞", - "rhinoceros": "🦏", - "ribbon": "🎀", - "rice_ball": "🍙", - "rice_cracker": "🍘", - "right-facing_fist": "🤜", - "right-facing_fist_dark_skin_tone": "🤜🏿", - "right-facing_fist_light_skin_tone": "🤜🏻", - "right-facing_fist_medium-dark_skin_tone": "🤜🏾", - "right-facing_fist_medium-light_skin_tone": "🤜🏼", - "right-facing_fist_medium_skin_tone": "🤜🏽", - "right_anger_bubble": "🗯", - "right_arrow": "➡", - "right_arrow_curving_down": "⤵", - "right_arrow_curving_left": "↩", - "right_arrow_curving_up": "⤴", - "ring": "💍", - "roasted_sweet_potato": "🍠", - "robot_face": "🤖", - "rocket": "🚀", - "roll_of_paper": "🧻", - "rolled-up_newspaper": "🗞", - "roller_coaster": "🎢", - "rolling_on_the_floor_laughing": "🤣", - "rooster": "🐓", - "rose": "🌹", - "rosette": "🏵", - "round_pushpin": "📍", - "rugby_football": "🏉", - "running_shirt": "🎽", - "running_shoe": "👟", - "sad_but_relieved_face": "😥", - "safety_pin": "🧷", - "safety_vest": "🦺", - "salt": "🧂", - "sailboat": "⛵", - "sake": "🍶", - "sandwich": "🥪", - "sari": "🥻", - "satellite": "📡", - "satellite_antenna": "📡", - "sauropod": "🦕", - "saxophone": "🎷", - "scarf": "🧣", - "school": "🏫", - "school_backpack": "🎒", - "scissors": "✂", - "scorpion": "🦂", - "scroll": "📜", - "seat": "💺", - "see-no-evil_monkey": "🙈", - "seedling": "🌱", - "selfie": "🤳", - "selfie_dark_skin_tone": "🤳🏿", - "selfie_light_skin_tone": "🤳🏻", - "selfie_medium-dark_skin_tone": "🤳🏾", - "selfie_medium-light_skin_tone": "🤳🏼", - "selfie_medium_skin_tone": "🤳🏽", - "service_dog": "🐕\u200d🦺", - "seven-thirty": "🕢", - "seven_o’clock": "🕖", - "shallow_pan_of_food": "🥘", - "shamrock": "☘", - "shark": "🦈", - "shaved_ice": "🍧", - "sheaf_of_rice": "🌾", - "shield": "🛡", - "shinto_shrine": "⛩", - "ship": "🚢", - "shooting_star": "🌠", - "shopping_bags": "🛍", - "shopping_cart": "🛒", - "shortcake": "🍰", - "shorts": "🩳", - "shower": "🚿", - "shrimp": "🦐", - "shuffle_tracks_button": "🔀", - "shushing_face": "🤫", - "sign_of_the_horns": "🤘", - "sign_of_the_horns_dark_skin_tone": "🤘🏿", - "sign_of_the_horns_light_skin_tone": "🤘🏻", - "sign_of_the_horns_medium-dark_skin_tone": "🤘🏾", - "sign_of_the_horns_medium-light_skin_tone": "🤘🏼", - "sign_of_the_horns_medium_skin_tone": "🤘🏽", - "six-thirty": "🕡", - "six_o’clock": "🕕", - "skateboard": "🛹", - "skier": "⛷", - "skis": "🎿", - "skull": "💀", - "skull_and_crossbones": "☠", - "skunk": "🦨", - "sled": "🛷", - "sleeping_face": "😴", - "sleepy_face": "😪", - "slightly_frowning_face": "🙁", - "slightly_smiling_face": "🙂", - "slot_machine": "🎰", - "sloth": "🦥", - "small_airplane": "🛩", - "small_blue_diamond": "🔹", - "small_orange_diamond": "🔸", - "smiling_cat_face_with_heart-eyes": "😻", - "smiling_face": "☺", - "smiling_face_with_halo": "😇", - "smiling_face_with_3_hearts": "🥰", - "smiling_face_with_heart-eyes": "😍", - "smiling_face_with_horns": "😈", - "smiling_face_with_smiling_eyes": "😊", - "smiling_face_with_sunglasses": "😎", - "smirking_face": "😏", - "snail": "🐌", - "snake": "🐍", - "sneezing_face": "🤧", - "snow-capped_mountain": "🏔", - "snowboarder": "🏂", - "snowboarder_dark_skin_tone": "🏂🏿", - "snowboarder_light_skin_tone": "🏂🏻", - "snowboarder_medium-dark_skin_tone": "🏂🏾", - "snowboarder_medium-light_skin_tone": "🏂🏼", - "snowboarder_medium_skin_tone": "🏂🏽", - "snowflake": "❄", - "snowman": "☃", - "snowman_without_snow": "⛄", - "soap": "🧼", - "soccer_ball": "⚽", - "socks": "🧦", - "softball": "🥎", - "soft_ice_cream": "🍦", - "spade_suit": "♠", - "spaghetti": "🍝", - "sparkle": "❇", - "sparkler": "🎇", - "sparkles": "✨", - "sparkling_heart": "💖", - "speak-no-evil_monkey": "🙊", - "speaker_high_volume": "🔊", - "speaker_low_volume": "🔈", - "speaker_medium_volume": "🔉", - "speaking_head": "🗣", - "speech_balloon": "💬", - "speedboat": "🚤", - "spider": "🕷", - "spider_web": "🕸", - "spiral_calendar": "🗓", - "spiral_notepad": "🗒", - "spiral_shell": "🐚", - "spoon": "🥄", - "sponge": "🧽", - "sport_utility_vehicle": "🚙", - "sports_medal": "🏅", - "spouting_whale": "🐳", - "squid": "🦑", - "squinting_face_with_tongue": "😝", - "stadium": "🏟", - "star-struck": "🤩", - "star_and_crescent": "☪", - "star_of_david": "✡", - "station": "🚉", - "steaming_bowl": "🍜", - "stethoscope": "🩺", - "stop_button": "⏹", - "stop_sign": "🛑", - "stopwatch": "⏱", - "straight_ruler": "📏", - "strawberry": "🍓", - "studio_microphone": "🎙", - "stuffed_flatbread": "🥙", - "sun": "☀", - "sun_behind_cloud": "⛅", - "sun_behind_large_cloud": "🌥", - "sun_behind_rain_cloud": "🌦", - "sun_behind_small_cloud": "🌤", - "sun_with_face": "🌞", - "sunflower": "🌻", - "sunglasses": "😎", - "sunrise": "🌅", - "sunrise_over_mountains": "🌄", - "sunset": "🌇", - "superhero": "🦸", - "supervillain": "🦹", - "sushi": "🍣", - "suspension_railway": "🚟", - "swan": "🦢", - "sweat_droplets": "💦", - "synagogue": "🕍", - "syringe": "💉", - "t-shirt": "👕", - "taco": "🌮", - "takeout_box": "🥡", - "tanabata_tree": "🎋", - "tangerine": "🍊", - "taxi": "🚕", - "teacup_without_handle": "🍵", - "tear-off_calendar": "📆", - "teddy_bear": "🧸", - "telephone": "☎", - "telephone_receiver": "📞", - "telescope": "🔭", - "television": "📺", - "ten-thirty": "🕥", - "ten_o’clock": "🕙", - "tennis": "🎾", - "tent": "⛺", - "test_tube": "🧪", - "thermometer": "🌡", - "thinking_face": "🤔", - "thought_balloon": "💭", - "thread": "🧵", - "three-thirty": "🕞", - "three_o’clock": "🕒", - "thumbs_down": "👎", - "thumbs_down_dark_skin_tone": "👎🏿", - "thumbs_down_light_skin_tone": "👎🏻", - "thumbs_down_medium-dark_skin_tone": "👎🏾", - "thumbs_down_medium-light_skin_tone": "👎🏼", - "thumbs_down_medium_skin_tone": "👎🏽", - "thumbs_up": "👍", - "thumbs_up_dark_skin_tone": "👍🏿", - "thumbs_up_light_skin_tone": "👍🏻", - "thumbs_up_medium-dark_skin_tone": "👍🏾", - "thumbs_up_medium-light_skin_tone": "👍🏼", - "thumbs_up_medium_skin_tone": "👍🏽", - "ticket": "🎫", - "tiger": "🐯", - "tiger_face": "🐯", - "timer_clock": "⏲", - "tired_face": "😫", - "toolbox": "🧰", - "toilet": "🚽", - "tomato": "🍅", - "tongue": "👅", - "tooth": "🦷", - "top_hat": "🎩", - "tornado": "🌪", - "trackball": "🖲", - "tractor": "🚜", - "trade_mark": "™", - "train": "🚋", - "tram": "🚊", - "tram_car": "🚋", - "triangular_flag": "🚩", - "triangular_ruler": "📐", - "trident_emblem": "🔱", - "trolleybus": "🚎", - "trophy": "🏆", - "tropical_drink": "🍹", - "tropical_fish": "🐠", - "trumpet": "🎺", - "tulip": "🌷", - "tumbler_glass": "🥃", - "turtle": "🐢", - "twelve-thirty": "🕧", - "twelve_o’clock": "🕛", - "two-hump_camel": "🐫", - "two-thirty": "🕝", - "two_hearts": "💕", - "two_men_holding_hands": "👬", - "two_o’clock": "🕑", - "two_women_holding_hands": "👭", - "umbrella": "☂", - "umbrella_on_ground": "⛱", - "umbrella_with_rain_drops": "☔", - "unamused_face": "😒", - "unicorn_face": "🦄", - "unlocked": "🔓", - "up-down_arrow": "↕", - "up-left_arrow": "↖", - "up-right_arrow": "↗", - "up_arrow": "⬆", - "upside-down_face": "🙃", - "upwards_button": "🔼", - "vampire": "🧛", - "vampire_dark_skin_tone": "🧛🏿", - "vampire_light_skin_tone": "🧛🏻", - "vampire_medium-dark_skin_tone": "🧛🏾", - "vampire_medium-light_skin_tone": "🧛🏼", - "vampire_medium_skin_tone": "🧛🏽", - "vertical_traffic_light": "🚦", - "vibration_mode": "📳", - "victory_hand": "✌", - "victory_hand_dark_skin_tone": "✌🏿", - "victory_hand_light_skin_tone": "✌🏻", - "victory_hand_medium-dark_skin_tone": "✌🏾", - "victory_hand_medium-light_skin_tone": "✌🏼", - "victory_hand_medium_skin_tone": "✌🏽", - "video_camera": "📹", - "video_game": "🎮", - "videocassette": "📼", - "violin": "🎻", - "volcano": "🌋", - "volleyball": "🏐", - "vulcan_salute": "🖖", - "vulcan_salute_dark_skin_tone": "🖖🏿", - "vulcan_salute_light_skin_tone": "🖖🏻", - "vulcan_salute_medium-dark_skin_tone": "🖖🏾", - "vulcan_salute_medium-light_skin_tone": "🖖🏼", - "vulcan_salute_medium_skin_tone": "🖖🏽", - "waffle": "🧇", - "waning_crescent_moon": "🌘", - "waning_gibbous_moon": "🌖", - "warning": "⚠", - "wastebasket": "🗑", - "watch": "⌚", - "water_buffalo": "🐃", - "water_closet": "🚾", - "water_wave": "🌊", - "watermelon": "🍉", - "waving_hand": "👋", - "waving_hand_dark_skin_tone": "👋🏿", - "waving_hand_light_skin_tone": "👋🏻", - "waving_hand_medium-dark_skin_tone": "👋🏾", - "waving_hand_medium-light_skin_tone": "👋🏼", - "waving_hand_medium_skin_tone": "👋🏽", - "wavy_dash": "〰", - "waxing_crescent_moon": "🌒", - "waxing_gibbous_moon": "🌔", - "weary_cat_face": "🙀", - "weary_face": "😩", - "wedding": "💒", - "whale": "🐳", - "wheel_of_dharma": "☸", - "wheelchair_symbol": "♿", - "white_circle": "⚪", - "white_exclamation_mark": "❕", - "white_flag": "🏳", - "white_flower": "💮", - "white_hair": "🦳", - "white-haired_man": "👨\u200d🦳", - "white-haired_woman": "👩\u200d🦳", - "white_heart": "🤍", - "white_heavy_check_mark": "✅", - "white_large_square": "⬜", - "white_medium-small_square": "◽", - "white_medium_square": "◻", - "white_medium_star": "⭐", - "white_question_mark": "❔", - "white_small_square": "▫", - "white_square_button": "🔳", - "wilted_flower": "🥀", - "wind_chime": "🎐", - "wind_face": "🌬", - "wine_glass": "🍷", - "winking_face": "😉", - "winking_face_with_tongue": "😜", - "wolf_face": "🐺", - "woman": "👩", - "woman_artist": "👩\u200d🎨", - "woman_artist_dark_skin_tone": "👩🏿\u200d🎨", - "woman_artist_light_skin_tone": "👩🏻\u200d🎨", - "woman_artist_medium-dark_skin_tone": "👩🏾\u200d🎨", - "woman_artist_medium-light_skin_tone": "👩🏼\u200d🎨", - "woman_artist_medium_skin_tone": "👩🏽\u200d🎨", - "woman_astronaut": "👩\u200d🚀", - "woman_astronaut_dark_skin_tone": "👩🏿\u200d🚀", - "woman_astronaut_light_skin_tone": "👩🏻\u200d🚀", - "woman_astronaut_medium-dark_skin_tone": "👩🏾\u200d🚀", - "woman_astronaut_medium-light_skin_tone": "👩🏼\u200d🚀", - "woman_astronaut_medium_skin_tone": "👩🏽\u200d🚀", - "woman_biking": "🚴\u200d♀️", - "woman_biking_dark_skin_tone": "🚴🏿\u200d♀️", - "woman_biking_light_skin_tone": "🚴🏻\u200d♀️", - "woman_biking_medium-dark_skin_tone": "🚴🏾\u200d♀️", - "woman_biking_medium-light_skin_tone": "🚴🏼\u200d♀️", - "woman_biking_medium_skin_tone": "🚴🏽\u200d♀️", - "woman_bouncing_ball": "⛹️\u200d♀️", - "woman_bouncing_ball_dark_skin_tone": "⛹🏿\u200d♀️", - "woman_bouncing_ball_light_skin_tone": "⛹🏻\u200d♀️", - "woman_bouncing_ball_medium-dark_skin_tone": "⛹🏾\u200d♀️", - "woman_bouncing_ball_medium-light_skin_tone": "⛹🏼\u200d♀️", - "woman_bouncing_ball_medium_skin_tone": "⛹🏽\u200d♀️", - "woman_bowing": "🙇\u200d♀️", - "woman_bowing_dark_skin_tone": "🙇🏿\u200d♀️", - "woman_bowing_light_skin_tone": "🙇🏻\u200d♀️", - "woman_bowing_medium-dark_skin_tone": "🙇🏾\u200d♀️", - "woman_bowing_medium-light_skin_tone": "🙇🏼\u200d♀️", - "woman_bowing_medium_skin_tone": "🙇🏽\u200d♀️", - "woman_cartwheeling": "🤸\u200d♀️", - "woman_cartwheeling_dark_skin_tone": "🤸🏿\u200d♀️", - "woman_cartwheeling_light_skin_tone": "🤸🏻\u200d♀️", - "woman_cartwheeling_medium-dark_skin_tone": "🤸🏾\u200d♀️", - "woman_cartwheeling_medium-light_skin_tone": "🤸🏼\u200d♀️", - "woman_cartwheeling_medium_skin_tone": "🤸🏽\u200d♀️", - "woman_climbing": "🧗\u200d♀️", - "woman_climbing_dark_skin_tone": "🧗🏿\u200d♀️", - "woman_climbing_light_skin_tone": "🧗🏻\u200d♀️", - "woman_climbing_medium-dark_skin_tone": "🧗🏾\u200d♀️", - "woman_climbing_medium-light_skin_tone": "🧗🏼\u200d♀️", - "woman_climbing_medium_skin_tone": "🧗🏽\u200d♀️", - "woman_construction_worker": "👷\u200d♀️", - "woman_construction_worker_dark_skin_tone": "👷🏿\u200d♀️", - "woman_construction_worker_light_skin_tone": "👷🏻\u200d♀️", - "woman_construction_worker_medium-dark_skin_tone": "👷🏾\u200d♀️", - "woman_construction_worker_medium-light_skin_tone": "👷🏼\u200d♀️", - "woman_construction_worker_medium_skin_tone": "👷🏽\u200d♀️", - "woman_cook": "👩\u200d🍳", - "woman_cook_dark_skin_tone": "👩🏿\u200d🍳", - "woman_cook_light_skin_tone": "👩🏻\u200d🍳", - "woman_cook_medium-dark_skin_tone": "👩🏾\u200d🍳", - "woman_cook_medium-light_skin_tone": "👩🏼\u200d🍳", - "woman_cook_medium_skin_tone": "👩🏽\u200d🍳", - "woman_dancing": "💃", - "woman_dancing_dark_skin_tone": "💃🏿", - "woman_dancing_light_skin_tone": "💃🏻", - "woman_dancing_medium-dark_skin_tone": "💃🏾", - "woman_dancing_medium-light_skin_tone": "💃🏼", - "woman_dancing_medium_skin_tone": "💃🏽", - "woman_dark_skin_tone": "👩🏿", - "woman_detective": "🕵️\u200d♀️", - "woman_detective_dark_skin_tone": "🕵🏿\u200d♀️", - "woman_detective_light_skin_tone": "🕵🏻\u200d♀️", - "woman_detective_medium-dark_skin_tone": "🕵🏾\u200d♀️", - "woman_detective_medium-light_skin_tone": "🕵🏼\u200d♀️", - "woman_detective_medium_skin_tone": "🕵🏽\u200d♀️", - "woman_elf": "🧝\u200d♀️", - "woman_elf_dark_skin_tone": "🧝🏿\u200d♀️", - "woman_elf_light_skin_tone": "🧝🏻\u200d♀️", - "woman_elf_medium-dark_skin_tone": "🧝🏾\u200d♀️", - "woman_elf_medium-light_skin_tone": "🧝🏼\u200d♀️", - "woman_elf_medium_skin_tone": "🧝🏽\u200d♀️", - "woman_facepalming": "🤦\u200d♀️", - "woman_facepalming_dark_skin_tone": "🤦🏿\u200d♀️", - "woman_facepalming_light_skin_tone": "🤦🏻\u200d♀️", - "woman_facepalming_medium-dark_skin_tone": "🤦🏾\u200d♀️", - "woman_facepalming_medium-light_skin_tone": "🤦🏼\u200d♀️", - "woman_facepalming_medium_skin_tone": "🤦🏽\u200d♀️", - "woman_factory_worker": "👩\u200d🏭", - "woman_factory_worker_dark_skin_tone": "👩🏿\u200d🏭", - "woman_factory_worker_light_skin_tone": "👩🏻\u200d🏭", - "woman_factory_worker_medium-dark_skin_tone": "👩🏾\u200d🏭", - "woman_factory_worker_medium-light_skin_tone": "👩🏼\u200d🏭", - "woman_factory_worker_medium_skin_tone": "👩🏽\u200d🏭", - "woman_fairy": "🧚\u200d♀️", - "woman_fairy_dark_skin_tone": "🧚🏿\u200d♀️", - "woman_fairy_light_skin_tone": "🧚🏻\u200d♀️", - "woman_fairy_medium-dark_skin_tone": "🧚🏾\u200d♀️", - "woman_fairy_medium-light_skin_tone": "🧚🏼\u200d♀️", - "woman_fairy_medium_skin_tone": "🧚🏽\u200d♀️", - "woman_farmer": "👩\u200d🌾", - "woman_farmer_dark_skin_tone": "👩🏿\u200d🌾", - "woman_farmer_light_skin_tone": "👩🏻\u200d🌾", - "woman_farmer_medium-dark_skin_tone": "👩🏾\u200d🌾", - "woman_farmer_medium-light_skin_tone": "👩🏼\u200d🌾", - "woman_farmer_medium_skin_tone": "👩🏽\u200d🌾", - "woman_firefighter": "👩\u200d🚒", - "woman_firefighter_dark_skin_tone": "👩🏿\u200d🚒", - "woman_firefighter_light_skin_tone": "👩🏻\u200d🚒", - "woman_firefighter_medium-dark_skin_tone": "👩🏾\u200d🚒", - "woman_firefighter_medium-light_skin_tone": "👩🏼\u200d🚒", - "woman_firefighter_medium_skin_tone": "👩🏽\u200d🚒", - "woman_frowning": "🙍\u200d♀️", - "woman_frowning_dark_skin_tone": "🙍🏿\u200d♀️", - "woman_frowning_light_skin_tone": "🙍🏻\u200d♀️", - "woman_frowning_medium-dark_skin_tone": "🙍🏾\u200d♀️", - "woman_frowning_medium-light_skin_tone": "🙍🏼\u200d♀️", - "woman_frowning_medium_skin_tone": "🙍🏽\u200d♀️", - "woman_genie": "🧞\u200d♀️", - "woman_gesturing_no": "🙅\u200d♀️", - "woman_gesturing_no_dark_skin_tone": "🙅🏿\u200d♀️", - "woman_gesturing_no_light_skin_tone": "🙅🏻\u200d♀️", - "woman_gesturing_no_medium-dark_skin_tone": "🙅🏾\u200d♀️", - "woman_gesturing_no_medium-light_skin_tone": "🙅🏼\u200d♀️", - "woman_gesturing_no_medium_skin_tone": "🙅🏽\u200d♀️", - "woman_gesturing_ok": "🙆\u200d♀️", - "woman_gesturing_ok_dark_skin_tone": "🙆🏿\u200d♀️", - "woman_gesturing_ok_light_skin_tone": "🙆🏻\u200d♀️", - "woman_gesturing_ok_medium-dark_skin_tone": "🙆🏾\u200d♀️", - "woman_gesturing_ok_medium-light_skin_tone": "🙆🏼\u200d♀️", - "woman_gesturing_ok_medium_skin_tone": "🙆🏽\u200d♀️", - "woman_getting_haircut": "💇\u200d♀️", - "woman_getting_haircut_dark_skin_tone": "💇🏿\u200d♀️", - "woman_getting_haircut_light_skin_tone": "💇🏻\u200d♀️", - "woman_getting_haircut_medium-dark_skin_tone": "💇🏾\u200d♀️", - "woman_getting_haircut_medium-light_skin_tone": "💇🏼\u200d♀️", - "woman_getting_haircut_medium_skin_tone": "💇🏽\u200d♀️", - "woman_getting_massage": "💆\u200d♀️", - "woman_getting_massage_dark_skin_tone": "💆🏿\u200d♀️", - "woman_getting_massage_light_skin_tone": "💆🏻\u200d♀️", - "woman_getting_massage_medium-dark_skin_tone": "💆🏾\u200d♀️", - "woman_getting_massage_medium-light_skin_tone": "💆🏼\u200d♀️", - "woman_getting_massage_medium_skin_tone": "💆🏽\u200d♀️", - "woman_golfing": "🏌️\u200d♀️", - "woman_golfing_dark_skin_tone": "🏌🏿\u200d♀️", - "woman_golfing_light_skin_tone": "🏌🏻\u200d♀️", - "woman_golfing_medium-dark_skin_tone": "🏌🏾\u200d♀️", - "woman_golfing_medium-light_skin_tone": "🏌🏼\u200d♀️", - "woman_golfing_medium_skin_tone": "🏌🏽\u200d♀️", - "woman_guard": "💂\u200d♀️", - "woman_guard_dark_skin_tone": "💂🏿\u200d♀️", - "woman_guard_light_skin_tone": "💂🏻\u200d♀️", - "woman_guard_medium-dark_skin_tone": "💂🏾\u200d♀️", - "woman_guard_medium-light_skin_tone": "💂🏼\u200d♀️", - "woman_guard_medium_skin_tone": "💂🏽\u200d♀️", - "woman_health_worker": "👩\u200d⚕️", - "woman_health_worker_dark_skin_tone": "👩🏿\u200d⚕️", - "woman_health_worker_light_skin_tone": "👩🏻\u200d⚕️", - "woman_health_worker_medium-dark_skin_tone": "👩🏾\u200d⚕️", - "woman_health_worker_medium-light_skin_tone": "👩🏼\u200d⚕️", - "woman_health_worker_medium_skin_tone": "👩🏽\u200d⚕️", - "woman_in_lotus_position": "🧘\u200d♀️", - "woman_in_lotus_position_dark_skin_tone": "🧘🏿\u200d♀️", - "woman_in_lotus_position_light_skin_tone": "🧘🏻\u200d♀️", - "woman_in_lotus_position_medium-dark_skin_tone": "🧘🏾\u200d♀️", - "woman_in_lotus_position_medium-light_skin_tone": "🧘🏼\u200d♀️", - "woman_in_lotus_position_medium_skin_tone": "🧘🏽\u200d♀️", - "woman_in_manual_wheelchair": "👩\u200d🦽", - "woman_in_motorized_wheelchair": "👩\u200d🦼", - "woman_in_steamy_room": "🧖\u200d♀️", - "woman_in_steamy_room_dark_skin_tone": "🧖🏿\u200d♀️", - "woman_in_steamy_room_light_skin_tone": "🧖🏻\u200d♀️", - "woman_in_steamy_room_medium-dark_skin_tone": "🧖🏾\u200d♀️", - "woman_in_steamy_room_medium-light_skin_tone": "🧖🏼\u200d♀️", - "woman_in_steamy_room_medium_skin_tone": "🧖🏽\u200d♀️", - "woman_judge": "👩\u200d⚖️", - "woman_judge_dark_skin_tone": "👩🏿\u200d⚖️", - "woman_judge_light_skin_tone": "👩🏻\u200d⚖️", - "woman_judge_medium-dark_skin_tone": "👩🏾\u200d⚖️", - "woman_judge_medium-light_skin_tone": "👩🏼\u200d⚖️", - "woman_judge_medium_skin_tone": "👩🏽\u200d⚖️", - "woman_juggling": "🤹\u200d♀️", - "woman_juggling_dark_skin_tone": "🤹🏿\u200d♀️", - "woman_juggling_light_skin_tone": "🤹🏻\u200d♀️", - "woman_juggling_medium-dark_skin_tone": "🤹🏾\u200d♀️", - "woman_juggling_medium-light_skin_tone": "🤹🏼\u200d♀️", - "woman_juggling_medium_skin_tone": "🤹🏽\u200d♀️", - "woman_lifting_weights": "🏋️\u200d♀️", - "woman_lifting_weights_dark_skin_tone": "🏋🏿\u200d♀️", - "woman_lifting_weights_light_skin_tone": "🏋🏻\u200d♀️", - "woman_lifting_weights_medium-dark_skin_tone": "🏋🏾\u200d♀️", - "woman_lifting_weights_medium-light_skin_tone": "🏋🏼\u200d♀️", - "woman_lifting_weights_medium_skin_tone": "🏋🏽\u200d♀️", - "woman_light_skin_tone": "👩🏻", - "woman_mage": "🧙\u200d♀️", - "woman_mage_dark_skin_tone": "🧙🏿\u200d♀️", - "woman_mage_light_skin_tone": "🧙🏻\u200d♀️", - "woman_mage_medium-dark_skin_tone": "🧙🏾\u200d♀️", - "woman_mage_medium-light_skin_tone": "🧙🏼\u200d♀️", - "woman_mage_medium_skin_tone": "🧙🏽\u200d♀️", - "woman_mechanic": "👩\u200d🔧", - "woman_mechanic_dark_skin_tone": "👩🏿\u200d🔧", - "woman_mechanic_light_skin_tone": "👩🏻\u200d🔧", - "woman_mechanic_medium-dark_skin_tone": "👩🏾\u200d🔧", - "woman_mechanic_medium-light_skin_tone": "👩🏼\u200d🔧", - "woman_mechanic_medium_skin_tone": "👩🏽\u200d🔧", - "woman_medium-dark_skin_tone": "👩🏾", - "woman_medium-light_skin_tone": "👩🏼", - "woman_medium_skin_tone": "👩🏽", - "woman_mountain_biking": "🚵\u200d♀️", - "woman_mountain_biking_dark_skin_tone": "🚵🏿\u200d♀️", - "woman_mountain_biking_light_skin_tone": "🚵🏻\u200d♀️", - "woman_mountain_biking_medium-dark_skin_tone": "🚵🏾\u200d♀️", - "woman_mountain_biking_medium-light_skin_tone": "🚵🏼\u200d♀️", - "woman_mountain_biking_medium_skin_tone": "🚵🏽\u200d♀️", - "woman_office_worker": "👩\u200d💼", - "woman_office_worker_dark_skin_tone": "👩🏿\u200d💼", - "woman_office_worker_light_skin_tone": "👩🏻\u200d💼", - "woman_office_worker_medium-dark_skin_tone": "👩🏾\u200d💼", - "woman_office_worker_medium-light_skin_tone": "👩🏼\u200d💼", - "woman_office_worker_medium_skin_tone": "👩🏽\u200d💼", - "woman_pilot": "👩\u200d✈️", - "woman_pilot_dark_skin_tone": "👩🏿\u200d✈️", - "woman_pilot_light_skin_tone": "👩🏻\u200d✈️", - "woman_pilot_medium-dark_skin_tone": "👩🏾\u200d✈️", - "woman_pilot_medium-light_skin_tone": "👩🏼\u200d✈️", - "woman_pilot_medium_skin_tone": "👩🏽\u200d✈️", - "woman_playing_handball": "🤾\u200d♀️", - "woman_playing_handball_dark_skin_tone": "🤾🏿\u200d♀️", - "woman_playing_handball_light_skin_tone": "🤾🏻\u200d♀️", - "woman_playing_handball_medium-dark_skin_tone": "🤾🏾\u200d♀️", - "woman_playing_handball_medium-light_skin_tone": "🤾🏼\u200d♀️", - "woman_playing_handball_medium_skin_tone": "🤾🏽\u200d♀️", - "woman_playing_water_polo": "🤽\u200d♀️", - "woman_playing_water_polo_dark_skin_tone": "🤽🏿\u200d♀️", - "woman_playing_water_polo_light_skin_tone": "🤽🏻\u200d♀️", - "woman_playing_water_polo_medium-dark_skin_tone": "🤽🏾\u200d♀️", - "woman_playing_water_polo_medium-light_skin_tone": "🤽🏼\u200d♀️", - "woman_playing_water_polo_medium_skin_tone": "🤽🏽\u200d♀️", - "woman_police_officer": "👮\u200d♀️", - "woman_police_officer_dark_skin_tone": "👮🏿\u200d♀️", - "woman_police_officer_light_skin_tone": "👮🏻\u200d♀️", - "woman_police_officer_medium-dark_skin_tone": "👮🏾\u200d♀️", - "woman_police_officer_medium-light_skin_tone": "👮🏼\u200d♀️", - "woman_police_officer_medium_skin_tone": "👮🏽\u200d♀️", - "woman_pouting": "🙎\u200d♀️", - "woman_pouting_dark_skin_tone": "🙎🏿\u200d♀️", - "woman_pouting_light_skin_tone": "🙎🏻\u200d♀️", - "woman_pouting_medium-dark_skin_tone": "🙎🏾\u200d♀️", - "woman_pouting_medium-light_skin_tone": "🙎🏼\u200d♀️", - "woman_pouting_medium_skin_tone": "🙎🏽\u200d♀️", - "woman_raising_hand": "🙋\u200d♀️", - "woman_raising_hand_dark_skin_tone": "🙋🏿\u200d♀️", - "woman_raising_hand_light_skin_tone": "🙋🏻\u200d♀️", - "woman_raising_hand_medium-dark_skin_tone": "🙋🏾\u200d♀️", - "woman_raising_hand_medium-light_skin_tone": "🙋🏼\u200d♀️", - "woman_raising_hand_medium_skin_tone": "🙋🏽\u200d♀️", - "woman_rowing_boat": "🚣\u200d♀️", - "woman_rowing_boat_dark_skin_tone": "🚣🏿\u200d♀️", - "woman_rowing_boat_light_skin_tone": "🚣🏻\u200d♀️", - "woman_rowing_boat_medium-dark_skin_tone": "🚣🏾\u200d♀️", - "woman_rowing_boat_medium-light_skin_tone": "🚣🏼\u200d♀️", - "woman_rowing_boat_medium_skin_tone": "🚣🏽\u200d♀️", - "woman_running": "🏃\u200d♀️", - "woman_running_dark_skin_tone": "🏃🏿\u200d♀️", - "woman_running_light_skin_tone": "🏃🏻\u200d♀️", - "woman_running_medium-dark_skin_tone": "🏃🏾\u200d♀️", - "woman_running_medium-light_skin_tone": "🏃🏼\u200d♀️", - "woman_running_medium_skin_tone": "🏃🏽\u200d♀️", - "woman_scientist": "👩\u200d🔬", - "woman_scientist_dark_skin_tone": "👩🏿\u200d🔬", - "woman_scientist_light_skin_tone": "👩🏻\u200d🔬", - "woman_scientist_medium-dark_skin_tone": "👩🏾\u200d🔬", - "woman_scientist_medium-light_skin_tone": "👩🏼\u200d🔬", - "woman_scientist_medium_skin_tone": "👩🏽\u200d🔬", - "woman_shrugging": "🤷\u200d♀️", - "woman_shrugging_dark_skin_tone": "🤷🏿\u200d♀️", - "woman_shrugging_light_skin_tone": "🤷🏻\u200d♀️", - "woman_shrugging_medium-dark_skin_tone": "🤷🏾\u200d♀️", - "woman_shrugging_medium-light_skin_tone": "🤷🏼\u200d♀️", - "woman_shrugging_medium_skin_tone": "🤷🏽\u200d♀️", - "woman_singer": "👩\u200d🎤", - "woman_singer_dark_skin_tone": "👩🏿\u200d🎤", - "woman_singer_light_skin_tone": "👩🏻\u200d🎤", - "woman_singer_medium-dark_skin_tone": "👩🏾\u200d🎤", - "woman_singer_medium-light_skin_tone": "👩🏼\u200d🎤", - "woman_singer_medium_skin_tone": "👩🏽\u200d🎤", - "woman_student": "👩\u200d🎓", - "woman_student_dark_skin_tone": "👩🏿\u200d🎓", - "woman_student_light_skin_tone": "👩🏻\u200d🎓", - "woman_student_medium-dark_skin_tone": "👩🏾\u200d🎓", - "woman_student_medium-light_skin_tone": "👩🏼\u200d🎓", - "woman_student_medium_skin_tone": "👩🏽\u200d🎓", - "woman_surfing": "🏄\u200d♀️", - "woman_surfing_dark_skin_tone": "🏄🏿\u200d♀️", - "woman_surfing_light_skin_tone": "🏄🏻\u200d♀️", - "woman_surfing_medium-dark_skin_tone": "🏄🏾\u200d♀️", - "woman_surfing_medium-light_skin_tone": "🏄🏼\u200d♀️", - "woman_surfing_medium_skin_tone": "🏄🏽\u200d♀️", - "woman_swimming": "🏊\u200d♀️", - "woman_swimming_dark_skin_tone": "🏊🏿\u200d♀️", - "woman_swimming_light_skin_tone": "🏊🏻\u200d♀️", - "woman_swimming_medium-dark_skin_tone": "🏊🏾\u200d♀️", - "woman_swimming_medium-light_skin_tone": "🏊🏼\u200d♀️", - "woman_swimming_medium_skin_tone": "🏊🏽\u200d♀️", - "woman_teacher": "👩\u200d🏫", - "woman_teacher_dark_skin_tone": "👩🏿\u200d🏫", - "woman_teacher_light_skin_tone": "👩🏻\u200d🏫", - "woman_teacher_medium-dark_skin_tone": "👩🏾\u200d🏫", - "woman_teacher_medium-light_skin_tone": "👩🏼\u200d🏫", - "woman_teacher_medium_skin_tone": "👩🏽\u200d🏫", - "woman_technologist": "👩\u200d💻", - "woman_technologist_dark_skin_tone": "👩🏿\u200d💻", - "woman_technologist_light_skin_tone": "👩🏻\u200d💻", - "woman_technologist_medium-dark_skin_tone": "👩🏾\u200d💻", - "woman_technologist_medium-light_skin_tone": "👩🏼\u200d💻", - "woman_technologist_medium_skin_tone": "👩🏽\u200d💻", - "woman_tipping_hand": "💁\u200d♀️", - "woman_tipping_hand_dark_skin_tone": "💁🏿\u200d♀️", - "woman_tipping_hand_light_skin_tone": "💁🏻\u200d♀️", - "woman_tipping_hand_medium-dark_skin_tone": "💁🏾\u200d♀️", - "woman_tipping_hand_medium-light_skin_tone": "💁🏼\u200d♀️", - "woman_tipping_hand_medium_skin_tone": "💁🏽\u200d♀️", - "woman_vampire": "🧛\u200d♀️", - "woman_vampire_dark_skin_tone": "🧛🏿\u200d♀️", - "woman_vampire_light_skin_tone": "🧛🏻\u200d♀️", - "woman_vampire_medium-dark_skin_tone": "🧛🏾\u200d♀️", - "woman_vampire_medium-light_skin_tone": "🧛🏼\u200d♀️", - "woman_vampire_medium_skin_tone": "🧛🏽\u200d♀️", - "woman_walking": "🚶\u200d♀️", - "woman_walking_dark_skin_tone": "🚶🏿\u200d♀️", - "woman_walking_light_skin_tone": "🚶🏻\u200d♀️", - "woman_walking_medium-dark_skin_tone": "🚶🏾\u200d♀️", - "woman_walking_medium-light_skin_tone": "🚶🏼\u200d♀️", - "woman_walking_medium_skin_tone": "🚶🏽\u200d♀️", - "woman_wearing_turban": "👳\u200d♀️", - "woman_wearing_turban_dark_skin_tone": "👳🏿\u200d♀️", - "woman_wearing_turban_light_skin_tone": "👳🏻\u200d♀️", - "woman_wearing_turban_medium-dark_skin_tone": "👳🏾\u200d♀️", - "woman_wearing_turban_medium-light_skin_tone": "👳🏼\u200d♀️", - "woman_wearing_turban_medium_skin_tone": "👳🏽\u200d♀️", - "woman_with_headscarf": "🧕", - "woman_with_headscarf_dark_skin_tone": "🧕🏿", - "woman_with_headscarf_light_skin_tone": "🧕🏻", - "woman_with_headscarf_medium-dark_skin_tone": "🧕🏾", - "woman_with_headscarf_medium-light_skin_tone": "🧕🏼", - "woman_with_headscarf_medium_skin_tone": "🧕🏽", - "woman_with_probing_cane": "👩\u200d🦯", - "woman_zombie": "🧟\u200d♀️", - "woman’s_boot": "👢", - "woman’s_clothes": "👚", - "woman’s_hat": "👒", - "woman’s_sandal": "👡", - "women_with_bunny_ears": "👯\u200d♀️", - "women_wrestling": "🤼\u200d♀️", - "women’s_room": "🚺", - "woozy_face": "🥴", - "world_map": "🗺", - "worried_face": "😟", - "wrapped_gift": "🎁", - "wrench": "🔧", - "writing_hand": "✍", - "writing_hand_dark_skin_tone": "✍🏿", - "writing_hand_light_skin_tone": "✍🏻", - "writing_hand_medium-dark_skin_tone": "✍🏾", - "writing_hand_medium-light_skin_tone": "✍🏼", - "writing_hand_medium_skin_tone": "✍🏽", - "yarn": "🧶", - "yawning_face": "🥱", - "yellow_circle": "🟡", - "yellow_heart": "💛", - "yellow_square": "🟨", - "yen_banknote": "💴", - "yo-yo": "🪀", - "yin_yang": "☯", - "zany_face": "🤪", - "zebra": "🦓", - "zipper-mouth_face": "🤐", - "zombie": "🧟", - "zzz": "💤", - "åland_islands": "🇦🇽", - "keycap_asterisk": "*⃣", - "keycap_digit_eight": "8⃣", - "keycap_digit_five": "5⃣", - "keycap_digit_four": "4⃣", - "keycap_digit_nine": "9⃣", - "keycap_digit_one": "1⃣", - "keycap_digit_seven": "7⃣", - "keycap_digit_six": "6⃣", - "keycap_digit_three": "3⃣", - "keycap_digit_two": "2⃣", - "keycap_digit_zero": "0⃣", - "keycap_number_sign": "#⃣", - "light_skin_tone": "🏻", - "medium_light_skin_tone": "🏼", - "medium_skin_tone": "🏽", - "medium_dark_skin_tone": "🏾", - "dark_skin_tone": "🏿", - "regional_indicator_symbol_letter_a": "🇦", - "regional_indicator_symbol_letter_b": "🇧", - "regional_indicator_symbol_letter_c": "🇨", - "regional_indicator_symbol_letter_d": "🇩", - "regional_indicator_symbol_letter_e": "🇪", - "regional_indicator_symbol_letter_f": "🇫", - "regional_indicator_symbol_letter_g": "🇬", - "regional_indicator_symbol_letter_h": "🇭", - "regional_indicator_symbol_letter_i": "🇮", - "regional_indicator_symbol_letter_j": "🇯", - "regional_indicator_symbol_letter_k": "🇰", - "regional_indicator_symbol_letter_l": "🇱", - "regional_indicator_symbol_letter_m": "🇲", - "regional_indicator_symbol_letter_n": "🇳", - "regional_indicator_symbol_letter_o": "🇴", - "regional_indicator_symbol_letter_p": "🇵", - "regional_indicator_symbol_letter_q": "🇶", - "regional_indicator_symbol_letter_r": "🇷", - "regional_indicator_symbol_letter_s": "🇸", - "regional_indicator_symbol_letter_t": "🇹", - "regional_indicator_symbol_letter_u": "🇺", - "regional_indicator_symbol_letter_v": "🇻", - "regional_indicator_symbol_letter_w": "🇼", - "regional_indicator_symbol_letter_x": "🇽", - "regional_indicator_symbol_letter_y": "🇾", - "regional_indicator_symbol_letter_z": "🇿", - "airplane_arriving": "🛬", - "space_invader": "👾", - "football": "🏈", - "anger": "💢", - "angry": "😠", - "anguished": "😧", - "signal_strength": "📶", - "arrows_counterclockwise": "🔄", - "arrow_heading_down": "⤵", - "arrow_heading_up": "⤴", - "art": "🎨", - "astonished": "😲", - "athletic_shoe": "👟", - "atm": "🏧", - "car": "🚗", - "red_car": "🚗", - "angel": "👼", - "back": "🔙", - "badminton_racquet_and_shuttlecock": "🏸", - "dollar": "💵", - "euro": "💶", - "pound": "💷", - "yen": "💴", - "barber": "💈", - "bath": "🛀", - "bear": "🐻", - "heartbeat": "💓", - "beer": "🍺", - "no_bell": "🔕", - "bento": "🍱", - "bike": "🚲", - "bicyclist": "🚴", - "8ball": "🎱", - "biohazard_sign": "☣", - "birthday": "🎂", - "black_circle_for_record": "⏺", - "clubs": "♣", - "diamonds": "♦", - "arrow_double_down": "⏬", - "hearts": "♥", - "rewind": "⏪", - "black_left__pointing_double_triangle_with_vertical_bar": "⏮", - "arrow_backward": "◀", - "black_medium_small_square": "◾", - "question": "❓", - "fast_forward": "⏩", - "black_right__pointing_double_triangle_with_vertical_bar": "⏭", - "arrow_forward": "▶", - "black_right__pointing_triangle_with_double_vertical_bar": "⏯", - "arrow_right": "➡", - "spades": "♠", - "black_square_for_stop": "⏹", - "sunny": "☀", - "phone": "☎", - "recycle": "♻", - "arrow_double_up": "⏫", - "busstop": "🚏", - "date": "📅", - "flags": "🎏", - "cat2": "🐈", - "joy_cat": "😹", - "smirk_cat": "😼", - "chart_with_downwards_trend": "📉", - "chart_with_upwards_trend": "📈", - "chart": "💹", - "mega": "📣", - "checkered_flag": "🏁", - "accept": "🉑", - "ideograph_advantage": "🉐", - "congratulations": "㊗", - "secret": "㊙", - "m": "Ⓜ", - "city_sunset": "🌆", - "clapper": "🎬", - "clap": "👏", - "beers": "🍻", - "clock830": "🕣", - "clock8": "🕗", - "clock1130": "🕦", - "clock11": "🕚", - "clock530": "🕠", - "clock5": "🕔", - "clock430": "🕟", - "clock4": "🕓", - "clock930": "🕤", - "clock9": "🕘", - "clock130": "🕜", - "clock1": "🕐", - "clock730": "🕢", - "clock7": "🕖", - "clock630": "🕡", - "clock6": "🕕", - "clock1030": "🕥", - "clock10": "🕙", - "clock330": "🕞", - "clock3": "🕒", - "clock1230": "🕧", - "clock12": "🕛", - "clock230": "🕝", - "clock2": "🕑", - "arrows_clockwise": "🔃", - "repeat": "🔁", - "repeat_one": "🔂", - "closed_lock_with_key": "🔐", - "mailbox_closed": "📪", - "mailbox": "📫", - "cloud_with_tornado": "🌪", - "cocktail": "🍸", - "boom": "💥", - "compression": "🗜", - "confounded": "😖", - "confused": "😕", - "rice": "🍚", - "cow2": "🐄", - "cricket_bat_and_ball": "🏏", - "x": "❌", - "cry": "😢", - "curry": "🍛", - "dagger_knife": "🗡", - "dancer": "💃", - "dark_sunglasses": "🕶", - "dash": "💨", - "truck": "🚚", - "derelict_house_building": "🏚", - "diamond_shape_with_a_dot_inside": "💠", - "dart": "🎯", - "disappointed_relieved": "😥", - "disappointed": "😞", - "do_not_litter": "🚯", - "dog2": "🐕", - "flipper": "🐬", - "loop": "➿", - "bangbang": "‼", - "double_vertical_bar": "⏸", - "dove_of_peace": "🕊", - "small_red_triangle_down": "🔻", - "arrow_down_small": "🔽", - "arrow_down": "⬇", - "dromedary_camel": "🐪", - "e__mail": "📧", - "corn": "🌽", - "ear_of_rice": "🌾", - "earth_americas": "🌎", - "earth_asia": "🌏", - "earth_africa": "🌍", - "eight_pointed_black_star": "✴", - "eight_spoked_asterisk": "✳", - "eject_symbol": "⏏", - "bulb": "💡", - "emoji_modifier_fitzpatrick_type__1__2": "🏻", - "emoji_modifier_fitzpatrick_type__3": "🏼", - "emoji_modifier_fitzpatrick_type__4": "🏽", - "emoji_modifier_fitzpatrick_type__5": "🏾", - "emoji_modifier_fitzpatrick_type__6": "🏿", - "end": "🔚", - "email": "✉", - "european_castle": "🏰", - "european_post_office": "🏤", - "interrobang": "⁉", - "expressionless": "😑", - "eyeglasses": "👓", - "massage": "💆", - "yum": "😋", - "scream": "😱", - "kissing_heart": "😘", - "sweat": "😓", - "face_with_head__bandage": "🤕", - "triumph": "😤", - "mask": "😷", - "no_good": "🙅", - "ok_woman": "🙆", - "open_mouth": "😮", - "cold_sweat": "😰", - "stuck_out_tongue": "😛", - "stuck_out_tongue_closed_eyes": "😝", - "stuck_out_tongue_winking_eye": "😜", - "joy": "😂", - "no_mouth": "😶", - "santa": "🎅", - "fax": "📠", - "fearful": "😨", - "field_hockey_stick_and_ball": "🏑", - "first_quarter_moon_with_face": "🌛", - "fish_cake": "🍥", - "fishing_pole_and_fish": "🎣", - "facepunch": "👊", - "punch": "👊", - "flag_for_afghanistan": "🇦🇫", - "flag_for_albania": "🇦🇱", - "flag_for_algeria": "🇩🇿", - "flag_for_american_samoa": "🇦🇸", - "flag_for_andorra": "🇦🇩", - "flag_for_angola": "🇦🇴", - "flag_for_anguilla": "🇦🇮", - "flag_for_antarctica": "🇦🇶", - "flag_for_antigua_&_barbuda": "🇦🇬", - "flag_for_argentina": "🇦🇷", - "flag_for_armenia": "🇦🇲", - "flag_for_aruba": "🇦🇼", - "flag_for_ascension_island": "🇦🇨", - "flag_for_australia": "🇦🇺", - "flag_for_austria": "🇦🇹", - "flag_for_azerbaijan": "🇦🇿", - "flag_for_bahamas": "🇧🇸", - "flag_for_bahrain": "🇧🇭", - "flag_for_bangladesh": "🇧🇩", - "flag_for_barbados": "🇧🇧", - "flag_for_belarus": "🇧🇾", - "flag_for_belgium": "🇧🇪", - "flag_for_belize": "🇧🇿", - "flag_for_benin": "🇧🇯", - "flag_for_bermuda": "🇧🇲", - "flag_for_bhutan": "🇧🇹", - "flag_for_bolivia": "🇧🇴", - "flag_for_bosnia_&_herzegovina": "🇧🇦", - "flag_for_botswana": "🇧🇼", - "flag_for_bouvet_island": "🇧🇻", - "flag_for_brazil": "🇧🇷", - "flag_for_british_indian_ocean_territory": "🇮🇴", - "flag_for_british_virgin_islands": "🇻🇬", - "flag_for_brunei": "🇧🇳", - "flag_for_bulgaria": "🇧🇬", - "flag_for_burkina_faso": "🇧🇫", - "flag_for_burundi": "🇧🇮", - "flag_for_cambodia": "🇰🇭", - "flag_for_cameroon": "🇨🇲", - "flag_for_canada": "🇨🇦", - "flag_for_canary_islands": "🇮🇨", - "flag_for_cape_verde": "🇨🇻", - "flag_for_caribbean_netherlands": "🇧🇶", - "flag_for_cayman_islands": "🇰🇾", - "flag_for_central_african_republic": "🇨🇫", - "flag_for_ceuta_&_melilla": "🇪🇦", - "flag_for_chad": "🇹🇩", - "flag_for_chile": "🇨🇱", - "flag_for_china": "🇨🇳", - "flag_for_christmas_island": "🇨🇽", - "flag_for_clipperton_island": "🇨🇵", - "flag_for_cocos__islands": "🇨🇨", - "flag_for_colombia": "🇨🇴", - "flag_for_comoros": "🇰🇲", - "flag_for_congo____brazzaville": "🇨🇬", - "flag_for_congo____kinshasa": "🇨🇩", - "flag_for_cook_islands": "🇨🇰", - "flag_for_costa_rica": "🇨🇷", - "flag_for_croatia": "🇭🇷", - "flag_for_cuba": "🇨🇺", - "flag_for_curaçao": "🇨🇼", - "flag_for_cyprus": "🇨🇾", - "flag_for_czech_republic": "🇨🇿", - "flag_for_côte_d’ivoire": "🇨🇮", - "flag_for_denmark": "🇩🇰", - "flag_for_diego_garcia": "🇩🇬", - "flag_for_djibouti": "🇩🇯", - "flag_for_dominica": "🇩🇲", - "flag_for_dominican_republic": "🇩🇴", - "flag_for_ecuador": "🇪🇨", - "flag_for_egypt": "🇪🇬", - "flag_for_el_salvador": "🇸🇻", - "flag_for_equatorial_guinea": "🇬🇶", - "flag_for_eritrea": "🇪🇷", - "flag_for_estonia": "🇪🇪", - "flag_for_ethiopia": "🇪🇹", - "flag_for_european_union": "🇪🇺", - "flag_for_falkland_islands": "🇫🇰", - "flag_for_faroe_islands": "🇫🇴", - "flag_for_fiji": "🇫🇯", - "flag_for_finland": "🇫🇮", - "flag_for_france": "🇫🇷", - "flag_for_french_guiana": "🇬🇫", - "flag_for_french_polynesia": "🇵🇫", - "flag_for_french_southern_territories": "🇹🇫", - "flag_for_gabon": "🇬🇦", - "flag_for_gambia": "🇬🇲", - "flag_for_georgia": "🇬🇪", - "flag_for_germany": "🇩🇪", - "flag_for_ghana": "🇬🇭", - "flag_for_gibraltar": "🇬🇮", - "flag_for_greece": "🇬🇷", - "flag_for_greenland": "🇬🇱", - "flag_for_grenada": "🇬🇩", - "flag_for_guadeloupe": "🇬🇵", - "flag_for_guam": "🇬🇺", - "flag_for_guatemala": "🇬🇹", - "flag_for_guernsey": "🇬🇬", - "flag_for_guinea": "🇬🇳", - "flag_for_guinea__bissau": "🇬🇼", - "flag_for_guyana": "🇬🇾", - "flag_for_haiti": "🇭🇹", - "flag_for_heard_&_mcdonald_islands": "🇭🇲", - "flag_for_honduras": "🇭🇳", - "flag_for_hong_kong": "🇭🇰", - "flag_for_hungary": "🇭🇺", - "flag_for_iceland": "🇮🇸", - "flag_for_india": "🇮🇳", - "flag_for_indonesia": "🇮🇩", - "flag_for_iran": "🇮🇷", - "flag_for_iraq": "🇮🇶", - "flag_for_ireland": "🇮🇪", - "flag_for_isle_of_man": "🇮🇲", - "flag_for_israel": "🇮🇱", - "flag_for_italy": "🇮🇹", - "flag_for_jamaica": "🇯🇲", - "flag_for_japan": "🇯🇵", - "flag_for_jersey": "🇯🇪", - "flag_for_jordan": "🇯🇴", - "flag_for_kazakhstan": "🇰🇿", - "flag_for_kenya": "🇰🇪", - "flag_for_kiribati": "🇰🇮", - "flag_for_kosovo": "🇽🇰", - "flag_for_kuwait": "🇰🇼", - "flag_for_kyrgyzstan": "🇰🇬", - "flag_for_laos": "🇱🇦", - "flag_for_latvia": "🇱🇻", - "flag_for_lebanon": "🇱🇧", - "flag_for_lesotho": "🇱🇸", - "flag_for_liberia": "🇱🇷", - "flag_for_libya": "🇱🇾", - "flag_for_liechtenstein": "🇱🇮", - "flag_for_lithuania": "🇱🇹", - "flag_for_luxembourg": "🇱🇺", - "flag_for_macau": "🇲🇴", - "flag_for_macedonia": "🇲🇰", - "flag_for_madagascar": "🇲🇬", - "flag_for_malawi": "🇲🇼", - "flag_for_malaysia": "🇲🇾", - "flag_for_maldives": "🇲🇻", - "flag_for_mali": "🇲🇱", - "flag_for_malta": "🇲🇹", - "flag_for_marshall_islands": "🇲🇭", - "flag_for_martinique": "🇲🇶", - "flag_for_mauritania": "🇲🇷", - "flag_for_mauritius": "🇲🇺", - "flag_for_mayotte": "🇾🇹", - "flag_for_mexico": "🇲🇽", - "flag_for_micronesia": "🇫🇲", - "flag_for_moldova": "🇲🇩", - "flag_for_monaco": "🇲🇨", - "flag_for_mongolia": "🇲🇳", - "flag_for_montenegro": "🇲🇪", - "flag_for_montserrat": "🇲🇸", - "flag_for_morocco": "🇲🇦", - "flag_for_mozambique": "🇲🇿", - "flag_for_myanmar": "🇲🇲", - "flag_for_namibia": "🇳🇦", - "flag_for_nauru": "🇳🇷", - "flag_for_nepal": "🇳🇵", - "flag_for_netherlands": "🇳🇱", - "flag_for_new_caledonia": "🇳🇨", - "flag_for_new_zealand": "🇳🇿", - "flag_for_nicaragua": "🇳🇮", - "flag_for_niger": "🇳🇪", - "flag_for_nigeria": "🇳🇬", - "flag_for_niue": "🇳🇺", - "flag_for_norfolk_island": "🇳🇫", - "flag_for_north_korea": "🇰🇵", - "flag_for_northern_mariana_islands": "🇲🇵", - "flag_for_norway": "🇳🇴", - "flag_for_oman": "🇴🇲", - "flag_for_pakistan": "🇵🇰", - "flag_for_palau": "🇵🇼", - "flag_for_palestinian_territories": "🇵🇸", - "flag_for_panama": "🇵🇦", - "flag_for_papua_new_guinea": "🇵🇬", - "flag_for_paraguay": "🇵🇾", - "flag_for_peru": "🇵🇪", - "flag_for_philippines": "🇵🇭", - "flag_for_pitcairn_islands": "🇵🇳", - "flag_for_poland": "🇵🇱", - "flag_for_portugal": "🇵🇹", - "flag_for_puerto_rico": "🇵🇷", - "flag_for_qatar": "🇶🇦", - "flag_for_romania": "🇷🇴", - "flag_for_russia": "🇷🇺", - "flag_for_rwanda": "🇷🇼", - "flag_for_réunion": "🇷🇪", - "flag_for_samoa": "🇼🇸", - "flag_for_san_marino": "🇸🇲", - "flag_for_saudi_arabia": "🇸🇦", - "flag_for_senegal": "🇸🇳", - "flag_for_serbia": "🇷🇸", - "flag_for_seychelles": "🇸🇨", - "flag_for_sierra_leone": "🇸🇱", - "flag_for_singapore": "🇸🇬", - "flag_for_sint_maarten": "🇸🇽", - "flag_for_slovakia": "🇸🇰", - "flag_for_slovenia": "🇸🇮", - "flag_for_solomon_islands": "🇸🇧", - "flag_for_somalia": "🇸🇴", - "flag_for_south_africa": "🇿🇦", - "flag_for_south_georgia_&_south_sandwich_islands": "🇬🇸", - "flag_for_south_korea": "🇰🇷", - "flag_for_south_sudan": "🇸🇸", - "flag_for_spain": "🇪🇸", - "flag_for_sri_lanka": "🇱🇰", - "flag_for_st._barthélemy": "🇧🇱", - "flag_for_st._helena": "🇸🇭", - "flag_for_st._kitts_&_nevis": "🇰🇳", - "flag_for_st._lucia": "🇱🇨", - "flag_for_st._martin": "🇲🇫", - "flag_for_st._pierre_&_miquelon": "🇵🇲", - "flag_for_st._vincent_&_grenadines": "🇻🇨", - "flag_for_sudan": "🇸🇩", - "flag_for_suriname": "🇸🇷", - "flag_for_svalbard_&_jan_mayen": "🇸🇯", - "flag_for_swaziland": "🇸🇿", - "flag_for_sweden": "🇸🇪", - "flag_for_switzerland": "🇨🇭", - "flag_for_syria": "🇸🇾", - "flag_for_são_tomé_&_príncipe": "🇸🇹", - "flag_for_taiwan": "🇹🇼", - "flag_for_tajikistan": "🇹🇯", - "flag_for_tanzania": "🇹🇿", - "flag_for_thailand": "🇹🇭", - "flag_for_timor__leste": "🇹🇱", - "flag_for_togo": "🇹🇬", - "flag_for_tokelau": "🇹🇰", - "flag_for_tonga": "🇹🇴", - "flag_for_trinidad_&_tobago": "🇹🇹", - "flag_for_tristan_da_cunha": "🇹🇦", - "flag_for_tunisia": "🇹🇳", - "flag_for_turkey": "🇹🇷", - "flag_for_turkmenistan": "🇹🇲", - "flag_for_turks_&_caicos_islands": "🇹🇨", - "flag_for_tuvalu": "🇹🇻", - "flag_for_u.s._outlying_islands": "🇺🇲", - "flag_for_u.s._virgin_islands": "🇻🇮", - "flag_for_uganda": "🇺🇬", - "flag_for_ukraine": "🇺🇦", - "flag_for_united_arab_emirates": "🇦🇪", - "flag_for_united_kingdom": "🇬🇧", - "flag_for_united_states": "🇺🇸", - "flag_for_uruguay": "🇺🇾", - "flag_for_uzbekistan": "🇺🇿", - "flag_for_vanuatu": "🇻🇺", - "flag_for_vatican_city": "🇻🇦", - "flag_for_venezuela": "🇻🇪", - "flag_for_vietnam": "🇻🇳", - "flag_for_wallis_&_futuna": "🇼🇫", - "flag_for_western_sahara": "🇪🇭", - "flag_for_yemen": "🇾🇪", - "flag_for_zambia": "🇿🇲", - "flag_for_zimbabwe": "🇿🇼", - "flag_for_åland_islands": "🇦🇽", - "golf": "⛳", - "fleur__de__lis": "⚜", - "muscle": "💪", - "flushed": "😳", - "frame_with_picture": "🖼", - "fries": "🍟", - "frog": "🐸", - "hatched_chick": "🐥", - "frowning": "😦", - "fuelpump": "⛽", - "full_moon_with_face": "🌝", - "gem": "💎", - "star2": "🌟", - "golfer": "🏌", - "mortar_board": "🎓", - "grimacing": "😬", - "smile_cat": "😸", - "grinning": "😀", - "grin": "😁", - "heartpulse": "💗", - "guardsman": "💂", - "haircut": "💇", - "hamster": "🐹", - "raising_hand": "🙋", - "headphones": "🎧", - "hear_no_evil": "🙉", - "cupid": "💘", - "gift_heart": "💝", - "heart": "❤", - "exclamation": "❗", - "heavy_exclamation_mark": "❗", - "heavy_heart_exclamation_mark_ornament": "❣", - "o": "⭕", - "helm_symbol": "⎈", - "helmet_with_white_cross": "⛑", - "high_heel": "👠", - "bullettrain_side": "🚄", - "bullettrain_front": "🚅", - "high_brightness": "🔆", - "zap": "⚡", - "hocho": "🔪", - "knife": "🔪", - "bee": "🐝", - "traffic_light": "🚥", - "racehorse": "🐎", - "coffee": "☕", - "hotsprings": "♨", - "hourglass": "⌛", - "hourglass_flowing_sand": "⏳", - "house_buildings": "🏘", - "100": "💯", - "hushed": "😯", - "ice_hockey_stick_and_puck": "🏒", - "imp": "👿", - "information_desk_person": "💁", - "information_source": "ℹ", - "capital_abcd": "🔠", - "abc": "🔤", - "abcd": "🔡", - "1234": "🔢", - "symbols": "🔣", - "izakaya_lantern": "🏮", - "lantern": "🏮", - "jack_o_lantern": "🎃", - "dolls": "🎎", - "japanese_goblin": "👺", - "japanese_ogre": "👹", - "beginner": "🔰", - "zero": "0️⃣", - "one": "1️⃣", - "ten": "🔟", - "two": "2️⃣", - "three": "3️⃣", - "four": "4️⃣", - "five": "5️⃣", - "six": "6️⃣", - "seven": "7️⃣", - "eight": "8️⃣", - "nine": "9️⃣", - "couplekiss": "💏", - "kissing_cat": "😽", - "kissing": "😗", - "kissing_closed_eyes": "😚", - "kissing_smiling_eyes": "😙", - "beetle": "🐞", - "large_blue_circle": "🔵", - "last_quarter_moon_with_face": "🌜", - "leaves": "🍃", - "mag": "🔍", - "left_right_arrow": "↔", - "leftwards_arrow_with_hook": "↩", - "arrow_left": "⬅", - "lock": "🔒", - "lock_with_ink_pen": "🔏", - "sob": "😭", - "low_brightness": "🔅", - "lower_left_ballpoint_pen": "🖊", - "lower_left_crayon": "🖍", - "lower_left_fountain_pen": "🖋", - "lower_left_paintbrush": "🖌", - "mahjong": "🀄", - "couple": "👫", - "man_in_business_suit_levitating": "🕴", - "man_with_gua_pi_mao": "👲", - "man_with_turban": "👳", - "mans_shoe": "👞", - "shoe": "👞", - "menorah_with_nine_branches": "🕎", - "mens": "🚹", - "minidisc": "💽", - "iphone": "📱", - "calling": "📲", - "money__mouth_face": "🤑", - "moneybag": "💰", - "rice_scene": "🎑", - "mountain_bicyclist": "🚵", - "mouse2": "🐁", - "lips": "👄", - "moyai": "🗿", - "notes": "🎶", - "nail_care": "💅", - "ab": "🆎", - "negative_squared_cross_mark": "❎", - "a": "🅰", - "b": "🅱", - "o2": "🅾", - "parking": "🅿", - "new_moon_with_face": "🌚", - "no_entry_sign": "🚫", - "underage": "🔞", - "non__potable_water": "🚱", - "arrow_upper_right": "↗", - "arrow_upper_left": "↖", - "office": "🏢", - "older_man": "👴", - "older_woman": "👵", - "om_symbol": "🕉", - "on": "🔛", - "book": "📖", - "unlock": "🔓", - "mailbox_with_no_mail": "📭", - "mailbox_with_mail": "📬", - "cd": "💿", - "tada": "🎉", - "feet": "🐾", - "walking": "🚶", - "pencil2": "✏", - "pensive": "😔", - "persevere": "😣", - "bow": "🙇", - "raised_hands": "🙌", - "person_with_ball": "⛹", - "person_with_blond_hair": "👱", - "pray": "🙏", - "person_with_pouting_face": "🙎", - "computer": "💻", - "pig2": "🐖", - "hankey": "💩", - "poop": "💩", - "shit": "💩", - "bamboo": "🎍", - "gun": "🔫", - "black_joker": "🃏", - "rotating_light": "🚨", - "cop": "👮", - "stew": "🍲", - "pouch": "👝", - "pouting_cat": "😾", - "rage": "😡", - "put_litter_in_its_place": "🚮", - "rabbit2": "🐇", - "racing_motorcycle": "🏍", - "radioactive_sign": "☢", - "fist": "✊", - "hand": "✋", - "raised_hand_with_fingers_splayed": "🖐", - "raised_hand_with_part_between_middle_and_ring_fingers": "🖖", - "blue_car": "🚙", - "apple": "🍎", - "relieved": "😌", - "reversed_hand_with_middle_finger_extended": "🖕", - "mag_right": "🔎", - "arrow_right_hook": "↪", - "sweet_potato": "🍠", - "robot": "🤖", - "rolled__up_newspaper": "🗞", - "rowboat": "🚣", - "runner": "🏃", - "running": "🏃", - "running_shirt_with_sash": "🎽", - "boat": "⛵", - "scales": "⚖", - "school_satchel": "🎒", - "scorpius": "♏", - "see_no_evil": "🙈", - "sheep": "🐑", - "stars": "🌠", - "cake": "🍰", - "six_pointed_star": "🔯", - "ski": "🎿", - "sleeping_accommodation": "🛌", - "sleeping": "😴", - "sleepy": "😪", - "sleuth_or_spy": "🕵", - "heart_eyes_cat": "😻", - "smiley_cat": "😺", - "innocent": "😇", - "heart_eyes": "😍", - "smiling_imp": "😈", - "smiley": "😃", - "sweat_smile": "😅", - "smile": "😄", - "laughing": "😆", - "satisfied": "😆", - "blush": "😊", - "smirk": "😏", - "smoking": "🚬", - "snow_capped_mountain": "🏔", - "soccer": "⚽", - "icecream": "🍦", - "soon": "🔜", - "arrow_lower_right": "↘", - "arrow_lower_left": "↙", - "speak_no_evil": "🙊", - "speaker": "🔈", - "mute": "🔇", - "sound": "🔉", - "loud_sound": "🔊", - "speaking_head_in_silhouette": "🗣", - "spiral_calendar_pad": "🗓", - "spiral_note_pad": "🗒", - "shell": "🐚", - "sweat_drops": "💦", - "u5272": "🈹", - "u5408": "🈴", - "u55b6": "🈺", - "u6307": "🈯", - "u6708": "🈷", - "u6709": "🈶", - "u6e80": "🈵", - "u7121": "🈚", - "u7533": "🈸", - "u7981": "🈲", - "u7a7a": "🈳", - "cl": "🆑", - "cool": "🆒", - "free": "🆓", - "id": "🆔", - "koko": "🈁", - "sa": "🈂", - "new": "🆕", - "ng": "🆖", - "ok": "🆗", - "sos": "🆘", - "up": "🆙", - "vs": "🆚", - "steam_locomotive": "🚂", - "ramen": "🍜", - "partly_sunny": "⛅", - "city_sunrise": "🌇", - "surfer": "🏄", - "swimmer": "🏊", - "shirt": "👕", - "tshirt": "👕", - "table_tennis_paddle_and_ball": "🏓", - "tea": "🍵", - "tv": "📺", - "three_button_mouse": "🖱", - "+1": "👍", - "thumbsup": "👍", - "__1": "👎", - "-1": "👎", - "thumbsdown": "👎", - "thunder_cloud_and_rain": "⛈", - "tiger2": "🐅", - "tophat": "🎩", - "top": "🔝", - "tm": "™", - "train2": "🚆", - "triangular_flag_on_post": "🚩", - "trident": "🔱", - "twisted_rightwards_arrows": "🔀", - "unamused": "😒", - "small_red_triangle": "🔺", - "arrow_up_small": "🔼", - "arrow_up_down": "↕", - "upside__down_face": "🙃", - "arrow_up": "⬆", - "v": "✌", - "vhs": "📼", - "wc": "🚾", - "ocean": "🌊", - "waving_black_flag": "🏴", - "wave": "👋", - "waving_white_flag": "🏳", - "moon": "🌔", - "scream_cat": "🙀", - "weary": "😩", - "weight_lifter": "🏋", - "whale2": "🐋", - "wheelchair": "♿", - "point_down": "👇", - "grey_exclamation": "❕", - "white_frowning_face": "☹", - "white_check_mark": "✅", - "point_left": "👈", - "white_medium_small_square": "◽", - "star": "⭐", - "grey_question": "❔", - "point_right": "👉", - "relaxed": "☺", - "white_sun_behind_cloud": "🌥", - "white_sun_behind_cloud_with_rain": "🌦", - "white_sun_with_small_cloud": "🌤", - "point_up_2": "👆", - "point_up": "☝", - "wind_blowing_face": "🌬", - "wink": "😉", - "wolf": "🐺", - "dancers": "👯", - "boot": "👢", - "womans_clothes": "👚", - "womans_hat": "👒", - "sandal": "👡", - "womens": "🚺", - "worried": "😟", - "gift": "🎁", - "zipper__mouth_face": "🤐", - "regional_indicator_a": "🇦", - "regional_indicator_b": "🇧", - "regional_indicator_c": "🇨", - "regional_indicator_d": "🇩", - "regional_indicator_e": "🇪", - "regional_indicator_f": "🇫", - "regional_indicator_g": "🇬", - "regional_indicator_h": "🇭", - "regional_indicator_i": "🇮", - "regional_indicator_j": "🇯", - "regional_indicator_k": "🇰", - "regional_indicator_l": "🇱", - "regional_indicator_m": "🇲", - "regional_indicator_n": "🇳", - "regional_indicator_o": "🇴", - "regional_indicator_p": "🇵", - "regional_indicator_q": "🇶", - "regional_indicator_r": "🇷", - "regional_indicator_s": "🇸", - "regional_indicator_t": "🇹", - "regional_indicator_u": "🇺", - "regional_indicator_v": "🇻", - "regional_indicator_w": "🇼", - "regional_indicator_x": "🇽", - "regional_indicator_y": "🇾", - "regional_indicator_z": "🇿", -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_emoji_replace.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_emoji_replace.py deleted file mode 100644 index bb2cafa1..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_emoji_replace.py +++ /dev/null @@ -1,32 +0,0 @@ -from typing import Callable, Match, Optional -import re - -from ._emoji_codes import EMOJI - - -_ReStringMatch = Match[str] # regex match object -_ReSubCallable = Callable[[_ReStringMatch], str] # Callable invoked by re.sub -_EmojiSubMethod = Callable[[_ReSubCallable, str], str] # Sub method of a compiled re - - -def _emoji_replace( - text: str, - default_variant: Optional[str] = None, - _emoji_sub: _EmojiSubMethod = re.compile(r"(:(\S*?)(?:(?:\-)(emoji|text))?:)").sub, -) -> str: - """Replace emoji code in text.""" - get_emoji = EMOJI.__getitem__ - variants = {"text": "\uFE0E", "emoji": "\uFE0F"} - get_variant = variants.get - default_variant_code = variants.get(default_variant, "") if default_variant else "" - - def do_replace(match: Match[str]) -> str: - emoji_code, emoji_name, variant = match.groups() - try: - return get_emoji(emoji_name.lower()) + get_variant( - variant, default_variant_code - ) - except KeyError: - return emoji_code - - return _emoji_sub(do_replace, text) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_export_format.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_export_format.py deleted file mode 100644 index 094d2dc2..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_export_format.py +++ /dev/null @@ -1,76 +0,0 @@ -CONSOLE_HTML_FORMAT = """\ -<!DOCTYPE html> -<head> -<meta charset="UTF-8"> -<style> -{stylesheet} -body {{ - color: {foreground}; - background-color: {background}; -}} -</style> -</head> -<html> -<body> - <pre style="font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace"><code>{code}</code></pre> -</body> -</html> -""" - -CONSOLE_SVG_FORMAT = """\ -<svg class="rich-terminal" viewBox="0 0 {width} {height}" xmlns="http://www.w3.org/2000/svg"> - <!-- Generated with Rich https://www.textualize.io --> - <style> - - @font-face {{ - font-family: "Fira Code"; - src: local("FiraCode-Regular"), - url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"), - url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff"); - font-style: normal; - font-weight: 400; - }} - @font-face {{ - font-family: "Fira Code"; - src: local("FiraCode-Bold"), - url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"), - url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff"); - font-style: bold; - font-weight: 700; - }} - - .{unique_id}-matrix {{ - font-family: Fira Code, monospace; - font-size: {char_height}px; - line-height: {line_height}px; - font-variant-east-asian: full-width; - }} - - .{unique_id}-title {{ - font-size: 18px; - font-weight: bold; - font-family: arial; - }} - - {styles} - </style> - - <defs> - <clipPath id="{unique_id}-clip-terminal"> - <rect x="0" y="0" width="{terminal_width}" height="{terminal_height}" /> - </clipPath> - {lines} - </defs> - - {chrome} - <g transform="translate({terminal_x}, {terminal_y})" clip-path="url(#{unique_id}-clip-terminal)"> - {backgrounds} - <g class="{unique_id}-matrix"> - {matrix} - </g> - </g> -</svg> -""" - -_SVG_FONT_FAMILY = "Rich Fira Code" -_SVG_CLASSES_PREFIX = "rich-svg" diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_extension.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_extension.py deleted file mode 100644 index 38658864..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_extension.py +++ /dev/null @@ -1,10 +0,0 @@ -from typing import Any - - -def load_ipython_extension(ip: Any) -> None: # pragma: no cover - # prevent circular import - from rich.pretty import install - from rich.traceback import install as tr_install - - install() - tr_install() diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_fileno.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_fileno.py deleted file mode 100644 index b17ee651..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_fileno.py +++ /dev/null @@ -1,24 +0,0 @@ -from __future__ import annotations - -from typing import IO, Callable - - -def get_fileno(file_like: IO[str]) -> int | None: - """Get fileno() from a file, accounting for poorly implemented file-like objects. - - Args: - file_like (IO): A file-like object. - - Returns: - int | None: The result of fileno if available, or None if operation failed. - """ - fileno: Callable[[], int] | None = getattr(file_like, "fileno", None) - if fileno is not None: - try: - return fileno() - except Exception: - # `fileno` is documented as potentially raising a OSError - # Alas, from the issues, there are so many poorly implemented file-like objects, - # that `fileno()` can raise just about anything. - return None - return None diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_inspect.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_inspect.py deleted file mode 100644 index 30446ceb..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_inspect.py +++ /dev/null @@ -1,270 +0,0 @@ -from __future__ import absolute_import - -import inspect -from inspect import cleandoc, getdoc, getfile, isclass, ismodule, signature -from typing import Any, Collection, Iterable, Optional, Tuple, Type, Union - -from .console import Group, RenderableType -from .control import escape_control_codes -from .highlighter import ReprHighlighter -from .jupyter import JupyterMixin -from .panel import Panel -from .pretty import Pretty -from .table import Table -from .text import Text, TextType - - -def _first_paragraph(doc: str) -> str: - """Get the first paragraph from a docstring.""" - paragraph, _, _ = doc.partition("\n\n") - return paragraph - - -class Inspect(JupyterMixin): - """A renderable to inspect any Python Object. - - Args: - obj (Any): An object to inspect. - title (str, optional): Title to display over inspect result, or None use type. Defaults to None. - help (bool, optional): Show full help text rather than just first paragraph. Defaults to False. - methods (bool, optional): Enable inspection of callables. Defaults to False. - docs (bool, optional): Also render doc strings. Defaults to True. - private (bool, optional): Show private attributes (beginning with underscore). Defaults to False. - dunder (bool, optional): Show attributes starting with double underscore. Defaults to False. - sort (bool, optional): Sort attributes alphabetically. Defaults to True. - all (bool, optional): Show all attributes. Defaults to False. - value (bool, optional): Pretty print value of object. Defaults to True. - """ - - def __init__( - self, - obj: Any, - *, - title: Optional[TextType] = None, - help: bool = False, - methods: bool = False, - docs: bool = True, - private: bool = False, - dunder: bool = False, - sort: bool = True, - all: bool = True, - value: bool = True, - ) -> None: - self.highlighter = ReprHighlighter() - self.obj = obj - self.title = title or self._make_title(obj) - if all: - methods = private = dunder = True - self.help = help - self.methods = methods - self.docs = docs or help - self.private = private or dunder - self.dunder = dunder - self.sort = sort - self.value = value - - def _make_title(self, obj: Any) -> Text: - """Make a default title.""" - title_str = ( - str(obj) - if (isclass(obj) or callable(obj) or ismodule(obj)) - else str(type(obj)) - ) - title_text = self.highlighter(title_str) - return title_text - - def __rich__(self) -> Panel: - return Panel.fit( - Group(*self._render()), - title=self.title, - border_style="scope.border", - padding=(0, 1), - ) - - def _get_signature(self, name: str, obj: Any) -> Optional[Text]: - """Get a signature for a callable.""" - try: - _signature = str(signature(obj)) + ":" - except ValueError: - _signature = "(...)" - except TypeError: - return None - - source_filename: Optional[str] = None - try: - source_filename = getfile(obj) - except (OSError, TypeError): - # OSError is raised if obj has no source file, e.g. when defined in REPL. - pass - - callable_name = Text(name, style="inspect.callable") - if source_filename: - callable_name.stylize(f"link file://{source_filename}") - signature_text = self.highlighter(_signature) - - qualname = name or getattr(obj, "__qualname__", name) - - # If obj is a module, there may be classes (which are callable) to display - if inspect.isclass(obj): - prefix = "class" - elif inspect.iscoroutinefunction(obj): - prefix = "async def" - else: - prefix = "def" - - qual_signature = Text.assemble( - (f"{prefix} ", f"inspect.{prefix.replace(' ', '_')}"), - (qualname, "inspect.callable"), - signature_text, - ) - - return qual_signature - - def _render(self) -> Iterable[RenderableType]: - """Render object.""" - - def sort_items(item: Tuple[str, Any]) -> Tuple[bool, str]: - key, (_error, value) = item - return (callable(value), key.strip("_").lower()) - - def safe_getattr(attr_name: str) -> Tuple[Any, Any]: - """Get attribute or any exception.""" - try: - return (None, getattr(obj, attr_name)) - except Exception as error: - return (error, None) - - obj = self.obj - keys = dir(obj) - total_items = len(keys) - if not self.dunder: - keys = [key for key in keys if not key.startswith("__")] - if not self.private: - keys = [key for key in keys if not key.startswith("_")] - not_shown_count = total_items - len(keys) - items = [(key, safe_getattr(key)) for key in keys] - if self.sort: - items.sort(key=sort_items) - - items_table = Table.grid(padding=(0, 1), expand=False) - items_table.add_column(justify="right") - add_row = items_table.add_row - highlighter = self.highlighter - - if callable(obj): - signature = self._get_signature("", obj) - if signature is not None: - yield signature - yield "" - - if self.docs: - _doc = self._get_formatted_doc(obj) - if _doc is not None: - doc_text = Text(_doc, style="inspect.help") - doc_text = highlighter(doc_text) - yield doc_text - yield "" - - if self.value and not (isclass(obj) or callable(obj) or ismodule(obj)): - yield Panel( - Pretty(obj, indent_guides=True, max_length=10, max_string=60), - border_style="inspect.value.border", - ) - yield "" - - for key, (error, value) in items: - key_text = Text.assemble( - ( - key, - "inspect.attr.dunder" if key.startswith("__") else "inspect.attr", - ), - (" =", "inspect.equals"), - ) - if error is not None: - warning = key_text.copy() - warning.stylize("inspect.error") - add_row(warning, highlighter(repr(error))) - continue - - if callable(value): - if not self.methods: - continue - - _signature_text = self._get_signature(key, value) - if _signature_text is None: - add_row(key_text, Pretty(value, highlighter=highlighter)) - else: - if self.docs: - docs = self._get_formatted_doc(value) - if docs is not None: - _signature_text.append("\n" if "\n" in docs else " ") - doc = highlighter(docs) - doc.stylize("inspect.doc") - _signature_text.append(doc) - - add_row(key_text, _signature_text) - else: - add_row(key_text, Pretty(value, highlighter=highlighter)) - if items_table.row_count: - yield items_table - elif not_shown_count: - yield Text.from_markup( - f"[b cyan]{not_shown_count}[/][i] attribute(s) not shown.[/i] " - f"Run [b][magenta]inspect[/]([not b]inspect[/])[/b] for options." - ) - - def _get_formatted_doc(self, object_: Any) -> Optional[str]: - """ - Extract the docstring of an object, process it and returns it. - The processing consists in cleaning up the doctring's indentation, - taking only its 1st paragraph if `self.help` is not True, - and escape its control codes. - - Args: - object_ (Any): the object to get the docstring from. - - Returns: - Optional[str]: the processed docstring, or None if no docstring was found. - """ - docs = getdoc(object_) - if docs is None: - return None - docs = cleandoc(docs).strip() - if not self.help: - docs = _first_paragraph(docs) - return escape_control_codes(docs) - - -def get_object_types_mro(obj: Union[object, Type[Any]]) -> Tuple[type, ...]: - """Returns the MRO of an object's class, or of the object itself if it's a class.""" - if not hasattr(obj, "__mro__"): - # N.B. we cannot use `if type(obj) is type` here because it doesn't work with - # some types of classes, such as the ones that use abc.ABCMeta. - obj = type(obj) - return getattr(obj, "__mro__", ()) - - -def get_object_types_mro_as_strings(obj: object) -> Collection[str]: - """ - Returns the MRO of an object's class as full qualified names, or of the object itself if it's a class. - - Examples: - `object_types_mro_as_strings(JSONDecoder)` will return `['json.decoder.JSONDecoder', 'builtins.object']` - """ - return [ - f'{getattr(type_, "__module__", "")}.{getattr(type_, "__qualname__", "")}' - for type_ in get_object_types_mro(obj) - ] - - -def is_object_one_of_types( - obj: object, fully_qualified_types_names: Collection[str] -) -> bool: - """ - Returns `True` if the given object's class (or the object itself, if it's a class) has one of the - fully qualified names in its MRO. - """ - for type_name in get_object_types_mro_as_strings(obj): - if type_name in fully_qualified_types_names: - return True - return False diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_log_render.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_log_render.py deleted file mode 100644 index e8810100..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_log_render.py +++ /dev/null @@ -1,94 +0,0 @@ -from datetime import datetime -from typing import Iterable, List, Optional, TYPE_CHECKING, Union, Callable - - -from .text import Text, TextType - -if TYPE_CHECKING: - from .console import Console, ConsoleRenderable, RenderableType - from .table import Table - -FormatTimeCallable = Callable[[datetime], Text] - - -class LogRender: - def __init__( - self, - show_time: bool = True, - show_level: bool = False, - show_path: bool = True, - time_format: Union[str, FormatTimeCallable] = "[%x %X]", - omit_repeated_times: bool = True, - level_width: Optional[int] = 8, - ) -> None: - self.show_time = show_time - self.show_level = show_level - self.show_path = show_path - self.time_format = time_format - self.omit_repeated_times = omit_repeated_times - self.level_width = level_width - self._last_time: Optional[Text] = None - - def __call__( - self, - console: "Console", - renderables: Iterable["ConsoleRenderable"], - log_time: Optional[datetime] = None, - time_format: Optional[Union[str, FormatTimeCallable]] = None, - level: TextType = "", - path: Optional[str] = None, - line_no: Optional[int] = None, - link_path: Optional[str] = None, - ) -> "Table": - from .containers import Renderables - from .table import Table - - output = Table.grid(padding=(0, 1)) - output.expand = True - if self.show_time: - output.add_column(style="log.time") - if self.show_level: - output.add_column(style="log.level", width=self.level_width) - output.add_column(ratio=1, style="log.message", overflow="fold") - if self.show_path and path: - output.add_column(style="log.path") - row: List["RenderableType"] = [] - if self.show_time: - log_time = log_time or console.get_datetime() - time_format = time_format or self.time_format - if callable(time_format): - log_time_display = time_format(log_time) - else: - log_time_display = Text(log_time.strftime(time_format)) - if log_time_display == self._last_time and self.omit_repeated_times: - row.append(Text(" " * len(log_time_display))) - else: - row.append(log_time_display) - self._last_time = log_time_display - if self.show_level: - row.append(level) - - row.append(Renderables(renderables)) - if self.show_path and path: - path_text = Text() - path_text.append( - path, style=f"link file://{link_path}" if link_path else "" - ) - if line_no: - path_text.append(":") - path_text.append( - f"{line_no}", - style=f"link file://{link_path}#{line_no}" if link_path else "", - ) - row.append(path_text) - - output.add_row(*row) - return output - - -if __name__ == "__main__": # pragma: no cover - from rich.console import Console - - c = Console() - c.print("[on blue]Hello", justify="right") - c.log("[on blue]hello", justify="right") diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_loop.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_loop.py deleted file mode 100644 index 01c6cafb..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_loop.py +++ /dev/null @@ -1,43 +0,0 @@ -from typing import Iterable, Tuple, TypeVar - -T = TypeVar("T") - - -def loop_first(values: Iterable[T]) -> Iterable[Tuple[bool, T]]: - """Iterate and generate a tuple with a flag for first value.""" - iter_values = iter(values) - try: - value = next(iter_values) - except StopIteration: - return - yield True, value - for value in iter_values: - yield False, value - - -def loop_last(values: Iterable[T]) -> Iterable[Tuple[bool, T]]: - """Iterate and generate a tuple with a flag for last value.""" - iter_values = iter(values) - try: - previous_value = next(iter_values) - except StopIteration: - return - for value in iter_values: - yield False, previous_value - previous_value = value - yield True, previous_value - - -def loop_first_last(values: Iterable[T]) -> Iterable[Tuple[bool, bool, T]]: - """Iterate and generate a tuple with a flag for first and last value.""" - iter_values = iter(values) - try: - previous_value = next(iter_values) - except StopIteration: - return - first = True - for value in iter_values: - yield first, False, previous_value - first = False - previous_value = value - yield first, True, previous_value diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_null_file.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_null_file.py deleted file mode 100644 index b659673e..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_null_file.py +++ /dev/null @@ -1,69 +0,0 @@ -from types import TracebackType -from typing import IO, Iterable, Iterator, List, Optional, Type - - -class NullFile(IO[str]): - def close(self) -> None: - pass - - def isatty(self) -> bool: - return False - - def read(self, __n: int = 1) -> str: - return "" - - def readable(self) -> bool: - return False - - def readline(self, __limit: int = 1) -> str: - return "" - - def readlines(self, __hint: int = 1) -> List[str]: - return [] - - def seek(self, __offset: int, __whence: int = 1) -> int: - return 0 - - def seekable(self) -> bool: - return False - - def tell(self) -> int: - return 0 - - def truncate(self, __size: Optional[int] = 1) -> int: - return 0 - - def writable(self) -> bool: - return False - - def writelines(self, __lines: Iterable[str]) -> None: - pass - - def __next__(self) -> str: - return "" - - def __iter__(self) -> Iterator[str]: - return iter([""]) - - def __enter__(self) -> IO[str]: - pass - - def __exit__( - self, - __t: Optional[Type[BaseException]], - __value: Optional[BaseException], - __traceback: Optional[TracebackType], - ) -> None: - pass - - def write(self, text: str) -> int: - return 0 - - def flush(self) -> None: - pass - - def fileno(self) -> int: - return -1 - - -NULL_FILE = NullFile() diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_palettes.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_palettes.py deleted file mode 100644 index 3c748d33..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_palettes.py +++ /dev/null @@ -1,309 +0,0 @@ -from .palette import Palette - - -# Taken from https://en.wikipedia.org/wiki/ANSI_escape_code (Windows 10 column) -WINDOWS_PALETTE = Palette( - [ - (12, 12, 12), - (197, 15, 31), - (19, 161, 14), - (193, 156, 0), - (0, 55, 218), - (136, 23, 152), - (58, 150, 221), - (204, 204, 204), - (118, 118, 118), - (231, 72, 86), - (22, 198, 12), - (249, 241, 165), - (59, 120, 255), - (180, 0, 158), - (97, 214, 214), - (242, 242, 242), - ] -) - -# # The standard ansi colors (including bright variants) -STANDARD_PALETTE = Palette( - [ - (0, 0, 0), - (170, 0, 0), - (0, 170, 0), - (170, 85, 0), - (0, 0, 170), - (170, 0, 170), - (0, 170, 170), - (170, 170, 170), - (85, 85, 85), - (255, 85, 85), - (85, 255, 85), - (255, 255, 85), - (85, 85, 255), - (255, 85, 255), - (85, 255, 255), - (255, 255, 255), - ] -) - - -# The 256 color palette -EIGHT_BIT_PALETTE = Palette( - [ - (0, 0, 0), - (128, 0, 0), - (0, 128, 0), - (128, 128, 0), - (0, 0, 128), - (128, 0, 128), - (0, 128, 128), - (192, 192, 192), - (128, 128, 128), - (255, 0, 0), - (0, 255, 0), - (255, 255, 0), - (0, 0, 255), - (255, 0, 255), - (0, 255, 255), - (255, 255, 255), - (0, 0, 0), - (0, 0, 95), - (0, 0, 135), - (0, 0, 175), - (0, 0, 215), - (0, 0, 255), - (0, 95, 0), - (0, 95, 95), - (0, 95, 135), - (0, 95, 175), - (0, 95, 215), - (0, 95, 255), - (0, 135, 0), - (0, 135, 95), - (0, 135, 135), - (0, 135, 175), - (0, 135, 215), - (0, 135, 255), - (0, 175, 0), - (0, 175, 95), - (0, 175, 135), - (0, 175, 175), - (0, 175, 215), - (0, 175, 255), - (0, 215, 0), - (0, 215, 95), - (0, 215, 135), - (0, 215, 175), - (0, 215, 215), - (0, 215, 255), - (0, 255, 0), - (0, 255, 95), - (0, 255, 135), - (0, 255, 175), - (0, 255, 215), - (0, 255, 255), - (95, 0, 0), - (95, 0, 95), - (95, 0, 135), - (95, 0, 175), - (95, 0, 215), - (95, 0, 255), - (95, 95, 0), - (95, 95, 95), - (95, 95, 135), - (95, 95, 175), - (95, 95, 215), - (95, 95, 255), - (95, 135, 0), - (95, 135, 95), - (95, 135, 135), - (95, 135, 175), - (95, 135, 215), - (95, 135, 255), - (95, 175, 0), - (95, 175, 95), - (95, 175, 135), - (95, 175, 175), - (95, 175, 215), - (95, 175, 255), - (95, 215, 0), - (95, 215, 95), - (95, 215, 135), - (95, 215, 175), - (95, 215, 215), - (95, 215, 255), - (95, 255, 0), - (95, 255, 95), - (95, 255, 135), - (95, 255, 175), - (95, 255, 215), - (95, 255, 255), - (135, 0, 0), - (135, 0, 95), - (135, 0, 135), - (135, 0, 175), - (135, 0, 215), - (135, 0, 255), - (135, 95, 0), - (135, 95, 95), - (135, 95, 135), - (135, 95, 175), - (135, 95, 215), - (135, 95, 255), - (135, 135, 0), - (135, 135, 95), - (135, 135, 135), - (135, 135, 175), - (135, 135, 215), - (135, 135, 255), - (135, 175, 0), - (135, 175, 95), - (135, 175, 135), - (135, 175, 175), - (135, 175, 215), - (135, 175, 255), - (135, 215, 0), - (135, 215, 95), - (135, 215, 135), - (135, 215, 175), - (135, 215, 215), - (135, 215, 255), - (135, 255, 0), - (135, 255, 95), - (135, 255, 135), - (135, 255, 175), - (135, 255, 215), - (135, 255, 255), - (175, 0, 0), - (175, 0, 95), - (175, 0, 135), - (175, 0, 175), - (175, 0, 215), - (175, 0, 255), - (175, 95, 0), - (175, 95, 95), - (175, 95, 135), - (175, 95, 175), - (175, 95, 215), - (175, 95, 255), - (175, 135, 0), - (175, 135, 95), - (175, 135, 135), - (175, 135, 175), - (175, 135, 215), - (175, 135, 255), - (175, 175, 0), - (175, 175, 95), - (175, 175, 135), - (175, 175, 175), - (175, 175, 215), - (175, 175, 255), - (175, 215, 0), - (175, 215, 95), - (175, 215, 135), - (175, 215, 175), - (175, 215, 215), - (175, 215, 255), - (175, 255, 0), - (175, 255, 95), - (175, 255, 135), - (175, 255, 175), - (175, 255, 215), - (175, 255, 255), - (215, 0, 0), - (215, 0, 95), - (215, 0, 135), - (215, 0, 175), - (215, 0, 215), - (215, 0, 255), - (215, 95, 0), - (215, 95, 95), - (215, 95, 135), - (215, 95, 175), - (215, 95, 215), - (215, 95, 255), - (215, 135, 0), - (215, 135, 95), - (215, 135, 135), - (215, 135, 175), - (215, 135, 215), - (215, 135, 255), - (215, 175, 0), - (215, 175, 95), - (215, 175, 135), - (215, 175, 175), - (215, 175, 215), - (215, 175, 255), - (215, 215, 0), - (215, 215, 95), - (215, 215, 135), - (215, 215, 175), - (215, 215, 215), - (215, 215, 255), - (215, 255, 0), - (215, 255, 95), - (215, 255, 135), - (215, 255, 175), - (215, 255, 215), - (215, 255, 255), - (255, 0, 0), - (255, 0, 95), - (255, 0, 135), - (255, 0, 175), - (255, 0, 215), - (255, 0, 255), - (255, 95, 0), - (255, 95, 95), - (255, 95, 135), - (255, 95, 175), - (255, 95, 215), - (255, 95, 255), - (255, 135, 0), - (255, 135, 95), - (255, 135, 135), - (255, 135, 175), - (255, 135, 215), - (255, 135, 255), - (255, 175, 0), - (255, 175, 95), - (255, 175, 135), - (255, 175, 175), - (255, 175, 215), - (255, 175, 255), - (255, 215, 0), - (255, 215, 95), - (255, 215, 135), - (255, 215, 175), - (255, 215, 215), - (255, 215, 255), - (255, 255, 0), - (255, 255, 95), - (255, 255, 135), - (255, 255, 175), - (255, 255, 215), - (255, 255, 255), - (8, 8, 8), - (18, 18, 18), - (28, 28, 28), - (38, 38, 38), - (48, 48, 48), - (58, 58, 58), - (68, 68, 68), - (78, 78, 78), - (88, 88, 88), - (98, 98, 98), - (108, 108, 108), - (118, 118, 118), - (128, 128, 128), - (138, 138, 138), - (148, 148, 148), - (158, 158, 158), - (168, 168, 168), - (178, 178, 178), - (188, 188, 188), - (198, 198, 198), - (208, 208, 208), - (218, 218, 218), - (228, 228, 228), - (238, 238, 238), - ] -) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_pick.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_pick.py deleted file mode 100644 index 4f6d8b2d..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_pick.py +++ /dev/null @@ -1,17 +0,0 @@ -from typing import Optional - - -def pick_bool(*values: Optional[bool]) -> bool: - """Pick the first non-none bool or return the last value. - - Args: - *values (bool): Any number of boolean or None values. - - Returns: - bool: First non-none boolean. - """ - assert values, "1 or more values required" - for value in values: - if value is not None: - return value - return bool(value) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_ratio.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_ratio.py deleted file mode 100644 index f7dbe927..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_ratio.py +++ /dev/null @@ -1,160 +0,0 @@ -import sys -from fractions import Fraction -from math import ceil -from typing import cast, List, Optional, Sequence - -if sys.version_info >= (3, 8): - from typing import Protocol -else: - from typing_extensions import Protocol # pragma: no cover - - -class Edge(Protocol): - """Any object that defines an edge (such as Layout).""" - - size: Optional[int] = None - ratio: int = 1 - minimum_size: int = 1 - - -def ratio_resolve(total: int, edges: Sequence[Edge]) -> List[int]: - """Divide total space to satisfy size, ratio, and minimum_size, constraints. - - The returned list of integers should add up to total in most cases, unless it is - impossible to satisfy all the constraints. For instance, if there are two edges - with a minimum size of 20 each and `total` is 30 then the returned list will be - greater than total. In practice, this would mean that a Layout object would - clip the rows that would overflow the screen height. - - Args: - total (int): Total number of characters. - edges (List[Edge]): Edges within total space. - - Returns: - List[int]: Number of characters for each edge. - """ - # Size of edge or None for yet to be determined - sizes = [(edge.size or None) for edge in edges] - - _Fraction = Fraction - - # While any edges haven't been calculated - while None in sizes: - # Get flexible edges and index to map these back on to sizes list - flexible_edges = [ - (index, edge) - for index, (size, edge) in enumerate(zip(sizes, edges)) - if size is None - ] - # Remaining space in total - remaining = total - sum(size or 0 for size in sizes) - if remaining <= 0: - # No room for flexible edges - return [ - ((edge.minimum_size or 1) if size is None else size) - for size, edge in zip(sizes, edges) - ] - # Calculate number of characters in a ratio portion - portion = _Fraction( - remaining, sum((edge.ratio or 1) for _, edge in flexible_edges) - ) - - # If any edges will be less than their minimum, replace size with the minimum - for index, edge in flexible_edges: - if portion * edge.ratio <= edge.minimum_size: - sizes[index] = edge.minimum_size - # New fixed size will invalidate calculations, so we need to repeat the process - break - else: - # Distribute flexible space and compensate for rounding error - # Since edge sizes can only be integers we need to add the remainder - # to the following line - remainder = _Fraction(0) - for index, edge in flexible_edges: - size, remainder = divmod(portion * edge.ratio + remainder, 1) - sizes[index] = size - break - # Sizes now contains integers only - return cast(List[int], sizes) - - -def ratio_reduce( - total: int, ratios: List[int], maximums: List[int], values: List[int] -) -> List[int]: - """Divide an integer total in to parts based on ratios. - - Args: - total (int): The total to divide. - ratios (List[int]): A list of integer ratios. - maximums (List[int]): List of maximums values for each slot. - values (List[int]): List of values - - Returns: - List[int]: A list of integers guaranteed to sum to total. - """ - ratios = [ratio if _max else 0 for ratio, _max in zip(ratios, maximums)] - total_ratio = sum(ratios) - if not total_ratio: - return values[:] - total_remaining = total - result: List[int] = [] - append = result.append - for ratio, maximum, value in zip(ratios, maximums, values): - if ratio and total_ratio > 0: - distributed = min(maximum, round(ratio * total_remaining / total_ratio)) - append(value - distributed) - total_remaining -= distributed - total_ratio -= ratio - else: - append(value) - return result - - -def ratio_distribute( - total: int, ratios: List[int], minimums: Optional[List[int]] = None -) -> List[int]: - """Distribute an integer total in to parts based on ratios. - - Args: - total (int): The total to divide. - ratios (List[int]): A list of integer ratios. - minimums (List[int]): List of minimum values for each slot. - - Returns: - List[int]: A list of integers guaranteed to sum to total. - """ - if minimums: - ratios = [ratio if _min else 0 for ratio, _min in zip(ratios, minimums)] - total_ratio = sum(ratios) - assert total_ratio > 0, "Sum of ratios must be > 0" - - total_remaining = total - distributed_total: List[int] = [] - append = distributed_total.append - if minimums is None: - _minimums = [0] * len(ratios) - else: - _minimums = minimums - for ratio, minimum in zip(ratios, _minimums): - if total_ratio > 0: - distributed = max(minimum, ceil(ratio * total_remaining / total_ratio)) - else: - distributed = total_remaining - append(distributed) - total_ratio -= ratio - total_remaining -= distributed - return distributed_total - - -if __name__ == "__main__": - from dataclasses import dataclass - - @dataclass - class E: - - size: Optional[int] = None - ratio: int = 1 - minimum_size: int = 1 - - resolved = ratio_resolve(110, [E(None, 1, 1), E(None, 1, 1), E(None, 1, 1)]) - print(sum(resolved)) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_spinners.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_spinners.py deleted file mode 100644 index d0bb1fe7..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_spinners.py +++ /dev/null @@ -1,482 +0,0 @@ -""" -Spinners are from: -* cli-spinners: - MIT License - Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com) - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights to - use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - the Software, and to permit persons to whom the Software is furnished to do so, - subject to the following conditions: - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, - INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR - PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE - FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - IN THE SOFTWARE. -""" - -SPINNERS = { - "dots": { - "interval": 80, - "frames": "⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏", - }, - "dots2": {"interval": 80, "frames": "⣾⣽⣻⢿⡿⣟⣯⣷"}, - "dots3": { - "interval": 80, - "frames": "⠋⠙⠚⠞⠖⠦⠴⠲⠳⠓", - }, - "dots4": { - "interval": 80, - "frames": "⠄⠆⠇⠋⠙⠸⠰⠠⠰⠸⠙⠋⠇⠆", - }, - "dots5": { - "interval": 80, - "frames": "⠋⠙⠚⠒⠂⠂⠒⠲⠴⠦⠖⠒⠐⠐⠒⠓⠋", - }, - "dots6": { - "interval": 80, - "frames": "⠁⠉⠙⠚⠒⠂⠂⠒⠲⠴⠤⠄⠄⠤⠴⠲⠒⠂⠂⠒⠚⠙⠉⠁", - }, - "dots7": { - "interval": 80, - "frames": "⠈⠉⠋⠓⠒⠐⠐⠒⠖⠦⠤⠠⠠⠤⠦⠖⠒⠐⠐⠒⠓⠋⠉⠈", - }, - "dots8": { - "interval": 80, - "frames": "⠁⠁⠉⠙⠚⠒⠂⠂⠒⠲⠴⠤⠄⠄⠤⠠⠠⠤⠦⠖⠒⠐⠐⠒⠓⠋⠉⠈⠈", - }, - "dots9": {"interval": 80, "frames": "⢹⢺⢼⣸⣇⡧⡗⡏"}, - "dots10": {"interval": 80, "frames": "⢄⢂⢁⡁⡈⡐⡠"}, - "dots11": {"interval": 100, "frames": "⠁⠂⠄⡀⢀⠠⠐⠈"}, - "dots12": { - "interval": 80, - "frames": [ - "⢀⠀", - "⡀⠀", - "⠄⠀", - "⢂⠀", - "⡂⠀", - "⠅⠀", - "⢃⠀", - "⡃⠀", - "⠍⠀", - "⢋⠀", - "⡋⠀", - "⠍⠁", - "⢋⠁", - "⡋⠁", - "⠍⠉", - "⠋⠉", - "⠋⠉", - "⠉⠙", - "⠉⠙", - "⠉⠩", - "⠈⢙", - "⠈⡙", - "⢈⠩", - "⡀⢙", - "⠄⡙", - "⢂⠩", - "⡂⢘", - "⠅⡘", - "⢃⠨", - "⡃⢐", - "⠍⡐", - "⢋⠠", - "⡋⢀", - "⠍⡁", - "⢋⠁", - "⡋⠁", - "⠍⠉", - "⠋⠉", - "⠋⠉", - "⠉⠙", - "⠉⠙", - "⠉⠩", - "⠈⢙", - "⠈⡙", - "⠈⠩", - "⠀⢙", - "⠀⡙", - "⠀⠩", - "⠀⢘", - "⠀⡘", - "⠀⠨", - "⠀⢐", - "⠀⡐", - "⠀⠠", - "⠀⢀", - "⠀⡀", - ], - }, - "dots8Bit": { - "interval": 80, - "frames": "⠀⠁⠂⠃⠄⠅⠆⠇⡀⡁⡂⡃⡄⡅⡆⡇⠈⠉⠊⠋⠌⠍⠎⠏⡈⡉⡊⡋⡌⡍⡎⡏⠐⠑⠒⠓⠔⠕⠖⠗⡐⡑⡒⡓⡔⡕⡖⡗⠘⠙⠚⠛⠜⠝⠞⠟⡘⡙" - "⡚⡛⡜⡝⡞⡟⠠⠡⠢⠣⠤⠥⠦⠧⡠⡡⡢⡣⡤⡥⡦⡧⠨⠩⠪⠫⠬⠭⠮⠯⡨⡩⡪⡫⡬⡭⡮⡯⠰⠱⠲⠳⠴⠵⠶⠷⡰⡱⡲⡳⡴⡵⡶⡷⠸⠹⠺⠻" - "⠼⠽⠾⠿⡸⡹⡺⡻⡼⡽⡾⡿⢀⢁⢂⢃⢄⢅⢆⢇⣀⣁⣂⣃⣄⣅⣆⣇⢈⢉⢊⢋⢌⢍⢎⢏⣈⣉⣊⣋⣌⣍⣎⣏⢐⢑⢒⢓⢔⢕⢖⢗⣐⣑⣒⣓⣔⣕" - "⣖⣗⢘⢙⢚⢛⢜⢝⢞⢟⣘⣙⣚⣛⣜⣝⣞⣟⢠⢡⢢⢣⢤⢥⢦⢧⣠⣡⣢⣣⣤⣥⣦⣧⢨⢩⢪⢫⢬⢭⢮⢯⣨⣩⣪⣫⣬⣭⣮⣯⢰⢱⢲⢳⢴⢵⢶⢷" - "⣰⣱⣲⣳⣴⣵⣶⣷⢸⢹⢺⢻⢼⢽⢾⢿⣸⣹⣺⣻⣼⣽⣾⣿", - }, - "line": {"interval": 130, "frames": ["-", "\\", "|", "/"]}, - "line2": {"interval": 100, "frames": "⠂-–—–-"}, - "pipe": {"interval": 100, "frames": "┤┘┴└├┌┬┐"}, - "simpleDots": {"interval": 400, "frames": [". ", ".. ", "...", " "]}, - "simpleDotsScrolling": { - "interval": 200, - "frames": [". ", ".. ", "...", " ..", " .", " "], - }, - "star": {"interval": 70, "frames": "✶✸✹✺✹✷"}, - "star2": {"interval": 80, "frames": "+x*"}, - "flip": { - "interval": 70, - "frames": "___-``'´-___", - }, - "hamburger": {"interval": 100, "frames": "☱☲☴"}, - "growVertical": { - "interval": 120, - "frames": "▁▃▄▅▆▇▆▅▄▃", - }, - "growHorizontal": { - "interval": 120, - "frames": "▏▎▍▌▋▊▉▊▋▌▍▎", - }, - "balloon": {"interval": 140, "frames": " .oO@* "}, - "balloon2": {"interval": 120, "frames": ".oO°Oo."}, - "noise": {"interval": 100, "frames": "▓▒░"}, - "bounce": {"interval": 120, "frames": "⠁⠂⠄⠂"}, - "boxBounce": {"interval": 120, "frames": "▖▘▝▗"}, - "boxBounce2": {"interval": 100, "frames": "▌▀▐▄"}, - "triangle": {"interval": 50, "frames": "◢◣◤◥"}, - "arc": {"interval": 100, "frames": "◜◠◝◞◡◟"}, - "circle": {"interval": 120, "frames": "◡⊙◠"}, - "squareCorners": {"interval": 180, "frames": "◰◳◲◱"}, - "circleQuarters": {"interval": 120, "frames": "◴◷◶◵"}, - "circleHalves": {"interval": 50, "frames": "◐◓◑◒"}, - "squish": {"interval": 100, "frames": "╫╪"}, - "toggle": {"interval": 250, "frames": "⊶⊷"}, - "toggle2": {"interval": 80, "frames": "▫▪"}, - "toggle3": {"interval": 120, "frames": "□■"}, - "toggle4": {"interval": 100, "frames": "■□▪▫"}, - "toggle5": {"interval": 100, "frames": "▮▯"}, - "toggle6": {"interval": 300, "frames": "ဝ၀"}, - "toggle7": {"interval": 80, "frames": "⦾⦿"}, - "toggle8": {"interval": 100, "frames": "◍◌"}, - "toggle9": {"interval": 100, "frames": "◉◎"}, - "toggle10": {"interval": 100, "frames": "㊂㊀㊁"}, - "toggle11": {"interval": 50, "frames": "⧇⧆"}, - "toggle12": {"interval": 120, "frames": "☗☖"}, - "toggle13": {"interval": 80, "frames": "=*-"}, - "arrow": {"interval": 100, "frames": "←↖↑↗→↘↓↙"}, - "arrow2": { - "interval": 80, - "frames": ["⬆️ ", "↗️ ", "➡️ ", "↘️ ", "⬇️ ", "↙️ ", "⬅️ ", "↖️ "], - }, - "arrow3": { - "interval": 120, - "frames": ["▹▹▹▹▹", "▸▹▹▹▹", "▹▸▹▹▹", "▹▹▸▹▹", "▹▹▹▸▹", "▹▹▹▹▸"], - }, - "bouncingBar": { - "interval": 80, - "frames": [ - "[ ]", - "[= ]", - "[== ]", - "[=== ]", - "[ ===]", - "[ ==]", - "[ =]", - "[ ]", - "[ =]", - "[ ==]", - "[ ===]", - "[====]", - "[=== ]", - "[== ]", - "[= ]", - ], - }, - "bouncingBall": { - "interval": 80, - "frames": [ - "( ● )", - "( ● )", - "( ● )", - "( ● )", - "( ●)", - "( ● )", - "( ● )", - "( ● )", - "( ● )", - "(● )", - ], - }, - "smiley": {"interval": 200, "frames": ["😄 ", "😝 "]}, - "monkey": {"interval": 300, "frames": ["🙈 ", "🙈 ", "🙉 ", "🙊 "]}, - "hearts": {"interval": 100, "frames": ["💛 ", "💙 ", "💜 ", "💚 ", "❤️ "]}, - "clock": { - "interval": 100, - "frames": [ - "🕛 ", - "🕐 ", - "🕑 ", - "🕒 ", - "🕓 ", - "🕔 ", - "🕕 ", - "🕖 ", - "🕗 ", - "🕘 ", - "🕙 ", - "🕚 ", - ], - }, - "earth": {"interval": 180, "frames": ["🌍 ", "🌎 ", "🌏 "]}, - "material": { - "interval": 17, - "frames": [ - "█▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", - "██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", - "███▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", - "████▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", - "██████▁▁▁▁▁▁▁▁▁▁▁▁▁▁", - "██████▁▁▁▁▁▁▁▁▁▁▁▁▁▁", - "███████▁▁▁▁▁▁▁▁▁▁▁▁▁", - "████████▁▁▁▁▁▁▁▁▁▁▁▁", - "█████████▁▁▁▁▁▁▁▁▁▁▁", - "█████████▁▁▁▁▁▁▁▁▁▁▁", - "██████████▁▁▁▁▁▁▁▁▁▁", - "███████████▁▁▁▁▁▁▁▁▁", - "█████████████▁▁▁▁▁▁▁", - "██████████████▁▁▁▁▁▁", - "██████████████▁▁▁▁▁▁", - "▁██████████████▁▁▁▁▁", - "▁██████████████▁▁▁▁▁", - "▁██████████████▁▁▁▁▁", - "▁▁██████████████▁▁▁▁", - "▁▁▁██████████████▁▁▁", - "▁▁▁▁█████████████▁▁▁", - "▁▁▁▁██████████████▁▁", - "▁▁▁▁██████████████▁▁", - "▁▁▁▁▁██████████████▁", - "▁▁▁▁▁██████████████▁", - "▁▁▁▁▁██████████████▁", - "▁▁▁▁▁▁██████████████", - "▁▁▁▁▁▁██████████████", - "▁▁▁▁▁▁▁█████████████", - "▁▁▁▁▁▁▁█████████████", - "▁▁▁▁▁▁▁▁████████████", - "▁▁▁▁▁▁▁▁████████████", - "▁▁▁▁▁▁▁▁▁███████████", - "▁▁▁▁▁▁▁▁▁███████████", - "▁▁▁▁▁▁▁▁▁▁██████████", - "▁▁▁▁▁▁▁▁▁▁██████████", - "▁▁▁▁▁▁▁▁▁▁▁▁████████", - "▁▁▁▁▁▁▁▁▁▁▁▁▁███████", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁██████", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████", - "█▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████", - "██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", - "██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", - "███▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", - "████▁▁▁▁▁▁▁▁▁▁▁▁▁▁██", - "█████▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", - "█████▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", - "██████▁▁▁▁▁▁▁▁▁▁▁▁▁█", - "████████▁▁▁▁▁▁▁▁▁▁▁▁", - "█████████▁▁▁▁▁▁▁▁▁▁▁", - "█████████▁▁▁▁▁▁▁▁▁▁▁", - "█████████▁▁▁▁▁▁▁▁▁▁▁", - "█████████▁▁▁▁▁▁▁▁▁▁▁", - "███████████▁▁▁▁▁▁▁▁▁", - "████████████▁▁▁▁▁▁▁▁", - "████████████▁▁▁▁▁▁▁▁", - "██████████████▁▁▁▁▁▁", - "██████████████▁▁▁▁▁▁", - "▁██████████████▁▁▁▁▁", - "▁██████████████▁▁▁▁▁", - "▁▁▁█████████████▁▁▁▁", - "▁▁▁▁▁████████████▁▁▁", - "▁▁▁▁▁████████████▁▁▁", - "▁▁▁▁▁▁███████████▁▁▁", - "▁▁▁▁▁▁▁▁█████████▁▁▁", - "▁▁▁▁▁▁▁▁█████████▁▁▁", - "▁▁▁▁▁▁▁▁▁█████████▁▁", - "▁▁▁▁▁▁▁▁▁█████████▁▁", - "▁▁▁▁▁▁▁▁▁▁█████████▁", - "▁▁▁▁▁▁▁▁▁▁▁████████▁", - "▁▁▁▁▁▁▁▁▁▁▁████████▁", - "▁▁▁▁▁▁▁▁▁▁▁▁███████▁", - "▁▁▁▁▁▁▁▁▁▁▁▁███████▁", - "▁▁▁▁▁▁▁▁▁▁▁▁▁███████", - "▁▁▁▁▁▁▁▁▁▁▁▁▁███████", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", - ], - }, - "moon": { - "interval": 80, - "frames": ["🌑 ", "🌒 ", "🌓 ", "🌔 ", "🌕 ", "🌖 ", "🌗 ", "🌘 "], - }, - "runner": {"interval": 140, "frames": ["🚶 ", "🏃 "]}, - "pong": { - "interval": 80, - "frames": [ - "▐⠂ ▌", - "▐⠈ ▌", - "▐ ⠂ ▌", - "▐ ⠠ ▌", - "▐ ⡀ ▌", - "▐ ⠠ ▌", - "▐ ⠂ ▌", - "▐ ⠈ ▌", - "▐ ⠂ ▌", - "▐ ⠠ ▌", - "▐ ⡀ ▌", - "▐ ⠠ ▌", - "▐ ⠂ ▌", - "▐ ⠈ ▌", - "▐ ⠂▌", - "▐ ⠠▌", - "▐ ⡀▌", - "▐ ⠠ ▌", - "▐ ⠂ ▌", - "▐ ⠈ ▌", - "▐ ⠂ ▌", - "▐ ⠠ ▌", - "▐ ⡀ ▌", - "▐ ⠠ ▌", - "▐ ⠂ ▌", - "▐ ⠈ ▌", - "▐ ⠂ ▌", - "▐ ⠠ ▌", - "▐ ⡀ ▌", - "▐⠠ ▌", - ], - }, - "shark": { - "interval": 120, - "frames": [ - "▐|\\____________▌", - "▐_|\\___________▌", - "▐__|\\__________▌", - "▐___|\\_________▌", - "▐____|\\________▌", - "▐_____|\\_______▌", - "▐______|\\______▌", - "▐_______|\\_____▌", - "▐________|\\____▌", - "▐_________|\\___▌", - "▐__________|\\__▌", - "▐___________|\\_▌", - "▐____________|\\▌", - "▐____________/|▌", - "▐___________/|_▌", - "▐__________/|__▌", - "▐_________/|___▌", - "▐________/|____▌", - "▐_______/|_____▌", - "▐______/|______▌", - "▐_____/|_______▌", - "▐____/|________▌", - "▐___/|_________▌", - "▐__/|__________▌", - "▐_/|___________▌", - "▐/|____________▌", - ], - }, - "dqpb": {"interval": 100, "frames": "dqpb"}, - "weather": { - "interval": 100, - "frames": [ - "☀️ ", - "☀️ ", - "☀️ ", - "🌤 ", - "⛅️ ", - "🌥 ", - "☁️ ", - "🌧 ", - "🌨 ", - "🌧 ", - "🌨 ", - "🌧 ", - "🌨 ", - "⛈ ", - "🌨 ", - "🌧 ", - "🌨 ", - "☁️ ", - "🌥 ", - "⛅️ ", - "🌤 ", - "☀️ ", - "☀️ ", - ], - }, - "christmas": {"interval": 400, "frames": "🌲🎄"}, - "grenade": { - "interval": 80, - "frames": [ - "، ", - "′ ", - " ´ ", - " ‾ ", - " ⸌", - " ⸊", - " |", - " ⁎", - " ⁕", - " ෴ ", - " ⁓", - " ", - " ", - " ", - ], - }, - "point": {"interval": 125, "frames": ["∙∙∙", "●∙∙", "∙●∙", "∙∙●", "∙∙∙"]}, - "layer": {"interval": 150, "frames": "-=≡"}, - "betaWave": { - "interval": 80, - "frames": [ - "ρββββββ", - "βρβββββ", - "ββρββββ", - "βββρβββ", - "ββββρββ", - "βββββρβ", - "ββββββρ", - ], - }, - "aesthetic": { - "interval": 80, - "frames": [ - "▰▱▱▱▱▱▱", - "▰▰▱▱▱▱▱", - "▰▰▰▱▱▱▱", - "▰▰▰▰▱▱▱", - "▰▰▰▰▰▱▱", - "▰▰▰▰▰▰▱", - "▰▰▰▰▰▰▰", - "▰▱▱▱▱▱▱", - ], - }, -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_stack.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_stack.py deleted file mode 100644 index 194564e7..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_stack.py +++ /dev/null @@ -1,16 +0,0 @@ -from typing import List, TypeVar - -T = TypeVar("T") - - -class Stack(List[T]): - """A small shim over builtin list.""" - - @property - def top(self) -> T: - """Get top of stack.""" - return self[-1] - - def push(self, item: T) -> None: - """Push an item on to the stack (append in stack nomenclature).""" - self.append(item) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_timer.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_timer.py deleted file mode 100644 index a2ca6be0..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_timer.py +++ /dev/null @@ -1,19 +0,0 @@ -""" -Timer context manager, only used in debug. - -""" - -from time import time - -import contextlib -from typing import Generator - - -@contextlib.contextmanager -def timer(subject: str = "time") -> Generator[None, None, None]: - """print the elapsed time. (only used in debugging)""" - start = time() - yield - elapsed = time() - start - elapsed_ms = elapsed * 1000 - print(f"{subject} elapsed {elapsed_ms:.1f}ms") diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_win32_console.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_win32_console.py deleted file mode 100644 index e969d816..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_win32_console.py +++ /dev/null @@ -1,662 +0,0 @@ -"""Light wrapper around the Win32 Console API - this module should only be imported on Windows - -The API that this module wraps is documented at https://docs.microsoft.com/en-us/windows/console/console-functions -""" -import ctypes -import sys -from typing import Any - -windll: Any = None -if sys.platform == "win32": - windll = ctypes.LibraryLoader(ctypes.WinDLL) -else: - raise ImportError(f"{__name__} can only be imported on Windows") - -import time -from ctypes import Structure, byref, wintypes -from typing import IO, NamedTuple, Type, cast - -from rich.color import ColorSystem -from rich.style import Style - -STDOUT = -11 -ENABLE_VIRTUAL_TERMINAL_PROCESSING = 4 - -COORD = wintypes._COORD - - -class LegacyWindowsError(Exception): - pass - - -class WindowsCoordinates(NamedTuple): - """Coordinates in the Windows Console API are (y, x), not (x, y). - This class is intended to prevent that confusion. - Rows and columns are indexed from 0. - This class can be used in place of wintypes._COORD in arguments and argtypes. - """ - - row: int - col: int - - @classmethod - def from_param(cls, value: "WindowsCoordinates") -> COORD: - """Converts a WindowsCoordinates into a wintypes _COORD structure. - This classmethod is internally called by ctypes to perform the conversion. - - Args: - value (WindowsCoordinates): The input coordinates to convert. - - Returns: - wintypes._COORD: The converted coordinates struct. - """ - return COORD(value.col, value.row) - - -class CONSOLE_SCREEN_BUFFER_INFO(Structure): - _fields_ = [ - ("dwSize", COORD), - ("dwCursorPosition", COORD), - ("wAttributes", wintypes.WORD), - ("srWindow", wintypes.SMALL_RECT), - ("dwMaximumWindowSize", COORD), - ] - - -class CONSOLE_CURSOR_INFO(ctypes.Structure): - _fields_ = [("dwSize", wintypes.DWORD), ("bVisible", wintypes.BOOL)] - - -_GetStdHandle = windll.kernel32.GetStdHandle -_GetStdHandle.argtypes = [ - wintypes.DWORD, -] -_GetStdHandle.restype = wintypes.HANDLE - - -def GetStdHandle(handle: int = STDOUT) -> wintypes.HANDLE: - """Retrieves a handle to the specified standard device (standard input, standard output, or standard error). - - Args: - handle (int): Integer identifier for the handle. Defaults to -11 (stdout). - - Returns: - wintypes.HANDLE: The handle - """ - return cast(wintypes.HANDLE, _GetStdHandle(handle)) - - -_GetConsoleMode = windll.kernel32.GetConsoleMode -_GetConsoleMode.argtypes = [wintypes.HANDLE, wintypes.LPDWORD] -_GetConsoleMode.restype = wintypes.BOOL - - -def GetConsoleMode(std_handle: wintypes.HANDLE) -> int: - """Retrieves the current input mode of a console's input buffer - or the current output mode of a console screen buffer. - - Args: - std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. - - Raises: - LegacyWindowsError: If any error occurs while calling the Windows console API. - - Returns: - int: Value representing the current console mode as documented at - https://docs.microsoft.com/en-us/windows/console/getconsolemode#parameters - """ - - console_mode = wintypes.DWORD() - success = bool(_GetConsoleMode(std_handle, console_mode)) - if not success: - raise LegacyWindowsError("Unable to get legacy Windows Console Mode") - return console_mode.value - - -_FillConsoleOutputCharacterW = windll.kernel32.FillConsoleOutputCharacterW -_FillConsoleOutputCharacterW.argtypes = [ - wintypes.HANDLE, - ctypes.c_char, - wintypes.DWORD, - cast(Type[COORD], WindowsCoordinates), - ctypes.POINTER(wintypes.DWORD), -] -_FillConsoleOutputCharacterW.restype = wintypes.BOOL - - -def FillConsoleOutputCharacter( - std_handle: wintypes.HANDLE, - char: str, - length: int, - start: WindowsCoordinates, -) -> int: - """Writes a character to the console screen buffer a specified number of times, beginning at the specified coordinates. - - Args: - std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. - char (str): The character to write. Must be a string of length 1. - length (int): The number of times to write the character. - start (WindowsCoordinates): The coordinates to start writing at. - - Returns: - int: The number of characters written. - """ - character = ctypes.c_char(char.encode()) - num_characters = wintypes.DWORD(length) - num_written = wintypes.DWORD(0) - _FillConsoleOutputCharacterW( - std_handle, - character, - num_characters, - start, - byref(num_written), - ) - return num_written.value - - -_FillConsoleOutputAttribute = windll.kernel32.FillConsoleOutputAttribute -_FillConsoleOutputAttribute.argtypes = [ - wintypes.HANDLE, - wintypes.WORD, - wintypes.DWORD, - cast(Type[COORD], WindowsCoordinates), - ctypes.POINTER(wintypes.DWORD), -] -_FillConsoleOutputAttribute.restype = wintypes.BOOL - - -def FillConsoleOutputAttribute( - std_handle: wintypes.HANDLE, - attributes: int, - length: int, - start: WindowsCoordinates, -) -> int: - """Sets the character attributes for a specified number of character cells, - beginning at the specified coordinates in a screen buffer. - - Args: - std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. - attributes (int): Integer value representing the foreground and background colours of the cells. - length (int): The number of cells to set the output attribute of. - start (WindowsCoordinates): The coordinates of the first cell whose attributes are to be set. - - Returns: - int: The number of cells whose attributes were actually set. - """ - num_cells = wintypes.DWORD(length) - style_attrs = wintypes.WORD(attributes) - num_written = wintypes.DWORD(0) - _FillConsoleOutputAttribute( - std_handle, style_attrs, num_cells, start, byref(num_written) - ) - return num_written.value - - -_SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute -_SetConsoleTextAttribute.argtypes = [ - wintypes.HANDLE, - wintypes.WORD, -] -_SetConsoleTextAttribute.restype = wintypes.BOOL - - -def SetConsoleTextAttribute( - std_handle: wintypes.HANDLE, attributes: wintypes.WORD -) -> bool: - """Set the colour attributes for all text written after this function is called. - - Args: - std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. - attributes (int): Integer value representing the foreground and background colours. - - - Returns: - bool: True if the attribute was set successfully, otherwise False. - """ - return bool(_SetConsoleTextAttribute(std_handle, attributes)) - - -_GetConsoleScreenBufferInfo = windll.kernel32.GetConsoleScreenBufferInfo -_GetConsoleScreenBufferInfo.argtypes = [ - wintypes.HANDLE, - ctypes.POINTER(CONSOLE_SCREEN_BUFFER_INFO), -] -_GetConsoleScreenBufferInfo.restype = wintypes.BOOL - - -def GetConsoleScreenBufferInfo( - std_handle: wintypes.HANDLE, -) -> CONSOLE_SCREEN_BUFFER_INFO: - """Retrieves information about the specified console screen buffer. - - Args: - std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. - - Returns: - CONSOLE_SCREEN_BUFFER_INFO: A CONSOLE_SCREEN_BUFFER_INFO ctype struct contain information about - screen size, cursor position, colour attributes, and more.""" - console_screen_buffer_info = CONSOLE_SCREEN_BUFFER_INFO() - _GetConsoleScreenBufferInfo(std_handle, byref(console_screen_buffer_info)) - return console_screen_buffer_info - - -_SetConsoleCursorPosition = windll.kernel32.SetConsoleCursorPosition -_SetConsoleCursorPosition.argtypes = [ - wintypes.HANDLE, - cast(Type[COORD], WindowsCoordinates), -] -_SetConsoleCursorPosition.restype = wintypes.BOOL - - -def SetConsoleCursorPosition( - std_handle: wintypes.HANDLE, coords: WindowsCoordinates -) -> bool: - """Set the position of the cursor in the console screen - - Args: - std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. - coords (WindowsCoordinates): The coordinates to move the cursor to. - - Returns: - bool: True if the function succeeds, otherwise False. - """ - return bool(_SetConsoleCursorPosition(std_handle, coords)) - - -_GetConsoleCursorInfo = windll.kernel32.GetConsoleCursorInfo -_GetConsoleCursorInfo.argtypes = [ - wintypes.HANDLE, - ctypes.POINTER(CONSOLE_CURSOR_INFO), -] -_GetConsoleCursorInfo.restype = wintypes.BOOL - - -def GetConsoleCursorInfo( - std_handle: wintypes.HANDLE, cursor_info: CONSOLE_CURSOR_INFO -) -> bool: - """Get the cursor info - used to get cursor visibility and width - - Args: - std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. - cursor_info (CONSOLE_CURSOR_INFO): CONSOLE_CURSOR_INFO ctype struct that receives information - about the console's cursor. - - Returns: - bool: True if the function succeeds, otherwise False. - """ - return bool(_GetConsoleCursorInfo(std_handle, byref(cursor_info))) - - -_SetConsoleCursorInfo = windll.kernel32.SetConsoleCursorInfo -_SetConsoleCursorInfo.argtypes = [ - wintypes.HANDLE, - ctypes.POINTER(CONSOLE_CURSOR_INFO), -] -_SetConsoleCursorInfo.restype = wintypes.BOOL - - -def SetConsoleCursorInfo( - std_handle: wintypes.HANDLE, cursor_info: CONSOLE_CURSOR_INFO -) -> bool: - """Set the cursor info - used for adjusting cursor visibility and width - - Args: - std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. - cursor_info (CONSOLE_CURSOR_INFO): CONSOLE_CURSOR_INFO ctype struct containing the new cursor info. - - Returns: - bool: True if the function succeeds, otherwise False. - """ - return bool(_SetConsoleCursorInfo(std_handle, byref(cursor_info))) - - -_SetConsoleTitle = windll.kernel32.SetConsoleTitleW -_SetConsoleTitle.argtypes = [wintypes.LPCWSTR] -_SetConsoleTitle.restype = wintypes.BOOL - - -def SetConsoleTitle(title: str) -> bool: - """Sets the title of the current console window - - Args: - title (str): The new title of the console window. - - Returns: - bool: True if the function succeeds, otherwise False. - """ - return bool(_SetConsoleTitle(title)) - - -class LegacyWindowsTerm: - """This class allows interaction with the legacy Windows Console API. It should only be used in the context - of environments where virtual terminal processing is not available. However, if it is used in a Windows environment, - the entire API should work. - - Args: - file (IO[str]): The file which the Windows Console API HANDLE is retrieved from, defaults to sys.stdout. - """ - - BRIGHT_BIT = 8 - - # Indices are ANSI color numbers, values are the corresponding Windows Console API color numbers - ANSI_TO_WINDOWS = [ - 0, # black The Windows colours are defined in wincon.h as follows: - 4, # red define FOREGROUND_BLUE 0x0001 -- 0000 0001 - 2, # green define FOREGROUND_GREEN 0x0002 -- 0000 0010 - 6, # yellow define FOREGROUND_RED 0x0004 -- 0000 0100 - 1, # blue define FOREGROUND_INTENSITY 0x0008 -- 0000 1000 - 5, # magenta define BACKGROUND_BLUE 0x0010 -- 0001 0000 - 3, # cyan define BACKGROUND_GREEN 0x0020 -- 0010 0000 - 7, # white define BACKGROUND_RED 0x0040 -- 0100 0000 - 8, # bright black (grey) define BACKGROUND_INTENSITY 0x0080 -- 1000 0000 - 12, # bright red - 10, # bright green - 14, # bright yellow - 9, # bright blue - 13, # bright magenta - 11, # bright cyan - 15, # bright white - ] - - def __init__(self, file: "IO[str]") -> None: - handle = GetStdHandle(STDOUT) - self._handle = handle - default_text = GetConsoleScreenBufferInfo(handle).wAttributes - self._default_text = default_text - - self._default_fore = default_text & 7 - self._default_back = (default_text >> 4) & 7 - self._default_attrs = self._default_fore | (self._default_back << 4) - - self._file = file - self.write = file.write - self.flush = file.flush - - @property - def cursor_position(self) -> WindowsCoordinates: - """Returns the current position of the cursor (0-based) - - Returns: - WindowsCoordinates: The current cursor position. - """ - coord: COORD = GetConsoleScreenBufferInfo(self._handle).dwCursorPosition - return WindowsCoordinates(row=cast(int, coord.Y), col=cast(int, coord.X)) - - @property - def screen_size(self) -> WindowsCoordinates: - """Returns the current size of the console screen buffer, in character columns and rows - - Returns: - WindowsCoordinates: The width and height of the screen as WindowsCoordinates. - """ - screen_size: COORD = GetConsoleScreenBufferInfo(self._handle).dwSize - return WindowsCoordinates( - row=cast(int, screen_size.Y), col=cast(int, screen_size.X) - ) - - def write_text(self, text: str) -> None: - """Write text directly to the terminal without any modification of styles - - Args: - text (str): The text to write to the console - """ - self.write(text) - self.flush() - - def write_styled(self, text: str, style: Style) -> None: - """Write styled text to the terminal. - - Args: - text (str): The text to write - style (Style): The style of the text - """ - color = style.color - bgcolor = style.bgcolor - if style.reverse: - color, bgcolor = bgcolor, color - - if color: - fore = color.downgrade(ColorSystem.WINDOWS).number - fore = fore if fore is not None else 7 # Default to ANSI 7: White - if style.bold: - fore = fore | self.BRIGHT_BIT - if style.dim: - fore = fore & ~self.BRIGHT_BIT - fore = self.ANSI_TO_WINDOWS[fore] - else: - fore = self._default_fore - - if bgcolor: - back = bgcolor.downgrade(ColorSystem.WINDOWS).number - back = back if back is not None else 0 # Default to ANSI 0: Black - back = self.ANSI_TO_WINDOWS[back] - else: - back = self._default_back - - assert fore is not None - assert back is not None - - SetConsoleTextAttribute( - self._handle, attributes=ctypes.c_ushort(fore | (back << 4)) - ) - self.write_text(text) - SetConsoleTextAttribute(self._handle, attributes=self._default_text) - - def move_cursor_to(self, new_position: WindowsCoordinates) -> None: - """Set the position of the cursor - - Args: - new_position (WindowsCoordinates): The WindowsCoordinates representing the new position of the cursor. - """ - if new_position.col < 0 or new_position.row < 0: - return - SetConsoleCursorPosition(self._handle, coords=new_position) - - def erase_line(self) -> None: - """Erase all content on the line the cursor is currently located at""" - screen_size = self.screen_size - cursor_position = self.cursor_position - cells_to_erase = screen_size.col - start_coordinates = WindowsCoordinates(row=cursor_position.row, col=0) - FillConsoleOutputCharacter( - self._handle, " ", length=cells_to_erase, start=start_coordinates - ) - FillConsoleOutputAttribute( - self._handle, - self._default_attrs, - length=cells_to_erase, - start=start_coordinates, - ) - - def erase_end_of_line(self) -> None: - """Erase all content from the cursor position to the end of that line""" - cursor_position = self.cursor_position - cells_to_erase = self.screen_size.col - cursor_position.col - FillConsoleOutputCharacter( - self._handle, " ", length=cells_to_erase, start=cursor_position - ) - FillConsoleOutputAttribute( - self._handle, - self._default_attrs, - length=cells_to_erase, - start=cursor_position, - ) - - def erase_start_of_line(self) -> None: - """Erase all content from the cursor position to the start of that line""" - row, col = self.cursor_position - start = WindowsCoordinates(row, 0) - FillConsoleOutputCharacter(self._handle, " ", length=col, start=start) - FillConsoleOutputAttribute( - self._handle, self._default_attrs, length=col, start=start - ) - - def move_cursor_up(self) -> None: - """Move the cursor up a single cell""" - cursor_position = self.cursor_position - SetConsoleCursorPosition( - self._handle, - coords=WindowsCoordinates( - row=cursor_position.row - 1, col=cursor_position.col - ), - ) - - def move_cursor_down(self) -> None: - """Move the cursor down a single cell""" - cursor_position = self.cursor_position - SetConsoleCursorPosition( - self._handle, - coords=WindowsCoordinates( - row=cursor_position.row + 1, - col=cursor_position.col, - ), - ) - - def move_cursor_forward(self) -> None: - """Move the cursor forward a single cell. Wrap to the next line if required.""" - row, col = self.cursor_position - if col == self.screen_size.col - 1: - row += 1 - col = 0 - else: - col += 1 - SetConsoleCursorPosition( - self._handle, coords=WindowsCoordinates(row=row, col=col) - ) - - def move_cursor_to_column(self, column: int) -> None: - """Move cursor to the column specified by the zero-based column index, staying on the same row - - Args: - column (int): The zero-based column index to move the cursor to. - """ - row, _ = self.cursor_position - SetConsoleCursorPosition(self._handle, coords=WindowsCoordinates(row, column)) - - def move_cursor_backward(self) -> None: - """Move the cursor backward a single cell. Wrap to the previous line if required.""" - row, col = self.cursor_position - if col == 0: - row -= 1 - col = self.screen_size.col - 1 - else: - col -= 1 - SetConsoleCursorPosition( - self._handle, coords=WindowsCoordinates(row=row, col=col) - ) - - def hide_cursor(self) -> None: - """Hide the cursor""" - current_cursor_size = self._get_cursor_size() - invisible_cursor = CONSOLE_CURSOR_INFO(dwSize=current_cursor_size, bVisible=0) - SetConsoleCursorInfo(self._handle, cursor_info=invisible_cursor) - - def show_cursor(self) -> None: - """Show the cursor""" - current_cursor_size = self._get_cursor_size() - visible_cursor = CONSOLE_CURSOR_INFO(dwSize=current_cursor_size, bVisible=1) - SetConsoleCursorInfo(self._handle, cursor_info=visible_cursor) - - def set_title(self, title: str) -> None: - """Set the title of the terminal window - - Args: - title (str): The new title of the console window - """ - assert len(title) < 255, "Console title must be less than 255 characters" - SetConsoleTitle(title) - - def _get_cursor_size(self) -> int: - """Get the percentage of the character cell that is filled by the cursor""" - cursor_info = CONSOLE_CURSOR_INFO() - GetConsoleCursorInfo(self._handle, cursor_info=cursor_info) - return int(cursor_info.dwSize) - - -if __name__ == "__main__": - handle = GetStdHandle() - - from rich.console import Console - - console = Console() - - term = LegacyWindowsTerm(sys.stdout) - term.set_title("Win32 Console Examples") - - style = Style(color="black", bgcolor="red") - - heading = Style.parse("black on green") - - # Check colour output - console.rule("Checking colour output") - console.print("[on red]on red!") - console.print("[blue]blue!") - console.print("[yellow]yellow!") - console.print("[bold yellow]bold yellow!") - console.print("[bright_yellow]bright_yellow!") - console.print("[dim bright_yellow]dim bright_yellow!") - console.print("[italic cyan]italic cyan!") - console.print("[bold white on blue]bold white on blue!") - console.print("[reverse bold white on blue]reverse bold white on blue!") - console.print("[bold black on cyan]bold black on cyan!") - console.print("[black on green]black on green!") - console.print("[blue on green]blue on green!") - console.print("[white on black]white on black!") - console.print("[black on white]black on white!") - console.print("[#1BB152 on #DA812D]#1BB152 on #DA812D!") - - # Check cursor movement - console.rule("Checking cursor movement") - console.print() - term.move_cursor_backward() - term.move_cursor_backward() - term.write_text("went back and wrapped to prev line") - time.sleep(1) - term.move_cursor_up() - term.write_text("we go up") - time.sleep(1) - term.move_cursor_down() - term.write_text("and down") - time.sleep(1) - term.move_cursor_up() - term.move_cursor_backward() - term.move_cursor_backward() - term.write_text("we went up and back 2") - time.sleep(1) - term.move_cursor_down() - term.move_cursor_backward() - term.move_cursor_backward() - term.write_text("we went down and back 2") - time.sleep(1) - - # Check erasing of lines - term.hide_cursor() - console.print() - console.rule("Checking line erasing") - console.print("\n...Deleting to the start of the line...") - term.write_text("The red arrow shows the cursor location, and direction of erase") - time.sleep(1) - term.move_cursor_to_column(16) - term.write_styled("<", Style.parse("black on red")) - term.move_cursor_backward() - time.sleep(1) - term.erase_start_of_line() - time.sleep(1) - - console.print("\n\n...And to the end of the line...") - term.write_text("The red arrow shows the cursor location, and direction of erase") - time.sleep(1) - - term.move_cursor_to_column(16) - term.write_styled(">", Style.parse("black on red")) - time.sleep(1) - term.erase_end_of_line() - time.sleep(1) - - console.print("\n\n...Now the whole line will be erased...") - term.write_styled("I'm going to disappear!", style=Style.parse("black on cyan")) - time.sleep(1) - term.erase_line() - - term.show_cursor() - print("\n") diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_windows.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_windows.py deleted file mode 100644 index 98c70086..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_windows.py +++ /dev/null @@ -1,72 +0,0 @@ -import sys -from dataclasses import dataclass - - -@dataclass -class WindowsConsoleFeatures: - """Windows features available.""" - - vt: bool = False - """The console supports VT codes.""" - truecolor: bool = False - """The console supports truecolor.""" - - -try: - import ctypes - from ctypes import LibraryLoader - - if sys.platform == "win32": - windll = LibraryLoader(ctypes.WinDLL) - else: - windll = None - raise ImportError("Not windows") - - from rich._win32_console import ( - ENABLE_VIRTUAL_TERMINAL_PROCESSING, - GetConsoleMode, - GetStdHandle, - LegacyWindowsError, - ) - -except (AttributeError, ImportError, ValueError): - - # Fallback if we can't load the Windows DLL - def get_windows_console_features() -> WindowsConsoleFeatures: - features = WindowsConsoleFeatures() - return features - -else: - - def get_windows_console_features() -> WindowsConsoleFeatures: - """Get windows console features. - - Returns: - WindowsConsoleFeatures: An instance of WindowsConsoleFeatures. - """ - handle = GetStdHandle() - try: - console_mode = GetConsoleMode(handle) - success = True - except LegacyWindowsError: - console_mode = 0 - success = False - vt = bool(success and console_mode & ENABLE_VIRTUAL_TERMINAL_PROCESSING) - truecolor = False - if vt: - win_version = sys.getwindowsversion() - truecolor = win_version.major > 10 or ( - win_version.major == 10 and win_version.build >= 15063 - ) - features = WindowsConsoleFeatures(vt=vt, truecolor=truecolor) - return features - - -if __name__ == "__main__": - import platform - - features = get_windows_console_features() - from rich import print - - print(f'platform="{platform.system()}"') - print(repr(features)) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_windows_renderer.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_windows_renderer.py deleted file mode 100644 index 0fc2ba85..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_windows_renderer.py +++ /dev/null @@ -1,56 +0,0 @@ -from typing import Iterable, Sequence, Tuple, cast - -from rich._win32_console import LegacyWindowsTerm, WindowsCoordinates -from rich.segment import ControlCode, ControlType, Segment - - -def legacy_windows_render(buffer: Iterable[Segment], term: LegacyWindowsTerm) -> None: - """Makes appropriate Windows Console API calls based on the segments in the buffer. - - Args: - buffer (Iterable[Segment]): Iterable of Segments to convert to Win32 API calls. - term (LegacyWindowsTerm): Used to call the Windows Console API. - """ - for text, style, control in buffer: - if not control: - if style: - term.write_styled(text, style) - else: - term.write_text(text) - else: - control_codes: Sequence[ControlCode] = control - for control_code in control_codes: - control_type = control_code[0] - if control_type == ControlType.CURSOR_MOVE_TO: - _, x, y = cast(Tuple[ControlType, int, int], control_code) - term.move_cursor_to(WindowsCoordinates(row=y - 1, col=x - 1)) - elif control_type == ControlType.CARRIAGE_RETURN: - term.write_text("\r") - elif control_type == ControlType.HOME: - term.move_cursor_to(WindowsCoordinates(0, 0)) - elif control_type == ControlType.CURSOR_UP: - term.move_cursor_up() - elif control_type == ControlType.CURSOR_DOWN: - term.move_cursor_down() - elif control_type == ControlType.CURSOR_FORWARD: - term.move_cursor_forward() - elif control_type == ControlType.CURSOR_BACKWARD: - term.move_cursor_backward() - elif control_type == ControlType.CURSOR_MOVE_TO_COLUMN: - _, column = cast(Tuple[ControlType, int], control_code) - term.move_cursor_to_column(column - 1) - elif control_type == ControlType.HIDE_CURSOR: - term.hide_cursor() - elif control_type == ControlType.SHOW_CURSOR: - term.show_cursor() - elif control_type == ControlType.ERASE_IN_LINE: - _, mode = cast(Tuple[ControlType, int], control_code) - if mode == 0: - term.erase_end_of_line() - elif mode == 1: - term.erase_start_of_line() - elif mode == 2: - term.erase_line() - elif control_type == ControlType.SET_WINDOW_TITLE: - _, title = cast(Tuple[ControlType, str], control_code) - term.set_title(title) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_wrap.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_wrap.py deleted file mode 100644 index c45f193f..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/_wrap.py +++ /dev/null @@ -1,56 +0,0 @@ -import re -from typing import Iterable, List, Tuple - -from ._loop import loop_last -from .cells import cell_len, chop_cells - -re_word = re.compile(r"\s*\S+\s*") - - -def words(text: str) -> Iterable[Tuple[int, int, str]]: - position = 0 - word_match = re_word.match(text, position) - while word_match is not None: - start, end = word_match.span() - word = word_match.group(0) - yield start, end, word - word_match = re_word.match(text, end) - - -def divide_line(text: str, width: int, fold: bool = True) -> List[int]: - divides: List[int] = [] - append = divides.append - line_position = 0 - _cell_len = cell_len - for start, _end, word in words(text): - word_length = _cell_len(word.rstrip()) - if line_position + word_length > width: - if word_length > width: - if fold: - chopped_words = chop_cells(word, max_size=width, position=0) - for last, line in loop_last(chopped_words): - if start: - append(start) - - if last: - line_position = _cell_len(line) - else: - start += len(line) - else: - if start: - append(start) - line_position = _cell_len(word) - elif line_position and start: - append(start) - line_position = _cell_len(word) - else: - line_position += _cell_len(word) - return divides - - -if __name__ == "__main__": # pragma: no cover - from .console import Console - - console = Console(width=10) - console.print("12345 abcdefghijklmnopqrstuvwyxzABCDEFGHIJKLMNOPQRSTUVWXYZ 12345") - print(chop_cells("abcdefghijklmnopqrstuvwxyz", 10, position=2)) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/abc.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/abc.py deleted file mode 100644 index 42db7c00..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/abc.py +++ /dev/null @@ -1,33 +0,0 @@ -from abc import ABC - - -class RichRenderable(ABC): - """An abstract base class for Rich renderables. - - Note that there is no need to extend this class, the intended use is to check if an - object supports the Rich renderable protocol. For example:: - - if isinstance(my_object, RichRenderable): - console.print(my_object) - - """ - - @classmethod - def __subclasshook__(cls, other: type) -> bool: - """Check if this class supports the rich render protocol.""" - return hasattr(other, "__rich_console__") or hasattr(other, "__rich__") - - -if __name__ == "__main__": # pragma: no cover - from rich.text import Text - - t = Text() - print(isinstance(Text, RichRenderable)) - print(isinstance(t, RichRenderable)) - - class Foo: - pass - - f = Foo() - print(isinstance(f, RichRenderable)) - print(isinstance("", RichRenderable)) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/align.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/align.py deleted file mode 100644 index e8fc3062..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/align.py +++ /dev/null @@ -1,311 +0,0 @@ -import sys -from itertools import chain -from typing import TYPE_CHECKING, Iterable, Optional - -if sys.version_info >= (3, 8): - from typing import Literal -else: - from typing_extensions import Literal # pragma: no cover - -from .constrain import Constrain -from .jupyter import JupyterMixin -from .measure import Measurement -from .segment import Segment -from .style import StyleType - -if TYPE_CHECKING: - from .console import Console, ConsoleOptions, RenderableType, RenderResult - -AlignMethod = Literal["left", "center", "right"] -VerticalAlignMethod = Literal["top", "middle", "bottom"] - - -class Align(JupyterMixin): - """Align a renderable by adding spaces if necessary. - - Args: - renderable (RenderableType): A console renderable. - align (AlignMethod): One of "left", "center", or "right"" - style (StyleType, optional): An optional style to apply to the background. - vertical (Optional[VerticalAlginMethod], optional): Optional vertical align, one of "top", "middle", or "bottom". Defaults to None. - pad (bool, optional): Pad the right with spaces. Defaults to True. - width (int, optional): Restrict contents to given width, or None to use default width. Defaults to None. - height (int, optional): Set height of align renderable, or None to fit to contents. Defaults to None. - - Raises: - ValueError: if ``align`` is not one of the expected values. - """ - - def __init__( - self, - renderable: "RenderableType", - align: AlignMethod = "left", - style: Optional[StyleType] = None, - *, - vertical: Optional[VerticalAlignMethod] = None, - pad: bool = True, - width: Optional[int] = None, - height: Optional[int] = None, - ) -> None: - if align not in ("left", "center", "right"): - raise ValueError( - f'invalid value for align, expected "left", "center", or "right" (not {align!r})' - ) - if vertical is not None and vertical not in ("top", "middle", "bottom"): - raise ValueError( - f'invalid value for vertical, expected "top", "middle", or "bottom" (not {vertical!r})' - ) - self.renderable = renderable - self.align = align - self.style = style - self.vertical = vertical - self.pad = pad - self.width = width - self.height = height - - def __repr__(self) -> str: - return f"Align({self.renderable!r}, {self.align!r})" - - @classmethod - def left( - cls, - renderable: "RenderableType", - style: Optional[StyleType] = None, - *, - vertical: Optional[VerticalAlignMethod] = None, - pad: bool = True, - width: Optional[int] = None, - height: Optional[int] = None, - ) -> "Align": - """Align a renderable to the left.""" - return cls( - renderable, - "left", - style=style, - vertical=vertical, - pad=pad, - width=width, - height=height, - ) - - @classmethod - def center( - cls, - renderable: "RenderableType", - style: Optional[StyleType] = None, - *, - vertical: Optional[VerticalAlignMethod] = None, - pad: bool = True, - width: Optional[int] = None, - height: Optional[int] = None, - ) -> "Align": - """Align a renderable to the center.""" - return cls( - renderable, - "center", - style=style, - vertical=vertical, - pad=pad, - width=width, - height=height, - ) - - @classmethod - def right( - cls, - renderable: "RenderableType", - style: Optional[StyleType] = None, - *, - vertical: Optional[VerticalAlignMethod] = None, - pad: bool = True, - width: Optional[int] = None, - height: Optional[int] = None, - ) -> "Align": - """Align a renderable to the right.""" - return cls( - renderable, - "right", - style=style, - vertical=vertical, - pad=pad, - width=width, - height=height, - ) - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - align = self.align - width = console.measure(self.renderable, options=options).maximum - rendered = console.render( - Constrain( - self.renderable, width if self.width is None else min(width, self.width) - ), - options.update(height=None), - ) - lines = list(Segment.split_lines(rendered)) - width, height = Segment.get_shape(lines) - lines = Segment.set_shape(lines, width, height) - new_line = Segment.line() - excess_space = options.max_width - width - style = console.get_style(self.style) if self.style is not None else None - - def generate_segments() -> Iterable[Segment]: - if excess_space <= 0: - # Exact fit - for line in lines: - yield from line - yield new_line - - elif align == "left": - # Pad on the right - pad = Segment(" " * excess_space, style) if self.pad else None - for line in lines: - yield from line - if pad: - yield pad - yield new_line - - elif align == "center": - # Pad left and right - left = excess_space // 2 - pad = Segment(" " * left, style) - pad_right = ( - Segment(" " * (excess_space - left), style) if self.pad else None - ) - for line in lines: - if left: - yield pad - yield from line - if pad_right: - yield pad_right - yield new_line - - elif align == "right": - # Padding on left - pad = Segment(" " * excess_space, style) - for line in lines: - yield pad - yield from line - yield new_line - - blank_line = ( - Segment(f"{' ' * (self.width or options.max_width)}\n", style) - if self.pad - else Segment("\n") - ) - - def blank_lines(count: int) -> Iterable[Segment]: - if count > 0: - for _ in range(count): - yield blank_line - - vertical_height = self.height or options.height - iter_segments: Iterable[Segment] - if self.vertical and vertical_height is not None: - if self.vertical == "top": - bottom_space = vertical_height - height - iter_segments = chain(generate_segments(), blank_lines(bottom_space)) - elif self.vertical == "middle": - top_space = (vertical_height - height) // 2 - bottom_space = vertical_height - top_space - height - iter_segments = chain( - blank_lines(top_space), - generate_segments(), - blank_lines(bottom_space), - ) - else: # self.vertical == "bottom": - top_space = vertical_height - height - iter_segments = chain(blank_lines(top_space), generate_segments()) - else: - iter_segments = generate_segments() - if self.style: - style = console.get_style(self.style) - iter_segments = Segment.apply_style(iter_segments, style) - yield from iter_segments - - def __rich_measure__( - self, console: "Console", options: "ConsoleOptions" - ) -> Measurement: - measurement = Measurement.get(console, options, self.renderable) - return measurement - - -class VerticalCenter(JupyterMixin): - """Vertically aligns a renderable. - - Warn: - This class is deprecated and may be removed in a future version. Use Align class with - `vertical="middle"`. - - Args: - renderable (RenderableType): A renderable object. - """ - - def __init__( - self, - renderable: "RenderableType", - style: Optional[StyleType] = None, - ) -> None: - self.renderable = renderable - self.style = style - - def __repr__(self) -> str: - return f"VerticalCenter({self.renderable!r})" - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - style = console.get_style(self.style) if self.style is not None else None - lines = console.render_lines( - self.renderable, options.update(height=None), pad=False - ) - width, _height = Segment.get_shape(lines) - new_line = Segment.line() - height = options.height or options.size.height - top_space = (height - len(lines)) // 2 - bottom_space = height - top_space - len(lines) - blank_line = Segment(f"{' ' * width}", style) - - def blank_lines(count: int) -> Iterable[Segment]: - for _ in range(count): - yield blank_line - yield new_line - - if top_space > 0: - yield from blank_lines(top_space) - for line in lines: - yield from line - yield new_line - if bottom_space > 0: - yield from blank_lines(bottom_space) - - def __rich_measure__( - self, console: "Console", options: "ConsoleOptions" - ) -> Measurement: - measurement = Measurement.get(console, options, self.renderable) - return measurement - - -if __name__ == "__main__": # pragma: no cover - from rich.console import Console, Group - from rich.highlighter import ReprHighlighter - from rich.panel import Panel - - highlighter = ReprHighlighter() - console = Console() - - panel = Panel( - Group( - Align.left(highlighter("align='left'")), - Align.center(highlighter("align='center'")), - Align.right(highlighter("align='right'")), - ), - width=60, - style="on dark_blue", - title="Align", - ) - - console.print( - Align.center(panel, vertical="middle", style="on red", height=console.height) - ) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/ansi.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/ansi.py deleted file mode 100644 index 66365e65..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/ansi.py +++ /dev/null @@ -1,240 +0,0 @@ -import re -import sys -from contextlib import suppress -from typing import Iterable, NamedTuple, Optional - -from .color import Color -from .style import Style -from .text import Text - -re_ansi = re.compile( - r""" -(?:\x1b\](.*?)\x1b\\)| -(?:\x1b([(@-Z\\-_]|\[[0-?]*[ -/]*[@-~])) -""", - re.VERBOSE, -) - - -class _AnsiToken(NamedTuple): - """Result of ansi tokenized string.""" - - plain: str = "" - sgr: Optional[str] = "" - osc: Optional[str] = "" - - -def _ansi_tokenize(ansi_text: str) -> Iterable[_AnsiToken]: - """Tokenize a string in to plain text and ANSI codes. - - Args: - ansi_text (str): A String containing ANSI codes. - - Yields: - AnsiToken: A named tuple of (plain, sgr, osc) - """ - - position = 0 - sgr: Optional[str] - osc: Optional[str] - for match in re_ansi.finditer(ansi_text): - start, end = match.span(0) - osc, sgr = match.groups() - if start > position: - yield _AnsiToken(ansi_text[position:start]) - if sgr: - if sgr == "(": - position = end + 1 - continue - if sgr.endswith("m"): - yield _AnsiToken("", sgr[1:-1], osc) - else: - yield _AnsiToken("", sgr, osc) - position = end - if position < len(ansi_text): - yield _AnsiToken(ansi_text[position:]) - - -SGR_STYLE_MAP = { - 1: "bold", - 2: "dim", - 3: "italic", - 4: "underline", - 5: "blink", - 6: "blink2", - 7: "reverse", - 8: "conceal", - 9: "strike", - 21: "underline2", - 22: "not dim not bold", - 23: "not italic", - 24: "not underline", - 25: "not blink", - 26: "not blink2", - 27: "not reverse", - 28: "not conceal", - 29: "not strike", - 30: "color(0)", - 31: "color(1)", - 32: "color(2)", - 33: "color(3)", - 34: "color(4)", - 35: "color(5)", - 36: "color(6)", - 37: "color(7)", - 39: "default", - 40: "on color(0)", - 41: "on color(1)", - 42: "on color(2)", - 43: "on color(3)", - 44: "on color(4)", - 45: "on color(5)", - 46: "on color(6)", - 47: "on color(7)", - 49: "on default", - 51: "frame", - 52: "encircle", - 53: "overline", - 54: "not frame not encircle", - 55: "not overline", - 90: "color(8)", - 91: "color(9)", - 92: "color(10)", - 93: "color(11)", - 94: "color(12)", - 95: "color(13)", - 96: "color(14)", - 97: "color(15)", - 100: "on color(8)", - 101: "on color(9)", - 102: "on color(10)", - 103: "on color(11)", - 104: "on color(12)", - 105: "on color(13)", - 106: "on color(14)", - 107: "on color(15)", -} - - -class AnsiDecoder: - """Translate ANSI code in to styled Text.""" - - def __init__(self) -> None: - self.style = Style.null() - - def decode(self, terminal_text: str) -> Iterable[Text]: - """Decode ANSI codes in an iterable of lines. - - Args: - lines (Iterable[str]): An iterable of lines of terminal output. - - Yields: - Text: Marked up Text. - """ - for line in terminal_text.splitlines(): - yield self.decode_line(line) - - def decode_line(self, line: str) -> Text: - """Decode a line containing ansi codes. - - Args: - line (str): A line of terminal output. - - Returns: - Text: A Text instance marked up according to ansi codes. - """ - from_ansi = Color.from_ansi - from_rgb = Color.from_rgb - _Style = Style - text = Text() - append = text.append - line = line.rsplit("\r", 1)[-1] - for plain_text, sgr, osc in _ansi_tokenize(line): - if plain_text: - append(plain_text, self.style or None) - elif osc is not None: - if osc.startswith("8;"): - _params, semicolon, link = osc[2:].partition(";") - if semicolon: - self.style = self.style.update_link(link or None) - elif sgr is not None: - # Translate in to semi-colon separated codes - # Ignore invalid codes, because we want to be lenient - codes = [ - min(255, int(_code) if _code else 0) - for _code in sgr.split(";") - if _code.isdigit() or _code == "" - ] - iter_codes = iter(codes) - for code in iter_codes: - if code == 0: - # reset - self.style = _Style.null() - elif code in SGR_STYLE_MAP: - # styles - self.style += _Style.parse(SGR_STYLE_MAP[code]) - elif code == 38: - #  Foreground - with suppress(StopIteration): - color_type = next(iter_codes) - if color_type == 5: - self.style += _Style.from_color( - from_ansi(next(iter_codes)) - ) - elif color_type == 2: - self.style += _Style.from_color( - from_rgb( - next(iter_codes), - next(iter_codes), - next(iter_codes), - ) - ) - elif code == 48: - # Background - with suppress(StopIteration): - color_type = next(iter_codes) - if color_type == 5: - self.style += _Style.from_color( - None, from_ansi(next(iter_codes)) - ) - elif color_type == 2: - self.style += _Style.from_color( - None, - from_rgb( - next(iter_codes), - next(iter_codes), - next(iter_codes), - ), - ) - - return text - - -if sys.platform != "win32" and __name__ == "__main__": # pragma: no cover - import io - import os - import pty - import sys - - decoder = AnsiDecoder() - - stdout = io.BytesIO() - - def read(fd: int) -> bytes: - data = os.read(fd, 1024) - stdout.write(data) - return data - - pty.spawn(sys.argv[1:], read) - - from .console import Console - - console = Console(record=True) - - stdout_result = stdout.getvalue().decode("utf-8") - print(stdout_result) - - for line in decoder.decode(stdout_result): - console.print(line) - - console.save_html("stdout.html") diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/bar.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/bar.py deleted file mode 100644 index ed86a552..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/bar.py +++ /dev/null @@ -1,94 +0,0 @@ -from typing import Optional, Union - -from .color import Color -from .console import Console, ConsoleOptions, RenderResult -from .jupyter import JupyterMixin -from .measure import Measurement -from .segment import Segment -from .style import Style - -# There are left-aligned characters for 1/8 to 7/8, but -# the right-aligned characters exist only for 1/8 and 4/8. -BEGIN_BLOCK_ELEMENTS = ["█", "█", "█", "▐", "▐", "▐", "▕", "▕"] -END_BLOCK_ELEMENTS = [" ", "▏", "▎", "▍", "▌", "▋", "▊", "▉"] -FULL_BLOCK = "█" - - -class Bar(JupyterMixin): - """Renders a solid block bar. - - Args: - size (float): Value for the end of the bar. - begin (float): Begin point (between 0 and size, inclusive). - end (float): End point (between 0 and size, inclusive). - width (int, optional): Width of the bar, or ``None`` for maximum width. Defaults to None. - color (Union[Color, str], optional): Color of the bar. Defaults to "default". - bgcolor (Union[Color, str], optional): Color of bar background. Defaults to "default". - """ - - def __init__( - self, - size: float, - begin: float, - end: float, - *, - width: Optional[int] = None, - color: Union[Color, str] = "default", - bgcolor: Union[Color, str] = "default", - ): - self.size = size - self.begin = max(begin, 0) - self.end = min(end, size) - self.width = width - self.style = Style(color=color, bgcolor=bgcolor) - - def __repr__(self) -> str: - return f"Bar({self.size}, {self.begin}, {self.end})" - - def __rich_console__( - self, console: Console, options: ConsoleOptions - ) -> RenderResult: - - width = min( - self.width if self.width is not None else options.max_width, - options.max_width, - ) - - if self.begin >= self.end: - yield Segment(" " * width, self.style) - yield Segment.line() - return - - prefix_complete_eights = int(width * 8 * self.begin / self.size) - prefix_bar_count = prefix_complete_eights // 8 - prefix_eights_count = prefix_complete_eights % 8 - - body_complete_eights = int(width * 8 * self.end / self.size) - body_bar_count = body_complete_eights // 8 - body_eights_count = body_complete_eights % 8 - - # When start and end fall into the same cell, we ideally should render - # a symbol that's "center-aligned", but there is no good symbol in Unicode. - # In this case, we fall back to right-aligned block symbol for simplicity. - - prefix = " " * prefix_bar_count - if prefix_eights_count: - prefix += BEGIN_BLOCK_ELEMENTS[prefix_eights_count] - - body = FULL_BLOCK * body_bar_count - if body_eights_count: - body += END_BLOCK_ELEMENTS[body_eights_count] - - suffix = " " * (width - len(body)) - - yield Segment(prefix + body[len(prefix) :] + suffix, self.style) - yield Segment.line() - - def __rich_measure__( - self, console: Console, options: ConsoleOptions - ) -> Measurement: - return ( - Measurement(self.width, self.width) - if self.width is not None - else Measurement(4, options.max_width) - ) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/box.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/box.py deleted file mode 100644 index c2655002..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/box.py +++ /dev/null @@ -1,517 +0,0 @@ -import sys -from typing import TYPE_CHECKING, Iterable, List - -if sys.version_info >= (3, 8): - from typing import Literal -else: - from typing_extensions import Literal # pragma: no cover - - -from ._loop import loop_last - -if TYPE_CHECKING: - from rich.console import ConsoleOptions - - -class Box: - """Defines characters to render boxes. - - ┌─┬┐ top - │ ││ head - ├─┼┤ head_row - │ ││ mid - ├─┼┤ row - ├─┼┤ foot_row - │ ││ foot - └─┴┘ bottom - - Args: - box (str): Characters making up box. - ascii (bool, optional): True if this box uses ascii characters only. Default is False. - """ - - def __init__(self, box: str, *, ascii: bool = False) -> None: - self._box = box - self.ascii = ascii - line1, line2, line3, line4, line5, line6, line7, line8 = box.splitlines() - # top - self.top_left, self.top, self.top_divider, self.top_right = iter(line1) - # head - self.head_left, _, self.head_vertical, self.head_right = iter(line2) - # head_row - ( - self.head_row_left, - self.head_row_horizontal, - self.head_row_cross, - self.head_row_right, - ) = iter(line3) - - # mid - self.mid_left, _, self.mid_vertical, self.mid_right = iter(line4) - # row - self.row_left, self.row_horizontal, self.row_cross, self.row_right = iter(line5) - # foot_row - ( - self.foot_row_left, - self.foot_row_horizontal, - self.foot_row_cross, - self.foot_row_right, - ) = iter(line6) - # foot - self.foot_left, _, self.foot_vertical, self.foot_right = iter(line7) - # bottom - self.bottom_left, self.bottom, self.bottom_divider, self.bottom_right = iter( - line8 - ) - - def __repr__(self) -> str: - return "Box(...)" - - def __str__(self) -> str: - return self._box - - def substitute(self, options: "ConsoleOptions", safe: bool = True) -> "Box": - """Substitute this box for another if it won't render due to platform issues. - - Args: - options (ConsoleOptions): Console options used in rendering. - safe (bool, optional): Substitute this for another Box if there are known problems - displaying on the platform (currently only relevant on Windows). Default is True. - - Returns: - Box: A different Box or the same Box. - """ - box = self - if options.legacy_windows and safe: - box = LEGACY_WINDOWS_SUBSTITUTIONS.get(box, box) - if options.ascii_only and not box.ascii: - box = ASCII - return box - - def get_plain_headed_box(self) -> "Box": - """If this box uses special characters for the borders of the header, then - return the equivalent box that does not. - - Returns: - Box: The most similar Box that doesn't use header-specific box characters. - If the current Box already satisfies this criterion, then it's returned. - """ - return PLAIN_HEADED_SUBSTITUTIONS.get(self, self) - - def get_top(self, widths: Iterable[int]) -> str: - """Get the top of a simple box. - - Args: - widths (List[int]): Widths of columns. - - Returns: - str: A string of box characters. - """ - - parts: List[str] = [] - append = parts.append - append(self.top_left) - for last, width in loop_last(widths): - append(self.top * width) - if not last: - append(self.top_divider) - append(self.top_right) - return "".join(parts) - - def get_row( - self, - widths: Iterable[int], - level: Literal["head", "row", "foot", "mid"] = "row", - edge: bool = True, - ) -> str: - """Get the top of a simple box. - - Args: - width (List[int]): Widths of columns. - - Returns: - str: A string of box characters. - """ - if level == "head": - left = self.head_row_left - horizontal = self.head_row_horizontal - cross = self.head_row_cross - right = self.head_row_right - elif level == "row": - left = self.row_left - horizontal = self.row_horizontal - cross = self.row_cross - right = self.row_right - elif level == "mid": - left = self.mid_left - horizontal = " " - cross = self.mid_vertical - right = self.mid_right - elif level == "foot": - left = self.foot_row_left - horizontal = self.foot_row_horizontal - cross = self.foot_row_cross - right = self.foot_row_right - else: - raise ValueError("level must be 'head', 'row' or 'foot'") - - parts: List[str] = [] - append = parts.append - if edge: - append(left) - for last, width in loop_last(widths): - append(horizontal * width) - if not last: - append(cross) - if edge: - append(right) - return "".join(parts) - - def get_bottom(self, widths: Iterable[int]) -> str: - """Get the bottom of a simple box. - - Args: - widths (List[int]): Widths of columns. - - Returns: - str: A string of box characters. - """ - - parts: List[str] = [] - append = parts.append - append(self.bottom_left) - for last, width in loop_last(widths): - append(self.bottom * width) - if not last: - append(self.bottom_divider) - append(self.bottom_right) - return "".join(parts) - - -ASCII: Box = Box( - """\ -+--+ -| || -|-+| -| || -|-+| -|-+| -| || -+--+ -""", - ascii=True, -) - -ASCII2: Box = Box( - """\ -+-++ -| || -+-++ -| || -+-++ -+-++ -| || -+-++ -""", - ascii=True, -) - -ASCII_DOUBLE_HEAD: Box = Box( - """\ -+-++ -| || -+=++ -| || -+-++ -+-++ -| || -+-++ -""", - ascii=True, -) - -SQUARE: Box = Box( - """\ -┌─┬┐ -│ ││ -├─┼┤ -│ ││ -├─┼┤ -├─┼┤ -│ ││ -└─┴┘ -""" -) - -SQUARE_DOUBLE_HEAD: Box = Box( - """\ -┌─┬┐ -│ ││ -╞═╪╡ -│ ││ -├─┼┤ -├─┼┤ -│ ││ -└─┴┘ -""" -) - -MINIMAL: Box = Box( - """\ - ╷ - │ -╶─┼╴ - │ -╶─┼╴ -╶─┼╴ - │ - ╵ -""" -) - - -MINIMAL_HEAVY_HEAD: Box = Box( - """\ - ╷ - │ -╺━┿╸ - │ -╶─┼╴ -╶─┼╴ - │ - ╵ -""" -) - -MINIMAL_DOUBLE_HEAD: Box = Box( - """\ - ╷ - │ - ═╪ - │ - ─┼ - ─┼ - │ - ╵ -""" -) - - -SIMPLE: Box = Box( - """\ - - - ── - - - ── - - -""" -) - -SIMPLE_HEAD: Box = Box( - """\ - - - ── - - - - - -""" -) - - -SIMPLE_HEAVY: Box = Box( - """\ - - - ━━ - - - ━━ - - -""" -) - - -HORIZONTALS: Box = Box( - """\ - ── - - ── - - ── - ── - - ── -""" -) - -ROUNDED: Box = Box( - """\ -╭─┬╮ -│ ││ -├─┼┤ -│ ││ -├─┼┤ -├─┼┤ -│ ││ -╰─┴╯ -""" -) - -HEAVY: Box = Box( - """\ -┏━┳┓ -┃ ┃┃ -┣━╋┫ -┃ ┃┃ -┣━╋┫ -┣━╋┫ -┃ ┃┃ -┗━┻┛ -""" -) - -HEAVY_EDGE: Box = Box( - """\ -┏━┯┓ -┃ │┃ -┠─┼┨ -┃ │┃ -┠─┼┨ -┠─┼┨ -┃ │┃ -┗━┷┛ -""" -) - -HEAVY_HEAD: Box = Box( - """\ -┏━┳┓ -┃ ┃┃ -┡━╇┩ -│ ││ -├─┼┤ -├─┼┤ -│ ││ -└─┴┘ -""" -) - -DOUBLE: Box = Box( - """\ -╔═╦╗ -║ ║║ -╠═╬╣ -║ ║║ -╠═╬╣ -╠═╬╣ -║ ║║ -╚═╩╝ -""" -) - -DOUBLE_EDGE: Box = Box( - """\ -╔═╤╗ -║ │║ -╟─┼╢ -║ │║ -╟─┼╢ -╟─┼╢ -║ │║ -╚═╧╝ -""" -) - -MARKDOWN: Box = Box( - """\ - -| || -|-|| -| || -|-|| -|-|| -| || - -""", - ascii=True, -) - -# Map Boxes that don't render with raster fonts on to equivalent that do -LEGACY_WINDOWS_SUBSTITUTIONS = { - ROUNDED: SQUARE, - MINIMAL_HEAVY_HEAD: MINIMAL, - SIMPLE_HEAVY: SIMPLE, - HEAVY: SQUARE, - HEAVY_EDGE: SQUARE, - HEAVY_HEAD: SQUARE, -} - -# Map headed boxes to their headerless equivalents -PLAIN_HEADED_SUBSTITUTIONS = { - HEAVY_HEAD: SQUARE, - SQUARE_DOUBLE_HEAD: SQUARE, - MINIMAL_DOUBLE_HEAD: MINIMAL, - MINIMAL_HEAVY_HEAD: MINIMAL, - ASCII_DOUBLE_HEAD: ASCII2, -} - - -if __name__ == "__main__": # pragma: no cover - - from rich.columns import Columns - from rich.panel import Panel - - from . import box as box - from .console import Console - from .table import Table - from .text import Text - - console = Console(record=True) - - BOXES = [ - "ASCII", - "ASCII2", - "ASCII_DOUBLE_HEAD", - "SQUARE", - "SQUARE_DOUBLE_HEAD", - "MINIMAL", - "MINIMAL_HEAVY_HEAD", - "MINIMAL_DOUBLE_HEAD", - "SIMPLE", - "SIMPLE_HEAD", - "SIMPLE_HEAVY", - "HORIZONTALS", - "ROUNDED", - "HEAVY", - "HEAVY_EDGE", - "HEAVY_HEAD", - "DOUBLE", - "DOUBLE_EDGE", - "MARKDOWN", - ] - - console.print(Panel("[bold green]Box Constants", style="green"), justify="center") - console.print() - - columns = Columns(expand=True, padding=2) - for box_name in sorted(BOXES): - table = Table( - show_footer=True, style="dim", border_style="not dim", expand=True - ) - table.add_column("Header 1", "Footer 1") - table.add_column("Header 2", "Footer 2") - table.add_row("Cell", "Cell") - table.add_row("Cell", "Cell") - table.box = getattr(box, box_name) - table.title = Text(f"box.{box_name}", style="magenta") - columns.add_renderable(table) - console.print(columns) - - # console.save_svg("box.svg") diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/cells.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/cells.py deleted file mode 100644 index 9354f9e3..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/cells.py +++ /dev/null @@ -1,154 +0,0 @@ -import re -from functools import lru_cache -from typing import Callable, List - -from ._cell_widths import CELL_WIDTHS - -# Regex to match sequence of the most common character ranges -_is_single_cell_widths = re.compile("^[\u0020-\u006f\u00a0\u02ff\u0370-\u0482]*$").match - - -@lru_cache(4096) -def cached_cell_len(text: str) -> int: - """Get the number of cells required to display text. - - This method always caches, which may use up a lot of memory. It is recommended to use - `cell_len` over this method. - - Args: - text (str): Text to display. - - Returns: - int: Get the number of cells required to display text. - """ - _get_size = get_character_cell_size - total_size = sum(_get_size(character) for character in text) - return total_size - - -def cell_len(text: str, _cell_len: Callable[[str], int] = cached_cell_len) -> int: - """Get the number of cells required to display text. - - Args: - text (str): Text to display. - - Returns: - int: Get the number of cells required to display text. - """ - if len(text) < 512: - return _cell_len(text) - _get_size = get_character_cell_size - total_size = sum(_get_size(character) for character in text) - return total_size - - -@lru_cache(maxsize=4096) -def get_character_cell_size(character: str) -> int: - """Get the cell size of a character. - - Args: - character (str): A single character. - - Returns: - int: Number of cells (0, 1 or 2) occupied by that character. - """ - return _get_codepoint_cell_size(ord(character)) - - -@lru_cache(maxsize=4096) -def _get_codepoint_cell_size(codepoint: int) -> int: - """Get the cell size of a character. - - Args: - codepoint (int): Codepoint of a character. - - Returns: - int: Number of cells (0, 1 or 2) occupied by that character. - """ - - _table = CELL_WIDTHS - lower_bound = 0 - upper_bound = len(_table) - 1 - index = (lower_bound + upper_bound) // 2 - while True: - start, end, width = _table[index] - if codepoint < start: - upper_bound = index - 1 - elif codepoint > end: - lower_bound = index + 1 - else: - return 0 if width == -1 else width - if upper_bound < lower_bound: - break - index = (lower_bound + upper_bound) // 2 - return 1 - - -def set_cell_size(text: str, total: int) -> str: - """Set the length of a string to fit within given number of cells.""" - - if _is_single_cell_widths(text): - size = len(text) - if size < total: - return text + " " * (total - size) - return text[:total] - - if total <= 0: - return "" - cell_size = cell_len(text) - if cell_size == total: - return text - if cell_size < total: - return text + " " * (total - cell_size) - - start = 0 - end = len(text) - - # Binary search until we find the right size - while True: - pos = (start + end) // 2 - before = text[: pos + 1] - before_len = cell_len(before) - if before_len == total + 1 and cell_len(before[-1]) == 2: - return before[:-1] + " " - if before_len == total: - return before - if before_len > total: - end = pos - else: - start = pos - - -# TODO: This is inefficient -# TODO: This might not work with CWJ type characters -def chop_cells(text: str, max_size: int, position: int = 0) -> List[str]: - """Break text in to equal (cell) length strings, returning the characters in reverse - order""" - _get_character_cell_size = get_character_cell_size - characters = [ - (character, _get_character_cell_size(character)) for character in text - ] - total_size = position - lines: List[List[str]] = [[]] - append = lines[-1].append - - for character, size in reversed(characters): - if total_size + size > max_size: - lines.append([character]) - append = lines[-1].append - total_size = size - else: - total_size += size - append(character) - - return ["".join(line) for line in lines] - - -if __name__ == "__main__": # pragma: no cover - - print(get_character_cell_size("😽")) - for line in chop_cells("""这是对亚洲语言支持的测试。面对模棱两可的想法,拒绝猜测的诱惑。""", 8): - print(line) - for n in range(80, 1, -1): - print(set_cell_size("""这是对亚洲语言支持的测试。面对模棱两可的想法,拒绝猜测的诱惑。""", n) + "|") - print("x" * n) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/color.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/color.py deleted file mode 100644 index dfe45593..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/color.py +++ /dev/null @@ -1,622 +0,0 @@ -import platform -import re -from colorsys import rgb_to_hls -from enum import IntEnum -from functools import lru_cache -from typing import TYPE_CHECKING, NamedTuple, Optional, Tuple - -from ._palettes import EIGHT_BIT_PALETTE, STANDARD_PALETTE, WINDOWS_PALETTE -from .color_triplet import ColorTriplet -from .repr import Result, rich_repr -from .terminal_theme import DEFAULT_TERMINAL_THEME - -if TYPE_CHECKING: # pragma: no cover - from .terminal_theme import TerminalTheme - from .text import Text - - -WINDOWS = platform.system() == "Windows" - - -class ColorSystem(IntEnum): - """One of the 3 color system supported by terminals.""" - - STANDARD = 1 - EIGHT_BIT = 2 - TRUECOLOR = 3 - WINDOWS = 4 - - def __repr__(self) -> str: - return f"ColorSystem.{self.name}" - - def __str__(self) -> str: - return repr(self) - - -class ColorType(IntEnum): - """Type of color stored in Color class.""" - - DEFAULT = 0 - STANDARD = 1 - EIGHT_BIT = 2 - TRUECOLOR = 3 - WINDOWS = 4 - - def __repr__(self) -> str: - return f"ColorType.{self.name}" - - -ANSI_COLOR_NAMES = { - "black": 0, - "red": 1, - "green": 2, - "yellow": 3, - "blue": 4, - "magenta": 5, - "cyan": 6, - "white": 7, - "bright_black": 8, - "bright_red": 9, - "bright_green": 10, - "bright_yellow": 11, - "bright_blue": 12, - "bright_magenta": 13, - "bright_cyan": 14, - "bright_white": 15, - "grey0": 16, - "gray0": 16, - "navy_blue": 17, - "dark_blue": 18, - "blue3": 20, - "blue1": 21, - "dark_green": 22, - "deep_sky_blue4": 25, - "dodger_blue3": 26, - "dodger_blue2": 27, - "green4": 28, - "spring_green4": 29, - "turquoise4": 30, - "deep_sky_blue3": 32, - "dodger_blue1": 33, - "green3": 40, - "spring_green3": 41, - "dark_cyan": 36, - "light_sea_green": 37, - "deep_sky_blue2": 38, - "deep_sky_blue1": 39, - "spring_green2": 47, - "cyan3": 43, - "dark_turquoise": 44, - "turquoise2": 45, - "green1": 46, - "spring_green1": 48, - "medium_spring_green": 49, - "cyan2": 50, - "cyan1": 51, - "dark_red": 88, - "deep_pink4": 125, - "purple4": 55, - "purple3": 56, - "blue_violet": 57, - "orange4": 94, - "grey37": 59, - "gray37": 59, - "medium_purple4": 60, - "slate_blue3": 62, - "royal_blue1": 63, - "chartreuse4": 64, - "dark_sea_green4": 71, - "pale_turquoise4": 66, - "steel_blue": 67, - "steel_blue3": 68, - "cornflower_blue": 69, - "chartreuse3": 76, - "cadet_blue": 73, - "sky_blue3": 74, - "steel_blue1": 81, - "pale_green3": 114, - "sea_green3": 78, - "aquamarine3": 79, - "medium_turquoise": 80, - "chartreuse2": 112, - "sea_green2": 83, - "sea_green1": 85, - "aquamarine1": 122, - "dark_slate_gray2": 87, - "dark_magenta": 91, - "dark_violet": 128, - "purple": 129, - "light_pink4": 95, - "plum4": 96, - "medium_purple3": 98, - "slate_blue1": 99, - "yellow4": 106, - "wheat4": 101, - "grey53": 102, - "gray53": 102, - "light_slate_grey": 103, - "light_slate_gray": 103, - "medium_purple": 104, - "light_slate_blue": 105, - "dark_olive_green3": 149, - "dark_sea_green": 108, - "light_sky_blue3": 110, - "sky_blue2": 111, - "dark_sea_green3": 150, - "dark_slate_gray3": 116, - "sky_blue1": 117, - "chartreuse1": 118, - "light_green": 120, - "pale_green1": 156, - "dark_slate_gray1": 123, - "red3": 160, - "medium_violet_red": 126, - "magenta3": 164, - "dark_orange3": 166, - "indian_red": 167, - "hot_pink3": 168, - "medium_orchid3": 133, - "medium_orchid": 134, - "medium_purple2": 140, - "dark_goldenrod": 136, - "light_salmon3": 173, - "rosy_brown": 138, - "grey63": 139, - "gray63": 139, - "medium_purple1": 141, - "gold3": 178, - "dark_khaki": 143, - "navajo_white3": 144, - "grey69": 145, - "gray69": 145, - "light_steel_blue3": 146, - "light_steel_blue": 147, - "yellow3": 184, - "dark_sea_green2": 157, - "light_cyan3": 152, - "light_sky_blue1": 153, - "green_yellow": 154, - "dark_olive_green2": 155, - "dark_sea_green1": 193, - "pale_turquoise1": 159, - "deep_pink3": 162, - "magenta2": 200, - "hot_pink2": 169, - "orchid": 170, - "medium_orchid1": 207, - "orange3": 172, - "light_pink3": 174, - "pink3": 175, - "plum3": 176, - "violet": 177, - "light_goldenrod3": 179, - "tan": 180, - "misty_rose3": 181, - "thistle3": 182, - "plum2": 183, - "khaki3": 185, - "light_goldenrod2": 222, - "light_yellow3": 187, - "grey84": 188, - "gray84": 188, - "light_steel_blue1": 189, - "yellow2": 190, - "dark_olive_green1": 192, - "honeydew2": 194, - "light_cyan1": 195, - "red1": 196, - "deep_pink2": 197, - "deep_pink1": 199, - "magenta1": 201, - "orange_red1": 202, - "indian_red1": 204, - "hot_pink": 206, - "dark_orange": 208, - "salmon1": 209, - "light_coral": 210, - "pale_violet_red1": 211, - "orchid2": 212, - "orchid1": 213, - "orange1": 214, - "sandy_brown": 215, - "light_salmon1": 216, - "light_pink1": 217, - "pink1": 218, - "plum1": 219, - "gold1": 220, - "navajo_white1": 223, - "misty_rose1": 224, - "thistle1": 225, - "yellow1": 226, - "light_goldenrod1": 227, - "khaki1": 228, - "wheat1": 229, - "cornsilk1": 230, - "grey100": 231, - "gray100": 231, - "grey3": 232, - "gray3": 232, - "grey7": 233, - "gray7": 233, - "grey11": 234, - "gray11": 234, - "grey15": 235, - "gray15": 235, - "grey19": 236, - "gray19": 236, - "grey23": 237, - "gray23": 237, - "grey27": 238, - "gray27": 238, - "grey30": 239, - "gray30": 239, - "grey35": 240, - "gray35": 240, - "grey39": 241, - "gray39": 241, - "grey42": 242, - "gray42": 242, - "grey46": 243, - "gray46": 243, - "grey50": 244, - "gray50": 244, - "grey54": 245, - "gray54": 245, - "grey58": 246, - "gray58": 246, - "grey62": 247, - "gray62": 247, - "grey66": 248, - "gray66": 248, - "grey70": 249, - "gray70": 249, - "grey74": 250, - "gray74": 250, - "grey78": 251, - "gray78": 251, - "grey82": 252, - "gray82": 252, - "grey85": 253, - "gray85": 253, - "grey89": 254, - "gray89": 254, - "grey93": 255, - "gray93": 255, -} - - -class ColorParseError(Exception): - """The color could not be parsed.""" - - -RE_COLOR = re.compile( - r"""^ -\#([0-9a-f]{6})$| -color\(([0-9]{1,3})\)$| -rgb\(([\d\s,]+)\)$ -""", - re.VERBOSE, -) - - -@rich_repr -class Color(NamedTuple): - """Terminal color definition.""" - - name: str - """The name of the color (typically the input to Color.parse).""" - type: ColorType - """The type of the color.""" - number: Optional[int] = None - """The color number, if a standard color, or None.""" - triplet: Optional[ColorTriplet] = None - """A triplet of color components, if an RGB color.""" - - def __rich__(self) -> "Text": - """Displays the actual color if Rich printed.""" - from .style import Style - from .text import Text - - return Text.assemble( - f"<color {self.name!r} ({self.type.name.lower()})", - ("⬤", Style(color=self)), - " >", - ) - - def __rich_repr__(self) -> Result: - yield self.name - yield self.type - yield "number", self.number, None - yield "triplet", self.triplet, None - - @property - def system(self) -> ColorSystem: - """Get the native color system for this color.""" - if self.type == ColorType.DEFAULT: - return ColorSystem.STANDARD - return ColorSystem(int(self.type)) - - @property - def is_system_defined(self) -> bool: - """Check if the color is ultimately defined by the system.""" - return self.system not in (ColorSystem.EIGHT_BIT, ColorSystem.TRUECOLOR) - - @property - def is_default(self) -> bool: - """Check if the color is a default color.""" - return self.type == ColorType.DEFAULT - - def get_truecolor( - self, theme: Optional["TerminalTheme"] = None, foreground: bool = True - ) -> ColorTriplet: - """Get an equivalent color triplet for this color. - - Args: - theme (TerminalTheme, optional): Optional terminal theme, or None to use default. Defaults to None. - foreground (bool, optional): True for a foreground color, or False for background. Defaults to True. - - Returns: - ColorTriplet: A color triplet containing RGB components. - """ - - if theme is None: - theme = DEFAULT_TERMINAL_THEME - if self.type == ColorType.TRUECOLOR: - assert self.triplet is not None - return self.triplet - elif self.type == ColorType.EIGHT_BIT: - assert self.number is not None - return EIGHT_BIT_PALETTE[self.number] - elif self.type == ColorType.STANDARD: - assert self.number is not None - return theme.ansi_colors[self.number] - elif self.type == ColorType.WINDOWS: - assert self.number is not None - return WINDOWS_PALETTE[self.number] - else: # self.type == ColorType.DEFAULT: - assert self.number is None - return theme.foreground_color if foreground else theme.background_color - - @classmethod - def from_ansi(cls, number: int) -> "Color": - """Create a Color number from it's 8-bit ansi number. - - Args: - number (int): A number between 0-255 inclusive. - - Returns: - Color: A new Color instance. - """ - return cls( - name=f"color({number})", - type=(ColorType.STANDARD if number < 16 else ColorType.EIGHT_BIT), - number=number, - ) - - @classmethod - def from_triplet(cls, triplet: "ColorTriplet") -> "Color": - """Create a truecolor RGB color from a triplet of values. - - Args: - triplet (ColorTriplet): A color triplet containing red, green and blue components. - - Returns: - Color: A new color object. - """ - return cls(name=triplet.hex, type=ColorType.TRUECOLOR, triplet=triplet) - - @classmethod - def from_rgb(cls, red: float, green: float, blue: float) -> "Color": - """Create a truecolor from three color components in the range(0->255). - - Args: - red (float): Red component in range 0-255. - green (float): Green component in range 0-255. - blue (float): Blue component in range 0-255. - - Returns: - Color: A new color object. - """ - return cls.from_triplet(ColorTriplet(int(red), int(green), int(blue))) - - @classmethod - def default(cls) -> "Color": - """Get a Color instance representing the default color. - - Returns: - Color: Default color. - """ - return cls(name="default", type=ColorType.DEFAULT) - - @classmethod - @lru_cache(maxsize=1024) - def parse(cls, color: str) -> "Color": - """Parse a color definition.""" - original_color = color - color = color.lower().strip() - - if color == "default": - return cls(color, type=ColorType.DEFAULT) - - color_number = ANSI_COLOR_NAMES.get(color) - if color_number is not None: - return cls( - color, - type=(ColorType.STANDARD if color_number < 16 else ColorType.EIGHT_BIT), - number=color_number, - ) - - color_match = RE_COLOR.match(color) - if color_match is None: - raise ColorParseError(f"{original_color!r} is not a valid color") - - color_24, color_8, color_rgb = color_match.groups() - if color_24: - triplet = ColorTriplet( - int(color_24[0:2], 16), int(color_24[2:4], 16), int(color_24[4:6], 16) - ) - return cls(color, ColorType.TRUECOLOR, triplet=triplet) - - elif color_8: - number = int(color_8) - if number > 255: - raise ColorParseError(f"color number must be <= 255 in {color!r}") - return cls( - color, - type=(ColorType.STANDARD if number < 16 else ColorType.EIGHT_BIT), - number=number, - ) - - else: # color_rgb: - components = color_rgb.split(",") - if len(components) != 3: - raise ColorParseError( - f"expected three components in {original_color!r}" - ) - red, green, blue = components - triplet = ColorTriplet(int(red), int(green), int(blue)) - if not all(component <= 255 for component in triplet): - raise ColorParseError( - f"color components must be <= 255 in {original_color!r}" - ) - return cls(color, ColorType.TRUECOLOR, triplet=triplet) - - @lru_cache(maxsize=1024) - def get_ansi_codes(self, foreground: bool = True) -> Tuple[str, ...]: - """Get the ANSI escape codes for this color.""" - _type = self.type - if _type == ColorType.DEFAULT: - return ("39" if foreground else "49",) - - elif _type == ColorType.WINDOWS: - number = self.number - assert number is not None - fore, back = (30, 40) if number < 8 else (82, 92) - return (str(fore + number if foreground else back + number),) - - elif _type == ColorType.STANDARD: - number = self.number - assert number is not None - fore, back = (30, 40) if number < 8 else (82, 92) - return (str(fore + number if foreground else back + number),) - - elif _type == ColorType.EIGHT_BIT: - assert self.number is not None - return ("38" if foreground else "48", "5", str(self.number)) - - else: # self.standard == ColorStandard.TRUECOLOR: - assert self.triplet is not None - red, green, blue = self.triplet - return ("38" if foreground else "48", "2", str(red), str(green), str(blue)) - - @lru_cache(maxsize=1024) - def downgrade(self, system: ColorSystem) -> "Color": - """Downgrade a color system to a system with fewer colors.""" - - if self.type in (ColorType.DEFAULT, system): - return self - # Convert to 8-bit color from truecolor color - if system == ColorSystem.EIGHT_BIT and self.system == ColorSystem.TRUECOLOR: - assert self.triplet is not None - _h, l, s = rgb_to_hls(*self.triplet.normalized) - # If saturation is under 15% assume it is grayscale - if s < 0.15: - gray = round(l * 25.0) - if gray == 0: - color_number = 16 - elif gray == 25: - color_number = 231 - else: - color_number = 231 + gray - return Color(self.name, ColorType.EIGHT_BIT, number=color_number) - - red, green, blue = self.triplet - six_red = red / 95 if red < 95 else 1 + (red - 95) / 40 - six_green = green / 95 if green < 95 else 1 + (green - 95) / 40 - six_blue = blue / 95 if blue < 95 else 1 + (blue - 95) / 40 - - color_number = ( - 16 + 36 * round(six_red) + 6 * round(six_green) + round(six_blue) - ) - return Color(self.name, ColorType.EIGHT_BIT, number=color_number) - - # Convert to standard from truecolor or 8-bit - elif system == ColorSystem.STANDARD: - if self.system == ColorSystem.TRUECOLOR: - assert self.triplet is not None - triplet = self.triplet - else: # self.system == ColorSystem.EIGHT_BIT - assert self.number is not None - triplet = ColorTriplet(*EIGHT_BIT_PALETTE[self.number]) - - color_number = STANDARD_PALETTE.match(triplet) - return Color(self.name, ColorType.STANDARD, number=color_number) - - elif system == ColorSystem.WINDOWS: - if self.system == ColorSystem.TRUECOLOR: - assert self.triplet is not None - triplet = self.triplet - else: # self.system == ColorSystem.EIGHT_BIT - assert self.number is not None - if self.number < 16: - return Color(self.name, ColorType.WINDOWS, number=self.number) - triplet = ColorTriplet(*EIGHT_BIT_PALETTE[self.number]) - - color_number = WINDOWS_PALETTE.match(triplet) - return Color(self.name, ColorType.WINDOWS, number=color_number) - - return self - - -def parse_rgb_hex(hex_color: str) -> ColorTriplet: - """Parse six hex characters in to RGB triplet.""" - assert len(hex_color) == 6, "must be 6 characters" - color = ColorTriplet( - int(hex_color[0:2], 16), int(hex_color[2:4], 16), int(hex_color[4:6], 16) - ) - return color - - -def blend_rgb( - color1: ColorTriplet, color2: ColorTriplet, cross_fade: float = 0.5 -) -> ColorTriplet: - """Blend one RGB color in to another.""" - r1, g1, b1 = color1 - r2, g2, b2 = color2 - new_color = ColorTriplet( - int(r1 + (r2 - r1) * cross_fade), - int(g1 + (g2 - g1) * cross_fade), - int(b1 + (b2 - b1) * cross_fade), - ) - return new_color - - -if __name__ == "__main__": # pragma: no cover - - from .console import Console - from .table import Table - from .text import Text - - console = Console() - - table = Table(show_footer=False, show_edge=True) - table.add_column("Color", width=10, overflow="ellipsis") - table.add_column("Number", justify="right", style="yellow") - table.add_column("Name", style="green") - table.add_column("Hex", style="blue") - table.add_column("RGB", style="magenta") - - colors = sorted((v, k) for k, v in ANSI_COLOR_NAMES.items()) - for color_number, name in colors: - if "grey" in name: - continue - color_cell = Text(" " * 10, style=f"on {name}") - if color_number < 16: - table.add_row(color_cell, f"{color_number}", Text(f'"{name}"')) - else: - color = EIGHT_BIT_PALETTE[color_number] # type: ignore[has-type] - table.add_row( - color_cell, str(color_number), Text(f'"{name}"'), color.hex, color.rgb - ) - - console.print(table) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/color_triplet.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/color_triplet.py deleted file mode 100644 index 02cab328..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/color_triplet.py +++ /dev/null @@ -1,38 +0,0 @@ -from typing import NamedTuple, Tuple - - -class ColorTriplet(NamedTuple): - """The red, green, and blue components of a color.""" - - red: int - """Red component in 0 to 255 range.""" - green: int - """Green component in 0 to 255 range.""" - blue: int - """Blue component in 0 to 255 range.""" - - @property - def hex(self) -> str: - """get the color triplet in CSS style.""" - red, green, blue = self - return f"#{red:02x}{green:02x}{blue:02x}" - - @property - def rgb(self) -> str: - """The color in RGB format. - - Returns: - str: An rgb color, e.g. ``"rgb(100,23,255)"``. - """ - red, green, blue = self - return f"rgb({red},{green},{blue})" - - @property - def normalized(self) -> Tuple[float, float, float]: - """Convert components into floats between 0 and 1. - - Returns: - Tuple[float, float, float]: A tuple of three normalized colour components. - """ - red, green, blue = self - return red / 255.0, green / 255.0, blue / 255.0 diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/columns.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/columns.py deleted file mode 100644 index 669a3a70..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/columns.py +++ /dev/null @@ -1,187 +0,0 @@ -from collections import defaultdict -from itertools import chain -from operator import itemgetter -from typing import Dict, Iterable, List, Optional, Tuple - -from .align import Align, AlignMethod -from .console import Console, ConsoleOptions, RenderableType, RenderResult -from .constrain import Constrain -from .measure import Measurement -from .padding import Padding, PaddingDimensions -from .table import Table -from .text import TextType -from .jupyter import JupyterMixin - - -class Columns(JupyterMixin): - """Display renderables in neat columns. - - Args: - renderables (Iterable[RenderableType]): Any number of Rich renderables (including str). - width (int, optional): The desired width of the columns, or None to auto detect. Defaults to None. - padding (PaddingDimensions, optional): Optional padding around cells. Defaults to (0, 1). - expand (bool, optional): Expand columns to full width. Defaults to False. - equal (bool, optional): Arrange in to equal sized columns. Defaults to False. - column_first (bool, optional): Align items from top to bottom (rather than left to right). Defaults to False. - right_to_left (bool, optional): Start column from right hand side. Defaults to False. - align (str, optional): Align value ("left", "right", or "center") or None for default. Defaults to None. - title (TextType, optional): Optional title for Columns. - """ - - def __init__( - self, - renderables: Optional[Iterable[RenderableType]] = None, - padding: PaddingDimensions = (0, 1), - *, - width: Optional[int] = None, - expand: bool = False, - equal: bool = False, - column_first: bool = False, - right_to_left: bool = False, - align: Optional[AlignMethod] = None, - title: Optional[TextType] = None, - ) -> None: - self.renderables = list(renderables or []) - self.width = width - self.padding = padding - self.expand = expand - self.equal = equal - self.column_first = column_first - self.right_to_left = right_to_left - self.align: Optional[AlignMethod] = align - self.title = title - - def add_renderable(self, renderable: RenderableType) -> None: - """Add a renderable to the columns. - - Args: - renderable (RenderableType): Any renderable object. - """ - self.renderables.append(renderable) - - def __rich_console__( - self, console: Console, options: ConsoleOptions - ) -> RenderResult: - render_str = console.render_str - renderables = [ - render_str(renderable) if isinstance(renderable, str) else renderable - for renderable in self.renderables - ] - if not renderables: - return - _top, right, _bottom, left = Padding.unpack(self.padding) - width_padding = max(left, right) - max_width = options.max_width - widths: Dict[int, int] = defaultdict(int) - column_count = len(renderables) - - get_measurement = Measurement.get - renderable_widths = [ - get_measurement(console, options, renderable).maximum - for renderable in renderables - ] - if self.equal: - renderable_widths = [max(renderable_widths)] * len(renderable_widths) - - def iter_renderables( - column_count: int, - ) -> Iterable[Tuple[int, Optional[RenderableType]]]: - item_count = len(renderables) - if self.column_first: - width_renderables = list(zip(renderable_widths, renderables)) - - column_lengths: List[int] = [item_count // column_count] * column_count - for col_no in range(item_count % column_count): - column_lengths[col_no] += 1 - - row_count = (item_count + column_count - 1) // column_count - cells = [[-1] * column_count for _ in range(row_count)] - row = col = 0 - for index in range(item_count): - cells[row][col] = index - column_lengths[col] -= 1 - if column_lengths[col]: - row += 1 - else: - col += 1 - row = 0 - for index in chain.from_iterable(cells): - if index == -1: - break - yield width_renderables[index] - else: - yield from zip(renderable_widths, renderables) - # Pad odd elements with spaces - if item_count % column_count: - for _ in range(column_count - (item_count % column_count)): - yield 0, None - - table = Table.grid(padding=self.padding, collapse_padding=True, pad_edge=False) - table.expand = self.expand - table.title = self.title - - if self.width is not None: - column_count = (max_width) // (self.width + width_padding) - for _ in range(column_count): - table.add_column(width=self.width) - else: - while column_count > 1: - widths.clear() - column_no = 0 - for renderable_width, _ in iter_renderables(column_count): - widths[column_no] = max(widths[column_no], renderable_width) - total_width = sum(widths.values()) + width_padding * ( - len(widths) - 1 - ) - if total_width > max_width: - column_count = len(widths) - 1 - break - else: - column_no = (column_no + 1) % column_count - else: - break - - get_renderable = itemgetter(1) - _renderables = [ - get_renderable(_renderable) - for _renderable in iter_renderables(column_count) - ] - if self.equal: - _renderables = [ - None - if renderable is None - else Constrain(renderable, renderable_widths[0]) - for renderable in _renderables - ] - if self.align: - align = self.align - _Align = Align - _renderables = [ - None if renderable is None else _Align(renderable, align) - for renderable in _renderables - ] - - right_to_left = self.right_to_left - add_row = table.add_row - for start in range(0, len(_renderables), column_count): - row = _renderables[start : start + column_count] - if right_to_left: - row = row[::-1] - add_row(*row) - yield table - - -if __name__ == "__main__": # pragma: no cover - import os - - console = Console() - - files = [f"{i} {s}" for i, s in enumerate(sorted(os.listdir()))] - columns = Columns(files, padding=(0, 1), expand=False, equal=False) - console.print(columns) - console.rule() - columns.column_first = True - console.print(columns) - columns.right_to_left = True - console.rule() - console.print(columns) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/console.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/console.py deleted file mode 100644 index cd6f5e57..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/console.py +++ /dev/null @@ -1,2633 +0,0 @@ -import inspect -import os -import platform -import sys -import threading -import zlib -from abc import ABC, abstractmethod -from dataclasses import dataclass, field -from datetime import datetime -from functools import wraps -from getpass import getpass -from html import escape -from inspect import isclass -from itertools import islice -from math import ceil -from time import monotonic -from types import FrameType, ModuleType, TracebackType -from typing import ( - IO, - TYPE_CHECKING, - Any, - Callable, - Dict, - Iterable, - List, - Mapping, - NamedTuple, - Optional, - TextIO, - Tuple, - Type, - Union, - cast, -) - -from rich._null_file import NULL_FILE - -if sys.version_info >= (3, 8): - from typing import Literal, Protocol, runtime_checkable -else: - from typing_extensions import ( - Literal, - Protocol, - runtime_checkable, - ) # pragma: no cover - -from . import errors, themes -from ._emoji_replace import _emoji_replace -from ._export_format import CONSOLE_HTML_FORMAT, CONSOLE_SVG_FORMAT -from ._fileno import get_fileno -from ._log_render import FormatTimeCallable, LogRender -from .align import Align, AlignMethod -from .color import ColorSystem, blend_rgb -from .control import Control -from .emoji import EmojiVariant -from .highlighter import NullHighlighter, ReprHighlighter -from .markup import render as render_markup -from .measure import Measurement, measure_renderables -from .pager import Pager, SystemPager -from .pretty import Pretty, is_expandable -from .protocol import rich_cast -from .region import Region -from .scope import render_scope -from .screen import Screen -from .segment import Segment -from .style import Style, StyleType -from .styled import Styled -from .terminal_theme import DEFAULT_TERMINAL_THEME, SVG_EXPORT_THEME, TerminalTheme -from .text import Text, TextType -from .theme import Theme, ThemeStack - -if TYPE_CHECKING: - from ._windows import WindowsConsoleFeatures - from .live import Live - from .status import Status - -JUPYTER_DEFAULT_COLUMNS = 115 -JUPYTER_DEFAULT_LINES = 100 -WINDOWS = platform.system() == "Windows" - -HighlighterType = Callable[[Union[str, "Text"]], "Text"] -JustifyMethod = Literal["default", "left", "center", "right", "full"] -OverflowMethod = Literal["fold", "crop", "ellipsis", "ignore"] - - -class NoChange: - pass - - -NO_CHANGE = NoChange() - -try: - _STDIN_FILENO = sys.__stdin__.fileno() -except Exception: - _STDIN_FILENO = 0 -try: - _STDOUT_FILENO = sys.__stdout__.fileno() -except Exception: - _STDOUT_FILENO = 1 -try: - _STDERR_FILENO = sys.__stderr__.fileno() -except Exception: - _STDERR_FILENO = 2 - -_STD_STREAMS = (_STDIN_FILENO, _STDOUT_FILENO, _STDERR_FILENO) -_STD_STREAMS_OUTPUT = (_STDOUT_FILENO, _STDERR_FILENO) - - -_TERM_COLORS = { - "kitty": ColorSystem.EIGHT_BIT, - "256color": ColorSystem.EIGHT_BIT, - "16color": ColorSystem.STANDARD, -} - - -class ConsoleDimensions(NamedTuple): - """Size of the terminal.""" - - width: int - """The width of the console in 'cells'.""" - height: int - """The height of the console in lines.""" - - -@dataclass -class ConsoleOptions: - """Options for __rich_console__ method.""" - - size: ConsoleDimensions - """Size of console.""" - legacy_windows: bool - """legacy_windows: flag for legacy windows.""" - min_width: int - """Minimum width of renderable.""" - max_width: int - """Maximum width of renderable.""" - is_terminal: bool - """True if the target is a terminal, otherwise False.""" - encoding: str - """Encoding of terminal.""" - max_height: int - """Height of container (starts as terminal)""" - justify: Optional[JustifyMethod] = None - """Justify value override for renderable.""" - overflow: Optional[OverflowMethod] = None - """Overflow value override for renderable.""" - no_wrap: Optional[bool] = False - """Disable wrapping for text.""" - highlight: Optional[bool] = None - """Highlight override for render_str.""" - markup: Optional[bool] = None - """Enable markup when rendering strings.""" - height: Optional[int] = None - - @property - def ascii_only(self) -> bool: - """Check if renderables should use ascii only.""" - return not self.encoding.startswith("utf") - - def copy(self) -> "ConsoleOptions": - """Return a copy of the options. - - Returns: - ConsoleOptions: a copy of self. - """ - options: ConsoleOptions = ConsoleOptions.__new__(ConsoleOptions) - options.__dict__ = self.__dict__.copy() - return options - - def update( - self, - *, - width: Union[int, NoChange] = NO_CHANGE, - min_width: Union[int, NoChange] = NO_CHANGE, - max_width: Union[int, NoChange] = NO_CHANGE, - justify: Union[Optional[JustifyMethod], NoChange] = NO_CHANGE, - overflow: Union[Optional[OverflowMethod], NoChange] = NO_CHANGE, - no_wrap: Union[Optional[bool], NoChange] = NO_CHANGE, - highlight: Union[Optional[bool], NoChange] = NO_CHANGE, - markup: Union[Optional[bool], NoChange] = NO_CHANGE, - height: Union[Optional[int], NoChange] = NO_CHANGE, - ) -> "ConsoleOptions": - """Update values, return a copy.""" - options = self.copy() - if not isinstance(width, NoChange): - options.min_width = options.max_width = max(0, width) - if not isinstance(min_width, NoChange): - options.min_width = min_width - if not isinstance(max_width, NoChange): - options.max_width = max_width - if not isinstance(justify, NoChange): - options.justify = justify - if not isinstance(overflow, NoChange): - options.overflow = overflow - if not isinstance(no_wrap, NoChange): - options.no_wrap = no_wrap - if not isinstance(highlight, NoChange): - options.highlight = highlight - if not isinstance(markup, NoChange): - options.markup = markup - if not isinstance(height, NoChange): - if height is not None: - options.max_height = height - options.height = None if height is None else max(0, height) - return options - - def update_width(self, width: int) -> "ConsoleOptions": - """Update just the width, return a copy. - - Args: - width (int): New width (sets both min_width and max_width) - - Returns: - ~ConsoleOptions: New console options instance. - """ - options = self.copy() - options.min_width = options.max_width = max(0, width) - return options - - def update_height(self, height: int) -> "ConsoleOptions": - """Update the height, and return a copy. - - Args: - height (int): New height - - Returns: - ~ConsoleOptions: New Console options instance. - """ - options = self.copy() - options.max_height = options.height = height - return options - - def reset_height(self) -> "ConsoleOptions": - """Return a copy of the options with height set to ``None``. - - Returns: - ~ConsoleOptions: New console options instance. - """ - options = self.copy() - options.height = None - return options - - def update_dimensions(self, width: int, height: int) -> "ConsoleOptions": - """Update the width and height, and return a copy. - - Args: - width (int): New width (sets both min_width and max_width). - height (int): New height. - - Returns: - ~ConsoleOptions: New console options instance. - """ - options = self.copy() - options.min_width = options.max_width = max(0, width) - options.height = options.max_height = height - return options - - -@runtime_checkable -class RichCast(Protocol): - """An object that may be 'cast' to a console renderable.""" - - def __rich__( - self, - ) -> Union["ConsoleRenderable", "RichCast", str]: # pragma: no cover - ... - - -@runtime_checkable -class ConsoleRenderable(Protocol): - """An object that supports the console protocol.""" - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": # pragma: no cover - ... - - -# A type that may be rendered by Console. -RenderableType = Union[ConsoleRenderable, RichCast, str] - -# The result of calling a __rich_console__ method. -RenderResult = Iterable[Union[RenderableType, Segment]] - -_null_highlighter = NullHighlighter() - - -class CaptureError(Exception): - """An error in the Capture context manager.""" - - -class NewLine: - """A renderable to generate new line(s)""" - - def __init__(self, count: int = 1) -> None: - self.count = count - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> Iterable[Segment]: - yield Segment("\n" * self.count) - - -class ScreenUpdate: - """Render a list of lines at a given offset.""" - - def __init__(self, lines: List[List[Segment]], x: int, y: int) -> None: - self._lines = lines - self.x = x - self.y = y - - def __rich_console__( - self, console: "Console", options: ConsoleOptions - ) -> RenderResult: - x = self.x - move_to = Control.move_to - for offset, line in enumerate(self._lines, self.y): - yield move_to(x, offset) - yield from line - - -class Capture: - """Context manager to capture the result of printing to the console. - See :meth:`~rich.console.Console.capture` for how to use. - - Args: - console (Console): A console instance to capture output. - """ - - def __init__(self, console: "Console") -> None: - self._console = console - self._result: Optional[str] = None - - def __enter__(self) -> "Capture": - self._console.begin_capture() - return self - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - self._result = self._console.end_capture() - - def get(self) -> str: - """Get the result of the capture.""" - if self._result is None: - raise CaptureError( - "Capture result is not available until context manager exits." - ) - return self._result - - -class ThemeContext: - """A context manager to use a temporary theme. See :meth:`~rich.console.Console.use_theme` for usage.""" - - def __init__(self, console: "Console", theme: Theme, inherit: bool = True) -> None: - self.console = console - self.theme = theme - self.inherit = inherit - - def __enter__(self) -> "ThemeContext": - self.console.push_theme(self.theme) - return self - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - self.console.pop_theme() - - -class PagerContext: - """A context manager that 'pages' content. See :meth:`~rich.console.Console.pager` for usage.""" - - def __init__( - self, - console: "Console", - pager: Optional[Pager] = None, - styles: bool = False, - links: bool = False, - ) -> None: - self._console = console - self.pager = SystemPager() if pager is None else pager - self.styles = styles - self.links = links - - def __enter__(self) -> "PagerContext": - self._console._enter_buffer() - return self - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - if exc_type is None: - with self._console._lock: - buffer: List[Segment] = self._console._buffer[:] - del self._console._buffer[:] - segments: Iterable[Segment] = buffer - if not self.styles: - segments = Segment.strip_styles(segments) - elif not self.links: - segments = Segment.strip_links(segments) - content = self._console._render_buffer(segments) - self.pager.show(content) - self._console._exit_buffer() - - -class ScreenContext: - """A context manager that enables an alternative screen. See :meth:`~rich.console.Console.screen` for usage.""" - - def __init__( - self, console: "Console", hide_cursor: bool, style: StyleType = "" - ) -> None: - self.console = console - self.hide_cursor = hide_cursor - self.screen = Screen(style=style) - self._changed = False - - def update( - self, *renderables: RenderableType, style: Optional[StyleType] = None - ) -> None: - """Update the screen. - - Args: - renderable (RenderableType, optional): Optional renderable to replace current renderable, - or None for no change. Defaults to None. - style: (Style, optional): Replacement style, or None for no change. Defaults to None. - """ - if renderables: - self.screen.renderable = ( - Group(*renderables) if len(renderables) > 1 else renderables[0] - ) - if style is not None: - self.screen.style = style - self.console.print(self.screen, end="") - - def __enter__(self) -> "ScreenContext": - self._changed = self.console.set_alt_screen(True) - if self._changed and self.hide_cursor: - self.console.show_cursor(False) - return self - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - if self._changed: - self.console.set_alt_screen(False) - if self.hide_cursor: - self.console.show_cursor(True) - - -class Group: - """Takes a group of renderables and returns a renderable object that renders the group. - - Args: - renderables (Iterable[RenderableType]): An iterable of renderable objects. - fit (bool, optional): Fit dimension of group to contents, or fill available space. Defaults to True. - """ - - def __init__(self, *renderables: "RenderableType", fit: bool = True) -> None: - self._renderables = renderables - self.fit = fit - self._render: Optional[List[RenderableType]] = None - - @property - def renderables(self) -> List["RenderableType"]: - if self._render is None: - self._render = list(self._renderables) - return self._render - - def __rich_measure__( - self, console: "Console", options: "ConsoleOptions" - ) -> "Measurement": - if self.fit: - return measure_renderables(console, options, self.renderables) - else: - return Measurement(options.max_width, options.max_width) - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> RenderResult: - yield from self.renderables - - -def group(fit: bool = True) -> Callable[..., Callable[..., Group]]: - """A decorator that turns an iterable of renderables in to a group. - - Args: - fit (bool, optional): Fit dimension of group to contents, or fill available space. Defaults to True. - """ - - def decorator( - method: Callable[..., Iterable[RenderableType]] - ) -> Callable[..., Group]: - """Convert a method that returns an iterable of renderables in to a Group.""" - - @wraps(method) - def _replace(*args: Any, **kwargs: Any) -> Group: - renderables = method(*args, **kwargs) - return Group(*renderables, fit=fit) - - return _replace - - return decorator - - -def _is_jupyter() -> bool: # pragma: no cover - """Check if we're running in a Jupyter notebook.""" - try: - get_ipython # type: ignore[name-defined] - except NameError: - return False - ipython = get_ipython() # type: ignore[name-defined] - shell = ipython.__class__.__name__ - if ( - "google.colab" in str(ipython.__class__) - or os.getenv("DATABRICKS_RUNTIME_VERSION") - or shell == "ZMQInteractiveShell" - ): - return True # Jupyter notebook or qtconsole - elif shell == "TerminalInteractiveShell": - return False # Terminal running IPython - else: - return False # Other type (?) - - -COLOR_SYSTEMS = { - "standard": ColorSystem.STANDARD, - "256": ColorSystem.EIGHT_BIT, - "truecolor": ColorSystem.TRUECOLOR, - "windows": ColorSystem.WINDOWS, -} - -_COLOR_SYSTEMS_NAMES = {system: name for name, system in COLOR_SYSTEMS.items()} - - -@dataclass -class ConsoleThreadLocals(threading.local): - """Thread local values for Console context.""" - - theme_stack: ThemeStack - buffer: List[Segment] = field(default_factory=list) - buffer_index: int = 0 - - -class RenderHook(ABC): - """Provides hooks in to the render process.""" - - @abstractmethod - def process_renderables( - self, renderables: List[ConsoleRenderable] - ) -> List[ConsoleRenderable]: - """Called with a list of objects to render. - - This method can return a new list of renderables, or modify and return the same list. - - Args: - renderables (List[ConsoleRenderable]): A number of renderable objects. - - Returns: - List[ConsoleRenderable]: A replacement list of renderables. - """ - - -_windows_console_features: Optional["WindowsConsoleFeatures"] = None - - -def get_windows_console_features() -> "WindowsConsoleFeatures": # pragma: no cover - global _windows_console_features - if _windows_console_features is not None: - return _windows_console_features - from ._windows import get_windows_console_features - - _windows_console_features = get_windows_console_features() - return _windows_console_features - - -def detect_legacy_windows() -> bool: - """Detect legacy Windows.""" - return WINDOWS and not get_windows_console_features().vt - - -class Console: - """A high level console interface. - - Args: - color_system (str, optional): The color system supported by your terminal, - either ``"standard"``, ``"256"`` or ``"truecolor"``. Leave as ``"auto"`` to autodetect. - force_terminal (Optional[bool], optional): Enable/disable terminal control codes, or None to auto-detect terminal. Defaults to None. - force_jupyter (Optional[bool], optional): Enable/disable Jupyter rendering, or None to auto-detect Jupyter. Defaults to None. - force_interactive (Optional[bool], optional): Enable/disable interactive mode, or None to auto detect. Defaults to None. - soft_wrap (Optional[bool], optional): Set soft wrap default on print method. Defaults to False. - theme (Theme, optional): An optional style theme object, or ``None`` for default theme. - stderr (bool, optional): Use stderr rather than stdout if ``file`` is not specified. Defaults to False. - file (IO, optional): A file object where the console should write to. Defaults to stdout. - quiet (bool, Optional): Boolean to suppress all output. Defaults to False. - width (int, optional): The width of the terminal. Leave as default to auto-detect width. - height (int, optional): The height of the terminal. Leave as default to auto-detect height. - style (StyleType, optional): Style to apply to all output, or None for no style. Defaults to None. - no_color (Optional[bool], optional): Enabled no color mode, or None to auto detect. Defaults to None. - tab_size (int, optional): Number of spaces used to replace a tab character. Defaults to 8. - record (bool, optional): Boolean to enable recording of terminal output, - required to call :meth:`export_html`, :meth:`export_svg`, and :meth:`export_text`. Defaults to False. - markup (bool, optional): Boolean to enable :ref:`console_markup`. Defaults to True. - emoji (bool, optional): Enable emoji code. Defaults to True. - emoji_variant (str, optional): Optional emoji variant, either "text" or "emoji". Defaults to None. - highlight (bool, optional): Enable automatic highlighting. Defaults to True. - log_time (bool, optional): Boolean to enable logging of time by :meth:`log` methods. Defaults to True. - log_path (bool, optional): Boolean to enable the logging of the caller by :meth:`log`. Defaults to True. - log_time_format (Union[str, TimeFormatterCallable], optional): If ``log_time`` is enabled, either string for strftime or callable that formats the time. Defaults to "[%X] ". - highlighter (HighlighterType, optional): Default highlighter. - legacy_windows (bool, optional): Enable legacy Windows mode, or ``None`` to auto detect. Defaults to ``None``. - safe_box (bool, optional): Restrict box options that don't render on legacy Windows. - get_datetime (Callable[[], datetime], optional): Callable that gets the current time as a datetime.datetime object (used by Console.log), - or None for datetime.now. - get_time (Callable[[], time], optional): Callable that gets the current time in seconds, default uses time.monotonic. - """ - - _environ: Mapping[str, str] = os.environ - - def __init__( - self, - *, - color_system: Optional[ - Literal["auto", "standard", "256", "truecolor", "windows"] - ] = "auto", - force_terminal: Optional[bool] = None, - force_jupyter: Optional[bool] = None, - force_interactive: Optional[bool] = None, - soft_wrap: bool = False, - theme: Optional[Theme] = None, - stderr: bool = False, - file: Optional[IO[str]] = None, - quiet: bool = False, - width: Optional[int] = None, - height: Optional[int] = None, - style: Optional[StyleType] = None, - no_color: Optional[bool] = None, - tab_size: int = 8, - record: bool = False, - markup: bool = True, - emoji: bool = True, - emoji_variant: Optional[EmojiVariant] = None, - highlight: bool = True, - log_time: bool = True, - log_path: bool = True, - log_time_format: Union[str, FormatTimeCallable] = "[%X]", - highlighter: Optional["HighlighterType"] = ReprHighlighter(), - legacy_windows: Optional[bool] = None, - safe_box: bool = True, - get_datetime: Optional[Callable[[], datetime]] = None, - get_time: Optional[Callable[[], float]] = None, - _environ: Optional[Mapping[str, str]] = None, - ): - # Copy of os.environ allows us to replace it for testing - if _environ is not None: - self._environ = _environ - - self.is_jupyter = _is_jupyter() if force_jupyter is None else force_jupyter - if self.is_jupyter: - if width is None: - jupyter_columns = self._environ.get("JUPYTER_COLUMNS") - if jupyter_columns is not None and jupyter_columns.isdigit(): - width = int(jupyter_columns) - else: - width = JUPYTER_DEFAULT_COLUMNS - if height is None: - jupyter_lines = self._environ.get("JUPYTER_LINES") - if jupyter_lines is not None and jupyter_lines.isdigit(): - height = int(jupyter_lines) - else: - height = JUPYTER_DEFAULT_LINES - - self.tab_size = tab_size - self.record = record - self._markup = markup - self._emoji = emoji - self._emoji_variant: Optional[EmojiVariant] = emoji_variant - self._highlight = highlight - self.legacy_windows: bool = ( - (detect_legacy_windows() and not self.is_jupyter) - if legacy_windows is None - else legacy_windows - ) - - if width is None: - columns = self._environ.get("COLUMNS") - if columns is not None and columns.isdigit(): - width = int(columns) - self.legacy_windows - if height is None: - lines = self._environ.get("LINES") - if lines is not None and lines.isdigit(): - height = int(lines) - - self.soft_wrap = soft_wrap - self._width = width - self._height = height - - self._color_system: Optional[ColorSystem] - - self._force_terminal = None - if force_terminal is not None: - self._force_terminal = force_terminal - - self._file = file - self.quiet = quiet - self.stderr = stderr - - if color_system is None: - self._color_system = None - elif color_system == "auto": - self._color_system = self._detect_color_system() - else: - self._color_system = COLOR_SYSTEMS[color_system] - - self._lock = threading.RLock() - self._log_render = LogRender( - show_time=log_time, - show_path=log_path, - time_format=log_time_format, - ) - self.highlighter: HighlighterType = highlighter or _null_highlighter - self.safe_box = safe_box - self.get_datetime = get_datetime or datetime.now - self.get_time = get_time or monotonic - self.style = style - self.no_color = ( - no_color if no_color is not None else "NO_COLOR" in self._environ - ) - self.is_interactive = ( - (self.is_terminal and not self.is_dumb_terminal) - if force_interactive is None - else force_interactive - ) - - self._record_buffer_lock = threading.RLock() - self._thread_locals = ConsoleThreadLocals( - theme_stack=ThemeStack(themes.DEFAULT if theme is None else theme) - ) - self._record_buffer: List[Segment] = [] - self._render_hooks: List[RenderHook] = [] - self._live: Optional["Live"] = None - self._is_alt_screen = False - - def __repr__(self) -> str: - return f"<console width={self.width} {self._color_system!s}>" - - @property - def file(self) -> IO[str]: - """Get the file object to write to.""" - file = self._file or (sys.stderr if self.stderr else sys.stdout) - file = getattr(file, "rich_proxied_file", file) - if file is None: - file = NULL_FILE - return file - - @file.setter - def file(self, new_file: IO[str]) -> None: - """Set a new file object.""" - self._file = new_file - - @property - def _buffer(self) -> List[Segment]: - """Get a thread local buffer.""" - return self._thread_locals.buffer - - @property - def _buffer_index(self) -> int: - """Get a thread local buffer.""" - return self._thread_locals.buffer_index - - @_buffer_index.setter - def _buffer_index(self, value: int) -> None: - self._thread_locals.buffer_index = value - - @property - def _theme_stack(self) -> ThemeStack: - """Get the thread local theme stack.""" - return self._thread_locals.theme_stack - - def _detect_color_system(self) -> Optional[ColorSystem]: - """Detect color system from env vars.""" - if self.is_jupyter: - return ColorSystem.TRUECOLOR - if not self.is_terminal or self.is_dumb_terminal: - return None - if WINDOWS: # pragma: no cover - if self.legacy_windows: # pragma: no cover - return ColorSystem.WINDOWS - windows_console_features = get_windows_console_features() - return ( - ColorSystem.TRUECOLOR - if windows_console_features.truecolor - else ColorSystem.EIGHT_BIT - ) - else: - color_term = self._environ.get("COLORTERM", "").strip().lower() - if color_term in ("truecolor", "24bit"): - return ColorSystem.TRUECOLOR - term = self._environ.get("TERM", "").strip().lower() - _term_name, _hyphen, colors = term.rpartition("-") - color_system = _TERM_COLORS.get(colors, ColorSystem.STANDARD) - return color_system - - def _enter_buffer(self) -> None: - """Enter in to a buffer context, and buffer all output.""" - self._buffer_index += 1 - - def _exit_buffer(self) -> None: - """Leave buffer context, and render content if required.""" - self._buffer_index -= 1 - self._check_buffer() - - def set_live(self, live: "Live") -> None: - """Set Live instance. Used by Live context manager. - - Args: - live (Live): Live instance using this Console. - - Raises: - errors.LiveError: If this Console has a Live context currently active. - """ - with self._lock: - if self._live is not None: - raise errors.LiveError("Only one live display may be active at once") - self._live = live - - def clear_live(self) -> None: - """Clear the Live instance.""" - with self._lock: - self._live = None - - def push_render_hook(self, hook: RenderHook) -> None: - """Add a new render hook to the stack. - - Args: - hook (RenderHook): Render hook instance. - """ - with self._lock: - self._render_hooks.append(hook) - - def pop_render_hook(self) -> None: - """Pop the last renderhook from the stack.""" - with self._lock: - self._render_hooks.pop() - - def __enter__(self) -> "Console": - """Own context manager to enter buffer context.""" - self._enter_buffer() - return self - - def __exit__(self, exc_type: Any, exc_value: Any, traceback: Any) -> None: - """Exit buffer context.""" - self._exit_buffer() - - def begin_capture(self) -> None: - """Begin capturing console output. Call :meth:`end_capture` to exit capture mode and return output.""" - self._enter_buffer() - - def end_capture(self) -> str: - """End capture mode and return captured string. - - Returns: - str: Console output. - """ - render_result = self._render_buffer(self._buffer) - del self._buffer[:] - self._exit_buffer() - return render_result - - def push_theme(self, theme: Theme, *, inherit: bool = True) -> None: - """Push a new theme on to the top of the stack, replacing the styles from the previous theme. - Generally speaking, you should call :meth:`~rich.console.Console.use_theme` to get a context manager, rather - than calling this method directly. - - Args: - theme (Theme): A theme instance. - inherit (bool, optional): Inherit existing styles. Defaults to True. - """ - self._theme_stack.push_theme(theme, inherit=inherit) - - def pop_theme(self) -> None: - """Remove theme from top of stack, restoring previous theme.""" - self._theme_stack.pop_theme() - - def use_theme(self, theme: Theme, *, inherit: bool = True) -> ThemeContext: - """Use a different theme for the duration of the context manager. - - Args: - theme (Theme): Theme instance to user. - inherit (bool, optional): Inherit existing console styles. Defaults to True. - - Returns: - ThemeContext: [description] - """ - return ThemeContext(self, theme, inherit) - - @property - def color_system(self) -> Optional[str]: - """Get color system string. - - Returns: - Optional[str]: "standard", "256" or "truecolor". - """ - - if self._color_system is not None: - return _COLOR_SYSTEMS_NAMES[self._color_system] - else: - return None - - @property - def encoding(self) -> str: - """Get the encoding of the console file, e.g. ``"utf-8"``. - - Returns: - str: A standard encoding string. - """ - return (getattr(self.file, "encoding", "utf-8") or "utf-8").lower() - - @property - def is_terminal(self) -> bool: - """Check if the console is writing to a terminal. - - Returns: - bool: True if the console writing to a device capable of - understanding terminal codes, otherwise False. - """ - if self._force_terminal is not None: - return self._force_terminal - - if hasattr(sys.stdin, "__module__") and sys.stdin.__module__.startswith( - "idlelib" - ): - # Return False for Idle which claims to be a tty but can't handle ansi codes - return False - - if self.is_jupyter: - # return False for Jupyter, which may have FORCE_COLOR set - return False - - # If FORCE_COLOR env var has any value at all, we assume a terminal. - force_color = self._environ.get("FORCE_COLOR") - if force_color is not None: - self._force_terminal = True - return True - - isatty: Optional[Callable[[], bool]] = getattr(self.file, "isatty", None) - try: - return False if isatty is None else isatty() - except ValueError: - # in some situation (at the end of a pytest run for example) isatty() can raise - # ValueError: I/O operation on closed file - # return False because we aren't in a terminal anymore - return False - - @property - def is_dumb_terminal(self) -> bool: - """Detect dumb terminal. - - Returns: - bool: True if writing to a dumb terminal, otherwise False. - - """ - _term = self._environ.get("TERM", "") - is_dumb = _term.lower() in ("dumb", "unknown") - return self.is_terminal and is_dumb - - @property - def options(self) -> ConsoleOptions: - """Get default console options.""" - return ConsoleOptions( - max_height=self.size.height, - size=self.size, - legacy_windows=self.legacy_windows, - min_width=1, - max_width=self.width, - encoding=self.encoding, - is_terminal=self.is_terminal, - ) - - @property - def size(self) -> ConsoleDimensions: - """Get the size of the console. - - Returns: - ConsoleDimensions: A named tuple containing the dimensions. - """ - - if self._width is not None and self._height is not None: - return ConsoleDimensions(self._width - self.legacy_windows, self._height) - - if self.is_dumb_terminal: - return ConsoleDimensions(80, 25) - - width: Optional[int] = None - height: Optional[int] = None - - if WINDOWS: # pragma: no cover - try: - width, height = os.get_terminal_size() - except (AttributeError, ValueError, OSError): # Probably not a terminal - pass - else: - for file_descriptor in _STD_STREAMS: - try: - width, height = os.get_terminal_size(file_descriptor) - except (AttributeError, ValueError, OSError): - pass - else: - break - - columns = self._environ.get("COLUMNS") - if columns is not None and columns.isdigit(): - width = int(columns) - lines = self._environ.get("LINES") - if lines is not None and lines.isdigit(): - height = int(lines) - - # get_terminal_size can report 0, 0 if run from pseudo-terminal - width = width or 80 - height = height or 25 - return ConsoleDimensions( - width - self.legacy_windows if self._width is None else self._width, - height if self._height is None else self._height, - ) - - @size.setter - def size(self, new_size: Tuple[int, int]) -> None: - """Set a new size for the terminal. - - Args: - new_size (Tuple[int, int]): New width and height. - """ - width, height = new_size - self._width = width - self._height = height - - @property - def width(self) -> int: - """Get the width of the console. - - Returns: - int: The width (in characters) of the console. - """ - return self.size.width - - @width.setter - def width(self, width: int) -> None: - """Set width. - - Args: - width (int): New width. - """ - self._width = width - - @property - def height(self) -> int: - """Get the height of the console. - - Returns: - int: The height (in lines) of the console. - """ - return self.size.height - - @height.setter - def height(self, height: int) -> None: - """Set height. - - Args: - height (int): new height. - """ - self._height = height - - def bell(self) -> None: - """Play a 'bell' sound (if supported by the terminal).""" - self.control(Control.bell()) - - def capture(self) -> Capture: - """A context manager to *capture* the result of print() or log() in a string, - rather than writing it to the console. - - Example: - >>> from rich.console import Console - >>> console = Console() - >>> with console.capture() as capture: - ... console.print("[bold magenta]Hello World[/]") - >>> print(capture.get()) - - Returns: - Capture: Context manager with disables writing to the terminal. - """ - capture = Capture(self) - return capture - - def pager( - self, pager: Optional[Pager] = None, styles: bool = False, links: bool = False - ) -> PagerContext: - """A context manager to display anything printed within a "pager". The pager application - is defined by the system and will typically support at least pressing a key to scroll. - - Args: - pager (Pager, optional): A pager object, or None to use :class:`~rich.pager.SystemPager`. Defaults to None. - styles (bool, optional): Show styles in pager. Defaults to False. - links (bool, optional): Show links in pager. Defaults to False. - - Example: - >>> from rich.console import Console - >>> from rich.__main__ import make_test_card - >>> console = Console() - >>> with console.pager(): - console.print(make_test_card()) - - Returns: - PagerContext: A context manager. - """ - return PagerContext(self, pager=pager, styles=styles, links=links) - - def line(self, count: int = 1) -> None: - """Write new line(s). - - Args: - count (int, optional): Number of new lines. Defaults to 1. - """ - - assert count >= 0, "count must be >= 0" - self.print(NewLine(count)) - - def clear(self, home: bool = True) -> None: - """Clear the screen. - - Args: - home (bool, optional): Also move the cursor to 'home' position. Defaults to True. - """ - if home: - self.control(Control.clear(), Control.home()) - else: - self.control(Control.clear()) - - def status( - self, - status: RenderableType, - *, - spinner: str = "dots", - spinner_style: StyleType = "status.spinner", - speed: float = 1.0, - refresh_per_second: float = 12.5, - ) -> "Status": - """Display a status and spinner. - - Args: - status (RenderableType): A status renderable (str or Text typically). - spinner (str, optional): Name of spinner animation (see python -m rich.spinner). Defaults to "dots". - spinner_style (StyleType, optional): Style of spinner. Defaults to "status.spinner". - speed (float, optional): Speed factor for spinner animation. Defaults to 1.0. - refresh_per_second (float, optional): Number of refreshes per second. Defaults to 12.5. - - Returns: - Status: A Status object that may be used as a context manager. - """ - from .status import Status - - status_renderable = Status( - status, - console=self, - spinner=spinner, - spinner_style=spinner_style, - speed=speed, - refresh_per_second=refresh_per_second, - ) - return status_renderable - - def show_cursor(self, show: bool = True) -> bool: - """Show or hide the cursor. - - Args: - show (bool, optional): Set visibility of the cursor. - """ - if self.is_terminal: - self.control(Control.show_cursor(show)) - return True - return False - - def set_alt_screen(self, enable: bool = True) -> bool: - """Enables alternative screen mode. - - Note, if you enable this mode, you should ensure that is disabled before - the application exits. See :meth:`~rich.Console.screen` for a context manager - that handles this for you. - - Args: - enable (bool, optional): Enable (True) or disable (False) alternate screen. Defaults to True. - - Returns: - bool: True if the control codes were written. - - """ - changed = False - if self.is_terminal and not self.legacy_windows: - self.control(Control.alt_screen(enable)) - changed = True - self._is_alt_screen = enable - return changed - - @property - def is_alt_screen(self) -> bool: - """Check if the alt screen was enabled. - - Returns: - bool: True if the alt screen was enabled, otherwise False. - """ - return self._is_alt_screen - - def set_window_title(self, title: str) -> bool: - """Set the title of the console terminal window. - - Warning: There is no means within Rich of "resetting" the window title to its - previous value, meaning the title you set will persist even after your application - exits. - - ``fish`` shell resets the window title before and after each command by default, - negating this issue. Windows Terminal and command prompt will also reset the title for you. - Most other shells and terminals, however, do not do this. - - Some terminals may require configuration changes before you can set the title. - Some terminals may not support setting the title at all. - - Other software (including the terminal itself, the shell, custom prompts, plugins, etc.) - may also set the terminal window title. This could result in whatever value you write - using this method being overwritten. - - Args: - title (str): The new title of the terminal window. - - Returns: - bool: True if the control code to change the terminal title was - written, otherwise False. Note that a return value of True - does not guarantee that the window title has actually changed, - since the feature may be unsupported/disabled in some terminals. - """ - if self.is_terminal: - self.control(Control.title(title)) - return True - return False - - def screen( - self, hide_cursor: bool = True, style: Optional[StyleType] = None - ) -> "ScreenContext": - """Context manager to enable and disable 'alternative screen' mode. - - Args: - hide_cursor (bool, optional): Also hide the cursor. Defaults to False. - style (Style, optional): Optional style for screen. Defaults to None. - - Returns: - ~ScreenContext: Context which enables alternate screen on enter, and disables it on exit. - """ - return ScreenContext(self, hide_cursor=hide_cursor, style=style or "") - - def measure( - self, renderable: RenderableType, *, options: Optional[ConsoleOptions] = None - ) -> Measurement: - """Measure a renderable. Returns a :class:`~rich.measure.Measurement` object which contains - information regarding the number of characters required to print the renderable. - - Args: - renderable (RenderableType): Any renderable or string. - options (Optional[ConsoleOptions], optional): Options to use when measuring, or None - to use default options. Defaults to None. - - Returns: - Measurement: A measurement of the renderable. - """ - measurement = Measurement.get(self, options or self.options, renderable) - return measurement - - def render( - self, renderable: RenderableType, options: Optional[ConsoleOptions] = None - ) -> Iterable[Segment]: - """Render an object in to an iterable of `Segment` instances. - - This method contains the logic for rendering objects with the console protocol. - You are unlikely to need to use it directly, unless you are extending the library. - - Args: - renderable (RenderableType): An object supporting the console protocol, or - an object that may be converted to a string. - options (ConsoleOptions, optional): An options object, or None to use self.options. Defaults to None. - - Returns: - Iterable[Segment]: An iterable of segments that may be rendered. - """ - - _options = options or self.options - if _options.max_width < 1: - # No space to render anything. This prevents potential recursion errors. - return - render_iterable: RenderResult - - renderable = rich_cast(renderable) - if hasattr(renderable, "__rich_console__") and not isclass(renderable): - render_iterable = renderable.__rich_console__(self, _options) # type: ignore[union-attr] - elif isinstance(renderable, str): - text_renderable = self.render_str( - renderable, highlight=_options.highlight, markup=_options.markup - ) - render_iterable = text_renderable.__rich_console__(self, _options) - else: - raise errors.NotRenderableError( - f"Unable to render {renderable!r}; " - "A str, Segment or object with __rich_console__ method is required" - ) - - try: - iter_render = iter(render_iterable) - except TypeError: - raise errors.NotRenderableError( - f"object {render_iterable!r} is not renderable" - ) - _Segment = Segment - _options = _options.reset_height() - for render_output in iter_render: - if isinstance(render_output, _Segment): - yield render_output - else: - yield from self.render(render_output, _options) - - def render_lines( - self, - renderable: RenderableType, - options: Optional[ConsoleOptions] = None, - *, - style: Optional[Style] = None, - pad: bool = True, - new_lines: bool = False, - ) -> List[List[Segment]]: - """Render objects in to a list of lines. - - The output of render_lines is useful when further formatting of rendered console text - is required, such as the Panel class which draws a border around any renderable object. - - Args: - renderable (RenderableType): Any object renderable in the console. - options (Optional[ConsoleOptions], optional): Console options, or None to use self.options. Default to ``None``. - style (Style, optional): Optional style to apply to renderables. Defaults to ``None``. - pad (bool, optional): Pad lines shorter than render width. Defaults to ``True``. - new_lines (bool, optional): Include "\n" characters at end of lines. - - Returns: - List[List[Segment]]: A list of lines, where a line is a list of Segment objects. - """ - with self._lock: - render_options = options or self.options - _rendered = self.render(renderable, render_options) - if style: - _rendered = Segment.apply_style(_rendered, style) - - render_height = render_options.height - if render_height is not None: - render_height = max(0, render_height) - - lines = list( - islice( - Segment.split_and_crop_lines( - _rendered, - render_options.max_width, - include_new_lines=new_lines, - pad=pad, - style=style, - ), - None, - render_height, - ) - ) - if render_options.height is not None: - extra_lines = render_options.height - len(lines) - if extra_lines > 0: - pad_line = [ - [Segment(" " * render_options.max_width, style), Segment("\n")] - if new_lines - else [Segment(" " * render_options.max_width, style)] - ] - lines.extend(pad_line * extra_lines) - - return lines - - def render_str( - self, - text: str, - *, - style: Union[str, Style] = "", - justify: Optional[JustifyMethod] = None, - overflow: Optional[OverflowMethod] = None, - emoji: Optional[bool] = None, - markup: Optional[bool] = None, - highlight: Optional[bool] = None, - highlighter: Optional[HighlighterType] = None, - ) -> "Text": - """Convert a string to a Text instance. This is called automatically if - you print or log a string. - - Args: - text (str): Text to render. - style (Union[str, Style], optional): Style to apply to rendered text. - justify (str, optional): Justify method: "default", "left", "center", "full", or "right". Defaults to ``None``. - overflow (str, optional): Overflow method: "crop", "fold", or "ellipsis". Defaults to ``None``. - emoji (Optional[bool], optional): Enable emoji, or ``None`` to use Console default. - markup (Optional[bool], optional): Enable markup, or ``None`` to use Console default. - highlight (Optional[bool], optional): Enable highlighting, or ``None`` to use Console default. - highlighter (HighlighterType, optional): Optional highlighter to apply. - Returns: - ConsoleRenderable: Renderable object. - - """ - emoji_enabled = emoji or (emoji is None and self._emoji) - markup_enabled = markup or (markup is None and self._markup) - highlight_enabled = highlight or (highlight is None and self._highlight) - - if markup_enabled: - rich_text = render_markup( - text, - style=style, - emoji=emoji_enabled, - emoji_variant=self._emoji_variant, - ) - rich_text.justify = justify - rich_text.overflow = overflow - else: - rich_text = Text( - _emoji_replace(text, default_variant=self._emoji_variant) - if emoji_enabled - else text, - justify=justify, - overflow=overflow, - style=style, - ) - - _highlighter = (highlighter or self.highlighter) if highlight_enabled else None - if _highlighter is not None: - highlight_text = _highlighter(str(rich_text)) - highlight_text.copy_styles(rich_text) - return highlight_text - - return rich_text - - def get_style( - self, name: Union[str, Style], *, default: Optional[Union[Style, str]] = None - ) -> Style: - """Get a Style instance by its theme name or parse a definition. - - Args: - name (str): The name of a style or a style definition. - - Returns: - Style: A Style object. - - Raises: - MissingStyle: If no style could be parsed from name. - - """ - if isinstance(name, Style): - return name - - try: - style = self._theme_stack.get(name) - if style is None: - style = Style.parse(name) - return style.copy() if style.link else style - except errors.StyleSyntaxError as error: - if default is not None: - return self.get_style(default) - raise errors.MissingStyle( - f"Failed to get style {name!r}; {error}" - ) from None - - def _collect_renderables( - self, - objects: Iterable[Any], - sep: str, - end: str, - *, - justify: Optional[JustifyMethod] = None, - emoji: Optional[bool] = None, - markup: Optional[bool] = None, - highlight: Optional[bool] = None, - ) -> List[ConsoleRenderable]: - """Combine a number of renderables and text into one renderable. - - Args: - objects (Iterable[Any]): Anything that Rich can render. - sep (str): String to write between print data. - end (str): String to write at end of print data. - justify (str, optional): One of "left", "right", "center", or "full". Defaults to ``None``. - emoji (Optional[bool], optional): Enable emoji code, or ``None`` to use console default. - markup (Optional[bool], optional): Enable markup, or ``None`` to use console default. - highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use console default. - - Returns: - List[ConsoleRenderable]: A list of things to render. - """ - renderables: List[ConsoleRenderable] = [] - _append = renderables.append - text: List[Text] = [] - append_text = text.append - - append = _append - if justify in ("left", "center", "right"): - - def align_append(renderable: RenderableType) -> None: - _append(Align(renderable, cast(AlignMethod, justify))) - - append = align_append - - _highlighter: HighlighterType = _null_highlighter - if highlight or (highlight is None and self._highlight): - _highlighter = self.highlighter - - def check_text() -> None: - if text: - sep_text = Text(sep, justify=justify, end=end) - append(sep_text.join(text)) - text.clear() - - for renderable in objects: - renderable = rich_cast(renderable) - if isinstance(renderable, str): - append_text( - self.render_str( - renderable, emoji=emoji, markup=markup, highlighter=_highlighter - ) - ) - elif isinstance(renderable, Text): - append_text(renderable) - elif isinstance(renderable, ConsoleRenderable): - check_text() - append(renderable) - elif is_expandable(renderable): - check_text() - append(Pretty(renderable, highlighter=_highlighter)) - else: - append_text(_highlighter(str(renderable))) - - check_text() - - if self.style is not None: - style = self.get_style(self.style) - renderables = [Styled(renderable, style) for renderable in renderables] - - return renderables - - def rule( - self, - title: TextType = "", - *, - characters: str = "─", - style: Union[str, Style] = "rule.line", - align: AlignMethod = "center", - ) -> None: - """Draw a line with optional centered title. - - Args: - title (str, optional): Text to render over the rule. Defaults to "". - characters (str, optional): Character(s) to form the line. Defaults to "─". - style (str, optional): Style of line. Defaults to "rule.line". - align (str, optional): How to align the title, one of "left", "center", or "right". Defaults to "center". - """ - from .rule import Rule - - rule = Rule(title=title, characters=characters, style=style, align=align) - self.print(rule) - - def control(self, *control: Control) -> None: - """Insert non-printing control codes. - - Args: - control_codes (str): Control codes, such as those that may move the cursor. - """ - if not self.is_dumb_terminal: - with self: - self._buffer.extend(_control.segment for _control in control) - - def out( - self, - *objects: Any, - sep: str = " ", - end: str = "\n", - style: Optional[Union[str, Style]] = None, - highlight: Optional[bool] = None, - ) -> None: - """Output to the terminal. This is a low-level way of writing to the terminal which unlike - :meth:`~rich.console.Console.print` won't pretty print, wrap text, or apply markup, but will - optionally apply highlighting and a basic style. - - Args: - sep (str, optional): String to write between print data. Defaults to " ". - end (str, optional): String to write at end of print data. Defaults to "\\\\n". - style (Union[str, Style], optional): A style to apply to output. Defaults to None. - highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use - console default. Defaults to ``None``. - """ - raw_output: str = sep.join(str(_object) for _object in objects) - self.print( - raw_output, - style=style, - highlight=highlight, - emoji=False, - markup=False, - no_wrap=True, - overflow="ignore", - crop=False, - end=end, - ) - - def print( - self, - *objects: Any, - sep: str = " ", - end: str = "\n", - style: Optional[Union[str, Style]] = None, - justify: Optional[JustifyMethod] = None, - overflow: Optional[OverflowMethod] = None, - no_wrap: Optional[bool] = None, - emoji: Optional[bool] = None, - markup: Optional[bool] = None, - highlight: Optional[bool] = None, - width: Optional[int] = None, - height: Optional[int] = None, - crop: bool = True, - soft_wrap: Optional[bool] = None, - new_line_start: bool = False, - ) -> None: - """Print to the console. - - Args: - objects (positional args): Objects to log to the terminal. - sep (str, optional): String to write between print data. Defaults to " ". - end (str, optional): String to write at end of print data. Defaults to "\\\\n". - style (Union[str, Style], optional): A style to apply to output. Defaults to None. - justify (str, optional): Justify method: "default", "left", "right", "center", or "full". Defaults to ``None``. - overflow (str, optional): Overflow method: "ignore", "crop", "fold", or "ellipsis". Defaults to None. - no_wrap (Optional[bool], optional): Disable word wrapping. Defaults to None. - emoji (Optional[bool], optional): Enable emoji code, or ``None`` to use console default. Defaults to ``None``. - markup (Optional[bool], optional): Enable markup, or ``None`` to use console default. Defaults to ``None``. - highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use console default. Defaults to ``None``. - width (Optional[int], optional): Width of output, or ``None`` to auto-detect. Defaults to ``None``. - crop (Optional[bool], optional): Crop output to width of terminal. Defaults to True. - soft_wrap (bool, optional): Enable soft wrap mode which disables word wrapping and cropping of text or ``None`` for - Console default. Defaults to ``None``. - new_line_start (bool, False): Insert a new line at the start if the output contains more than one line. Defaults to ``False``. - """ - if not objects: - objects = (NewLine(),) - - if soft_wrap is None: - soft_wrap = self.soft_wrap - if soft_wrap: - if no_wrap is None: - no_wrap = True - if overflow is None: - overflow = "ignore" - crop = False - render_hooks = self._render_hooks[:] - with self: - renderables = self._collect_renderables( - objects, - sep, - end, - justify=justify, - emoji=emoji, - markup=markup, - highlight=highlight, - ) - for hook in render_hooks: - renderables = hook.process_renderables(renderables) - render_options = self.options.update( - justify=justify, - overflow=overflow, - width=min(width, self.width) if width is not None else NO_CHANGE, - height=height, - no_wrap=no_wrap, - markup=markup, - highlight=highlight, - ) - - new_segments: List[Segment] = [] - extend = new_segments.extend - render = self.render - if style is None: - for renderable in renderables: - extend(render(renderable, render_options)) - else: - for renderable in renderables: - extend( - Segment.apply_style( - render(renderable, render_options), self.get_style(style) - ) - ) - if new_line_start: - if ( - len("".join(segment.text for segment in new_segments).splitlines()) - > 1 - ): - new_segments.insert(0, Segment.line()) - if crop: - buffer_extend = self._buffer.extend - for line in Segment.split_and_crop_lines( - new_segments, self.width, pad=False - ): - buffer_extend(line) - else: - self._buffer.extend(new_segments) - - def print_json( - self, - json: Optional[str] = None, - *, - data: Any = None, - indent: Union[None, int, str] = 2, - highlight: bool = True, - skip_keys: bool = False, - ensure_ascii: bool = False, - check_circular: bool = True, - allow_nan: bool = True, - default: Optional[Callable[[Any], Any]] = None, - sort_keys: bool = False, - ) -> None: - """Pretty prints JSON. Output will be valid JSON. - - Args: - json (Optional[str]): A string containing JSON. - data (Any): If json is not supplied, then encode this data. - indent (Union[None, int, str], optional): Number of spaces to indent. Defaults to 2. - highlight (bool, optional): Enable highlighting of output: Defaults to True. - skip_keys (bool, optional): Skip keys not of a basic type. Defaults to False. - ensure_ascii (bool, optional): Escape all non-ascii characters. Defaults to False. - check_circular (bool, optional): Check for circular references. Defaults to True. - allow_nan (bool, optional): Allow NaN and Infinity values. Defaults to True. - default (Callable, optional): A callable that converts values that can not be encoded - in to something that can be JSON encoded. Defaults to None. - sort_keys (bool, optional): Sort dictionary keys. Defaults to False. - """ - from rich.json import JSON - - if json is None: - json_renderable = JSON.from_data( - data, - indent=indent, - highlight=highlight, - skip_keys=skip_keys, - ensure_ascii=ensure_ascii, - check_circular=check_circular, - allow_nan=allow_nan, - default=default, - sort_keys=sort_keys, - ) - else: - if not isinstance(json, str): - raise TypeError( - f"json must be str. Did you mean print_json(data={json!r}) ?" - ) - json_renderable = JSON( - json, - indent=indent, - highlight=highlight, - skip_keys=skip_keys, - ensure_ascii=ensure_ascii, - check_circular=check_circular, - allow_nan=allow_nan, - default=default, - sort_keys=sort_keys, - ) - self.print(json_renderable, soft_wrap=True) - - def update_screen( - self, - renderable: RenderableType, - *, - region: Optional[Region] = None, - options: Optional[ConsoleOptions] = None, - ) -> None: - """Update the screen at a given offset. - - Args: - renderable (RenderableType): A Rich renderable. - region (Region, optional): Region of screen to update, or None for entire screen. Defaults to None. - x (int, optional): x offset. Defaults to 0. - y (int, optional): y offset. Defaults to 0. - - Raises: - errors.NoAltScreen: If the Console isn't in alt screen mode. - - """ - if not self.is_alt_screen: - raise errors.NoAltScreen("Alt screen must be enabled to call update_screen") - render_options = options or self.options - if region is None: - x = y = 0 - render_options = render_options.update_dimensions( - render_options.max_width, render_options.height or self.height - ) - else: - x, y, width, height = region - render_options = render_options.update_dimensions(width, height) - - lines = self.render_lines(renderable, options=render_options) - self.update_screen_lines(lines, x, y) - - def update_screen_lines( - self, lines: List[List[Segment]], x: int = 0, y: int = 0 - ) -> None: - """Update lines of the screen at a given offset. - - Args: - lines (List[List[Segment]]): Rendered lines (as produced by :meth:`~rich.Console.render_lines`). - x (int, optional): x offset (column no). Defaults to 0. - y (int, optional): y offset (column no). Defaults to 0. - - Raises: - errors.NoAltScreen: If the Console isn't in alt screen mode. - """ - if not self.is_alt_screen: - raise errors.NoAltScreen("Alt screen must be enabled to call update_screen") - screen_update = ScreenUpdate(lines, x, y) - segments = self.render(screen_update) - self._buffer.extend(segments) - self._check_buffer() - - def print_exception( - self, - *, - width: Optional[int] = 100, - extra_lines: int = 3, - theme: Optional[str] = None, - word_wrap: bool = False, - show_locals: bool = False, - suppress: Iterable[Union[str, ModuleType]] = (), - max_frames: int = 100, - ) -> None: - """Prints a rich render of the last exception and traceback. - - Args: - width (Optional[int], optional): Number of characters used to render code. Defaults to 100. - extra_lines (int, optional): Additional lines of code to render. Defaults to 3. - theme (str, optional): Override pygments theme used in traceback - word_wrap (bool, optional): Enable word wrapping of long lines. Defaults to False. - show_locals (bool, optional): Enable display of local variables. Defaults to False. - suppress (Iterable[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback. - max_frames (int): Maximum number of frames to show in a traceback, 0 for no maximum. Defaults to 100. - """ - from .traceback import Traceback - - traceback = Traceback( - width=width, - extra_lines=extra_lines, - theme=theme, - word_wrap=word_wrap, - show_locals=show_locals, - suppress=suppress, - max_frames=max_frames, - ) - self.print(traceback) - - @staticmethod - def _caller_frame_info( - offset: int, - currentframe: Callable[[], Optional[FrameType]] = inspect.currentframe, - ) -> Tuple[str, int, Dict[str, Any]]: - """Get caller frame information. - - Args: - offset (int): the caller offset within the current frame stack. - currentframe (Callable[[], Optional[FrameType]], optional): the callable to use to - retrieve the current frame. Defaults to ``inspect.currentframe``. - - Returns: - Tuple[str, int, Dict[str, Any]]: A tuple containing the filename, the line number and - the dictionary of local variables associated with the caller frame. - - Raises: - RuntimeError: If the stack offset is invalid. - """ - # Ignore the frame of this local helper - offset += 1 - - frame = currentframe() - if frame is not None: - # Use the faster currentframe where implemented - while offset and frame is not None: - frame = frame.f_back - offset -= 1 - assert frame is not None - return frame.f_code.co_filename, frame.f_lineno, frame.f_locals - else: - # Fallback to the slower stack - frame_info = inspect.stack()[offset] - return frame_info.filename, frame_info.lineno, frame_info.frame.f_locals - - def log( - self, - *objects: Any, - sep: str = " ", - end: str = "\n", - style: Optional[Union[str, Style]] = None, - justify: Optional[JustifyMethod] = None, - emoji: Optional[bool] = None, - markup: Optional[bool] = None, - highlight: Optional[bool] = None, - log_locals: bool = False, - _stack_offset: int = 1, - ) -> None: - """Log rich content to the terminal. - - Args: - objects (positional args): Objects to log to the terminal. - sep (str, optional): String to write between print data. Defaults to " ". - end (str, optional): String to write at end of print data. Defaults to "\\\\n". - style (Union[str, Style], optional): A style to apply to output. Defaults to None. - justify (str, optional): One of "left", "right", "center", or "full". Defaults to ``None``. - overflow (str, optional): Overflow method: "crop", "fold", or "ellipsis". Defaults to None. - emoji (Optional[bool], optional): Enable emoji code, or ``None`` to use console default. Defaults to None. - markup (Optional[bool], optional): Enable markup, or ``None`` to use console default. Defaults to None. - highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use console default. Defaults to None. - log_locals (bool, optional): Boolean to enable logging of locals where ``log()`` - was called. Defaults to False. - _stack_offset (int, optional): Offset of caller from end of call stack. Defaults to 1. - """ - if not objects: - objects = (NewLine(),) - - render_hooks = self._render_hooks[:] - - with self: - renderables = self._collect_renderables( - objects, - sep, - end, - justify=justify, - emoji=emoji, - markup=markup, - highlight=highlight, - ) - if style is not None: - renderables = [Styled(renderable, style) for renderable in renderables] - - filename, line_no, locals = self._caller_frame_info(_stack_offset) - link_path = None if filename.startswith("<") else os.path.abspath(filename) - path = filename.rpartition(os.sep)[-1] - if log_locals: - locals_map = { - key: value - for key, value in locals.items() - if not key.startswith("__") - } - renderables.append(render_scope(locals_map, title="[i]locals")) - - renderables = [ - self._log_render( - self, - renderables, - log_time=self.get_datetime(), - path=path, - line_no=line_no, - link_path=link_path, - ) - ] - for hook in render_hooks: - renderables = hook.process_renderables(renderables) - new_segments: List[Segment] = [] - extend = new_segments.extend - render = self.render - render_options = self.options - for renderable in renderables: - extend(render(renderable, render_options)) - buffer_extend = self._buffer.extend - for line in Segment.split_and_crop_lines( - new_segments, self.width, pad=False - ): - buffer_extend(line) - - def _check_buffer(self) -> None: - """Check if the buffer may be rendered. Render it if it can (e.g. Console.quiet is False) - Rendering is supported on Windows, Unix and Jupyter environments. For - legacy Windows consoles, the win32 API is called directly. - This method will also record what it renders if recording is enabled via Console.record. - """ - if self.quiet: - del self._buffer[:] - return - with self._lock: - if self.record: - with self._record_buffer_lock: - self._record_buffer.extend(self._buffer[:]) - - if self._buffer_index == 0: - if self.is_jupyter: # pragma: no cover - from .jupyter import display - - display(self._buffer, self._render_buffer(self._buffer[:])) - del self._buffer[:] - else: - if WINDOWS: - use_legacy_windows_render = False - if self.legacy_windows: - fileno = get_fileno(self.file) - if fileno is not None: - use_legacy_windows_render = ( - fileno in _STD_STREAMS_OUTPUT - ) - - if use_legacy_windows_render: - from rich._win32_console import LegacyWindowsTerm - from rich._windows_renderer import legacy_windows_render - - buffer = self._buffer[:] - if self.no_color and self._color_system: - buffer = list(Segment.remove_color(buffer)) - - legacy_windows_render(buffer, LegacyWindowsTerm(self.file)) - else: - # Either a non-std stream on legacy Windows, or modern Windows. - text = self._render_buffer(self._buffer[:]) - # https://bugs.python.org/issue37871 - # https://github.com/python/cpython/issues/82052 - # We need to avoid writing more than 32Kb in a single write, due to the above bug - write = self.file.write - # Worse case scenario, every character is 4 bytes of utf-8 - MAX_WRITE = 32 * 1024 // 4 - try: - if len(text) <= MAX_WRITE: - write(text) - else: - batch: List[str] = [] - batch_append = batch.append - size = 0 - for line in text.splitlines(True): - if size + len(line) > MAX_WRITE and batch: - write("".join(batch)) - batch.clear() - size = 0 - batch_append(line) - size += len(line) - if batch: - write("".join(batch)) - batch.clear() - except UnicodeEncodeError as error: - error.reason = f"{error.reason}\n*** You may need to add PYTHONIOENCODING=utf-8 to your environment ***" - raise - else: - text = self._render_buffer(self._buffer[:]) - try: - self.file.write(text) - except UnicodeEncodeError as error: - error.reason = f"{error.reason}\n*** You may need to add PYTHONIOENCODING=utf-8 to your environment ***" - raise - - self.file.flush() - del self._buffer[:] - - def _render_buffer(self, buffer: Iterable[Segment]) -> str: - """Render buffered output, and clear buffer.""" - output: List[str] = [] - append = output.append - color_system = self._color_system - legacy_windows = self.legacy_windows - not_terminal = not self.is_terminal - if self.no_color and color_system: - buffer = Segment.remove_color(buffer) - for text, style, control in buffer: - if style: - append( - style.render( - text, - color_system=color_system, - legacy_windows=legacy_windows, - ) - ) - elif not (not_terminal and control): - append(text) - - rendered = "".join(output) - return rendered - - def input( - self, - prompt: TextType = "", - *, - markup: bool = True, - emoji: bool = True, - password: bool = False, - stream: Optional[TextIO] = None, - ) -> str: - """Displays a prompt and waits for input from the user. The prompt may contain color / style. - - It works in the same way as Python's builtin :func:`input` function and provides elaborate line editing and history features if Python's builtin :mod:`readline` module is previously loaded. - - Args: - prompt (Union[str, Text]): Text to render in the prompt. - markup (bool, optional): Enable console markup (requires a str prompt). Defaults to True. - emoji (bool, optional): Enable emoji (requires a str prompt). Defaults to True. - password: (bool, optional): Hide typed text. Defaults to False. - stream: (TextIO, optional): Optional file to read input from (rather than stdin). Defaults to None. - - Returns: - str: Text read from stdin. - """ - if prompt: - self.print(prompt, markup=markup, emoji=emoji, end="") - if password: - result = getpass("", stream=stream) - else: - if stream: - result = stream.readline() - else: - result = input() - return result - - def export_text(self, *, clear: bool = True, styles: bool = False) -> str: - """Generate text from console contents (requires record=True argument in constructor). - - Args: - clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``. - styles (bool, optional): If ``True``, ansi escape codes will be included. ``False`` for plain text. - Defaults to ``False``. - - Returns: - str: String containing console contents. - - """ - assert ( - self.record - ), "To export console contents set record=True in the constructor or instance" - - with self._record_buffer_lock: - if styles: - text = "".join( - (style.render(text) if style else text) - for text, style, _ in self._record_buffer - ) - else: - text = "".join( - segment.text - for segment in self._record_buffer - if not segment.control - ) - if clear: - del self._record_buffer[:] - return text - - def save_text(self, path: str, *, clear: bool = True, styles: bool = False) -> None: - """Generate text from console and save to a given location (requires record=True argument in constructor). - - Args: - path (str): Path to write text files. - clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``. - styles (bool, optional): If ``True``, ansi style codes will be included. ``False`` for plain text. - Defaults to ``False``. - - """ - text = self.export_text(clear=clear, styles=styles) - with open(path, "wt", encoding="utf-8") as write_file: - write_file.write(text) - - def export_html( - self, - *, - theme: Optional[TerminalTheme] = None, - clear: bool = True, - code_format: Optional[str] = None, - inline_styles: bool = False, - ) -> str: - """Generate HTML from console contents (requires record=True argument in constructor). - - Args: - theme (TerminalTheme, optional): TerminalTheme object containing console colors. - clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``. - code_format (str, optional): Format string to render HTML. In addition to '{foreground}', - '{background}', and '{code}', should contain '{stylesheet}' if inline_styles is ``False``. - inline_styles (bool, optional): If ``True`` styles will be inlined in to spans, which makes files - larger but easier to cut and paste markup. If ``False``, styles will be embedded in a style tag. - Defaults to False. - - Returns: - str: String containing console contents as HTML. - """ - assert ( - self.record - ), "To export console contents set record=True in the constructor or instance" - fragments: List[str] = [] - append = fragments.append - _theme = theme or DEFAULT_TERMINAL_THEME - stylesheet = "" - - render_code_format = CONSOLE_HTML_FORMAT if code_format is None else code_format - - with self._record_buffer_lock: - if inline_styles: - for text, style, _ in Segment.filter_control( - Segment.simplify(self._record_buffer) - ): - text = escape(text) - if style: - rule = style.get_html_style(_theme) - if style.link: - text = f'<a href="{style.link}">{text}</a>' - text = f'<span style="{rule}">{text}</span>' if rule else text - append(text) - else: - styles: Dict[str, int] = {} - for text, style, _ in Segment.filter_control( - Segment.simplify(self._record_buffer) - ): - text = escape(text) - if style: - rule = style.get_html_style(_theme) - style_number = styles.setdefault(rule, len(styles) + 1) - if style.link: - text = f'<a class="r{style_number}" href="{style.link}">{text}</a>' - else: - text = f'<span class="r{style_number}">{text}</span>' - append(text) - stylesheet_rules: List[str] = [] - stylesheet_append = stylesheet_rules.append - for style_rule, style_number in styles.items(): - if style_rule: - stylesheet_append(f".r{style_number} {{{style_rule}}}") - stylesheet = "\n".join(stylesheet_rules) - - rendered_code = render_code_format.format( - code="".join(fragments), - stylesheet=stylesheet, - foreground=_theme.foreground_color.hex, - background=_theme.background_color.hex, - ) - if clear: - del self._record_buffer[:] - return rendered_code - - def save_html( - self, - path: str, - *, - theme: Optional[TerminalTheme] = None, - clear: bool = True, - code_format: str = CONSOLE_HTML_FORMAT, - inline_styles: bool = False, - ) -> None: - """Generate HTML from console contents and write to a file (requires record=True argument in constructor). - - Args: - path (str): Path to write html file. - theme (TerminalTheme, optional): TerminalTheme object containing console colors. - clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``. - code_format (str, optional): Format string to render HTML. In addition to '{foreground}', - '{background}', and '{code}', should contain '{stylesheet}' if inline_styles is ``False``. - inline_styles (bool, optional): If ``True`` styles will be inlined in to spans, which makes files - larger but easier to cut and paste markup. If ``False``, styles will be embedded in a style tag. - Defaults to False. - - """ - html = self.export_html( - theme=theme, - clear=clear, - code_format=code_format, - inline_styles=inline_styles, - ) - with open(path, "wt", encoding="utf-8") as write_file: - write_file.write(html) - - def export_svg( - self, - *, - title: str = "Rich", - theme: Optional[TerminalTheme] = None, - clear: bool = True, - code_format: str = CONSOLE_SVG_FORMAT, - font_aspect_ratio: float = 0.61, - unique_id: Optional[str] = None, - ) -> str: - """ - Generate an SVG from the console contents (requires record=True in Console constructor). - - Args: - title (str, optional): The title of the tab in the output image - theme (TerminalTheme, optional): The ``TerminalTheme`` object to use to style the terminal - clear (bool, optional): Clear record buffer after exporting. Defaults to ``True`` - code_format (str, optional): Format string used to generate the SVG. Rich will inject a number of variables - into the string in order to form the final SVG output. The default template used and the variables - injected by Rich can be found by inspecting the ``console.CONSOLE_SVG_FORMAT`` variable. - font_aspect_ratio (float, optional): The width to height ratio of the font used in the ``code_format`` - string. Defaults to 0.61, which is the width to height ratio of Fira Code (the default font). - If you aren't specifying a different font inside ``code_format``, you probably don't need this. - unique_id (str, optional): unique id that is used as the prefix for various elements (CSS styles, node - ids). If not set, this defaults to a computed value based on the recorded content. - """ - - from rich.cells import cell_len - - style_cache: Dict[Style, str] = {} - - def get_svg_style(style: Style) -> str: - """Convert a Style to CSS rules for SVG.""" - if style in style_cache: - return style_cache[style] - css_rules = [] - color = ( - _theme.foreground_color - if (style.color is None or style.color.is_default) - else style.color.get_truecolor(_theme) - ) - bgcolor = ( - _theme.background_color - if (style.bgcolor is None or style.bgcolor.is_default) - else style.bgcolor.get_truecolor(_theme) - ) - if style.reverse: - color, bgcolor = bgcolor, color - if style.dim: - color = blend_rgb(color, bgcolor, 0.4) - css_rules.append(f"fill: {color.hex}") - if style.bold: - css_rules.append("font-weight: bold") - if style.italic: - css_rules.append("font-style: italic;") - if style.underline: - css_rules.append("text-decoration: underline;") - if style.strike: - css_rules.append("text-decoration: line-through;") - - css = ";".join(css_rules) - style_cache[style] = css - return css - - _theme = theme or SVG_EXPORT_THEME - - width = self.width - char_height = 20 - char_width = char_height * font_aspect_ratio - line_height = char_height * 1.22 - - margin_top = 1 - margin_right = 1 - margin_bottom = 1 - margin_left = 1 - - padding_top = 40 - padding_right = 8 - padding_bottom = 8 - padding_left = 8 - - padding_width = padding_left + padding_right - padding_height = padding_top + padding_bottom - margin_width = margin_left + margin_right - margin_height = margin_top + margin_bottom - - text_backgrounds: List[str] = [] - text_group: List[str] = [] - classes: Dict[str, int] = {} - style_no = 1 - - def escape_text(text: str) -> str: - """HTML escape text and replace spaces with nbsp.""" - return escape(text).replace(" ", " ") - - def make_tag( - name: str, content: Optional[str] = None, **attribs: object - ) -> str: - """Make a tag from name, content, and attributes.""" - - def stringify(value: object) -> str: - if isinstance(value, (float)): - return format(value, "g") - return str(value) - - tag_attribs = " ".join( - f'{k.lstrip("_").replace("_", "-")}="{stringify(v)}"' - for k, v in attribs.items() - ) - return ( - f"<{name} {tag_attribs}>{content}</{name}>" - if content - else f"<{name} {tag_attribs}/>" - ) - - with self._record_buffer_lock: - segments = list(Segment.filter_control(self._record_buffer)) - if clear: - self._record_buffer.clear() - - if unique_id is None: - unique_id = "terminal-" + str( - zlib.adler32( - ("".join(repr(segment) for segment in segments)).encode( - "utf-8", - "ignore", - ) - + title.encode("utf-8", "ignore") - ) - ) - y = 0 - for y, line in enumerate(Segment.split_and_crop_lines(segments, length=width)): - x = 0 - for text, style, _control in line: - style = style or Style() - rules = get_svg_style(style) - if rules not in classes: - classes[rules] = style_no - style_no += 1 - class_name = f"r{classes[rules]}" - - if style.reverse: - has_background = True - background = ( - _theme.foreground_color.hex - if style.color is None - else style.color.get_truecolor(_theme).hex - ) - else: - bgcolor = style.bgcolor - has_background = bgcolor is not None and not bgcolor.is_default - background = ( - _theme.background_color.hex - if style.bgcolor is None - else style.bgcolor.get_truecolor(_theme).hex - ) - - text_length = cell_len(text) - if has_background: - text_backgrounds.append( - make_tag( - "rect", - fill=background, - x=x * char_width, - y=y * line_height + 1.5, - width=char_width * text_length, - height=line_height + 0.25, - shape_rendering="crispEdges", - ) - ) - - if text != " " * len(text): - text_group.append( - make_tag( - "text", - escape_text(text), - _class=f"{unique_id}-{class_name}", - x=x * char_width, - y=y * line_height + char_height, - textLength=char_width * len(text), - clip_path=f"url(#{unique_id}-line-{y})", - ) - ) - x += cell_len(text) - - line_offsets = [line_no * line_height + 1.5 for line_no in range(y)] - lines = "\n".join( - f"""<clipPath id="{unique_id}-line-{line_no}"> - {make_tag("rect", x=0, y=offset, width=char_width * width, height=line_height + 0.25)} - </clipPath>""" - for line_no, offset in enumerate(line_offsets) - ) - - styles = "\n".join( - f".{unique_id}-r{rule_no} {{ {css} }}" for css, rule_no in classes.items() - ) - backgrounds = "".join(text_backgrounds) - matrix = "".join(text_group) - - terminal_width = ceil(width * char_width + padding_width) - terminal_height = (y + 1) * line_height + padding_height - chrome = make_tag( - "rect", - fill=_theme.background_color.hex, - stroke="rgba(255,255,255,0.35)", - stroke_width="1", - x=margin_left, - y=margin_top, - width=terminal_width, - height=terminal_height, - rx=8, - ) - - title_color = _theme.foreground_color.hex - if title: - chrome += make_tag( - "text", - escape_text(title), - _class=f"{unique_id}-title", - fill=title_color, - text_anchor="middle", - x=terminal_width // 2, - y=margin_top + char_height + 6, - ) - chrome += f""" - <g transform="translate(26,22)"> - <circle cx="0" cy="0" r="7" fill="#ff5f57"/> - <circle cx="22" cy="0" r="7" fill="#febc2e"/> - <circle cx="44" cy="0" r="7" fill="#28c840"/> - </g> - """ - - svg = code_format.format( - unique_id=unique_id, - char_width=char_width, - char_height=char_height, - line_height=line_height, - terminal_width=char_width * width - 1, - terminal_height=(y + 1) * line_height - 1, - width=terminal_width + margin_width, - height=terminal_height + margin_height, - terminal_x=margin_left + padding_left, - terminal_y=margin_top + padding_top, - styles=styles, - chrome=chrome, - backgrounds=backgrounds, - matrix=matrix, - lines=lines, - ) - return svg - - def save_svg( - self, - path: str, - *, - title: str = "Rich", - theme: Optional[TerminalTheme] = None, - clear: bool = True, - code_format: str = CONSOLE_SVG_FORMAT, - font_aspect_ratio: float = 0.61, - unique_id: Optional[str] = None, - ) -> None: - """Generate an SVG file from the console contents (requires record=True in Console constructor). - - Args: - path (str): The path to write the SVG to. - title (str, optional): The title of the tab in the output image - theme (TerminalTheme, optional): The ``TerminalTheme`` object to use to style the terminal - clear (bool, optional): Clear record buffer after exporting. Defaults to ``True`` - code_format (str, optional): Format string used to generate the SVG. Rich will inject a number of variables - into the string in order to form the final SVG output. The default template used and the variables - injected by Rich can be found by inspecting the ``console.CONSOLE_SVG_FORMAT`` variable. - font_aspect_ratio (float, optional): The width to height ratio of the font used in the ``code_format`` - string. Defaults to 0.61, which is the width to height ratio of Fira Code (the default font). - If you aren't specifying a different font inside ``code_format``, you probably don't need this. - unique_id (str, optional): unique id that is used as the prefix for various elements (CSS styles, node - ids). If not set, this defaults to a computed value based on the recorded content. - """ - svg = self.export_svg( - title=title, - theme=theme, - clear=clear, - code_format=code_format, - font_aspect_ratio=font_aspect_ratio, - unique_id=unique_id, - ) - with open(path, "wt", encoding="utf-8") as write_file: - write_file.write(svg) - - -def _svg_hash(svg_main_code: str) -> str: - """Returns a unique hash for the given SVG main code. - - Args: - svg_main_code (str): The content we're going to inject in the SVG envelope. - - Returns: - str: a hash of the given content - """ - return str(zlib.adler32(svg_main_code.encode())) - - -if __name__ == "__main__": # pragma: no cover - console = Console(record=True) - - console.log( - "JSONRPC [i]request[/i]", - 5, - 1.3, - True, - False, - None, - { - "jsonrpc": "2.0", - "method": "subtract", - "params": {"minuend": 42, "subtrahend": 23}, - "id": 3, - }, - ) - - console.log("Hello, World!", "{'a': 1}", repr(console)) - - console.print( - { - "name": None, - "empty": [], - "quiz": { - "sport": { - "answered": True, - "q1": { - "question": "Which one is correct team name in NBA?", - "options": [ - "New York Bulls", - "Los Angeles Kings", - "Golden State Warriors", - "Huston Rocket", - ], - "answer": "Huston Rocket", - }, - }, - "maths": { - "answered": False, - "q1": { - "question": "5 + 7 = ?", - "options": [10, 11, 12, 13], - "answer": 12, - }, - "q2": { - "question": "12 - 8 = ?", - "options": [1, 2, 3, 4], - "answer": 4, - }, - }, - }, - } - ) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/constrain.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/constrain.py deleted file mode 100644 index 65fdf563..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/constrain.py +++ /dev/null @@ -1,37 +0,0 @@ -from typing import Optional, TYPE_CHECKING - -from .jupyter import JupyterMixin -from .measure import Measurement - -if TYPE_CHECKING: - from .console import Console, ConsoleOptions, RenderableType, RenderResult - - -class Constrain(JupyterMixin): - """Constrain the width of a renderable to a given number of characters. - - Args: - renderable (RenderableType): A renderable object. - width (int, optional): The maximum width (in characters) to render. Defaults to 80. - """ - - def __init__(self, renderable: "RenderableType", width: Optional[int] = 80) -> None: - self.renderable = renderable - self.width = width - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - if self.width is None: - yield self.renderable - else: - child_options = options.update_width(min(self.width, options.max_width)) - yield from console.render(self.renderable, child_options) - - def __rich_measure__( - self, console: "Console", options: "ConsoleOptions" - ) -> "Measurement": - if self.width is not None: - options = options.update_width(self.width) - measurement = Measurement.get(console, options, self.renderable) - return measurement diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/containers.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/containers.py deleted file mode 100644 index e29cf368..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/containers.py +++ /dev/null @@ -1,167 +0,0 @@ -from itertools import zip_longest -from typing import ( - Iterator, - Iterable, - List, - Optional, - Union, - overload, - TypeVar, - TYPE_CHECKING, -) - -if TYPE_CHECKING: - from .console import ( - Console, - ConsoleOptions, - JustifyMethod, - OverflowMethod, - RenderResult, - RenderableType, - ) - from .text import Text - -from .cells import cell_len -from .measure import Measurement - -T = TypeVar("T") - - -class Renderables: - """A list subclass which renders its contents to the console.""" - - def __init__( - self, renderables: Optional[Iterable["RenderableType"]] = None - ) -> None: - self._renderables: List["RenderableType"] = ( - list(renderables) if renderables is not None else [] - ) - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - """Console render method to insert line-breaks.""" - yield from self._renderables - - def __rich_measure__( - self, console: "Console", options: "ConsoleOptions" - ) -> "Measurement": - dimensions = [ - Measurement.get(console, options, renderable) - for renderable in self._renderables - ] - if not dimensions: - return Measurement(1, 1) - _min = max(dimension.minimum for dimension in dimensions) - _max = max(dimension.maximum for dimension in dimensions) - return Measurement(_min, _max) - - def append(self, renderable: "RenderableType") -> None: - self._renderables.append(renderable) - - def __iter__(self) -> Iterable["RenderableType"]: - return iter(self._renderables) - - -class Lines: - """A list subclass which can render to the console.""" - - def __init__(self, lines: Iterable["Text"] = ()) -> None: - self._lines: List["Text"] = list(lines) - - def __repr__(self) -> str: - return f"Lines({self._lines!r})" - - def __iter__(self) -> Iterator["Text"]: - return iter(self._lines) - - @overload - def __getitem__(self, index: int) -> "Text": - ... - - @overload - def __getitem__(self, index: slice) -> List["Text"]: - ... - - def __getitem__(self, index: Union[slice, int]) -> Union["Text", List["Text"]]: - return self._lines[index] - - def __setitem__(self, index: int, value: "Text") -> "Lines": - self._lines[index] = value - return self - - def __len__(self) -> int: - return self._lines.__len__() - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - """Console render method to insert line-breaks.""" - yield from self._lines - - def append(self, line: "Text") -> None: - self._lines.append(line) - - def extend(self, lines: Iterable["Text"]) -> None: - self._lines.extend(lines) - - def pop(self, index: int = -1) -> "Text": - return self._lines.pop(index) - - def justify( - self, - console: "Console", - width: int, - justify: "JustifyMethod" = "left", - overflow: "OverflowMethod" = "fold", - ) -> None: - """Justify and overflow text to a given width. - - Args: - console (Console): Console instance. - width (int): Number of characters per line. - justify (str, optional): Default justify method for text: "left", "center", "full" or "right". Defaults to "left". - overflow (str, optional): Default overflow for text: "crop", "fold", or "ellipsis". Defaults to "fold". - - """ - from .text import Text - - if justify == "left": - for line in self._lines: - line.truncate(width, overflow=overflow, pad=True) - elif justify == "center": - for line in self._lines: - line.rstrip() - line.truncate(width, overflow=overflow) - line.pad_left((width - cell_len(line.plain)) // 2) - line.pad_right(width - cell_len(line.plain)) - elif justify == "right": - for line in self._lines: - line.rstrip() - line.truncate(width, overflow=overflow) - line.pad_left(width - cell_len(line.plain)) - elif justify == "full": - for line_index, line in enumerate(self._lines): - if line_index == len(self._lines) - 1: - break - words = line.split(" ") - words_size = sum(cell_len(word.plain) for word in words) - num_spaces = len(words) - 1 - spaces = [1 for _ in range(num_spaces)] - index = 0 - if spaces: - while words_size + num_spaces < width: - spaces[len(spaces) - index - 1] += 1 - num_spaces += 1 - index = (index + 1) % len(spaces) - tokens: List[Text] = [] - for index, (word, next_word) in enumerate( - zip_longest(words, words[1:]) - ): - tokens.append(word) - if index < len(spaces): - style = word.get_style_at_offset(console, -1) - next_style = next_word.get_style_at_offset(console, 0) - space_style = style if style == next_style else line.style - tokens.append(Text(" " * spaces[index], style=space_style)) - self[line_index] = Text("").join(tokens) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/control.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/control.py deleted file mode 100644 index a8a91255..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/control.py +++ /dev/null @@ -1,225 +0,0 @@ -import sys -import time -from typing import TYPE_CHECKING, Callable, Dict, Iterable, List, Union - -if sys.version_info >= (3, 8): - from typing import Final -else: - from typing_extensions import Final # pragma: no cover - -from .segment import ControlCode, ControlType, Segment - -if TYPE_CHECKING: - from .console import Console, ConsoleOptions, RenderResult - -STRIP_CONTROL_CODES: Final = [ - 7, # Bell - 8, # Backspace - 11, # Vertical tab - 12, # Form feed - 13, # Carriage return -] -_CONTROL_STRIP_TRANSLATE: Final = { - _codepoint: None for _codepoint in STRIP_CONTROL_CODES -} - -CONTROL_ESCAPE: Final = { - 7: "\\a", - 8: "\\b", - 11: "\\v", - 12: "\\f", - 13: "\\r", -} - -CONTROL_CODES_FORMAT: Dict[int, Callable[..., str]] = { - ControlType.BELL: lambda: "\x07", - ControlType.CARRIAGE_RETURN: lambda: "\r", - ControlType.HOME: lambda: "\x1b[H", - ControlType.CLEAR: lambda: "\x1b[2J", - ControlType.ENABLE_ALT_SCREEN: lambda: "\x1b[?1049h", - ControlType.DISABLE_ALT_SCREEN: lambda: "\x1b[?1049l", - ControlType.SHOW_CURSOR: lambda: "\x1b[?25h", - ControlType.HIDE_CURSOR: lambda: "\x1b[?25l", - ControlType.CURSOR_UP: lambda param: f"\x1b[{param}A", - ControlType.CURSOR_DOWN: lambda param: f"\x1b[{param}B", - ControlType.CURSOR_FORWARD: lambda param: f"\x1b[{param}C", - ControlType.CURSOR_BACKWARD: lambda param: f"\x1b[{param}D", - ControlType.CURSOR_MOVE_TO_COLUMN: lambda param: f"\x1b[{param+1}G", - ControlType.ERASE_IN_LINE: lambda param: f"\x1b[{param}K", - ControlType.CURSOR_MOVE_TO: lambda x, y: f"\x1b[{y+1};{x+1}H", - ControlType.SET_WINDOW_TITLE: lambda title: f"\x1b]0;{title}\x07", -} - - -class Control: - """A renderable that inserts a control code (non printable but may move cursor). - - Args: - *codes (str): Positional arguments are either a :class:`~rich.segment.ControlType` enum or a - tuple of ControlType and an integer parameter - """ - - __slots__ = ["segment"] - - def __init__(self, *codes: Union[ControlType, ControlCode]) -> None: - control_codes: List[ControlCode] = [ - (code,) if isinstance(code, ControlType) else code for code in codes - ] - _format_map = CONTROL_CODES_FORMAT - rendered_codes = "".join( - _format_map[code](*parameters) for code, *parameters in control_codes - ) - self.segment = Segment(rendered_codes, None, control_codes) - - @classmethod - def bell(cls) -> "Control": - """Ring the 'bell'.""" - return cls(ControlType.BELL) - - @classmethod - def home(cls) -> "Control": - """Move cursor to 'home' position.""" - return cls(ControlType.HOME) - - @classmethod - def move(cls, x: int = 0, y: int = 0) -> "Control": - """Move cursor relative to current position. - - Args: - x (int): X offset. - y (int): Y offset. - - Returns: - ~Control: Control object. - - """ - - def get_codes() -> Iterable[ControlCode]: - control = ControlType - if x: - yield ( - control.CURSOR_FORWARD if x > 0 else control.CURSOR_BACKWARD, - abs(x), - ) - if y: - yield ( - control.CURSOR_DOWN if y > 0 else control.CURSOR_UP, - abs(y), - ) - - control = cls(*get_codes()) - return control - - @classmethod - def move_to_column(cls, x: int, y: int = 0) -> "Control": - """Move to the given column, optionally add offset to row. - - Returns: - x (int): absolute x (column) - y (int): optional y offset (row) - - Returns: - ~Control: Control object. - """ - - return ( - cls( - (ControlType.CURSOR_MOVE_TO_COLUMN, x), - ( - ControlType.CURSOR_DOWN if y > 0 else ControlType.CURSOR_UP, - abs(y), - ), - ) - if y - else cls((ControlType.CURSOR_MOVE_TO_COLUMN, x)) - ) - - @classmethod - def move_to(cls, x: int, y: int) -> "Control": - """Move cursor to absolute position. - - Args: - x (int): x offset (column) - y (int): y offset (row) - - Returns: - ~Control: Control object. - """ - return cls((ControlType.CURSOR_MOVE_TO, x, y)) - - @classmethod - def clear(cls) -> "Control": - """Clear the screen.""" - return cls(ControlType.CLEAR) - - @classmethod - def show_cursor(cls, show: bool) -> "Control": - """Show or hide the cursor.""" - return cls(ControlType.SHOW_CURSOR if show else ControlType.HIDE_CURSOR) - - @classmethod - def alt_screen(cls, enable: bool) -> "Control": - """Enable or disable alt screen.""" - if enable: - return cls(ControlType.ENABLE_ALT_SCREEN, ControlType.HOME) - else: - return cls(ControlType.DISABLE_ALT_SCREEN) - - @classmethod - def title(cls, title: str) -> "Control": - """Set the terminal window title - - Args: - title (str): The new terminal window title - """ - return cls((ControlType.SET_WINDOW_TITLE, title)) - - def __str__(self) -> str: - return self.segment.text - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - if self.segment.text: - yield self.segment - - -def strip_control_codes( - text: str, _translate_table: Dict[int, None] = _CONTROL_STRIP_TRANSLATE -) -> str: - """Remove control codes from text. - - Args: - text (str): A string possibly contain control codes. - - Returns: - str: String with control codes removed. - """ - return text.translate(_translate_table) - - -def escape_control_codes( - text: str, - _translate_table: Dict[int, str] = CONTROL_ESCAPE, -) -> str: - """Replace control codes with their "escaped" equivalent in the given text. - (e.g. "\b" becomes "\\b") - - Args: - text (str): A string possibly containing control codes. - - Returns: - str: String with control codes replaced with their escaped version. - """ - return text.translate(_translate_table) - - -if __name__ == "__main__": # pragma: no cover - from rich.console import Console - - console = Console() - console.print("Look at the title of your terminal window ^") - # console.print(Control((ControlType.SET_WINDOW_TITLE, "Hello, world!"))) - for i in range(10): - console.set_window_title("🚀 Loading" + "." * i) - time.sleep(0.5) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/default_styles.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/default_styles.py deleted file mode 100644 index ad72fff5..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/default_styles.py +++ /dev/null @@ -1,190 +0,0 @@ -from typing import Dict - -from .style import Style - -DEFAULT_STYLES: Dict[str, Style] = { - "none": Style.null(), - "reset": Style( - color="default", - bgcolor="default", - dim=False, - bold=False, - italic=False, - underline=False, - blink=False, - blink2=False, - reverse=False, - conceal=False, - strike=False, - ), - "dim": Style(dim=True), - "bright": Style(dim=False), - "bold": Style(bold=True), - "strong": Style(bold=True), - "code": Style(reverse=True, bold=True), - "italic": Style(italic=True), - "emphasize": Style(italic=True), - "underline": Style(underline=True), - "blink": Style(blink=True), - "blink2": Style(blink2=True), - "reverse": Style(reverse=True), - "strike": Style(strike=True), - "black": Style(color="black"), - "red": Style(color="red"), - "green": Style(color="green"), - "yellow": Style(color="yellow"), - "magenta": Style(color="magenta"), - "cyan": Style(color="cyan"), - "white": Style(color="white"), - "inspect.attr": Style(color="yellow", italic=True), - "inspect.attr.dunder": Style(color="yellow", italic=True, dim=True), - "inspect.callable": Style(bold=True, color="red"), - "inspect.async_def": Style(italic=True, color="bright_cyan"), - "inspect.def": Style(italic=True, color="bright_cyan"), - "inspect.class": Style(italic=True, color="bright_cyan"), - "inspect.error": Style(bold=True, color="red"), - "inspect.equals": Style(), - "inspect.help": Style(color="cyan"), - "inspect.doc": Style(dim=True), - "inspect.value.border": Style(color="green"), - "live.ellipsis": Style(bold=True, color="red"), - "layout.tree.row": Style(dim=False, color="red"), - "layout.tree.column": Style(dim=False, color="blue"), - "logging.keyword": Style(bold=True, color="yellow"), - "logging.level.notset": Style(dim=True), - "logging.level.debug": Style(color="green"), - "logging.level.info": Style(color="blue"), - "logging.level.warning": Style(color="red"), - "logging.level.error": Style(color="red", bold=True), - "logging.level.critical": Style(color="red", bold=True, reverse=True), - "log.level": Style.null(), - "log.time": Style(color="cyan", dim=True), - "log.message": Style.null(), - "log.path": Style(dim=True), - "repr.ellipsis": Style(color="yellow"), - "repr.indent": Style(color="green", dim=True), - "repr.error": Style(color="red", bold=True), - "repr.str": Style(color="green", italic=False, bold=False), - "repr.brace": Style(bold=True), - "repr.comma": Style(bold=True), - "repr.ipv4": Style(bold=True, color="bright_green"), - "repr.ipv6": Style(bold=True, color="bright_green"), - "repr.eui48": Style(bold=True, color="bright_green"), - "repr.eui64": Style(bold=True, color="bright_green"), - "repr.tag_start": Style(bold=True), - "repr.tag_name": Style(color="bright_magenta", bold=True), - "repr.tag_contents": Style(color="default"), - "repr.tag_end": Style(bold=True), - "repr.attrib_name": Style(color="yellow", italic=False), - "repr.attrib_equal": Style(bold=True), - "repr.attrib_value": Style(color="magenta", italic=False), - "repr.number": Style(color="cyan", bold=True, italic=False), - "repr.number_complex": Style(color="cyan", bold=True, italic=False), # same - "repr.bool_true": Style(color="bright_green", italic=True), - "repr.bool_false": Style(color="bright_red", italic=True), - "repr.none": Style(color="magenta", italic=True), - "repr.url": Style(underline=True, color="bright_blue", italic=False, bold=False), - "repr.uuid": Style(color="bright_yellow", bold=False), - "repr.call": Style(color="magenta", bold=True), - "repr.path": Style(color="magenta"), - "repr.filename": Style(color="bright_magenta"), - "rule.line": Style(color="bright_green"), - "rule.text": Style.null(), - "json.brace": Style(bold=True), - "json.bool_true": Style(color="bright_green", italic=True), - "json.bool_false": Style(color="bright_red", italic=True), - "json.null": Style(color="magenta", italic=True), - "json.number": Style(color="cyan", bold=True, italic=False), - "json.str": Style(color="green", italic=False, bold=False), - "json.key": Style(color="blue", bold=True), - "prompt": Style.null(), - "prompt.choices": Style(color="magenta", bold=True), - "prompt.default": Style(color="cyan", bold=True), - "prompt.invalid": Style(color="red"), - "prompt.invalid.choice": Style(color="red"), - "pretty": Style.null(), - "scope.border": Style(color="blue"), - "scope.key": Style(color="yellow", italic=True), - "scope.key.special": Style(color="yellow", italic=True, dim=True), - "scope.equals": Style(color="red"), - "table.header": Style(bold=True), - "table.footer": Style(bold=True), - "table.cell": Style.null(), - "table.title": Style(italic=True), - "table.caption": Style(italic=True, dim=True), - "traceback.error": Style(color="red", italic=True), - "traceback.border.syntax_error": Style(color="bright_red"), - "traceback.border": Style(color="red"), - "traceback.text": Style.null(), - "traceback.title": Style(color="red", bold=True), - "traceback.exc_type": Style(color="bright_red", bold=True), - "traceback.exc_value": Style.null(), - "traceback.offset": Style(color="bright_red", bold=True), - "bar.back": Style(color="grey23"), - "bar.complete": Style(color="rgb(249,38,114)"), - "bar.finished": Style(color="rgb(114,156,31)"), - "bar.pulse": Style(color="rgb(249,38,114)"), - "progress.description": Style.null(), - "progress.filesize": Style(color="green"), - "progress.filesize.total": Style(color="green"), - "progress.download": Style(color="green"), - "progress.elapsed": Style(color="yellow"), - "progress.percentage": Style(color="magenta"), - "progress.remaining": Style(color="cyan"), - "progress.data.speed": Style(color="red"), - "progress.spinner": Style(color="green"), - "status.spinner": Style(color="green"), - "tree": Style(), - "tree.line": Style(), - "markdown.paragraph": Style(), - "markdown.text": Style(), - "markdown.em": Style(italic=True), - "markdown.emph": Style(italic=True), # For commonmark backwards compatibility - "markdown.strong": Style(bold=True), - "markdown.code": Style(bold=True, color="cyan", bgcolor="black"), - "markdown.code_block": Style(color="cyan", bgcolor="black"), - "markdown.block_quote": Style(color="magenta"), - "markdown.list": Style(color="cyan"), - "markdown.item": Style(), - "markdown.item.bullet": Style(color="yellow", bold=True), - "markdown.item.number": Style(color="yellow", bold=True), - "markdown.hr": Style(color="yellow"), - "markdown.h1.border": Style(), - "markdown.h1": Style(bold=True), - "markdown.h2": Style(bold=True, underline=True), - "markdown.h3": Style(bold=True), - "markdown.h4": Style(bold=True, dim=True), - "markdown.h5": Style(underline=True), - "markdown.h6": Style(italic=True), - "markdown.h7": Style(italic=True, dim=True), - "markdown.link": Style(color="bright_blue"), - "markdown.link_url": Style(color="blue", underline=True), - "markdown.s": Style(strike=True), - "iso8601.date": Style(color="blue"), - "iso8601.time": Style(color="magenta"), - "iso8601.timezone": Style(color="yellow"), -} - - -if __name__ == "__main__": # pragma: no cover - import argparse - import io - - from rich.console import Console - from rich.table import Table - from rich.text import Text - - parser = argparse.ArgumentParser() - parser.add_argument("--html", action="store_true", help="Export as HTML table") - args = parser.parse_args() - html: bool = args.html - console = Console(record=True, width=70, file=io.StringIO()) if html else Console() - - table = Table("Name", "Styling") - - for style_name, style in DEFAULT_STYLES.items(): - table.add_row(Text(style_name, style=style), str(style)) - - console.print(table) - if html: - print(console.export_html(inline_styles=True)) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/diagnose.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/diagnose.py deleted file mode 100644 index 91e55bd8..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/diagnose.py +++ /dev/null @@ -1,37 +0,0 @@ -import os -import platform - -from rich import inspect -from rich.console import Console, get_windows_console_features -from rich.panel import Panel -from rich.pretty import Pretty - - -def report() -> None: # pragma: no cover - """Print a report to the terminal with debugging information""" - console = Console() - inspect(console) - features = get_windows_console_features() - inspect(features) - - env_names = ( - "TERM", - "COLORTERM", - "CLICOLOR", - "NO_COLOR", - "TERM_PROGRAM", - "COLUMNS", - "LINES", - "JUPYTER_COLUMNS", - "JUPYTER_LINES", - "JPY_PARENT_PID", - "VSCODE_VERBOSE_LOGGING", - ) - env = {name: os.getenv(name) for name in env_names} - console.print(Panel.fit((Pretty(env)), title="[b]Environment Variables")) - - console.print(f'platform="{platform.system()}"') - - -if __name__ == "__main__": # pragma: no cover - report() diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/emoji.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/emoji.py deleted file mode 100644 index d5a1062a..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/emoji.py +++ /dev/null @@ -1,96 +0,0 @@ -import sys -from typing import TYPE_CHECKING, Optional, Union - -from .jupyter import JupyterMixin -from .segment import Segment -from .style import Style -from ._emoji_codes import EMOJI -from ._emoji_replace import _emoji_replace - -if sys.version_info >= (3, 8): - from typing import Literal -else: - from typing_extensions import Literal # pragma: no cover - - -if TYPE_CHECKING: - from .console import Console, ConsoleOptions, RenderResult - - -EmojiVariant = Literal["emoji", "text"] - - -class NoEmoji(Exception): - """No emoji by that name.""" - - -class Emoji(JupyterMixin): - __slots__ = ["name", "style", "_char", "variant"] - - VARIANTS = {"text": "\uFE0E", "emoji": "\uFE0F"} - - def __init__( - self, - name: str, - style: Union[str, Style] = "none", - variant: Optional[EmojiVariant] = None, - ) -> None: - """A single emoji character. - - Args: - name (str): Name of emoji. - style (Union[str, Style], optional): Optional style. Defaults to None. - - Raises: - NoEmoji: If the emoji doesn't exist. - """ - self.name = name - self.style = style - self.variant = variant - try: - self._char = EMOJI[name] - except KeyError: - raise NoEmoji(f"No emoji called {name!r}") - if variant is not None: - self._char += self.VARIANTS.get(variant, "") - - @classmethod - def replace(cls, text: str) -> str: - """Replace emoji markup with corresponding unicode characters. - - Args: - text (str): A string with emojis codes, e.g. "Hello :smiley:!" - - Returns: - str: A string with emoji codes replaces with actual emoji. - """ - return _emoji_replace(text) - - def __repr__(self) -> str: - return f"<emoji {self.name!r}>" - - def __str__(self) -> str: - return self._char - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - yield Segment(self._char, console.get_style(self.style)) - - -if __name__ == "__main__": # pragma: no cover - import sys - - from rich.columns import Columns - from rich.console import Console - - console = Console(record=True) - - columns = Columns( - (f":{name}: {name}" for name in sorted(EMOJI.keys()) if "\u200D" not in name), - column_first=True, - ) - - console.print(columns) - if len(sys.argv) > 1: - console.save_html(sys.argv[1]) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/errors.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/errors.py deleted file mode 100644 index 0bcbe53e..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/errors.py +++ /dev/null @@ -1,34 +0,0 @@ -class ConsoleError(Exception): - """An error in console operation.""" - - -class StyleError(Exception): - """An error in styles.""" - - -class StyleSyntaxError(ConsoleError): - """Style was badly formatted.""" - - -class MissingStyle(StyleError): - """No such style.""" - - -class StyleStackError(ConsoleError): - """Style stack is invalid.""" - - -class NotRenderableError(ConsoleError): - """Object is not renderable.""" - - -class MarkupError(ConsoleError): - """Markup was badly formatted.""" - - -class LiveError(ConsoleError): - """Error related to Live display.""" - - -class NoAltScreen(ConsoleError): - """Alt screen mode was required.""" diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/file_proxy.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/file_proxy.py deleted file mode 100644 index 4b0b0da6..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/file_proxy.py +++ /dev/null @@ -1,57 +0,0 @@ -import io -from typing import IO, TYPE_CHECKING, Any, List - -from .ansi import AnsiDecoder -from .text import Text - -if TYPE_CHECKING: - from .console import Console - - -class FileProxy(io.TextIOBase): - """Wraps a file (e.g. sys.stdout) and redirects writes to a console.""" - - def __init__(self, console: "Console", file: IO[str]) -> None: - self.__console = console - self.__file = file - self.__buffer: List[str] = [] - self.__ansi_decoder = AnsiDecoder() - - @property - def rich_proxied_file(self) -> IO[str]: - """Get proxied file.""" - return self.__file - - def __getattr__(self, name: str) -> Any: - return getattr(self.__file, name) - - def write(self, text: str) -> int: - if not isinstance(text, str): - raise TypeError(f"write() argument must be str, not {type(text).__name__}") - buffer = self.__buffer - lines: List[str] = [] - while text: - line, new_line, text = text.partition("\n") - if new_line: - lines.append("".join(buffer) + line) - buffer.clear() - else: - buffer.append(line) - break - if lines: - console = self.__console - with console: - output = Text("\n").join( - self.__ansi_decoder.decode_line(line) for line in lines - ) - console.print(output) - return len(text) - - def flush(self) -> None: - output = "".join(self.__buffer) - if output: - self.__console.print(output) - del self.__buffer[:] - - def fileno(self) -> int: - return self.__file.fileno() diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/filesize.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/filesize.py deleted file mode 100644 index 99f118e2..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/filesize.py +++ /dev/null @@ -1,89 +0,0 @@ -# coding: utf-8 -"""Functions for reporting filesizes. Borrowed from https://github.com/PyFilesystem/pyfilesystem2 - -The functions declared in this module should cover the different -use cases needed to generate a string representation of a file size -using several different units. Since there are many standards regarding -file size units, three different functions have been implemented. - -See Also: - * `Wikipedia: Binary prefix <https://en.wikipedia.org/wiki/Binary_prefix>`_ - -""" - -__all__ = ["decimal"] - -from typing import Iterable, List, Optional, Tuple - - -def _to_str( - size: int, - suffixes: Iterable[str], - base: int, - *, - precision: Optional[int] = 1, - separator: Optional[str] = " ", -) -> str: - if size == 1: - return "1 byte" - elif size < base: - return "{:,} bytes".format(size) - - for i, suffix in enumerate(suffixes, 2): # noqa: B007 - unit = base**i - if size < unit: - break - return "{:,.{precision}f}{separator}{}".format( - (base * size / unit), - suffix, - precision=precision, - separator=separator, - ) - - -def pick_unit_and_suffix(size: int, suffixes: List[str], base: int) -> Tuple[int, str]: - """Pick a suffix and base for the given size.""" - for i, suffix in enumerate(suffixes): - unit = base**i - if size < unit * base: - break - return unit, suffix - - -def decimal( - size: int, - *, - precision: Optional[int] = 1, - separator: Optional[str] = " ", -) -> str: - """Convert a filesize in to a string (powers of 1000, SI prefixes). - - In this convention, ``1000 B = 1 kB``. - - This is typically the format used to advertise the storage - capacity of USB flash drives and the like (*256 MB* meaning - actually a storage capacity of more than *256 000 000 B*), - or used by **Mac OS X** since v10.6 to report file sizes. - - Arguments: - int (size): A file size. - int (precision): The number of decimal places to include (default = 1). - str (separator): The string to separate the value from the units (default = " "). - - Returns: - `str`: A string containing a abbreviated file size and units. - - Example: - >>> filesize.decimal(30000) - '30.0 kB' - >>> filesize.decimal(30000, precision=2, separator="") - '30.00kB' - - """ - return _to_str( - size, - ("kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"), - 1000, - precision=precision, - separator=separator, - ) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/highlighter.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/highlighter.py deleted file mode 100644 index c2646794..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/highlighter.py +++ /dev/null @@ -1,232 +0,0 @@ -import re -from abc import ABC, abstractmethod -from typing import List, Union - -from .text import Span, Text - - -def _combine_regex(*regexes: str) -> str: - """Combine a number of regexes in to a single regex. - - Returns: - str: New regex with all regexes ORed together. - """ - return "|".join(regexes) - - -class Highlighter(ABC): - """Abstract base class for highlighters.""" - - def __call__(self, text: Union[str, Text]) -> Text: - """Highlight a str or Text instance. - - Args: - text (Union[str, ~Text]): Text to highlight. - - Raises: - TypeError: If not called with text or str. - - Returns: - Text: A test instance with highlighting applied. - """ - if isinstance(text, str): - highlight_text = Text(text) - elif isinstance(text, Text): - highlight_text = text.copy() - else: - raise TypeError(f"str or Text instance required, not {text!r}") - self.highlight(highlight_text) - return highlight_text - - @abstractmethod - def highlight(self, text: Text) -> None: - """Apply highlighting in place to text. - - Args: - text (~Text): A text object highlight. - """ - - -class NullHighlighter(Highlighter): - """A highlighter object that doesn't highlight. - - May be used to disable highlighting entirely. - - """ - - def highlight(self, text: Text) -> None: - """Nothing to do""" - - -class RegexHighlighter(Highlighter): - """Applies highlighting from a list of regular expressions.""" - - highlights: List[str] = [] - base_style: str = "" - - def highlight(self, text: Text) -> None: - """Highlight :class:`rich.text.Text` using regular expressions. - - Args: - text (~Text): Text to highlighted. - - """ - - highlight_regex = text.highlight_regex - for re_highlight in self.highlights: - highlight_regex(re_highlight, style_prefix=self.base_style) - - -class ReprHighlighter(RegexHighlighter): - """Highlights the text typically produced from ``__repr__`` methods.""" - - base_style = "repr." - highlights = [ - r"(?P<tag_start><)(?P<tag_name>[-\w.:|]*)(?P<tag_contents>[\w\W]*)(?P<tag_end>>)", - r'(?P<attrib_name>[\w_]{1,50})=(?P<attrib_value>"?[\w_]+"?)?', - r"(?P<brace>[][{}()])", - _combine_regex( - r"(?P<ipv4>[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})", - r"(?P<ipv6>([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4})", - r"(?P<eui64>(?:[0-9A-Fa-f]{1,2}-){7}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{1,2}:){7}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{4}\.){3}[0-9A-Fa-f]{4})", - r"(?P<eui48>(?:[0-9A-Fa-f]{1,2}-){5}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{1,2}:){5}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4})", - r"(?P<uuid>[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12})", - r"(?P<call>[\w.]*?)\(", - r"\b(?P<bool_true>True)\b|\b(?P<bool_false>False)\b|\b(?P<none>None)\b", - r"(?P<ellipsis>\.\.\.)", - r"(?P<number_complex>(?<!\w)(?:\-?[0-9]+\.?[0-9]*(?:e[-+]?\d+?)?)(?:[-+](?:[0-9]+\.?[0-9]*(?:e[-+]?\d+)?))?j)", - r"(?P<number>(?<!\w)\-?[0-9]+\.?[0-9]*(e[-+]?\d+?)?\b|0x[0-9a-fA-F]*)", - r"(?P<path>\B(/[-\w._+]+)*\/)(?P<filename>[-\w._+]*)?", - r"(?<![\\\w])(?P<str>b?'''.*?(?<!\\)'''|b?'.*?(?<!\\)'|b?\"\"\".*?(?<!\\)\"\"\"|b?\".*?(?<!\\)\")", - r"(?P<url>(file|https|http|ws|wss)://[-0-9a-zA-Z$_+!`(),.?/;:&=%#]*)", - ), - ] - - -class JSONHighlighter(RegexHighlighter): - """Highlights JSON""" - - # Captures the start and end of JSON strings, handling escaped quotes - JSON_STR = r"(?<![\\\w])(?P<str>b?\".*?(?<!\\)\")" - JSON_WHITESPACE = {" ", "\n", "\r", "\t"} - - base_style = "json." - highlights = [ - _combine_regex( - r"(?P<brace>[\{\[\(\)\]\}])", - r"\b(?P<bool_true>true)\b|\b(?P<bool_false>false)\b|\b(?P<null>null)\b", - r"(?P<number>(?<!\w)\-?[0-9]+\.?[0-9]*(e[\-\+]?\d+?)?\b|0x[0-9a-fA-F]*)", - JSON_STR, - ), - ] - - def highlight(self, text: Text) -> None: - super().highlight(text) - - # Additional work to handle highlighting JSON keys - plain = text.plain - append = text.spans.append - whitespace = self.JSON_WHITESPACE - for match in re.finditer(self.JSON_STR, plain): - start, end = match.span() - cursor = end - while cursor < len(plain): - char = plain[cursor] - cursor += 1 - if char == ":": - append(Span(start, end, "json.key")) - elif char in whitespace: - continue - break - - -class ISO8601Highlighter(RegexHighlighter): - """Highlights the ISO8601 date time strings. - Regex reference: https://www.oreilly.com/library/view/regular-expressions-cookbook/9781449327453/ch04s07.html - """ - - base_style = "iso8601." - highlights = [ - # - # Dates - # - # Calendar month (e.g. 2008-08). The hyphen is required - r"^(?P<year>[0-9]{4})-(?P<month>1[0-2]|0[1-9])$", - # Calendar date w/o hyphens (e.g. 20080830) - r"^(?P<date>(?P<year>[0-9]{4})(?P<month>1[0-2]|0[1-9])(?P<day>3[01]|0[1-9]|[12][0-9]))$", - # Ordinal date (e.g. 2008-243). The hyphen is optional - r"^(?P<date>(?P<year>[0-9]{4})-?(?P<day>36[0-6]|3[0-5][0-9]|[12][0-9]{2}|0[1-9][0-9]|00[1-9]))$", - # - # Weeks - # - # Week of the year (e.g., 2008-W35). The hyphen is optional - r"^(?P<date>(?P<year>[0-9]{4})-?W(?P<week>5[0-3]|[1-4][0-9]|0[1-9]))$", - # Week date (e.g., 2008-W35-6). The hyphens are optional - r"^(?P<date>(?P<year>[0-9]{4})-?W(?P<week>5[0-3]|[1-4][0-9]|0[1-9])-?(?P<day>[1-7]))$", - # - # Times - # - # Hours and minutes (e.g., 17:21). The colon is optional - r"^(?P<time>(?P<hour>2[0-3]|[01][0-9]):?(?P<minute>[0-5][0-9]))$", - # Hours, minutes, and seconds w/o colons (e.g., 172159) - r"^(?P<time>(?P<hour>2[0-3]|[01][0-9])(?P<minute>[0-5][0-9])(?P<second>[0-5][0-9]))$", - # Time zone designator (e.g., Z, +07 or +07:00). The colons and the minutes are optional - r"^(?P<timezone>(Z|[+-](?:2[0-3]|[01][0-9])(?::?(?:[0-5][0-9]))?))$", - # Hours, minutes, and seconds with time zone designator (e.g., 17:21:59+07:00). - # All the colons are optional. The minutes in the time zone designator are also optional - r"^(?P<time>(?P<hour>2[0-3]|[01][0-9])(?P<minute>[0-5][0-9])(?P<second>[0-5][0-9]))(?P<timezone>Z|[+-](?:2[0-3]|[01][0-9])(?::?(?:[0-5][0-9]))?)$", - # - # Date and Time - # - # Calendar date with hours, minutes, and seconds (e.g., 2008-08-30 17:21:59 or 20080830 172159). - # A space is required between the date and the time. The hyphens and colons are optional. - # This regex matches dates and times that specify some hyphens or colons but omit others. - # This does not follow ISO 8601 - r"^(?P<date>(?P<year>[0-9]{4})(?P<hyphen>-)?(?P<month>1[0-2]|0[1-9])(?(hyphen)-)(?P<day>3[01]|0[1-9]|[12][0-9])) (?P<time>(?P<hour>2[0-3]|[01][0-9])(?(hyphen):)(?P<minute>[0-5][0-9])(?(hyphen):)(?P<second>[0-5][0-9]))$", - # - # XML Schema dates and times - # - # Date, with optional time zone (e.g., 2008-08-30 or 2008-08-30+07:00). - # Hyphens are required. This is the XML Schema 'date' type - r"^(?P<date>(?P<year>-?(?:[1-9][0-9]*)?[0-9]{4})-(?P<month>1[0-2]|0[1-9])-(?P<day>3[01]|0[1-9]|[12][0-9]))(?P<timezone>Z|[+-](?:2[0-3]|[01][0-9]):[0-5][0-9])?$", - # Time, with optional fractional seconds and time zone (e.g., 01:45:36 or 01:45:36.123+07:00). - # There is no limit on the number of digits for the fractional seconds. This is the XML Schema 'time' type - r"^(?P<time>(?P<hour>2[0-3]|[01][0-9]):(?P<minute>[0-5][0-9]):(?P<second>[0-5][0-9])(?P<frac>\.[0-9]+)?)(?P<timezone>Z|[+-](?:2[0-3]|[01][0-9]):[0-5][0-9])?$", - # Date and time, with optional fractional seconds and time zone (e.g., 2008-08-30T01:45:36 or 2008-08-30T01:45:36.123Z). - # This is the XML Schema 'dateTime' type - r"^(?P<date>(?P<year>-?(?:[1-9][0-9]*)?[0-9]{4})-(?P<month>1[0-2]|0[1-9])-(?P<day>3[01]|0[1-9]|[12][0-9]))T(?P<time>(?P<hour>2[0-3]|[01][0-9]):(?P<minute>[0-5][0-9]):(?P<second>[0-5][0-9])(?P<ms>\.[0-9]+)?)(?P<timezone>Z|[+-](?:2[0-3]|[01][0-9]):[0-5][0-9])?$", - ] - - -if __name__ == "__main__": # pragma: no cover - from .console import Console - - console = Console() - console.print("[bold green]hello world![/bold green]") - console.print("'[bold green]hello world![/bold green]'") - - console.print(" /foo") - console.print("/foo/") - console.print("/foo/bar") - console.print("foo/bar/baz") - - console.print("/foo/bar/baz?foo=bar+egg&egg=baz") - console.print("/foo/bar/baz/") - console.print("/foo/bar/baz/egg") - console.print("/foo/bar/baz/egg.py") - console.print("/foo/bar/baz/egg.py word") - console.print(" /foo/bar/baz/egg.py word") - console.print("foo /foo/bar/baz/egg.py word") - console.print("foo /foo/bar/ba._++z/egg+.py word") - console.print("https://example.org?foo=bar#header") - - console.print(1234567.34) - console.print(1 / 2) - console.print(-1 / 123123123123) - - console.print( - "127.0.1.1 bar 192.168.1.4 2001:0db8:85a3:0000:0000:8a2e:0370:7334 foo" - ) - import json - - console.print_json(json.dumps(obj={"name": "apple", "count": 1}), indent=None) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/json.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/json.py deleted file mode 100644 index 24dc5e60..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/json.py +++ /dev/null @@ -1,140 +0,0 @@ -from pathlib import Path -from json import loads, dumps -from typing import Any, Callable, Optional, Union - -from .text import Text -from .highlighter import JSONHighlighter, NullHighlighter - - -class JSON: - """A renderable which pretty prints JSON. - - Args: - json (str): JSON encoded data. - indent (Union[None, int, str], optional): Number of characters to indent by. Defaults to 2. - highlight (bool, optional): Enable highlighting. Defaults to True. - skip_keys (bool, optional): Skip keys not of a basic type. Defaults to False. - ensure_ascii (bool, optional): Escape all non-ascii characters. Defaults to False. - check_circular (bool, optional): Check for circular references. Defaults to True. - allow_nan (bool, optional): Allow NaN and Infinity values. Defaults to True. - default (Callable, optional): A callable that converts values that can not be encoded - in to something that can be JSON encoded. Defaults to None. - sort_keys (bool, optional): Sort dictionary keys. Defaults to False. - """ - - def __init__( - self, - json: str, - indent: Union[None, int, str] = 2, - highlight: bool = True, - skip_keys: bool = False, - ensure_ascii: bool = False, - check_circular: bool = True, - allow_nan: bool = True, - default: Optional[Callable[[Any], Any]] = None, - sort_keys: bool = False, - ) -> None: - data = loads(json) - json = dumps( - data, - indent=indent, - skipkeys=skip_keys, - ensure_ascii=ensure_ascii, - check_circular=check_circular, - allow_nan=allow_nan, - default=default, - sort_keys=sort_keys, - ) - highlighter = JSONHighlighter() if highlight else NullHighlighter() - self.text = highlighter(json) - self.text.no_wrap = True - self.text.overflow = None - - @classmethod - def from_data( - cls, - data: Any, - indent: Union[None, int, str] = 2, - highlight: bool = True, - skip_keys: bool = False, - ensure_ascii: bool = False, - check_circular: bool = True, - allow_nan: bool = True, - default: Optional[Callable[[Any], Any]] = None, - sort_keys: bool = False, - ) -> "JSON": - """Encodes a JSON object from arbitrary data. - - Args: - data (Any): An object that may be encoded in to JSON - indent (Union[None, int, str], optional): Number of characters to indent by. Defaults to 2. - highlight (bool, optional): Enable highlighting. Defaults to True. - default (Callable, optional): Optional callable which will be called for objects that cannot be serialized. Defaults to None. - skip_keys (bool, optional): Skip keys not of a basic type. Defaults to False. - ensure_ascii (bool, optional): Escape all non-ascii characters. Defaults to False. - check_circular (bool, optional): Check for circular references. Defaults to True. - allow_nan (bool, optional): Allow NaN and Infinity values. Defaults to True. - default (Callable, optional): A callable that converts values that can not be encoded - in to something that can be JSON encoded. Defaults to None. - sort_keys (bool, optional): Sort dictionary keys. Defaults to False. - - Returns: - JSON: New JSON object from the given data. - """ - json_instance: "JSON" = cls.__new__(cls) - json = dumps( - data, - indent=indent, - skipkeys=skip_keys, - ensure_ascii=ensure_ascii, - check_circular=check_circular, - allow_nan=allow_nan, - default=default, - sort_keys=sort_keys, - ) - highlighter = JSONHighlighter() if highlight else NullHighlighter() - json_instance.text = highlighter(json) - json_instance.text.no_wrap = True - json_instance.text.overflow = None - return json_instance - - def __rich__(self) -> Text: - return self.text - - -if __name__ == "__main__": - - import argparse - import sys - - parser = argparse.ArgumentParser(description="Pretty print json") - parser.add_argument( - "path", - metavar="PATH", - help="path to file, or - for stdin", - ) - parser.add_argument( - "-i", - "--indent", - metavar="SPACES", - type=int, - help="Number of spaces in an indent", - default=2, - ) - args = parser.parse_args() - - from rich.console import Console - - console = Console() - error_console = Console(stderr=True) - - try: - if args.path == "-": - json_data = sys.stdin.read() - else: - json_data = Path(args.path).read_text() - except Exception as error: - error_console.print(f"Unable to read {args.path!r}; {error}") - sys.exit(-1) - - console.print(JSON(json_data, indent=args.indent), soft_wrap=True) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/jupyter.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/jupyter.py deleted file mode 100644 index 24135a9f..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/jupyter.py +++ /dev/null @@ -1,101 +0,0 @@ -from typing import TYPE_CHECKING, Any, Dict, Iterable, List, Sequence - -if TYPE_CHECKING: - from rich.console import ConsoleRenderable - -from . import get_console -from .segment import Segment -from .terminal_theme import DEFAULT_TERMINAL_THEME - -if TYPE_CHECKING: - from rich.console import ConsoleRenderable - -JUPYTER_HTML_FORMAT = """\ -<pre style="white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace">{code}</pre> -""" - - -class JupyterRenderable: - """A shim to write html to Jupyter notebook.""" - - def __init__(self, html: str, text: str) -> None: - self.html = html - self.text = text - - def _repr_mimebundle_( - self, include: Sequence[str], exclude: Sequence[str], **kwargs: Any - ) -> Dict[str, str]: - data = {"text/plain": self.text, "text/html": self.html} - if include: - data = {k: v for (k, v) in data.items() if k in include} - if exclude: - data = {k: v for (k, v) in data.items() if k not in exclude} - return data - - -class JupyterMixin: - """Add to an Rich renderable to make it render in Jupyter notebook.""" - - __slots__ = () - - def _repr_mimebundle_( - self: "ConsoleRenderable", - include: Sequence[str], - exclude: Sequence[str], - **kwargs: Any, - ) -> Dict[str, str]: - console = get_console() - segments = list(console.render(self, console.options)) - html = _render_segments(segments) - text = console._render_buffer(segments) - data = {"text/plain": text, "text/html": html} - if include: - data = {k: v for (k, v) in data.items() if k in include} - if exclude: - data = {k: v for (k, v) in data.items() if k not in exclude} - return data - - -def _render_segments(segments: Iterable[Segment]) -> str: - def escape(text: str) -> str: - """Escape html.""" - return text.replace("&", "&").replace("<", "<").replace(">", ">") - - fragments: List[str] = [] - append_fragment = fragments.append - theme = DEFAULT_TERMINAL_THEME - for text, style, control in Segment.simplify(segments): - if control: - continue - text = escape(text) - if style: - rule = style.get_html_style(theme) - text = f'<span style="{rule}">{text}</span>' if rule else text - if style.link: - text = f'<a href="{style.link}" target="_blank">{text}</a>' - append_fragment(text) - - code = "".join(fragments) - html = JUPYTER_HTML_FORMAT.format(code=code) - - return html - - -def display(segments: Iterable[Segment], text: str) -> None: - """Render segments to Jupyter.""" - html = _render_segments(segments) - jupyter_renderable = JupyterRenderable(html, text) - try: - from IPython.display import display as ipython_display - - ipython_display(jupyter_renderable) - except ModuleNotFoundError: - # Handle the case where the Console has force_jupyter=True, - # but IPython is not installed. - pass - - -def print(*args: Any, **kwargs: Any) -> None: - """Proxy for Console print.""" - console = get_console() - return console.print(*args, **kwargs) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/layout.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/layout.py deleted file mode 100644 index 50ebd188..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/layout.py +++ /dev/null @@ -1,443 +0,0 @@ -from abc import ABC, abstractmethod -from itertools import islice -from operator import itemgetter -from threading import RLock -from typing import ( - TYPE_CHECKING, - Dict, - Iterable, - List, - NamedTuple, - Optional, - Sequence, - Tuple, - Union, -) - -from ._ratio import ratio_resolve -from .align import Align -from .console import Console, ConsoleOptions, RenderableType, RenderResult -from .highlighter import ReprHighlighter -from .panel import Panel -from .pretty import Pretty -from .region import Region -from .repr import Result, rich_repr -from .segment import Segment -from .style import StyleType - -if TYPE_CHECKING: - from rich.tree import Tree - - -class LayoutRender(NamedTuple): - """An individual layout render.""" - - region: Region - render: List[List[Segment]] - - -RegionMap = Dict["Layout", Region] -RenderMap = Dict["Layout", LayoutRender] - - -class LayoutError(Exception): - """Layout related error.""" - - -class NoSplitter(LayoutError): - """Requested splitter does not exist.""" - - -class _Placeholder: - """An internal renderable used as a Layout placeholder.""" - - highlighter = ReprHighlighter() - - def __init__(self, layout: "Layout", style: StyleType = "") -> None: - self.layout = layout - self.style = style - - def __rich_console__( - self, console: Console, options: ConsoleOptions - ) -> RenderResult: - width = options.max_width - height = options.height or options.size.height - layout = self.layout - title = ( - f"{layout.name!r} ({width} x {height})" - if layout.name - else f"({width} x {height})" - ) - yield Panel( - Align.center(Pretty(layout), vertical="middle"), - style=self.style, - title=self.highlighter(title), - border_style="blue", - height=height, - ) - - -class Splitter(ABC): - """Base class for a splitter.""" - - name: str = "" - - @abstractmethod - def get_tree_icon(self) -> str: - """Get the icon (emoji) used in layout.tree""" - - @abstractmethod - def divide( - self, children: Sequence["Layout"], region: Region - ) -> Iterable[Tuple["Layout", Region]]: - """Divide a region amongst several child layouts. - - Args: - children (Sequence(Layout)): A number of child layouts. - region (Region): A rectangular region to divide. - """ - - -class RowSplitter(Splitter): - """Split a layout region in to rows.""" - - name = "row" - - def get_tree_icon(self) -> str: - return "[layout.tree.row]⬌" - - def divide( - self, children: Sequence["Layout"], region: Region - ) -> Iterable[Tuple["Layout", Region]]: - x, y, width, height = region - render_widths = ratio_resolve(width, children) - offset = 0 - _Region = Region - for child, child_width in zip(children, render_widths): - yield child, _Region(x + offset, y, child_width, height) - offset += child_width - - -class ColumnSplitter(Splitter): - """Split a layout region in to columns.""" - - name = "column" - - def get_tree_icon(self) -> str: - return "[layout.tree.column]⬍" - - def divide( - self, children: Sequence["Layout"], region: Region - ) -> Iterable[Tuple["Layout", Region]]: - x, y, width, height = region - render_heights = ratio_resolve(height, children) - offset = 0 - _Region = Region - for child, child_height in zip(children, render_heights): - yield child, _Region(x, y + offset, width, child_height) - offset += child_height - - -@rich_repr -class Layout: - """A renderable to divide a fixed height in to rows or columns. - - Args: - renderable (RenderableType, optional): Renderable content, or None for placeholder. Defaults to None. - name (str, optional): Optional identifier for Layout. Defaults to None. - size (int, optional): Optional fixed size of layout. Defaults to None. - minimum_size (int, optional): Minimum size of layout. Defaults to 1. - ratio (int, optional): Optional ratio for flexible layout. Defaults to 1. - visible (bool, optional): Visibility of layout. Defaults to True. - """ - - splitters = {"row": RowSplitter, "column": ColumnSplitter} - - def __init__( - self, - renderable: Optional[RenderableType] = None, - *, - name: Optional[str] = None, - size: Optional[int] = None, - minimum_size: int = 1, - ratio: int = 1, - visible: bool = True, - ) -> None: - self._renderable = renderable or _Placeholder(self) - self.size = size - self.minimum_size = minimum_size - self.ratio = ratio - self.name = name - self.visible = visible - self.splitter: Splitter = self.splitters["column"]() - self._children: List[Layout] = [] - self._render_map: RenderMap = {} - self._lock = RLock() - - def __rich_repr__(self) -> Result: - yield "name", self.name, None - yield "size", self.size, None - yield "minimum_size", self.minimum_size, 1 - yield "ratio", self.ratio, 1 - - @property - def renderable(self) -> RenderableType: - """Layout renderable.""" - return self if self._children else self._renderable - - @property - def children(self) -> List["Layout"]: - """Gets (visible) layout children.""" - return [child for child in self._children if child.visible] - - @property - def map(self) -> RenderMap: - """Get a map of the last render.""" - return self._render_map - - def get(self, name: str) -> Optional["Layout"]: - """Get a named layout, or None if it doesn't exist. - - Args: - name (str): Name of layout. - - Returns: - Optional[Layout]: Layout instance or None if no layout was found. - """ - if self.name == name: - return self - else: - for child in self._children: - named_layout = child.get(name) - if named_layout is not None: - return named_layout - return None - - def __getitem__(self, name: str) -> "Layout": - layout = self.get(name) - if layout is None: - raise KeyError(f"No layout with name {name!r}") - return layout - - @property - def tree(self) -> "Tree": - """Get a tree renderable to show layout structure.""" - from rich.styled import Styled - from rich.table import Table - from rich.tree import Tree - - def summary(layout: "Layout") -> Table: - - icon = layout.splitter.get_tree_icon() - - table = Table.grid(padding=(0, 1, 0, 0)) - - text: RenderableType = ( - Pretty(layout) if layout.visible else Styled(Pretty(layout), "dim") - ) - table.add_row(icon, text) - _summary = table - return _summary - - layout = self - tree = Tree( - summary(layout), - guide_style=f"layout.tree.{layout.splitter.name}", - highlight=True, - ) - - def recurse(tree: "Tree", layout: "Layout") -> None: - for child in layout._children: - recurse( - tree.add( - summary(child), - guide_style=f"layout.tree.{child.splitter.name}", - ), - child, - ) - - recurse(tree, self) - return tree - - def split( - self, - *layouts: Union["Layout", RenderableType], - splitter: Union[Splitter, str] = "column", - ) -> None: - """Split the layout in to multiple sub-layouts. - - Args: - *layouts (Layout): Positional arguments should be (sub) Layout instances. - splitter (Union[Splitter, str]): Splitter instance or name of splitter. - """ - _layouts = [ - layout if isinstance(layout, Layout) else Layout(layout) - for layout in layouts - ] - try: - self.splitter = ( - splitter - if isinstance(splitter, Splitter) - else self.splitters[splitter]() - ) - except KeyError: - raise NoSplitter(f"No splitter called {splitter!r}") - self._children[:] = _layouts - - def add_split(self, *layouts: Union["Layout", RenderableType]) -> None: - """Add a new layout(s) to existing split. - - Args: - *layouts (Union[Layout, RenderableType]): Positional arguments should be renderables or (sub) Layout instances. - - """ - _layouts = ( - layout if isinstance(layout, Layout) else Layout(layout) - for layout in layouts - ) - self._children.extend(_layouts) - - def split_row(self, *layouts: Union["Layout", RenderableType]) -> None: - """Split the layout in to a row (layouts side by side). - - Args: - *layouts (Layout): Positional arguments should be (sub) Layout instances. - """ - self.split(*layouts, splitter="row") - - def split_column(self, *layouts: Union["Layout", RenderableType]) -> None: - """Split the layout in to a column (layouts stacked on top of each other). - - Args: - *layouts (Layout): Positional arguments should be (sub) Layout instances. - """ - self.split(*layouts, splitter="column") - - def unsplit(self) -> None: - """Reset splits to initial state.""" - del self._children[:] - - def update(self, renderable: RenderableType) -> None: - """Update renderable. - - Args: - renderable (RenderableType): New renderable object. - """ - with self._lock: - self._renderable = renderable - - def refresh_screen(self, console: "Console", layout_name: str) -> None: - """Refresh a sub-layout. - - Args: - console (Console): Console instance where Layout is to be rendered. - layout_name (str): Name of layout. - """ - with self._lock: - layout = self[layout_name] - region, _lines = self._render_map[layout] - (x, y, width, height) = region - lines = console.render_lines( - layout, console.options.update_dimensions(width, height) - ) - self._render_map[layout] = LayoutRender(region, lines) - console.update_screen_lines(lines, x, y) - - def _make_region_map(self, width: int, height: int) -> RegionMap: - """Create a dict that maps layout on to Region.""" - stack: List[Tuple[Layout, Region]] = [(self, Region(0, 0, width, height))] - push = stack.append - pop = stack.pop - layout_regions: List[Tuple[Layout, Region]] = [] - append_layout_region = layout_regions.append - while stack: - append_layout_region(pop()) - layout, region = layout_regions[-1] - children = layout.children - if children: - for child_and_region in layout.splitter.divide(children, region): - push(child_and_region) - - region_map = { - layout: region - for layout, region in sorted(layout_regions, key=itemgetter(1)) - } - return region_map - - def render(self, console: Console, options: ConsoleOptions) -> RenderMap: - """Render the sub_layouts. - - Args: - console (Console): Console instance. - options (ConsoleOptions): Console options. - - Returns: - RenderMap: A dict that maps Layout on to a tuple of Region, lines - """ - render_width = options.max_width - render_height = options.height or console.height - region_map = self._make_region_map(render_width, render_height) - layout_regions = [ - (layout, region) - for layout, region in region_map.items() - if not layout.children - ] - render_map: Dict["Layout", "LayoutRender"] = {} - render_lines = console.render_lines - update_dimensions = options.update_dimensions - - for layout, region in layout_regions: - lines = render_lines( - layout.renderable, update_dimensions(region.width, region.height) - ) - render_map[layout] = LayoutRender(region, lines) - return render_map - - def __rich_console__( - self, console: Console, options: ConsoleOptions - ) -> RenderResult: - with self._lock: - width = options.max_width or console.width - height = options.height or console.height - render_map = self.render(console, options.update_dimensions(width, height)) - self._render_map = render_map - layout_lines: List[List[Segment]] = [[] for _ in range(height)] - _islice = islice - for (region, lines) in render_map.values(): - _x, y, _layout_width, layout_height = region - for row, line in zip( - _islice(layout_lines, y, y + layout_height), lines - ): - row.extend(line) - - new_line = Segment.line() - for layout_row in layout_lines: - yield from layout_row - yield new_line - - -if __name__ == "__main__": - from rich.console import Console - - console = Console() - layout = Layout() - - layout.split_column( - Layout(name="header", size=3), - Layout(ratio=1, name="main"), - Layout(size=10, name="footer"), - ) - - layout["main"].split_row(Layout(name="side"), Layout(name="body", ratio=2)) - - layout["body"].split_row(Layout(name="content", ratio=2), Layout(name="s2")) - - layout["s2"].split_column( - Layout(name="top"), Layout(name="middle"), Layout(name="bottom") - ) - - layout["side"].split_column(Layout(layout.tree, name="left1"), Layout(name="left2")) - - layout["content"].update("foo") - - console.print(layout) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/live.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/live.py deleted file mode 100644 index 3ebbbc4c..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/live.py +++ /dev/null @@ -1,375 +0,0 @@ -import sys -from threading import Event, RLock, Thread -from types import TracebackType -from typing import IO, Any, Callable, List, Optional, TextIO, Type, cast - -from . import get_console -from .console import Console, ConsoleRenderable, RenderableType, RenderHook -from .control import Control -from .file_proxy import FileProxy -from .jupyter import JupyterMixin -from .live_render import LiveRender, VerticalOverflowMethod -from .screen import Screen -from .text import Text - - -class _RefreshThread(Thread): - """A thread that calls refresh() at regular intervals.""" - - def __init__(self, live: "Live", refresh_per_second: float) -> None: - self.live = live - self.refresh_per_second = refresh_per_second - self.done = Event() - super().__init__(daemon=True) - - def stop(self) -> None: - self.done.set() - - def run(self) -> None: - while not self.done.wait(1 / self.refresh_per_second): - with self.live._lock: - if not self.done.is_set(): - self.live.refresh() - - -class Live(JupyterMixin, RenderHook): - """Renders an auto-updating live display of any given renderable. - - Args: - renderable (RenderableType, optional): The renderable to live display. Defaults to displaying nothing. - console (Console, optional): Optional Console instance. Default will an internal Console instance writing to stdout. - screen (bool, optional): Enable alternate screen mode. Defaults to False. - auto_refresh (bool, optional): Enable auto refresh. If disabled, you will need to call `refresh()` or `update()` with refresh flag. Defaults to True - refresh_per_second (float, optional): Number of times per second to refresh the live display. Defaults to 4. - transient (bool, optional): Clear the renderable on exit (has no effect when screen=True). Defaults to False. - redirect_stdout (bool, optional): Enable redirection of stdout, so ``print`` may be used. Defaults to True. - redirect_stderr (bool, optional): Enable redirection of stderr. Defaults to True. - vertical_overflow (VerticalOverflowMethod, optional): How to handle renderable when it is too tall for the console. Defaults to "ellipsis". - get_renderable (Callable[[], RenderableType], optional): Optional callable to get renderable. Defaults to None. - """ - - def __init__( - self, - renderable: Optional[RenderableType] = None, - *, - console: Optional[Console] = None, - screen: bool = False, - auto_refresh: bool = True, - refresh_per_second: float = 4, - transient: bool = False, - redirect_stdout: bool = True, - redirect_stderr: bool = True, - vertical_overflow: VerticalOverflowMethod = "ellipsis", - get_renderable: Optional[Callable[[], RenderableType]] = None, - ) -> None: - assert refresh_per_second > 0, "refresh_per_second must be > 0" - self._renderable = renderable - self.console = console if console is not None else get_console() - self._screen = screen - self._alt_screen = False - - self._redirect_stdout = redirect_stdout - self._redirect_stderr = redirect_stderr - self._restore_stdout: Optional[IO[str]] = None - self._restore_stderr: Optional[IO[str]] = None - - self._lock = RLock() - self.ipy_widget: Optional[Any] = None - self.auto_refresh = auto_refresh - self._started: bool = False - self.transient = True if screen else transient - - self._refresh_thread: Optional[_RefreshThread] = None - self.refresh_per_second = refresh_per_second - - self.vertical_overflow = vertical_overflow - self._get_renderable = get_renderable - self._live_render = LiveRender( - self.get_renderable(), vertical_overflow=vertical_overflow - ) - - @property - def is_started(self) -> bool: - """Check if live display has been started.""" - return self._started - - def get_renderable(self) -> RenderableType: - renderable = ( - self._get_renderable() - if self._get_renderable is not None - else self._renderable - ) - return renderable or "" - - def start(self, refresh: bool = False) -> None: - """Start live rendering display. - - Args: - refresh (bool, optional): Also refresh. Defaults to False. - """ - with self._lock: - if self._started: - return - self.console.set_live(self) - self._started = True - if self._screen: - self._alt_screen = self.console.set_alt_screen(True) - self.console.show_cursor(False) - self._enable_redirect_io() - self.console.push_render_hook(self) - if refresh: - try: - self.refresh() - except Exception: - # If refresh fails, we want to stop the redirection of sys.stderr, - # so the error stacktrace is properly displayed in the terminal. - # (or, if the code that calls Rich captures the exception and wants to display something, - # let this be displayed in the terminal). - self.stop() - raise - if self.auto_refresh: - self._refresh_thread = _RefreshThread(self, self.refresh_per_second) - self._refresh_thread.start() - - def stop(self) -> None: - """Stop live rendering display.""" - with self._lock: - if not self._started: - return - self.console.clear_live() - self._started = False - - if self.auto_refresh and self._refresh_thread is not None: - self._refresh_thread.stop() - self._refresh_thread = None - # allow it to fully render on the last even if overflow - self.vertical_overflow = "visible" - with self.console: - try: - if not self._alt_screen and not self.console.is_jupyter: - self.refresh() - finally: - self._disable_redirect_io() - self.console.pop_render_hook() - if not self._alt_screen and self.console.is_terminal: - self.console.line() - self.console.show_cursor(True) - if self._alt_screen: - self.console.set_alt_screen(False) - - if self.transient and not self._alt_screen: - self.console.control(self._live_render.restore_cursor()) - if self.ipy_widget is not None and self.transient: - self.ipy_widget.close() # pragma: no cover - - def __enter__(self) -> "Live": - self.start(refresh=self._renderable is not None) - return self - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - self.stop() - - def _enable_redirect_io(self) -> None: - """Enable redirecting of stdout / stderr.""" - if self.console.is_terminal or self.console.is_jupyter: - if self._redirect_stdout and not isinstance(sys.stdout, FileProxy): - self._restore_stdout = sys.stdout - sys.stdout = cast("TextIO", FileProxy(self.console, sys.stdout)) - if self._redirect_stderr and not isinstance(sys.stderr, FileProxy): - self._restore_stderr = sys.stderr - sys.stderr = cast("TextIO", FileProxy(self.console, sys.stderr)) - - def _disable_redirect_io(self) -> None: - """Disable redirecting of stdout / stderr.""" - if self._restore_stdout: - sys.stdout = cast("TextIO", self._restore_stdout) - self._restore_stdout = None - if self._restore_stderr: - sys.stderr = cast("TextIO", self._restore_stderr) - self._restore_stderr = None - - @property - def renderable(self) -> RenderableType: - """Get the renderable that is being displayed - - Returns: - RenderableType: Displayed renderable. - """ - renderable = self.get_renderable() - return Screen(renderable) if self._alt_screen else renderable - - def update(self, renderable: RenderableType, *, refresh: bool = False) -> None: - """Update the renderable that is being displayed - - Args: - renderable (RenderableType): New renderable to use. - refresh (bool, optional): Refresh the display. Defaults to False. - """ - if isinstance(renderable, str): - renderable = self.console.render_str(renderable) - with self._lock: - self._renderable = renderable - if refresh: - self.refresh() - - def refresh(self) -> None: - """Update the display of the Live Render.""" - with self._lock: - self._live_render.set_renderable(self.renderable) - if self.console.is_jupyter: # pragma: no cover - try: - from IPython.display import display - from ipywidgets import Output - except ImportError: - import warnings - - warnings.warn('install "ipywidgets" for Jupyter support') - else: - if self.ipy_widget is None: - self.ipy_widget = Output() - display(self.ipy_widget) - - with self.ipy_widget: - self.ipy_widget.clear_output(wait=True) - self.console.print(self._live_render.renderable) - elif self.console.is_terminal and not self.console.is_dumb_terminal: - with self.console: - self.console.print(Control()) - elif ( - not self._started and not self.transient - ): # if it is finished allow files or dumb-terminals to see final result - with self.console: - self.console.print(Control()) - - def process_renderables( - self, renderables: List[ConsoleRenderable] - ) -> List[ConsoleRenderable]: - """Process renderables to restore cursor and display progress.""" - self._live_render.vertical_overflow = self.vertical_overflow - if self.console.is_interactive: - # lock needs acquiring as user can modify live_render renderable at any time unlike in Progress. - with self._lock: - reset = ( - Control.home() - if self._alt_screen - else self._live_render.position_cursor() - ) - renderables = [reset, *renderables, self._live_render] - elif ( - not self._started and not self.transient - ): # if it is finished render the final output for files or dumb_terminals - renderables = [*renderables, self._live_render] - - return renderables - - -if __name__ == "__main__": # pragma: no cover - import random - import time - from itertools import cycle - from typing import Dict, List, Tuple - - from .align import Align - from .console import Console - from .live import Live as Live - from .panel import Panel - from .rule import Rule - from .syntax import Syntax - from .table import Table - - console = Console() - - syntax = Syntax( - '''def loop_last(values: Iterable[T]) -> Iterable[Tuple[bool, T]]: - """Iterate and generate a tuple with a flag for last value.""" - iter_values = iter(values) - try: - previous_value = next(iter_values) - except StopIteration: - return - for value in iter_values: - yield False, previous_value - previous_value = value - yield True, previous_value''', - "python", - line_numbers=True, - ) - - table = Table("foo", "bar", "baz") - table.add_row("1", "2", "3") - - progress_renderables = [ - "You can make the terminal shorter and taller to see the live table hide" - "Text may be printed while the progress bars are rendering.", - Panel("In fact, [i]any[/i] renderable will work"), - "Such as [magenta]tables[/]...", - table, - "Pretty printed structures...", - {"type": "example", "text": "Pretty printed"}, - "Syntax...", - syntax, - Rule("Give it a try!"), - ] - - examples = cycle(progress_renderables) - - exchanges = [ - "SGD", - "MYR", - "EUR", - "USD", - "AUD", - "JPY", - "CNH", - "HKD", - "CAD", - "INR", - "DKK", - "GBP", - "RUB", - "NZD", - "MXN", - "IDR", - "TWD", - "THB", - "VND", - ] - with Live(console=console) as live_table: - exchange_rate_dict: Dict[Tuple[str, str], float] = {} - - for index in range(100): - select_exchange = exchanges[index % len(exchanges)] - - for exchange in exchanges: - if exchange == select_exchange: - continue - time.sleep(0.4) - if random.randint(0, 10) < 1: - console.log(next(examples)) - exchange_rate_dict[(select_exchange, exchange)] = 200 / ( - (random.random() * 320) + 1 - ) - if len(exchange_rate_dict) > len(exchanges) - 1: - exchange_rate_dict.pop(list(exchange_rate_dict.keys())[0]) - table = Table(title="Exchange Rates") - - table.add_column("Source Currency") - table.add_column("Destination Currency") - table.add_column("Exchange Rate") - - for ((source, dest), exchange_rate) in exchange_rate_dict.items(): - table.add_row( - source, - dest, - Text( - f"{exchange_rate:.4f}", - style="red" if exchange_rate < 1.0 else "green", - ), - ) - - live_table.update(Align.center(table)) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/live_render.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/live_render.py deleted file mode 100644 index f6fa7b2d..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/live_render.py +++ /dev/null @@ -1,113 +0,0 @@ -import sys -from typing import Optional, Tuple - -if sys.version_info >= (3, 8): - from typing import Literal -else: - from typing_extensions import Literal # pragma: no cover - - -from ._loop import loop_last -from .console import Console, ConsoleOptions, RenderableType, RenderResult -from .control import Control -from .segment import ControlType, Segment -from .style import StyleType -from .text import Text - -VerticalOverflowMethod = Literal["crop", "ellipsis", "visible"] - - -class LiveRender: - """Creates a renderable that may be updated. - - Args: - renderable (RenderableType): Any renderable object. - style (StyleType, optional): An optional style to apply to the renderable. Defaults to "". - """ - - def __init__( - self, - renderable: RenderableType, - style: StyleType = "", - vertical_overflow: VerticalOverflowMethod = "ellipsis", - ) -> None: - self.renderable = renderable - self.style = style - self.vertical_overflow = vertical_overflow - self._shape: Optional[Tuple[int, int]] = None - - def set_renderable(self, renderable: RenderableType) -> None: - """Set a new renderable. - - Args: - renderable (RenderableType): Any renderable object, including str. - """ - self.renderable = renderable - - def position_cursor(self) -> Control: - """Get control codes to move cursor to beginning of live render. - - Returns: - Control: A control instance that may be printed. - """ - if self._shape is not None: - _, height = self._shape - return Control( - ControlType.CARRIAGE_RETURN, - (ControlType.ERASE_IN_LINE, 2), - *( - ( - (ControlType.CURSOR_UP, 1), - (ControlType.ERASE_IN_LINE, 2), - ) - * (height - 1) - ) - ) - return Control() - - def restore_cursor(self) -> Control: - """Get control codes to clear the render and restore the cursor to its previous position. - - Returns: - Control: A Control instance that may be printed. - """ - if self._shape is not None: - _, height = self._shape - return Control( - ControlType.CARRIAGE_RETURN, - *((ControlType.CURSOR_UP, 1), (ControlType.ERASE_IN_LINE, 2)) * height - ) - return Control() - - def __rich_console__( - self, console: Console, options: ConsoleOptions - ) -> RenderResult: - - renderable = self.renderable - style = console.get_style(self.style) - lines = console.render_lines(renderable, options, style=style, pad=False) - shape = Segment.get_shape(lines) - - _, height = shape - if height > options.size.height: - if self.vertical_overflow == "crop": - lines = lines[: options.size.height] - shape = Segment.get_shape(lines) - elif self.vertical_overflow == "ellipsis": - lines = lines[: (options.size.height - 1)] - overflow_text = Text( - "...", - overflow="crop", - justify="center", - end="", - style="live.ellipsis", - ) - lines.append(list(console.render(overflow_text))) - shape = Segment.get_shape(lines) - self._shape = shape - - new_line = Segment.line() - for last, line in loop_last(lines): - yield from line - if not last: - yield new_line diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/logging.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/logging.py deleted file mode 100644 index 96859934..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/logging.py +++ /dev/null @@ -1,289 +0,0 @@ -import logging -from datetime import datetime -from logging import Handler, LogRecord -from pathlib import Path -from types import ModuleType -from typing import ClassVar, Iterable, List, Optional, Type, Union - -from rich._null_file import NullFile - -from . import get_console -from ._log_render import FormatTimeCallable, LogRender -from .console import Console, ConsoleRenderable -from .highlighter import Highlighter, ReprHighlighter -from .text import Text -from .traceback import Traceback - - -class RichHandler(Handler): - """A logging handler that renders output with Rich. The time / level / message and file are displayed in columns. - The level is color coded, and the message is syntax highlighted. - - Note: - Be careful when enabling console markup in log messages if you have configured logging for libraries not - under your control. If a dependency writes messages containing square brackets, it may not produce the intended output. - - Args: - level (Union[int, str], optional): Log level. Defaults to logging.NOTSET. - console (:class:`~rich.console.Console`, optional): Optional console instance to write logs. - Default will use a global console instance writing to stdout. - show_time (bool, optional): Show a column for the time. Defaults to True. - omit_repeated_times (bool, optional): Omit repetition of the same time. Defaults to True. - show_level (bool, optional): Show a column for the level. Defaults to True. - show_path (bool, optional): Show the path to the original log call. Defaults to True. - enable_link_path (bool, optional): Enable terminal link of path column to file. Defaults to True. - highlighter (Highlighter, optional): Highlighter to style log messages, or None to use ReprHighlighter. Defaults to None. - markup (bool, optional): Enable console markup in log messages. Defaults to False. - rich_tracebacks (bool, optional): Enable rich tracebacks with syntax highlighting and formatting. Defaults to False. - tracebacks_width (Optional[int], optional): Number of characters used to render tracebacks, or None for full width. Defaults to None. - tracebacks_extra_lines (int, optional): Additional lines of code to render tracebacks, or None for full width. Defaults to None. - tracebacks_theme (str, optional): Override pygments theme used in traceback. - tracebacks_word_wrap (bool, optional): Enable word wrapping of long tracebacks lines. Defaults to True. - tracebacks_show_locals (bool, optional): Enable display of locals in tracebacks. Defaults to False. - tracebacks_suppress (Sequence[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback. - locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. - Defaults to 10. - locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80. - log_time_format (Union[str, TimeFormatterCallable], optional): If ``log_time`` is enabled, either string for strftime or callable that formats the time. Defaults to "[%x %X] ". - keywords (List[str], optional): List of words to highlight instead of ``RichHandler.KEYWORDS``. - """ - - KEYWORDS: ClassVar[Optional[List[str]]] = [ - "GET", - "POST", - "HEAD", - "PUT", - "DELETE", - "OPTIONS", - "TRACE", - "PATCH", - ] - HIGHLIGHTER_CLASS: ClassVar[Type[Highlighter]] = ReprHighlighter - - def __init__( - self, - level: Union[int, str] = logging.NOTSET, - console: Optional[Console] = None, - *, - show_time: bool = True, - omit_repeated_times: bool = True, - show_level: bool = True, - show_path: bool = True, - enable_link_path: bool = True, - highlighter: Optional[Highlighter] = None, - markup: bool = False, - rich_tracebacks: bool = False, - tracebacks_width: Optional[int] = None, - tracebacks_extra_lines: int = 3, - tracebacks_theme: Optional[str] = None, - tracebacks_word_wrap: bool = True, - tracebacks_show_locals: bool = False, - tracebacks_suppress: Iterable[Union[str, ModuleType]] = (), - locals_max_length: int = 10, - locals_max_string: int = 80, - log_time_format: Union[str, FormatTimeCallable] = "[%x %X]", - keywords: Optional[List[str]] = None, - ) -> None: - super().__init__(level=level) - self.console = console or get_console() - self.highlighter = highlighter or self.HIGHLIGHTER_CLASS() - self._log_render = LogRender( - show_time=show_time, - show_level=show_level, - show_path=show_path, - time_format=log_time_format, - omit_repeated_times=omit_repeated_times, - level_width=None, - ) - self.enable_link_path = enable_link_path - self.markup = markup - self.rich_tracebacks = rich_tracebacks - self.tracebacks_width = tracebacks_width - self.tracebacks_extra_lines = tracebacks_extra_lines - self.tracebacks_theme = tracebacks_theme - self.tracebacks_word_wrap = tracebacks_word_wrap - self.tracebacks_show_locals = tracebacks_show_locals - self.tracebacks_suppress = tracebacks_suppress - self.locals_max_length = locals_max_length - self.locals_max_string = locals_max_string - self.keywords = keywords - - def get_level_text(self, record: LogRecord) -> Text: - """Get the level name from the record. - - Args: - record (LogRecord): LogRecord instance. - - Returns: - Text: A tuple of the style and level name. - """ - level_name = record.levelname - level_text = Text.styled( - level_name.ljust(8), f"logging.level.{level_name.lower()}" - ) - return level_text - - def emit(self, record: LogRecord) -> None: - """Invoked by logging.""" - message = self.format(record) - traceback = None - if ( - self.rich_tracebacks - and record.exc_info - and record.exc_info != (None, None, None) - ): - exc_type, exc_value, exc_traceback = record.exc_info - assert exc_type is not None - assert exc_value is not None - traceback = Traceback.from_exception( - exc_type, - exc_value, - exc_traceback, - width=self.tracebacks_width, - extra_lines=self.tracebacks_extra_lines, - theme=self.tracebacks_theme, - word_wrap=self.tracebacks_word_wrap, - show_locals=self.tracebacks_show_locals, - locals_max_length=self.locals_max_length, - locals_max_string=self.locals_max_string, - suppress=self.tracebacks_suppress, - ) - message = record.getMessage() - if self.formatter: - record.message = record.getMessage() - formatter = self.formatter - if hasattr(formatter, "usesTime") and formatter.usesTime(): - record.asctime = formatter.formatTime(record, formatter.datefmt) - message = formatter.formatMessage(record) - - message_renderable = self.render_message(record, message) - log_renderable = self.render( - record=record, traceback=traceback, message_renderable=message_renderable - ) - if isinstance(self.console.file, NullFile): - # Handles pythonw, where stdout/stderr are null, and we return NullFile - # instance from Console.file. In this case, we still want to make a log record - # even though we won't be writing anything to a file. - self.handleError(record) - else: - try: - self.console.print(log_renderable) - except Exception: - self.handleError(record) - - def render_message(self, record: LogRecord, message: str) -> "ConsoleRenderable": - """Render message text in to Text. - - Args: - record (LogRecord): logging Record. - message (str): String containing log message. - - Returns: - ConsoleRenderable: Renderable to display log message. - """ - use_markup = getattr(record, "markup", self.markup) - message_text = Text.from_markup(message) if use_markup else Text(message) - - highlighter = getattr(record, "highlighter", self.highlighter) - if highlighter: - message_text = highlighter(message_text) - - if self.keywords is None: - self.keywords = self.KEYWORDS - - if self.keywords: - message_text.highlight_words(self.keywords, "logging.keyword") - - return message_text - - def render( - self, - *, - record: LogRecord, - traceback: Optional[Traceback], - message_renderable: "ConsoleRenderable", - ) -> "ConsoleRenderable": - """Render log for display. - - Args: - record (LogRecord): logging Record. - traceback (Optional[Traceback]): Traceback instance or None for no Traceback. - message_renderable (ConsoleRenderable): Renderable (typically Text) containing log message contents. - - Returns: - ConsoleRenderable: Renderable to display log. - """ - path = Path(record.pathname).name - level = self.get_level_text(record) - time_format = None if self.formatter is None else self.formatter.datefmt - log_time = datetime.fromtimestamp(record.created) - - log_renderable = self._log_render( - self.console, - [message_renderable] if not traceback else [message_renderable, traceback], - log_time=log_time, - time_format=time_format, - level=level, - path=path, - line_no=record.lineno, - link_path=record.pathname if self.enable_link_path else None, - ) - return log_renderable - - -if __name__ == "__main__": # pragma: no cover - from time import sleep - - FORMAT = "%(message)s" - # FORMAT = "%(asctime)-15s - %(levelname)s - %(message)s" - logging.basicConfig( - level="NOTSET", - format=FORMAT, - datefmt="[%X]", - handlers=[RichHandler(rich_tracebacks=True, tracebacks_show_locals=True)], - ) - log = logging.getLogger("rich") - - log.info("Server starting...") - log.info("Listening on http://127.0.0.1:8080") - sleep(1) - - log.info("GET /index.html 200 1298") - log.info("GET /imgs/backgrounds/back1.jpg 200 54386") - log.info("GET /css/styles.css 200 54386") - log.warning("GET /favicon.ico 404 242") - sleep(1) - - log.debug( - "JSONRPC request\n--> %r\n<-- %r", - { - "version": "1.1", - "method": "confirmFruitPurchase", - "params": [["apple", "orange", "mangoes", "pomelo"], 1.123], - "id": "194521489", - }, - {"version": "1.1", "result": True, "error": None, "id": "194521489"}, - ) - log.debug( - "Loading configuration file /adasd/asdasd/qeqwe/qwrqwrqwr/sdgsdgsdg/werwerwer/dfgerert/ertertert/ertetert/werwerwer" - ) - log.error("Unable to find 'pomelo' in database!") - log.info("POST /jsonrpc/ 200 65532") - log.info("POST /admin/ 401 42234") - log.warning("password was rejected for admin site.") - - def divide() -> None: - number = 1 - divisor = 0 - foos = ["foo"] * 100 - log.debug("in divide") - try: - number / divisor - except: - log.exception("An error of some kind occurred!") - - divide() - sleep(1) - log.critical("Out of memory!") - log.info("Server exited with code=-1") - log.info("[bold]EXITING...[/bold]", extra=dict(markup=True)) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/markdown.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/markdown.py deleted file mode 100644 index ff62899e..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/markdown.py +++ /dev/null @@ -1,677 +0,0 @@ -from __future__ import annotations - -from typing import ClassVar, Dict, Iterable, List, Optional, Type, Union - -from markdown_it import MarkdownIt -from markdown_it.token import Token - -from . import box -from ._loop import loop_first -from ._stack import Stack -from .console import Console, ConsoleOptions, JustifyMethod, RenderResult -from .containers import Renderables -from .jupyter import JupyterMixin -from .panel import Panel -from .rule import Rule -from .segment import Segment -from .style import Style, StyleStack -from .syntax import Syntax -from .text import Text, TextType - - -class MarkdownElement: - new_line: ClassVar[bool] = True - - @classmethod - def create(cls, markdown: "Markdown", token: Token) -> "MarkdownElement": - """Factory to create markdown element, - - Args: - markdown (Markdown): The parent Markdown object. - token (Token): A node from markdown-it. - - Returns: - MarkdownElement: A new markdown element - """ - return cls() - - def on_enter(self, context: "MarkdownContext") -> None: - """Called when the node is entered. - - Args: - context (MarkdownContext): The markdown context. - """ - - def on_text(self, context: "MarkdownContext", text: TextType) -> None: - """Called when text is parsed. - - Args: - context (MarkdownContext): The markdown context. - """ - - def on_leave(self, context: "MarkdownContext") -> None: - """Called when the parser leaves the element. - - Args: - context (MarkdownContext): [description] - """ - - def on_child_close( - self, context: "MarkdownContext", child: "MarkdownElement" - ) -> bool: - """Called when a child element is closed. - - This method allows a parent element to take over rendering of its children. - - Args: - context (MarkdownContext): The markdown context. - child (MarkdownElement): The child markdown element. - - Returns: - bool: Return True to render the element, or False to not render the element. - """ - return True - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - return () - - -class UnknownElement(MarkdownElement): - """An unknown element. - - Hopefully there will be no unknown elements, and we will have a MarkdownElement for - everything in the document. - - """ - - -class TextElement(MarkdownElement): - """Base class for elements that render text.""" - - style_name = "none" - - def on_enter(self, context: "MarkdownContext") -> None: - self.style = context.enter_style(self.style_name) - self.text = Text(justify="left") - - def on_text(self, context: "MarkdownContext", text: TextType) -> None: - self.text.append(text, context.current_style if isinstance(text, str) else None) - - def on_leave(self, context: "MarkdownContext") -> None: - context.leave_style() - - -class Paragraph(TextElement): - """A Paragraph.""" - - style_name = "markdown.paragraph" - justify: JustifyMethod - - @classmethod - def create(cls, markdown: "Markdown", token: Token) -> "Paragraph": - return cls(justify=markdown.justify or "left") - - def __init__(self, justify: JustifyMethod) -> None: - self.justify = justify - - def __rich_console__( - self, console: Console, options: ConsoleOptions - ) -> RenderResult: - self.text.justify = self.justify - yield self.text - - -class Heading(TextElement): - """A heading.""" - - @classmethod - def create(cls, markdown: "Markdown", token: Token) -> "Heading": - return cls(token.tag) - - def on_enter(self, context: "MarkdownContext") -> None: - self.text = Text() - context.enter_style(self.style_name) - - def __init__(self, tag: str) -> None: - self.tag = tag - self.style_name = f"markdown.{tag}" - super().__init__() - - def __rich_console__( - self, console: Console, options: ConsoleOptions - ) -> RenderResult: - text = self.text - text.justify = "center" - if self.tag == "h1": - # Draw a border around h1s - yield Panel( - text, - box=box.HEAVY, - style="markdown.h1.border", - ) - else: - # Styled text for h2 and beyond - if self.tag == "h2": - yield Text("") - yield text - - -class CodeBlock(TextElement): - """A code block with syntax highlighting.""" - - style_name = "markdown.code_block" - - @classmethod - def create(cls, markdown: "Markdown", token: Token) -> "CodeBlock": - node_info = token.info or "" - lexer_name = node_info.partition(" ")[0] - return cls(lexer_name or "default", markdown.code_theme) - - def __init__(self, lexer_name: str, theme: str) -> None: - self.lexer_name = lexer_name - self.theme = theme - - def __rich_console__( - self, console: Console, options: ConsoleOptions - ) -> RenderResult: - code = str(self.text).rstrip() - syntax = Syntax( - code, self.lexer_name, theme=self.theme, word_wrap=True, padding=1 - ) - yield syntax - - -class BlockQuote(TextElement): - """A block quote.""" - - style_name = "markdown.block_quote" - - def __init__(self) -> None: - self.elements: Renderables = Renderables() - - def on_child_close( - self, context: "MarkdownContext", child: "MarkdownElement" - ) -> bool: - self.elements.append(child) - return False - - def __rich_console__( - self, console: Console, options: ConsoleOptions - ) -> RenderResult: - render_options = options.update(width=options.max_width - 4) - lines = console.render_lines(self.elements, render_options, style=self.style) - style = self.style - new_line = Segment("\n") - padding = Segment("▌ ", style) - for line in lines: - yield padding - yield from line - yield new_line - - -class HorizontalRule(MarkdownElement): - """A horizontal rule to divide sections.""" - - new_line = False - - def __rich_console__( - self, console: Console, options: ConsoleOptions - ) -> RenderResult: - style = console.get_style("markdown.hr", default="none") - yield Rule(style=style) - - -class ListElement(MarkdownElement): - """A list element.""" - - @classmethod - def create(cls, markdown: "Markdown", token: Token) -> "ListElement": - return cls(token.type, int(token.attrs.get("start", 1))) - - def __init__(self, list_type: str, list_start: int | None) -> None: - self.items: List[ListItem] = [] - self.list_type = list_type - self.list_start = list_start - - def on_child_close( - self, context: "MarkdownContext", child: "MarkdownElement" - ) -> bool: - assert isinstance(child, ListItem) - self.items.append(child) - return False - - def __rich_console__( - self, console: Console, options: ConsoleOptions - ) -> RenderResult: - if self.list_type == "bullet_list_open": - for item in self.items: - yield from item.render_bullet(console, options) - else: - number = 1 if self.list_start is None else self.list_start - last_number = number + len(self.items) - for index, item in enumerate(self.items): - yield from item.render_number( - console, options, number + index, last_number - ) - - -class ListItem(TextElement): - """An item in a list.""" - - style_name = "markdown.item" - - def __init__(self) -> None: - self.elements: Renderables = Renderables() - - def on_child_close( - self, context: "MarkdownContext", child: "MarkdownElement" - ) -> bool: - self.elements.append(child) - return False - - def render_bullet(self, console: Console, options: ConsoleOptions) -> RenderResult: - render_options = options.update(width=options.max_width - 3) - lines = console.render_lines(self.elements, render_options, style=self.style) - bullet_style = console.get_style("markdown.item.bullet", default="none") - - bullet = Segment(" • ", bullet_style) - padding = Segment(" " * 3, bullet_style) - new_line = Segment("\n") - for first, line in loop_first(lines): - yield bullet if first else padding - yield from line - yield new_line - - def render_number( - self, console: Console, options: ConsoleOptions, number: int, last_number: int - ) -> RenderResult: - number_width = len(str(last_number)) + 2 - render_options = options.update(width=options.max_width - number_width) - lines = console.render_lines(self.elements, render_options, style=self.style) - number_style = console.get_style("markdown.item.number", default="none") - - new_line = Segment("\n") - padding = Segment(" " * number_width, number_style) - numeral = Segment(f"{number}".rjust(number_width - 1) + " ", number_style) - for first, line in loop_first(lines): - yield numeral if first else padding - yield from line - yield new_line - - -class Link(TextElement): - @classmethod - def create(cls, markdown: "Markdown", token: Token) -> "MarkdownElement": - url = token.attrs.get("href", "#") - return cls(token.content, str(url)) - - def __init__(self, text: str, href: str): - self.text = Text(text) - self.href = href - - -class ImageItem(TextElement): - """Renders a placeholder for an image.""" - - new_line = False - - @classmethod - def create(cls, markdown: "Markdown", token: Token) -> "MarkdownElement": - """Factory to create markdown element, - - Args: - markdown (Markdown): The parent Markdown object. - token (Any): A token from markdown-it. - - Returns: - MarkdownElement: A new markdown element - """ - return cls(str(token.attrs.get("src", "")), markdown.hyperlinks) - - def __init__(self, destination: str, hyperlinks: bool) -> None: - self.destination = destination - self.hyperlinks = hyperlinks - self.link: Optional[str] = None - super().__init__() - - def on_enter(self, context: "MarkdownContext") -> None: - self.link = context.current_style.link - self.text = Text(justify="left") - super().on_enter(context) - - def __rich_console__( - self, console: Console, options: ConsoleOptions - ) -> RenderResult: - link_style = Style(link=self.link or self.destination or None) - title = self.text or Text(self.destination.strip("/").rsplit("/", 1)[-1]) - if self.hyperlinks: - title.stylize(link_style) - text = Text.assemble("🌆 ", title, " ", end="") - yield text - - -class MarkdownContext: - """Manages the console render state.""" - - def __init__( - self, - console: Console, - options: ConsoleOptions, - style: Style, - inline_code_lexer: Optional[str] = None, - inline_code_theme: str = "monokai", - ) -> None: - self.console = console - self.options = options - self.style_stack: StyleStack = StyleStack(style) - self.stack: Stack[MarkdownElement] = Stack() - - self._syntax: Optional[Syntax] = None - if inline_code_lexer is not None: - self._syntax = Syntax("", inline_code_lexer, theme=inline_code_theme) - - @property - def current_style(self) -> Style: - """Current style which is the product of all styles on the stack.""" - return self.style_stack.current - - def on_text(self, text: str, node_type: str) -> None: - """Called when the parser visits text.""" - if node_type in {"fence", "code_inline"} and self._syntax is not None: - highlight_text = self._syntax.highlight(text) - highlight_text.rstrip() - self.stack.top.on_text( - self, Text.assemble(highlight_text, style=self.style_stack.current) - ) - else: - self.stack.top.on_text(self, text) - - def enter_style(self, style_name: Union[str, Style]) -> Style: - """Enter a style context.""" - style = self.console.get_style(style_name, default="none") - self.style_stack.push(style) - return self.current_style - - def leave_style(self) -> Style: - """Leave a style context.""" - style = self.style_stack.pop() - return style - - -class Markdown(JupyterMixin): - """A Markdown renderable. - - Args: - markup (str): A string containing markdown. - code_theme (str, optional): Pygments theme for code blocks. Defaults to "monokai". - justify (JustifyMethod, optional): Justify value for paragraphs. Defaults to None. - style (Union[str, Style], optional): Optional style to apply to markdown. - hyperlinks (bool, optional): Enable hyperlinks. Defaults to ``True``. - inline_code_lexer: (str, optional): Lexer to use if inline code highlighting is - enabled. Defaults to None. - inline_code_theme: (Optional[str], optional): Pygments theme for inline code - highlighting, or None for no highlighting. Defaults to None. - """ - - elements: ClassVar[Dict[str, Type[MarkdownElement]]] = { - "paragraph_open": Paragraph, - "heading_open": Heading, - "fence": CodeBlock, - "code_block": CodeBlock, - "blockquote_open": BlockQuote, - "hr": HorizontalRule, - "bullet_list_open": ListElement, - "ordered_list_open": ListElement, - "list_item_open": ListItem, - "image": ImageItem, - } - - inlines = {"em", "strong", "code", "s"} - - def __init__( - self, - markup: str, - code_theme: str = "monokai", - justify: Optional[JustifyMethod] = None, - style: Union[str, Style] = "none", - hyperlinks: bool = True, - inline_code_lexer: Optional[str] = None, - inline_code_theme: Optional[str] = None, - ) -> None: - parser = MarkdownIt().enable("strikethrough") - self.markup = markup - self.parsed = parser.parse(markup) - self.code_theme = code_theme - self.justify: Optional[JustifyMethod] = justify - self.style = style - self.hyperlinks = hyperlinks - self.inline_code_lexer = inline_code_lexer - self.inline_code_theme = inline_code_theme or code_theme - - def _flatten_tokens(self, tokens: Iterable[Token]) -> Iterable[Token]: - """Flattens the token stream.""" - for token in tokens: - is_fence = token.type == "fence" - is_image = token.tag == "img" - if token.children and not (is_image or is_fence): - yield from self._flatten_tokens(token.children) - else: - yield token - - def __rich_console__( - self, console: Console, options: ConsoleOptions - ) -> RenderResult: - """Render markdown to the console.""" - style = console.get_style(self.style, default="none") - options = options.update(height=None) - context = MarkdownContext( - console, - options, - style, - inline_code_lexer=self.inline_code_lexer, - inline_code_theme=self.inline_code_theme, - ) - tokens = self.parsed - inline_style_tags = self.inlines - new_line = False - _new_line_segment = Segment.line() - - for token in self._flatten_tokens(tokens): - node_type = token.type - tag = token.tag - - entering = token.nesting == 1 - exiting = token.nesting == -1 - self_closing = token.nesting == 0 - - if node_type == "text": - context.on_text(token.content, node_type) - elif node_type == "hardbreak": - context.on_text("\n", node_type) - elif node_type == "softbreak": - context.on_text(" ", node_type) - elif node_type == "link_open": - href = str(token.attrs.get("href", "")) - if self.hyperlinks: - link_style = console.get_style("markdown.link_url", default="none") - link_style += Style(link=href) - context.enter_style(link_style) - else: - context.stack.push(Link.create(self, token)) - elif node_type == "link_close": - if self.hyperlinks: - context.leave_style() - else: - element = context.stack.pop() - assert isinstance(element, Link) - link_style = console.get_style("markdown.link", default="none") - context.enter_style(link_style) - context.on_text(element.text.plain, node_type) - context.leave_style() - context.on_text(" (", node_type) - link_url_style = console.get_style( - "markdown.link_url", default="none" - ) - context.enter_style(link_url_style) - context.on_text(element.href, node_type) - context.leave_style() - context.on_text(")", node_type) - elif ( - tag in inline_style_tags - and node_type != "fence" - and node_type != "code_block" - ): - if entering: - # If it's an opening inline token e.g. strong, em, etc. - # Then we move into a style context i.e. push to stack. - context.enter_style(f"markdown.{tag}") - elif exiting: - # If it's a closing inline style, then we pop the style - # off of the stack, to move out of the context of it... - context.leave_style() - else: - # If it's a self-closing inline style e.g. `code_inline` - context.enter_style(f"markdown.{tag}") - if token.content: - context.on_text(token.content, node_type) - context.leave_style() - else: - # Map the markdown tag -> MarkdownElement renderable - element_class = self.elements.get(token.type) or UnknownElement - element = element_class.create(self, token) - - if entering or self_closing: - context.stack.push(element) - element.on_enter(context) - - if exiting: # CLOSING tag - element = context.stack.pop() - - should_render = not context.stack or ( - context.stack - and context.stack.top.on_child_close(context, element) - ) - - if should_render: - if new_line: - yield _new_line_segment - yield from console.render(element, context.options) - elif self_closing: # SELF-CLOSING tags (e.g. text, code, image) - context.stack.pop() - text = token.content - if text is not None: - element.on_text(context, text) - - should_render = ( - not context.stack - or context.stack - and context.stack.top.on_child_close(context, element) - ) - if should_render: - if new_line: - yield _new_line_segment - yield from console.render(element, context.options) - - if exiting or self_closing: - element.on_leave(context) - new_line = element.new_line - - -if __name__ == "__main__": # pragma: no cover - - import argparse - import sys - - parser = argparse.ArgumentParser( - description="Render Markdown to the console with Rich" - ) - parser.add_argument( - "path", - metavar="PATH", - help="path to markdown file, or - for stdin", - ) - parser.add_argument( - "-c", - "--force-color", - dest="force_color", - action="store_true", - default=None, - help="force color for non-terminals", - ) - parser.add_argument( - "-t", - "--code-theme", - dest="code_theme", - default="monokai", - help="pygments code theme", - ) - parser.add_argument( - "-i", - "--inline-code-lexer", - dest="inline_code_lexer", - default=None, - help="inline_code_lexer", - ) - parser.add_argument( - "-y", - "--hyperlinks", - dest="hyperlinks", - action="store_true", - help="enable hyperlinks", - ) - parser.add_argument( - "-w", - "--width", - type=int, - dest="width", - default=None, - help="width of output (default will auto-detect)", - ) - parser.add_argument( - "-j", - "--justify", - dest="justify", - action="store_true", - help="enable full text justify", - ) - parser.add_argument( - "-p", - "--page", - dest="page", - action="store_true", - help="use pager to scroll output", - ) - args = parser.parse_args() - - from rich.console import Console - - if args.path == "-": - markdown_body = sys.stdin.read() - else: - with open(args.path, "rt", encoding="utf-8") as markdown_file: - markdown_body = markdown_file.read() - markdown = Markdown( - markdown_body, - justify="full" if args.justify else "left", - code_theme=args.code_theme, - hyperlinks=args.hyperlinks, - inline_code_lexer=args.inline_code_lexer, - ) - if args.page: - import io - import pydoc - - fileio = io.StringIO() - console = Console( - file=fileio, force_terminal=args.force_color, width=args.width - ) - console.print(markdown) - pydoc.pager(fileio.getvalue()) - - else: - console = Console( - force_terminal=args.force_color, width=args.width, record=True - ) - console.print(markdown) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/markup.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/markup.py deleted file mode 100644 index 0ffd056d..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/markup.py +++ /dev/null @@ -1,246 +0,0 @@ -import re -from ast import literal_eval -from operator import attrgetter -from typing import Callable, Iterable, List, Match, NamedTuple, Optional, Tuple, Union - -from ._emoji_replace import _emoji_replace -from .emoji import EmojiVariant -from .errors import MarkupError -from .style import Style -from .text import Span, Text - -RE_TAGS = re.compile( - r"""((\\*)\[([a-z#/@][^[]*?)])""", - re.VERBOSE, -) - -RE_HANDLER = re.compile(r"^([\w.]*?)(\(.*?\))?$") - - -class Tag(NamedTuple): - """A tag in console markup.""" - - name: str - """The tag name. e.g. 'bold'.""" - parameters: Optional[str] - """Any additional parameters after the name.""" - - def __str__(self) -> str: - return ( - self.name if self.parameters is None else f"{self.name} {self.parameters}" - ) - - @property - def markup(self) -> str: - """Get the string representation of this tag.""" - return ( - f"[{self.name}]" - if self.parameters is None - else f"[{self.name}={self.parameters}]" - ) - - -_ReStringMatch = Match[str] # regex match object -_ReSubCallable = Callable[[_ReStringMatch], str] # Callable invoked by re.sub -_EscapeSubMethod = Callable[[_ReSubCallable, str], str] # Sub method of a compiled re - - -def escape( - markup: str, - _escape: _EscapeSubMethod = re.compile(r"(\\*)(\[[a-z#/@][^[]*?])").sub, -) -> str: - """Escapes text so that it won't be interpreted as markup. - - Args: - markup (str): Content to be inserted in to markup. - - Returns: - str: Markup with square brackets escaped. - """ - - def escape_backslashes(match: Match[str]) -> str: - """Called by re.sub replace matches.""" - backslashes, text = match.groups() - return f"{backslashes}{backslashes}\\{text}" - - markup = _escape(escape_backslashes, markup) - return markup - - -def _parse(markup: str) -> Iterable[Tuple[int, Optional[str], Optional[Tag]]]: - """Parse markup in to an iterable of tuples of (position, text, tag). - - Args: - markup (str): A string containing console markup - - """ - position = 0 - _divmod = divmod - _Tag = Tag - for match in RE_TAGS.finditer(markup): - full_text, escapes, tag_text = match.groups() - start, end = match.span() - if start > position: - yield start, markup[position:start], None - if escapes: - backslashes, escaped = _divmod(len(escapes), 2) - if backslashes: - # Literal backslashes - yield start, "\\" * backslashes, None - start += backslashes * 2 - if escaped: - # Escape of tag - yield start, full_text[len(escapes) :], None - position = end - continue - text, equals, parameters = tag_text.partition("=") - yield start, None, _Tag(text, parameters if equals else None) - position = end - if position < len(markup): - yield position, markup[position:], None - - -def render( - markup: str, - style: Union[str, Style] = "", - emoji: bool = True, - emoji_variant: Optional[EmojiVariant] = None, -) -> Text: - """Render console markup in to a Text instance. - - Args: - markup (str): A string containing console markup. - emoji (bool, optional): Also render emoji code. Defaults to True. - - Raises: - MarkupError: If there is a syntax error in the markup. - - Returns: - Text: A test instance. - """ - emoji_replace = _emoji_replace - if "[" not in markup: - return Text( - emoji_replace(markup, default_variant=emoji_variant) if emoji else markup, - style=style, - ) - text = Text(style=style) - append = text.append - normalize = Style.normalize - - style_stack: List[Tuple[int, Tag]] = [] - pop = style_stack.pop - - spans: List[Span] = [] - append_span = spans.append - - _Span = Span - _Tag = Tag - - def pop_style(style_name: str) -> Tuple[int, Tag]: - """Pop tag matching given style name.""" - for index, (_, tag) in enumerate(reversed(style_stack), 1): - if tag.name == style_name: - return pop(-index) - raise KeyError(style_name) - - for position, plain_text, tag in _parse(markup): - if plain_text is not None: - # Handle open brace escapes, where the brace is not part of a tag. - plain_text = plain_text.replace("\\[", "[") - append(emoji_replace(plain_text) if emoji else plain_text) - elif tag is not None: - if tag.name.startswith("/"): # Closing tag - style_name = tag.name[1:].strip() - - if style_name: # explicit close - style_name = normalize(style_name) - try: - start, open_tag = pop_style(style_name) - except KeyError: - raise MarkupError( - f"closing tag '{tag.markup}' at position {position} doesn't match any open tag" - ) from None - else: # implicit close - try: - start, open_tag = pop() - except IndexError: - raise MarkupError( - f"closing tag '[/]' at position {position} has nothing to close" - ) from None - - if open_tag.name.startswith("@"): - if open_tag.parameters: - handler_name = "" - parameters = open_tag.parameters.strip() - handler_match = RE_HANDLER.match(parameters) - if handler_match is not None: - handler_name, match_parameters = handler_match.groups() - parameters = ( - "()" if match_parameters is None else match_parameters - ) - - try: - meta_params = literal_eval(parameters) - except SyntaxError as error: - raise MarkupError( - f"error parsing {parameters!r} in {open_tag.parameters!r}; {error.msg}" - ) - except Exception as error: - raise MarkupError( - f"error parsing {open_tag.parameters!r}; {error}" - ) from None - - if handler_name: - meta_params = ( - handler_name, - meta_params - if isinstance(meta_params, tuple) - else (meta_params,), - ) - - else: - meta_params = () - - append_span( - _Span( - start, len(text), Style(meta={open_tag.name: meta_params}) - ) - ) - else: - append_span(_Span(start, len(text), str(open_tag))) - - else: # Opening tag - normalized_tag = _Tag(normalize(tag.name), tag.parameters) - style_stack.append((len(text), normalized_tag)) - - text_length = len(text) - while style_stack: - start, tag = style_stack.pop() - style = str(tag) - if style: - append_span(_Span(start, text_length, style)) - - text.spans = sorted(spans[::-1], key=attrgetter("start")) - return text - - -if __name__ == "__main__": # pragma: no cover - - MARKUP = [ - "[red]Hello World[/red]", - "[magenta]Hello [b]World[/b]", - "[bold]Bold[italic] bold and italic [/bold]italic[/italic]", - "Click [link=https://www.willmcgugan.com]here[/link] to visit my Blog", - ":warning-emoji: [bold red blink] DANGER![/]", - ] - - from rich import print - from rich.table import Table - - grid = Table("Markup", "Result", padding=(0, 1)) - - for markup in MARKUP: - grid.add_row(Text(markup), markup) - - print(grid) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/measure.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/measure.py deleted file mode 100644 index a508ffa8..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/measure.py +++ /dev/null @@ -1,151 +0,0 @@ -from operator import itemgetter -from typing import TYPE_CHECKING, Callable, NamedTuple, Optional, Sequence - -from . import errors -from .protocol import is_renderable, rich_cast - -if TYPE_CHECKING: - from .console import Console, ConsoleOptions, RenderableType - - -class Measurement(NamedTuple): - """Stores the minimum and maximum widths (in characters) required to render an object.""" - - minimum: int - """Minimum number of cells required to render.""" - maximum: int - """Maximum number of cells required to render.""" - - @property - def span(self) -> int: - """Get difference between maximum and minimum.""" - return self.maximum - self.minimum - - def normalize(self) -> "Measurement": - """Get measurement that ensures that minimum <= maximum and minimum >= 0 - - Returns: - Measurement: A normalized measurement. - """ - minimum, maximum = self - minimum = min(max(0, minimum), maximum) - return Measurement(max(0, minimum), max(0, max(minimum, maximum))) - - def with_maximum(self, width: int) -> "Measurement": - """Get a RenderableWith where the widths are <= width. - - Args: - width (int): Maximum desired width. - - Returns: - Measurement: New Measurement object. - """ - minimum, maximum = self - return Measurement(min(minimum, width), min(maximum, width)) - - def with_minimum(self, width: int) -> "Measurement": - """Get a RenderableWith where the widths are >= width. - - Args: - width (int): Minimum desired width. - - Returns: - Measurement: New Measurement object. - """ - minimum, maximum = self - width = max(0, width) - return Measurement(max(minimum, width), max(maximum, width)) - - def clamp( - self, min_width: Optional[int] = None, max_width: Optional[int] = None - ) -> "Measurement": - """Clamp a measurement within the specified range. - - Args: - min_width (int): Minimum desired width, or ``None`` for no minimum. Defaults to None. - max_width (int): Maximum desired width, or ``None`` for no maximum. Defaults to None. - - Returns: - Measurement: New Measurement object. - """ - measurement = self - if min_width is not None: - measurement = measurement.with_minimum(min_width) - if max_width is not None: - measurement = measurement.with_maximum(max_width) - return measurement - - @classmethod - def get( - cls, console: "Console", options: "ConsoleOptions", renderable: "RenderableType" - ) -> "Measurement": - """Get a measurement for a renderable. - - Args: - console (~rich.console.Console): Console instance. - options (~rich.console.ConsoleOptions): Console options. - renderable (RenderableType): An object that may be rendered with Rich. - - Raises: - errors.NotRenderableError: If the object is not renderable. - - Returns: - Measurement: Measurement object containing range of character widths required to render the object. - """ - _max_width = options.max_width - if _max_width < 1: - return Measurement(0, 0) - if isinstance(renderable, str): - renderable = console.render_str( - renderable, markup=options.markup, highlight=False - ) - renderable = rich_cast(renderable) - if is_renderable(renderable): - get_console_width: Optional[ - Callable[["Console", "ConsoleOptions"], "Measurement"] - ] = getattr(renderable, "__rich_measure__", None) - if get_console_width is not None: - render_width = ( - get_console_width(console, options) - .normalize() - .with_maximum(_max_width) - ) - if render_width.maximum < 1: - return Measurement(0, 0) - return render_width.normalize() - else: - return Measurement(0, _max_width) - else: - raise errors.NotRenderableError( - f"Unable to get render width for {renderable!r}; " - "a str, Segment, or object with __rich_console__ method is required" - ) - - -def measure_renderables( - console: "Console", - options: "ConsoleOptions", - renderables: Sequence["RenderableType"], -) -> "Measurement": - """Get a measurement that would fit a number of renderables. - - Args: - console (~rich.console.Console): Console instance. - options (~rich.console.ConsoleOptions): Console options. - renderables (Iterable[RenderableType]): One or more renderable objects. - - Returns: - Measurement: Measurement object containing range of character widths required to - contain all given renderables. - """ - if not renderables: - return Measurement(0, 0) - get_measurement = Measurement.get - measurements = [ - get_measurement(console, options, renderable) for renderable in renderables - ] - measured_width = Measurement( - max(measurements, key=itemgetter(0)).minimum, - max(measurements, key=itemgetter(1)).maximum, - ) - return measured_width diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/padding.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/padding.py deleted file mode 100644 index 1d1f4a55..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/padding.py +++ /dev/null @@ -1,141 +0,0 @@ -from typing import cast, List, Optional, Tuple, TYPE_CHECKING, Union - -if TYPE_CHECKING: - from .console import ( - Console, - ConsoleOptions, - RenderableType, - RenderResult, - ) -from .jupyter import JupyterMixin -from .measure import Measurement -from .style import Style -from .segment import Segment - - -PaddingDimensions = Union[int, Tuple[int], Tuple[int, int], Tuple[int, int, int, int]] - - -class Padding(JupyterMixin): - """Draw space around content. - - Example: - >>> print(Padding("Hello", (2, 4), style="on blue")) - - Args: - renderable (RenderableType): String or other renderable. - pad (Union[int, Tuple[int]]): Padding for top, right, bottom, and left borders. - May be specified with 1, 2, or 4 integers (CSS style). - style (Union[str, Style], optional): Style for padding characters. Defaults to "none". - expand (bool, optional): Expand padding to fit available width. Defaults to True. - """ - - def __init__( - self, - renderable: "RenderableType", - pad: "PaddingDimensions" = (0, 0, 0, 0), - *, - style: Union[str, Style] = "none", - expand: bool = True, - ): - self.renderable = renderable - self.top, self.right, self.bottom, self.left = self.unpack(pad) - self.style = style - self.expand = expand - - @classmethod - def indent(cls, renderable: "RenderableType", level: int) -> "Padding": - """Make padding instance to render an indent. - - Args: - renderable (RenderableType): String or other renderable. - level (int): Number of characters to indent. - - Returns: - Padding: A Padding instance. - """ - - return Padding(renderable, pad=(0, 0, 0, level), expand=False) - - @staticmethod - def unpack(pad: "PaddingDimensions") -> Tuple[int, int, int, int]: - """Unpack padding specified in CSS style.""" - if isinstance(pad, int): - return (pad, pad, pad, pad) - if len(pad) == 1: - _pad = pad[0] - return (_pad, _pad, _pad, _pad) - if len(pad) == 2: - pad_top, pad_right = cast(Tuple[int, int], pad) - return (pad_top, pad_right, pad_top, pad_right) - if len(pad) == 4: - top, right, bottom, left = cast(Tuple[int, int, int, int], pad) - return (top, right, bottom, left) - raise ValueError(f"1, 2 or 4 integers required for padding; {len(pad)} given") - - def __repr__(self) -> str: - return f"Padding({self.renderable!r}, ({self.top},{self.right},{self.bottom},{self.left}))" - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - style = console.get_style(self.style) - if self.expand: - width = options.max_width - else: - width = min( - Measurement.get(console, options, self.renderable).maximum - + self.left - + self.right, - options.max_width, - ) - render_options = options.update_width(width - self.left - self.right) - if render_options.height is not None: - render_options = render_options.update_height( - height=render_options.height - self.top - self.bottom - ) - lines = console.render_lines( - self.renderable, render_options, style=style, pad=True - ) - _Segment = Segment - - left = _Segment(" " * self.left, style) if self.left else None - right = ( - [_Segment(f'{" " * self.right}', style), _Segment.line()] - if self.right - else [_Segment.line()] - ) - blank_line: Optional[List[Segment]] = None - if self.top: - blank_line = [_Segment(f'{" " * width}\n', style)] - yield from blank_line * self.top - if left: - for line in lines: - yield left - yield from line - yield from right - else: - for line in lines: - yield from line - yield from right - if self.bottom: - blank_line = blank_line or [_Segment(f'{" " * width}\n', style)] - yield from blank_line * self.bottom - - def __rich_measure__( - self, console: "Console", options: "ConsoleOptions" - ) -> "Measurement": - max_width = options.max_width - extra_width = self.left + self.right - if max_width - extra_width < 1: - return Measurement(max_width, max_width) - measure_min, measure_max = Measurement.get(console, options, self.renderable) - measurement = Measurement(measure_min + extra_width, measure_max + extra_width) - measurement = measurement.with_maximum(max_width) - return measurement - - -if __name__ == "__main__": # pragma: no cover - from rich import print - - print(Padding("Hello, World", (2, 4), style="on blue")) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/pager.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/pager.py deleted file mode 100644 index a3f7aa62..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/pager.py +++ /dev/null @@ -1,34 +0,0 @@ -from abc import ABC, abstractmethod -from typing import Any - - -class Pager(ABC): - """Base class for a pager.""" - - @abstractmethod - def show(self, content: str) -> None: - """Show content in pager. - - Args: - content (str): Content to be displayed. - """ - - -class SystemPager(Pager): - """Uses the pager installed on the system.""" - - def _pager(self, content: str) -> Any: #  pragma: no cover - return __import__("pydoc").pager(content) - - def show(self, content: str) -> None: - """Use the same pager used by pydoc.""" - self._pager(content) - - -if __name__ == "__main__": # pragma: no cover - from .__main__ import make_test_card - from .console import Console - - console = Console() - with console.pager(styles=True): - console.print(make_test_card()) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/palette.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/palette.py deleted file mode 100644 index f2958794..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/palette.py +++ /dev/null @@ -1,100 +0,0 @@ -from math import sqrt -from functools import lru_cache -from typing import Sequence, Tuple, TYPE_CHECKING - -from .color_triplet import ColorTriplet - -if TYPE_CHECKING: - from rich.table import Table - - -class Palette: - """A palette of available colors.""" - - def __init__(self, colors: Sequence[Tuple[int, int, int]]): - self._colors = colors - - def __getitem__(self, number: int) -> ColorTriplet: - return ColorTriplet(*self._colors[number]) - - def __rich__(self) -> "Table": - from rich.color import Color - from rich.style import Style - from rich.text import Text - from rich.table import Table - - table = Table( - "index", - "RGB", - "Color", - title="Palette", - caption=f"{len(self._colors)} colors", - highlight=True, - caption_justify="right", - ) - for index, color in enumerate(self._colors): - table.add_row( - str(index), - repr(color), - Text(" " * 16, style=Style(bgcolor=Color.from_rgb(*color))), - ) - return table - - # This is somewhat inefficient and needs caching - @lru_cache(maxsize=1024) - def match(self, color: Tuple[int, int, int]) -> int: - """Find a color from a palette that most closely matches a given color. - - Args: - color (Tuple[int, int, int]): RGB components in range 0 > 255. - - Returns: - int: Index of closes matching color. - """ - red1, green1, blue1 = color - _sqrt = sqrt - get_color = self._colors.__getitem__ - - def get_color_distance(index: int) -> float: - """Get the distance to a color.""" - red2, green2, blue2 = get_color(index) - red_mean = (red1 + red2) // 2 - red = red1 - red2 - green = green1 - green2 - blue = blue1 - blue2 - return _sqrt( - (((512 + red_mean) * red * red) >> 8) - + 4 * green * green - + (((767 - red_mean) * blue * blue) >> 8) - ) - - min_index = min(range(len(self._colors)), key=get_color_distance) - return min_index - - -if __name__ == "__main__": # pragma: no cover - import colorsys - from typing import Iterable - from rich.color import Color - from rich.console import Console, ConsoleOptions - from rich.segment import Segment - from rich.style import Style - - class ColorBox: - def __rich_console__( - self, console: Console, options: ConsoleOptions - ) -> Iterable[Segment]: - height = console.size.height - 3 - for y in range(0, height): - for x in range(options.max_width): - h = x / options.max_width - l = y / (height + 1) - r1, g1, b1 = colorsys.hls_to_rgb(h, l, 1.0) - r2, g2, b2 = colorsys.hls_to_rgb(h, l + (1 / height / 2), 1.0) - bgcolor = Color.from_rgb(r1 * 255, g1 * 255, b1 * 255) - color = Color.from_rgb(r2 * 255, g2 * 255, b2 * 255) - yield Segment("▄", Style(color=color, bgcolor=bgcolor)) - yield Segment.line() - - console = Console() - console.print(ColorBox()) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/panel.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/panel.py deleted file mode 100644 index d522d80b..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/panel.py +++ /dev/null @@ -1,308 +0,0 @@ -from typing import TYPE_CHECKING, Optional - -from .align import AlignMethod -from .box import ROUNDED, Box -from .cells import cell_len -from .jupyter import JupyterMixin -from .measure import Measurement, measure_renderables -from .padding import Padding, PaddingDimensions -from .segment import Segment -from .style import Style, StyleType -from .text import Text, TextType - -if TYPE_CHECKING: - from .console import Console, ConsoleOptions, RenderableType, RenderResult - - -class Panel(JupyterMixin): - """A console renderable that draws a border around its contents. - - Example: - >>> console.print(Panel("Hello, World!")) - - Args: - renderable (RenderableType): A console renderable object. - box (Box, optional): A Box instance that defines the look of the border (see :ref:`appendix_box`. - Defaults to box.ROUNDED. - safe_box (bool, optional): Disable box characters that don't display on windows legacy terminal with *raster* fonts. Defaults to True. - expand (bool, optional): If True the panel will stretch to fill the console - width, otherwise it will be sized to fit the contents. Defaults to True. - style (str, optional): The style of the panel (border and contents). Defaults to "none". - border_style (str, optional): The style of the border. Defaults to "none". - width (Optional[int], optional): Optional width of panel. Defaults to None to auto-detect. - height (Optional[int], optional): Optional height of panel. Defaults to None to auto-detect. - padding (Optional[PaddingDimensions]): Optional padding around renderable. Defaults to 0. - highlight (bool, optional): Enable automatic highlighting of panel title (if str). Defaults to False. - """ - - def __init__( - self, - renderable: "RenderableType", - box: Box = ROUNDED, - *, - title: Optional[TextType] = None, - title_align: AlignMethod = "center", - subtitle: Optional[TextType] = None, - subtitle_align: AlignMethod = "center", - safe_box: Optional[bool] = None, - expand: bool = True, - style: StyleType = "none", - border_style: StyleType = "none", - width: Optional[int] = None, - height: Optional[int] = None, - padding: PaddingDimensions = (0, 1), - highlight: bool = False, - ) -> None: - self.renderable = renderable - self.box = box - self.title = title - self.title_align: AlignMethod = title_align - self.subtitle = subtitle - self.subtitle_align = subtitle_align - self.safe_box = safe_box - self.expand = expand - self.style = style - self.border_style = border_style - self.width = width - self.height = height - self.padding = padding - self.highlight = highlight - - @classmethod - def fit( - cls, - renderable: "RenderableType", - box: Box = ROUNDED, - *, - title: Optional[TextType] = None, - title_align: AlignMethod = "center", - subtitle: Optional[TextType] = None, - subtitle_align: AlignMethod = "center", - safe_box: Optional[bool] = None, - style: StyleType = "none", - border_style: StyleType = "none", - width: Optional[int] = None, - padding: PaddingDimensions = (0, 1), - ) -> "Panel": - """An alternative constructor that sets expand=False.""" - return cls( - renderable, - box, - title=title, - title_align=title_align, - subtitle=subtitle, - subtitle_align=subtitle_align, - safe_box=safe_box, - style=style, - border_style=border_style, - width=width, - padding=padding, - expand=False, - ) - - @property - def _title(self) -> Optional[Text]: - if self.title: - title_text = ( - Text.from_markup(self.title) - if isinstance(self.title, str) - else self.title.copy() - ) - title_text.end = "" - title_text.plain = title_text.plain.replace("\n", " ") - title_text.no_wrap = True - title_text.expand_tabs() - title_text.pad(1) - return title_text - return None - - @property - def _subtitle(self) -> Optional[Text]: - if self.subtitle: - subtitle_text = ( - Text.from_markup(self.subtitle) - if isinstance(self.subtitle, str) - else self.subtitle.copy() - ) - subtitle_text.end = "" - subtitle_text.plain = subtitle_text.plain.replace("\n", " ") - subtitle_text.no_wrap = True - subtitle_text.expand_tabs() - subtitle_text.pad(1) - return subtitle_text - return None - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - _padding = Padding.unpack(self.padding) - renderable = ( - Padding(self.renderable, _padding) if any(_padding) else self.renderable - ) - style = console.get_style(self.style) - border_style = style + console.get_style(self.border_style) - width = ( - options.max_width - if self.width is None - else min(options.max_width, self.width) - ) - - safe_box: bool = console.safe_box if self.safe_box is None else self.safe_box - box = self.box.substitute(options, safe=safe_box) - - def align_text( - text: Text, width: int, align: str, character: str, style: Style - ) -> Text: - """Gets new aligned text. - - Args: - text (Text): Title or subtitle text. - width (int): Desired width. - align (str): Alignment. - character (str): Character for alignment. - style (Style): Border style - - Returns: - Text: New text instance - """ - text = text.copy() - text.truncate(width) - excess_space = width - cell_len(text.plain) - if excess_space: - if align == "left": - return Text.assemble( - text, - (character * excess_space, style), - no_wrap=True, - end="", - ) - elif align == "center": - left = excess_space // 2 - return Text.assemble( - (character * left, style), - text, - (character * (excess_space - left), style), - no_wrap=True, - end="", - ) - else: - return Text.assemble( - (character * excess_space, style), - text, - no_wrap=True, - end="", - ) - return text - - title_text = self._title - if title_text is not None: - title_text.stylize_before(border_style) - - child_width = ( - width - 2 - if self.expand - else console.measure( - renderable, options=options.update_width(width - 2) - ).maximum - ) - child_height = self.height or options.height or None - if child_height: - child_height -= 2 - if title_text is not None: - child_width = min( - options.max_width - 2, max(child_width, title_text.cell_len + 2) - ) - - width = child_width + 2 - child_options = options.update( - width=child_width, height=child_height, highlight=self.highlight - ) - lines = console.render_lines(renderable, child_options, style=style) - - line_start = Segment(box.mid_left, border_style) - line_end = Segment(f"{box.mid_right}", border_style) - new_line = Segment.line() - if title_text is None or width <= 4: - yield Segment(box.get_top([width - 2]), border_style) - else: - title_text = align_text( - title_text, - width - 4, - self.title_align, - box.top, - border_style, - ) - yield Segment(box.top_left + box.top, border_style) - yield from console.render(title_text, child_options.update_width(width - 4)) - yield Segment(box.top + box.top_right, border_style) - - yield new_line - for line in lines: - yield line_start - yield from line - yield line_end - yield new_line - - subtitle_text = self._subtitle - if subtitle_text is not None: - subtitle_text.stylize_before(border_style) - - if subtitle_text is None or width <= 4: - yield Segment(box.get_bottom([width - 2]), border_style) - else: - subtitle_text = align_text( - subtitle_text, - width - 4, - self.subtitle_align, - box.bottom, - border_style, - ) - yield Segment(box.bottom_left + box.bottom, border_style) - yield from console.render( - subtitle_text, child_options.update_width(width - 4) - ) - yield Segment(box.bottom + box.bottom_right, border_style) - - yield new_line - - def __rich_measure__( - self, console: "Console", options: "ConsoleOptions" - ) -> "Measurement": - _title = self._title - _, right, _, left = Padding.unpack(self.padding) - padding = left + right - renderables = [self.renderable, _title] if _title else [self.renderable] - - if self.width is None: - width = ( - measure_renderables( - console, - options.update_width(options.max_width - padding - 2), - renderables, - ).maximum - + padding - + 2 - ) - else: - width = self.width - return Measurement(width, width) - - -if __name__ == "__main__": # pragma: no cover - from .console import Console - - c = Console() - - from .box import DOUBLE, ROUNDED - from .padding import Padding - - p = Panel( - "Hello, World!", - title="rich.Panel", - style="white on blue", - box=DOUBLE, - padding=1, - ) - - c.print() - c.print(p) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/pretty.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/pretty.py deleted file mode 100644 index fd12885b..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/pretty.py +++ /dev/null @@ -1,994 +0,0 @@ -import builtins -import collections -import dataclasses -import inspect -import os -import sys -from array import array -from collections import Counter, UserDict, UserList, defaultdict, deque -from dataclasses import dataclass, fields, is_dataclass -from inspect import isclass -from itertools import islice -from types import MappingProxyType -from typing import ( - TYPE_CHECKING, - Any, - Callable, - DefaultDict, - Dict, - Iterable, - List, - Optional, - Sequence, - Set, - Tuple, - Union, -) - -from rich.repr import RichReprResult - -try: - import attr as _attr_module - - _has_attrs = hasattr(_attr_module, "ib") -except ImportError: # pragma: no cover - _has_attrs = False - -from . import get_console -from ._loop import loop_last -from ._pick import pick_bool -from .abc import RichRenderable -from .cells import cell_len -from .highlighter import ReprHighlighter -from .jupyter import JupyterMixin, JupyterRenderable -from .measure import Measurement -from .text import Text - -if TYPE_CHECKING: - from .console import ( - Console, - ConsoleOptions, - HighlighterType, - JustifyMethod, - OverflowMethod, - RenderResult, - ) - - -def _is_attr_object(obj: Any) -> bool: - """Check if an object was created with attrs module.""" - return _has_attrs and _attr_module.has(type(obj)) - - -def _get_attr_fields(obj: Any) -> Sequence["_attr_module.Attribute[Any]"]: - """Get fields for an attrs object.""" - return _attr_module.fields(type(obj)) if _has_attrs else [] - - -def _is_dataclass_repr(obj: object) -> bool: - """Check if an instance of a dataclass contains the default repr. - - Args: - obj (object): A dataclass instance. - - Returns: - bool: True if the default repr is used, False if there is a custom repr. - """ - # Digging in to a lot of internals here - # Catching all exceptions in case something is missing on a non CPython implementation - try: - return obj.__repr__.__code__.co_filename == dataclasses.__file__ - except Exception: # pragma: no coverage - return False - - -_dummy_namedtuple = collections.namedtuple("_dummy_namedtuple", []) - - -def _has_default_namedtuple_repr(obj: object) -> bool: - """Check if an instance of namedtuple contains the default repr - - Args: - obj (object): A namedtuple - - Returns: - bool: True if the default repr is used, False if there's a custom repr. - """ - obj_file = None - try: - obj_file = inspect.getfile(obj.__repr__) - except (OSError, TypeError): - # OSError handles case where object is defined in __main__ scope, e.g. REPL - no filename available. - # TypeError trapped defensively, in case of object without filename slips through. - pass - default_repr_file = inspect.getfile(_dummy_namedtuple.__repr__) - return obj_file == default_repr_file - - -def _ipy_display_hook( - value: Any, - console: Optional["Console"] = None, - overflow: "OverflowMethod" = "ignore", - crop: bool = False, - indent_guides: bool = False, - max_length: Optional[int] = None, - max_string: Optional[int] = None, - max_depth: Optional[int] = None, - expand_all: bool = False, -) -> Union[str, None]: - # needed here to prevent circular import: - from .console import ConsoleRenderable - - # always skip rich generated jupyter renderables or None values - if _safe_isinstance(value, JupyterRenderable) or value is None: - return None - - console = console or get_console() - - with console.capture() as capture: - # certain renderables should start on a new line - if _safe_isinstance(value, ConsoleRenderable): - console.line() - console.print( - value - if _safe_isinstance(value, RichRenderable) - else Pretty( - value, - overflow=overflow, - indent_guides=indent_guides, - max_length=max_length, - max_string=max_string, - max_depth=max_depth, - expand_all=expand_all, - margin=12, - ), - crop=crop, - new_line_start=True, - end="", - ) - # strip trailing newline, not usually part of a text repr - # I'm not sure if this should be prevented at a lower level - return capture.get().rstrip("\n") - - -def _safe_isinstance( - obj: object, class_or_tuple: Union[type, Tuple[type, ...]] -) -> bool: - """isinstance can fail in rare cases, for example types with no __class__""" - try: - return isinstance(obj, class_or_tuple) - except Exception: - return False - - -def install( - console: Optional["Console"] = None, - overflow: "OverflowMethod" = "ignore", - crop: bool = False, - indent_guides: bool = False, - max_length: Optional[int] = None, - max_string: Optional[int] = None, - max_depth: Optional[int] = None, - expand_all: bool = False, -) -> None: - """Install automatic pretty printing in the Python REPL. - - Args: - console (Console, optional): Console instance or ``None`` to use global console. Defaults to None. - overflow (Optional[OverflowMethod], optional): Overflow method. Defaults to "ignore". - crop (Optional[bool], optional): Enable cropping of long lines. Defaults to False. - indent_guides (bool, optional): Enable indentation guides. Defaults to False. - max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. - Defaults to None. - max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to None. - max_depth (int, optional): Maximum depth of nested data structures, or None for no maximum. Defaults to None. - expand_all (bool, optional): Expand all containers. Defaults to False. - max_frames (int): Maximum number of frames to show in a traceback, 0 for no maximum. Defaults to 100. - """ - from rich import get_console - - console = console or get_console() - assert console is not None - - def display_hook(value: Any) -> None: - """Replacement sys.displayhook which prettifies objects with Rich.""" - if value is not None: - assert console is not None - builtins._ = None # type: ignore[attr-defined] - console.print( - value - if _safe_isinstance(value, RichRenderable) - else Pretty( - value, - overflow=overflow, - indent_guides=indent_guides, - max_length=max_length, - max_string=max_string, - max_depth=max_depth, - expand_all=expand_all, - ), - crop=crop, - ) - builtins._ = value # type: ignore[attr-defined] - - if "get_ipython" in globals(): - ip = get_ipython() # type: ignore[name-defined] - from IPython.core.formatters import BaseFormatter - - class RichFormatter(BaseFormatter): # type: ignore[misc] - pprint: bool = True - - def __call__(self, value: Any) -> Any: - if self.pprint: - return _ipy_display_hook( - value, - console=get_console(), - overflow=overflow, - indent_guides=indent_guides, - max_length=max_length, - max_string=max_string, - max_depth=max_depth, - expand_all=expand_all, - ) - else: - return repr(value) - - # replace plain text formatter with rich formatter - rich_formatter = RichFormatter() - ip.display_formatter.formatters["text/plain"] = rich_formatter - else: - sys.displayhook = display_hook - - -class Pretty(JupyterMixin): - """A rich renderable that pretty prints an object. - - Args: - _object (Any): An object to pretty print. - highlighter (HighlighterType, optional): Highlighter object to apply to result, or None for ReprHighlighter. Defaults to None. - indent_size (int, optional): Number of spaces in indent. Defaults to 4. - justify (JustifyMethod, optional): Justify method, or None for default. Defaults to None. - overflow (OverflowMethod, optional): Overflow method, or None for default. Defaults to None. - no_wrap (Optional[bool], optional): Disable word wrapping. Defaults to False. - indent_guides (bool, optional): Enable indentation guides. Defaults to False. - max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. - Defaults to None. - max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to None. - max_depth (int, optional): Maximum depth of nested data structures, or None for no maximum. Defaults to None. - expand_all (bool, optional): Expand all containers. Defaults to False. - margin (int, optional): Subtrace a margin from width to force containers to expand earlier. Defaults to 0. - insert_line (bool, optional): Insert a new line if the output has multiple new lines. Defaults to False. - """ - - def __init__( - self, - _object: Any, - highlighter: Optional["HighlighterType"] = None, - *, - indent_size: int = 4, - justify: Optional["JustifyMethod"] = None, - overflow: Optional["OverflowMethod"] = None, - no_wrap: Optional[bool] = False, - indent_guides: bool = False, - max_length: Optional[int] = None, - max_string: Optional[int] = None, - max_depth: Optional[int] = None, - expand_all: bool = False, - margin: int = 0, - insert_line: bool = False, - ) -> None: - self._object = _object - self.highlighter = highlighter or ReprHighlighter() - self.indent_size = indent_size - self.justify: Optional["JustifyMethod"] = justify - self.overflow: Optional["OverflowMethod"] = overflow - self.no_wrap = no_wrap - self.indent_guides = indent_guides - self.max_length = max_length - self.max_string = max_string - self.max_depth = max_depth - self.expand_all = expand_all - self.margin = margin - self.insert_line = insert_line - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - pretty_str = pretty_repr( - self._object, - max_width=options.max_width - self.margin, - indent_size=self.indent_size, - max_length=self.max_length, - max_string=self.max_string, - max_depth=self.max_depth, - expand_all=self.expand_all, - ) - pretty_text = Text.from_ansi( - pretty_str, - justify=self.justify or options.justify, - overflow=self.overflow or options.overflow, - no_wrap=pick_bool(self.no_wrap, options.no_wrap), - style="pretty", - ) - pretty_text = ( - self.highlighter(pretty_text) - if pretty_text - else Text( - f"{type(self._object)}.__repr__ returned empty string", - style="dim italic", - ) - ) - if self.indent_guides and not options.ascii_only: - pretty_text = pretty_text.with_indent_guides( - self.indent_size, style="repr.indent" - ) - if self.insert_line and "\n" in pretty_text: - yield "" - yield pretty_text - - def __rich_measure__( - self, console: "Console", options: "ConsoleOptions" - ) -> "Measurement": - pretty_str = pretty_repr( - self._object, - max_width=options.max_width, - indent_size=self.indent_size, - max_length=self.max_length, - max_string=self.max_string, - max_depth=self.max_depth, - expand_all=self.expand_all, - ) - text_width = ( - max(cell_len(line) for line in pretty_str.splitlines()) if pretty_str else 0 - ) - return Measurement(text_width, text_width) - - -def _get_braces_for_defaultdict(_object: DefaultDict[Any, Any]) -> Tuple[str, str, str]: - return ( - f"defaultdict({_object.default_factory!r}, {{", - "})", - f"defaultdict({_object.default_factory!r}, {{}})", - ) - - -def _get_braces_for_array(_object: "array[Any]") -> Tuple[str, str, str]: - return (f"array({_object.typecode!r}, [", "])", f"array({_object.typecode!r})") - - -_BRACES: Dict[type, Callable[[Any], Tuple[str, str, str]]] = { - os._Environ: lambda _object: ("environ({", "})", "environ({})"), - array: _get_braces_for_array, - defaultdict: _get_braces_for_defaultdict, - Counter: lambda _object: ("Counter({", "})", "Counter()"), - deque: lambda _object: ("deque([", "])", "deque()"), - dict: lambda _object: ("{", "}", "{}"), - UserDict: lambda _object: ("{", "}", "{}"), - frozenset: lambda _object: ("frozenset({", "})", "frozenset()"), - list: lambda _object: ("[", "]", "[]"), - UserList: lambda _object: ("[", "]", "[]"), - set: lambda _object: ("{", "}", "set()"), - tuple: lambda _object: ("(", ")", "()"), - MappingProxyType: lambda _object: ("mappingproxy({", "})", "mappingproxy({})"), -} -_CONTAINERS = tuple(_BRACES.keys()) -_MAPPING_CONTAINERS = (dict, os._Environ, MappingProxyType, UserDict) - - -def is_expandable(obj: Any) -> bool: - """Check if an object may be expanded by pretty print.""" - return ( - _safe_isinstance(obj, _CONTAINERS) - or (is_dataclass(obj)) - or (hasattr(obj, "__rich_repr__")) - or _is_attr_object(obj) - ) and not isclass(obj) - - -@dataclass -class Node: - """A node in a repr tree. May be atomic or a container.""" - - key_repr: str = "" - value_repr: str = "" - open_brace: str = "" - close_brace: str = "" - empty: str = "" - last: bool = False - is_tuple: bool = False - is_namedtuple: bool = False - children: Optional[List["Node"]] = None - key_separator: str = ": " - separator: str = ", " - - def iter_tokens(self) -> Iterable[str]: - """Generate tokens for this node.""" - if self.key_repr: - yield self.key_repr - yield self.key_separator - if self.value_repr: - yield self.value_repr - elif self.children is not None: - if self.children: - yield self.open_brace - if self.is_tuple and not self.is_namedtuple and len(self.children) == 1: - yield from self.children[0].iter_tokens() - yield "," - else: - for child in self.children: - yield from child.iter_tokens() - if not child.last: - yield self.separator - yield self.close_brace - else: - yield self.empty - - def check_length(self, start_length: int, max_length: int) -> bool: - """Check the length fits within a limit. - - Args: - start_length (int): Starting length of the line (indent, prefix, suffix). - max_length (int): Maximum length. - - Returns: - bool: True if the node can be rendered within max length, otherwise False. - """ - total_length = start_length - for token in self.iter_tokens(): - total_length += cell_len(token) - if total_length > max_length: - return False - return True - - def __str__(self) -> str: - repr_text = "".join(self.iter_tokens()) - return repr_text - - def render( - self, max_width: int = 80, indent_size: int = 4, expand_all: bool = False - ) -> str: - """Render the node to a pretty repr. - - Args: - max_width (int, optional): Maximum width of the repr. Defaults to 80. - indent_size (int, optional): Size of indents. Defaults to 4. - expand_all (bool, optional): Expand all levels. Defaults to False. - - Returns: - str: A repr string of the original object. - """ - lines = [_Line(node=self, is_root=True)] - line_no = 0 - while line_no < len(lines): - line = lines[line_no] - if line.expandable and not line.expanded: - if expand_all or not line.check_length(max_width): - lines[line_no : line_no + 1] = line.expand(indent_size) - line_no += 1 - - repr_str = "\n".join(str(line) for line in lines) - return repr_str - - -@dataclass -class _Line: - """A line in repr output.""" - - parent: Optional["_Line"] = None - is_root: bool = False - node: Optional[Node] = None - text: str = "" - suffix: str = "" - whitespace: str = "" - expanded: bool = False - last: bool = False - - @property - def expandable(self) -> bool: - """Check if the line may be expanded.""" - return bool(self.node is not None and self.node.children) - - def check_length(self, max_length: int) -> bool: - """Check this line fits within a given number of cells.""" - start_length = ( - len(self.whitespace) + cell_len(self.text) + cell_len(self.suffix) - ) - assert self.node is not None - return self.node.check_length(start_length, max_length) - - def expand(self, indent_size: int) -> Iterable["_Line"]: - """Expand this line by adding children on their own line.""" - node = self.node - assert node is not None - whitespace = self.whitespace - assert node.children - if node.key_repr: - new_line = yield _Line( - text=f"{node.key_repr}{node.key_separator}{node.open_brace}", - whitespace=whitespace, - ) - else: - new_line = yield _Line(text=node.open_brace, whitespace=whitespace) - child_whitespace = self.whitespace + " " * indent_size - tuple_of_one = node.is_tuple and len(node.children) == 1 - for last, child in loop_last(node.children): - separator = "," if tuple_of_one else node.separator - line = _Line( - parent=new_line, - node=child, - whitespace=child_whitespace, - suffix=separator, - last=last and not tuple_of_one, - ) - yield line - - yield _Line( - text=node.close_brace, - whitespace=whitespace, - suffix=self.suffix, - last=self.last, - ) - - def __str__(self) -> str: - if self.last: - return f"{self.whitespace}{self.text}{self.node or ''}" - else: - return ( - f"{self.whitespace}{self.text}{self.node or ''}{self.suffix.rstrip()}" - ) - - -def _is_namedtuple(obj: Any) -> bool: - """Checks if an object is most likely a namedtuple. It is possible - to craft an object that passes this check and isn't a namedtuple, but - there is only a minuscule chance of this happening unintentionally. - - Args: - obj (Any): The object to test - - Returns: - bool: True if the object is a namedtuple. False otherwise. - """ - try: - fields = getattr(obj, "_fields", None) - except Exception: - # Being very defensive - if we cannot get the attr then its not a namedtuple - return False - return isinstance(obj, tuple) and isinstance(fields, tuple) - - -def traverse( - _object: Any, - max_length: Optional[int] = None, - max_string: Optional[int] = None, - max_depth: Optional[int] = None, -) -> Node: - """Traverse object and generate a tree. - - Args: - _object (Any): Object to be traversed. - max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. - Defaults to None. - max_string (int, optional): Maximum length of string before truncating, or None to disable truncating. - Defaults to None. - max_depth (int, optional): Maximum depth of data structures, or None for no maximum. - Defaults to None. - - Returns: - Node: The root of a tree structure which can be used to render a pretty repr. - """ - - def to_repr(obj: Any) -> str: - """Get repr string for an object, but catch errors.""" - if ( - max_string is not None - and _safe_isinstance(obj, (bytes, str)) - and len(obj) > max_string - ): - truncated = len(obj) - max_string - obj_repr = f"{obj[:max_string]!r}+{truncated}" - else: - try: - obj_repr = repr(obj) - except Exception as error: - obj_repr = f"<repr-error {str(error)!r}>" - return obj_repr - - visited_ids: Set[int] = set() - push_visited = visited_ids.add - pop_visited = visited_ids.remove - - def _traverse(obj: Any, root: bool = False, depth: int = 0) -> Node: - """Walk the object depth first.""" - - obj_id = id(obj) - if obj_id in visited_ids: - # Recursion detected - return Node(value_repr="...") - - obj_type = type(obj) - children: List[Node] - reached_max_depth = max_depth is not None and depth >= max_depth - - def iter_rich_args(rich_args: Any) -> Iterable[Union[Any, Tuple[str, Any]]]: - for arg in rich_args: - if _safe_isinstance(arg, tuple): - if len(arg) == 3: - key, child, default = arg - if default == child: - continue - yield key, child - elif len(arg) == 2: - key, child = arg - yield key, child - elif len(arg) == 1: - yield arg[0] - else: - yield arg - - try: - fake_attributes = hasattr( - obj, "awehoi234_wdfjwljet234_234wdfoijsdfmmnxpi492" - ) - except Exception: - fake_attributes = False - - rich_repr_result: Optional[RichReprResult] = None - if not fake_attributes: - try: - if hasattr(obj, "__rich_repr__") and not isclass(obj): - rich_repr_result = obj.__rich_repr__() - except Exception: - pass - - if rich_repr_result is not None: - push_visited(obj_id) - angular = getattr(obj.__rich_repr__, "angular", False) - args = list(iter_rich_args(rich_repr_result)) - class_name = obj.__class__.__name__ - - if args: - children = [] - append = children.append - - if reached_max_depth: - if angular: - node = Node(value_repr=f"<{class_name}...>") - else: - node = Node(value_repr=f"{class_name}(...)") - else: - if angular: - node = Node( - open_brace=f"<{class_name} ", - close_brace=">", - children=children, - last=root, - separator=" ", - ) - else: - node = Node( - open_brace=f"{class_name}(", - close_brace=")", - children=children, - last=root, - ) - for last, arg in loop_last(args): - if _safe_isinstance(arg, tuple): - key, child = arg - child_node = _traverse(child, depth=depth + 1) - child_node.last = last - child_node.key_repr = key - child_node.key_separator = "=" - append(child_node) - else: - child_node = _traverse(arg, depth=depth + 1) - child_node.last = last - append(child_node) - else: - node = Node( - value_repr=f"<{class_name}>" if angular else f"{class_name}()", - children=[], - last=root, - ) - pop_visited(obj_id) - elif _is_attr_object(obj) and not fake_attributes: - push_visited(obj_id) - children = [] - append = children.append - - attr_fields = _get_attr_fields(obj) - if attr_fields: - if reached_max_depth: - node = Node(value_repr=f"{obj.__class__.__name__}(...)") - else: - node = Node( - open_brace=f"{obj.__class__.__name__}(", - close_brace=")", - children=children, - last=root, - ) - - def iter_attrs() -> Iterable[ - Tuple[str, Any, Optional[Callable[[Any], str]]] - ]: - """Iterate over attr fields and values.""" - for attr in attr_fields: - if attr.repr: - try: - value = getattr(obj, attr.name) - except Exception as error: - # Can happen, albeit rarely - yield (attr.name, error, None) - else: - yield ( - attr.name, - value, - attr.repr if callable(attr.repr) else None, - ) - - for last, (name, value, repr_callable) in loop_last(iter_attrs()): - if repr_callable: - child_node = Node(value_repr=str(repr_callable(value))) - else: - child_node = _traverse(value, depth=depth + 1) - child_node.last = last - child_node.key_repr = name - child_node.key_separator = "=" - append(child_node) - else: - node = Node( - value_repr=f"{obj.__class__.__name__}()", children=[], last=root - ) - pop_visited(obj_id) - elif ( - is_dataclass(obj) - and not _safe_isinstance(obj, type) - and not fake_attributes - and _is_dataclass_repr(obj) - ): - push_visited(obj_id) - children = [] - append = children.append - if reached_max_depth: - node = Node(value_repr=f"{obj.__class__.__name__}(...)") - else: - node = Node( - open_brace=f"{obj.__class__.__name__}(", - close_brace=")", - children=children, - last=root, - empty=f"{obj.__class__.__name__}()", - ) - - for last, field in loop_last( - field for field in fields(obj) if field.repr - ): - child_node = _traverse(getattr(obj, field.name), depth=depth + 1) - child_node.key_repr = field.name - child_node.last = last - child_node.key_separator = "=" - append(child_node) - - pop_visited(obj_id) - elif _is_namedtuple(obj) and _has_default_namedtuple_repr(obj): - push_visited(obj_id) - class_name = obj.__class__.__name__ - if reached_max_depth: - # If we've reached the max depth, we still show the class name, but not its contents - node = Node( - value_repr=f"{class_name}(...)", - ) - else: - children = [] - append = children.append - node = Node( - open_brace=f"{class_name}(", - close_brace=")", - children=children, - empty=f"{class_name}()", - ) - for last, (key, value) in loop_last(obj._asdict().items()): - child_node = _traverse(value, depth=depth + 1) - child_node.key_repr = key - child_node.last = last - child_node.key_separator = "=" - append(child_node) - pop_visited(obj_id) - elif _safe_isinstance(obj, _CONTAINERS): - for container_type in _CONTAINERS: - if _safe_isinstance(obj, container_type): - obj_type = container_type - break - - push_visited(obj_id) - - open_brace, close_brace, empty = _BRACES[obj_type](obj) - - if reached_max_depth: - node = Node(value_repr=f"{open_brace}...{close_brace}") - elif obj_type.__repr__ != type(obj).__repr__: - node = Node(value_repr=to_repr(obj), last=root) - elif obj: - children = [] - node = Node( - open_brace=open_brace, - close_brace=close_brace, - children=children, - last=root, - ) - append = children.append - num_items = len(obj) - last_item_index = num_items - 1 - - if _safe_isinstance(obj, _MAPPING_CONTAINERS): - iter_items = iter(obj.items()) - if max_length is not None: - iter_items = islice(iter_items, max_length) - for index, (key, child) in enumerate(iter_items): - child_node = _traverse(child, depth=depth + 1) - child_node.key_repr = to_repr(key) - child_node.last = index == last_item_index - append(child_node) - else: - iter_values = iter(obj) - if max_length is not None: - iter_values = islice(iter_values, max_length) - for index, child in enumerate(iter_values): - child_node = _traverse(child, depth=depth + 1) - child_node.last = index == last_item_index - append(child_node) - if max_length is not None and num_items > max_length: - append(Node(value_repr=f"... +{num_items - max_length}", last=True)) - else: - node = Node(empty=empty, children=[], last=root) - - pop_visited(obj_id) - else: - node = Node(value_repr=to_repr(obj), last=root) - node.is_tuple = _safe_isinstance(obj, tuple) - node.is_namedtuple = _is_namedtuple(obj) - return node - - node = _traverse(_object, root=True) - return node - - -def pretty_repr( - _object: Any, - *, - max_width: int = 80, - indent_size: int = 4, - max_length: Optional[int] = None, - max_string: Optional[int] = None, - max_depth: Optional[int] = None, - expand_all: bool = False, -) -> str: - """Prettify repr string by expanding on to new lines to fit within a given width. - - Args: - _object (Any): Object to repr. - max_width (int, optional): Desired maximum width of repr string. Defaults to 80. - indent_size (int, optional): Number of spaces to indent. Defaults to 4. - max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. - Defaults to None. - max_string (int, optional): Maximum length of string before truncating, or None to disable truncating. - Defaults to None. - max_depth (int, optional): Maximum depth of nested data structure, or None for no depth. - Defaults to None. - expand_all (bool, optional): Expand all containers regardless of available width. Defaults to False. - - Returns: - str: A possibly multi-line representation of the object. - """ - - if _safe_isinstance(_object, Node): - node = _object - else: - node = traverse( - _object, max_length=max_length, max_string=max_string, max_depth=max_depth - ) - repr_str: str = node.render( - max_width=max_width, indent_size=indent_size, expand_all=expand_all - ) - return repr_str - - -def pprint( - _object: Any, - *, - console: Optional["Console"] = None, - indent_guides: bool = True, - max_length: Optional[int] = None, - max_string: Optional[int] = None, - max_depth: Optional[int] = None, - expand_all: bool = False, -) -> None: - """A convenience function for pretty printing. - - Args: - _object (Any): Object to pretty print. - console (Console, optional): Console instance, or None to use default. Defaults to None. - max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. - Defaults to None. - max_string (int, optional): Maximum length of strings before truncating, or None to disable. Defaults to None. - max_depth (int, optional): Maximum depth for nested data structures, or None for unlimited depth. Defaults to None. - indent_guides (bool, optional): Enable indentation guides. Defaults to True. - expand_all (bool, optional): Expand all containers. Defaults to False. - """ - _console = get_console() if console is None else console - _console.print( - Pretty( - _object, - max_length=max_length, - max_string=max_string, - max_depth=max_depth, - indent_guides=indent_guides, - expand_all=expand_all, - overflow="ignore", - ), - soft_wrap=True, - ) - - -if __name__ == "__main__": # pragma: no cover - - class BrokenRepr: - def __repr__(self) -> str: - 1 / 0 - return "this will fail" - - from typing import NamedTuple - - class StockKeepingUnit(NamedTuple): - name: str - description: str - price: float - category: str - reviews: List[str] - - d = defaultdict(int) - d["foo"] = 5 - data = { - "foo": [ - 1, - "Hello World!", - 100.123, - 323.232, - 432324.0, - {5, 6, 7, (1, 2, 3, 4), 8}, - ], - "bar": frozenset({1, 2, 3}), - "defaultdict": defaultdict( - list, {"crumble": ["apple", "rhubarb", "butter", "sugar", "flour"]} - ), - "counter": Counter( - [ - "apple", - "orange", - "pear", - "kumquat", - "kumquat", - "durian" * 100, - ] - ), - "atomic": (False, True, None), - "namedtuple": StockKeepingUnit( - "Sparkling British Spring Water", - "Carbonated spring water", - 0.9, - "water", - ["its amazing!", "its terrible!"], - ), - "Broken": BrokenRepr(), - } - data["foo"].append(data) # type: ignore[attr-defined] - - from rich import print - - # print(Pretty(data, indent_guides=True, max_string=20)) - - class Thing: - def __repr__(self) -> str: - return "Hello\x1b[38;5;239m World!" - - print(Pretty(Thing())) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/progress.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/progress.py deleted file mode 100644 index 43c47eb9..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/progress.py +++ /dev/null @@ -1,1702 +0,0 @@ -import io -import sys -import typing -import warnings -from abc import ABC, abstractmethod -from collections import deque -from dataclasses import dataclass, field -from datetime import timedelta -from io import RawIOBase, UnsupportedOperation -from math import ceil -from mmap import mmap -from operator import length_hint -from os import PathLike, stat -from threading import Event, RLock, Thread -from types import TracebackType -from typing import ( - Any, - BinaryIO, - Callable, - ContextManager, - Deque, - Dict, - Generic, - Iterable, - List, - NamedTuple, - NewType, - Optional, - Sequence, - TextIO, - Tuple, - Type, - TypeVar, - Union, -) - -if sys.version_info >= (3, 8): - from typing import Literal -else: - from typing_extensions import Literal # pragma: no cover - -from . import filesize, get_console -from .console import Console, Group, JustifyMethod, RenderableType -from .highlighter import Highlighter -from .jupyter import JupyterMixin -from .live import Live -from .progress_bar import ProgressBar -from .spinner import Spinner -from .style import StyleType -from .table import Column, Table -from .text import Text, TextType - -TaskID = NewType("TaskID", int) - -ProgressType = TypeVar("ProgressType") - -GetTimeCallable = Callable[[], float] - - -_I = typing.TypeVar("_I", TextIO, BinaryIO) - - -class _TrackThread(Thread): - """A thread to periodically update progress.""" - - def __init__(self, progress: "Progress", task_id: "TaskID", update_period: float): - self.progress = progress - self.task_id = task_id - self.update_period = update_period - self.done = Event() - - self.completed = 0 - super().__init__() - - def run(self) -> None: - task_id = self.task_id - advance = self.progress.advance - update_period = self.update_period - last_completed = 0 - wait = self.done.wait - while not wait(update_period): - completed = self.completed - if last_completed != completed: - advance(task_id, completed - last_completed) - last_completed = completed - - self.progress.update(self.task_id, completed=self.completed, refresh=True) - - def __enter__(self) -> "_TrackThread": - self.start() - return self - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - self.done.set() - self.join() - - -def track( - sequence: Union[Sequence[ProgressType], Iterable[ProgressType]], - description: str = "Working...", - total: Optional[float] = None, - auto_refresh: bool = True, - console: Optional[Console] = None, - transient: bool = False, - get_time: Optional[Callable[[], float]] = None, - refresh_per_second: float = 10, - style: StyleType = "bar.back", - complete_style: StyleType = "bar.complete", - finished_style: StyleType = "bar.finished", - pulse_style: StyleType = "bar.pulse", - update_period: float = 0.1, - disable: bool = False, - show_speed: bool = True, -) -> Iterable[ProgressType]: - """Track progress by iterating over a sequence. - - Args: - sequence (Iterable[ProgressType]): A sequence (must support "len") you wish to iterate over. - description (str, optional): Description of task show next to progress bar. Defaults to "Working". - total: (float, optional): Total number of steps. Default is len(sequence). - auto_refresh (bool, optional): Automatic refresh, disable to force a refresh after each iteration. Default is True. - transient: (bool, optional): Clear the progress on exit. Defaults to False. - console (Console, optional): Console to write to. Default creates internal Console instance. - refresh_per_second (float): Number of times per second to refresh the progress information. Defaults to 10. - style (StyleType, optional): Style for the bar background. Defaults to "bar.back". - complete_style (StyleType, optional): Style for the completed bar. Defaults to "bar.complete". - finished_style (StyleType, optional): Style for a finished bar. Defaults to "bar.finished". - pulse_style (StyleType, optional): Style for pulsing bars. Defaults to "bar.pulse". - update_period (float, optional): Minimum time (in seconds) between calls to update(). Defaults to 0.1. - disable (bool, optional): Disable display of progress. - show_speed (bool, optional): Show speed if total isn't known. Defaults to True. - Returns: - Iterable[ProgressType]: An iterable of the values in the sequence. - - """ - - columns: List["ProgressColumn"] = ( - [TextColumn("[progress.description]{task.description}")] if description else [] - ) - columns.extend( - ( - BarColumn( - style=style, - complete_style=complete_style, - finished_style=finished_style, - pulse_style=pulse_style, - ), - TaskProgressColumn(show_speed=show_speed), - TimeRemainingColumn(elapsed_when_finished=True), - ) - ) - progress = Progress( - *columns, - auto_refresh=auto_refresh, - console=console, - transient=transient, - get_time=get_time, - refresh_per_second=refresh_per_second or 10, - disable=disable, - ) - - with progress: - yield from progress.track( - sequence, total=total, description=description, update_period=update_period - ) - - -class _Reader(RawIOBase, BinaryIO): - """A reader that tracks progress while it's being read from.""" - - def __init__( - self, - handle: BinaryIO, - progress: "Progress", - task: TaskID, - close_handle: bool = True, - ) -> None: - self.handle = handle - self.progress = progress - self.task = task - self.close_handle = close_handle - self._closed = False - - def __enter__(self) -> "_Reader": - self.handle.__enter__() - return self - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - self.close() - - def __iter__(self) -> BinaryIO: - return self - - def __next__(self) -> bytes: - line = next(self.handle) - self.progress.advance(self.task, advance=len(line)) - return line - - @property - def closed(self) -> bool: - return self._closed - - def fileno(self) -> int: - return self.handle.fileno() - - def isatty(self) -> bool: - return self.handle.isatty() - - @property - def mode(self) -> str: - return self.handle.mode - - @property - def name(self) -> str: - return self.handle.name - - def readable(self) -> bool: - return self.handle.readable() - - def seekable(self) -> bool: - return self.handle.seekable() - - def writable(self) -> bool: - return False - - def read(self, size: int = -1) -> bytes: - block = self.handle.read(size) - self.progress.advance(self.task, advance=len(block)) - return block - - def readinto(self, b: Union[bytearray, memoryview, mmap]): # type: ignore[no-untyped-def, override] - n = self.handle.readinto(b) # type: ignore[attr-defined] - self.progress.advance(self.task, advance=n) - return n - - def readline(self, size: int = -1) -> bytes: # type: ignore[override] - line = self.handle.readline(size) - self.progress.advance(self.task, advance=len(line)) - return line - - def readlines(self, hint: int = -1) -> List[bytes]: - lines = self.handle.readlines(hint) - self.progress.advance(self.task, advance=sum(map(len, lines))) - return lines - - def close(self) -> None: - if self.close_handle: - self.handle.close() - self._closed = True - - def seek(self, offset: int, whence: int = 0) -> int: - pos = self.handle.seek(offset, whence) - self.progress.update(self.task, completed=pos) - return pos - - def tell(self) -> int: - return self.handle.tell() - - def write(self, s: Any) -> int: - raise UnsupportedOperation("write") - - -class _ReadContext(ContextManager[_I], Generic[_I]): - """A utility class to handle a context for both a reader and a progress.""" - - def __init__(self, progress: "Progress", reader: _I) -> None: - self.progress = progress - self.reader: _I = reader - - def __enter__(self) -> _I: - self.progress.start() - return self.reader.__enter__() - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - self.progress.stop() - self.reader.__exit__(exc_type, exc_val, exc_tb) - - -def wrap_file( - file: BinaryIO, - total: int, - *, - description: str = "Reading...", - auto_refresh: bool = True, - console: Optional[Console] = None, - transient: bool = False, - get_time: Optional[Callable[[], float]] = None, - refresh_per_second: float = 10, - style: StyleType = "bar.back", - complete_style: StyleType = "bar.complete", - finished_style: StyleType = "bar.finished", - pulse_style: StyleType = "bar.pulse", - disable: bool = False, -) -> ContextManager[BinaryIO]: - """Read bytes from a file while tracking progress. - - Args: - file (Union[str, PathLike[str], BinaryIO]): The path to the file to read, or a file-like object in binary mode. - total (int): Total number of bytes to read. - description (str, optional): Description of task show next to progress bar. Defaults to "Reading". - auto_refresh (bool, optional): Automatic refresh, disable to force a refresh after each iteration. Default is True. - transient: (bool, optional): Clear the progress on exit. Defaults to False. - console (Console, optional): Console to write to. Default creates internal Console instance. - refresh_per_second (float): Number of times per second to refresh the progress information. Defaults to 10. - style (StyleType, optional): Style for the bar background. Defaults to "bar.back". - complete_style (StyleType, optional): Style for the completed bar. Defaults to "bar.complete". - finished_style (StyleType, optional): Style for a finished bar. Defaults to "bar.finished". - pulse_style (StyleType, optional): Style for pulsing bars. Defaults to "bar.pulse". - disable (bool, optional): Disable display of progress. - Returns: - ContextManager[BinaryIO]: A context manager yielding a progress reader. - - """ - - columns: List["ProgressColumn"] = ( - [TextColumn("[progress.description]{task.description}")] if description else [] - ) - columns.extend( - ( - BarColumn( - style=style, - complete_style=complete_style, - finished_style=finished_style, - pulse_style=pulse_style, - ), - DownloadColumn(), - TimeRemainingColumn(), - ) - ) - progress = Progress( - *columns, - auto_refresh=auto_refresh, - console=console, - transient=transient, - get_time=get_time, - refresh_per_second=refresh_per_second or 10, - disable=disable, - ) - - reader = progress.wrap_file(file, total=total, description=description) - return _ReadContext(progress, reader) - - -@typing.overload -def open( - file: Union[str, "PathLike[str]", bytes], - mode: Union[Literal["rt"], Literal["r"]], - buffering: int = -1, - encoding: Optional[str] = None, - errors: Optional[str] = None, - newline: Optional[str] = None, - *, - total: Optional[int] = None, - description: str = "Reading...", - auto_refresh: bool = True, - console: Optional[Console] = None, - transient: bool = False, - get_time: Optional[Callable[[], float]] = None, - refresh_per_second: float = 10, - style: StyleType = "bar.back", - complete_style: StyleType = "bar.complete", - finished_style: StyleType = "bar.finished", - pulse_style: StyleType = "bar.pulse", - disable: bool = False, -) -> ContextManager[TextIO]: - pass - - -@typing.overload -def open( - file: Union[str, "PathLike[str]", bytes], - mode: Literal["rb"], - buffering: int = -1, - encoding: Optional[str] = None, - errors: Optional[str] = None, - newline: Optional[str] = None, - *, - total: Optional[int] = None, - description: str = "Reading...", - auto_refresh: bool = True, - console: Optional[Console] = None, - transient: bool = False, - get_time: Optional[Callable[[], float]] = None, - refresh_per_second: float = 10, - style: StyleType = "bar.back", - complete_style: StyleType = "bar.complete", - finished_style: StyleType = "bar.finished", - pulse_style: StyleType = "bar.pulse", - disable: bool = False, -) -> ContextManager[BinaryIO]: - pass - - -def open( - file: Union[str, "PathLike[str]", bytes], - mode: Union[Literal["rb"], Literal["rt"], Literal["r"]] = "r", - buffering: int = -1, - encoding: Optional[str] = None, - errors: Optional[str] = None, - newline: Optional[str] = None, - *, - total: Optional[int] = None, - description: str = "Reading...", - auto_refresh: bool = True, - console: Optional[Console] = None, - transient: bool = False, - get_time: Optional[Callable[[], float]] = None, - refresh_per_second: float = 10, - style: StyleType = "bar.back", - complete_style: StyleType = "bar.complete", - finished_style: StyleType = "bar.finished", - pulse_style: StyleType = "bar.pulse", - disable: bool = False, -) -> Union[ContextManager[BinaryIO], ContextManager[TextIO]]: - """Read bytes from a file while tracking progress. - - Args: - path (Union[str, PathLike[str], BinaryIO]): The path to the file to read, or a file-like object in binary mode. - mode (str): The mode to use to open the file. Only supports "r", "rb" or "rt". - buffering (int): The buffering strategy to use, see :func:`io.open`. - encoding (str, optional): The encoding to use when reading in text mode, see :func:`io.open`. - errors (str, optional): The error handling strategy for decoding errors, see :func:`io.open`. - newline (str, optional): The strategy for handling newlines in text mode, see :func:`io.open` - total: (int, optional): Total number of bytes to read. Must be provided if reading from a file handle. Default for a path is os.stat(file).st_size. - description (str, optional): Description of task show next to progress bar. Defaults to "Reading". - auto_refresh (bool, optional): Automatic refresh, disable to force a refresh after each iteration. Default is True. - transient: (bool, optional): Clear the progress on exit. Defaults to False. - console (Console, optional): Console to write to. Default creates internal Console instance. - refresh_per_second (float): Number of times per second to refresh the progress information. Defaults to 10. - style (StyleType, optional): Style for the bar background. Defaults to "bar.back". - complete_style (StyleType, optional): Style for the completed bar. Defaults to "bar.complete". - finished_style (StyleType, optional): Style for a finished bar. Defaults to "bar.finished". - pulse_style (StyleType, optional): Style for pulsing bars. Defaults to "bar.pulse". - disable (bool, optional): Disable display of progress. - encoding (str, optional): The encoding to use when reading in text mode. - - Returns: - ContextManager[BinaryIO]: A context manager yielding a progress reader. - - """ - - columns: List["ProgressColumn"] = ( - [TextColumn("[progress.description]{task.description}")] if description else [] - ) - columns.extend( - ( - BarColumn( - style=style, - complete_style=complete_style, - finished_style=finished_style, - pulse_style=pulse_style, - ), - DownloadColumn(), - TimeRemainingColumn(), - ) - ) - progress = Progress( - *columns, - auto_refresh=auto_refresh, - console=console, - transient=transient, - get_time=get_time, - refresh_per_second=refresh_per_second or 10, - disable=disable, - ) - - reader = progress.open( - file, - mode=mode, - buffering=buffering, - encoding=encoding, - errors=errors, - newline=newline, - total=total, - description=description, - ) - return _ReadContext(progress, reader) # type: ignore[return-value, type-var] - - -class ProgressColumn(ABC): - """Base class for a widget to use in progress display.""" - - max_refresh: Optional[float] = None - - def __init__(self, table_column: Optional[Column] = None) -> None: - self._table_column = table_column - self._renderable_cache: Dict[TaskID, Tuple[float, RenderableType]] = {} - self._update_time: Optional[float] = None - - def get_table_column(self) -> Column: - """Get a table column, used to build tasks table.""" - return self._table_column or Column() - - def __call__(self, task: "Task") -> RenderableType: - """Called by the Progress object to return a renderable for the given task. - - Args: - task (Task): An object containing information regarding the task. - - Returns: - RenderableType: Anything renderable (including str). - """ - current_time = task.get_time() - if self.max_refresh is not None and not task.completed: - try: - timestamp, renderable = self._renderable_cache[task.id] - except KeyError: - pass - else: - if timestamp + self.max_refresh > current_time: - return renderable - - renderable = self.render(task) - self._renderable_cache[task.id] = (current_time, renderable) - return renderable - - @abstractmethod - def render(self, task: "Task") -> RenderableType: - """Should return a renderable object.""" - - -class RenderableColumn(ProgressColumn): - """A column to insert an arbitrary column. - - Args: - renderable (RenderableType, optional): Any renderable. Defaults to empty string. - """ - - def __init__( - self, renderable: RenderableType = "", *, table_column: Optional[Column] = None - ): - self.renderable = renderable - super().__init__(table_column=table_column) - - def render(self, task: "Task") -> RenderableType: - return self.renderable - - -class SpinnerColumn(ProgressColumn): - """A column with a 'spinner' animation. - - Args: - spinner_name (str, optional): Name of spinner animation. Defaults to "dots". - style (StyleType, optional): Style of spinner. Defaults to "progress.spinner". - speed (float, optional): Speed factor of spinner. Defaults to 1.0. - finished_text (TextType, optional): Text used when task is finished. Defaults to " ". - """ - - def __init__( - self, - spinner_name: str = "dots", - style: Optional[StyleType] = "progress.spinner", - speed: float = 1.0, - finished_text: TextType = " ", - table_column: Optional[Column] = None, - ): - self.spinner = Spinner(spinner_name, style=style, speed=speed) - self.finished_text = ( - Text.from_markup(finished_text) - if isinstance(finished_text, str) - else finished_text - ) - super().__init__(table_column=table_column) - - def set_spinner( - self, - spinner_name: str, - spinner_style: Optional[StyleType] = "progress.spinner", - speed: float = 1.0, - ) -> None: - """Set a new spinner. - - Args: - spinner_name (str): Spinner name, see python -m rich.spinner. - spinner_style (Optional[StyleType], optional): Spinner style. Defaults to "progress.spinner". - speed (float, optional): Speed factor of spinner. Defaults to 1.0. - """ - self.spinner = Spinner(spinner_name, style=spinner_style, speed=speed) - - def render(self, task: "Task") -> RenderableType: - text = ( - self.finished_text - if task.finished - else self.spinner.render(task.get_time()) - ) - return text - - -class TextColumn(ProgressColumn): - """A column containing text.""" - - def __init__( - self, - text_format: str, - style: StyleType = "none", - justify: JustifyMethod = "left", - markup: bool = True, - highlighter: Optional[Highlighter] = None, - table_column: Optional[Column] = None, - ) -> None: - self.text_format = text_format - self.justify: JustifyMethod = justify - self.style = style - self.markup = markup - self.highlighter = highlighter - super().__init__(table_column=table_column or Column(no_wrap=True)) - - def render(self, task: "Task") -> Text: - _text = self.text_format.format(task=task) - if self.markup: - text = Text.from_markup(_text, style=self.style, justify=self.justify) - else: - text = Text(_text, style=self.style, justify=self.justify) - if self.highlighter: - self.highlighter.highlight(text) - return text - - -class BarColumn(ProgressColumn): - """Renders a visual progress bar. - - Args: - bar_width (Optional[int], optional): Width of bar or None for full width. Defaults to 40. - style (StyleType, optional): Style for the bar background. Defaults to "bar.back". - complete_style (StyleType, optional): Style for the completed bar. Defaults to "bar.complete". - finished_style (StyleType, optional): Style for a finished bar. Defaults to "bar.finished". - pulse_style (StyleType, optional): Style for pulsing bars. Defaults to "bar.pulse". - """ - - def __init__( - self, - bar_width: Optional[int] = 40, - style: StyleType = "bar.back", - complete_style: StyleType = "bar.complete", - finished_style: StyleType = "bar.finished", - pulse_style: StyleType = "bar.pulse", - table_column: Optional[Column] = None, - ) -> None: - self.bar_width = bar_width - self.style = style - self.complete_style = complete_style - self.finished_style = finished_style - self.pulse_style = pulse_style - super().__init__(table_column=table_column) - - def render(self, task: "Task") -> ProgressBar: - """Gets a progress bar widget for a task.""" - return ProgressBar( - total=max(0, task.total) if task.total is not None else None, - completed=max(0, task.completed), - width=None if self.bar_width is None else max(1, self.bar_width), - pulse=not task.started, - animation_time=task.get_time(), - style=self.style, - complete_style=self.complete_style, - finished_style=self.finished_style, - pulse_style=self.pulse_style, - ) - - -class TimeElapsedColumn(ProgressColumn): - """Renders time elapsed.""" - - def render(self, task: "Task") -> Text: - """Show time elapsed.""" - elapsed = task.finished_time if task.finished else task.elapsed - if elapsed is None: - return Text("-:--:--", style="progress.elapsed") - delta = timedelta(seconds=int(elapsed)) - return Text(str(delta), style="progress.elapsed") - - -class TaskProgressColumn(TextColumn): - """Show task progress as a percentage. - - Args: - text_format (str, optional): Format for percentage display. Defaults to "[progress.percentage]{task.percentage:>3.0f}%". - text_format_no_percentage (str, optional): Format if percentage is unknown. Defaults to "". - style (StyleType, optional): Style of output. Defaults to "none". - justify (JustifyMethod, optional): Text justification. Defaults to "left". - markup (bool, optional): Enable markup. Defaults to True. - highlighter (Optional[Highlighter], optional): Highlighter to apply to output. Defaults to None. - table_column (Optional[Column], optional): Table Column to use. Defaults to None. - show_speed (bool, optional): Show speed if total is unknown. Defaults to False. - """ - - def __init__( - self, - text_format: str = "[progress.percentage]{task.percentage:>3.0f}%", - text_format_no_percentage: str = "", - style: StyleType = "none", - justify: JustifyMethod = "left", - markup: bool = True, - highlighter: Optional[Highlighter] = None, - table_column: Optional[Column] = None, - show_speed: bool = False, - ) -> None: - - self.text_format_no_percentage = text_format_no_percentage - self.show_speed = show_speed - super().__init__( - text_format=text_format, - style=style, - justify=justify, - markup=markup, - highlighter=highlighter, - table_column=table_column, - ) - - @classmethod - def render_speed(cls, speed: Optional[float]) -> Text: - """Render the speed in iterations per second. - - Args: - task (Task): A Task object. - - Returns: - Text: Text object containing the task speed. - """ - if speed is None: - return Text("", style="progress.percentage") - unit, suffix = filesize.pick_unit_and_suffix( - int(speed), - ["", "×10³", "×10⁶", "×10⁹", "×10¹²"], - 1000, - ) - data_speed = speed / unit - return Text(f"{data_speed:.1f}{suffix} it/s", style="progress.percentage") - - def render(self, task: "Task") -> Text: - if task.total is None and self.show_speed: - return self.render_speed(task.finished_speed or task.speed) - text_format = ( - self.text_format_no_percentage if task.total is None else self.text_format - ) - _text = text_format.format(task=task) - if self.markup: - text = Text.from_markup(_text, style=self.style, justify=self.justify) - else: - text = Text(_text, style=self.style, justify=self.justify) - if self.highlighter: - self.highlighter.highlight(text) - return text - - -class TimeRemainingColumn(ProgressColumn): - """Renders estimated time remaining. - - Args: - compact (bool, optional): Render MM:SS when time remaining is less than an hour. Defaults to False. - elapsed_when_finished (bool, optional): Render time elapsed when the task is finished. Defaults to False. - """ - - # Only refresh twice a second to prevent jitter - max_refresh = 0.5 - - def __init__( - self, - compact: bool = False, - elapsed_when_finished: bool = False, - table_column: Optional[Column] = None, - ): - self.compact = compact - self.elapsed_when_finished = elapsed_when_finished - super().__init__(table_column=table_column) - - def render(self, task: "Task") -> Text: - """Show time remaining.""" - if self.elapsed_when_finished and task.finished: - task_time = task.finished_time - style = "progress.elapsed" - else: - task_time = task.time_remaining - style = "progress.remaining" - - if task.total is None: - return Text("", style=style) - - if task_time is None: - return Text("--:--" if self.compact else "-:--:--", style=style) - - # Based on https://github.com/tqdm/tqdm/blob/master/tqdm/std.py - minutes, seconds = divmod(int(task_time), 60) - hours, minutes = divmod(minutes, 60) - - if self.compact and not hours: - formatted = f"{minutes:02d}:{seconds:02d}" - else: - formatted = f"{hours:d}:{minutes:02d}:{seconds:02d}" - - return Text(formatted, style=style) - - -class FileSizeColumn(ProgressColumn): - """Renders completed filesize.""" - - def render(self, task: "Task") -> Text: - """Show data completed.""" - data_size = filesize.decimal(int(task.completed)) - return Text(data_size, style="progress.filesize") - - -class TotalFileSizeColumn(ProgressColumn): - """Renders total filesize.""" - - def render(self, task: "Task") -> Text: - """Show data completed.""" - data_size = filesize.decimal(int(task.total)) if task.total is not None else "" - return Text(data_size, style="progress.filesize.total") - - -class MofNCompleteColumn(ProgressColumn): - """Renders completed count/total, e.g. ' 10/1000'. - - Best for bounded tasks with int quantities. - - Space pads the completed count so that progress length does not change as task progresses - past powers of 10. - - Args: - separator (str, optional): Text to separate completed and total values. Defaults to "/". - """ - - def __init__(self, separator: str = "/", table_column: Optional[Column] = None): - self.separator = separator - super().__init__(table_column=table_column) - - def render(self, task: "Task") -> Text: - """Show completed/total.""" - completed = int(task.completed) - total = int(task.total) if task.total is not None else "?" - total_width = len(str(total)) - return Text( - f"{completed:{total_width}d}{self.separator}{total}", - style="progress.download", - ) - - -class DownloadColumn(ProgressColumn): - """Renders file size downloaded and total, e.g. '0.5/2.3 GB'. - - Args: - binary_units (bool, optional): Use binary units, KiB, MiB etc. Defaults to False. - """ - - def __init__( - self, binary_units: bool = False, table_column: Optional[Column] = None - ) -> None: - self.binary_units = binary_units - super().__init__(table_column=table_column) - - def render(self, task: "Task") -> Text: - """Calculate common unit for completed and total.""" - completed = int(task.completed) - - unit_and_suffix_calculation_base = ( - int(task.total) if task.total is not None else completed - ) - if self.binary_units: - unit, suffix = filesize.pick_unit_and_suffix( - unit_and_suffix_calculation_base, - ["bytes", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"], - 1024, - ) - else: - unit, suffix = filesize.pick_unit_and_suffix( - unit_and_suffix_calculation_base, - ["bytes", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"], - 1000, - ) - precision = 0 if unit == 1 else 1 - - completed_ratio = completed / unit - completed_str = f"{completed_ratio:,.{precision}f}" - - if task.total is not None: - total = int(task.total) - total_ratio = total / unit - total_str = f"{total_ratio:,.{precision}f}" - else: - total_str = "?" - - download_status = f"{completed_str}/{total_str} {suffix}" - download_text = Text(download_status, style="progress.download") - return download_text - - -class TransferSpeedColumn(ProgressColumn): - """Renders human readable transfer speed.""" - - def render(self, task: "Task") -> Text: - """Show data transfer speed.""" - speed = task.finished_speed or task.speed - if speed is None: - return Text("?", style="progress.data.speed") - data_speed = filesize.decimal(int(speed)) - return Text(f"{data_speed}/s", style="progress.data.speed") - - -class ProgressSample(NamedTuple): - """Sample of progress for a given time.""" - - timestamp: float - """Timestamp of sample.""" - completed: float - """Number of steps completed.""" - - -@dataclass -class Task: - """Information regarding a progress task. - - This object should be considered read-only outside of the :class:`~Progress` class. - - """ - - id: TaskID - """Task ID associated with this task (used in Progress methods).""" - - description: str - """str: Description of the task.""" - - total: Optional[float] - """Optional[float]: Total number of steps in this task.""" - - completed: float - """float: Number of steps completed""" - - _get_time: GetTimeCallable - """Callable to get the current time.""" - - finished_time: Optional[float] = None - """float: Time task was finished.""" - - visible: bool = True - """bool: Indicates if this task is visible in the progress display.""" - - fields: Dict[str, Any] = field(default_factory=dict) - """dict: Arbitrary fields passed in via Progress.update.""" - - start_time: Optional[float] = field(default=None, init=False, repr=False) - """Optional[float]: Time this task was started, or None if not started.""" - - stop_time: Optional[float] = field(default=None, init=False, repr=False) - """Optional[float]: Time this task was stopped, or None if not stopped.""" - - finished_speed: Optional[float] = None - """Optional[float]: The last speed for a finished task.""" - - _progress: Deque[ProgressSample] = field( - default_factory=lambda: deque(maxlen=1000), init=False, repr=False - ) - - _lock: RLock = field(repr=False, default_factory=RLock) - """Thread lock.""" - - def get_time(self) -> float: - """float: Get the current time, in seconds.""" - return self._get_time() - - @property - def started(self) -> bool: - """bool: Check if the task as started.""" - return self.start_time is not None - - @property - def remaining(self) -> Optional[float]: - """Optional[float]: Get the number of steps remaining, if a non-None total was set.""" - if self.total is None: - return None - return self.total - self.completed - - @property - def elapsed(self) -> Optional[float]: - """Optional[float]: Time elapsed since task was started, or ``None`` if the task hasn't started.""" - if self.start_time is None: - return None - if self.stop_time is not None: - return self.stop_time - self.start_time - return self.get_time() - self.start_time - - @property - def finished(self) -> bool: - """Check if the task has finished.""" - return self.finished_time is not None - - @property - def percentage(self) -> float: - """float: Get progress of task as a percentage. If a None total was set, returns 0""" - if not self.total: - return 0.0 - completed = (self.completed / self.total) * 100.0 - completed = min(100.0, max(0.0, completed)) - return completed - - @property - def speed(self) -> Optional[float]: - """Optional[float]: Get the estimated speed in steps per second.""" - if self.start_time is None: - return None - with self._lock: - progress = self._progress - if not progress: - return None - total_time = progress[-1].timestamp - progress[0].timestamp - if total_time == 0: - return None - iter_progress = iter(progress) - next(iter_progress) - total_completed = sum(sample.completed for sample in iter_progress) - speed = total_completed / total_time - return speed - - @property - def time_remaining(self) -> Optional[float]: - """Optional[float]: Get estimated time to completion, or ``None`` if no data.""" - if self.finished: - return 0.0 - speed = self.speed - if not speed: - return None - remaining = self.remaining - if remaining is None: - return None - estimate = ceil(remaining / speed) - return estimate - - def _reset(self) -> None: - """Reset progress.""" - self._progress.clear() - self.finished_time = None - self.finished_speed = None - - -class Progress(JupyterMixin): - """Renders an auto-updating progress bar(s). - - Args: - console (Console, optional): Optional Console instance. Default will an internal Console instance writing to stdout. - auto_refresh (bool, optional): Enable auto refresh. If disabled, you will need to call `refresh()`. - refresh_per_second (Optional[float], optional): Number of times per second to refresh the progress information or None to use default (10). Defaults to None. - speed_estimate_period: (float, optional): Period (in seconds) used to calculate the speed estimate. Defaults to 30. - transient: (bool, optional): Clear the progress on exit. Defaults to False. - redirect_stdout: (bool, optional): Enable redirection of stdout, so ``print`` may be used. Defaults to True. - redirect_stderr: (bool, optional): Enable redirection of stderr. Defaults to True. - get_time: (Callable, optional): A callable that gets the current time, or None to use Console.get_time. Defaults to None. - disable (bool, optional): Disable progress display. Defaults to False - expand (bool, optional): Expand tasks table to fit width. Defaults to False. - """ - - def __init__( - self, - *columns: Union[str, ProgressColumn], - console: Optional[Console] = None, - auto_refresh: bool = True, - refresh_per_second: float = 10, - speed_estimate_period: float = 30.0, - transient: bool = False, - redirect_stdout: bool = True, - redirect_stderr: bool = True, - get_time: Optional[GetTimeCallable] = None, - disable: bool = False, - expand: bool = False, - ) -> None: - assert refresh_per_second > 0, "refresh_per_second must be > 0" - self._lock = RLock() - self.columns = columns or self.get_default_columns() - self.speed_estimate_period = speed_estimate_period - - self.disable = disable - self.expand = expand - self._tasks: Dict[TaskID, Task] = {} - self._task_index: TaskID = TaskID(0) - self.live = Live( - console=console or get_console(), - auto_refresh=auto_refresh, - refresh_per_second=refresh_per_second, - transient=transient, - redirect_stdout=redirect_stdout, - redirect_stderr=redirect_stderr, - get_renderable=self.get_renderable, - ) - self.get_time = get_time or self.console.get_time - self.print = self.console.print - self.log = self.console.log - - @classmethod - def get_default_columns(cls) -> Tuple[ProgressColumn, ...]: - """Get the default columns used for a new Progress instance: - - a text column for the description (TextColumn) - - the bar itself (BarColumn) - - a text column showing completion percentage (TextColumn) - - an estimated-time-remaining column (TimeRemainingColumn) - If the Progress instance is created without passing a columns argument, - the default columns defined here will be used. - - You can also create a Progress instance using custom columns before - and/or after the defaults, as in this example: - - progress = Progress( - SpinnerColumn(), - *Progress.default_columns(), - "Elapsed:", - TimeElapsedColumn(), - ) - - This code shows the creation of a Progress display, containing - a spinner to the left, the default columns, and a labeled elapsed - time column. - """ - return ( - TextColumn("[progress.description]{task.description}"), - BarColumn(), - TaskProgressColumn(), - TimeRemainingColumn(), - ) - - @property - def console(self) -> Console: - return self.live.console - - @property - def tasks(self) -> List[Task]: - """Get a list of Task instances.""" - with self._lock: - return list(self._tasks.values()) - - @property - def task_ids(self) -> List[TaskID]: - """A list of task IDs.""" - with self._lock: - return list(self._tasks.keys()) - - @property - def finished(self) -> bool: - """Check if all tasks have been completed.""" - with self._lock: - if not self._tasks: - return True - return all(task.finished for task in self._tasks.values()) - - def start(self) -> None: - """Start the progress display.""" - if not self.disable: - self.live.start(refresh=True) - - def stop(self) -> None: - """Stop the progress display.""" - self.live.stop() - if not self.console.is_interactive: - self.console.print() - - def __enter__(self) -> "Progress": - self.start() - return self - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - self.stop() - - def track( - self, - sequence: Union[Iterable[ProgressType], Sequence[ProgressType]], - total: Optional[float] = None, - task_id: Optional[TaskID] = None, - description: str = "Working...", - update_period: float = 0.1, - ) -> Iterable[ProgressType]: - """Track progress by iterating over a sequence. - - Args: - sequence (Sequence[ProgressType]): A sequence of values you want to iterate over and track progress. - total: (float, optional): Total number of steps. Default is len(sequence). - task_id: (TaskID): Task to track. Default is new task. - description: (str, optional): Description of task, if new task is created. - update_period (float, optional): Minimum time (in seconds) between calls to update(). Defaults to 0.1. - - Returns: - Iterable[ProgressType]: An iterable of values taken from the provided sequence. - """ - if total is None: - total = float(length_hint(sequence)) or None - - if task_id is None: - task_id = self.add_task(description, total=total) - else: - self.update(task_id, total=total) - - if self.live.auto_refresh: - with _TrackThread(self, task_id, update_period) as track_thread: - for value in sequence: - yield value - track_thread.completed += 1 - else: - advance = self.advance - refresh = self.refresh - for value in sequence: - yield value - advance(task_id, 1) - refresh() - - def wrap_file( - self, - file: BinaryIO, - total: Optional[int] = None, - *, - task_id: Optional[TaskID] = None, - description: str = "Reading...", - ) -> BinaryIO: - """Track progress file reading from a binary file. - - Args: - file (BinaryIO): A file-like object opened in binary mode. - total (int, optional): Total number of bytes to read. This must be provided unless a task with a total is also given. - task_id (TaskID): Task to track. Default is new task. - description (str, optional): Description of task, if new task is created. - - Returns: - BinaryIO: A readable file-like object in binary mode. - - Raises: - ValueError: When no total value can be extracted from the arguments or the task. - """ - # attempt to recover the total from the task - total_bytes: Optional[float] = None - if total is not None: - total_bytes = total - elif task_id is not None: - with self._lock: - total_bytes = self._tasks[task_id].total - if total_bytes is None: - raise ValueError( - f"unable to get the total number of bytes, please specify 'total'" - ) - - # update total of task or create new task - if task_id is None: - task_id = self.add_task(description, total=total_bytes) - else: - self.update(task_id, total=total_bytes) - - return _Reader(file, self, task_id, close_handle=False) - - @typing.overload - def open( - self, - file: Union[str, "PathLike[str]", bytes], - mode: Literal["rb"], - buffering: int = -1, - encoding: Optional[str] = None, - errors: Optional[str] = None, - newline: Optional[str] = None, - *, - total: Optional[int] = None, - task_id: Optional[TaskID] = None, - description: str = "Reading...", - ) -> BinaryIO: - pass - - @typing.overload - def open( - self, - file: Union[str, "PathLike[str]", bytes], - mode: Union[Literal["r"], Literal["rt"]], - buffering: int = -1, - encoding: Optional[str] = None, - errors: Optional[str] = None, - newline: Optional[str] = None, - *, - total: Optional[int] = None, - task_id: Optional[TaskID] = None, - description: str = "Reading...", - ) -> TextIO: - pass - - def open( - self, - file: Union[str, "PathLike[str]", bytes], - mode: Union[Literal["rb"], Literal["rt"], Literal["r"]] = "r", - buffering: int = -1, - encoding: Optional[str] = None, - errors: Optional[str] = None, - newline: Optional[str] = None, - *, - total: Optional[int] = None, - task_id: Optional[TaskID] = None, - description: str = "Reading...", - ) -> Union[BinaryIO, TextIO]: - """Track progress while reading from a binary file. - - Args: - path (Union[str, PathLike[str]]): The path to the file to read. - mode (str): The mode to use to open the file. Only supports "r", "rb" or "rt". - buffering (int): The buffering strategy to use, see :func:`io.open`. - encoding (str, optional): The encoding to use when reading in text mode, see :func:`io.open`. - errors (str, optional): The error handling strategy for decoding errors, see :func:`io.open`. - newline (str, optional): The strategy for handling newlines in text mode, see :func:`io.open`. - total (int, optional): Total number of bytes to read. If none given, os.stat(path).st_size is used. - task_id (TaskID): Task to track. Default is new task. - description (str, optional): Description of task, if new task is created. - - Returns: - BinaryIO: A readable file-like object in binary mode. - - Raises: - ValueError: When an invalid mode is given. - """ - # normalize the mode (always rb, rt) - _mode = "".join(sorted(mode, reverse=False)) - if _mode not in ("br", "rt", "r"): - raise ValueError("invalid mode {!r}".format(mode)) - - # patch buffering to provide the same behaviour as the builtin `open` - line_buffering = buffering == 1 - if _mode == "br" and buffering == 1: - warnings.warn( - "line buffering (buffering=1) isn't supported in binary mode, the default buffer size will be used", - RuntimeWarning, - ) - buffering = -1 - elif _mode in ("rt", "r"): - if buffering == 0: - raise ValueError("can't have unbuffered text I/O") - elif buffering == 1: - buffering = -1 - - # attempt to get the total with `os.stat` - if total is None: - total = stat(file).st_size - - # update total of task or create new task - if task_id is None: - task_id = self.add_task(description, total=total) - else: - self.update(task_id, total=total) - - # open the file in binary mode, - handle = io.open(file, "rb", buffering=buffering) - reader = _Reader(handle, self, task_id, close_handle=True) - - # wrap the reader in a `TextIOWrapper` if text mode - if mode in ("r", "rt"): - return io.TextIOWrapper( - reader, - encoding=encoding, - errors=errors, - newline=newline, - line_buffering=line_buffering, - ) - - return reader - - def start_task(self, task_id: TaskID) -> None: - """Start a task. - - Starts a task (used when calculating elapsed time). You may need to call this manually, - if you called ``add_task`` with ``start=False``. - - Args: - task_id (TaskID): ID of task. - """ - with self._lock: - task = self._tasks[task_id] - if task.start_time is None: - task.start_time = self.get_time() - - def stop_task(self, task_id: TaskID) -> None: - """Stop a task. - - This will freeze the elapsed time on the task. - - Args: - task_id (TaskID): ID of task. - """ - with self._lock: - task = self._tasks[task_id] - current_time = self.get_time() - if task.start_time is None: - task.start_time = current_time - task.stop_time = current_time - - def update( - self, - task_id: TaskID, - *, - total: Optional[float] = None, - completed: Optional[float] = None, - advance: Optional[float] = None, - description: Optional[str] = None, - visible: Optional[bool] = None, - refresh: bool = False, - **fields: Any, - ) -> None: - """Update information associated with a task. - - Args: - task_id (TaskID): Task id (returned by add_task). - total (float, optional): Updates task.total if not None. - completed (float, optional): Updates task.completed if not None. - advance (float, optional): Add a value to task.completed if not None. - description (str, optional): Change task description if not None. - visible (bool, optional): Set visible flag if not None. - refresh (bool): Force a refresh of progress information. Default is False. - **fields (Any): Additional data fields required for rendering. - """ - with self._lock: - task = self._tasks[task_id] - completed_start = task.completed - - if total is not None and total != task.total: - task.total = total - task._reset() - if advance is not None: - task.completed += advance - if completed is not None: - task.completed = completed - if description is not None: - task.description = description - if visible is not None: - task.visible = visible - task.fields.update(fields) - update_completed = task.completed - completed_start - - current_time = self.get_time() - old_sample_time = current_time - self.speed_estimate_period - _progress = task._progress - - popleft = _progress.popleft - while _progress and _progress[0].timestamp < old_sample_time: - popleft() - if update_completed > 0: - _progress.append(ProgressSample(current_time, update_completed)) - if ( - task.total is not None - and task.completed >= task.total - and task.finished_time is None - ): - task.finished_time = task.elapsed - - if refresh: - self.refresh() - - def reset( - self, - task_id: TaskID, - *, - start: bool = True, - total: Optional[float] = None, - completed: int = 0, - visible: Optional[bool] = None, - description: Optional[str] = None, - **fields: Any, - ) -> None: - """Reset a task so completed is 0 and the clock is reset. - - Args: - task_id (TaskID): ID of task. - start (bool, optional): Start the task after reset. Defaults to True. - total (float, optional): New total steps in task, or None to use current total. Defaults to None. - completed (int, optional): Number of steps completed. Defaults to 0. - visible (bool, optional): Enable display of the task. Defaults to True. - description (str, optional): Change task description if not None. Defaults to None. - **fields (str): Additional data fields required for rendering. - """ - current_time = self.get_time() - with self._lock: - task = self._tasks[task_id] - task._reset() - task.start_time = current_time if start else None - if total is not None: - task.total = total - task.completed = completed - if visible is not None: - task.visible = visible - if fields: - task.fields = fields - if description is not None: - task.description = description - task.finished_time = None - self.refresh() - - def advance(self, task_id: TaskID, advance: float = 1) -> None: - """Advance task by a number of steps. - - Args: - task_id (TaskID): ID of task. - advance (float): Number of steps to advance. Default is 1. - """ - current_time = self.get_time() - with self._lock: - task = self._tasks[task_id] - completed_start = task.completed - task.completed += advance - update_completed = task.completed - completed_start - old_sample_time = current_time - self.speed_estimate_period - _progress = task._progress - - popleft = _progress.popleft - while _progress and _progress[0].timestamp < old_sample_time: - popleft() - while len(_progress) > 1000: - popleft() - _progress.append(ProgressSample(current_time, update_completed)) - if ( - task.total is not None - and task.completed >= task.total - and task.finished_time is None - ): - task.finished_time = task.elapsed - task.finished_speed = task.speed - - def refresh(self) -> None: - """Refresh (render) the progress information.""" - if not self.disable and self.live.is_started: - self.live.refresh() - - def get_renderable(self) -> RenderableType: - """Get a renderable for the progress display.""" - renderable = Group(*self.get_renderables()) - return renderable - - def get_renderables(self) -> Iterable[RenderableType]: - """Get a number of renderables for the progress display.""" - table = self.make_tasks_table(self.tasks) - yield table - - def make_tasks_table(self, tasks: Iterable[Task]) -> Table: - """Get a table to render the Progress display. - - Args: - tasks (Iterable[Task]): An iterable of Task instances, one per row of the table. - - Returns: - Table: A table instance. - """ - table_columns = ( - ( - Column(no_wrap=True) - if isinstance(_column, str) - else _column.get_table_column().copy() - ) - for _column in self.columns - ) - table = Table.grid(*table_columns, padding=(0, 1), expand=self.expand) - - for task in tasks: - if task.visible: - table.add_row( - *( - ( - column.format(task=task) - if isinstance(column, str) - else column(task) - ) - for column in self.columns - ) - ) - return table - - def __rich__(self) -> RenderableType: - """Makes the Progress class itself renderable.""" - with self._lock: - return self.get_renderable() - - def add_task( - self, - description: str, - start: bool = True, - total: Optional[float] = 100.0, - completed: int = 0, - visible: bool = True, - **fields: Any, - ) -> TaskID: - """Add a new 'task' to the Progress display. - - Args: - description (str): A description of the task. - start (bool, optional): Start the task immediately (to calculate elapsed time). If set to False, - you will need to call `start` manually. Defaults to True. - total (float, optional): Number of total steps in the progress if known. - Set to None to render a pulsing animation. Defaults to 100. - completed (int, optional): Number of steps completed so far. Defaults to 0. - visible (bool, optional): Enable display of the task. Defaults to True. - **fields (str): Additional data fields required for rendering. - - Returns: - TaskID: An ID you can use when calling `update`. - """ - with self._lock: - task = Task( - self._task_index, - description, - total, - completed, - visible=visible, - fields=fields, - _get_time=self.get_time, - _lock=self._lock, - ) - self._tasks[self._task_index] = task - if start: - self.start_task(self._task_index) - new_task_index = self._task_index - self._task_index = TaskID(int(self._task_index) + 1) - self.refresh() - return new_task_index - - def remove_task(self, task_id: TaskID) -> None: - """Delete a task if it exists. - - Args: - task_id (TaskID): A task ID. - - """ - with self._lock: - del self._tasks[task_id] - - -if __name__ == "__main__": # pragma: no coverage - - import random - import time - - from .panel import Panel - from .rule import Rule - from .syntax import Syntax - from .table import Table - - syntax = Syntax( - '''def loop_last(values: Iterable[T]) -> Iterable[Tuple[bool, T]]: - """Iterate and generate a tuple with a flag for last value.""" - iter_values = iter(values) - try: - previous_value = next(iter_values) - except StopIteration: - return - for value in iter_values: - yield False, previous_value - previous_value = value - yield True, previous_value''', - "python", - line_numbers=True, - ) - - table = Table("foo", "bar", "baz") - table.add_row("1", "2", "3") - - progress_renderables = [ - "Text may be printed while the progress bars are rendering.", - Panel("In fact, [i]any[/i] renderable will work"), - "Such as [magenta]tables[/]...", - table, - "Pretty printed structures...", - {"type": "example", "text": "Pretty printed"}, - "Syntax...", - syntax, - Rule("Give it a try!"), - ] - - from itertools import cycle - - examples = cycle(progress_renderables) - - console = Console(record=True) - - with Progress( - SpinnerColumn(), - *Progress.get_default_columns(), - TimeElapsedColumn(), - console=console, - transient=False, - ) as progress: - - task1 = progress.add_task("[red]Downloading", total=1000) - task2 = progress.add_task("[green]Processing", total=1000) - task3 = progress.add_task("[yellow]Thinking", total=None) - - while not progress.finished: - progress.update(task1, advance=0.5) - progress.update(task2, advance=0.3) - time.sleep(0.01) - if random.randint(0, 100) < 1: - progress.log(next(examples)) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/progress_bar.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/progress_bar.py deleted file mode 100644 index 67361df2..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/progress_bar.py +++ /dev/null @@ -1,224 +0,0 @@ -import math -from functools import lru_cache -from time import monotonic -from typing import Iterable, List, Optional - -from .color import Color, blend_rgb -from .color_triplet import ColorTriplet -from .console import Console, ConsoleOptions, RenderResult -from .jupyter import JupyterMixin -from .measure import Measurement -from .segment import Segment -from .style import Style, StyleType - -# Number of characters before 'pulse' animation repeats -PULSE_SIZE = 20 - - -class ProgressBar(JupyterMixin): - """Renders a (progress) bar. Used by rich.progress. - - Args: - total (float, optional): Number of steps in the bar. Defaults to 100. Set to None to render a pulsing animation. - completed (float, optional): Number of steps completed. Defaults to 0. - width (int, optional): Width of the bar, or ``None`` for maximum width. Defaults to None. - pulse (bool, optional): Enable pulse effect. Defaults to False. Will pulse if a None total was passed. - style (StyleType, optional): Style for the bar background. Defaults to "bar.back". - complete_style (StyleType, optional): Style for the completed bar. Defaults to "bar.complete". - finished_style (StyleType, optional): Style for a finished bar. Defaults to "bar.finished". - pulse_style (StyleType, optional): Style for pulsing bars. Defaults to "bar.pulse". - animation_time (Optional[float], optional): Time in seconds to use for animation, or None to use system time. - """ - - def __init__( - self, - total: Optional[float] = 100.0, - completed: float = 0, - width: Optional[int] = None, - pulse: bool = False, - style: StyleType = "bar.back", - complete_style: StyleType = "bar.complete", - finished_style: StyleType = "bar.finished", - pulse_style: StyleType = "bar.pulse", - animation_time: Optional[float] = None, - ): - self.total = total - self.completed = completed - self.width = width - self.pulse = pulse - self.style = style - self.complete_style = complete_style - self.finished_style = finished_style - self.pulse_style = pulse_style - self.animation_time = animation_time - - self._pulse_segments: Optional[List[Segment]] = None - - def __repr__(self) -> str: - return f"<Bar {self.completed!r} of {self.total!r}>" - - @property - def percentage_completed(self) -> Optional[float]: - """Calculate percentage complete.""" - if self.total is None: - return None - completed = (self.completed / self.total) * 100.0 - completed = min(100, max(0.0, completed)) - return completed - - @lru_cache(maxsize=16) - def _get_pulse_segments( - self, - fore_style: Style, - back_style: Style, - color_system: str, - no_color: bool, - ascii: bool = False, - ) -> List[Segment]: - """Get a list of segments to render a pulse animation. - - Returns: - List[Segment]: A list of segments, one segment per character. - """ - bar = "-" if ascii else "━" - segments: List[Segment] = [] - if color_system not in ("standard", "eight_bit", "truecolor") or no_color: - segments += [Segment(bar, fore_style)] * (PULSE_SIZE // 2) - segments += [Segment(" " if no_color else bar, back_style)] * ( - PULSE_SIZE - (PULSE_SIZE // 2) - ) - return segments - - append = segments.append - fore_color = ( - fore_style.color.get_truecolor() - if fore_style.color - else ColorTriplet(255, 0, 255) - ) - back_color = ( - back_style.color.get_truecolor() - if back_style.color - else ColorTriplet(0, 0, 0) - ) - cos = math.cos - pi = math.pi - _Segment = Segment - _Style = Style - from_triplet = Color.from_triplet - - for index in range(PULSE_SIZE): - position = index / PULSE_SIZE - fade = 0.5 + cos((position * pi * 2)) / 2.0 - color = blend_rgb(fore_color, back_color, cross_fade=fade) - append(_Segment(bar, _Style(color=from_triplet(color)))) - return segments - - def update(self, completed: float, total: Optional[float] = None) -> None: - """Update progress with new values. - - Args: - completed (float): Number of steps completed. - total (float, optional): Total number of steps, or ``None`` to not change. Defaults to None. - """ - self.completed = completed - self.total = total if total is not None else self.total - - def _render_pulse( - self, console: Console, width: int, ascii: bool = False - ) -> Iterable[Segment]: - """Renders the pulse animation. - - Args: - console (Console): Console instance. - width (int): Width in characters of pulse animation. - - Returns: - RenderResult: [description] - - Yields: - Iterator[Segment]: Segments to render pulse - """ - fore_style = console.get_style(self.pulse_style, default="white") - back_style = console.get_style(self.style, default="black") - - pulse_segments = self._get_pulse_segments( - fore_style, back_style, console.color_system, console.no_color, ascii=ascii - ) - segment_count = len(pulse_segments) - current_time = ( - monotonic() if self.animation_time is None else self.animation_time - ) - segments = pulse_segments * (int(width / segment_count) + 2) - offset = int(-current_time * 15) % segment_count - segments = segments[offset : offset + width] - yield from segments - - def __rich_console__( - self, console: Console, options: ConsoleOptions - ) -> RenderResult: - - width = min(self.width or options.max_width, options.max_width) - ascii = options.legacy_windows or options.ascii_only - should_pulse = self.pulse or self.total is None - if should_pulse: - yield from self._render_pulse(console, width, ascii=ascii) - return - - completed: Optional[float] = ( - min(self.total, max(0, self.completed)) if self.total is not None else None - ) - - bar = "-" if ascii else "━" - half_bar_right = " " if ascii else "╸" - half_bar_left = " " if ascii else "╺" - complete_halves = ( - int(width * 2 * completed / self.total) - if self.total and completed is not None - else width * 2 - ) - bar_count = complete_halves // 2 - half_bar_count = complete_halves % 2 - style = console.get_style(self.style) - is_finished = self.total is None or self.completed >= self.total - complete_style = console.get_style( - self.finished_style if is_finished else self.complete_style - ) - _Segment = Segment - if bar_count: - yield _Segment(bar * bar_count, complete_style) - if half_bar_count: - yield _Segment(half_bar_right * half_bar_count, complete_style) - - if not console.no_color: - remaining_bars = width - bar_count - half_bar_count - if remaining_bars and console.color_system is not None: - if not half_bar_count and bar_count: - yield _Segment(half_bar_left, style) - remaining_bars -= 1 - if remaining_bars: - yield _Segment(bar * remaining_bars, style) - - def __rich_measure__( - self, console: Console, options: ConsoleOptions - ) -> Measurement: - return ( - Measurement(self.width, self.width) - if self.width is not None - else Measurement(4, options.max_width) - ) - - -if __name__ == "__main__": # pragma: no cover - console = Console() - bar = ProgressBar(width=50, total=100) - - import time - - console.show_cursor(False) - for n in range(0, 101, 1): - bar.update(n) - console.print(bar) - console.file.write("\r") - time.sleep(0.05) - console.show_cursor(True) - console.print() diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/prompt.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/prompt.py deleted file mode 100644 index 064c959b..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/prompt.py +++ /dev/null @@ -1,376 +0,0 @@ -from typing import Any, Generic, List, Optional, TextIO, TypeVar, Union, overload - -from . import get_console -from .console import Console -from .text import Text, TextType - -PromptType = TypeVar("PromptType") -DefaultType = TypeVar("DefaultType") - - -class PromptError(Exception): - """Exception base class for prompt related errors.""" - - -class InvalidResponse(PromptError): - """Exception to indicate a response was invalid. Raise this within process_response() to indicate an error - and provide an error message. - - Args: - message (Union[str, Text]): Error message. - """ - - def __init__(self, message: TextType) -> None: - self.message = message - - def __rich__(self) -> TextType: - return self.message - - -class PromptBase(Generic[PromptType]): - """Ask the user for input until a valid response is received. This is the base class, see one of - the concrete classes for examples. - - Args: - prompt (TextType, optional): Prompt text. Defaults to "". - console (Console, optional): A Console instance or None to use global console. Defaults to None. - password (bool, optional): Enable password input. Defaults to False. - choices (List[str], optional): A list of valid choices. Defaults to None. - show_default (bool, optional): Show default in prompt. Defaults to True. - show_choices (bool, optional): Show choices in prompt. Defaults to True. - """ - - response_type: type = str - - validate_error_message = "[prompt.invalid]Please enter a valid value" - illegal_choice_message = ( - "[prompt.invalid.choice]Please select one of the available options" - ) - prompt_suffix = ": " - - choices: Optional[List[str]] = None - - def __init__( - self, - prompt: TextType = "", - *, - console: Optional[Console] = None, - password: bool = False, - choices: Optional[List[str]] = None, - show_default: bool = True, - show_choices: bool = True, - ) -> None: - self.console = console or get_console() - self.prompt = ( - Text.from_markup(prompt, style="prompt") - if isinstance(prompt, str) - else prompt - ) - self.password = password - if choices is not None: - self.choices = choices - self.show_default = show_default - self.show_choices = show_choices - - @classmethod - @overload - def ask( - cls, - prompt: TextType = "", - *, - console: Optional[Console] = None, - password: bool = False, - choices: Optional[List[str]] = None, - show_default: bool = True, - show_choices: bool = True, - default: DefaultType, - stream: Optional[TextIO] = None, - ) -> Union[DefaultType, PromptType]: - ... - - @classmethod - @overload - def ask( - cls, - prompt: TextType = "", - *, - console: Optional[Console] = None, - password: bool = False, - choices: Optional[List[str]] = None, - show_default: bool = True, - show_choices: bool = True, - stream: Optional[TextIO] = None, - ) -> PromptType: - ... - - @classmethod - def ask( - cls, - prompt: TextType = "", - *, - console: Optional[Console] = None, - password: bool = False, - choices: Optional[List[str]] = None, - show_default: bool = True, - show_choices: bool = True, - default: Any = ..., - stream: Optional[TextIO] = None, - ) -> Any: - """Shortcut to construct and run a prompt loop and return the result. - - Example: - >>> filename = Prompt.ask("Enter a filename") - - Args: - prompt (TextType, optional): Prompt text. Defaults to "". - console (Console, optional): A Console instance or None to use global console. Defaults to None. - password (bool, optional): Enable password input. Defaults to False. - choices (List[str], optional): A list of valid choices. Defaults to None. - show_default (bool, optional): Show default in prompt. Defaults to True. - show_choices (bool, optional): Show choices in prompt. Defaults to True. - stream (TextIO, optional): Optional text file open for reading to get input. Defaults to None. - """ - _prompt = cls( - prompt, - console=console, - password=password, - choices=choices, - show_default=show_default, - show_choices=show_choices, - ) - return _prompt(default=default, stream=stream) - - def render_default(self, default: DefaultType) -> Text: - """Turn the supplied default in to a Text instance. - - Args: - default (DefaultType): Default value. - - Returns: - Text: Text containing rendering of default value. - """ - return Text(f"({default})", "prompt.default") - - def make_prompt(self, default: DefaultType) -> Text: - """Make prompt text. - - Args: - default (DefaultType): Default value. - - Returns: - Text: Text to display in prompt. - """ - prompt = self.prompt.copy() - prompt.end = "" - - if self.show_choices and self.choices: - _choices = "/".join(self.choices) - choices = f"[{_choices}]" - prompt.append(" ") - prompt.append(choices, "prompt.choices") - - if ( - default != ... - and self.show_default - and isinstance(default, (str, self.response_type)) - ): - prompt.append(" ") - _default = self.render_default(default) - prompt.append(_default) - - prompt.append(self.prompt_suffix) - - return prompt - - @classmethod - def get_input( - cls, - console: Console, - prompt: TextType, - password: bool, - stream: Optional[TextIO] = None, - ) -> str: - """Get input from user. - - Args: - console (Console): Console instance. - prompt (TextType): Prompt text. - password (bool): Enable password entry. - - Returns: - str: String from user. - """ - return console.input(prompt, password=password, stream=stream) - - def check_choice(self, value: str) -> bool: - """Check value is in the list of valid choices. - - Args: - value (str): Value entered by user. - - Returns: - bool: True if choice was valid, otherwise False. - """ - assert self.choices is not None - return value.strip() in self.choices - - def process_response(self, value: str) -> PromptType: - """Process response from user, convert to prompt type. - - Args: - value (str): String typed by user. - - Raises: - InvalidResponse: If ``value`` is invalid. - - Returns: - PromptType: The value to be returned from ask method. - """ - value = value.strip() - try: - return_value: PromptType = self.response_type(value) - except ValueError: - raise InvalidResponse(self.validate_error_message) - - if self.choices is not None and not self.check_choice(value): - raise InvalidResponse(self.illegal_choice_message) - - return return_value - - def on_validate_error(self, value: str, error: InvalidResponse) -> None: - """Called to handle validation error. - - Args: - value (str): String entered by user. - error (InvalidResponse): Exception instance the initiated the error. - """ - self.console.print(error) - - def pre_prompt(self) -> None: - """Hook to display something before the prompt.""" - - @overload - def __call__(self, *, stream: Optional[TextIO] = None) -> PromptType: - ... - - @overload - def __call__( - self, *, default: DefaultType, stream: Optional[TextIO] = None - ) -> Union[PromptType, DefaultType]: - ... - - def __call__(self, *, default: Any = ..., stream: Optional[TextIO] = None) -> Any: - """Run the prompt loop. - - Args: - default (Any, optional): Optional default value. - - Returns: - PromptType: Processed value. - """ - while True: - self.pre_prompt() - prompt = self.make_prompt(default) - value = self.get_input(self.console, prompt, self.password, stream=stream) - if value == "" and default != ...: - return default - try: - return_value = self.process_response(value) - except InvalidResponse as error: - self.on_validate_error(value, error) - continue - else: - return return_value - - -class Prompt(PromptBase[str]): - """A prompt that returns a str. - - Example: - >>> name = Prompt.ask("Enter your name") - - - """ - - response_type = str - - -class IntPrompt(PromptBase[int]): - """A prompt that returns an integer. - - Example: - >>> burrito_count = IntPrompt.ask("How many burritos do you want to order") - - """ - - response_type = int - validate_error_message = "[prompt.invalid]Please enter a valid integer number" - - -class FloatPrompt(PromptBase[int]): - """A prompt that returns a float. - - Example: - >>> temperature = FloatPrompt.ask("Enter desired temperature") - - """ - - response_type = float - validate_error_message = "[prompt.invalid]Please enter a number" - - -class Confirm(PromptBase[bool]): - """A yes / no confirmation prompt. - - Example: - >>> if Confirm.ask("Continue"): - run_job() - - """ - - response_type = bool - validate_error_message = "[prompt.invalid]Please enter Y or N" - choices: List[str] = ["y", "n"] - - def render_default(self, default: DefaultType) -> Text: - """Render the default as (y) or (n) rather than True/False.""" - yes, no = self.choices - return Text(f"({yes})" if default else f"({no})", style="prompt.default") - - def process_response(self, value: str) -> bool: - """Convert choices to a bool.""" - value = value.strip().lower() - if value not in self.choices: - raise InvalidResponse(self.validate_error_message) - return value == self.choices[0] - - -if __name__ == "__main__": # pragma: no cover - - from rich import print - - if Confirm.ask("Run [i]prompt[/i] tests?", default=True): - while True: - result = IntPrompt.ask( - ":rocket: Enter a number between [b]1[/b] and [b]10[/b]", default=5 - ) - if result >= 1 and result <= 10: - break - print(":pile_of_poo: [prompt.invalid]Number must be between 1 and 10") - print(f"number={result}") - - while True: - password = Prompt.ask( - "Please enter a password [cyan](must be at least 5 characters)", - password=True, - ) - if len(password) >= 5: - break - print("[prompt.invalid]password too short") - print(f"password={password!r}") - - fruit = Prompt.ask("Enter a fruit", choices=["apple", "orange", "pear"]) - print(f"fruit={fruit!r}") - - else: - print("[b]OK :loudly_crying_face:") diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/protocol.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/protocol.py deleted file mode 100644 index c6923dd7..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/protocol.py +++ /dev/null @@ -1,42 +0,0 @@ -from typing import Any, cast, Set, TYPE_CHECKING -from inspect import isclass - -if TYPE_CHECKING: - from rich.console import RenderableType - -_GIBBERISH = """aihwerij235234ljsdnp34ksodfipwoe234234jlskjdf""" - - -def is_renderable(check_object: Any) -> bool: - """Check if an object may be rendered by Rich.""" - return ( - isinstance(check_object, str) - or hasattr(check_object, "__rich__") - or hasattr(check_object, "__rich_console__") - ) - - -def rich_cast(renderable: object) -> "RenderableType": - """Cast an object to a renderable by calling __rich__ if present. - - Args: - renderable (object): A potentially renderable object - - Returns: - object: The result of recursively calling __rich__. - """ - from rich.console import RenderableType - - rich_visited_set: Set[type] = set() # Prevent potential infinite loop - while hasattr(renderable, "__rich__") and not isclass(renderable): - # Detect object which claim to have all the attributes - if hasattr(renderable, _GIBBERISH): - return repr(renderable) - cast_method = getattr(renderable, "__rich__") - renderable = cast_method() - renderable_type = type(renderable) - if renderable_type in rich_visited_set: - break - rich_visited_set.add(renderable_type) - - return cast(RenderableType, renderable) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/py.typed b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/py.typed deleted file mode 100644 index e69de29b..00000000 diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/region.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/region.py deleted file mode 100644 index 75b3631c..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/region.py +++ /dev/null @@ -1,10 +0,0 @@ -from typing import NamedTuple - - -class Region(NamedTuple): - """Defines a rectangular region of the screen.""" - - x: int - y: int - width: int - height: int diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/repr.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/repr.py deleted file mode 100644 index 9dd65cde..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/repr.py +++ /dev/null @@ -1,149 +0,0 @@ -import inspect -from functools import partial -from typing import ( - Any, - Callable, - Iterable, - List, - Optional, - Tuple, - Type, - TypeVar, - Union, - overload, -) - -T = TypeVar("T") - - -Result = Iterable[Union[Any, Tuple[Any], Tuple[str, Any], Tuple[str, Any, Any]]] -RichReprResult = Result - - -class ReprError(Exception): - """An error occurred when attempting to build a repr.""" - - -@overload -def auto(cls: Optional[Type[T]]) -> Type[T]: - ... - - -@overload -def auto(*, angular: bool = False) -> Callable[[Type[T]], Type[T]]: - ... - - -def auto( - cls: Optional[Type[T]] = None, *, angular: Optional[bool] = None -) -> Union[Type[T], Callable[[Type[T]], Type[T]]]: - """Class decorator to create __repr__ from __rich_repr__""" - - def do_replace(cls: Type[T], angular: Optional[bool] = None) -> Type[T]: - def auto_repr(self: T) -> str: - """Create repr string from __rich_repr__""" - repr_str: List[str] = [] - append = repr_str.append - - angular: bool = getattr(self.__rich_repr__, "angular", False) # type: ignore[attr-defined] - for arg in self.__rich_repr__(): # type: ignore[attr-defined] - if isinstance(arg, tuple): - if len(arg) == 1: - append(repr(arg[0])) - else: - key, value, *default = arg - if key is None: - append(repr(value)) - else: - if default and default[0] == value: - continue - append(f"{key}={value!r}") - else: - append(repr(arg)) - if angular: - return f"<{self.__class__.__name__} {' '.join(repr_str)}>" - else: - return f"{self.__class__.__name__}({', '.join(repr_str)})" - - def auto_rich_repr(self: Type[T]) -> Result: - """Auto generate __rich_rep__ from signature of __init__""" - try: - signature = inspect.signature(self.__init__) - for name, param in signature.parameters.items(): - if param.kind == param.POSITIONAL_ONLY: - yield getattr(self, name) - elif param.kind in ( - param.POSITIONAL_OR_KEYWORD, - param.KEYWORD_ONLY, - ): - if param.default == param.empty: - yield getattr(self, param.name) - else: - yield param.name, getattr(self, param.name), param.default - except Exception as error: - raise ReprError( - f"Failed to auto generate __rich_repr__; {error}" - ) from None - - if not hasattr(cls, "__rich_repr__"): - auto_rich_repr.__doc__ = "Build a rich repr" - cls.__rich_repr__ = auto_rich_repr # type: ignore[attr-defined] - - auto_repr.__doc__ = "Return repr(self)" - cls.__repr__ = auto_repr # type: ignore[assignment] - if angular is not None: - cls.__rich_repr__.angular = angular # type: ignore[attr-defined] - return cls - - if cls is None: - return partial(do_replace, angular=angular) - else: - return do_replace(cls, angular=angular) - - -@overload -def rich_repr(cls: Optional[Type[T]]) -> Type[T]: - ... - - -@overload -def rich_repr(*, angular: bool = False) -> Callable[[Type[T]], Type[T]]: - ... - - -def rich_repr( - cls: Optional[Type[T]] = None, *, angular: bool = False -) -> Union[Type[T], Callable[[Type[T]], Type[T]]]: - if cls is None: - return auto(angular=angular) - else: - return auto(cls) - - -if __name__ == "__main__": - - @auto - class Foo: - def __rich_repr__(self) -> Result: - yield "foo" - yield "bar", {"shopping": ["eggs", "ham", "pineapple"]} - yield "buy", "hand sanitizer" - - foo = Foo() - from rich.console import Console - - console = Console() - - console.rule("Standard repr") - console.print(foo) - - console.print(foo, width=60) - console.print(foo, width=30) - - console.rule("Angular repr") - Foo.__rich_repr__.angular = True # type: ignore[attr-defined] - - console.print(foo) - - console.print(foo, width=60) - console.print(foo, width=30) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/rule.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/rule.py deleted file mode 100644 index fb3d4327..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/rule.py +++ /dev/null @@ -1,130 +0,0 @@ -from typing import Union - -from .align import AlignMethod -from .cells import cell_len, set_cell_size -from .console import Console, ConsoleOptions, RenderResult -from .jupyter import JupyterMixin -from .measure import Measurement -from .style import Style -from .text import Text - - -class Rule(JupyterMixin): - """A console renderable to draw a horizontal rule (line). - - Args: - title (Union[str, Text], optional): Text to render in the rule. Defaults to "". - characters (str, optional): Character(s) used to draw the line. Defaults to "─". - style (StyleType, optional): Style of Rule. Defaults to "rule.line". - end (str, optional): Character at end of Rule. defaults to "\\\\n" - align (str, optional): How to align the title, one of "left", "center", or "right". Defaults to "center". - """ - - def __init__( - self, - title: Union[str, Text] = "", - *, - characters: str = "─", - style: Union[str, Style] = "rule.line", - end: str = "\n", - align: AlignMethod = "center", - ) -> None: - if cell_len(characters) < 1: - raise ValueError( - "'characters' argument must have a cell width of at least 1" - ) - if align not in ("left", "center", "right"): - raise ValueError( - f'invalid value for align, expected "left", "center", "right" (not {align!r})' - ) - self.title = title - self.characters = characters - self.style = style - self.end = end - self.align = align - - def __repr__(self) -> str: - return f"Rule({self.title!r}, {self.characters!r})" - - def __rich_console__( - self, console: Console, options: ConsoleOptions - ) -> RenderResult: - width = options.max_width - - characters = ( - "-" - if (options.ascii_only and not self.characters.isascii()) - else self.characters - ) - - chars_len = cell_len(characters) - if not self.title: - yield self._rule_line(chars_len, width) - return - - if isinstance(self.title, Text): - title_text = self.title - else: - title_text = console.render_str(self.title, style="rule.text") - - title_text.plain = title_text.plain.replace("\n", " ") - title_text.expand_tabs() - - required_space = 4 if self.align == "center" else 2 - truncate_width = max(0, width - required_space) - if not truncate_width: - yield self._rule_line(chars_len, width) - return - - rule_text = Text(end=self.end) - if self.align == "center": - title_text.truncate(truncate_width, overflow="ellipsis") - side_width = (width - cell_len(title_text.plain)) // 2 - left = Text(characters * (side_width // chars_len + 1)) - left.truncate(side_width - 1) - right_length = width - cell_len(left.plain) - cell_len(title_text.plain) - right = Text(characters * (side_width // chars_len + 1)) - right.truncate(right_length) - rule_text.append(left.plain + " ", self.style) - rule_text.append(title_text) - rule_text.append(" " + right.plain, self.style) - elif self.align == "left": - title_text.truncate(truncate_width, overflow="ellipsis") - rule_text.append(title_text) - rule_text.append(" ") - rule_text.append(characters * (width - rule_text.cell_len), self.style) - elif self.align == "right": - title_text.truncate(truncate_width, overflow="ellipsis") - rule_text.append(characters * (width - title_text.cell_len - 1), self.style) - rule_text.append(" ") - rule_text.append(title_text) - - rule_text.plain = set_cell_size(rule_text.plain, width) - yield rule_text - - def _rule_line(self, chars_len: int, width: int) -> Text: - rule_text = Text(self.characters * ((width // chars_len) + 1), self.style) - rule_text.truncate(width) - rule_text.plain = set_cell_size(rule_text.plain, width) - return rule_text - - def __rich_measure__( - self, console: Console, options: ConsoleOptions - ) -> Measurement: - return Measurement(1, 1) - - -if __name__ == "__main__": # pragma: no cover - import sys - - from rich.console import Console - - try: - text = sys.argv[1] - except IndexError: - text = "Hello, World" - console = Console() - console.print(Rule(title=text)) - - console = Console() - console.print(Rule("foo"), width=4) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/scope.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/scope.py deleted file mode 100644 index 36c06241..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/scope.py +++ /dev/null @@ -1,86 +0,0 @@ -from collections.abc import Mapping -from typing import TYPE_CHECKING, Any, Optional, Tuple - -from .highlighter import ReprHighlighter -from .panel import Panel -from .pretty import Pretty -from .table import Table -from .text import Text, TextType - -if TYPE_CHECKING: - from .console import ConsoleRenderable - - -def render_scope( - scope: "Mapping[str, Any]", - *, - title: Optional[TextType] = None, - sort_keys: bool = True, - indent_guides: bool = False, - max_length: Optional[int] = None, - max_string: Optional[int] = None, -) -> "ConsoleRenderable": - """Render python variables in a given scope. - - Args: - scope (Mapping): A mapping containing variable names and values. - title (str, optional): Optional title. Defaults to None. - sort_keys (bool, optional): Enable sorting of items. Defaults to True. - indent_guides (bool, optional): Enable indentation guides. Defaults to False. - max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. - Defaults to None. - max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to None. - - Returns: - ConsoleRenderable: A renderable object. - """ - highlighter = ReprHighlighter() - items_table = Table.grid(padding=(0, 1), expand=False) - items_table.add_column(justify="right") - - def sort_items(item: Tuple[str, Any]) -> Tuple[bool, str]: - """Sort special variables first, then alphabetically.""" - key, _ = item - return (not key.startswith("__"), key.lower()) - - items = sorted(scope.items(), key=sort_items) if sort_keys else scope.items() - for key, value in items: - key_text = Text.assemble( - (key, "scope.key.special" if key.startswith("__") else "scope.key"), - (" =", "scope.equals"), - ) - items_table.add_row( - key_text, - Pretty( - value, - highlighter=highlighter, - indent_guides=indent_guides, - max_length=max_length, - max_string=max_string, - ), - ) - return Panel.fit( - items_table, - title=title, - border_style="scope.border", - padding=(0, 1), - ) - - -if __name__ == "__main__": # pragma: no cover - from rich import print - - print() - - def test(foo: float, bar: float) -> None: - list_of_things = [1, 2, 3, None, 4, True, False, "Hello World"] - dict_of_things = { - "version": "1.1", - "method": "confirmFruitPurchase", - "params": [["apple", "orange", "mangoes", "pomelo"], 1.123], - "id": "194521489", - } - print(render_scope(locals(), title="[i]locals", sort_keys=False)) - - test(20.3423, 3.1427) - print() diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/screen.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/screen.py deleted file mode 100644 index b4f7fd19..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/screen.py +++ /dev/null @@ -1,54 +0,0 @@ -from typing import Optional, TYPE_CHECKING - -from .segment import Segment -from .style import StyleType -from ._loop import loop_last - - -if TYPE_CHECKING: - from .console import ( - Console, - ConsoleOptions, - RenderResult, - RenderableType, - Group, - ) - - -class Screen: - """A renderable that fills the terminal screen and crops excess. - - Args: - renderable (RenderableType): Child renderable. - style (StyleType, optional): Optional background style. Defaults to None. - """ - - renderable: "RenderableType" - - def __init__( - self, - *renderables: "RenderableType", - style: Optional[StyleType] = None, - application_mode: bool = False, - ) -> None: - from rich.console import Group - - self.renderable = Group(*renderables) - self.style = style - self.application_mode = application_mode - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - width, height = options.size - style = console.get_style(self.style) if self.style else None - render_options = options.update(width=width, height=height) - lines = console.render_lines( - self.renderable or "", render_options, style=style, pad=True - ) - lines = Segment.set_shape(lines, width, height, style=style) - new_line = Segment("\n\r") if self.application_mode else Segment.line() - for last, line in loop_last(lines): - yield from line - if not last: - yield new_line diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/segment.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/segment.py deleted file mode 100644 index 9bcfc7c5..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/segment.py +++ /dev/null @@ -1,739 +0,0 @@ -from enum import IntEnum -from functools import lru_cache -from itertools import filterfalse -from logging import getLogger -from operator import attrgetter -from typing import ( - TYPE_CHECKING, - Dict, - Iterable, - List, - NamedTuple, - Optional, - Sequence, - Tuple, - Type, - Union, -) - -from .cells import ( - _is_single_cell_widths, - cached_cell_len, - cell_len, - get_character_cell_size, - set_cell_size, -) -from .repr import Result, rich_repr -from .style import Style - -if TYPE_CHECKING: - from .console import Console, ConsoleOptions, RenderResult - -log = getLogger("rich") - - -class ControlType(IntEnum): - """Non-printable control codes which typically translate to ANSI codes.""" - - BELL = 1 - CARRIAGE_RETURN = 2 - HOME = 3 - CLEAR = 4 - SHOW_CURSOR = 5 - HIDE_CURSOR = 6 - ENABLE_ALT_SCREEN = 7 - DISABLE_ALT_SCREEN = 8 - CURSOR_UP = 9 - CURSOR_DOWN = 10 - CURSOR_FORWARD = 11 - CURSOR_BACKWARD = 12 - CURSOR_MOVE_TO_COLUMN = 13 - CURSOR_MOVE_TO = 14 - ERASE_IN_LINE = 15 - SET_WINDOW_TITLE = 16 - - -ControlCode = Union[ - Tuple[ControlType], - Tuple[ControlType, Union[int, str]], - Tuple[ControlType, int, int], -] - - -@rich_repr() -class Segment(NamedTuple): - """A piece of text with associated style. Segments are produced by the Console render process and - are ultimately converted in to strings to be written to the terminal. - - Args: - text (str): A piece of text. - style (:class:`~rich.style.Style`, optional): An optional style to apply to the text. - control (Tuple[ControlCode], optional): Optional sequence of control codes. - - Attributes: - cell_length (int): The cell length of this Segment. - """ - - text: str - style: Optional[Style] = None - control: Optional[Sequence[ControlCode]] = None - - @property - def cell_length(self) -> int: - """The number of terminal cells required to display self.text. - - Returns: - int: A number of cells. - """ - text, _style, control = self - return 0 if control else cell_len(text) - - def __rich_repr__(self) -> Result: - yield self.text - if self.control is None: - if self.style is not None: - yield self.style - else: - yield self.style - yield self.control - - def __bool__(self) -> bool: - """Check if the segment contains text.""" - return bool(self.text) - - @property - def is_control(self) -> bool: - """Check if the segment contains control codes.""" - return self.control is not None - - @classmethod - @lru_cache(1024 * 16) - def _split_cells(cls, segment: "Segment", cut: int) -> Tuple["Segment", "Segment"]: - - text, style, control = segment - _Segment = Segment - - cell_length = segment.cell_length - if cut >= cell_length: - return segment, _Segment("", style, control) - - cell_size = get_character_cell_size - - pos = int((cut / cell_length) * (len(text) - 1)) - - before = text[:pos] - cell_pos = cell_len(before) - if cell_pos == cut: - return ( - _Segment(before, style, control), - _Segment(text[pos:], style, control), - ) - while pos < len(text): - char = text[pos] - pos += 1 - cell_pos += cell_size(char) - before = text[:pos] - if cell_pos == cut: - return ( - _Segment(before, style, control), - _Segment(text[pos:], style, control), - ) - if cell_pos > cut: - return ( - _Segment(before[: pos - 1] + " ", style, control), - _Segment(" " + text[pos:], style, control), - ) - - raise AssertionError("Will never reach here") - - def split_cells(self, cut: int) -> Tuple["Segment", "Segment"]: - """Split segment in to two segments at the specified column. - - If the cut point falls in the middle of a 2-cell wide character then it is replaced - by two spaces, to preserve the display width of the parent segment. - - Returns: - Tuple[Segment, Segment]: Two segments. - """ - text, style, control = self - - if _is_single_cell_widths(text): - # Fast path with all 1 cell characters - if cut >= len(text): - return self, Segment("", style, control) - return ( - Segment(text[:cut], style, control), - Segment(text[cut:], style, control), - ) - - return self._split_cells(self, cut) - - @classmethod - def line(cls) -> "Segment": - """Make a new line segment.""" - return cls("\n") - - @classmethod - def apply_style( - cls, - segments: Iterable["Segment"], - style: Optional[Style] = None, - post_style: Optional[Style] = None, - ) -> Iterable["Segment"]: - """Apply style(s) to an iterable of segments. - - Returns an iterable of segments where the style is replaced by ``style + segment.style + post_style``. - - Args: - segments (Iterable[Segment]): Segments to process. - style (Style, optional): Base style. Defaults to None. - post_style (Style, optional): Style to apply on top of segment style. Defaults to None. - - Returns: - Iterable[Segments]: A new iterable of segments (possibly the same iterable). - """ - result_segments = segments - if style: - apply = style.__add__ - result_segments = ( - cls(text, None if control else apply(_style), control) - for text, _style, control in result_segments - ) - if post_style: - result_segments = ( - cls( - text, - ( - None - if control - else (_style + post_style if _style else post_style) - ), - control, - ) - for text, _style, control in result_segments - ) - return result_segments - - @classmethod - def filter_control( - cls, segments: Iterable["Segment"], is_control: bool = False - ) -> Iterable["Segment"]: - """Filter segments by ``is_control`` attribute. - - Args: - segments (Iterable[Segment]): An iterable of Segment instances. - is_control (bool, optional): is_control flag to match in search. - - Returns: - Iterable[Segment]: And iterable of Segment instances. - - """ - if is_control: - return filter(attrgetter("control"), segments) - else: - return filterfalse(attrgetter("control"), segments) - - @classmethod - def split_lines(cls, segments: Iterable["Segment"]) -> Iterable[List["Segment"]]: - """Split a sequence of segments in to a list of lines. - - Args: - segments (Iterable[Segment]): Segments potentially containing line feeds. - - Yields: - Iterable[List[Segment]]: Iterable of segment lists, one per line. - """ - line: List[Segment] = [] - append = line.append - - for segment in segments: - if "\n" in segment.text and not segment.control: - text, style, _ = segment - while text: - _text, new_line, text = text.partition("\n") - if _text: - append(cls(_text, style)) - if new_line: - yield line - line = [] - append = line.append - else: - append(segment) - if line: - yield line - - @classmethod - def split_and_crop_lines( - cls, - segments: Iterable["Segment"], - length: int, - style: Optional[Style] = None, - pad: bool = True, - include_new_lines: bool = True, - ) -> Iterable[List["Segment"]]: - """Split segments in to lines, and crop lines greater than a given length. - - Args: - segments (Iterable[Segment]): An iterable of segments, probably - generated from console.render. - length (int): Desired line length. - style (Style, optional): Style to use for any padding. - pad (bool): Enable padding of lines that are less than `length`. - - Returns: - Iterable[List[Segment]]: An iterable of lines of segments. - """ - line: List[Segment] = [] - append = line.append - - adjust_line_length = cls.adjust_line_length - new_line_segment = cls("\n") - - for segment in segments: - if "\n" in segment.text and not segment.control: - text, segment_style, _ = segment - while text: - _text, new_line, text = text.partition("\n") - if _text: - append(cls(_text, segment_style)) - if new_line: - cropped_line = adjust_line_length( - line, length, style=style, pad=pad - ) - if include_new_lines: - cropped_line.append(new_line_segment) - yield cropped_line - line.clear() - else: - append(segment) - if line: - yield adjust_line_length(line, length, style=style, pad=pad) - - @classmethod - def adjust_line_length( - cls, - line: List["Segment"], - length: int, - style: Optional[Style] = None, - pad: bool = True, - ) -> List["Segment"]: - """Adjust a line to a given width (cropping or padding as required). - - Args: - segments (Iterable[Segment]): A list of segments in a single line. - length (int): The desired width of the line. - style (Style, optional): The style of padding if used (space on the end). Defaults to None. - pad (bool, optional): Pad lines with spaces if they are shorter than `length`. Defaults to True. - - Returns: - List[Segment]: A line of segments with the desired length. - """ - line_length = sum(segment.cell_length for segment in line) - new_line: List[Segment] - - if line_length < length: - if pad: - new_line = line + [cls(" " * (length - line_length), style)] - else: - new_line = line[:] - elif line_length > length: - new_line = [] - append = new_line.append - line_length = 0 - for segment in line: - segment_length = segment.cell_length - if line_length + segment_length < length or segment.control: - append(segment) - line_length += segment_length - else: - text, segment_style, _ = segment - text = set_cell_size(text, length - line_length) - append(cls(text, segment_style)) - break - else: - new_line = line[:] - return new_line - - @classmethod - def get_line_length(cls, line: List["Segment"]) -> int: - """Get the length of list of segments. - - Args: - line (List[Segment]): A line encoded as a list of Segments (assumes no '\\\\n' characters), - - Returns: - int: The length of the line. - """ - _cell_len = cell_len - return sum(_cell_len(text) for text, style, control in line if not control) - - @classmethod - def get_shape(cls, lines: List[List["Segment"]]) -> Tuple[int, int]: - """Get the shape (enclosing rectangle) of a list of lines. - - Args: - lines (List[List[Segment]]): A list of lines (no '\\\\n' characters). - - Returns: - Tuple[int, int]: Width and height in characters. - """ - get_line_length = cls.get_line_length - max_width = max(get_line_length(line) for line in lines) if lines else 0 - return (max_width, len(lines)) - - @classmethod - def set_shape( - cls, - lines: List[List["Segment"]], - width: int, - height: Optional[int] = None, - style: Optional[Style] = None, - new_lines: bool = False, - ) -> List[List["Segment"]]: - """Set the shape of a list of lines (enclosing rectangle). - - Args: - lines (List[List[Segment]]): A list of lines. - width (int): Desired width. - height (int, optional): Desired height or None for no change. - style (Style, optional): Style of any padding added. - new_lines (bool, optional): Padded lines should include "\n". Defaults to False. - - Returns: - List[List[Segment]]: New list of lines. - """ - _height = height or len(lines) - - blank = ( - [cls(" " * width + "\n", style)] if new_lines else [cls(" " * width, style)] - ) - - adjust_line_length = cls.adjust_line_length - shaped_lines = lines[:_height] - shaped_lines[:] = [ - adjust_line_length(line, width, style=style) for line in lines - ] - if len(shaped_lines) < _height: - shaped_lines.extend([blank] * (_height - len(shaped_lines))) - return shaped_lines - - @classmethod - def align_top( - cls: Type["Segment"], - lines: List[List["Segment"]], - width: int, - height: int, - style: Style, - new_lines: bool = False, - ) -> List[List["Segment"]]: - """Aligns lines to top (adds extra lines to bottom as required). - - Args: - lines (List[List[Segment]]): A list of lines. - width (int): Desired width. - height (int, optional): Desired height or None for no change. - style (Style): Style of any padding added. - new_lines (bool, optional): Padded lines should include "\n". Defaults to False. - - Returns: - List[List[Segment]]: New list of lines. - """ - extra_lines = height - len(lines) - if not extra_lines: - return lines[:] - lines = lines[:height] - blank = cls(" " * width + "\n", style) if new_lines else cls(" " * width, style) - lines = lines + [[blank]] * extra_lines - return lines - - @classmethod - def align_bottom( - cls: Type["Segment"], - lines: List[List["Segment"]], - width: int, - height: int, - style: Style, - new_lines: bool = False, - ) -> List[List["Segment"]]: - """Aligns render to bottom (adds extra lines above as required). - - Args: - lines (List[List[Segment]]): A list of lines. - width (int): Desired width. - height (int, optional): Desired height or None for no change. - style (Style): Style of any padding added. Defaults to None. - new_lines (bool, optional): Padded lines should include "\n". Defaults to False. - - Returns: - List[List[Segment]]: New list of lines. - """ - extra_lines = height - len(lines) - if not extra_lines: - return lines[:] - lines = lines[:height] - blank = cls(" " * width + "\n", style) if new_lines else cls(" " * width, style) - lines = [[blank]] * extra_lines + lines - return lines - - @classmethod - def align_middle( - cls: Type["Segment"], - lines: List[List["Segment"]], - width: int, - height: int, - style: Style, - new_lines: bool = False, - ) -> List[List["Segment"]]: - """Aligns lines to middle (adds extra lines to above and below as required). - - Args: - lines (List[List[Segment]]): A list of lines. - width (int): Desired width. - height (int, optional): Desired height or None for no change. - style (Style): Style of any padding added. - new_lines (bool, optional): Padded lines should include "\n". Defaults to False. - - Returns: - List[List[Segment]]: New list of lines. - """ - extra_lines = height - len(lines) - if not extra_lines: - return lines[:] - lines = lines[:height] - blank = cls(" " * width + "\n", style) if new_lines else cls(" " * width, style) - top_lines = extra_lines // 2 - bottom_lines = extra_lines - top_lines - lines = [[blank]] * top_lines + lines + [[blank]] * bottom_lines - return lines - - @classmethod - def simplify(cls, segments: Iterable["Segment"]) -> Iterable["Segment"]: - """Simplify an iterable of segments by combining contiguous segments with the same style. - - Args: - segments (Iterable[Segment]): An iterable of segments. - - Returns: - Iterable[Segment]: A possibly smaller iterable of segments that will render the same way. - """ - iter_segments = iter(segments) - try: - last_segment = next(iter_segments) - except StopIteration: - return - - _Segment = Segment - for segment in iter_segments: - if last_segment.style == segment.style and not segment.control: - last_segment = _Segment( - last_segment.text + segment.text, last_segment.style - ) - else: - yield last_segment - last_segment = segment - yield last_segment - - @classmethod - def strip_links(cls, segments: Iterable["Segment"]) -> Iterable["Segment"]: - """Remove all links from an iterable of styles. - - Args: - segments (Iterable[Segment]): An iterable segments. - - Yields: - Segment: Segments with link removed. - """ - for segment in segments: - if segment.control or segment.style is None: - yield segment - else: - text, style, _control = segment - yield cls(text, style.update_link(None) if style else None) - - @classmethod - def strip_styles(cls, segments: Iterable["Segment"]) -> Iterable["Segment"]: - """Remove all styles from an iterable of segments. - - Args: - segments (Iterable[Segment]): An iterable segments. - - Yields: - Segment: Segments with styles replace with None - """ - for text, _style, control in segments: - yield cls(text, None, control) - - @classmethod - def remove_color(cls, segments: Iterable["Segment"]) -> Iterable["Segment"]: - """Remove all color from an iterable of segments. - - Args: - segments (Iterable[Segment]): An iterable segments. - - Yields: - Segment: Segments with colorless style. - """ - - cache: Dict[Style, Style] = {} - for text, style, control in segments: - if style: - colorless_style = cache.get(style) - if colorless_style is None: - colorless_style = style.without_color - cache[style] = colorless_style - yield cls(text, colorless_style, control) - else: - yield cls(text, None, control) - - @classmethod - def divide( - cls, segments: Iterable["Segment"], cuts: Iterable[int] - ) -> Iterable[List["Segment"]]: - """Divides an iterable of segments in to portions. - - Args: - cuts (Iterable[int]): Cell positions where to divide. - - Yields: - [Iterable[List[Segment]]]: An iterable of Segments in List. - """ - split_segments: List["Segment"] = [] - add_segment = split_segments.append - - iter_cuts = iter(cuts) - - while True: - cut = next(iter_cuts, -1) - if cut == -1: - return [] - if cut != 0: - break - yield [] - pos = 0 - - segments_clear = split_segments.clear - segments_copy = split_segments.copy - - _cell_len = cached_cell_len - for segment in segments: - text, _style, control = segment - while text: - end_pos = pos if control else pos + _cell_len(text) - if end_pos < cut: - add_segment(segment) - pos = end_pos - break - - if end_pos == cut: - add_segment(segment) - yield segments_copy() - segments_clear() - pos = end_pos - - cut = next(iter_cuts, -1) - if cut == -1: - if split_segments: - yield segments_copy() - return - - break - - else: - before, segment = segment.split_cells(cut - pos) - text, _style, control = segment - add_segment(before) - yield segments_copy() - segments_clear() - pos = cut - - cut = next(iter_cuts, -1) - if cut == -1: - if split_segments: - yield segments_copy() - return - - yield segments_copy() - - -class Segments: - """A simple renderable to render an iterable of segments. This class may be useful if - you want to print segments outside of a __rich_console__ method. - - Args: - segments (Iterable[Segment]): An iterable of segments. - new_lines (bool, optional): Add new lines between segments. Defaults to False. - """ - - def __init__(self, segments: Iterable[Segment], new_lines: bool = False) -> None: - self.segments = list(segments) - self.new_lines = new_lines - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - if self.new_lines: - line = Segment.line() - for segment in self.segments: - yield segment - yield line - else: - yield from self.segments - - -class SegmentLines: - def __init__(self, lines: Iterable[List[Segment]], new_lines: bool = False) -> None: - """A simple renderable containing a number of lines of segments. May be used as an intermediate - in rendering process. - - Args: - lines (Iterable[List[Segment]]): Lists of segments forming lines. - new_lines (bool, optional): Insert new lines after each line. Defaults to False. - """ - self.lines = list(lines) - self.new_lines = new_lines - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - if self.new_lines: - new_line = Segment.line() - for line in self.lines: - yield from line - yield new_line - else: - for line in self.lines: - yield from line - - -if __name__ == "__main__": # pragma: no cover - from rich.console import Console - from rich.syntax import Syntax - from rich.text import Text - - code = """from rich.console import Console -console = Console() -text = Text.from_markup("Hello, [bold magenta]World[/]!") -console.print(text)""" - - text = Text.from_markup("Hello, [bold magenta]World[/]!") - - console = Console() - - console.rule("rich.Segment") - console.print( - "A Segment is the last step in the Rich render process before generating text with ANSI codes." - ) - console.print("\nConsider the following code:\n") - console.print(Syntax(code, "python", line_numbers=True)) - console.print() - console.print( - "When you call [b]print()[/b], Rich [i]renders[/i] the object in to the following:\n" - ) - fragments = list(console.render(text)) - console.print(fragments) - console.print() - console.print("The Segments are then processed to produce the following output:\n") - console.print(text) - console.print( - "\nYou will only need to know this if you are implementing your own Rich renderables." - ) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/spinner.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/spinner.py deleted file mode 100644 index 91ea630e..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/spinner.py +++ /dev/null @@ -1,137 +0,0 @@ -from typing import cast, List, Optional, TYPE_CHECKING, Union - -from ._spinners import SPINNERS -from .measure import Measurement -from .table import Table -from .text import Text - -if TYPE_CHECKING: - from .console import Console, ConsoleOptions, RenderResult, RenderableType - from .style import StyleType - - -class Spinner: - """A spinner animation. - - Args: - name (str): Name of spinner (run python -m rich.spinner). - text (RenderableType, optional): A renderable to display at the right of the spinner (str or Text typically). Defaults to "". - style (StyleType, optional): Style for spinner animation. Defaults to None. - speed (float, optional): Speed factor for animation. Defaults to 1.0. - - Raises: - KeyError: If name isn't one of the supported spinner animations. - """ - - def __init__( - self, - name: str, - text: "RenderableType" = "", - *, - style: Optional["StyleType"] = None, - speed: float = 1.0, - ) -> None: - try: - spinner = SPINNERS[name] - except KeyError: - raise KeyError(f"no spinner called {name!r}") - self.text: "Union[RenderableType, Text]" = ( - Text.from_markup(text) if isinstance(text, str) else text - ) - self.frames = cast(List[str], spinner["frames"])[:] - self.interval = cast(float, spinner["interval"]) - self.start_time: Optional[float] = None - self.style = style - self.speed = speed - self.frame_no_offset: float = 0.0 - self._update_speed = 0.0 - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - yield self.render(console.get_time()) - - def __rich_measure__( - self, console: "Console", options: "ConsoleOptions" - ) -> Measurement: - text = self.render(0) - return Measurement.get(console, options, text) - - def render(self, time: float) -> "RenderableType": - """Render the spinner for a given time. - - Args: - time (float): Time in seconds. - - Returns: - RenderableType: A renderable containing animation frame. - """ - if self.start_time is None: - self.start_time = time - - frame_no = ((time - self.start_time) * self.speed) / ( - self.interval / 1000.0 - ) + self.frame_no_offset - frame = Text( - self.frames[int(frame_no) % len(self.frames)], style=self.style or "" - ) - - if self._update_speed: - self.frame_no_offset = frame_no - self.start_time = time - self.speed = self._update_speed - self._update_speed = 0.0 - - if not self.text: - return frame - elif isinstance(self.text, (str, Text)): - return Text.assemble(frame, " ", self.text) - else: - table = Table.grid(padding=1) - table.add_row(frame, self.text) - return table - - def update( - self, - *, - text: "RenderableType" = "", - style: Optional["StyleType"] = None, - speed: Optional[float] = None, - ) -> None: - """Updates attributes of a spinner after it has been started. - - Args: - text (RenderableType, optional): A renderable to display at the right of the spinner (str or Text typically). Defaults to "". - style (StyleType, optional): Style for spinner animation. Defaults to None. - speed (float, optional): Speed factor for animation. Defaults to None. - """ - if text: - self.text = Text.from_markup(text) if isinstance(text, str) else text - if style: - self.style = style - if speed: - self._update_speed = speed - - -if __name__ == "__main__": # pragma: no cover - from time import sleep - - from .columns import Columns - from .panel import Panel - from .live import Live - - all_spinners = Columns( - [ - Spinner(spinner_name, text=Text(repr(spinner_name), style="green")) - for spinner_name in sorted(SPINNERS.keys()) - ], - column_first=True, - expand=True, - ) - - with Live( - Panel(all_spinners, title="Spinners", border_style="blue"), - refresh_per_second=20, - ) as live: - while True: - sleep(0.1) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/status.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/status.py deleted file mode 100644 index 09eff405..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/status.py +++ /dev/null @@ -1,132 +0,0 @@ -from types import TracebackType -from typing import Optional, Type - -from .console import Console, RenderableType -from .jupyter import JupyterMixin -from .live import Live -from .spinner import Spinner -from .style import StyleType - - -class Status(JupyterMixin): - """Displays a status indicator with a 'spinner' animation. - - Args: - status (RenderableType): A status renderable (str or Text typically). - console (Console, optional): Console instance to use, or None for global console. Defaults to None. - spinner (str, optional): Name of spinner animation (see python -m rich.spinner). Defaults to "dots". - spinner_style (StyleType, optional): Style of spinner. Defaults to "status.spinner". - speed (float, optional): Speed factor for spinner animation. Defaults to 1.0. - refresh_per_second (float, optional): Number of refreshes per second. Defaults to 12.5. - """ - - def __init__( - self, - status: RenderableType, - *, - console: Optional[Console] = None, - spinner: str = "dots", - spinner_style: StyleType = "status.spinner", - speed: float = 1.0, - refresh_per_second: float = 12.5, - ): - self.status = status - self.spinner_style = spinner_style - self.speed = speed - self._spinner = Spinner(spinner, text=status, style=spinner_style, speed=speed) - self._live = Live( - self.renderable, - console=console, - refresh_per_second=refresh_per_second, - transient=True, - ) - - @property - def renderable(self) -> Spinner: - return self._spinner - - @property - def console(self) -> "Console": - """Get the Console used by the Status objects.""" - return self._live.console - - def update( - self, - status: Optional[RenderableType] = None, - *, - spinner: Optional[str] = None, - spinner_style: Optional[StyleType] = None, - speed: Optional[float] = None, - ) -> None: - """Update status. - - Args: - status (Optional[RenderableType], optional): New status renderable or None for no change. Defaults to None. - spinner (Optional[str], optional): New spinner or None for no change. Defaults to None. - spinner_style (Optional[StyleType], optional): New spinner style or None for no change. Defaults to None. - speed (Optional[float], optional): Speed factor for spinner animation or None for no change. Defaults to None. - """ - if status is not None: - self.status = status - if spinner_style is not None: - self.spinner_style = spinner_style - if speed is not None: - self.speed = speed - if spinner is not None: - self._spinner = Spinner( - spinner, text=self.status, style=self.spinner_style, speed=self.speed - ) - self._live.update(self.renderable, refresh=True) - else: - self._spinner.update( - text=self.status, style=self.spinner_style, speed=self.speed - ) - - def start(self) -> None: - """Start the status animation.""" - self._live.start() - - def stop(self) -> None: - """Stop the spinner animation.""" - self._live.stop() - - def __rich__(self) -> RenderableType: - return self.renderable - - def __enter__(self) -> "Status": - self.start() - return self - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - self.stop() - - -if __name__ == "__main__": # pragma: no cover - - from time import sleep - - from .console import Console - - console = Console() - with console.status("[magenta]Covid detector booting up") as status: - sleep(3) - console.log("Importing advanced AI") - sleep(3) - console.log("Advanced Covid AI Ready") - sleep(3) - status.update(status="[bold blue] Scanning for Covid", spinner="earth") - sleep(3) - console.log("Found 10,000,000,000 copies of Covid32.exe") - sleep(3) - status.update( - status="[bold red]Moving Covid32.exe to Trash", - spinner="bouncingBall", - spinner_style="yellow", - ) - sleep(5) - console.print("[bold green]Covid deleted successfully") diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/style.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/style.py deleted file mode 100644 index 313c8894..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/style.py +++ /dev/null @@ -1,796 +0,0 @@ -import sys -from functools import lru_cache -from marshal import dumps, loads -from random import randint -from typing import Any, Dict, Iterable, List, Optional, Type, Union, cast - -from . import errors -from .color import Color, ColorParseError, ColorSystem, blend_rgb -from .repr import Result, rich_repr -from .terminal_theme import DEFAULT_TERMINAL_THEME, TerminalTheme - -# Style instances and style definitions are often interchangeable -StyleType = Union[str, "Style"] - - -class _Bit: - """A descriptor to get/set a style attribute bit.""" - - __slots__ = ["bit"] - - def __init__(self, bit_no: int) -> None: - self.bit = 1 << bit_no - - def __get__(self, obj: "Style", objtype: Type["Style"]) -> Optional[bool]: - if obj._set_attributes & self.bit: - return obj._attributes & self.bit != 0 - return None - - -@rich_repr -class Style: - """A terminal style. - - A terminal style consists of a color (`color`), a background color (`bgcolor`), and a number of attributes, such - as bold, italic etc. The attributes have 3 states: they can either be on - (``True``), off (``False``), or not set (``None``). - - Args: - color (Union[Color, str], optional): Color of terminal text. Defaults to None. - bgcolor (Union[Color, str], optional): Color of terminal background. Defaults to None. - bold (bool, optional): Enable bold text. Defaults to None. - dim (bool, optional): Enable dim text. Defaults to None. - italic (bool, optional): Enable italic text. Defaults to None. - underline (bool, optional): Enable underlined text. Defaults to None. - blink (bool, optional): Enabled blinking text. Defaults to None. - blink2 (bool, optional): Enable fast blinking text. Defaults to None. - reverse (bool, optional): Enabled reverse text. Defaults to None. - conceal (bool, optional): Enable concealed text. Defaults to None. - strike (bool, optional): Enable strikethrough text. Defaults to None. - underline2 (bool, optional): Enable doubly underlined text. Defaults to None. - frame (bool, optional): Enable framed text. Defaults to None. - encircle (bool, optional): Enable encircled text. Defaults to None. - overline (bool, optional): Enable overlined text. Defaults to None. - link (str, link): Link URL. Defaults to None. - - """ - - _color: Optional[Color] - _bgcolor: Optional[Color] - _attributes: int - _set_attributes: int - _hash: Optional[int] - _null: bool - _meta: Optional[bytes] - - __slots__ = [ - "_color", - "_bgcolor", - "_attributes", - "_set_attributes", - "_link", - "_link_id", - "_ansi", - "_style_definition", - "_hash", - "_null", - "_meta", - ] - - # maps bits on to SGR parameter - _style_map = { - 0: "1", - 1: "2", - 2: "3", - 3: "4", - 4: "5", - 5: "6", - 6: "7", - 7: "8", - 8: "9", - 9: "21", - 10: "51", - 11: "52", - 12: "53", - } - - STYLE_ATTRIBUTES = { - "dim": "dim", - "d": "dim", - "bold": "bold", - "b": "bold", - "italic": "italic", - "i": "italic", - "underline": "underline", - "u": "underline", - "blink": "blink", - "blink2": "blink2", - "reverse": "reverse", - "r": "reverse", - "conceal": "conceal", - "c": "conceal", - "strike": "strike", - "s": "strike", - "underline2": "underline2", - "uu": "underline2", - "frame": "frame", - "encircle": "encircle", - "overline": "overline", - "o": "overline", - } - - def __init__( - self, - *, - color: Optional[Union[Color, str]] = None, - bgcolor: Optional[Union[Color, str]] = None, - bold: Optional[bool] = None, - dim: Optional[bool] = None, - italic: Optional[bool] = None, - underline: Optional[bool] = None, - blink: Optional[bool] = None, - blink2: Optional[bool] = None, - reverse: Optional[bool] = None, - conceal: Optional[bool] = None, - strike: Optional[bool] = None, - underline2: Optional[bool] = None, - frame: Optional[bool] = None, - encircle: Optional[bool] = None, - overline: Optional[bool] = None, - link: Optional[str] = None, - meta: Optional[Dict[str, Any]] = None, - ): - self._ansi: Optional[str] = None - self._style_definition: Optional[str] = None - - def _make_color(color: Union[Color, str]) -> Color: - return color if isinstance(color, Color) else Color.parse(color) - - self._color = None if color is None else _make_color(color) - self._bgcolor = None if bgcolor is None else _make_color(bgcolor) - self._set_attributes = sum( - ( - bold is not None, - dim is not None and 2, - italic is not None and 4, - underline is not None and 8, - blink is not None and 16, - blink2 is not None and 32, - reverse is not None and 64, - conceal is not None and 128, - strike is not None and 256, - underline2 is not None and 512, - frame is not None and 1024, - encircle is not None and 2048, - overline is not None and 4096, - ) - ) - self._attributes = ( - sum( - ( - bold and 1 or 0, - dim and 2 or 0, - italic and 4 or 0, - underline and 8 or 0, - blink and 16 or 0, - blink2 and 32 or 0, - reverse and 64 or 0, - conceal and 128 or 0, - strike and 256 or 0, - underline2 and 512 or 0, - frame and 1024 or 0, - encircle and 2048 or 0, - overline and 4096 or 0, - ) - ) - if self._set_attributes - else 0 - ) - - self._link = link - self._meta = None if meta is None else dumps(meta) - self._link_id = ( - f"{randint(0, 999999)}{hash(self._meta)}" if (link or meta) else "" - ) - self._hash: Optional[int] = None - self._null = not (self._set_attributes or color or bgcolor or link or meta) - - @classmethod - def null(cls) -> "Style": - """Create an 'null' style, equivalent to Style(), but more performant.""" - return NULL_STYLE - - @classmethod - def from_color( - cls, color: Optional[Color] = None, bgcolor: Optional[Color] = None - ) -> "Style": - """Create a new style with colors and no attributes. - - Returns: - color (Optional[Color]): A (foreground) color, or None for no color. Defaults to None. - bgcolor (Optional[Color]): A (background) color, or None for no color. Defaults to None. - """ - style: Style = cls.__new__(Style) - style._ansi = None - style._style_definition = None - style._color = color - style._bgcolor = bgcolor - style._set_attributes = 0 - style._attributes = 0 - style._link = None - style._link_id = "" - style._meta = None - style._null = not (color or bgcolor) - style._hash = None - return style - - @classmethod - def from_meta(cls, meta: Optional[Dict[str, Any]]) -> "Style": - """Create a new style with meta data. - - Returns: - meta (Optional[Dict[str, Any]]): A dictionary of meta data. Defaults to None. - """ - style: Style = cls.__new__(Style) - style._ansi = None - style._style_definition = None - style._color = None - style._bgcolor = None - style._set_attributes = 0 - style._attributes = 0 - style._link = None - style._meta = dumps(meta) - style._link_id = f"{randint(0, 999999)}{hash(style._meta)}" - style._hash = None - style._null = not (meta) - return style - - @classmethod - def on(cls, meta: Optional[Dict[str, Any]] = None, **handlers: Any) -> "Style": - """Create a blank style with meta information. - - Example: - style = Style.on(click=self.on_click) - - Args: - meta (Optional[Dict[str, Any]], optional): An optional dict of meta information. - **handlers (Any): Keyword arguments are translated in to handlers. - - Returns: - Style: A Style with meta information attached. - """ - meta = {} if meta is None else meta - meta.update({f"@{key}": value for key, value in handlers.items()}) - return cls.from_meta(meta) - - bold = _Bit(0) - dim = _Bit(1) - italic = _Bit(2) - underline = _Bit(3) - blink = _Bit(4) - blink2 = _Bit(5) - reverse = _Bit(6) - conceal = _Bit(7) - strike = _Bit(8) - underline2 = _Bit(9) - frame = _Bit(10) - encircle = _Bit(11) - overline = _Bit(12) - - @property - def link_id(self) -> str: - """Get a link id, used in ansi code for links.""" - return self._link_id - - def __str__(self) -> str: - """Re-generate style definition from attributes.""" - if self._style_definition is None: - attributes: List[str] = [] - append = attributes.append - bits = self._set_attributes - if bits & 0b0000000001111: - if bits & 1: - append("bold" if self.bold else "not bold") - if bits & (1 << 1): - append("dim" if self.dim else "not dim") - if bits & (1 << 2): - append("italic" if self.italic else "not italic") - if bits & (1 << 3): - append("underline" if self.underline else "not underline") - if bits & 0b0000111110000: - if bits & (1 << 4): - append("blink" if self.blink else "not blink") - if bits & (1 << 5): - append("blink2" if self.blink2 else "not blink2") - if bits & (1 << 6): - append("reverse" if self.reverse else "not reverse") - if bits & (1 << 7): - append("conceal" if self.conceal else "not conceal") - if bits & (1 << 8): - append("strike" if self.strike else "not strike") - if bits & 0b1111000000000: - if bits & (1 << 9): - append("underline2" if self.underline2 else "not underline2") - if bits & (1 << 10): - append("frame" if self.frame else "not frame") - if bits & (1 << 11): - append("encircle" if self.encircle else "not encircle") - if bits & (1 << 12): - append("overline" if self.overline else "not overline") - if self._color is not None: - append(self._color.name) - if self._bgcolor is not None: - append("on") - append(self._bgcolor.name) - if self._link: - append("link") - append(self._link) - self._style_definition = " ".join(attributes) or "none" - return self._style_definition - - def __bool__(self) -> bool: - """A Style is false if it has no attributes, colors, or links.""" - return not self._null - - def _make_ansi_codes(self, color_system: ColorSystem) -> str: - """Generate ANSI codes for this style. - - Args: - color_system (ColorSystem): Color system. - - Returns: - str: String containing codes. - """ - - if self._ansi is None: - sgr: List[str] = [] - append = sgr.append - _style_map = self._style_map - attributes = self._attributes & self._set_attributes - if attributes: - if attributes & 1: - append(_style_map[0]) - if attributes & 2: - append(_style_map[1]) - if attributes & 4: - append(_style_map[2]) - if attributes & 8: - append(_style_map[3]) - if attributes & 0b0000111110000: - for bit in range(4, 9): - if attributes & (1 << bit): - append(_style_map[bit]) - if attributes & 0b1111000000000: - for bit in range(9, 13): - if attributes & (1 << bit): - append(_style_map[bit]) - if self._color is not None: - sgr.extend(self._color.downgrade(color_system).get_ansi_codes()) - if self._bgcolor is not None: - sgr.extend( - self._bgcolor.downgrade(color_system).get_ansi_codes( - foreground=False - ) - ) - self._ansi = ";".join(sgr) - return self._ansi - - @classmethod - @lru_cache(maxsize=1024) - def normalize(cls, style: str) -> str: - """Normalize a style definition so that styles with the same effect have the same string - representation. - - Args: - style (str): A style definition. - - Returns: - str: Normal form of style definition. - """ - try: - return str(cls.parse(style)) - except errors.StyleSyntaxError: - return style.strip().lower() - - @classmethod - def pick_first(cls, *values: Optional[StyleType]) -> StyleType: - """Pick first non-None style.""" - for value in values: - if value is not None: - return value - raise ValueError("expected at least one non-None style") - - def __rich_repr__(self) -> Result: - yield "color", self.color, None - yield "bgcolor", self.bgcolor, None - yield "bold", self.bold, None, - yield "dim", self.dim, None, - yield "italic", self.italic, None - yield "underline", self.underline, None, - yield "blink", self.blink, None - yield "blink2", self.blink2, None - yield "reverse", self.reverse, None - yield "conceal", self.conceal, None - yield "strike", self.strike, None - yield "underline2", self.underline2, None - yield "frame", self.frame, None - yield "encircle", self.encircle, None - yield "link", self.link, None - if self._meta: - yield "meta", self.meta - - def __eq__(self, other: Any) -> bool: - if not isinstance(other, Style): - return NotImplemented - return self.__hash__() == other.__hash__() - - def __ne__(self, other: Any) -> bool: - if not isinstance(other, Style): - return NotImplemented - return self.__hash__() != other.__hash__() - - def __hash__(self) -> int: - if self._hash is not None: - return self._hash - self._hash = hash( - ( - self._color, - self._bgcolor, - self._attributes, - self._set_attributes, - self._link, - self._meta, - ) - ) - return self._hash - - @property - def color(self) -> Optional[Color]: - """The foreground color or None if it is not set.""" - return self._color - - @property - def bgcolor(self) -> Optional[Color]: - """The background color or None if it is not set.""" - return self._bgcolor - - @property - def link(self) -> Optional[str]: - """Link text, if set.""" - return self._link - - @property - def transparent_background(self) -> bool: - """Check if the style specified a transparent background.""" - return self.bgcolor is None or self.bgcolor.is_default - - @property - def background_style(self) -> "Style": - """A Style with background only.""" - return Style(bgcolor=self.bgcolor) - - @property - def meta(self) -> Dict[str, Any]: - """Get meta information (can not be changed after construction).""" - return {} if self._meta is None else cast(Dict[str, Any], loads(self._meta)) - - @property - def without_color(self) -> "Style": - """Get a copy of the style with color removed.""" - if self._null: - return NULL_STYLE - style: Style = self.__new__(Style) - style._ansi = None - style._style_definition = None - style._color = None - style._bgcolor = None - style._attributes = self._attributes - style._set_attributes = self._set_attributes - style._link = self._link - style._link_id = f"{randint(0, 999999)}" if self._link else "" - style._null = False - style._meta = None - style._hash = None - return style - - @classmethod - @lru_cache(maxsize=4096) - def parse(cls, style_definition: str) -> "Style": - """Parse a style definition. - - Args: - style_definition (str): A string containing a style. - - Raises: - errors.StyleSyntaxError: If the style definition syntax is invalid. - - Returns: - `Style`: A Style instance. - """ - if style_definition.strip() == "none" or not style_definition: - return cls.null() - - STYLE_ATTRIBUTES = cls.STYLE_ATTRIBUTES - color: Optional[str] = None - bgcolor: Optional[str] = None - attributes: Dict[str, Optional[Any]] = {} - link: Optional[str] = None - - words = iter(style_definition.split()) - for original_word in words: - word = original_word.lower() - if word == "on": - word = next(words, "") - if not word: - raise errors.StyleSyntaxError("color expected after 'on'") - try: - Color.parse(word) is None - except ColorParseError as error: - raise errors.StyleSyntaxError( - f"unable to parse {word!r} as background color; {error}" - ) from None - bgcolor = word - - elif word == "not": - word = next(words, "") - attribute = STYLE_ATTRIBUTES.get(word) - if attribute is None: - raise errors.StyleSyntaxError( - f"expected style attribute after 'not', found {word!r}" - ) - attributes[attribute] = False - - elif word == "link": - word = next(words, "") - if not word: - raise errors.StyleSyntaxError("URL expected after 'link'") - link = word - - elif word in STYLE_ATTRIBUTES: - attributes[STYLE_ATTRIBUTES[word]] = True - - else: - try: - Color.parse(word) - except ColorParseError as error: - raise errors.StyleSyntaxError( - f"unable to parse {word!r} as color; {error}" - ) from None - color = word - style = Style(color=color, bgcolor=bgcolor, link=link, **attributes) - return style - - @lru_cache(maxsize=1024) - def get_html_style(self, theme: Optional[TerminalTheme] = None) -> str: - """Get a CSS style rule.""" - theme = theme or DEFAULT_TERMINAL_THEME - css: List[str] = [] - append = css.append - - color = self.color - bgcolor = self.bgcolor - if self.reverse: - color, bgcolor = bgcolor, color - if self.dim: - foreground_color = ( - theme.foreground_color if color is None else color.get_truecolor(theme) - ) - color = Color.from_triplet( - blend_rgb(foreground_color, theme.background_color, 0.5) - ) - if color is not None: - theme_color = color.get_truecolor(theme) - append(f"color: {theme_color.hex}") - append(f"text-decoration-color: {theme_color.hex}") - if bgcolor is not None: - theme_color = bgcolor.get_truecolor(theme, foreground=False) - append(f"background-color: {theme_color.hex}") - if self.bold: - append("font-weight: bold") - if self.italic: - append("font-style: italic") - if self.underline: - append("text-decoration: underline") - if self.strike: - append("text-decoration: line-through") - if self.overline: - append("text-decoration: overline") - return "; ".join(css) - - @classmethod - def combine(cls, styles: Iterable["Style"]) -> "Style": - """Combine styles and get result. - - Args: - styles (Iterable[Style]): Styles to combine. - - Returns: - Style: A new style instance. - """ - iter_styles = iter(styles) - return sum(iter_styles, next(iter_styles)) - - @classmethod - def chain(cls, *styles: "Style") -> "Style": - """Combine styles from positional argument in to a single style. - - Args: - *styles (Iterable[Style]): Styles to combine. - - Returns: - Style: A new style instance. - """ - iter_styles = iter(styles) - return sum(iter_styles, next(iter_styles)) - - def copy(self) -> "Style": - """Get a copy of this style. - - Returns: - Style: A new Style instance with identical attributes. - """ - if self._null: - return NULL_STYLE - style: Style = self.__new__(Style) - style._ansi = self._ansi - style._style_definition = self._style_definition - style._color = self._color - style._bgcolor = self._bgcolor - style._attributes = self._attributes - style._set_attributes = self._set_attributes - style._link = self._link - style._link_id = f"{randint(0, 999999)}" if self._link else "" - style._hash = self._hash - style._null = False - style._meta = self._meta - return style - - @lru_cache(maxsize=128) - def clear_meta_and_links(self) -> "Style": - """Get a copy of this style with link and meta information removed. - - Returns: - Style: New style object. - """ - if self._null: - return NULL_STYLE - style: Style = self.__new__(Style) - style._ansi = self._ansi - style._style_definition = self._style_definition - style._color = self._color - style._bgcolor = self._bgcolor - style._attributes = self._attributes - style._set_attributes = self._set_attributes - style._link = None - style._link_id = "" - style._hash = self._hash - style._null = False - style._meta = None - return style - - def update_link(self, link: Optional[str] = None) -> "Style": - """Get a copy with a different value for link. - - Args: - link (str, optional): New value for link. Defaults to None. - - Returns: - Style: A new Style instance. - """ - style: Style = self.__new__(Style) - style._ansi = self._ansi - style._style_definition = self._style_definition - style._color = self._color - style._bgcolor = self._bgcolor - style._attributes = self._attributes - style._set_attributes = self._set_attributes - style._link = link - style._link_id = f"{randint(0, 999999)}" if link else "" - style._hash = None - style._null = False - style._meta = self._meta - return style - - def render( - self, - text: str = "", - *, - color_system: Optional[ColorSystem] = ColorSystem.TRUECOLOR, - legacy_windows: bool = False, - ) -> str: - """Render the ANSI codes for the style. - - Args: - text (str, optional): A string to style. Defaults to "". - color_system (Optional[ColorSystem], optional): Color system to render to. Defaults to ColorSystem.TRUECOLOR. - - Returns: - str: A string containing ANSI style codes. - """ - if not text or color_system is None: - return text - attrs = self._ansi or self._make_ansi_codes(color_system) - rendered = f"\x1b[{attrs}m{text}\x1b[0m" if attrs else text - if self._link and not legacy_windows: - rendered = ( - f"\x1b]8;id={self._link_id};{self._link}\x1b\\{rendered}\x1b]8;;\x1b\\" - ) - return rendered - - def test(self, text: Optional[str] = None) -> None: - """Write text with style directly to terminal. - - This method is for testing purposes only. - - Args: - text (Optional[str], optional): Text to style or None for style name. - - """ - text = text or str(self) - sys.stdout.write(f"{self.render(text)}\n") - - @lru_cache(maxsize=1024) - def _add(self, style: Optional["Style"]) -> "Style": - if style is None or style._null: - return self - if self._null: - return style - new_style: Style = self.__new__(Style) - new_style._ansi = None - new_style._style_definition = None - new_style._color = style._color or self._color - new_style._bgcolor = style._bgcolor or self._bgcolor - new_style._attributes = (self._attributes & ~style._set_attributes) | ( - style._attributes & style._set_attributes - ) - new_style._set_attributes = self._set_attributes | style._set_attributes - new_style._link = style._link or self._link - new_style._link_id = style._link_id or self._link_id - new_style._null = style._null - if self._meta and style._meta: - new_style._meta = dumps({**self.meta, **style.meta}) - else: - new_style._meta = self._meta or style._meta - new_style._hash = None - return new_style - - def __add__(self, style: Optional["Style"]) -> "Style": - combined_style = self._add(style) - return combined_style.copy() if combined_style.link else combined_style - - -NULL_STYLE = Style() - - -class StyleStack: - """A stack of styles.""" - - __slots__ = ["_stack"] - - def __init__(self, default_style: "Style") -> None: - self._stack: List[Style] = [default_style] - - def __repr__(self) -> str: - return f"<stylestack {self._stack!r}>" - - @property - def current(self) -> Style: - """Get the Style at the top of the stack.""" - return self._stack[-1] - - def push(self, style: Style) -> None: - """Push a new style on to the stack. - - Args: - style (Style): New style to combine with current style. - """ - self._stack.append(self._stack[-1] + style) - - def pop(self) -> Style: - """Pop last style and discard. - - Returns: - Style: New current style (also available as stack.current) - """ - self._stack.pop() - return self._stack[-1] diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/styled.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/styled.py deleted file mode 100644 index 27243beb..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/styled.py +++ /dev/null @@ -1,42 +0,0 @@ -from typing import TYPE_CHECKING - -from .measure import Measurement -from .segment import Segment -from .style import StyleType - -if TYPE_CHECKING: - from .console import Console, ConsoleOptions, RenderResult, RenderableType - - -class Styled: - """Apply a style to a renderable. - - Args: - renderable (RenderableType): Any renderable. - style (StyleType): A style to apply across the entire renderable. - """ - - def __init__(self, renderable: "RenderableType", style: "StyleType") -> None: - self.renderable = renderable - self.style = style - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - style = console.get_style(self.style) - rendered_segments = console.render(self.renderable, options) - segments = Segment.apply_style(rendered_segments, style) - return segments - - def __rich_measure__( - self, console: "Console", options: "ConsoleOptions" - ) -> Measurement: - return Measurement.get(console, options, self.renderable) - - -if __name__ == "__main__": # pragma: no cover - from rich import print - from rich.panel import Panel - - panel = Styled(Panel("hello"), "on blue") - print(panel) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/syntax.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/syntax.py deleted file mode 100644 index ac669b83..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/syntax.py +++ /dev/null @@ -1,948 +0,0 @@ -import os.path -import platform -import re -import sys -import textwrap -from abc import ABC, abstractmethod -from pathlib import Path -from typing import ( - Any, - Dict, - Iterable, - List, - NamedTuple, - Optional, - Sequence, - Set, - Tuple, - Type, - Union, -) - -from pygments.lexer import Lexer -from pygments.lexers import get_lexer_by_name, guess_lexer_for_filename -from pygments.style import Style as PygmentsStyle -from pygments.styles import get_style_by_name -from pygments.token import ( - Comment, - Error, - Generic, - Keyword, - Name, - Number, - Operator, - String, - Token, - Whitespace, -) -from pygments.util import ClassNotFound - -from rich.containers import Lines -from rich.padding import Padding, PaddingDimensions - -from ._loop import loop_first -from .cells import cell_len -from .color import Color, blend_rgb -from .console import Console, ConsoleOptions, JustifyMethod, RenderResult -from .jupyter import JupyterMixin -from .measure import Measurement -from .segment import Segment, Segments -from .style import Style, StyleType -from .text import Text - -TokenType = Tuple[str, ...] - -WINDOWS = platform.system() == "Windows" -DEFAULT_THEME = "monokai" - -# The following styles are based on https://github.com/pygments/pygments/blob/master/pygments/formatters/terminal.py -# A few modifications were made - -ANSI_LIGHT: Dict[TokenType, Style] = { - Token: Style(), - Whitespace: Style(color="white"), - Comment: Style(dim=True), - Comment.Preproc: Style(color="cyan"), - Keyword: Style(color="blue"), - Keyword.Type: Style(color="cyan"), - Operator.Word: Style(color="magenta"), - Name.Builtin: Style(color="cyan"), - Name.Function: Style(color="green"), - Name.Namespace: Style(color="cyan", underline=True), - Name.Class: Style(color="green", underline=True), - Name.Exception: Style(color="cyan"), - Name.Decorator: Style(color="magenta", bold=True), - Name.Variable: Style(color="red"), - Name.Constant: Style(color="red"), - Name.Attribute: Style(color="cyan"), - Name.Tag: Style(color="bright_blue"), - String: Style(color="yellow"), - Number: Style(color="blue"), - Generic.Deleted: Style(color="bright_red"), - Generic.Inserted: Style(color="green"), - Generic.Heading: Style(bold=True), - Generic.Subheading: Style(color="magenta", bold=True), - Generic.Prompt: Style(bold=True), - Generic.Error: Style(color="bright_red"), - Error: Style(color="red", underline=True), -} - -ANSI_DARK: Dict[TokenType, Style] = { - Token: Style(), - Whitespace: Style(color="bright_black"), - Comment: Style(dim=True), - Comment.Preproc: Style(color="bright_cyan"), - Keyword: Style(color="bright_blue"), - Keyword.Type: Style(color="bright_cyan"), - Operator.Word: Style(color="bright_magenta"), - Name.Builtin: Style(color="bright_cyan"), - Name.Function: Style(color="bright_green"), - Name.Namespace: Style(color="bright_cyan", underline=True), - Name.Class: Style(color="bright_green", underline=True), - Name.Exception: Style(color="bright_cyan"), - Name.Decorator: Style(color="bright_magenta", bold=True), - Name.Variable: Style(color="bright_red"), - Name.Constant: Style(color="bright_red"), - Name.Attribute: Style(color="bright_cyan"), - Name.Tag: Style(color="bright_blue"), - String: Style(color="yellow"), - Number: Style(color="bright_blue"), - Generic.Deleted: Style(color="bright_red"), - Generic.Inserted: Style(color="bright_green"), - Generic.Heading: Style(bold=True), - Generic.Subheading: Style(color="bright_magenta", bold=True), - Generic.Prompt: Style(bold=True), - Generic.Error: Style(color="bright_red"), - Error: Style(color="red", underline=True), -} - -RICH_SYNTAX_THEMES = {"ansi_light": ANSI_LIGHT, "ansi_dark": ANSI_DARK} -NUMBERS_COLUMN_DEFAULT_PADDING = 2 - - -class SyntaxTheme(ABC): - """Base class for a syntax theme.""" - - @abstractmethod - def get_style_for_token(self, token_type: TokenType) -> Style: - """Get a style for a given Pygments token.""" - raise NotImplementedError # pragma: no cover - - @abstractmethod - def get_background_style(self) -> Style: - """Get the background color.""" - raise NotImplementedError # pragma: no cover - - -class PygmentsSyntaxTheme(SyntaxTheme): - """Syntax theme that delegates to Pygments theme.""" - - def __init__(self, theme: Union[str, Type[PygmentsStyle]]) -> None: - self._style_cache: Dict[TokenType, Style] = {} - if isinstance(theme, str): - try: - self._pygments_style_class = get_style_by_name(theme) - except ClassNotFound: - self._pygments_style_class = get_style_by_name("default") - else: - self._pygments_style_class = theme - - self._background_color = self._pygments_style_class.background_color - self._background_style = Style(bgcolor=self._background_color) - - def get_style_for_token(self, token_type: TokenType) -> Style: - """Get a style from a Pygments class.""" - try: - return self._style_cache[token_type] - except KeyError: - try: - pygments_style = self._pygments_style_class.style_for_token(token_type) - except KeyError: - style = Style.null() - else: - color = pygments_style["color"] - bgcolor = pygments_style["bgcolor"] - style = Style( - color="#" + color if color else "#000000", - bgcolor="#" + bgcolor if bgcolor else self._background_color, - bold=pygments_style["bold"], - italic=pygments_style["italic"], - underline=pygments_style["underline"], - ) - self._style_cache[token_type] = style - return style - - def get_background_style(self) -> Style: - return self._background_style - - -class ANSISyntaxTheme(SyntaxTheme): - """Syntax theme to use standard colors.""" - - def __init__(self, style_map: Dict[TokenType, Style]) -> None: - self.style_map = style_map - self._missing_style = Style.null() - self._background_style = Style.null() - self._style_cache: Dict[TokenType, Style] = {} - - def get_style_for_token(self, token_type: TokenType) -> Style: - """Look up style in the style map.""" - try: - return self._style_cache[token_type] - except KeyError: - # Styles form a hierarchy - # We need to go from most to least specific - # e.g. ("foo", "bar", "baz") to ("foo", "bar") to ("foo",) - get_style = self.style_map.get - token = tuple(token_type) - style = self._missing_style - while token: - _style = get_style(token) - if _style is not None: - style = _style - break - token = token[:-1] - self._style_cache[token_type] = style - return style - - def get_background_style(self) -> Style: - return self._background_style - - -SyntaxPosition = Tuple[int, int] - - -class _SyntaxHighlightRange(NamedTuple): - """ - A range to highlight in a Syntax object. - `start` and `end` are 2-integers tuples, where the first integer is the line number - (starting from 1) and the second integer is the column index (starting from 0). - """ - - style: StyleType - start: SyntaxPosition - end: SyntaxPosition - - -class Syntax(JupyterMixin): - """Construct a Syntax object to render syntax highlighted code. - - Args: - code (str): Code to highlight. - lexer (Lexer | str): Lexer to use (see https://pygments.org/docs/lexers/) - theme (str, optional): Color theme, aka Pygments style (see https://pygments.org/docs/styles/#getting-a-list-of-available-styles). Defaults to "monokai". - dedent (bool, optional): Enable stripping of initial whitespace. Defaults to False. - line_numbers (bool, optional): Enable rendering of line numbers. Defaults to False. - start_line (int, optional): Starting number for line numbers. Defaults to 1. - line_range (Tuple[int | None, int | None], optional): If given should be a tuple of the start and end line to render. - A value of None in the tuple indicates the range is open in that direction. - highlight_lines (Set[int]): A set of line numbers to highlight. - code_width: Width of code to render (not including line numbers), or ``None`` to use all available width. - tab_size (int, optional): Size of tabs. Defaults to 4. - word_wrap (bool, optional): Enable word wrapping. - background_color (str, optional): Optional background color, or None to use theme color. Defaults to None. - indent_guides (bool, optional): Show indent guides. Defaults to False. - padding (PaddingDimensions): Padding to apply around the syntax. Defaults to 0 (no padding). - """ - - _pygments_style_class: Type[PygmentsStyle] - _theme: SyntaxTheme - - @classmethod - def get_theme(cls, name: Union[str, SyntaxTheme]) -> SyntaxTheme: - """Get a syntax theme instance.""" - if isinstance(name, SyntaxTheme): - return name - theme: SyntaxTheme - if name in RICH_SYNTAX_THEMES: - theme = ANSISyntaxTheme(RICH_SYNTAX_THEMES[name]) - else: - theme = PygmentsSyntaxTheme(name) - return theme - - def __init__( - self, - code: str, - lexer: Union[Lexer, str], - *, - theme: Union[str, SyntaxTheme] = DEFAULT_THEME, - dedent: bool = False, - line_numbers: bool = False, - start_line: int = 1, - line_range: Optional[Tuple[Optional[int], Optional[int]]] = None, - highlight_lines: Optional[Set[int]] = None, - code_width: Optional[int] = None, - tab_size: int = 4, - word_wrap: bool = False, - background_color: Optional[str] = None, - indent_guides: bool = False, - padding: PaddingDimensions = 0, - ) -> None: - self.code = code - self._lexer = lexer - self.dedent = dedent - self.line_numbers = line_numbers - self.start_line = start_line - self.line_range = line_range - self.highlight_lines = highlight_lines or set() - self.code_width = code_width - self.tab_size = tab_size - self.word_wrap = word_wrap - self.background_color = background_color - self.background_style = ( - Style(bgcolor=background_color) if background_color else Style() - ) - self.indent_guides = indent_guides - self.padding = padding - - self._theme = self.get_theme(theme) - self._stylized_ranges: List[_SyntaxHighlightRange] = [] - - @classmethod - def from_path( - cls, - path: str, - encoding: str = "utf-8", - lexer: Optional[Union[Lexer, str]] = None, - theme: Union[str, SyntaxTheme] = DEFAULT_THEME, - dedent: bool = False, - line_numbers: bool = False, - line_range: Optional[Tuple[int, int]] = None, - start_line: int = 1, - highlight_lines: Optional[Set[int]] = None, - code_width: Optional[int] = None, - tab_size: int = 4, - word_wrap: bool = False, - background_color: Optional[str] = None, - indent_guides: bool = False, - padding: PaddingDimensions = 0, - ) -> "Syntax": - """Construct a Syntax object from a file. - - Args: - path (str): Path to file to highlight. - encoding (str): Encoding of file. - lexer (str | Lexer, optional): Lexer to use. If None, lexer will be auto-detected from path/file content. - theme (str, optional): Color theme, aka Pygments style (see https://pygments.org/docs/styles/#getting-a-list-of-available-styles). Defaults to "emacs". - dedent (bool, optional): Enable stripping of initial whitespace. Defaults to True. - line_numbers (bool, optional): Enable rendering of line numbers. Defaults to False. - start_line (int, optional): Starting number for line numbers. Defaults to 1. - line_range (Tuple[int, int], optional): If given should be a tuple of the start and end line to render. - highlight_lines (Set[int]): A set of line numbers to highlight. - code_width: Width of code to render (not including line numbers), or ``None`` to use all available width. - tab_size (int, optional): Size of tabs. Defaults to 4. - word_wrap (bool, optional): Enable word wrapping of code. - background_color (str, optional): Optional background color, or None to use theme color. Defaults to None. - indent_guides (bool, optional): Show indent guides. Defaults to False. - padding (PaddingDimensions): Padding to apply around the syntax. Defaults to 0 (no padding). - - Returns: - [Syntax]: A Syntax object that may be printed to the console - """ - code = Path(path).read_text(encoding=encoding) - - if not lexer: - lexer = cls.guess_lexer(path, code=code) - - return cls( - code, - lexer, - theme=theme, - dedent=dedent, - line_numbers=line_numbers, - line_range=line_range, - start_line=start_line, - highlight_lines=highlight_lines, - code_width=code_width, - tab_size=tab_size, - word_wrap=word_wrap, - background_color=background_color, - indent_guides=indent_guides, - padding=padding, - ) - - @classmethod - def guess_lexer(cls, path: str, code: Optional[str] = None) -> str: - """Guess the alias of the Pygments lexer to use based on a path and an optional string of code. - If code is supplied, it will use a combination of the code and the filename to determine the - best lexer to use. For example, if the file is ``index.html`` and the file contains Django - templating syntax, then "html+django" will be returned. If the file is ``index.html``, and no - templating language is used, the "html" lexer will be used. If no string of code - is supplied, the lexer will be chosen based on the file extension.. - - Args: - path (AnyStr): The path to the file containing the code you wish to know the lexer for. - code (str, optional): Optional string of code that will be used as a fallback if no lexer - is found for the supplied path. - - Returns: - str: The name of the Pygments lexer that best matches the supplied path/code. - """ - lexer: Optional[Lexer] = None - lexer_name = "default" - if code: - try: - lexer = guess_lexer_for_filename(path, code) - except ClassNotFound: - pass - - if not lexer: - try: - _, ext = os.path.splitext(path) - if ext: - extension = ext.lstrip(".").lower() - lexer = get_lexer_by_name(extension) - except ClassNotFound: - pass - - if lexer: - if lexer.aliases: - lexer_name = lexer.aliases[0] - else: - lexer_name = lexer.name - - return lexer_name - - def _get_base_style(self) -> Style: - """Get the base style.""" - default_style = self._theme.get_background_style() + self.background_style - return default_style - - def _get_token_color(self, token_type: TokenType) -> Optional[Color]: - """Get a color (if any) for the given token. - - Args: - token_type (TokenType): A token type tuple from Pygments. - - Returns: - Optional[Color]: Color from theme, or None for no color. - """ - style = self._theme.get_style_for_token(token_type) - return style.color - - @property - def lexer(self) -> Optional[Lexer]: - """The lexer for this syntax, or None if no lexer was found. - - Tries to find the lexer by name if a string was passed to the constructor. - """ - - if isinstance(self._lexer, Lexer): - return self._lexer - try: - return get_lexer_by_name( - self._lexer, - stripnl=False, - ensurenl=True, - tabsize=self.tab_size, - ) - except ClassNotFound: - return None - - def highlight( - self, - code: str, - line_range: Optional[Tuple[Optional[int], Optional[int]]] = None, - ) -> Text: - """Highlight code and return a Text instance. - - Args: - code (str): Code to highlight. - line_range(Tuple[int, int], optional): Optional line range to highlight. - - Returns: - Text: A text instance containing highlighted syntax. - """ - - base_style = self._get_base_style() - justify: JustifyMethod = ( - "default" if base_style.transparent_background else "left" - ) - - text = Text( - justify=justify, - style=base_style, - tab_size=self.tab_size, - no_wrap=not self.word_wrap, - ) - _get_theme_style = self._theme.get_style_for_token - - lexer = self.lexer - - if lexer is None: - text.append(code) - else: - if line_range: - # More complicated path to only stylize a portion of the code - # This speeds up further operations as there are less spans to process - line_start, line_end = line_range - - def line_tokenize() -> Iterable[Tuple[Any, str]]: - """Split tokens to one per line.""" - assert lexer # required to make MyPy happy - we know lexer is not None at this point - - for token_type, token in lexer.get_tokens(code): - while token: - line_token, new_line, token = token.partition("\n") - yield token_type, line_token + new_line - - def tokens_to_spans() -> Iterable[Tuple[str, Optional[Style]]]: - """Convert tokens to spans.""" - tokens = iter(line_tokenize()) - line_no = 0 - _line_start = line_start - 1 if line_start else 0 - - # Skip over tokens until line start - while line_no < _line_start: - try: - _token_type, token = next(tokens) - except StopIteration: - break - yield (token, None) - if token.endswith("\n"): - line_no += 1 - # Generate spans until line end - for token_type, token in tokens: - yield (token, _get_theme_style(token_type)) - if token.endswith("\n"): - line_no += 1 - if line_end and line_no >= line_end: - break - - text.append_tokens(tokens_to_spans()) - - else: - text.append_tokens( - (token, _get_theme_style(token_type)) - for token_type, token in lexer.get_tokens(code) - ) - if self.background_color is not None: - text.stylize(f"on {self.background_color}") - - if self._stylized_ranges: - self._apply_stylized_ranges(text) - - return text - - def stylize_range( - self, style: StyleType, start: SyntaxPosition, end: SyntaxPosition - ) -> None: - """ - Adds a custom style on a part of the code, that will be applied to the syntax display when it's rendered. - Line numbers are 1-based, while column indexes are 0-based. - - Args: - style (StyleType): The style to apply. - start (Tuple[int, int]): The start of the range, in the form `[line number, column index]`. - end (Tuple[int, int]): The end of the range, in the form `[line number, column index]`. - """ - self._stylized_ranges.append(_SyntaxHighlightRange(style, start, end)) - - def _get_line_numbers_color(self, blend: float = 0.3) -> Color: - background_style = self._theme.get_background_style() + self.background_style - background_color = background_style.bgcolor - if background_color is None or background_color.is_system_defined: - return Color.default() - foreground_color = self._get_token_color(Token.Text) - if foreground_color is None or foreground_color.is_system_defined: - return foreground_color or Color.default() - new_color = blend_rgb( - background_color.get_truecolor(), - foreground_color.get_truecolor(), - cross_fade=blend, - ) - return Color.from_triplet(new_color) - - @property - def _numbers_column_width(self) -> int: - """Get the number of characters used to render the numbers column.""" - column_width = 0 - if self.line_numbers: - column_width = ( - len(str(self.start_line + self.code.count("\n"))) - + NUMBERS_COLUMN_DEFAULT_PADDING - ) - return column_width - - def _get_number_styles(self, console: Console) -> Tuple[Style, Style, Style]: - """Get background, number, and highlight styles for line numbers.""" - background_style = self._get_base_style() - if background_style.transparent_background: - return Style.null(), Style(dim=True), Style.null() - if console.color_system in ("256", "truecolor"): - number_style = Style.chain( - background_style, - self._theme.get_style_for_token(Token.Text), - Style(color=self._get_line_numbers_color()), - self.background_style, - ) - highlight_number_style = Style.chain( - background_style, - self._theme.get_style_for_token(Token.Text), - Style(bold=True, color=self._get_line_numbers_color(0.9)), - self.background_style, - ) - else: - number_style = background_style + Style(dim=True) - highlight_number_style = background_style + Style(dim=False) - return background_style, number_style, highlight_number_style - - def __rich_measure__( - self, console: "Console", options: "ConsoleOptions" - ) -> "Measurement": - _, right, _, left = Padding.unpack(self.padding) - padding = left + right - if self.code_width is not None: - width = self.code_width + self._numbers_column_width + padding + 1 - return Measurement(self._numbers_column_width, width) - lines = self.code.splitlines() - width = ( - self._numbers_column_width - + padding - + (max(cell_len(line) for line in lines) if lines else 0) - ) - if self.line_numbers: - width += 1 - return Measurement(self._numbers_column_width, width) - - def __rich_console__( - self, console: Console, options: ConsoleOptions - ) -> RenderResult: - segments = Segments(self._get_syntax(console, options)) - if self.padding: - yield Padding( - segments, style=self._theme.get_background_style(), pad=self.padding - ) - else: - yield segments - - def _get_syntax( - self, - console: Console, - options: ConsoleOptions, - ) -> Iterable[Segment]: - """ - Get the Segments for the Syntax object, excluding any vertical/horizontal padding - """ - transparent_background = self._get_base_style().transparent_background - code_width = ( - ( - (options.max_width - self._numbers_column_width - 1) - if self.line_numbers - else options.max_width - ) - if self.code_width is None - else self.code_width - ) - - ends_on_nl, processed_code = self._process_code(self.code) - text = self.highlight(processed_code, self.line_range) - - if not self.line_numbers and not self.word_wrap and not self.line_range: - if not ends_on_nl: - text.remove_suffix("\n") - # Simple case of just rendering text - style = ( - self._get_base_style() - + self._theme.get_style_for_token(Comment) - + Style(dim=True) - + self.background_style - ) - if self.indent_guides and not options.ascii_only: - text = text.with_indent_guides(self.tab_size, style=style) - text.overflow = "crop" - if style.transparent_background: - yield from console.render( - text, options=options.update(width=code_width) - ) - else: - syntax_lines = console.render_lines( - text, - options.update(width=code_width, height=None, justify="left"), - style=self.background_style, - pad=True, - new_lines=True, - ) - for syntax_line in syntax_lines: - yield from syntax_line - return - - start_line, end_line = self.line_range or (None, None) - line_offset = 0 - if start_line: - line_offset = max(0, start_line - 1) - lines: Union[List[Text], Lines] = text.split("\n", allow_blank=ends_on_nl) - if self.line_range: - if line_offset > len(lines): - return - lines = lines[line_offset:end_line] - - if self.indent_guides and not options.ascii_only: - style = ( - self._get_base_style() - + self._theme.get_style_for_token(Comment) - + Style(dim=True) - + self.background_style - ) - lines = ( - Text("\n") - .join(lines) - .with_indent_guides(self.tab_size, style=style + Style(italic=False)) - .split("\n", allow_blank=True) - ) - - numbers_column_width = self._numbers_column_width - render_options = options.update(width=code_width) - - highlight_line = self.highlight_lines.__contains__ - _Segment = Segment - new_line = _Segment("\n") - - line_pointer = "> " if options.legacy_windows else "❱ " - - ( - background_style, - number_style, - highlight_number_style, - ) = self._get_number_styles(console) - - for line_no, line in enumerate(lines, self.start_line + line_offset): - if self.word_wrap: - wrapped_lines = console.render_lines( - line, - render_options.update(height=None, justify="left"), - style=background_style, - pad=not transparent_background, - ) - else: - segments = list(line.render(console, end="")) - if options.no_wrap: - wrapped_lines = [segments] - else: - wrapped_lines = [ - _Segment.adjust_line_length( - segments, - render_options.max_width, - style=background_style, - pad=not transparent_background, - ) - ] - - if self.line_numbers: - wrapped_line_left_pad = _Segment( - " " * numbers_column_width + " ", background_style - ) - for first, wrapped_line in loop_first(wrapped_lines): - if first: - line_column = str(line_no).rjust(numbers_column_width - 2) + " " - if highlight_line(line_no): - yield _Segment(line_pointer, Style(color="red")) - yield _Segment(line_column, highlight_number_style) - else: - yield _Segment(" ", highlight_number_style) - yield _Segment(line_column, number_style) - else: - yield wrapped_line_left_pad - yield from wrapped_line - yield new_line - else: - for wrapped_line in wrapped_lines: - yield from wrapped_line - yield new_line - - def _apply_stylized_ranges(self, text: Text) -> None: - """ - Apply stylized ranges to a text instance, - using the given code to determine the right portion to apply the style to. - - Args: - text (Text): Text instance to apply the style to. - """ - code = text.plain - newlines_offsets = [ - # Let's add outer boundaries at each side of the list: - 0, - # N.B. using "\n" here is much faster than using metacharacters such as "^" or "\Z": - *[ - match.start() + 1 - for match in re.finditer("\n", code, flags=re.MULTILINE) - ], - len(code) + 1, - ] - - for stylized_range in self._stylized_ranges: - start = _get_code_index_for_syntax_position( - newlines_offsets, stylized_range.start - ) - end = _get_code_index_for_syntax_position( - newlines_offsets, stylized_range.end - ) - if start is not None and end is not None: - text.stylize(stylized_range.style, start, end) - - def _process_code(self, code: str) -> Tuple[bool, str]: - """ - Applies various processing to a raw code string - (normalises it so it always ends with a line return, dedents it if necessary, etc.) - - Args: - code (str): The raw code string to process - - Returns: - Tuple[bool, str]: the boolean indicates whether the raw code ends with a line return, - while the string is the processed code. - """ - ends_on_nl = code.endswith("\n") - processed_code = code if ends_on_nl else code + "\n" - processed_code = ( - textwrap.dedent(processed_code) if self.dedent else processed_code - ) - processed_code = processed_code.expandtabs(self.tab_size) - return ends_on_nl, processed_code - - -def _get_code_index_for_syntax_position( - newlines_offsets: Sequence[int], position: SyntaxPosition -) -> Optional[int]: - """ - Returns the index of the code string for the given positions. - - Args: - newlines_offsets (Sequence[int]): The offset of each newline character found in the code snippet. - position (SyntaxPosition): The position to search for. - - Returns: - Optional[int]: The index of the code string for this position, or `None` - if the given position's line number is out of range (if it's the column that is out of range - we silently clamp its value so that it reaches the end of the line) - """ - lines_count = len(newlines_offsets) - - line_number, column_index = position - if line_number > lines_count or len(newlines_offsets) < (line_number + 1): - return None # `line_number` is out of range - line_index = line_number - 1 - line_length = newlines_offsets[line_index + 1] - newlines_offsets[line_index] - 1 - # If `column_index` is out of range: let's silently clamp it: - column_index = min(line_length, column_index) - return newlines_offsets[line_index] + column_index - - -if __name__ == "__main__": # pragma: no cover - import argparse - import sys - - parser = argparse.ArgumentParser( - description="Render syntax to the console with Rich" - ) - parser.add_argument( - "path", - metavar="PATH", - help="path to file, or - for stdin", - ) - parser.add_argument( - "-c", - "--force-color", - dest="force_color", - action="store_true", - default=None, - help="force color for non-terminals", - ) - parser.add_argument( - "-i", - "--indent-guides", - dest="indent_guides", - action="store_true", - default=False, - help="display indent guides", - ) - parser.add_argument( - "-l", - "--line-numbers", - dest="line_numbers", - action="store_true", - help="render line numbers", - ) - parser.add_argument( - "-w", - "--width", - type=int, - dest="width", - default=None, - help="width of output (default will auto-detect)", - ) - parser.add_argument( - "-r", - "--wrap", - dest="word_wrap", - action="store_true", - default=False, - help="word wrap long lines", - ) - parser.add_argument( - "-s", - "--soft-wrap", - action="store_true", - dest="soft_wrap", - default=False, - help="enable soft wrapping mode", - ) - parser.add_argument( - "-t", "--theme", dest="theme", default="monokai", help="pygments theme" - ) - parser.add_argument( - "-b", - "--background-color", - dest="background_color", - default=None, - help="Override background color", - ) - parser.add_argument( - "-x", - "--lexer", - default=None, - dest="lexer_name", - help="Lexer name", - ) - parser.add_argument( - "-p", "--padding", type=int, default=0, dest="padding", help="Padding" - ) - parser.add_argument( - "--highlight-line", - type=int, - default=None, - dest="highlight_line", - help="The line number (not index!) to highlight", - ) - args = parser.parse_args() - - from rich.console import Console - - console = Console(force_terminal=args.force_color, width=args.width) - - if args.path == "-": - code = sys.stdin.read() - syntax = Syntax( - code=code, - lexer=args.lexer_name, - line_numbers=args.line_numbers, - word_wrap=args.word_wrap, - theme=args.theme, - background_color=args.background_color, - indent_guides=args.indent_guides, - padding=args.padding, - highlight_lines={args.highlight_line}, - ) - else: - syntax = Syntax.from_path( - args.path, - lexer=args.lexer_name, - line_numbers=args.line_numbers, - word_wrap=args.word_wrap, - theme=args.theme, - background_color=args.background_color, - indent_guides=args.indent_guides, - padding=args.padding, - highlight_lines={args.highlight_line}, - ) - console.print(syntax, soft_wrap=args.soft_wrap) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/table.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/table.py deleted file mode 100644 index 578d3d63..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/table.py +++ /dev/null @@ -1,1002 +0,0 @@ -from dataclasses import dataclass, field, replace -from typing import ( - TYPE_CHECKING, - Dict, - Iterable, - List, - NamedTuple, - Optional, - Sequence, - Tuple, - Union, -) - -from . import box, errors -from ._loop import loop_first_last, loop_last -from ._pick import pick_bool -from ._ratio import ratio_distribute, ratio_reduce -from .align import VerticalAlignMethod -from .jupyter import JupyterMixin -from .measure import Measurement -from .padding import Padding, PaddingDimensions -from .protocol import is_renderable -from .segment import Segment -from .style import Style, StyleType -from .text import Text, TextType - -if TYPE_CHECKING: - from .console import ( - Console, - ConsoleOptions, - JustifyMethod, - OverflowMethod, - RenderableType, - RenderResult, - ) - - -@dataclass -class Column: - """Defines a column within a ~Table. - - Args: - title (Union[str, Text], optional): The title of the table rendered at the top. Defaults to None. - caption (Union[str, Text], optional): The table caption rendered below. Defaults to None. - width (int, optional): The width in characters of the table, or ``None`` to automatically fit. Defaults to None. - min_width (Optional[int], optional): The minimum width of the table, or ``None`` for no minimum. Defaults to None. - box (box.Box, optional): One of the constants in box.py used to draw the edges (see :ref:`appendix_box`), or ``None`` for no box lines. Defaults to box.HEAVY_HEAD. - safe_box (Optional[bool], optional): Disable box characters that don't display on windows legacy terminal with *raster* fonts. Defaults to True. - padding (PaddingDimensions, optional): Padding for cells (top, right, bottom, left). Defaults to (0, 1). - collapse_padding (bool, optional): Enable collapsing of padding around cells. Defaults to False. - pad_edge (bool, optional): Enable padding of edge cells. Defaults to True. - expand (bool, optional): Expand the table to fit the available space if ``True``, otherwise the table width will be auto-calculated. Defaults to False. - show_header (bool, optional): Show a header row. Defaults to True. - show_footer (bool, optional): Show a footer row. Defaults to False. - show_edge (bool, optional): Draw a box around the outside of the table. Defaults to True. - show_lines (bool, optional): Draw lines between every row. Defaults to False. - leading (bool, optional): Number of blank lines between rows (precludes ``show_lines``). Defaults to 0. - style (Union[str, Style], optional): Default style for the table. Defaults to "none". - row_styles (List[Union, str], optional): Optional list of row styles, if more than one style is given then the styles will alternate. Defaults to None. - header_style (Union[str, Style], optional): Style of the header. Defaults to "table.header". - footer_style (Union[str, Style], optional): Style of the footer. Defaults to "table.footer". - border_style (Union[str, Style], optional): Style of the border. Defaults to None. - title_style (Union[str, Style], optional): Style of the title. Defaults to None. - caption_style (Union[str, Style], optional): Style of the caption. Defaults to None. - title_justify (str, optional): Justify method for title. Defaults to "center". - caption_justify (str, optional): Justify method for caption. Defaults to "center". - highlight (bool, optional): Highlight cell contents (if str). Defaults to False. - """ - - header: "RenderableType" = "" - """RenderableType: Renderable for the header (typically a string)""" - - footer: "RenderableType" = "" - """RenderableType: Renderable for the footer (typically a string)""" - - header_style: StyleType = "" - """StyleType: The style of the header.""" - - footer_style: StyleType = "" - """StyleType: The style of the footer.""" - - style: StyleType = "" - """StyleType: The style of the column.""" - - justify: "JustifyMethod" = "left" - """str: How to justify text within the column ("left", "center", "right", or "full")""" - - vertical: "VerticalAlignMethod" = "top" - """str: How to vertically align content ("top", "middle", or "bottom")""" - - overflow: "OverflowMethod" = "ellipsis" - """str: Overflow method.""" - - width: Optional[int] = None - """Optional[int]: Width of the column, or ``None`` (default) to auto calculate width.""" - - min_width: Optional[int] = None - """Optional[int]: Minimum width of column, or ``None`` for no minimum. Defaults to None.""" - - max_width: Optional[int] = None - """Optional[int]: Maximum width of column, or ``None`` for no maximum. Defaults to None.""" - - ratio: Optional[int] = None - """Optional[int]: Ratio to use when calculating column width, or ``None`` (default) to adapt to column contents.""" - - no_wrap: bool = False - """bool: Prevent wrapping of text within the column. Defaults to ``False``.""" - - _index: int = 0 - """Index of column.""" - - _cells: List["RenderableType"] = field(default_factory=list) - - def copy(self) -> "Column": - """Return a copy of this Column.""" - return replace(self, _cells=[]) - - @property - def cells(self) -> Iterable["RenderableType"]: - """Get all cells in the column, not including header.""" - yield from self._cells - - @property - def flexible(self) -> bool: - """Check if this column is flexible.""" - return self.ratio is not None - - -@dataclass -class Row: - """Information regarding a row.""" - - style: Optional[StyleType] = None - """Style to apply to row.""" - - end_section: bool = False - """Indicated end of section, which will force a line beneath the row.""" - - -class _Cell(NamedTuple): - """A single cell in a table.""" - - style: StyleType - """Style to apply to cell.""" - renderable: "RenderableType" - """Cell renderable.""" - vertical: VerticalAlignMethod - """Cell vertical alignment.""" - - -class Table(JupyterMixin): - """A console renderable to draw a table. - - Args: - *headers (Union[Column, str]): Column headers, either as a string, or :class:`~rich.table.Column` instance. - title (Union[str, Text], optional): The title of the table rendered at the top. Defaults to None. - caption (Union[str, Text], optional): The table caption rendered below. Defaults to None. - width (int, optional): The width in characters of the table, or ``None`` to automatically fit. Defaults to None. - min_width (Optional[int], optional): The minimum width of the table, or ``None`` for no minimum. Defaults to None. - box (box.Box, optional): One of the constants in box.py used to draw the edges (see :ref:`appendix_box`), or ``None`` for no box lines. Defaults to box.HEAVY_HEAD. - safe_box (Optional[bool], optional): Disable box characters that don't display on windows legacy terminal with *raster* fonts. Defaults to True. - padding (PaddingDimensions, optional): Padding for cells (top, right, bottom, left). Defaults to (0, 1). - collapse_padding (bool, optional): Enable collapsing of padding around cells. Defaults to False. - pad_edge (bool, optional): Enable padding of edge cells. Defaults to True. - expand (bool, optional): Expand the table to fit the available space if ``True``, otherwise the table width will be auto-calculated. Defaults to False. - show_header (bool, optional): Show a header row. Defaults to True. - show_footer (bool, optional): Show a footer row. Defaults to False. - show_edge (bool, optional): Draw a box around the outside of the table. Defaults to True. - show_lines (bool, optional): Draw lines between every row. Defaults to False. - leading (bool, optional): Number of blank lines between rows (precludes ``show_lines``). Defaults to 0. - style (Union[str, Style], optional): Default style for the table. Defaults to "none". - row_styles (List[Union, str], optional): Optional list of row styles, if more than one style is given then the styles will alternate. Defaults to None. - header_style (Union[str, Style], optional): Style of the header. Defaults to "table.header". - footer_style (Union[str, Style], optional): Style of the footer. Defaults to "table.footer". - border_style (Union[str, Style], optional): Style of the border. Defaults to None. - title_style (Union[str, Style], optional): Style of the title. Defaults to None. - caption_style (Union[str, Style], optional): Style of the caption. Defaults to None. - title_justify (str, optional): Justify method for title. Defaults to "center". - caption_justify (str, optional): Justify method for caption. Defaults to "center". - highlight (bool, optional): Highlight cell contents (if str). Defaults to False. - """ - - columns: List[Column] - rows: List[Row] - - def __init__( - self, - *headers: Union[Column, str], - title: Optional[TextType] = None, - caption: Optional[TextType] = None, - width: Optional[int] = None, - min_width: Optional[int] = None, - box: Optional[box.Box] = box.HEAVY_HEAD, - safe_box: Optional[bool] = None, - padding: PaddingDimensions = (0, 1), - collapse_padding: bool = False, - pad_edge: bool = True, - expand: bool = False, - show_header: bool = True, - show_footer: bool = False, - show_edge: bool = True, - show_lines: bool = False, - leading: int = 0, - style: StyleType = "none", - row_styles: Optional[Iterable[StyleType]] = None, - header_style: Optional[StyleType] = "table.header", - footer_style: Optional[StyleType] = "table.footer", - border_style: Optional[StyleType] = None, - title_style: Optional[StyleType] = None, - caption_style: Optional[StyleType] = None, - title_justify: "JustifyMethod" = "center", - caption_justify: "JustifyMethod" = "center", - highlight: bool = False, - ) -> None: - - self.columns: List[Column] = [] - self.rows: List[Row] = [] - self.title = title - self.caption = caption - self.width = width - self.min_width = min_width - self.box = box - self.safe_box = safe_box - self._padding = Padding.unpack(padding) - self.pad_edge = pad_edge - self._expand = expand - self.show_header = show_header - self.show_footer = show_footer - self.show_edge = show_edge - self.show_lines = show_lines - self.leading = leading - self.collapse_padding = collapse_padding - self.style = style - self.header_style = header_style or "" - self.footer_style = footer_style or "" - self.border_style = border_style - self.title_style = title_style - self.caption_style = caption_style - self.title_justify: "JustifyMethod" = title_justify - self.caption_justify: "JustifyMethod" = caption_justify - self.highlight = highlight - self.row_styles: Sequence[StyleType] = list(row_styles or []) - append_column = self.columns.append - for header in headers: - if isinstance(header, str): - self.add_column(header=header) - else: - header._index = len(self.columns) - append_column(header) - - @classmethod - def grid( - cls, - *headers: Union[Column, str], - padding: PaddingDimensions = 0, - collapse_padding: bool = True, - pad_edge: bool = False, - expand: bool = False, - ) -> "Table": - """Get a table with no lines, headers, or footer. - - Args: - *headers (Union[Column, str]): Column headers, either as a string, or :class:`~rich.table.Column` instance. - padding (PaddingDimensions, optional): Get padding around cells. Defaults to 0. - collapse_padding (bool, optional): Enable collapsing of padding around cells. Defaults to True. - pad_edge (bool, optional): Enable padding around edges of table. Defaults to False. - expand (bool, optional): Expand the table to fit the available space if ``True``, otherwise the table width will be auto-calculated. Defaults to False. - - Returns: - Table: A table instance. - """ - return cls( - *headers, - box=None, - padding=padding, - collapse_padding=collapse_padding, - show_header=False, - show_footer=False, - show_edge=False, - pad_edge=pad_edge, - expand=expand, - ) - - @property - def expand(self) -> bool: - """Setting a non-None self.width implies expand.""" - return self._expand or self.width is not None - - @expand.setter - def expand(self, expand: bool) -> None: - """Set expand.""" - self._expand = expand - - @property - def _extra_width(self) -> int: - """Get extra width to add to cell content.""" - width = 0 - if self.box and self.show_edge: - width += 2 - if self.box: - width += len(self.columns) - 1 - return width - - @property - def row_count(self) -> int: - """Get the current number of rows.""" - return len(self.rows) - - def get_row_style(self, console: "Console", index: int) -> StyleType: - """Get the current row style.""" - style = Style.null() - if self.row_styles: - style += console.get_style(self.row_styles[index % len(self.row_styles)]) - row_style = self.rows[index].style - if row_style is not None: - style += console.get_style(row_style) - return style - - def __rich_measure__( - self, console: "Console", options: "ConsoleOptions" - ) -> Measurement: - max_width = options.max_width - if self.width is not None: - max_width = self.width - if max_width < 0: - return Measurement(0, 0) - - extra_width = self._extra_width - max_width = sum( - self._calculate_column_widths( - console, options.update_width(max_width - extra_width) - ) - ) - _measure_column = self._measure_column - - measurements = [ - _measure_column(console, options.update_width(max_width), column) - for column in self.columns - ] - minimum_width = ( - sum(measurement.minimum for measurement in measurements) + extra_width - ) - maximum_width = ( - sum(measurement.maximum for measurement in measurements) + extra_width - if (self.width is None) - else self.width - ) - measurement = Measurement(minimum_width, maximum_width) - measurement = measurement.clamp(self.min_width) - return measurement - - @property - def padding(self) -> Tuple[int, int, int, int]: - """Get cell padding.""" - return self._padding - - @padding.setter - def padding(self, padding: PaddingDimensions) -> "Table": - """Set cell padding.""" - self._padding = Padding.unpack(padding) - return self - - def add_column( - self, - header: "RenderableType" = "", - footer: "RenderableType" = "", - *, - header_style: Optional[StyleType] = None, - footer_style: Optional[StyleType] = None, - style: Optional[StyleType] = None, - justify: "JustifyMethod" = "left", - vertical: "VerticalAlignMethod" = "top", - overflow: "OverflowMethod" = "ellipsis", - width: Optional[int] = None, - min_width: Optional[int] = None, - max_width: Optional[int] = None, - ratio: Optional[int] = None, - no_wrap: bool = False, - ) -> None: - """Add a column to the table. - - Args: - header (RenderableType, optional): Text or renderable for the header. - Defaults to "". - footer (RenderableType, optional): Text or renderable for the footer. - Defaults to "". - header_style (Union[str, Style], optional): Style for the header, or None for default. Defaults to None. - footer_style (Union[str, Style], optional): Style for the footer, or None for default. Defaults to None. - style (Union[str, Style], optional): Style for the column cells, or None for default. Defaults to None. - justify (JustifyMethod, optional): Alignment for cells. Defaults to "left". - vertical (VerticalAlignMethod, optional): Vertical alignment, one of "top", "middle", or "bottom". Defaults to "top". - overflow (OverflowMethod): Overflow method: "crop", "fold", "ellipsis". Defaults to "ellipsis". - width (int, optional): Desired width of column in characters, or None to fit to contents. Defaults to None. - min_width (Optional[int], optional): Minimum width of column, or ``None`` for no minimum. Defaults to None. - max_width (Optional[int], optional): Maximum width of column, or ``None`` for no maximum. Defaults to None. - ratio (int, optional): Flexible ratio for the column (requires ``Table.expand`` or ``Table.width``). Defaults to None. - no_wrap (bool, optional): Set to ``True`` to disable wrapping of this column. - """ - - column = Column( - _index=len(self.columns), - header=header, - footer=footer, - header_style=header_style or "", - footer_style=footer_style or "", - style=style or "", - justify=justify, - vertical=vertical, - overflow=overflow, - width=width, - min_width=min_width, - max_width=max_width, - ratio=ratio, - no_wrap=no_wrap, - ) - self.columns.append(column) - - def add_row( - self, - *renderables: Optional["RenderableType"], - style: Optional[StyleType] = None, - end_section: bool = False, - ) -> None: - """Add a row of renderables. - - Args: - *renderables (None or renderable): Each cell in a row must be a renderable object (including str), - or ``None`` for a blank cell. - style (StyleType, optional): An optional style to apply to the entire row. Defaults to None. - end_section (bool, optional): End a section and draw a line. Defaults to False. - - Raises: - errors.NotRenderableError: If you add something that can't be rendered. - """ - - def add_cell(column: Column, renderable: "RenderableType") -> None: - column._cells.append(renderable) - - cell_renderables: List[Optional["RenderableType"]] = list(renderables) - - columns = self.columns - if len(cell_renderables) < len(columns): - cell_renderables = [ - *cell_renderables, - *[None] * (len(columns) - len(cell_renderables)), - ] - for index, renderable in enumerate(cell_renderables): - if index == len(columns): - column = Column(_index=index) - for _ in self.rows: - add_cell(column, Text("")) - self.columns.append(column) - else: - column = columns[index] - if renderable is None: - add_cell(column, "") - elif is_renderable(renderable): - add_cell(column, renderable) - else: - raise errors.NotRenderableError( - f"unable to render {type(renderable).__name__}; a string or other renderable object is required" - ) - self.rows.append(Row(style=style, end_section=end_section)) - - def add_section(self) -> None: - """Add a new section (draw a line after current row).""" - - if self.rows: - self.rows[-1].end_section = True - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - - if not self.columns: - yield Segment("\n") - return - - max_width = options.max_width - if self.width is not None: - max_width = self.width - - extra_width = self._extra_width - widths = self._calculate_column_widths( - console, options.update_width(max_width - extra_width) - ) - table_width = sum(widths) + extra_width - - render_options = options.update( - width=table_width, highlight=self.highlight, height=None - ) - - def render_annotation( - text: TextType, style: StyleType, justify: "JustifyMethod" = "center" - ) -> "RenderResult": - render_text = ( - console.render_str(text, style=style, highlight=False) - if isinstance(text, str) - else text - ) - return console.render( - render_text, options=render_options.update(justify=justify) - ) - - if self.title: - yield from render_annotation( - self.title, - style=Style.pick_first(self.title_style, "table.title"), - justify=self.title_justify, - ) - yield from self._render(console, render_options, widths) - if self.caption: - yield from render_annotation( - self.caption, - style=Style.pick_first(self.caption_style, "table.caption"), - justify=self.caption_justify, - ) - - def _calculate_column_widths( - self, console: "Console", options: "ConsoleOptions" - ) -> List[int]: - """Calculate the widths of each column, including padding, not including borders.""" - max_width = options.max_width - columns = self.columns - width_ranges = [ - self._measure_column(console, options, column) for column in columns - ] - widths = [_range.maximum or 1 for _range in width_ranges] - get_padding_width = self._get_padding_width - extra_width = self._extra_width - if self.expand: - ratios = [col.ratio or 0 for col in columns if col.flexible] - if any(ratios): - fixed_widths = [ - 0 if column.flexible else _range.maximum - for _range, column in zip(width_ranges, columns) - ] - flex_minimum = [ - (column.width or 1) + get_padding_width(column._index) - for column in columns - if column.flexible - ] - flexible_width = max_width - sum(fixed_widths) - flex_widths = ratio_distribute(flexible_width, ratios, flex_minimum) - iter_flex_widths = iter(flex_widths) - for index, column in enumerate(columns): - if column.flexible: - widths[index] = fixed_widths[index] + next(iter_flex_widths) - table_width = sum(widths) - - if table_width > max_width: - widths = self._collapse_widths( - widths, - [(column.width is None and not column.no_wrap) for column in columns], - max_width, - ) - table_width = sum(widths) - # last resort, reduce columns evenly - if table_width > max_width: - excess_width = table_width - max_width - widths = ratio_reduce(excess_width, [1] * len(widths), widths, widths) - table_width = sum(widths) - - width_ranges = [ - self._measure_column(console, options.update_width(width), column) - for width, column in zip(widths, columns) - ] - widths = [_range.maximum or 0 for _range in width_ranges] - - if (table_width < max_width and self.expand) or ( - self.min_width is not None and table_width < (self.min_width - extra_width) - ): - _max_width = ( - max_width - if self.min_width is None - else min(self.min_width - extra_width, max_width) - ) - pad_widths = ratio_distribute(_max_width - table_width, widths) - widths = [_width + pad for _width, pad in zip(widths, pad_widths)] - - return widths - - @classmethod - def _collapse_widths( - cls, widths: List[int], wrapable: List[bool], max_width: int - ) -> List[int]: - """Reduce widths so that the total is under max_width. - - Args: - widths (List[int]): List of widths. - wrapable (List[bool]): List of booleans that indicate if a column may shrink. - max_width (int): Maximum width to reduce to. - - Returns: - List[int]: A new list of widths. - """ - total_width = sum(widths) - excess_width = total_width - max_width - if any(wrapable): - while total_width and excess_width > 0: - max_column = max( - width for width, allow_wrap in zip(widths, wrapable) if allow_wrap - ) - second_max_column = max( - width if allow_wrap and width != max_column else 0 - for width, allow_wrap in zip(widths, wrapable) - ) - column_difference = max_column - second_max_column - ratios = [ - (1 if (width == max_column and allow_wrap) else 0) - for width, allow_wrap in zip(widths, wrapable) - ] - if not any(ratios) or not column_difference: - break - max_reduce = [min(excess_width, column_difference)] * len(widths) - widths = ratio_reduce(excess_width, ratios, max_reduce, widths) - - total_width = sum(widths) - excess_width = total_width - max_width - return widths - - def _get_cells( - self, console: "Console", column_index: int, column: Column - ) -> Iterable[_Cell]: - """Get all the cells with padding and optional header.""" - - collapse_padding = self.collapse_padding - pad_edge = self.pad_edge - padding = self.padding - any_padding = any(padding) - - first_column = column_index == 0 - last_column = column_index == len(self.columns) - 1 - - _padding_cache: Dict[Tuple[bool, bool], Tuple[int, int, int, int]] = {} - - def get_padding(first_row: bool, last_row: bool) -> Tuple[int, int, int, int]: - cached = _padding_cache.get((first_row, last_row)) - if cached: - return cached - top, right, bottom, left = padding - - if collapse_padding: - if not first_column: - left = max(0, left - right) - if not last_row: - bottom = max(0, top - bottom) - - if not pad_edge: - if first_column: - left = 0 - if last_column: - right = 0 - if first_row: - top = 0 - if last_row: - bottom = 0 - _padding = (top, right, bottom, left) - _padding_cache[(first_row, last_row)] = _padding - return _padding - - raw_cells: List[Tuple[StyleType, "RenderableType"]] = [] - _append = raw_cells.append - get_style = console.get_style - if self.show_header: - header_style = get_style(self.header_style or "") + get_style( - column.header_style - ) - _append((header_style, column.header)) - cell_style = get_style(column.style or "") - for cell in column.cells: - _append((cell_style, cell)) - if self.show_footer: - footer_style = get_style(self.footer_style or "") + get_style( - column.footer_style - ) - _append((footer_style, column.footer)) - - if any_padding: - _Padding = Padding - for first, last, (style, renderable) in loop_first_last(raw_cells): - yield _Cell( - style, - _Padding(renderable, get_padding(first, last)), - getattr(renderable, "vertical", None) or column.vertical, - ) - else: - for (style, renderable) in raw_cells: - yield _Cell( - style, - renderable, - getattr(renderable, "vertical", None) or column.vertical, - ) - - def _get_padding_width(self, column_index: int) -> int: - """Get extra width from padding.""" - _, pad_right, _, pad_left = self.padding - if self.collapse_padding: - if column_index > 0: - pad_left = max(0, pad_left - pad_right) - return pad_left + pad_right - - def _measure_column( - self, - console: "Console", - options: "ConsoleOptions", - column: Column, - ) -> Measurement: - """Get the minimum and maximum width of the column.""" - - max_width = options.max_width - if max_width < 1: - return Measurement(0, 0) - - padding_width = self._get_padding_width(column._index) - - if column.width is not None: - # Fixed width column - return Measurement( - column.width + padding_width, column.width + padding_width - ).with_maximum(max_width) - # Flexible column, we need to measure contents - min_widths: List[int] = [] - max_widths: List[int] = [] - append_min = min_widths.append - append_max = max_widths.append - get_render_width = Measurement.get - for cell in self._get_cells(console, column._index, column): - _min, _max = get_render_width(console, options, cell.renderable) - append_min(_min) - append_max(_max) - - measurement = Measurement( - max(min_widths) if min_widths else 1, - max(max_widths) if max_widths else max_width, - ).with_maximum(max_width) - measurement = measurement.clamp( - None if column.min_width is None else column.min_width + padding_width, - None if column.max_width is None else column.max_width + padding_width, - ) - return measurement - - def _render( - self, console: "Console", options: "ConsoleOptions", widths: List[int] - ) -> "RenderResult": - table_style = console.get_style(self.style or "") - - border_style = table_style + console.get_style(self.border_style or "") - _column_cells = ( - self._get_cells(console, column_index, column) - for column_index, column in enumerate(self.columns) - ) - row_cells: List[Tuple[_Cell, ...]] = list(zip(*_column_cells)) - _box = ( - self.box.substitute( - options, safe=pick_bool(self.safe_box, console.safe_box) - ) - if self.box - else None - ) - _box = _box.get_plain_headed_box() if _box and not self.show_header else _box - - new_line = Segment.line() - - columns = self.columns - show_header = self.show_header - show_footer = self.show_footer - show_edge = self.show_edge - show_lines = self.show_lines - leading = self.leading - - _Segment = Segment - if _box: - box_segments = [ - ( - _Segment(_box.head_left, border_style), - _Segment(_box.head_right, border_style), - _Segment(_box.head_vertical, border_style), - ), - ( - _Segment(_box.foot_left, border_style), - _Segment(_box.foot_right, border_style), - _Segment(_box.foot_vertical, border_style), - ), - ( - _Segment(_box.mid_left, border_style), - _Segment(_box.mid_right, border_style), - _Segment(_box.mid_vertical, border_style), - ), - ] - if show_edge: - yield _Segment(_box.get_top(widths), border_style) - yield new_line - else: - box_segments = [] - - get_row_style = self.get_row_style - get_style = console.get_style - - for index, (first, last, row_cell) in enumerate(loop_first_last(row_cells)): - header_row = first and show_header - footer_row = last and show_footer - row = ( - self.rows[index - show_header] - if (not header_row and not footer_row) - else None - ) - max_height = 1 - cells: List[List[List[Segment]]] = [] - if header_row or footer_row: - row_style = Style.null() - else: - row_style = get_style( - get_row_style(console, index - 1 if show_header else index) - ) - for width, cell, column in zip(widths, row_cell, columns): - render_options = options.update( - width=width, - justify=column.justify, - no_wrap=column.no_wrap, - overflow=column.overflow, - height=None, - ) - lines = console.render_lines( - cell.renderable, - render_options, - style=get_style(cell.style) + row_style, - ) - max_height = max(max_height, len(lines)) - cells.append(lines) - - row_height = max(len(cell) for cell in cells) - - def align_cell( - cell: List[List[Segment]], - vertical: "VerticalAlignMethod", - width: int, - style: Style, - ) -> List[List[Segment]]: - if header_row: - vertical = "bottom" - elif footer_row: - vertical = "top" - - if vertical == "top": - return _Segment.align_top(cell, width, row_height, style) - elif vertical == "middle": - return _Segment.align_middle(cell, width, row_height, style) - return _Segment.align_bottom(cell, width, row_height, style) - - cells[:] = [ - _Segment.set_shape( - align_cell( - cell, - _cell.vertical, - width, - get_style(_cell.style) + row_style, - ), - width, - max_height, - ) - for width, _cell, cell, column in zip(widths, row_cell, cells, columns) - ] - - if _box: - if last and show_footer: - yield _Segment( - _box.get_row(widths, "foot", edge=show_edge), border_style - ) - yield new_line - left, right, _divider = box_segments[0 if first else (2 if last else 1)] - - # If the column divider is whitespace also style it with the row background - divider = ( - _divider - if _divider.text.strip() - else _Segment( - _divider.text, row_style.background_style + _divider.style - ) - ) - for line_no in range(max_height): - if show_edge: - yield left - for last_cell, rendered_cell in loop_last(cells): - yield from rendered_cell[line_no] - if not last_cell: - yield divider - if show_edge: - yield right - yield new_line - else: - for line_no in range(max_height): - for rendered_cell in cells: - yield from rendered_cell[line_no] - yield new_line - if _box and first and show_header: - yield _Segment( - _box.get_row(widths, "head", edge=show_edge), border_style - ) - yield new_line - end_section = row and row.end_section - if _box and (show_lines or leading or end_section): - if ( - not last - and not (show_footer and index >= len(row_cells) - 2) - and not (show_header and header_row) - ): - if leading: - yield _Segment( - _box.get_row(widths, "mid", edge=show_edge) * leading, - border_style, - ) - else: - yield _Segment( - _box.get_row(widths, "row", edge=show_edge), border_style - ) - yield new_line - - if _box and show_edge: - yield _Segment(_box.get_bottom(widths), border_style) - yield new_line - - -if __name__ == "__main__": # pragma: no cover - from rich.console import Console - from rich.highlighter import ReprHighlighter - from rich.table import Table as Table - - from ._timer import timer - - with timer("Table render"): - table = Table( - title="Star Wars Movies", - caption="Rich example table", - caption_justify="right", - ) - - table.add_column( - "Released", header_style="bright_cyan", style="cyan", no_wrap=True - ) - table.add_column("Title", style="magenta") - table.add_column("Box Office", justify="right", style="green") - - table.add_row( - "Dec 20, 2019", - "Star Wars: The Rise of Skywalker", - "$952,110,690", - ) - table.add_row("May 25, 2018", "Solo: A Star Wars Story", "$393,151,347") - table.add_row( - "Dec 15, 2017", - "Star Wars Ep. V111: The Last Jedi", - "$1,332,539,889", - style="on black", - end_section=True, - ) - table.add_row( - "Dec 16, 2016", - "Rogue One: A Star Wars Story", - "$1,332,439,889", - ) - - def header(text: str) -> None: - console.print() - console.rule(highlight(text)) - console.print() - - console = Console() - highlight = ReprHighlighter() - header("Example Table") - console.print(table, justify="center") - - table.expand = True - header("expand=True") - console.print(table) - - table.width = 50 - header("width=50") - - console.print(table, justify="center") - - table.width = None - table.expand = False - table.row_styles = ["dim", "none"] - header("row_styles=['dim', 'none']") - - console.print(table, justify="center") - - table.width = None - table.expand = False - table.row_styles = ["dim", "none"] - table.leading = 1 - header("leading=1, row_styles=['dim', 'none']") - console.print(table, justify="center") - - table.width = None - table.expand = False - table.row_styles = ["dim", "none"] - table.show_lines = True - table.leading = 0 - header("show_lines=True, row_styles=['dim', 'none']") - console.print(table, justify="center") diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/terminal_theme.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/terminal_theme.py deleted file mode 100644 index 565e9d96..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/terminal_theme.py +++ /dev/null @@ -1,153 +0,0 @@ -from typing import List, Optional, Tuple - -from .color_triplet import ColorTriplet -from .palette import Palette - -_ColorTuple = Tuple[int, int, int] - - -class TerminalTheme: - """A color theme used when exporting console content. - - Args: - background (Tuple[int, int, int]): The background color. - foreground (Tuple[int, int, int]): The foreground (text) color. - normal (List[Tuple[int, int, int]]): A list of 8 normal intensity colors. - bright (List[Tuple[int, int, int]], optional): A list of 8 bright colors, or None - to repeat normal intensity. Defaults to None. - """ - - def __init__( - self, - background: _ColorTuple, - foreground: _ColorTuple, - normal: List[_ColorTuple], - bright: Optional[List[_ColorTuple]] = None, - ) -> None: - self.background_color = ColorTriplet(*background) - self.foreground_color = ColorTriplet(*foreground) - self.ansi_colors = Palette(normal + (bright or normal)) - - -DEFAULT_TERMINAL_THEME = TerminalTheme( - (255, 255, 255), - (0, 0, 0), - [ - (0, 0, 0), - (128, 0, 0), - (0, 128, 0), - (128, 128, 0), - (0, 0, 128), - (128, 0, 128), - (0, 128, 128), - (192, 192, 192), - ], - [ - (128, 128, 128), - (255, 0, 0), - (0, 255, 0), - (255, 255, 0), - (0, 0, 255), - (255, 0, 255), - (0, 255, 255), - (255, 255, 255), - ], -) - -MONOKAI = TerminalTheme( - (12, 12, 12), - (217, 217, 217), - [ - (26, 26, 26), - (244, 0, 95), - (152, 224, 36), - (253, 151, 31), - (157, 101, 255), - (244, 0, 95), - (88, 209, 235), - (196, 197, 181), - (98, 94, 76), - ], - [ - (244, 0, 95), - (152, 224, 36), - (224, 213, 97), - (157, 101, 255), - (244, 0, 95), - (88, 209, 235), - (246, 246, 239), - ], -) -DIMMED_MONOKAI = TerminalTheme( - (25, 25, 25), - (185, 188, 186), - [ - (58, 61, 67), - (190, 63, 72), - (135, 154, 59), - (197, 166, 53), - (79, 118, 161), - (133, 92, 141), - (87, 143, 164), - (185, 188, 186), - (136, 137, 135), - ], - [ - (251, 0, 31), - (15, 114, 47), - (196, 112, 51), - (24, 109, 227), - (251, 0, 103), - (46, 112, 109), - (253, 255, 185), - ], -) -NIGHT_OWLISH = TerminalTheme( - (255, 255, 255), - (64, 63, 83), - [ - (1, 22, 39), - (211, 66, 62), - (42, 162, 152), - (218, 170, 1), - (72, 118, 214), - (64, 63, 83), - (8, 145, 106), - (122, 129, 129), - (122, 129, 129), - ], - [ - (247, 110, 110), - (73, 208, 197), - (218, 194, 107), - (92, 167, 228), - (105, 112, 152), - (0, 201, 144), - (152, 159, 177), - ], -) - -SVG_EXPORT_THEME = TerminalTheme( - (41, 41, 41), - (197, 200, 198), - [ - (75, 78, 85), - (204, 85, 90), - (152, 168, 75), - (208, 179, 68), - (96, 138, 177), - (152, 114, 159), - (104, 160, 179), - (197, 200, 198), - (154, 155, 153), - ], - [ - (255, 38, 39), - (0, 130, 61), - (208, 132, 66), - (25, 132, 233), - (255, 44, 122), - (57, 130, 128), - (253, 253, 197), - ], -) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/text.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/text.py deleted file mode 100644 index c534b3b1..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/text.py +++ /dev/null @@ -1,1307 +0,0 @@ -import re -from functools import partial, reduce -from math import gcd -from operator import itemgetter -from typing import ( - TYPE_CHECKING, - Any, - Callable, - Dict, - Iterable, - List, - NamedTuple, - Optional, - Tuple, - Union, -) - -from ._loop import loop_last -from ._pick import pick_bool -from ._wrap import divide_line -from .align import AlignMethod -from .cells import cell_len, set_cell_size -from .containers import Lines -from .control import strip_control_codes -from .emoji import EmojiVariant -from .jupyter import JupyterMixin -from .measure import Measurement -from .segment import Segment -from .style import Style, StyleType - -if TYPE_CHECKING: # pragma: no cover - from .console import Console, ConsoleOptions, JustifyMethod, OverflowMethod - -DEFAULT_JUSTIFY: "JustifyMethod" = "default" -DEFAULT_OVERFLOW: "OverflowMethod" = "fold" - - -_re_whitespace = re.compile(r"\s+$") - -TextType = Union[str, "Text"] - -GetStyleCallable = Callable[[str], Optional[StyleType]] - - -class Span(NamedTuple): - """A marked up region in some text.""" - - start: int - """Span start index.""" - end: int - """Span end index.""" - style: Union[str, Style] - """Style associated with the span.""" - - def __repr__(self) -> str: - return f"Span({self.start}, {self.end}, {self.style!r})" - - def __bool__(self) -> bool: - return self.end > self.start - - def split(self, offset: int) -> Tuple["Span", Optional["Span"]]: - """Split a span in to 2 from a given offset.""" - - if offset < self.start: - return self, None - if offset >= self.end: - return self, None - - start, end, style = self - span1 = Span(start, min(end, offset), style) - span2 = Span(span1.end, end, style) - return span1, span2 - - def move(self, offset: int) -> "Span": - """Move start and end by a given offset. - - Args: - offset (int): Number of characters to add to start and end. - - Returns: - TextSpan: A new TextSpan with adjusted position. - """ - start, end, style = self - return Span(start + offset, end + offset, style) - - def right_crop(self, offset: int) -> "Span": - """Crop the span at the given offset. - - Args: - offset (int): A value between start and end. - - Returns: - Span: A new (possibly smaller) span. - """ - start, end, style = self - if offset >= end: - return self - return Span(start, min(offset, end), style) - - -class Text(JupyterMixin): - """Text with color / style. - - Args: - text (str, optional): Default unstyled text. Defaults to "". - style (Union[str, Style], optional): Base style for text. Defaults to "". - justify (str, optional): Justify method: "left", "center", "full", "right". Defaults to None. - overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None. - no_wrap (bool, optional): Disable text wrapping, or None for default. Defaults to None. - end (str, optional): Character to end text with. Defaults to "\\\\n". - tab_size (int): Number of spaces per tab, or ``None`` to use ``console.tab_size``. Defaults to 8. - spans (List[Span], optional). A list of predefined style spans. Defaults to None. - """ - - __slots__ = [ - "_text", - "style", - "justify", - "overflow", - "no_wrap", - "end", - "tab_size", - "_spans", - "_length", - ] - - def __init__( - self, - text: str = "", - style: Union[str, Style] = "", - *, - justify: Optional["JustifyMethod"] = None, - overflow: Optional["OverflowMethod"] = None, - no_wrap: Optional[bool] = None, - end: str = "\n", - tab_size: Optional[int] = 8, - spans: Optional[List[Span]] = None, - ) -> None: - sanitized_text = strip_control_codes(text) - self._text = [sanitized_text] - self.style = style - self.justify: Optional["JustifyMethod"] = justify - self.overflow: Optional["OverflowMethod"] = overflow - self.no_wrap = no_wrap - self.end = end - self.tab_size = tab_size - self._spans: List[Span] = spans or [] - self._length: int = len(sanitized_text) - - def __len__(self) -> int: - return self._length - - def __bool__(self) -> bool: - return bool(self._length) - - def __str__(self) -> str: - return self.plain - - def __repr__(self) -> str: - return f"<text {self.plain!r} {self._spans!r}>" - - def __add__(self, other: Any) -> "Text": - if isinstance(other, (str, Text)): - result = self.copy() - result.append(other) - return result - return NotImplemented - - def __eq__(self, other: object) -> bool: - if not isinstance(other, Text): - return NotImplemented - return self.plain == other.plain and self._spans == other._spans - - def __contains__(self, other: object) -> bool: - if isinstance(other, str): - return other in self.plain - elif isinstance(other, Text): - return other.plain in self.plain - return False - - def __getitem__(self, slice: Union[int, slice]) -> "Text": - def get_text_at(offset: int) -> "Text": - _Span = Span - text = Text( - self.plain[offset], - spans=[ - _Span(0, 1, style) - for start, end, style in self._spans - if end > offset >= start - ], - end="", - ) - return text - - if isinstance(slice, int): - return get_text_at(slice) - else: - start, stop, step = slice.indices(len(self.plain)) - if step == 1: - lines = self.divide([start, stop]) - return lines[1] - else: - # This would be a bit of work to implement efficiently - # For now, its not required - raise TypeError("slices with step!=1 are not supported") - - @property - def cell_len(self) -> int: - """Get the number of cells required to render this text.""" - return cell_len(self.plain) - - @property - def markup(self) -> str: - """Get console markup to render this Text. - - Returns: - str: A string potentially creating markup tags. - """ - from .markup import escape - - output: List[str] = [] - - plain = self.plain - markup_spans = [ - (0, False, self.style), - *((span.start, False, span.style) for span in self._spans), - *((span.end, True, span.style) for span in self._spans), - (len(plain), True, self.style), - ] - markup_spans.sort(key=itemgetter(0, 1)) - position = 0 - append = output.append - for offset, closing, style in markup_spans: - if offset > position: - append(escape(plain[position:offset])) - position = offset - if style: - append(f"[/{style}]" if closing else f"[{style}]") - markup = "".join(output) - return markup - - @classmethod - def from_markup( - cls, - text: str, - *, - style: Union[str, Style] = "", - emoji: bool = True, - emoji_variant: Optional[EmojiVariant] = None, - justify: Optional["JustifyMethod"] = None, - overflow: Optional["OverflowMethod"] = None, - end: str = "\n", - ) -> "Text": - """Create Text instance from markup. - - Args: - text (str): A string containing console markup. - emoji (bool, optional): Also render emoji code. Defaults to True. - justify (str, optional): Justify method: "left", "center", "full", "right". Defaults to None. - overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None. - end (str, optional): Character to end text with. Defaults to "\\\\n". - - Returns: - Text: A Text instance with markup rendered. - """ - from .markup import render - - rendered_text = render(text, style, emoji=emoji, emoji_variant=emoji_variant) - rendered_text.justify = justify - rendered_text.overflow = overflow - rendered_text.end = end - return rendered_text - - @classmethod - def from_ansi( - cls, - text: str, - *, - style: Union[str, Style] = "", - justify: Optional["JustifyMethod"] = None, - overflow: Optional["OverflowMethod"] = None, - no_wrap: Optional[bool] = None, - end: str = "\n", - tab_size: Optional[int] = 8, - ) -> "Text": - """Create a Text object from a string containing ANSI escape codes. - - Args: - text (str): A string containing escape codes. - style (Union[str, Style], optional): Base style for text. Defaults to "". - justify (str, optional): Justify method: "left", "center", "full", "right". Defaults to None. - overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None. - no_wrap (bool, optional): Disable text wrapping, or None for default. Defaults to None. - end (str, optional): Character to end text with. Defaults to "\\\\n". - tab_size (int): Number of spaces per tab, or ``None`` to use ``console.tab_size``. Defaults to 8. - """ - from .ansi import AnsiDecoder - - joiner = Text( - "\n", - justify=justify, - overflow=overflow, - no_wrap=no_wrap, - end=end, - tab_size=tab_size, - style=style, - ) - decoder = AnsiDecoder() - result = joiner.join(line for line in decoder.decode(text)) - return result - - @classmethod - def styled( - cls, - text: str, - style: StyleType = "", - *, - justify: Optional["JustifyMethod"] = None, - overflow: Optional["OverflowMethod"] = None, - ) -> "Text": - """Construct a Text instance with a pre-applied styled. A style applied in this way won't be used - to pad the text when it is justified. - - Args: - text (str): A string containing console markup. - style (Union[str, Style]): Style to apply to the text. Defaults to "". - justify (str, optional): Justify method: "left", "center", "full", "right". Defaults to None. - overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None. - - Returns: - Text: A text instance with a style applied to the entire string. - """ - styled_text = cls(text, justify=justify, overflow=overflow) - styled_text.stylize(style) - return styled_text - - @classmethod - def assemble( - cls, - *parts: Union[str, "Text", Tuple[str, StyleType]], - style: Union[str, Style] = "", - justify: Optional["JustifyMethod"] = None, - overflow: Optional["OverflowMethod"] = None, - no_wrap: Optional[bool] = None, - end: str = "\n", - tab_size: int = 8, - meta: Optional[Dict[str, Any]] = None, - ) -> "Text": - """Construct a text instance by combining a sequence of strings with optional styles. - The positional arguments should be either strings, or a tuple of string + style. - - Args: - style (Union[str, Style], optional): Base style for text. Defaults to "". - justify (str, optional): Justify method: "left", "center", "full", "right". Defaults to None. - overflow (str, optional): Overflow method: "crop", "fold", "ellipsis". Defaults to None. - end (str, optional): Character to end text with. Defaults to "\\\\n". - tab_size (int): Number of spaces per tab, or ``None`` to use ``console.tab_size``. Defaults to 8. - meta (Dict[str, Any], optional). Meta data to apply to text, or None for no meta data. Default to None - - Returns: - Text: A new text instance. - """ - text = cls( - style=style, - justify=justify, - overflow=overflow, - no_wrap=no_wrap, - end=end, - tab_size=tab_size, - ) - append = text.append - _Text = Text - for part in parts: - if isinstance(part, (_Text, str)): - append(part) - else: - append(*part) - if meta: - text.apply_meta(meta) - return text - - @property - def plain(self) -> str: - """Get the text as a single string.""" - if len(self._text) != 1: - self._text[:] = ["".join(self._text)] - return self._text[0] - - @plain.setter - def plain(self, new_text: str) -> None: - """Set the text to a new value.""" - if new_text != self.plain: - sanitized_text = strip_control_codes(new_text) - self._text[:] = [sanitized_text] - old_length = self._length - self._length = len(sanitized_text) - if old_length > self._length: - self._trim_spans() - - @property - def spans(self) -> List[Span]: - """Get a reference to the internal list of spans.""" - return self._spans - - @spans.setter - def spans(self, spans: List[Span]) -> None: - """Set spans.""" - self._spans = spans[:] - - def blank_copy(self, plain: str = "") -> "Text": - """Return a new Text instance with copied meta data (but not the string or spans).""" - copy_self = Text( - plain, - style=self.style, - justify=self.justify, - overflow=self.overflow, - no_wrap=self.no_wrap, - end=self.end, - tab_size=self.tab_size, - ) - return copy_self - - def copy(self) -> "Text": - """Return a copy of this instance.""" - copy_self = Text( - self.plain, - style=self.style, - justify=self.justify, - overflow=self.overflow, - no_wrap=self.no_wrap, - end=self.end, - tab_size=self.tab_size, - ) - copy_self._spans[:] = self._spans - return copy_self - - def stylize( - self, - style: Union[str, Style], - start: int = 0, - end: Optional[int] = None, - ) -> None: - """Apply a style to the text, or a portion of the text. - - Args: - style (Union[str, Style]): Style instance or style definition to apply. - start (int): Start offset (negative indexing is supported). Defaults to 0. - end (Optional[int], optional): End offset (negative indexing is supported), or None for end of text. Defaults to None. - """ - if style: - length = len(self) - if start < 0: - start = length + start - if end is None: - end = length - if end < 0: - end = length + end - if start >= length or end <= start: - # Span not in text or not valid - return - self._spans.append(Span(start, min(length, end), style)) - - def stylize_before( - self, - style: Union[str, Style], - start: int = 0, - end: Optional[int] = None, - ) -> None: - """Apply a style to the text, or a portion of the text. Styles will be applied before other styles already present. - - Args: - style (Union[str, Style]): Style instance or style definition to apply. - start (int): Start offset (negative indexing is supported). Defaults to 0. - end (Optional[int], optional): End offset (negative indexing is supported), or None for end of text. Defaults to None. - """ - if style: - length = len(self) - if start < 0: - start = length + start - if end is None: - end = length - if end < 0: - end = length + end - if start >= length or end <= start: - # Span not in text or not valid - return - self._spans.insert(0, Span(start, min(length, end), style)) - - def apply_meta( - self, meta: Dict[str, Any], start: int = 0, end: Optional[int] = None - ) -> None: - """Apply meta data to the text, or a portion of the text. - - Args: - meta (Dict[str, Any]): A dict of meta information. - start (int): Start offset (negative indexing is supported). Defaults to 0. - end (Optional[int], optional): End offset (negative indexing is supported), or None for end of text. Defaults to None. - - """ - style = Style.from_meta(meta) - self.stylize(style, start=start, end=end) - - def on(self, meta: Optional[Dict[str, Any]] = None, **handlers: Any) -> "Text": - """Apply event handlers (used by Textual project). - - Example: - >>> from rich.text import Text - >>> text = Text("hello world") - >>> text.on(click="view.toggle('world')") - - Args: - meta (Dict[str, Any]): Mapping of meta information. - **handlers: Keyword args are prefixed with "@" to defined handlers. - - Returns: - Text: Self is returned to method may be chained. - """ - meta = {} if meta is None else meta - meta.update({f"@{key}": value for key, value in handlers.items()}) - self.stylize(Style.from_meta(meta)) - return self - - def remove_suffix(self, suffix: str) -> None: - """Remove a suffix if it exists. - - Args: - suffix (str): Suffix to remove. - """ - if self.plain.endswith(suffix): - self.right_crop(len(suffix)) - - def get_style_at_offset(self, console: "Console", offset: int) -> Style: - """Get the style of a character at give offset. - - Args: - console (~Console): Console where text will be rendered. - offset (int): Offset in to text (negative indexing supported) - - Returns: - Style: A Style instance. - """ - # TODO: This is a little inefficient, it is only used by full justify - if offset < 0: - offset = len(self) + offset - get_style = console.get_style - style = get_style(self.style).copy() - for start, end, span_style in self._spans: - if end > offset >= start: - style += get_style(span_style, default="") - return style - - def highlight_regex( - self, - re_highlight: str, - style: Optional[Union[GetStyleCallable, StyleType]] = None, - *, - style_prefix: str = "", - ) -> int: - """Highlight text with a regular expression, where group names are - translated to styles. - - Args: - re_highlight (str): A regular expression. - style (Union[GetStyleCallable, StyleType]): Optional style to apply to whole match, or a callable - which accepts the matched text and returns a style. Defaults to None. - style_prefix (str, optional): Optional prefix to add to style group names. - - Returns: - int: Number of regex matches - """ - count = 0 - append_span = self._spans.append - _Span = Span - plain = self.plain - for match in re.finditer(re_highlight, plain): - get_span = match.span - if style: - start, end = get_span() - match_style = style(plain[start:end]) if callable(style) else style - if match_style is not None and end > start: - append_span(_Span(start, end, match_style)) - - count += 1 - for name in match.groupdict().keys(): - start, end = get_span(name) - if start != -1 and end > start: - append_span(_Span(start, end, f"{style_prefix}{name}")) - return count - - def highlight_words( - self, - words: Iterable[str], - style: Union[str, Style], - *, - case_sensitive: bool = True, - ) -> int: - """Highlight words with a style. - - Args: - words (Iterable[str]): Worlds to highlight. - style (Union[str, Style]): Style to apply. - case_sensitive (bool, optional): Enable case sensitive matchings. Defaults to True. - - Returns: - int: Number of words highlighted. - """ - re_words = "|".join(re.escape(word) for word in words) - add_span = self._spans.append - count = 0 - _Span = Span - for match in re.finditer( - re_words, self.plain, flags=0 if case_sensitive else re.IGNORECASE - ): - start, end = match.span(0) - add_span(_Span(start, end, style)) - count += 1 - return count - - def rstrip(self) -> None: - """Strip whitespace from end of text.""" - self.plain = self.plain.rstrip() - - def rstrip_end(self, size: int) -> None: - """Remove whitespace beyond a certain width at the end of the text. - - Args: - size (int): The desired size of the text. - """ - text_length = len(self) - if text_length > size: - excess = text_length - size - whitespace_match = _re_whitespace.search(self.plain) - if whitespace_match is not None: - whitespace_count = len(whitespace_match.group(0)) - self.right_crop(min(whitespace_count, excess)) - - def set_length(self, new_length: int) -> None: - """Set new length of the text, clipping or padding is required.""" - length = len(self) - if length != new_length: - if length < new_length: - self.pad_right(new_length - length) - else: - self.right_crop(length - new_length) - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> Iterable[Segment]: - tab_size: int = console.tab_size or self.tab_size or 8 - justify = self.justify or options.justify or DEFAULT_JUSTIFY - - overflow = self.overflow or options.overflow or DEFAULT_OVERFLOW - - lines = self.wrap( - console, - options.max_width, - justify=justify, - overflow=overflow, - tab_size=tab_size or 8, - no_wrap=pick_bool(self.no_wrap, options.no_wrap, False), - ) - all_lines = Text("\n").join(lines) - yield from all_lines.render(console, end=self.end) - - def __rich_measure__( - self, console: "Console", options: "ConsoleOptions" - ) -> Measurement: - text = self.plain - lines = text.splitlines() - max_text_width = max(cell_len(line) for line in lines) if lines else 0 - words = text.split() - min_text_width = ( - max(cell_len(word) for word in words) if words else max_text_width - ) - return Measurement(min_text_width, max_text_width) - - def render(self, console: "Console", end: str = "") -> Iterable["Segment"]: - """Render the text as Segments. - - Args: - console (Console): Console instance. - end (Optional[str], optional): Optional end character. - - Returns: - Iterable[Segment]: Result of render that may be written to the console. - """ - _Segment = Segment - text = self.plain - if not self._spans: - yield Segment(text) - if end: - yield _Segment(end) - return - get_style = partial(console.get_style, default=Style.null()) - - enumerated_spans = list(enumerate(self._spans, 1)) - style_map = {index: get_style(span.style) for index, span in enumerated_spans} - style_map[0] = get_style(self.style) - - spans = [ - (0, False, 0), - *((span.start, False, index) for index, span in enumerated_spans), - *((span.end, True, index) for index, span in enumerated_spans), - (len(text), True, 0), - ] - spans.sort(key=itemgetter(0, 1)) - - stack: List[int] = [] - stack_append = stack.append - stack_pop = stack.remove - - style_cache: Dict[Tuple[Style, ...], Style] = {} - style_cache_get = style_cache.get - combine = Style.combine - - def get_current_style() -> Style: - """Construct current style from stack.""" - styles = tuple(style_map[_style_id] for _style_id in sorted(stack)) - cached_style = style_cache_get(styles) - if cached_style is not None: - return cached_style - current_style = combine(styles) - style_cache[styles] = current_style - return current_style - - for (offset, leaving, style_id), (next_offset, _, _) in zip(spans, spans[1:]): - if leaving: - stack_pop(style_id) - else: - stack_append(style_id) - if next_offset > offset: - yield _Segment(text[offset:next_offset], get_current_style()) - if end: - yield _Segment(end) - - def join(self, lines: Iterable["Text"]) -> "Text": - """Join text together with this instance as the separator. - - Args: - lines (Iterable[Text]): An iterable of Text instances to join. - - Returns: - Text: A new text instance containing join text. - """ - - new_text = self.blank_copy() - - def iter_text() -> Iterable["Text"]: - if self.plain: - for last, line in loop_last(lines): - yield line - if not last: - yield self - else: - yield from lines - - extend_text = new_text._text.extend - append_span = new_text._spans.append - extend_spans = new_text._spans.extend - offset = 0 - _Span = Span - - for text in iter_text(): - extend_text(text._text) - if text.style: - append_span(_Span(offset, offset + len(text), text.style)) - extend_spans( - _Span(offset + start, offset + end, style) - for start, end, style in text._spans - ) - offset += len(text) - new_text._length = offset - return new_text - - def expand_tabs(self, tab_size: Optional[int] = None) -> None: - """Converts tabs to spaces. - - Args: - tab_size (int, optional): Size of tabs. Defaults to 8. - - """ - if "\t" not in self.plain: - return - pos = 0 - if tab_size is None: - tab_size = self.tab_size - assert tab_size is not None - result = self.blank_copy() - append = result.append - - _style = self.style - for line in self.split("\n", include_separator=True): - parts = line.split("\t", include_separator=True) - for part in parts: - if part.plain.endswith("\t"): - part._text = [part.plain[:-1] + " "] - append(part) - pos += len(part) - spaces = tab_size - ((pos - 1) % tab_size) - 1 - if spaces: - append(" " * spaces, _style) - pos += spaces - else: - append(part) - self._text = [result.plain] - self._length = len(self.plain) - self._spans[:] = result._spans - - def truncate( - self, - max_width: int, - *, - overflow: Optional["OverflowMethod"] = None, - pad: bool = False, - ) -> None: - """Truncate text if it is longer that a given width. - - Args: - max_width (int): Maximum number of characters in text. - overflow (str, optional): Overflow method: "crop", "fold", or "ellipsis". Defaults to None, to use self.overflow. - pad (bool, optional): Pad with spaces if the length is less than max_width. Defaults to False. - """ - _overflow = overflow or self.overflow or DEFAULT_OVERFLOW - if _overflow != "ignore": - length = cell_len(self.plain) - if length > max_width: - if _overflow == "ellipsis": - self.plain = set_cell_size(self.plain, max_width - 1) + "…" - else: - self.plain = set_cell_size(self.plain, max_width) - if pad and length < max_width: - spaces = max_width - length - self._text = [f"{self.plain}{' ' * spaces}"] - self._length = len(self.plain) - - def _trim_spans(self) -> None: - """Remove or modify any spans that are over the end of the text.""" - max_offset = len(self.plain) - _Span = Span - self._spans[:] = [ - ( - span - if span.end < max_offset - else _Span(span.start, min(max_offset, span.end), span.style) - ) - for span in self._spans - if span.start < max_offset - ] - - def pad(self, count: int, character: str = " ") -> None: - """Pad left and right with a given number of characters. - - Args: - count (int): Width of padding. - """ - assert len(character) == 1, "Character must be a string of length 1" - if count: - pad_characters = character * count - self.plain = f"{pad_characters}{self.plain}{pad_characters}" - _Span = Span - self._spans[:] = [ - _Span(start + count, end + count, style) - for start, end, style in self._spans - ] - - def pad_left(self, count: int, character: str = " ") -> None: - """Pad the left with a given character. - - Args: - count (int): Number of characters to pad. - character (str, optional): Character to pad with. Defaults to " ". - """ - assert len(character) == 1, "Character must be a string of length 1" - if count: - self.plain = f"{character * count}{self.plain}" - _Span = Span - self._spans[:] = [ - _Span(start + count, end + count, style) - for start, end, style in self._spans - ] - - def pad_right(self, count: int, character: str = " ") -> None: - """Pad the right with a given character. - - Args: - count (int): Number of characters to pad. - character (str, optional): Character to pad with. Defaults to " ". - """ - assert len(character) == 1, "Character must be a string of length 1" - if count: - self.plain = f"{self.plain}{character * count}" - - def align(self, align: AlignMethod, width: int, character: str = " ") -> None: - """Align text to a given width. - - Args: - align (AlignMethod): One of "left", "center", or "right". - width (int): Desired width. - character (str, optional): Character to pad with. Defaults to " ". - """ - self.truncate(width) - excess_space = width - cell_len(self.plain) - if excess_space: - if align == "left": - self.pad_right(excess_space, character) - elif align == "center": - left = excess_space // 2 - self.pad_left(left, character) - self.pad_right(excess_space - left, character) - else: - self.pad_left(excess_space, character) - - def append( - self, text: Union["Text", str], style: Optional[Union[str, "Style"]] = None - ) -> "Text": - """Add text with an optional style. - - Args: - text (Union[Text, str]): A str or Text to append. - style (str, optional): A style name. Defaults to None. - - Returns: - Text: Returns self for chaining. - """ - - if not isinstance(text, (str, Text)): - raise TypeError("Only str or Text can be appended to Text") - - if len(text): - if isinstance(text, str): - sanitized_text = strip_control_codes(text) - self._text.append(sanitized_text) - offset = len(self) - text_length = len(sanitized_text) - if style is not None: - self._spans.append(Span(offset, offset + text_length, style)) - self._length += text_length - elif isinstance(text, Text): - _Span = Span - if style is not None: - raise ValueError( - "style must not be set when appending Text instance" - ) - text_length = self._length - if text.style is not None: - self._spans.append( - _Span(text_length, text_length + len(text), text.style) - ) - self._text.append(text.plain) - self._spans.extend( - _Span(start + text_length, end + text_length, style) - for start, end, style in text._spans - ) - self._length += len(text) - return self - - def append_text(self, text: "Text") -> "Text": - """Append another Text instance. This method is more performant that Text.append, but - only works for Text. - - Returns: - Text: Returns self for chaining. - """ - _Span = Span - text_length = self._length - if text.style is not None: - self._spans.append(_Span(text_length, text_length + len(text), text.style)) - self._text.append(text.plain) - self._spans.extend( - _Span(start + text_length, end + text_length, style) - for start, end, style in text._spans - ) - self._length += len(text) - return self - - def append_tokens( - self, tokens: Iterable[Tuple[str, Optional[StyleType]]] - ) -> "Text": - """Append iterable of str and style. Style may be a Style instance or a str style definition. - - Args: - pairs (Iterable[Tuple[str, Optional[StyleType]]]): An iterable of tuples containing str content and style. - - Returns: - Text: Returns self for chaining. - """ - append_text = self._text.append - append_span = self._spans.append - _Span = Span - offset = len(self) - for content, style in tokens: - append_text(content) - if style is not None: - append_span(_Span(offset, offset + len(content), style)) - offset += len(content) - self._length = offset - return self - - def copy_styles(self, text: "Text") -> None: - """Copy styles from another Text instance. - - Args: - text (Text): A Text instance to copy styles from, must be the same length. - """ - self._spans.extend(text._spans) - - def split( - self, - separator: str = "\n", - *, - include_separator: bool = False, - allow_blank: bool = False, - ) -> Lines: - """Split rich text in to lines, preserving styles. - - Args: - separator (str, optional): String to split on. Defaults to "\\\\n". - include_separator (bool, optional): Include the separator in the lines. Defaults to False. - allow_blank (bool, optional): Return a blank line if the text ends with a separator. Defaults to False. - - Returns: - List[RichText]: A list of rich text, one per line of the original. - """ - assert separator, "separator must not be empty" - - text = self.plain - if separator not in text: - return Lines([self.copy()]) - - if include_separator: - lines = self.divide( - match.end() for match in re.finditer(re.escape(separator), text) - ) - else: - - def flatten_spans() -> Iterable[int]: - for match in re.finditer(re.escape(separator), text): - start, end = match.span() - yield start - yield end - - lines = Lines( - line for line in self.divide(flatten_spans()) if line.plain != separator - ) - - if not allow_blank and text.endswith(separator): - lines.pop() - - return lines - - def divide(self, offsets: Iterable[int]) -> Lines: - """Divide text in to a number of lines at given offsets. - - Args: - offsets (Iterable[int]): Offsets used to divide text. - - Returns: - Lines: New RichText instances between offsets. - """ - _offsets = list(offsets) - - if not _offsets: - return Lines([self.copy()]) - - text = self.plain - text_length = len(text) - divide_offsets = [0, *_offsets, text_length] - line_ranges = list(zip(divide_offsets, divide_offsets[1:])) - - style = self.style - justify = self.justify - overflow = self.overflow - _Text = Text - new_lines = Lines( - _Text( - text[start:end], - style=style, - justify=justify, - overflow=overflow, - ) - for start, end in line_ranges - ) - if not self._spans: - return new_lines - - _line_appends = [line._spans.append for line in new_lines._lines] - line_count = len(line_ranges) - _Span = Span - - for span_start, span_end, style in self._spans: - - lower_bound = 0 - upper_bound = line_count - start_line_no = (lower_bound + upper_bound) // 2 - - while True: - line_start, line_end = line_ranges[start_line_no] - if span_start < line_start: - upper_bound = start_line_no - 1 - elif span_start > line_end: - lower_bound = start_line_no + 1 - else: - break - start_line_no = (lower_bound + upper_bound) // 2 - - if span_end < line_end: - end_line_no = start_line_no - else: - end_line_no = lower_bound = start_line_no - upper_bound = line_count - - while True: - line_start, line_end = line_ranges[end_line_no] - if span_end < line_start: - upper_bound = end_line_no - 1 - elif span_end > line_end: - lower_bound = end_line_no + 1 - else: - break - end_line_no = (lower_bound + upper_bound) // 2 - - for line_no in range(start_line_no, end_line_no + 1): - line_start, line_end = line_ranges[line_no] - new_start = max(0, span_start - line_start) - new_end = min(span_end - line_start, line_end - line_start) - if new_end > new_start: - _line_appends[line_no](_Span(new_start, new_end, style)) - - return new_lines - - def right_crop(self, amount: int = 1) -> None: - """Remove a number of characters from the end of the text.""" - max_offset = len(self.plain) - amount - _Span = Span - self._spans[:] = [ - ( - span - if span.end < max_offset - else _Span(span.start, min(max_offset, span.end), span.style) - ) - for span in self._spans - if span.start < max_offset - ] - self._text = [self.plain[:-amount]] - self._length -= amount - - def wrap( - self, - console: "Console", - width: int, - *, - justify: Optional["JustifyMethod"] = None, - overflow: Optional["OverflowMethod"] = None, - tab_size: int = 8, - no_wrap: Optional[bool] = None, - ) -> Lines: - """Word wrap the text. - - Args: - console (Console): Console instance. - width (int): Number of characters per line. - emoji (bool, optional): Also render emoji code. Defaults to True. - justify (str, optional): Justify method: "default", "left", "center", "full", "right". Defaults to "default". - overflow (str, optional): Overflow method: "crop", "fold", or "ellipsis". Defaults to None. - tab_size (int, optional): Default tab size. Defaults to 8. - no_wrap (bool, optional): Disable wrapping, Defaults to False. - - Returns: - Lines: Number of lines. - """ - wrap_justify = justify or self.justify or DEFAULT_JUSTIFY - wrap_overflow = overflow or self.overflow or DEFAULT_OVERFLOW - - no_wrap = pick_bool(no_wrap, self.no_wrap, False) or overflow == "ignore" - - lines = Lines() - for line in self.split(allow_blank=True): - if "\t" in line: - line.expand_tabs(tab_size) - if no_wrap: - new_lines = Lines([line]) - else: - offsets = divide_line(str(line), width, fold=wrap_overflow == "fold") - new_lines = line.divide(offsets) - for line in new_lines: - line.rstrip_end(width) - if wrap_justify: - new_lines.justify( - console, width, justify=wrap_justify, overflow=wrap_overflow - ) - for line in new_lines: - line.truncate(width, overflow=wrap_overflow) - lines.extend(new_lines) - return lines - - def fit(self, width: int) -> Lines: - """Fit the text in to given width by chopping in to lines. - - Args: - width (int): Maximum characters in a line. - - Returns: - Lines: Lines container. - """ - lines: Lines = Lines() - append = lines.append - for line in self.split(): - line.set_length(width) - append(line) - return lines - - def detect_indentation(self) -> int: - """Auto-detect indentation of code. - - Returns: - int: Number of spaces used to indent code. - """ - - _indentations = { - len(match.group(1)) - for match in re.finditer(r"^( *)(.*)$", self.plain, flags=re.MULTILINE) - } - - try: - indentation = ( - reduce(gcd, [indent for indent in _indentations if not indent % 2]) or 1 - ) - except TypeError: - indentation = 1 - - return indentation - - def with_indent_guides( - self, - indent_size: Optional[int] = None, - *, - character: str = "│", - style: StyleType = "dim green", - ) -> "Text": - """Adds indent guide lines to text. - - Args: - indent_size (Optional[int]): Size of indentation, or None to auto detect. Defaults to None. - character (str, optional): Character to use for indentation. Defaults to "│". - style (Union[Style, str], optional): Style of indent guides. - - Returns: - Text: New text with indentation guides. - """ - - _indent_size = self.detect_indentation() if indent_size is None else indent_size - - text = self.copy() - text.expand_tabs() - indent_line = f"{character}{' ' * (_indent_size - 1)}" - - re_indent = re.compile(r"^( *)(.*)$") - new_lines: List[Text] = [] - add_line = new_lines.append - blank_lines = 0 - for line in text.split(allow_blank=True): - match = re_indent.match(line.plain) - if not match or not match.group(2): - blank_lines += 1 - continue - indent = match.group(1) - full_indents, remaining_space = divmod(len(indent), _indent_size) - new_indent = f"{indent_line * full_indents}{' ' * remaining_space}" - line.plain = new_indent + line.plain[len(new_indent) :] - line.stylize(style, 0, len(new_indent)) - if blank_lines: - new_lines.extend([Text(new_indent, style=style)] * blank_lines) - blank_lines = 0 - add_line(line) - if blank_lines: - new_lines.extend([Text("", style=style)] * blank_lines) - - new_text = text.blank_copy("\n").join(new_lines) - return new_text - - -if __name__ == "__main__": # pragma: no cover - from rich.console import Console - - text = Text( - """\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n""" - ) - text.highlight_words(["Lorem"], "bold") - text.highlight_words(["ipsum"], "italic") - - console = Console() - - console.rule("justify='left'") - console.print(text, style="red") - console.print() - - console.rule("justify='center'") - console.print(text, style="green", justify="center") - console.print() - - console.rule("justify='right'") - console.print(text, style="blue", justify="right") - console.print() - - console.rule("justify='full'") - console.print(text, style="magenta", justify="full") - console.print() diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/theme.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/theme.py deleted file mode 100644 index 471dfb2f..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/theme.py +++ /dev/null @@ -1,115 +0,0 @@ -import configparser -from typing import Dict, List, IO, Mapping, Optional - -from .default_styles import DEFAULT_STYLES -from .style import Style, StyleType - - -class Theme: - """A container for style information, used by :class:`~rich.console.Console`. - - Args: - styles (Dict[str, Style], optional): A mapping of style names on to styles. Defaults to None for a theme with no styles. - inherit (bool, optional): Inherit default styles. Defaults to True. - """ - - styles: Dict[str, Style] - - def __init__( - self, styles: Optional[Mapping[str, StyleType]] = None, inherit: bool = True - ): - self.styles = DEFAULT_STYLES.copy() if inherit else {} - if styles is not None: - self.styles.update( - { - name: style if isinstance(style, Style) else Style.parse(style) - for name, style in styles.items() - } - ) - - @property - def config(self) -> str: - """Get contents of a config file for this theme.""" - config = "[styles]\n" + "\n".join( - f"{name} = {style}" for name, style in sorted(self.styles.items()) - ) - return config - - @classmethod - def from_file( - cls, config_file: IO[str], source: Optional[str] = None, inherit: bool = True - ) -> "Theme": - """Load a theme from a text mode file. - - Args: - config_file (IO[str]): An open conf file. - source (str, optional): The filename of the open file. Defaults to None. - inherit (bool, optional): Inherit default styles. Defaults to True. - - Returns: - Theme: A New theme instance. - """ - config = configparser.ConfigParser() - config.read_file(config_file, source=source) - styles = {name: Style.parse(value) for name, value in config.items("styles")} - theme = Theme(styles, inherit=inherit) - return theme - - @classmethod - def read( - cls, path: str, inherit: bool = True, encoding: Optional[str] = None - ) -> "Theme": - """Read a theme from a path. - - Args: - path (str): Path to a config file readable by Python configparser module. - inherit (bool, optional): Inherit default styles. Defaults to True. - encoding (str, optional): Encoding of the config file. Defaults to None. - - Returns: - Theme: A new theme instance. - """ - with open(path, "rt", encoding=encoding) as config_file: - return cls.from_file(config_file, source=path, inherit=inherit) - - -class ThemeStackError(Exception): - """Base exception for errors related to the theme stack.""" - - -class ThemeStack: - """A stack of themes. - - Args: - theme (Theme): A theme instance - """ - - def __init__(self, theme: Theme) -> None: - self._entries: List[Dict[str, Style]] = [theme.styles] - self.get = self._entries[-1].get - - def push_theme(self, theme: Theme, inherit: bool = True) -> None: - """Push a theme on the top of the stack. - - Args: - theme (Theme): A Theme instance. - inherit (boolean, optional): Inherit styles from current top of stack. - """ - styles: Dict[str, Style] - styles = ( - {**self._entries[-1], **theme.styles} if inherit else theme.styles.copy() - ) - self._entries.append(styles) - self.get = self._entries[-1].get - - def pop_theme(self) -> None: - """Pop (and discard) the top-most theme.""" - if len(self._entries) == 1: - raise ThemeStackError("Unable to pop base theme") - self._entries.pop() - self.get = self._entries[-1].get - - -if __name__ == "__main__": # pragma: no cover - theme = Theme() - print(theme.config) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/themes.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/themes.py deleted file mode 100644 index bf6db104..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/themes.py +++ /dev/null @@ -1,5 +0,0 @@ -from .default_styles import DEFAULT_STYLES -from .theme import Theme - - -DEFAULT = Theme(DEFAULT_STYLES) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/traceback.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/traceback.py deleted file mode 100644 index 341f7f41..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/traceback.py +++ /dev/null @@ -1,756 +0,0 @@ -from __future__ import absolute_import - -import linecache -import os -import platform -import sys -from dataclasses import dataclass, field -from traceback import walk_tb -from types import ModuleType, TracebackType -from typing import ( - Any, - Callable, - Dict, - Iterable, - List, - Optional, - Sequence, - Tuple, - Type, - Union, -) - -from pygments.lexers import guess_lexer_for_filename -from pygments.token import Comment, Keyword, Name, Number, Operator, String -from pygments.token import Text as TextToken -from pygments.token import Token -from pygments.util import ClassNotFound - -from . import pretty -from ._loop import loop_last -from .columns import Columns -from .console import Console, ConsoleOptions, ConsoleRenderable, RenderResult, group -from .constrain import Constrain -from .highlighter import RegexHighlighter, ReprHighlighter -from .panel import Panel -from .scope import render_scope -from .style import Style -from .syntax import Syntax -from .text import Text -from .theme import Theme - -WINDOWS = platform.system() == "Windows" - -LOCALS_MAX_LENGTH = 10 -LOCALS_MAX_STRING = 80 - - -def install( - *, - console: Optional[Console] = None, - width: Optional[int] = 100, - extra_lines: int = 3, - theme: Optional[str] = None, - word_wrap: bool = False, - show_locals: bool = False, - locals_max_length: int = LOCALS_MAX_LENGTH, - locals_max_string: int = LOCALS_MAX_STRING, - locals_hide_dunder: bool = True, - locals_hide_sunder: Optional[bool] = None, - indent_guides: bool = True, - suppress: Iterable[Union[str, ModuleType]] = (), - max_frames: int = 100, -) -> Callable[[Type[BaseException], BaseException, Optional[TracebackType]], Any]: - """Install a rich traceback handler. - - Once installed, any tracebacks will be printed with syntax highlighting and rich formatting. - - - Args: - console (Optional[Console], optional): Console to write exception to. Default uses internal Console instance. - width (Optional[int], optional): Width (in characters) of traceback. Defaults to 100. - extra_lines (int, optional): Extra lines of code. Defaults to 3. - theme (Optional[str], optional): Pygments theme to use in traceback. Defaults to ``None`` which will pick - a theme appropriate for the platform. - word_wrap (bool, optional): Enable word wrapping of long lines. Defaults to False. - show_locals (bool, optional): Enable display of local variables. Defaults to False. - locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. - Defaults to 10. - locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80. - locals_hide_dunder (bool, optional): Hide locals prefixed with double underscore. Defaults to True. - locals_hide_sunder (bool, optional): Hide locals prefixed with single underscore. Defaults to False. - indent_guides (bool, optional): Enable indent guides in code and locals. Defaults to True. - suppress (Sequence[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback. - - Returns: - Callable: The previous exception handler that was replaced. - - """ - traceback_console = Console(stderr=True) if console is None else console - - locals_hide_sunder = ( - True - if (traceback_console.is_jupyter and locals_hide_sunder is None) - else locals_hide_sunder - ) - - def excepthook( - type_: Type[BaseException], - value: BaseException, - traceback: Optional[TracebackType], - ) -> None: - traceback_console.print( - Traceback.from_exception( - type_, - value, - traceback, - width=width, - extra_lines=extra_lines, - theme=theme, - word_wrap=word_wrap, - show_locals=show_locals, - locals_max_length=locals_max_length, - locals_max_string=locals_max_string, - locals_hide_dunder=locals_hide_dunder, - locals_hide_sunder=bool(locals_hide_sunder), - indent_guides=indent_guides, - suppress=suppress, - max_frames=max_frames, - ) - ) - - def ipy_excepthook_closure(ip: Any) -> None: # pragma: no cover - tb_data = {} # store information about showtraceback call - default_showtraceback = ip.showtraceback # keep reference of default traceback - - def ipy_show_traceback(*args: Any, **kwargs: Any) -> None: - """wrap the default ip.showtraceback to store info for ip._showtraceback""" - nonlocal tb_data - tb_data = kwargs - default_showtraceback(*args, **kwargs) - - def ipy_display_traceback( - *args: Any, is_syntax: bool = False, **kwargs: Any - ) -> None: - """Internally called traceback from ip._showtraceback""" - nonlocal tb_data - exc_tuple = ip._get_exc_info() - - # do not display trace on syntax error - tb: Optional[TracebackType] = None if is_syntax else exc_tuple[2] - - # determine correct tb_offset - compiled = tb_data.get("running_compiled_code", False) - tb_offset = tb_data.get("tb_offset", 1 if compiled else 0) - # remove ipython internal frames from trace with tb_offset - for _ in range(tb_offset): - if tb is None: - break - tb = tb.tb_next - - excepthook(exc_tuple[0], exc_tuple[1], tb) - tb_data = {} # clear data upon usage - - # replace _showtraceback instead of showtraceback to allow ipython features such as debugging to work - # this is also what the ipython docs recommends to modify when subclassing InteractiveShell - ip._showtraceback = ipy_display_traceback - # add wrapper to capture tb_data - ip.showtraceback = ipy_show_traceback - ip.showsyntaxerror = lambda *args, **kwargs: ipy_display_traceback( - *args, is_syntax=True, **kwargs - ) - - try: # pragma: no cover - # if within ipython, use customized traceback - ip = get_ipython() # type: ignore[name-defined] - ipy_excepthook_closure(ip) - return sys.excepthook - except Exception: - # otherwise use default system hook - old_excepthook = sys.excepthook - sys.excepthook = excepthook - return old_excepthook - - -@dataclass -class Frame: - filename: str - lineno: int - name: str - line: str = "" - locals: Optional[Dict[str, pretty.Node]] = None - - -@dataclass -class _SyntaxError: - offset: int - filename: str - line: str - lineno: int - msg: str - - -@dataclass -class Stack: - exc_type: str - exc_value: str - syntax_error: Optional[_SyntaxError] = None - is_cause: bool = False - frames: List[Frame] = field(default_factory=list) - - -@dataclass -class Trace: - stacks: List[Stack] - - -class PathHighlighter(RegexHighlighter): - highlights = [r"(?P<dim>.*/)(?P<bold>.+)"] - - -class Traceback: - """A Console renderable that renders a traceback. - - Args: - trace (Trace, optional): A `Trace` object produced from `extract`. Defaults to None, which uses - the last exception. - width (Optional[int], optional): Number of characters used to traceback. Defaults to 100. - extra_lines (int, optional): Additional lines of code to render. Defaults to 3. - theme (str, optional): Override pygments theme used in traceback. - word_wrap (bool, optional): Enable word wrapping of long lines. Defaults to False. - show_locals (bool, optional): Enable display of local variables. Defaults to False. - indent_guides (bool, optional): Enable indent guides in code and locals. Defaults to True. - locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. - Defaults to 10. - locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80. - locals_hide_dunder (bool, optional): Hide locals prefixed with double underscore. Defaults to True. - locals_hide_sunder (bool, optional): Hide locals prefixed with single underscore. Defaults to False. - suppress (Sequence[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback. - max_frames (int): Maximum number of frames to show in a traceback, 0 for no maximum. Defaults to 100. - - """ - - LEXERS = { - "": "text", - ".py": "python", - ".pxd": "cython", - ".pyx": "cython", - ".pxi": "pyrex", - } - - def __init__( - self, - trace: Optional[Trace] = None, - *, - width: Optional[int] = 100, - extra_lines: int = 3, - theme: Optional[str] = None, - word_wrap: bool = False, - show_locals: bool = False, - locals_max_length: int = LOCALS_MAX_LENGTH, - locals_max_string: int = LOCALS_MAX_STRING, - locals_hide_dunder: bool = True, - locals_hide_sunder: bool = False, - indent_guides: bool = True, - suppress: Iterable[Union[str, ModuleType]] = (), - max_frames: int = 100, - ): - if trace is None: - exc_type, exc_value, traceback = sys.exc_info() - if exc_type is None or exc_value is None or traceback is None: - raise ValueError( - "Value for 'trace' required if not called in except: block" - ) - trace = self.extract( - exc_type, exc_value, traceback, show_locals=show_locals - ) - self.trace = trace - self.width = width - self.extra_lines = extra_lines - self.theme = Syntax.get_theme(theme or "ansi_dark") - self.word_wrap = word_wrap - self.show_locals = show_locals - self.indent_guides = indent_guides - self.locals_max_length = locals_max_length - self.locals_max_string = locals_max_string - self.locals_hide_dunder = locals_hide_dunder - self.locals_hide_sunder = locals_hide_sunder - - self.suppress: Sequence[str] = [] - for suppress_entity in suppress: - if not isinstance(suppress_entity, str): - assert ( - suppress_entity.__file__ is not None - ), f"{suppress_entity!r} must be a module with '__file__' attribute" - path = os.path.dirname(suppress_entity.__file__) - else: - path = suppress_entity - path = os.path.normpath(os.path.abspath(path)) - self.suppress.append(path) - self.max_frames = max(4, max_frames) if max_frames > 0 else 0 - - @classmethod - def from_exception( - cls, - exc_type: Type[Any], - exc_value: BaseException, - traceback: Optional[TracebackType], - *, - width: Optional[int] = 100, - extra_lines: int = 3, - theme: Optional[str] = None, - word_wrap: bool = False, - show_locals: bool = False, - locals_max_length: int = LOCALS_MAX_LENGTH, - locals_max_string: int = LOCALS_MAX_STRING, - locals_hide_dunder: bool = True, - locals_hide_sunder: bool = False, - indent_guides: bool = True, - suppress: Iterable[Union[str, ModuleType]] = (), - max_frames: int = 100, - ) -> "Traceback": - """Create a traceback from exception info - - Args: - exc_type (Type[BaseException]): Exception type. - exc_value (BaseException): Exception value. - traceback (TracebackType): Python Traceback object. - width (Optional[int], optional): Number of characters used to traceback. Defaults to 100. - extra_lines (int, optional): Additional lines of code to render. Defaults to 3. - theme (str, optional): Override pygments theme used in traceback. - word_wrap (bool, optional): Enable word wrapping of long lines. Defaults to False. - show_locals (bool, optional): Enable display of local variables. Defaults to False. - indent_guides (bool, optional): Enable indent guides in code and locals. Defaults to True. - locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. - Defaults to 10. - locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80. - locals_hide_dunder (bool, optional): Hide locals prefixed with double underscore. Defaults to True. - locals_hide_sunder (bool, optional): Hide locals prefixed with single underscore. Defaults to False. - suppress (Iterable[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback. - max_frames (int): Maximum number of frames to show in a traceback, 0 for no maximum. Defaults to 100. - - Returns: - Traceback: A Traceback instance that may be printed. - """ - rich_traceback = cls.extract( - exc_type, - exc_value, - traceback, - show_locals=show_locals, - locals_max_length=locals_max_length, - locals_max_string=locals_max_string, - locals_hide_dunder=locals_hide_dunder, - locals_hide_sunder=locals_hide_sunder, - ) - - return cls( - rich_traceback, - width=width, - extra_lines=extra_lines, - theme=theme, - word_wrap=word_wrap, - show_locals=show_locals, - indent_guides=indent_guides, - locals_max_length=locals_max_length, - locals_max_string=locals_max_string, - locals_hide_dunder=locals_hide_dunder, - locals_hide_sunder=locals_hide_sunder, - suppress=suppress, - max_frames=max_frames, - ) - - @classmethod - def extract( - cls, - exc_type: Type[BaseException], - exc_value: BaseException, - traceback: Optional[TracebackType], - *, - show_locals: bool = False, - locals_max_length: int = LOCALS_MAX_LENGTH, - locals_max_string: int = LOCALS_MAX_STRING, - locals_hide_dunder: bool = True, - locals_hide_sunder: bool = False, - ) -> Trace: - """Extract traceback information. - - Args: - exc_type (Type[BaseException]): Exception type. - exc_value (BaseException): Exception value. - traceback (TracebackType): Python Traceback object. - show_locals (bool, optional): Enable display of local variables. Defaults to False. - locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation. - Defaults to 10. - locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80. - locals_hide_dunder (bool, optional): Hide locals prefixed with double underscore. Defaults to True. - locals_hide_sunder (bool, optional): Hide locals prefixed with single underscore. Defaults to False. - - Returns: - Trace: A Trace instance which you can use to construct a `Traceback`. - """ - - stacks: List[Stack] = [] - is_cause = False - - from rich import _IMPORT_CWD - - def safe_str(_object: Any) -> str: - """Don't allow exceptions from __str__ to propagate.""" - try: - return str(_object) - except Exception: - return "<exception str() failed>" - - while True: - stack = Stack( - exc_type=safe_str(exc_type.__name__), - exc_value=safe_str(exc_value), - is_cause=is_cause, - ) - - if isinstance(exc_value, SyntaxError): - stack.syntax_error = _SyntaxError( - offset=exc_value.offset or 0, - filename=exc_value.filename or "?", - lineno=exc_value.lineno or 0, - line=exc_value.text or "", - msg=exc_value.msg, - ) - - stacks.append(stack) - append = stack.frames.append - - def get_locals( - iter_locals: Iterable[Tuple[str, object]] - ) -> Iterable[Tuple[str, object]]: - """Extract locals from an iterator of key pairs.""" - if not (locals_hide_dunder or locals_hide_sunder): - yield from iter_locals - return - for key, value in iter_locals: - if locals_hide_dunder and key.startswith("__"): - continue - if locals_hide_sunder and key.startswith("_"): - continue - yield key, value - - for frame_summary, line_no in walk_tb(traceback): - filename = frame_summary.f_code.co_filename - if filename and not filename.startswith("<"): - if not os.path.isabs(filename): - filename = os.path.join(_IMPORT_CWD, filename) - if frame_summary.f_locals.get("_rich_traceback_omit", False): - continue - - frame = Frame( - filename=filename or "?", - lineno=line_no, - name=frame_summary.f_code.co_name, - locals={ - key: pretty.traverse( - value, - max_length=locals_max_length, - max_string=locals_max_string, - ) - for key, value in get_locals(frame_summary.f_locals.items()) - } - if show_locals - else None, - ) - append(frame) - if frame_summary.f_locals.get("_rich_traceback_guard", False): - del stack.frames[:] - - cause = getattr(exc_value, "__cause__", None) - if cause: - exc_type = cause.__class__ - exc_value = cause - # __traceback__ can be None, e.g. for exceptions raised by the - # 'multiprocessing' module - traceback = cause.__traceback__ - is_cause = True - continue - - cause = exc_value.__context__ - if cause and not getattr(exc_value, "__suppress_context__", False): - exc_type = cause.__class__ - exc_value = cause - traceback = cause.__traceback__ - is_cause = False - continue - # No cover, code is reached but coverage doesn't recognize it. - break # pragma: no cover - - trace = Trace(stacks=stacks) - return trace - - def __rich_console__( - self, console: Console, options: ConsoleOptions - ) -> RenderResult: - theme = self.theme - background_style = theme.get_background_style() - token_style = theme.get_style_for_token - - traceback_theme = Theme( - { - "pretty": token_style(TextToken), - "pygments.text": token_style(Token), - "pygments.string": token_style(String), - "pygments.function": token_style(Name.Function), - "pygments.number": token_style(Number), - "repr.indent": token_style(Comment) + Style(dim=True), - "repr.str": token_style(String), - "repr.brace": token_style(TextToken) + Style(bold=True), - "repr.number": token_style(Number), - "repr.bool_true": token_style(Keyword.Constant), - "repr.bool_false": token_style(Keyword.Constant), - "repr.none": token_style(Keyword.Constant), - "scope.border": token_style(String.Delimiter), - "scope.equals": token_style(Operator), - "scope.key": token_style(Name), - "scope.key.special": token_style(Name.Constant) + Style(dim=True), - }, - inherit=False, - ) - - highlighter = ReprHighlighter() - for last, stack in loop_last(reversed(self.trace.stacks)): - if stack.frames: - stack_renderable: ConsoleRenderable = Panel( - self._render_stack(stack), - title="[traceback.title]Traceback [dim](most recent call last)", - style=background_style, - border_style="traceback.border", - expand=True, - padding=(0, 1), - ) - stack_renderable = Constrain(stack_renderable, self.width) - with console.use_theme(traceback_theme): - yield stack_renderable - if stack.syntax_error is not None: - with console.use_theme(traceback_theme): - yield Constrain( - Panel( - self._render_syntax_error(stack.syntax_error), - style=background_style, - border_style="traceback.border.syntax_error", - expand=True, - padding=(0, 1), - width=self.width, - ), - self.width, - ) - yield Text.assemble( - (f"{stack.exc_type}: ", "traceback.exc_type"), - highlighter(stack.syntax_error.msg), - ) - elif stack.exc_value: - yield Text.assemble( - (f"{stack.exc_type}: ", "traceback.exc_type"), - highlighter(stack.exc_value), - ) - else: - yield Text.assemble((f"{stack.exc_type}", "traceback.exc_type")) - - if not last: - if stack.is_cause: - yield Text.from_markup( - "\n[i]The above exception was the direct cause of the following exception:\n", - ) - else: - yield Text.from_markup( - "\n[i]During handling of the above exception, another exception occurred:\n", - ) - - @group() - def _render_syntax_error(self, syntax_error: _SyntaxError) -> RenderResult: - highlighter = ReprHighlighter() - path_highlighter = PathHighlighter() - if syntax_error.filename != "<stdin>": - if os.path.exists(syntax_error.filename): - text = Text.assemble( - (f" {syntax_error.filename}", "pygments.string"), - (":", "pygments.text"), - (str(syntax_error.lineno), "pygments.number"), - style="pygments.text", - ) - yield path_highlighter(text) - syntax_error_text = highlighter(syntax_error.line.rstrip()) - syntax_error_text.no_wrap = True - offset = min(syntax_error.offset - 1, len(syntax_error_text)) - syntax_error_text.stylize("bold underline", offset, offset) - syntax_error_text += Text.from_markup( - "\n" + " " * offset + "[traceback.offset]▲[/]", - style="pygments.text", - ) - yield syntax_error_text - - @classmethod - def _guess_lexer(cls, filename: str, code: str) -> str: - ext = os.path.splitext(filename)[-1] - if not ext: - # No extension, look at first line to see if it is a hashbang - # Note, this is an educated guess and not a guarantee - # If it fails, the only downside is that the code is highlighted strangely - new_line_index = code.index("\n") - first_line = code[:new_line_index] if new_line_index != -1 else code - if first_line.startswith("#!") and "python" in first_line.lower(): - return "python" - try: - return cls.LEXERS.get(ext) or guess_lexer_for_filename(filename, code).name - except ClassNotFound: - return "text" - - @group() - def _render_stack(self, stack: Stack) -> RenderResult: - path_highlighter = PathHighlighter() - theme = self.theme - - def read_code(filename: str) -> str: - """Read files, and cache results on filename. - - Args: - filename (str): Filename to read - - Returns: - str: Contents of file - """ - return "".join(linecache.getlines(filename)) - - def render_locals(frame: Frame) -> Iterable[ConsoleRenderable]: - if frame.locals: - yield render_scope( - frame.locals, - title="locals", - indent_guides=self.indent_guides, - max_length=self.locals_max_length, - max_string=self.locals_max_string, - ) - - exclude_frames: Optional[range] = None - if self.max_frames != 0: - exclude_frames = range( - self.max_frames // 2, - len(stack.frames) - self.max_frames // 2, - ) - - excluded = False - for frame_index, frame in enumerate(stack.frames): - - if exclude_frames and frame_index in exclude_frames: - excluded = True - continue - - if excluded: - assert exclude_frames is not None - yield Text( - f"\n... {len(exclude_frames)} frames hidden ...", - justify="center", - style="traceback.error", - ) - excluded = False - - first = frame_index == 0 - frame_filename = frame.filename - suppressed = any(frame_filename.startswith(path) for path in self.suppress) - - if os.path.exists(frame.filename): - text = Text.assemble( - path_highlighter(Text(frame.filename, style="pygments.string")), - (":", "pygments.text"), - (str(frame.lineno), "pygments.number"), - " in ", - (frame.name, "pygments.function"), - style="pygments.text", - ) - else: - text = Text.assemble( - "in ", - (frame.name, "pygments.function"), - (":", "pygments.text"), - (str(frame.lineno), "pygments.number"), - style="pygments.text", - ) - if not frame.filename.startswith("<") and not first: - yield "" - yield text - if frame.filename.startswith("<"): - yield from render_locals(frame) - continue - if not suppressed: - try: - code = read_code(frame.filename) - if not code: - # code may be an empty string if the file doesn't exist, OR - # if the traceback filename is generated dynamically - continue - lexer_name = self._guess_lexer(frame.filename, code) - syntax = Syntax( - code, - lexer_name, - theme=theme, - line_numbers=True, - line_range=( - frame.lineno - self.extra_lines, - frame.lineno + self.extra_lines, - ), - highlight_lines={frame.lineno}, - word_wrap=self.word_wrap, - code_width=88, - indent_guides=self.indent_guides, - dedent=False, - ) - yield "" - except Exception as error: - yield Text.assemble( - (f"\n{error}", "traceback.error"), - ) - else: - yield ( - Columns( - [ - syntax, - *render_locals(frame), - ], - padding=1, - ) - if frame.locals - else syntax - ) - - -if __name__ == "__main__": # pragma: no cover - - from .console import Console - - console = Console() - import sys - - def bar(a: Any) -> None: # 这是对亚洲语言支持的测试。面对模棱两可的想法,拒绝猜测的诱惑 - one = 1 - print(one / a) - - def foo(a: Any) -> None: - _rich_traceback_guard = True - zed = { - "characters": { - "Paul Atreides", - "Vladimir Harkonnen", - "Thufir Hawat", - "Duncan Idaho", - }, - "atomic_types": (None, False, True), - } - bar(a) - - def error() -> None: - - try: - try: - foo(0) - except: - slfkjsldkfj # type: ignore[name-defined] - except: - console.print_exception(show_locals=True) - - error() diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/tree.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/tree.py deleted file mode 100644 index b9b7bbe5..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/rich/tree.py +++ /dev/null @@ -1,251 +0,0 @@ -from typing import Iterator, List, Optional, Tuple - -from ._loop import loop_first, loop_last -from .console import Console, ConsoleOptions, RenderableType, RenderResult -from .jupyter import JupyterMixin -from .measure import Measurement -from .segment import Segment -from .style import Style, StyleStack, StyleType -from .styled import Styled - - -class Tree(JupyterMixin): - """A renderable for a tree structure. - - Args: - label (RenderableType): The renderable or str for the tree label. - style (StyleType, optional): Style of this tree. Defaults to "tree". - guide_style (StyleType, optional): Style of the guide lines. Defaults to "tree.line". - expanded (bool, optional): Also display children. Defaults to True. - highlight (bool, optional): Highlight renderable (if str). Defaults to False. - """ - - def __init__( - self, - label: RenderableType, - *, - style: StyleType = "tree", - guide_style: StyleType = "tree.line", - expanded: bool = True, - highlight: bool = False, - hide_root: bool = False, - ) -> None: - self.label = label - self.style = style - self.guide_style = guide_style - self.children: List[Tree] = [] - self.expanded = expanded - self.highlight = highlight - self.hide_root = hide_root - - def add( - self, - label: RenderableType, - *, - style: Optional[StyleType] = None, - guide_style: Optional[StyleType] = None, - expanded: bool = True, - highlight: Optional[bool] = False, - ) -> "Tree": - """Add a child tree. - - Args: - label (RenderableType): The renderable or str for the tree label. - style (StyleType, optional): Style of this tree. Defaults to "tree". - guide_style (StyleType, optional): Style of the guide lines. Defaults to "tree.line". - expanded (bool, optional): Also display children. Defaults to True. - highlight (Optional[bool], optional): Highlight renderable (if str). Defaults to False. - - Returns: - Tree: A new child Tree, which may be further modified. - """ - node = Tree( - label, - style=self.style if style is None else style, - guide_style=self.guide_style if guide_style is None else guide_style, - expanded=expanded, - highlight=self.highlight if highlight is None else highlight, - ) - self.children.append(node) - return node - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - - stack: List[Iterator[Tuple[bool, Tree]]] = [] - pop = stack.pop - push = stack.append - new_line = Segment.line() - - get_style = console.get_style - null_style = Style.null() - guide_style = get_style(self.guide_style, default="") or null_style - SPACE, CONTINUE, FORK, END = range(4) - - ASCII_GUIDES = (" ", "| ", "+-- ", "`-- ") - TREE_GUIDES = [ - (" ", "│ ", "├── ", "└── "), - (" ", "┃ ", "┣━━ ", "┗━━ "), - (" ", "║ ", "╠══ ", "╚══ "), - ] - _Segment = Segment - - def make_guide(index: int, style: Style) -> Segment: - """Make a Segment for a level of the guide lines.""" - if options.ascii_only: - line = ASCII_GUIDES[index] - else: - guide = 1 if style.bold else (2 if style.underline2 else 0) - line = TREE_GUIDES[0 if options.legacy_windows else guide][index] - return _Segment(line, style) - - levels: List[Segment] = [make_guide(CONTINUE, guide_style)] - push(iter(loop_last([self]))) - - guide_style_stack = StyleStack(get_style(self.guide_style)) - style_stack = StyleStack(get_style(self.style)) - remove_guide_styles = Style(bold=False, underline2=False) - - depth = 0 - - while stack: - stack_node = pop() - try: - last, node = next(stack_node) - except StopIteration: - levels.pop() - if levels: - guide_style = levels[-1].style or null_style - levels[-1] = make_guide(FORK, guide_style) - guide_style_stack.pop() - style_stack.pop() - continue - push(stack_node) - if last: - levels[-1] = make_guide(END, levels[-1].style or null_style) - - guide_style = guide_style_stack.current + get_style(node.guide_style) - style = style_stack.current + get_style(node.style) - prefix = levels[(2 if self.hide_root else 1) :] - renderable_lines = console.render_lines( - Styled(node.label, style), - options.update( - width=options.max_width - - sum(level.cell_length for level in prefix), - highlight=self.highlight, - height=None, - ), - pad=options.justify is not None, - ) - - if not (depth == 0 and self.hide_root): - for first, line in loop_first(renderable_lines): - if prefix: - yield from _Segment.apply_style( - prefix, - style.background_style, - post_style=remove_guide_styles, - ) - yield from line - yield new_line - if first and prefix: - prefix[-1] = make_guide( - SPACE if last else CONTINUE, prefix[-1].style or null_style - ) - - if node.expanded and node.children: - levels[-1] = make_guide( - SPACE if last else CONTINUE, levels[-1].style or null_style - ) - levels.append( - make_guide(END if len(node.children) == 1 else FORK, guide_style) - ) - style_stack.push(get_style(node.style)) - guide_style_stack.push(get_style(node.guide_style)) - push(iter(loop_last(node.children))) - depth += 1 - - def __rich_measure__( - self, console: "Console", options: "ConsoleOptions" - ) -> "Measurement": - stack: List[Iterator[Tree]] = [iter([self])] - pop = stack.pop - push = stack.append - minimum = 0 - maximum = 0 - measure = Measurement.get - level = 0 - while stack: - iter_tree = pop() - try: - tree = next(iter_tree) - except StopIteration: - level -= 1 - continue - push(iter_tree) - min_measure, max_measure = measure(console, options, tree.label) - indent = level * 4 - minimum = max(min_measure + indent, minimum) - maximum = max(max_measure + indent, maximum) - if tree.expanded and tree.children: - push(iter(tree.children)) - level += 1 - return Measurement(minimum, maximum) - - -if __name__ == "__main__": # pragma: no cover - - from rich.console import Group - from rich.markdown import Markdown - from rich.panel import Panel - from rich.syntax import Syntax - from rich.table import Table - - table = Table(row_styles=["", "dim"]) - - table.add_column("Released", style="cyan", no_wrap=True) - table.add_column("Title", style="magenta") - table.add_column("Box Office", justify="right", style="green") - - table.add_row("Dec 20, 2019", "Star Wars: The Rise of Skywalker", "$952,110,690") - table.add_row("May 25, 2018", "Solo: A Star Wars Story", "$393,151,347") - table.add_row("Dec 15, 2017", "Star Wars Ep. V111: The Last Jedi", "$1,332,539,889") - table.add_row("Dec 16, 2016", "Rogue One: A Star Wars Story", "$1,332,439,889") - - code = """\ -class Segment(NamedTuple): - text: str = "" - style: Optional[Style] = None - is_control: bool = False -""" - syntax = Syntax(code, "python", theme="monokai", line_numbers=True) - - markdown = Markdown( - """\ -### example.md -> Hello, World! -> -> Markdown _all_ the things -""" - ) - - root = Tree("🌲 [b green]Rich Tree", highlight=True, hide_root=True) - - node = root.add(":file_folder: Renderables", guide_style="red") - simple_node = node.add(":file_folder: [bold yellow]Atomic", guide_style="uu green") - simple_node.add(Group("📄 Syntax", syntax)) - simple_node.add(Group("📄 Markdown", Panel(markdown, border_style="green"))) - - containers_node = node.add( - ":file_folder: [bold magenta]Containers", guide_style="bold magenta" - ) - containers_node.expanded = True - panel = Panel.fit("Just a panel", border_style="red") - containers_node.add(Group("📄 Panels", panel)) - - containers_node.add(Group("📄 [b magenta]Table", table)) - - console = Console() - - console.print(root) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder-6.2.0.dist-info/INSTALLER b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder-6.2.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e3..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder-6.2.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder-6.2.0.dist-info/LICENSE b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder-6.2.0.dist-info/LICENSE deleted file mode 100755 index 296ba37d..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder-6.2.0.dist-info/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016 Jannik Michelfeit - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder-6.2.0.dist-info/METADATA b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder-6.2.0.dist-info/METADATA deleted file mode 100644 index 90072a09..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder-6.2.0.dist-info/METADATA +++ /dev/null @@ -1,108 +0,0 @@ -Metadata-Version: 2.1 -Name: timezonefinder -Version: 6.2.0 -Summary: fast python package for finding the timezone of any point on earth (coordinates) offline -Home-page: https://timezonefinder.michelfe.it/gui -License: MIT -Keywords: timezone,coordinates,latitude,longitude,location,offline,polygon -Author: jannikmi -Author-email: github@michelfe.it -Requires-Python: >=3.8,<4 -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: Intended Audience :: Information Technology -Classifier: License :: OSI Approved :: MIT License -Classifier: Natural Language :: English -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Topic :: Software Development :: Localization -Provides-Extra: numba -Provides-Extra: pytz -Requires-Dist: cffi (>=1.15.1,<2) -Requires-Dist: h3 (>=3.7.6,<4) -Requires-Dist: numba (>=0.56,<1) ; extra == "numba" -Requires-Dist: numpy (>=1.18,<2) -Requires-Dist: pytz (>=2022.7.1) ; extra == "pytz" -Requires-Dist: setuptools (>=65.5) -Project-URL: Documentation, https://timezonefinder.readthedocs.io/en/latest/ -Project-URL: Repository, https://github.com/jannikmi/timezonefinder -Description-Content-Type: text/x-rst - -============== -timezonefinder -============== - - -.. - Note: can't include the badges file from the docs here, as it won't render on PyPI -> sync manually - -.. image:: https://github.com/jannikmi/timezonefinder/actions/workflows/build.yml/badge.svg?branch=master - :target: https://github.com/jannikmi/timezonefinder/actions?query=branch%3Amaster - -.. image:: https://readthedocs.org/projects/timezonefinder/badge/?version=latest - :alt: documentation status - :target: https://timezonefinder.readthedocs.io/en/latest/?badge=latest - -.. image:: https://img.shields.io/pypi/wheel/timezonefinder.svg - :target: https://pypi.python.org/pypi/timezonefinder - -.. image:: https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white - :target: https://github.com/pre-commit/pre-commit - :alt: pre-commit - -.. image:: https://pepy.tech/badge/timezonefinder - :alt: total PyPI downloads - :target: https://pepy.tech/project/timezonefinder - -.. image:: https://img.shields.io/pypi/v/timezonefinder.svg - :alt: latest version on PyPI - :target: https://pypi.python.org/pypi/timezonefinder - -.. image:: https://img.shields.io/conda/vn/conda-forge/timezonefinder.svg - :target: https://anaconda.org/conda-forge/timezonefinder - :alt: latest version on conda-forge - -.. image:: https://img.shields.io/badge/code%20style-black-000000.svg - :target: https://github.com/psf/black - - - -This is a python package for looking up the corresponding timezone for given coordinates on earth entirely offline. - - -Quick Guide: - -.. code-block:: console - - pip install timezonefinder - - -.. code-block:: python - - from timezonefinder import TimezoneFinder - - tf = TimezoneFinder() # reuse - - query_points = [(13.358, 52.5061), ...] - for lng, lat in query_points: - tz = tf.timezone_at(lng=lng, lat=lat) # 'Europe/Berlin' - - -For more refer to the `Documentation <https://timezonefinder.readthedocs.io/en/latest/>`__. - -Also check: - -`PyPI <https://pypi.python.org/pypi/timezonefinder/>`__ - -`online GUI and API <https://timezonefinder.michelfe.it>`__ - -`conda-forge feedstock <https://github.com/conda-forge/timezonefinder-feedstock>`__ - -ruby port: `timezone_finder <https://github.com/gunyarakun/timezone_finder>`__ - -`download stats <https://pepy.tech/project/timezonefinder>`__ - diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder-6.2.0.dist-info/RECORD b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder-6.2.0.dist-info/RECORD deleted file mode 100644 index bd105a85..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder-6.2.0.dist-info/RECORD +++ /dev/null @@ -1,39 +0,0 @@ -../../../bin/timezonefinder,sha256=4qBkfk8sAKcm1iuFfrtMnlMUipBW2NO2UYO-YrhPZao,225 -timezonefinder-6.2.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -timezonefinder-6.2.0.dist-info/LICENSE,sha256=ln3_OlAWgGLeQAoFIbTwBbSBslJW3n0h89AAFkjXNeU,1084 -timezonefinder-6.2.0.dist-info/METADATA,sha256=cp6ogZ7UpdMGrq9HPMRXeWhOgYJG7Vvx25ENaqXmn6E,3740 -timezonefinder-6.2.0.dist-info/RECORD,, -timezonefinder-6.2.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -timezonefinder-6.2.0.dist-info/WHEEL,sha256=Ggj0fLZgB8T39FttQfxsvhk_5uZkqtSwLlvaw_6TAgo,110 -timezonefinder-6.2.0.dist-info/entry_points.txt,sha256=XJmD7blifNI26U2U5SbLvCARiwBGx8Z2pxf8Ox0vpGQ,67 -timezonefinder/__init__.py,sha256=TARoqnWpq4fKi3KaBnj_1cAIsgwsPrLp79AJgKGM-bU,258 -timezonefinder/__pycache__/__init__.cpython-311.pyc,, -timezonefinder/__pycache__/_numba_replacements.cpython-311.pyc,, -timezonefinder/__pycache__/command_line.cpython-311.pyc,, -timezonefinder/__pycache__/configs.cpython-311.pyc,, -timezonefinder/__pycache__/hex_helpers.cpython-311.pyc,, -timezonefinder/__pycache__/path_modification.cpython-311.pyc,, -timezonefinder/__pycache__/timezonefinder.cpython-311.pyc,, -timezonefinder/__pycache__/utils.cpython-311.pyc,, -timezonefinder/_numba_replacements.py,sha256=kCnz3uJ-ryiZKssLjtCyV1y3ovuEoLV_QrgMDzI6eMY,698 -timezonefinder/command_line.py,sha256=ARJgvh2f1I67C8I-uDLPS0pBxUyumNfH1rpVT_-fxwI,2135 -timezonefinder/configs.py,sha256=Kt9ymaN8axtu_OZ8wsBybVVVLqotsNVHN-qSfmTYckA,3142 -timezonefinder/hex_helpers.py,sha256=gmeNFu5XjMSFkR5PkMlDks8ZXF3ftPGgt5VBhGFWQbY,2005 -timezonefinder/hole_adr2data.bin,sha256=Dub52Y0LLsn2867t-st9CBjb_6ghCBE5PcZMd9HV6yY,2856 -timezonefinder/hole_coord_amount.bin,sha256=plV8xvxYF5qSk22PZZ-5AiGJZw4MDRzTvXgBrHC0nuA,1426 -timezonefinder/hole_data.bin,sha256=yQEcIQS0PoSkGx54vZiSG0WDcIir9Irv7M0S0o74D64,1960904 -timezonefinder/hole_registry.json,sha256=VkIDPQJ7u3M32elZ0XVg7wj5UKxCE_JYJVdraRMI47w,2941 -timezonefinder/inside_poly_extension/inside_polygon_int.c,sha256=mwCgNjFEB6ghQr77dG0xWy8eYl8JLuYTvfS7hpYGNQ0,2363 -timezonefinder/inside_poly_extension/inside_polygon_int.h,sha256=iaqWb9jbl3V_FkvWKp3BenUq9QCWPjZkXdPVjWbe5J4,132 -timezonefinder/path_modification.py,sha256=NPVhXYSsQyPSoPjctKugh5syjLZxGc-jBnBeDN45Oc4,204 -timezonefinder/poly_adr2data.bin,sha256=OanpdG3EdOiMvpx2KhakQ6kPI8XC_oPp-sUaGvAlRus,5108 -timezonefinder/poly_bounds.bin,sha256=c0buVk_aN8FdXZ4wQaT3GzrypnbEj6sm_o9Snv-luwM,20416 -timezonefinder/poly_coord_amount.bin,sha256=oINjrve966E9ZC53geMlYK6S5dMmNuoLOmWjl3BrMEY,5104 -timezonefinder/poly_data.bin,sha256=2vNKxsH27YFo8kYuSxSHxtlwAeXOtmG_bTlj2I6Auek,55148784 -timezonefinder/poly_nr2zone_id.bin,sha256=2Mx_MtEL5vHMrh6OiTIrDl4dge9OecOw0ZyOrzJwPYU,890 -timezonefinder/poly_zone_ids.bin,sha256=29wwZWunzqzuw8X-6bUEwmJxKhUTV1yVPp4YlkE55Bo,2552 -timezonefinder/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -timezonefinder/shortcuts.bin,sha256=ClZ5ltuYsr3-OH5um58e6InrSB0No8iu-ZQyKOj13ag,478356 -timezonefinder/timezone_names.json,sha256=N77JH9HNALJDV5OTYPIDGlsN1_rCQ-Wv4bB2KM2MMlQ,9370 -timezonefinder/timezonefinder.py,sha256=quTfBlaVAedZvmJlY3xVtBMiFIDWaYMDX9mjFuJm2KU,21139 -timezonefinder/utils.py,sha256=ZKuKQxTCq-CNwp99v86Qmcf6TyDUutYTOzJnm89M8B4,9482 diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder-6.2.0.dist-info/REQUESTED b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder-6.2.0.dist-info/REQUESTED deleted file mode 100644 index e69de29b..00000000 diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder-6.2.0.dist-info/WHEEL b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder-6.2.0.dist-info/WHEEL deleted file mode 100644 index caae6c3d..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder-6.2.0.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: poetry-core 1.6.0 -Root-Is-Purelib: false -Tag: cp311-cp311-manylinux_2_36_x86_64 diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder-6.2.0.dist-info/entry_points.txt b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder-6.2.0.dist-info/entry_points.txt deleted file mode 100644 index 16cda8b8..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder-6.2.0.dist-info/entry_points.txt +++ /dev/null @@ -1,3 +0,0 @@ -[console_scripts] -timezonefinder=timezonefinder.command_line:main - diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/__init__.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/__init__.py deleted file mode 100755 index 3a01df58..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from timezonefinder.timezonefinder import TimezoneFinder, TimezoneFinderL - -# https://docs.python.org/3/tutorial/modules.html#importing-from-a-package -# determines which objects will be imported with "import *" -__all__ = ("TimezoneFinder", "TimezoneFinderL") diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/__pycache__/__init__.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 38277f53..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/__pycache__/__init__.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/__pycache__/_numba_replacements.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/__pycache__/_numba_replacements.cpython-311.pyc deleted file mode 100644 index 4b1d3094..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/__pycache__/_numba_replacements.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/__pycache__/command_line.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/__pycache__/command_line.cpython-311.pyc deleted file mode 100644 index 26b9a3b0..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/__pycache__/command_line.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/__pycache__/configs.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/__pycache__/configs.cpython-311.pyc deleted file mode 100644 index 72c0843b..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/__pycache__/configs.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/__pycache__/hex_helpers.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/__pycache__/hex_helpers.cpython-311.pyc deleted file mode 100644 index df50de33..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/__pycache__/hex_helpers.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/__pycache__/path_modification.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/__pycache__/path_modification.cpython-311.pyc deleted file mode 100644 index 1a625874..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/__pycache__/path_modification.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/__pycache__/timezonefinder.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/__pycache__/timezonefinder.cpython-311.pyc deleted file mode 100644 index e13a6a9d..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/__pycache__/timezonefinder.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/__pycache__/utils.cpython-311.pyc b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/__pycache__/utils.cpython-311.pyc deleted file mode 100644 index 69cc12ff..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/__pycache__/utils.cpython-311.pyc and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/_numba_replacements.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/_numba_replacements.py deleted file mode 100644 index a561e9ae..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/_numba_replacements.py +++ /dev/null @@ -1,48 +0,0 @@ -""" 'transparent' numba functionality replacements - -njit decorator -data types - -dtype_2int_tuple = typeof((1, 1)) -@njit(b1(i4, i4, i4[:, :]), cache=True) -@njit(dtype_2int_tuple(f8, f8), cache=True) -""" - - -def njit(*args, **kwargs): - def wrapper(f): - return f - - return wrapper - - -class SubscriptAndCallable: - def __init__(self, *args, **kwargs): - pass - - def __class_getitem__(cls, item): - return None - - -# DTYPES -# @njit(b1(i4, i4, i4[:, :]), cache=True) - - -class b1(SubscriptAndCallable): - pass - - -class f8(SubscriptAndCallable): - pass - - -class i2(SubscriptAndCallable): - pass - - -class i4(SubscriptAndCallable): - pass - - -class u2(SubscriptAndCallable): - pass diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/command_line.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/command_line.py deleted file mode 100644 index eca54592..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/command_line.py +++ /dev/null @@ -1,60 +0,0 @@ -import argparse -from typing import Callable - -from timezonefinder import TimezoneFinder, TimezoneFinderL -from timezonefinder.timezonefinder import AbstractTimezoneFinder - - -def get_timezone_function(function_id: int) -> Callable: - """ - Note: script is being called for each point individually. Caching TimezoneFinder() instances is useless. - -> avoid constructing unnecessary instances - """ - tf_instance: AbstractTimezoneFinder - if function_id in [0, 1, 5]: - tf_instance = TimezoneFinder() - functions = { - 0: tf_instance.timezone_at, - 1: tf_instance.certain_timezone_at, - 5: tf_instance.timezone_at_land, - } - else: - tf_instance = TimezoneFinderL() - functions = { - 3: tf_instance.timezone_at, - 4: tf_instance.timezone_at_land, - } - return functions[function_id] - - -def main(): - parser = argparse.ArgumentParser(description="parse TimezoneFinder parameters") - parser.add_argument("lng", type=float, help="longitude to be queried") - parser.add_argument("lat", type=float, help="latitude to be queried") - parser.add_argument("-v", action="store_true", help="verbosity flag") - parser.add_argument( - "-f", - "--function", - type=int, - choices=[0, 1, 3, 4, 5], - default=0, - help="function to be called:" - "0: TimezoneFinder.timezone_at(), " - "1: TimezoneFinder.certain_timezone_at(), " - "2: removed, " - "3: TimezoneFinderL.timezone_at(), " - "4: TimezoneFinderL.timezone_at_land(), " - "5: TimezoneFinder.timezone_at_land(), ", - ) - parsed_args = parser.parse_args() # takes input from sys.argv - timezone_function = get_timezone_function(parsed_args.function) - tz = timezone_function(lng=parsed_args.lng, lat=parsed_args.lat) - if parsed_args.v: - print("Looking for TZ at lat=", parsed_args.lat, " lng=", parsed_args.lng) - print( - "Function:", - ["timezone_at()", "certain_timezone_at()"][parsed_args.function], - ) - print("Timezone=", tz) - else: - print(tz) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/configs.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/configs.py deleted file mode 100644 index 43c1866d..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/configs.py +++ /dev/null @@ -1,109 +0,0 @@ -# NOTE: Changes in the global settings might not immediately affect -# the functions in utils.py due to numba compilation and caching! -from typing import Dict, List, Tuple - -import numpy as np - -# SHORTCUT SETTINGS -# h3 library -SHORTCUT_H3_RES: int = 3 -SHORTCUT_FILE = "shortcuts.bin" - -OCEAN_TIMEZONE_PREFIX = r"Etc/GMT" - -# DATA FILES -# BINARY -BINARY_FILE_ENDING = ".bin" - -POLY_ZONE_IDS = "poly_zone_ids" -POLY_COORD_AMOUNT = "poly_coord_amount" -POLY_ADR2DATA = "poly_adr2data" -POLY_MAX_VALUES = "poly_bounds" -POLY_DATA = "poly_data" -POLY_NR2ZONE_ID = "poly_nr2zone_id" - -HOLE_COORD_AMOUNT = "hole_coord_amount" -HOLE_ADR2DATA = "hole_adr2data" -HOLE_DATA = "hole_data" - -BINARY_DATA_ATTRIBUTES = [ - POLY_ZONE_IDS, - POLY_COORD_AMOUNT, - POLY_ADR2DATA, - POLY_MAX_VALUES, - POLY_DATA, - POLY_NR2ZONE_ID, - HOLE_COORD_AMOUNT, - HOLE_ADR2DATA, - HOLE_DATA, -] - -# JSON -JSON_FILE_ENDING = ".json" -HOLE_REGISTRY = "hole_registry" -TIMEZONE_NAMES_FILE = "timezone_names" + JSON_FILE_ENDING -HOLE_REGISTRY_FILE = HOLE_REGISTRY + JSON_FILE_ENDING - -DATA_ATTRIBUTE_NAMES = BINARY_DATA_ATTRIBUTES + [HOLE_REGISTRY] - -# all data files that should be included in the build: -ALL_BINARY_FILES = [specifier + BINARY_FILE_ENDING for specifier in BINARY_DATA_ATTRIBUTES] -ALL_JSON_FILES = [TIMEZONE_NAMES_FILE, HOLE_REGISTRY_FILE] -PACKAGE_DATA_FILES = ALL_BINARY_FILES + ALL_JSON_FILES - -# TODO create variables for used dtype for each type of data (polygon address, coordinate...) -# B = unsigned char (1byte = 8bit Integer) -NR_BYTES_B = 1 -DTYPE_FORMAT_B = b"<B" -DTYPE_FORMAT_B_NUMPY = "<i1" -THRES_DTYPE_B = 2 ** (NR_BYTES_B * 8) - -# H = unsigned short (2 byte integer) -NR_BYTES_H = 2 -DTYPE_FORMAT_H = b"<H" -DTYPE_FORMAT_H_NUMPY = "<u2" -THRES_DTYPE_H = 2 ** (NR_BYTES_H * 8) # = 65536 - -# value to write for representing an invalid zone (e.g. no shortcut polygon) -# = 65535 = highest possible value with H (2 byte unsigned integer) -INVALID_VALUE_DTYPE_H = THRES_DTYPE_H - 1 - -# i = signed 4byte integer -NR_BYTES_I = 4 -DTYPE_FORMAT_SIGNED_I = b"<i" -DTYPE_FORMAT_SIGNED_I_NUMPY = "<i4" -THRES_DTYPE_SIGNED_I_UPPER = 2 ** ((NR_BYTES_I * 8) - 1) -THRES_DTYPE_SIGNED_I_LOWER = -THRES_DTYPE_SIGNED_I_UPPER - -# I = unsigned 4byte integer -DTYPE_FORMAT_I = b"<I" -THRES_DTYPE_I = 2 ** (NR_BYTES_I * 8) - -# Q = unsigned 8byte integer -NR_BYTES_Q = 8 -DTYPE_FORMAT_Q = b"<Q" - -# f = 8byte signed float -DTYPE_FORMAT_F_NUMPY = "<f8" - -# IMPORTANT: all values between -180 and 180 degree must fit into the domain of i4! -# is the same as testing if 360 fits into the domain of I4 (unsigned!) -MAX_ALLOWED_COORD_VAL = 2 ** (8 * NR_BYTES_I - 1) - -# from math import floor,log10 -# DECIMAL_PLACES_SHIFT = floor(log10(MAX_ALLOWED_COORD_VAL/180.0)) # == 7 -DECIMAL_PLACES_SHIFT = 7 -INT2COORD_FACTOR = 10 ** (-DECIMAL_PLACES_SHIFT) -COORD2INT_FACTOR = 10**DECIMAL_PLACES_SHIFT -MAX_LNG_VAL = 180.0 -MAX_LAT_VAL = 90.0 -MAX_INT_VAL = int(MAX_LNG_VAL * COORD2INT_FACTOR) -assert MAX_INT_VAL < MAX_ALLOWED_COORD_VAL - -# TYPES - -# hexagon id to list of polygon ids -ShortcutMapping = Dict[int, np.ndarray] -CoordPairs = List[Tuple[float, float]] -CoordLists = List[List[float]] -IntLists = List[List[int]] diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/hex_helpers.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/hex_helpers.py deleted file mode 100644 index 0095caf8..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/hex_helpers.py +++ /dev/null @@ -1,64 +0,0 @@ -import struct -from pathlib import Path -from typing import Dict, List - -import numpy as np -from h3.api import numpy_int as h3 - -from timezonefinder.configs import ( - DTYPE_FORMAT_B, - DTYPE_FORMAT_H, - DTYPE_FORMAT_H_NUMPY, - DTYPE_FORMAT_Q, - NR_BYTES_B, - NR_BYTES_I, - NR_BYTES_Q, - THRES_DTYPE_B, - ShortcutMapping, -) - - -def export_shortcuts_binary(global_mapping: Dict[int, List[int]], path2shortcuts: Path) -> int: - """ - binary format: - for every shortcut entry: - - the hex id (uint64) - - the amount of contained polygons n (uint8) - - n polygon ids (uint16) - - """ - shortcut_space = 0 - with open(path2shortcuts, "wb") as fp: - for hex_id, poly_ids in global_mapping.items(): - fp.write(struct.pack(DTYPE_FORMAT_Q, hex_id)) - nr_polys = len(poly_ids) - if nr_polys > THRES_DTYPE_B: - raise ValueError("value overflow: more polys than data type supports") - fp.write(struct.pack(DTYPE_FORMAT_B, nr_polys)) - for poly_id in poly_ids: - fp.write(struct.pack(DTYPE_FORMAT_H, poly_id)) - - shortcut_space += NR_BYTES_Q + NR_BYTES_B + (len(poly_ids) * NR_BYTES_I) - - return shortcut_space - - -def read_shortcuts_binary(path2shortcuts: Path) -> ShortcutMapping: - mapping: ShortcutMapping = {} - with open(path2shortcuts, "rb") as fp: - while 1: - try: - hex_id: int = struct.unpack(DTYPE_FORMAT_Q, fp.read(NR_BYTES_Q))[0] - except struct.error: - # EOF: buffer not long enough to unpack - break - nr_polys: int = struct.unpack(DTYPE_FORMAT_B, fp.read(NR_BYTES_B))[0] - poly_ids: np.ndarray = np.fromfile(fp, dtype=DTYPE_FORMAT_H_NUMPY, count=nr_polys) - mapping[hex_id] = poly_ids - - return mapping - - -def lies_in_h3_cell(h: int, lng: float, lat: float) -> bool: - res = h3.h3_get_resolution(h) - return h3.geo_to_h3(lat, lng, res) == h diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/hole_adr2data.bin b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/hole_adr2data.bin deleted file mode 100644 index dd7ba76f..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/hole_adr2data.bin and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/hole_coord_amount.bin b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/hole_coord_amount.bin deleted file mode 100644 index db05e942..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/hole_coord_amount.bin and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/hole_data.bin b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/hole_data.bin deleted file mode 100644 index 3ace079b..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/hole_data.bin and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/hole_registry.json b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/hole_registry.json deleted file mode 100644 index 169d861e..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/hole_registry.json +++ /dev/null @@ -1,374 +0,0 @@ -{ - "1116": [ - 2, - 236 - ], - "1137": [ - 15, - 238 - ], - "1141": [ - 44, - 253 - ], - "1142": [ - 2, - 297 - ], - "1143": [ - 37, - 299 - ], - "1144": [ - 20, - 336 - ], - "1147": [ - 1, - 356 - ], - "1150": [ - 28, - 357 - ], - "1151": [ - 3, - 385 - ], - "1155": [ - 1, - 388 - ], - "1156": [ - 23, - 389 - ], - "1159": [ - 4, - 412 - ], - "1164": [ - 3, - 416 - ], - "1168": [ - 1, - 419 - ], - "1169": [ - 2, - 420 - ], - "1170": [ - 5, - 422 - ], - "1171": [ - 3, - 427 - ], - "1172": [ - 14, - 430 - ], - "1177": [ - 12, - 444 - ], - "1178": [ - 2, - 456 - ], - "1181": [ - 1, - 458 - ], - "1186": [ - 1, - 459 - ], - "1187": [ - 7, - 460 - ], - "1192": [ - 3, - 467 - ], - "1197": [ - 21, - 470 - ], - "1206": [ - 1, - 491 - ], - "1210": [ - 1, - 492 - ], - "1213": [ - 2, - 493 - ], - "1221": [ - 5, - 495 - ], - "1223": [ - 2, - 500 - ], - "1226": [ - 2, - 502 - ], - "1227": [ - 4, - 504 - ], - "1229": [ - 13, - 508 - ], - "1231": [ - 17, - 521 - ], - "1234": [ - 2, - 538 - ], - "1236": [ - 1, - 540 - ], - "1237": [ - 11, - 541 - ], - "1241": [ - 2, - 552 - ], - "1245": [ - 13, - 554 - ], - "1246": [ - 1, - 567 - ], - "1247": [ - 4, - 568 - ], - "1250": [ - 6, - 572 - ], - "1251": [ - 2, - 578 - ], - "1257": [ - 6, - 580 - ], - "1260": [ - 4, - 586 - ], - "1263": [ - 31, - 590 - ], - "1267": [ - 34, - 621 - ], - "1271": [ - 36, - 655 - ], - "1273": [ - 1, - 691 - ], - "1274": [ - 21, - 692 - ], - "16": [ - 8, - 1 - ], - "199": [ - 92, - 23 - ], - "239": [ - 1, - 115 - ], - "249": [ - 2, - 116 - ], - "270": [ - 1, - 118 - ], - "281": [ - 3, - 119 - ], - "30": [ - 1, - 9 - ], - "325": [ - 1, - 122 - ], - "348": [ - 1, - 123 - ], - "350": [ - 2, - 124 - ], - "360": [ - 1, - 126 - ], - "37": [ - 1, - 10 - ], - "375": [ - 1, - 127 - ], - "395": [ - 1, - 128 - ], - "4": [ - 1, - 0 - ], - "443": [ - 1, - 129 - ], - "446": [ - 6, - 130 - ], - "461": [ - 1, - 136 - ], - "481": [ - 16, - 137 - ], - "493": [ - 2, - 153 - ], - "511": [ - 1, - 155 - ], - "520": [ - 1, - 156 - ], - "530": [ - 2, - 157 - ], - "54": [ - 2, - 11 - ], - "558": [ - 22, - 159 - ], - "591": [ - 2, - 181 - ], - "639": [ - 5, - 183 - ], - "716": [ - 21, - 188 - ], - "755": [ - 1, - 209 - ], - "756": [ - 1, - 210 - ], - "764": [ - 6, - 211 - ], - "765": [ - 1, - 217 - ], - "771": [ - 6, - 218 - ], - "805": [ - 2, - 224 - ], - "817": [ - 1, - 226 - ], - "820": [ - 1, - 227 - ], - "822": [ - 1, - 228 - ], - "831": [ - 1, - 229 - ], - "840": [ - 2, - 230 - ], - "844": [ - 1, - 232 - ], - "848": [ - 1, - 233 - ], - "868": [ - 2, - 234 - ], - "88": [ - 10, - 13 - ] -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/inside_poly_extension/inside_polygon_int.c b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/inside_poly_extension/inside_polygon_int.c deleted file mode 100644 index 67defef2..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/inside_poly_extension/inside_polygon_int.c +++ /dev/null @@ -1,69 +0,0 @@ -#include "inside_polygon_int.h" -#include <stdio.h> - -bool inside_polygon_int(int x, int y, int nr_coords, int x_coords[], - int y_coords[]) { - // naive implementation, vulnerable to overflow: - // bool inside; - // for (int i = 0, j = nr_coords - 1; i < nr_coords; j = i++) { - // if (((y_coords[i] > y) != (y_coords[j] > y)) && - // (x < (x_coords[j] - x_coords[i]) * (y - y_coords[i]) / - // (y_coords[j] - y_coords[i]) + - // x_coords[i])) { - // inside = !inside; - // } - // } - // return inside; - - bool inside, y_gt_y1, y_gt_y2, x_le_x1, x_le_x2; - long y1, y2, x1, x2, slope1, slope2; // int64 precision - int i, j; - - inside = false; - // the edge from the last to the first point is checked first - j = nr_coords - 1; - y_gt_y1 = y > y_coords[j]; - for (i = 0; i < nr_coords; j = i++) { - y_gt_y2 = y > y_coords[i]; - if (y_gt_y1 ^ y_gt_y2) { // XOR - // [p1-p2] crosses horizontal line in p - // only count crossings "right" of the point ( >= x) - x_le_x1 = x <= x_coords[j]; - x_le_x2 = x <= x_coords[i]; - if (x_le_x1 || x_le_x2) { - if (x_le_x1 && x_le_x2) { - // p1 and p2 are both to the right -> valid crossing - inside = !inside; - } else { - // compare the slope of the line [p1-p2] and [p-p2] - // depending on the position of p2 this determines whether - // the polygon edge is right or left of the point - // to avoid expensive division the divisors (of the slope dy/dx) - // are brought to the other side ( dy/dx > a == dy > a * dx ) - // only one of the points is to the right - // NOTE: int64 precision required to prevent overflow - y1 = y_coords[j]; - y2 = y_coords[i]; - x1 = x_coords[j]; - x2 = x_coords[i]; - slope1 = (y2 - y) * (x2 - x1); - slope2 = (y2 - y1) * (x2 - x); - // NOTE: accept slope equality to also detect if p lies directly - // on an edge - if (y_gt_y1) { - if (slope1 <= slope2) { - inside = !inside; - } - } else { // NOT y_gt_y1 - if (slope1 >= slope2) { - inside = !inside; - } - } - } - } - } - // next point - y_gt_y1 = y_gt_y2; - } - return inside; -} diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/inside_poly_extension/inside_polygon_int.h b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/inside_poly_extension/inside_polygon_int.h deleted file mode 100644 index d536fe31..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/inside_poly_extension/inside_polygon_int.h +++ /dev/null @@ -1,4 +0,0 @@ -#include <stdbool.h> - -bool inside_polygon_int(int x, int y, int nr_coords, int x_coords[], - int y_coords[]); diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/path_modification.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/path_modification.py deleted file mode 100644 index 53704cbb..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/path_modification.py +++ /dev/null @@ -1,7 +0,0 @@ -"""modify PYTHONPATH to make parent package discoverable.""" - -import sys -from os.path import abspath, join, pardir - -package_path = abspath(join(__file__, pardir, pardir)) -sys.path.insert(0, package_path) diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/poly_adr2data.bin b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/poly_adr2data.bin deleted file mode 100644 index 2dcf7642..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/poly_adr2data.bin and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/poly_bounds.bin b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/poly_bounds.bin deleted file mode 100644 index c8ada064..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/poly_bounds.bin and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/poly_coord_amount.bin b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/poly_coord_amount.bin deleted file mode 100644 index 79334e91..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/poly_coord_amount.bin and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/poly_data.bin b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/poly_data.bin deleted file mode 100644 index 91795169..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/poly_data.bin and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/poly_nr2zone_id.bin b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/poly_nr2zone_id.bin deleted file mode 100644 index 364ed3dc..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/poly_nr2zone_id.bin and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/poly_zone_ids.bin b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/poly_zone_ids.bin deleted file mode 100644 index 1a2fec74..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/poly_zone_ids.bin and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/py.typed b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/py.typed deleted file mode 100644 index e69de29b..00000000 diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/shortcuts.bin b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/shortcuts.bin deleted file mode 100644 index ebaaf5c8..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/shortcuts.bin and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/timezone_names.json b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/timezone_names.json deleted file mode 100644 index eb65b5c7..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/timezone_names.json +++ /dev/null @@ -1,446 +0,0 @@ -[ - "Africa/Abidjan", - "Africa/Accra", - "Africa/Addis_Ababa", - "Africa/Algiers", - "Africa/Asmara", - "Africa/Bamako", - "Africa/Bangui", - "Africa/Banjul", - "Africa/Bissau", - "Africa/Blantyre", - "Africa/Brazzaville", - "Africa/Bujumbura", - "Africa/Cairo", - "Africa/Casablanca", - "Africa/Ceuta", - "Africa/Conakry", - "Africa/Dakar", - "Africa/Dar_es_Salaam", - "Africa/Djibouti", - "Africa/Douala", - "Africa/El_Aaiun", - "Africa/Freetown", - "Africa/Gaborone", - "Africa/Harare", - "Africa/Johannesburg", - "Africa/Juba", - "Africa/Kampala", - "Africa/Khartoum", - "Africa/Kigali", - "Africa/Kinshasa", - "Africa/Lagos", - "Africa/Libreville", - "Africa/Lome", - "Africa/Luanda", - "Africa/Lubumbashi", - "Africa/Lusaka", - "Africa/Malabo", - "Africa/Maputo", - "Africa/Maseru", - "Africa/Mbabane", - "Africa/Mogadishu", - "Africa/Monrovia", - "Africa/Nairobi", - "Africa/Ndjamena", - "Africa/Niamey", - "Africa/Nouakchott", - "Africa/Ouagadougou", - "Africa/Porto-Novo", - "Africa/Sao_Tome", - "Africa/Tripoli", - "Africa/Tunis", - "Africa/Windhoek", - "America/Adak", - "America/Anchorage", - "America/Anguilla", - "America/Antigua", - "America/Aruba", - "America/Araguaina", - "America/Argentina/Buenos_Aires", - "America/Argentina/Catamarca", - "America/Argentina/Cordoba", - "America/Argentina/Jujuy", - "America/Argentina/La_Rioja", - "America/Argentina/Mendoza", - "America/Argentina/Rio_Gallegos", - "America/Argentina/Salta", - "America/Argentina/San_Juan", - "America/Argentina/San_Luis", - "America/Argentina/Tucuman", - "America/Argentina/Ushuaia", - "America/Asuncion", - "America/Atikokan", - "America/Bahia", - "America/Bahia_Banderas", - "America/Barbados", - "America/Belem", - "America/Belize", - "America/Blanc-Sablon", - "America/Boa_Vista", - "America/Bogota", - "America/Boise", - "America/Cambridge_Bay", - "America/Campo_Grande", - "America/Cancun", - "America/Caracas", - "America/Cayenne", - "America/Cayman", - "America/Chicago", - "America/Chihuahua", - "America/Ciudad_Juarez", - "America/Costa_Rica", - "America/Creston", - "America/Cuiaba", - "America/Curacao", - "America/Danmarkshavn", - "America/Dawson", - "America/Dawson_Creek", - "America/Denver", - "America/Detroit", - "America/Dominica", - "America/Edmonton", - "America/Eirunepe", - "America/El_Salvador", - "America/Fort_Nelson", - "America/Fortaleza", - "America/Glace_Bay", - "America/Goose_Bay", - "America/Grand_Turk", - "America/Grenada", - "America/Guadeloupe", - "America/Guatemala", - "America/Guayaquil", - "America/Guyana", - "America/Halifax", - "America/Havana", - "America/Hermosillo", - "America/Indiana/Indianapolis", - "America/Indiana/Knox", - "America/Indiana/Marengo", - "America/Indiana/Petersburg", - "America/Indiana/Tell_City", - "America/Indiana/Vevay", - "America/Indiana/Vincennes", - "America/Indiana/Winamac", - "America/Inuvik", - "America/Iqaluit", - "America/Jamaica", - "America/Juneau", - "America/Kentucky/Louisville", - "America/Kentucky/Monticello", - "America/Kralendijk", - "America/La_Paz", - "America/Lima", - "America/Los_Angeles", - "America/Lower_Princes", - "America/Maceio", - "America/Managua", - "America/Manaus", - "America/Marigot", - "America/Martinique", - "America/Matamoros", - "America/Mazatlan", - "America/Miquelon", - "America/Menominee", - "America/Merida", - "America/Metlakatla", - "America/Mexico_City", - "America/Moncton", - "America/Monterrey", - "America/Montevideo", - "America/Montserrat", - "America/Nassau", - "America/New_York", - "America/Nome", - "America/Noronha", - "America/North_Dakota/Beulah", - "America/North_Dakota/Center", - "America/North_Dakota/New_Salem", - "America/Nuuk", - "America/Ojinaga", - "America/Panama", - "America/Paramaribo", - "America/Phoenix", - "America/Port-au-Prince", - "America/Port_of_Spain", - "America/Porto_Velho", - "America/Puerto_Rico", - "America/Punta_Arenas", - "America/Rankin_Inlet", - "America/Recife", - "America/Regina", - "America/Resolute", - "America/Rio_Branco", - "America/Santarem", - "America/Santiago", - "America/Santo_Domingo", - "America/Sao_Paulo", - "America/Scoresbysund", - "America/Sitka", - "America/St_Barthelemy", - "America/St_Johns", - "America/St_Kitts", - "America/St_Lucia", - "America/St_Thomas", - "America/St_Vincent", - "America/Swift_Current", - "America/Tegucigalpa", - "America/Thule", - "America/Tijuana", - "America/Toronto", - "America/Tortola", - "America/Vancouver", - "America/Whitehorse", - "America/Winnipeg", - "America/Yakutat", - "Antarctica/Casey", - "Antarctica/Davis", - "Antarctica/DumontDUrville", - "Antarctica/Macquarie", - "Antarctica/Mawson", - "Antarctica/McMurdo", - "Antarctica/Palmer", - "Antarctica/Rothera", - "Antarctica/Syowa", - "Antarctica/Troll", - "Antarctica/Vostok", - "Arctic/Longyearbyen", - "Asia/Aden", - "Asia/Almaty", - "Asia/Amman", - "Asia/Anadyr", - "Asia/Aqtau", - "Asia/Aqtobe", - "Asia/Ashgabat", - "Asia/Atyrau", - "Asia/Baghdad", - "Asia/Bahrain", - "Asia/Baku", - "Asia/Bangkok", - "Asia/Barnaul", - "Asia/Beirut", - "Asia/Bishkek", - "Asia/Brunei", - "Asia/Chita", - "Asia/Choibalsan", - "Asia/Colombo", - "Asia/Damascus", - "Asia/Dhaka", - "Asia/Dili", - "Asia/Dubai", - "Asia/Dushanbe", - "Asia/Famagusta", - "Asia/Gaza", - "Asia/Hebron", - "Asia/Ho_Chi_Minh", - "Asia/Hong_Kong", - "Asia/Hovd", - "Asia/Irkutsk", - "Asia/Jakarta", - "Asia/Jayapura", - "Asia/Jerusalem", - "Asia/Kabul", - "Asia/Kamchatka", - "Asia/Karachi", - "Asia/Kathmandu", - "Asia/Khandyga", - "Asia/Kolkata", - "Asia/Krasnoyarsk", - "Asia/Kuala_Lumpur", - "Asia/Kuching", - "Asia/Kuwait", - "Asia/Macau", - "Asia/Magadan", - "Asia/Makassar", - "Asia/Manila", - "Asia/Muscat", - "Asia/Nicosia", - "Asia/Novokuznetsk", - "Asia/Novosibirsk", - "Asia/Omsk", - "Asia/Oral", - "Asia/Phnom_Penh", - "Asia/Pontianak", - "Asia/Pyongyang", - "Asia/Qatar", - "Asia/Qostanay", - "Asia/Qyzylorda", - "Asia/Riyadh", - "Asia/Sakhalin", - "Asia/Samarkand", - "Asia/Seoul", - "Asia/Shanghai", - "Asia/Singapore", - "Asia/Srednekolymsk", - "Asia/Taipei", - "Asia/Tashkent", - "Asia/Tbilisi", - "Asia/Tehran", - "Asia/Thimphu", - "Asia/Tokyo", - "Asia/Tomsk", - "Asia/Ulaanbaatar", - "Asia/Urumqi", - "Asia/Ust-Nera", - "Asia/Vientiane", - "Asia/Vladivostok", - "Asia/Yakutsk", - "Asia/Yangon", - "Asia/Yekaterinburg", - "Asia/Yerevan", - "Atlantic/Azores", - "Atlantic/Bermuda", - "Atlantic/Canary", - "Atlantic/Cape_Verde", - "Atlantic/Faroe", - "Atlantic/Madeira", - "Atlantic/Reykjavik", - "Atlantic/South_Georgia", - "Atlantic/St_Helena", - "Atlantic/Stanley", - "Australia/Adelaide", - "Australia/Brisbane", - "Australia/Broken_Hill", - "Australia/Darwin", - "Australia/Eucla", - "Australia/Hobart", - "Australia/Lindeman", - "Australia/Lord_Howe", - "Australia/Melbourne", - "Australia/Perth", - "Australia/Sydney", - "Etc/UTC", - "Europe/Amsterdam", - "Europe/Andorra", - "Europe/Astrakhan", - "Europe/Athens", - "Europe/Belgrade", - "Europe/Berlin", - "Europe/Bratislava", - "Europe/Brussels", - "Europe/Bucharest", - "Europe/Budapest", - "Europe/Busingen", - "Europe/Chisinau", - "Europe/Copenhagen", - "Europe/Dublin", - "Europe/Gibraltar", - "Europe/Guernsey", - "Europe/Helsinki", - "Europe/Isle_of_Man", - "Europe/Istanbul", - "Europe/Jersey", - "Europe/Kaliningrad", - "Europe/Kyiv", - "Europe/Kirov", - "Europe/Lisbon", - "Europe/Ljubljana", - "Europe/London", - "Europe/Luxembourg", - "Europe/Madrid", - "Europe/Malta", - "Europe/Mariehamn", - "Europe/Minsk", - "Europe/Monaco", - "Europe/Moscow", - "Europe/Oslo", - "Europe/Paris", - "Europe/Podgorica", - "Europe/Prague", - "Europe/Riga", - "Europe/Rome", - "Europe/Samara", - "Europe/San_Marino", - "Europe/Sarajevo", - "Europe/Saratov", - "Europe/Simferopol", - "Europe/Skopje", - "Europe/Sofia", - "Europe/Stockholm", - "Europe/Tallinn", - "Europe/Tirane", - "Europe/Ulyanovsk", - "Europe/Vaduz", - "Europe/Vatican", - "Europe/Vienna", - "Europe/Vilnius", - "Europe/Volgograd", - "Europe/Warsaw", - "Europe/Zagreb", - "Europe/Zurich", - "Indian/Antananarivo", - "Indian/Chagos", - "Indian/Christmas", - "Indian/Cocos", - "Indian/Comoro", - "Indian/Kerguelen", - "Indian/Mahe", - "Indian/Maldives", - "Indian/Mauritius", - "Indian/Mayotte", - "Indian/Reunion", - "Pacific/Apia", - "Pacific/Auckland", - "Pacific/Bougainville", - "Pacific/Chatham", - "Pacific/Chuuk", - "Pacific/Easter", - "Pacific/Efate", - "Pacific/Fakaofo", - "Pacific/Fiji", - "Pacific/Funafuti", - "Pacific/Galapagos", - "Pacific/Gambier", - "Pacific/Guadalcanal", - "Pacific/Guam", - "Pacific/Honolulu", - "Pacific/Kanton", - "Pacific/Kiritimati", - "Pacific/Kosrae", - "Pacific/Kwajalein", - "Pacific/Majuro", - "Pacific/Marquesas", - "Pacific/Midway", - "Pacific/Nauru", - "Pacific/Niue", - "Pacific/Norfolk", - "Pacific/Noumea", - "Pacific/Pago_Pago", - "Pacific/Palau", - "Pacific/Pitcairn", - "Pacific/Pohnpei", - "Pacific/Port_Moresby", - "Pacific/Rarotonga", - "Pacific/Saipan", - "Pacific/Tahiti", - "Pacific/Tarawa", - "Pacific/Tongatapu", - "Pacific/Wake", - "Pacific/Wallis", - "Etc/GMT-12", - "Etc/GMT-11", - "Etc/GMT-10", - "Etc/GMT-9", - "Etc/GMT-8", - "Etc/GMT-7", - "Etc/GMT-6", - "Etc/GMT-5", - "Etc/GMT-4", - "Etc/GMT-3", - "Etc/GMT-2", - "Etc/GMT-1", - "Etc/GMT", - "Etc/GMT+1", - "Etc/GMT+2", - "Etc/GMT+3", - "Etc/GMT+4", - "Etc/GMT+5", - "Etc/GMT+6", - "Etc/GMT+7", - "Etc/GMT+8", - "Etc/GMT+9", - "Etc/GMT+10", - "Etc/GMT+11", - "Etc/GMT+12" -] diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/timezonefinder.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/timezonefinder.py deleted file mode 100755 index 658fd0e6..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/timezonefinder.py +++ /dev/null @@ -1,491 +0,0 @@ -import json -from abc import ABC, abstractmethod -from io import BytesIO -from pathlib import Path -from struct import unpack -from typing import List, Optional, Union - -import numpy as np -from h3.api import numpy_int as h3 - -from timezonefinder import utils -from timezonefinder.configs import ( - BINARY_DATA_ATTRIBUTES, - BINARY_FILE_ENDING, - DATA_ATTRIBUTE_NAMES, - DTYPE_FORMAT_H, - DTYPE_FORMAT_H_NUMPY, - DTYPE_FORMAT_I, - DTYPE_FORMAT_SIGNED_I_NUMPY, - HOLE_ADR2DATA, - HOLE_COORD_AMOUNT, - HOLE_DATA, - HOLE_REGISTRY, - HOLE_REGISTRY_FILE, - NR_BYTES_H, - NR_BYTES_I, - POLY_ADR2DATA, - POLY_COORD_AMOUNT, - POLY_DATA, - POLY_MAX_VALUES, - POLY_NR2ZONE_ID, - POLY_ZONE_IDS, - SHORTCUT_FILE, - SHORTCUT_H3_RES, - TIMEZONE_NAMES_FILE, - CoordLists, - CoordPairs, -) -from timezonefinder.hex_helpers import read_shortcuts_binary -from timezonefinder.utils import inside_polygon - - -class AbstractTimezoneFinder(ABC): - # TODO document attributes in all classes - # prevent dynamic attribute assignment (-> safe memory) - __slots__ = [ - "bin_file_location", - "shortcut_mapping", - "in_memory", - "_fromfile", - "timezone_names", - POLY_ZONE_IDS, - ] - binary_data_attributes: List[str] = [POLY_ZONE_IDS] - - def __init__( - self, - bin_file_location: Optional[Union[str, Path]] = None, - in_memory: bool = False, - ): - self.in_memory = in_memory - - if self.in_memory: - self._fromfile = utils.fromfile_memory - else: - self._fromfile = np.fromfile - - # open all the files in binary reading mode - # for more info on what is stored in which .bin file, please read the comments in file_converter.py - if bin_file_location is None: - bin_file_location = Path(__file__).parent - else: - bin_file_location = Path(bin_file_location) - self.bin_file_location: Path = bin_file_location - - with open(self.bin_file_location / TIMEZONE_NAMES_FILE) as json_file: - self.timezone_names = json.loads(json_file.read()) - - path2shortcut_bin = self.bin_file_location / SHORTCUT_FILE - self.shortcut_mapping = read_shortcuts_binary(path2shortcut_bin) - - for attribute_name in self.binary_data_attributes: - file_name = attribute_name + BINARY_FILE_ENDING - path2file = self.bin_file_location / file_name - if self.in_memory: - with open(path2file, mode="rb") as bin_file: - bf_in_mem = BytesIO(bin_file.read()) - bf_in_mem.seek(0) - setattr(self, attribute_name, bf_in_mem) - else: - bin_file = open(path2file, mode="rb") - setattr(self, attribute_name, bin_file) - - def __del__(self): - for attribute_name in self.binary_data_attributes: - getattr(self, attribute_name).close() - - @property - def nr_of_zones(self): - return len(self.timezone_names) - - @staticmethod - def using_numba() -> bool: - """ - :return: True if Numba is being used to JIT compile helper functions - """ - return utils.using_numba - - @staticmethod - def using_clang_pip() -> bool: - """ - :return: True if the compiled C implementation of the point in polygon algorithm is being used - """ - return utils.inside_polygon == utils.pt_in_poly_clang - - def zone_id_of(self, poly_id: int) -> int: - poly_zone_ids = getattr(self, POLY_ZONE_IDS) - poly_zone_ids.seek(NR_BYTES_H * poly_id) - return unpack(DTYPE_FORMAT_H, poly_zone_ids.read(NR_BYTES_H))[0] - - def zone_ids_of(self, poly_ids: np.ndarray) -> np.ndarray: - poly_zone_ids = getattr(self, POLY_ZONE_IDS) - id_array = np.empty(shape=len(poly_ids), dtype=DTYPE_FORMAT_H_NUMPY) - - for i, poly_id in enumerate(poly_ids): - poly_zone_ids.seek(NR_BYTES_H * poly_id) - id_array[i] = unpack(DTYPE_FORMAT_H, poly_zone_ids.read(NR_BYTES_H))[0] - - return id_array - - def zone_name_from_id(self, zone_id: int) -> str: - try: - return self.timezone_names[zone_id] - except IndexError: - raise ValueError("timezone could not be found. index error.") - - def zone_name_from_poly_id(self, poly_id: int) -> str: - zone_id = self.zone_id_of(poly_id) - return self.zone_name_from_id(zone_id) - - def get_shortcut_polys(self, *, lng: float, lat: float) -> np.ndarray: - hex_id = h3.geo_to_h3(lat, lng, SHORTCUT_H3_RES) - shortcut_poly_ids = self.shortcut_mapping[hex_id] - return shortcut_poly_ids - - def most_common_zone_id(self, *, lng: float, lat: float) -> Optional[int]: - polys = self.get_shortcut_polys(lng=lng, lat=lat) - if len(polys) == 0: - return None - # Note: polygons are sorted from small to big in the shortcuts (grouped by zone) - # -> the polygons of the biggest zone come last - poly_of_biggest_zone = polys[-1] - return self.zone_id_of(poly_of_biggest_zone) - - def unique_zone_id(self, *, lng: float, lat: float) -> Optional[int]: - """ - :return: the zone id at the coordinate if there is exactly one possible zone, else `None` - """ - polys = self.get_shortcut_polys(lng=lng, lat=lat) - if len(polys) == 0: - return None - if len(polys) == 1: - return self.zone_id_of(polys[0]) - zones = self.zone_ids_of(polys) - zones_unique = np.unique(zones) - if len(zones_unique) == 1: - return zones_unique[0] - # more than one zone in this shortcut - return None - - @abstractmethod - def timezone_at(self, *, lng: float, lat: float) -> Optional[str]: - """looks up in which timezone the given coordinate is included in - - :param lng: longitude of the point in degree (-180.0 to 180.0) - :param lat: latitude in degree (90.0 to -90.0) - :return: the timezone name of a matching polygon or None - """ - ... - - def timezone_at_land(self, *, lng: float, lat: float) -> Optional[str]: - """computes in which land timezone a point is included in - - Especially for large polygons it is expensive to check if a point is really included. - To speed things up there are "shortcuts" being used (stored in a binary file), - which have been precomputed and store which timezone polygons have to be checked. - - :param lng: longitude of the point in degree (-180.0 to 180.0) - :param lat: latitude in degree (90.0 to -90.0) - :return: the timezone name of a matching polygon or - ``None`` when an ocean timezone ("Etc/GMT+-XX") has been matched. - """ - tz_name = self.timezone_at(lng=lng, lat=lat) - if tz_name is not None and utils.is_ocean_timezone(tz_name): - return None - return tz_name - - def unique_timezone_at(self, *, lng: float, lat: float) -> Optional[str]: - """returns the name of a unique zone within the corresponding shortcut - - :param lng: longitude of the point in degree (-180.0 to 180.0) - :param lat: latitude in degree (90.0 to -90.0) - :return: the timezone name of the unique zone or ``None`` if there are no or multiple zones in this shortcut - """ - lng, lat = utils.validate_coordinates(lng, lat) - unique_id = self.unique_zone_id(lng=lng, lat=lat) - if unique_id is None: - return None - return self.zone_name_from_id(unique_id) - - -class TimezoneFinderL(AbstractTimezoneFinder): - """a 'light' version of the TimezoneFinder class for quickly suggesting a timezone for a point on earth - - Instead of using timezone polygon data like ``TimezoneFinder``, - this class only uses a precomputed 'shortcut' to suggest a probable result: - the most common zone in a rectangle of a half degree of latitude and one degree of longitude - """ - - def timezone_at(self, *, lng: float, lat: float) -> Optional[str]: - """instantly returns the name of the most common zone within the corresponding shortcut - - Note: 'most common' in this context means that the polygons with the most coordinates in sum - occurring in the corresponding shortcut belong to this zone. - - :param lng: longitude of the point in degree (-180.0 to 180.0) - :param lat: latitude in degree (90.0 to -90.0) - :return: the timezone name of the most common zone or None if there are no timezone polygons in this shortcut - """ - lng, lat = utils.validate_coordinates(lng, lat) - most_common_id = self.most_common_zone_id(lng=lng, lat=lat) - if most_common_id is None: - return None - return self.zone_name_from_id(most_common_id) - - -class TimezoneFinder(AbstractTimezoneFinder): - """Class for quickly finding the timezone of a point on earth offline. - - Because of indexing ("shortcuts"), not all timezone polygons have to be tested during a query. - - Opens the required timezone polygon data in binary files to enable fast access. - For a detailed documentation of data management please refer to the code documentation of - `file_converter.py <https://github.com/jannikmi/timezonefinder/blob/master/scripts/file_converter.py>`__ - - :ivar binary_data_attributes: the names of all attributes which store the opened binary data files - - :param bin_file_location: path to the binary data files to use, None if native package data should be used - :param in_memory: whether to completely read and keep the binary files in memory - """ - - # __slots__ declared in parents are available in child classes. However, child subclasses will get a __dict__ - # and __weakref__ unless they also define __slots__ (which should only contain names of any additional slots). - __slots__ = DATA_ATTRIBUTE_NAMES - - binary_data_attributes = BINARY_DATA_ATTRIBUTES - - def __init__(self, bin_file_location: Optional[str] = None, in_memory: bool = False): - super().__init__(bin_file_location, in_memory) - - # stores for which polygons (how many) holes exits and the id of the first of those holes - # since there are very few it is feasible to keep them in the memory - with open(self.bin_file_location / HOLE_REGISTRY_FILE) as json_file: - hole_registry_tmp = json.loads(json_file.read()) - - # convert the json string keys to int - hole_registry = {int(k): v for k, v in hole_registry_tmp.items()} - setattr(self, HOLE_REGISTRY, hole_registry) - - @property - def nr_of_polygons(self) -> int: - poly_zone_ids = getattr(self, POLY_ZONE_IDS) - return utils.get_file_size_byte(poly_zone_ids) // NR_BYTES_H - - def coords_of(self, polygon_nr: int = 0) -> np.ndarray: - poly_coord_amount = getattr(self, POLY_COORD_AMOUNT) - poly_adr2data = getattr(self, POLY_ADR2DATA) - poly_data = getattr(self, POLY_DATA) - - # how many coordinates are stored in this polygon - poly_coord_amount.seek(NR_BYTES_I * polygon_nr) - nr_of_values = unpack(DTYPE_FORMAT_I, poly_coord_amount.read(NR_BYTES_I))[0] - - poly_adr2data.seek(NR_BYTES_I * polygon_nr) - poly_data.seek(unpack(DTYPE_FORMAT_I, poly_adr2data.read(NR_BYTES_I))[0]) - return np.stack( - ( - self._fromfile(poly_data, dtype=DTYPE_FORMAT_SIGNED_I_NUMPY, count=nr_of_values), - self._fromfile(poly_data, dtype=DTYPE_FORMAT_SIGNED_I_NUMPY, count=nr_of_values), - ) - ) - - def _holes_of_poly(self, polygon_nr: int): - hole_coord_amount = getattr(self, HOLE_COORD_AMOUNT) - hole_adr2data = getattr(self, HOLE_ADR2DATA) - hole_data = getattr(self, HOLE_DATA) - hole_registry = getattr(self, HOLE_REGISTRY) - - try: - amount_of_holes, first_hole_id = hole_registry[polygon_nr] - except KeyError: - return - - hole_coord_amount.seek(NR_BYTES_H * first_hole_id) - hole_adr2data.seek(NR_BYTES_I * first_hole_id) - - for _ in range(amount_of_holes): - nr_of_values = unpack(DTYPE_FORMAT_H, hole_coord_amount.read(NR_BYTES_H))[0] - hole_data.seek(unpack(DTYPE_FORMAT_I, hole_adr2data.read(NR_BYTES_I))[0]) - - x_coords = self._fromfile(hole_data, dtype=DTYPE_FORMAT_SIGNED_I_NUMPY, count=nr_of_values) - y_coords = self._fromfile(hole_data, dtype=DTYPE_FORMAT_SIGNED_I_NUMPY, count=nr_of_values) - yield np.array( - [ - x_coords, - y_coords, - ] - ) - - def get_polygon(self, polygon_nr: int, coords_as_pairs: bool = False) -> List[Union[CoordPairs, CoordLists]]: - list_of_converted_polygons = [] - if coords_as_pairs: - conversion_method = utils.convert2coord_pairs - else: - conversion_method = utils.convert2coords - list_of_converted_polygons.append(conversion_method(self.coords_of(polygon_nr=polygon_nr))) - - for hole in self._holes_of_poly(polygon_nr): - list_of_converted_polygons.append(conversion_method(hole)) - - return list_of_converted_polygons - - def get_geometry( - self, - tz_name: Optional[str] = "", - tz_id: Optional[int] = 0, - use_id: bool = False, - coords_as_pairs: bool = False, - ): - """retrieves the geometry of a timezone polygon - - :param tz_name: one of the names in ``timezone_names.json`` or ``self.timezone_names`` - :param tz_id: the id of the timezone (=index in ``self.timezone_names``) - :param use_id: if ``True`` uses ``tz_id`` instead of ``tz_name`` - :param coords_as_pairs: determines the structure of the polygon representation - :return: a data structure representing the multipolygon of this timezone - output format: ``[ [polygon1, hole1, hole2...], [polygon2, ...], ...]`` - and each polygon and hole is itself formatted like: ``([longitudes], [latitudes])`` - or ``[(lng1,lat1), (lng2,lat2),...]`` if ``coords_as_pairs=True``. - """ - - if use_id: - if not isinstance(tz_id, int): - raise TypeError("the zone id must be given as int.") - if tz_id < 0 or tz_id >= self.nr_of_zones: - raise ValueError(f"the given zone id {tz_id} is invalid (value range: 0 - {self.nr_of_zones - 1}.") - else: - try: - tz_id = self.timezone_names.index(tz_name) - except ValueError: - raise ValueError("The timezone '", tz_name, "' does not exist.") - if tz_id is None: - raise ValueError("no timezone id given.") - poly_id2zone_id = getattr(self, POLY_NR2ZONE_ID) - poly_id2zone_id.seek(NR_BYTES_H * tz_id) - # read poly_id of the first polygon of that zone - this_zone_poly_id = unpack(DTYPE_FORMAT_H, poly_id2zone_id.read(NR_BYTES_H))[0] - # read poly_id of the first polygon of the consequent zone - # (also exists for the last zone, cf. file_converter.py) - next_zone_poly_id = unpack(DTYPE_FORMAT_H, poly_id2zone_id.read(NR_BYTES_H))[0] - # read and return all polygons from this zone: - return [self.get_polygon(poly_id, coords_as_pairs) for poly_id in range(this_zone_poly_id, next_zone_poly_id)] - - def outside_the_boundaries_of(self, poly_id: int, x: int, y: int) -> bool: - # get the boundaries of the polygon = (lng_max, lng_min, lat_max, lat_min) converted to int32 - poly_max_values = getattr(self, POLY_MAX_VALUES) - poly_max_values.seek(4 * NR_BYTES_I * poly_id) - xmax, xmin, ymax, ymin = self._fromfile( - poly_max_values, - dtype=DTYPE_FORMAT_SIGNED_I_NUMPY, - count=4, - ) - return x > xmax or x < xmin or y > ymax or y < ymin - - def inside_of_polygon(self, poly_id: int, x: int, y: int) -> bool: - # only read polygon (hole) data on demand - # only run the expensive algorithm if the point is withing the boundaries - if self.outside_the_boundaries_of(poly_id, x, y): - return False - - if not inside_polygon(x, y, self.coords_of(polygon_nr=poly_id)): - return False - - # when the point is within a hole of the polygon, this timezone must not be returned - if any(iter(inside_polygon(x, y, hole) for hole in self._holes_of_poly(poly_id))): - return False - - # the query point is included in this polygon, but not any hole - return True - - def timezone_at(self, *, lng: float, lat: float) -> Optional[str]: - """computes in which ocean OR land timezone a point is included in - - Especially for large polygons it is expensive to check if a point is really included. - In case there is only one possible zone (left), this zone will instantly be returned without actually checking - if the query point is included in this polygon. - - To speed things up there are "shortcuts" being used - which have been precomputed and store which timezone polygons have to be checked. - - .. note:: Since ocean timezones span the whole globe, some timezone will always be matched! - `None` can only be returned when you have compiled timezone data without such "full coverage". - - :param lng: longitude of the point in degree (-180.0 to 180.0) - :param lat: latitude in degree (90.0 to -90.0) - :return: the timezone name of the matched timezone polygon. possibly "Etc/GMT+-XX" in case of an ocean timezone. - """ - lng, lat = utils.validate_coordinates(lng, lat) - possible_polygons = self.get_shortcut_polys(lng=lng, lat=lat) - nr_possible_polygons = len(possible_polygons) - if nr_possible_polygons == 0: - # Note: hypothetical case, with ocean data every shortcut maps to at least one polygon - return None - if nr_possible_polygons == 1: - # there is only one polygon in that area. return its timezone name without further checks - polygon_id = possible_polygons[0] - return self.zone_name_from_poly_id(polygon_id) - - # create a list of all the timezone ids of all possible polygons - zone_ids = self.zone_ids_of(possible_polygons) - - last_zone_change_idx = utils.get_last_change_idx(zone_ids) - if last_zone_change_idx == 0: - return self.zone_name_from_id(zone_ids[0]) - - # ATTENTION: the polygons are stored converted to 32-bit ints, - # convert the query coordinates in the same fashion in order to make the data formats match - # x = longitude y = latitude both converted to 8byte int - x = utils.coord2int(lng) - y = utils.coord2int(lat) - - # check until the point is included in one of the possible polygons - for i, poly_id in enumerate(possible_polygons): - if i >= last_zone_change_idx: - break - - if self.inside_of_polygon(poly_id, x, y): - zone_id = zone_ids[i] - return self.zone_name_from_id(zone_id) - - # since it is the last possible option, - # the polygons of the last possible zone don't actually have to be checked - zone_id = zone_ids[-1] - return self.zone_name_from_id(zone_id) - - def certain_timezone_at(self, *, lng: float, lat: float) -> Optional[str]: - """checks in which timezone polygon the point is certainly included in - - .. note:: this is only meaningful when you have compiled your own timezone data - where there are areas without timezone polygon coverage. - Otherwise some timezone will always be matched and the functionality is equal to using `.timezone_at()` - -> useless to actually test all polygons. - - .. note:: using this function is less performant than `.timezone_at()` - - :param lng: longitude of the point in degree - :param lat: latitude in degree - :return: the timezone name of the polygon the point is included in or `None` - """ - lng, lat = utils.validate_coordinates(lng, lat) - possible_polygons = self.get_shortcut_polys(lng=lng, lat=lat) - nr_possible_polygons = len(possible_polygons) - - if nr_possible_polygons == 0: - # Note: hypothetical case, with ocean data every shortcut maps to at least one polygon - return None - - # ATTENTION: the polygons are stored converted to 32-bit ints, - # convert the query coordinates in the same fashion in order to make the data formats match - # x = longitude y = latitude both converted to 8byte int - x = utils.coord2int(lng) - y = utils.coord2int(lat) - - # check if the query point is found to be truly included in one of the possible polygons - for poly_id in possible_polygons: - if self.inside_of_polygon(poly_id, x, y): - zone_id = self.zone_id_of(poly_id) - return self.zone_name_from_id(zone_id) - - # none of the polygon candidates truly matched - return None diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/utils.py b/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/utils.py deleted file mode 100755 index 231699fe..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/python3.11/site-packages/timezonefinder/utils.py +++ /dev/null @@ -1,280 +0,0 @@ -""" utility functions - -JIT compiled for efficiency in case `numba` is installed - -Pending: -Numba Ahead-Of-Time Compilation: -cc = CC('precompiled_helpers', ) -# Uncomment the following line to print out the compilation steps -cc.verbose = True - -if __name__ == "__main__": - cc.compile() -""" -import io -import re -from typing import Callable, Tuple - -import cffi -import numpy as np -from numpy import int64 - -from timezonefinder.configs import ( - COORD2INT_FACTOR, - INT2COORD_FACTOR, - OCEAN_TIMEZONE_PREFIX, - CoordLists, - CoordPairs, - IntLists, -) - -try: - # Note: IDE might complain as this import comes from a cffi C extension - from timezonefinder import inside_polygon_ext # type: ignore - - clang_extension_loaded = True - ffi = cffi.FFI() - -except ImportError: - clang_extension_loaded = False - inside_polygon_ext = None - ffi = None - -try: - from numba import b1, f8, i2, i4, njit, u2 - - using_numba = True -except ImportError: - using_numba = False - # replace Numba functionality with "transparent" implementations - from timezonefinder._numba_replacements import b1, f8, i2, i4, njit, u2 - - -# @cc.export('inside_polygon', 'b1(i4, i4, i4[:, :])') -@njit(b1(i4, i4, i4[:, :]), cache=True) -def pt_in_poly_python(x: int, y: int, coords: np.ndarray) -> bool: - """ - Implementing the ray casting point in polygon test algorithm - cf. https://en.wikipedia.org/wiki/Point_in_polygon#Ray_casting_algorithm - :param x: - :param y: - :param coords: a polygon represented by a list containing two lists (x and y coordinates): - [ [x1,x2,x3...], [y1,y2,y3...]] - those lists are actually numpy arrays which are being read directly from a binary file - :return: true if the point (x,y) lies within the polygon - - Some overflow considerations for the critical part of comparing the line segment slopes: - - (y2 - y) * (x2 - x1) <= delta_y_max * delta_x_max - (y2 - y1) * (x2 - x) <= delta_y_max * delta_x_max - delta_y_max * delta_x_max = 180 * 360 < 65 x10^3 - - Instead of calculating with float I decided using just ints (by multiplying with 10^7). That gives us: - - delta_y_max * delta_x_max = 180x10^7 * 360x10^7 - delta_y_max * delta_x_max <= 65x10^17 - - So these numbers need up to log_2(65 x10^17) ~ 63 bits to be represented! Even though values this big should never - occur in practice (timezone polygons do not span the whole lng lat coordinate space), - 32bit accuracy hence is not safe to use here! - pure Python automatically uses the appropriate int data type preventing overflow - (cf. https://www.python.org/dev/peps/pep-0237/), - but here the data types are numpy internal static data types. The data is stored as int32 - -> use int64 when comparing slopes! - - slower naive implementation: - j = nr_coords - 1 - for i in range(nr_coords): - if ((y_coords[i] > y) != (y_coords[j] > y)) and ( - x - < (int64(x_coords[j]) - int64(x_coords[i])) - * (int64(y) - int64(y_coords[i])) - / (int64(y_coords[j]) - int64(y_coords[i])) - + int64(x_coords[i]) - ): - inside = not inside - j = i - i += 1 - """ - x_coords = coords[0] - y_coords = coords[1] - nr_coords = len(x_coords) - inside = False - - # the edge from the last to the first point is checked first - y1 = y_coords[-1] - y_gt_y1 = y > y1 - for i in range(nr_coords): - y2 = y_coords[i] - y_gt_y2 = y > y2 - if y_gt_y1 ^ y_gt_y2: # XOR - # [p1-p2] crosses horizontal line in p - x1 = x_coords[i - 1] - x2 = x_coords[i] - # only count crossings "right" of the point ( >= x) - x_le_x1 = x <= x1 - x_le_x2 = x <= x2 - if x_le_x1 or x_le_x2: - if x_le_x1 and x_le_x2: - # p1 and p2 are both to the right -> valid crossing - inside = not inside - else: - # compare the slope of the line [p1-p2] and [p-p2] - # depending on the position of p2 this determines whether - # the polygon edge is right or left of the point - # to avoid expensive division the divisors (of the slope dy/dx) are brought to the other side - # ( dy/dx > a == dy > a * dx ) - # only one of the points is to the right - # NOTE: int64 precision required to prevent overflow - y_64 = int64(y) - y1_64 = int64(y1) - y2_64 = int64(y2) - x_64 = int64(x) - x1_64 = int64(x1) - x2_64 = int64(x2) - slope1 = (y2_64 - y_64) * (x2_64 - x1_64) - slope2 = (y2_64 - y1_64) * (x2_64 - x_64) - # NOTE: accept slope equality to also detect if p lies directly on an edge - if y_gt_y1: - if slope1 <= slope2: - inside = not inside - elif slope1 >= slope2: # NOT y_gt_y1 - inside = not inside - - # next point - y1 = y2 - y_gt_y1 = y_gt_y2 - - return inside - - -def pt_in_poly_clang(x: int, y: int, coords: np.ndarray) -> bool: - """wrapper of the point in polygon test algorithm C extension - - ATTENTION: the input numpy arrays must have a C_CONTIGUOUS memory layout - https://numpy.org/doc/stable/reference/generated/numpy.ascontiguousarray.html?highlight=ascontiguousarray#numpy.ascontiguousarray - """ - x_coords = coords[0] - y_coords = coords[1] - nr_coords = len(x_coords) - - y_coords = np.ascontiguousarray(y_coords) - x_coords = np.ascontiguousarray(x_coords) - x_coords_ffi = ffi.from_buffer("int []", x_coords) - y_coords_ffi = ffi.from_buffer("int []", y_coords) - contained = inside_polygon_ext.lib.inside_polygon_int(x, y, nr_coords, x_coords_ffi, y_coords_ffi) - return contained - - -inside_polygon: Callable[[int, int, np.ndarray], bool] -# at import time fix which "point-in-polygon" implementation will be used -if clang_extension_loaded and not using_numba: - # use the C implementation if Numba is not present - inside_polygon = pt_in_poly_clang -else: - # use the (JIT compiled) python function if Numba is present or the C extension cannot be loaded - inside_polygon = pt_in_poly_python - - -@njit(i2(u2[:]), cache=True) -def get_last_change_idx(lst: np.ndarray) -> int: - """ - :param lst: list of entries - :return: returns the index to the element for which all following elements are equal - """ - nr_entries = lst.shape[0] - if nr_entries <= 1: - return 0 - # at least 2 elements - last_elem = lst[-1] - for ptr in range(2, nr_entries + 1): - # Note: from the back - element = lst[-ptr] - if element != last_elem: - # return the last pointer value - # Attention: convert into positive "absolute" index first - return nr_entries - ptr + 1 - # Note: all entries are the same -> ptr will be 0 - return 0 - - -# @cc.export('int2coord', f8(i4)) -@njit(f8(i4), cache=True) -def int2coord(i4: int) -> float: - return float(i4 * INT2COORD_FACTOR) - - -# @cc.export('coord2int', i4(f8)) -@njit(i4(f8), cache=True) -def coord2int(double: float) -> int: - return int(double * COORD2INT_FACTOR) - - -@njit(cache=True) -def convert2coords(polygon_data: np.ndarray) -> CoordLists: - # return a tuple of coordinate lists - return [ - [int2coord(x) for x in polygon_data[0]], - [int2coord(y) for y in polygon_data[1]], - ] - - -@njit(cache=True) -def convert2coord_pairs(polygon_data: np.ndarray) -> CoordPairs: - # return a list of coordinate tuples (x,y) - x_coords = polygon_data[0] - y_coords = polygon_data[1] - nr_coords = len(x_coords) - coodinate_list = [(int2coord(x_coords[i]), int2coord(y_coords[i])) for i in range(nr_coords)] - return coodinate_list - - -@njit(cache=True) -def convert2ints(polygon_data: np.ndarray) -> IntLists: - # return a tuple of coordinate lists - return [ - [coord2int(x) for x in polygon_data[0]], - [coord2int(y) for y in polygon_data[1]], - ] - - -@njit(cache=True) -def any_pt_in_poly(coords1: np.ndarray, coords2: np.ndarray) -> bool: - # pt = points[:, i] - for pt in coords1.T: - if pt_in_poly_python(pt[0], pt[1], coords2): - return True - return False - - -@njit(cache=True) -def fully_contained_in_hole(poly: np.ndarray, hole: np.ndarray) -> bool: - for pt in poly.T: - if not pt_in_poly_python(pt[0], pt[1], hole): - return False - return True - - -def validate_coordinates(lng: float, lat: float) -> Tuple[float, float]: - if not -180.0 <= lng <= 180.0: - raise ValueError(f"The given longitude {lng} is out of bounds") - if not -90.0 <= lat <= 90.0: - raise ValueError(f"The given latitude {lat} is out of bounds") - return float(lng), float(lat) - - -def get_file_size_byte(file) -> int: - file.seek(0, io.SEEK_END) - return file.tell() - - -def fromfile_memory(file, dtype: str, count: int, **kwargs): - res = np.frombuffer(file.getbuffer(), offset=file.tell(), dtype=dtype, count=count, **kwargs) - file.seek(np.dtype(dtype).itemsize * count, io.SEEK_CUR) - return res - - -def is_ocean_timezone(timezone_name: str) -> bool: - if re.match(OCEAN_TIMEZONE_PREFIX, timezone_name) is None: - return False - return True diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/systemd/system/mycroft-admin-phal.service b/buildroot-external/rootfs-overlay/base/usr/lib/systemd/system/mycroft-admin-phal.service deleted file mode 100644 index 2fb67569..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/systemd/system/mycroft-admin-phal.service +++ /dev/null @@ -1,16 +0,0 @@ -[Unit] -Description=Admin PHAL - -[Service] -#Type=notify -ExecStart=/usr/libexec/mycroft-systemd-admin-phal -#TimeoutStartSec=1m -#TimeoutStopSec=1m -Restart=on-failure -#StartLimitInterval=5min -#StartLimitBurst=4 -#StartLimitAction=reboot-force -#WatchdogSec=30s - -[Install] -WantedBy=multi-user.target diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/systemd/system/ovos.target b/buildroot-external/rootfs-overlay/base/usr/lib/systemd/system/ovos.target deleted file mode 100644 index beee30b4..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/systemd/system/ovos.target +++ /dev/null @@ -1,8 +0,0 @@ -[Unit] -Description=OpenVoiceOS - Mycroft GUI Interface -Documentation=man:systemd.special(7) -Requires=multi-user.target -Wants=mycroft-gui.service -Conflicts=rescue.service rescue.target -After=multi-user.target rescue.service rescue.target -AllowIsolate=yes diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/systemd/system/pulseaudio.service b/buildroot-external/rootfs-overlay/base/usr/lib/systemd/system/pulseaudio.service deleted file mode 100644 index 322c641e..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/systemd/system/pulseaudio.service +++ /dev/null @@ -1,12 +0,0 @@ -[Unit] -Description=PulseAudio Sound System -After=syslog.target -After=avahi-daemon.service network.target - -[Service] -ExecStart=/usr/bin/pulseaudio --system --daemonize=no -Restart=always - -[Install] -WantedBy=multi-user.target - diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/systemd/system/shairport-sync.service b/buildroot-external/rootfs-overlay/base/usr/lib/systemd/system/shairport-sync.service deleted file mode 100644 index 3e713c67..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/systemd/system/shairport-sync.service +++ /dev/null @@ -1,21 +0,0 @@ -[Unit] -Description=Shairport-sync -Wants=sound.target -After=sound.target -Wants=network-online.target -After=network-online.target -After=pulseaudio.service -Requires=avahi-daemon.service -After=avahi-daemon.service - -[Service] -Type=simple -User=mycroft -# Avahi daemon needs some time until fully ready -ExecStartPre=/bin/sleep 3 -ExecStart=/usr/bin/shairport-sync -Restart=always -RestartSec=5 - -[Install] -WantedBy=multi-user.target diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/systemd/user-preset/10-ovos-base.preset b/buildroot-external/rootfs-overlay/base/usr/lib/systemd/user-preset/10-ovos-base.preset deleted file mode 100644 index 3b00f29a..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/systemd/user-preset/10-ovos-base.preset +++ /dev/null @@ -1,17 +0,0 @@ -enable pulseaudio.service -enable pulseaudio.socket - -enable mycroft.service -enable mycroft-messagebus.service -enable mycroft-voice.service -enable mycroft-audio.service -enable mycroft-skills.service -enable mycroft-gui.service -enable mycroft-enclosure-gui.service -enable mycroft-phal.service - -disable local-backend.service - -enable kdeconnectd.service -enable shairport-sync.service -enable spotifyd.service diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/systemd/user/kdeconnectd.service b/buildroot-external/rootfs-overlay/base/usr/lib/systemd/user/kdeconnectd.service deleted file mode 100644 index 039c892a..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/systemd/user/kdeconnectd.service +++ /dev/null @@ -1,14 +0,0 @@ -[Unit] -Description=Connect your OVOS-Device to your smartphone or tablet -Wants=sound.target -After=sound.target -Wants=network-online.target -After=network-online.target -After=pulseaudio.service - -[Service] -ExecStart=/usr/lib/libexec/kdeconnectd -platform offscreen -BusName=org.kde.kdeconnect - -[Install] -WantedBy=default.target diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/systemd/user/local-backend.service b/buildroot-external/rootfs-overlay/base/usr/lib/systemd/user/local-backend.service deleted file mode 100644 index 7faf2c44..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/systemd/user/local-backend.service +++ /dev/null @@ -1,20 +0,0 @@ -[Unit] -Description=Mycroft Skills -PartOf=mycroft.service -After=mycroft.service -After=mycroft-messagebus.service - -[Service] -ExecStart=ovos-local-backend -StandardOutput=append:/home/mycroft/.local/state/mycroft/local-backend.log -#StandardError=file:/home/mycroft/.local/state/mycroft/local-backend.error.log -TimeoutStartSec=10m -TimeoutStopSec=1m -Restart=on-failure -StartLimitInterval=5min -StartLimitBurst=4 -#StartLimitAction=reboot-force -#WatchdogSec=30s - -[Install] -WantedBy=mycroft.service diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/systemd/user/mycroft-audio.service b/buildroot-external/rootfs-overlay/base/usr/lib/systemd/user/mycroft-audio.service deleted file mode 100644 index 0d3dd996..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/systemd/user/mycroft-audio.service +++ /dev/null @@ -1,23 +0,0 @@ -[Unit] -Description=Mycroft Audio -PartOf=mycroft.service -After=mycroft.service -After=mycroft-messagebus.service -After=pulseaudio.service - -[Service] -Type=notify -ExecStart=/usr/libexec/mycroft-systemd-audio -#StandardOutput=append:/var/log/mycroft/audio.log -#StandardError=append:/var/log/mycroft/audio.error.log -TimeoutStartSec=1m -TimeoutStopSec=1m -Restart=on-failure -StartLimitInterval=5min -StartLimitBurst=4 -#StartLimitAction=reboot-force -#WatchdogSec=30s - -[Install] -WantedBy=mycroft.service - diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/systemd/user/mycroft-messagebus.service b/buildroot-external/rootfs-overlay/base/usr/lib/systemd/user/mycroft-messagebus.service deleted file mode 100644 index e83b6b88..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/systemd/user/mycroft-messagebus.service +++ /dev/null @@ -1,20 +0,0 @@ -[Unit] -Description=Mycroft Messagebus -PartOf=mycroft.service -After=mycroft.service - -[Service] -Type=notify -ExecStart=/usr/libexec/mycroft-systemd-messagebus -#StandardOutput=append:/var/log/mycroft/messagebus.log -#StandardError=append:/var/log/mycroft/messagebus.error.log -TimeoutStartSec=1m -TimeoutStopSec=1m -Restart=on-failure -StartLimitInterval=5min -StartLimitBurst=4 -#StartLimitAction=reboot-force -#WatchdogSec=30s - -[Install] -WantedBy=mycroft.service diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/systemd/user/mycroft-phal.service b/buildroot-external/rootfs-overlay/base/usr/lib/systemd/user/mycroft-phal.service deleted file mode 100644 index 3aa21783..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/systemd/user/mycroft-phal.service +++ /dev/null @@ -1,22 +0,0 @@ -[Unit] -Description=Mycroft PHAL -PartOf=mycroft.service -After=mycroft.service -After=mycroft-messagebus.service -After=pulseaudio.service - -[Service] -Type=notify -ExecStart=/usr/libexec/mycroft-systemd-phal -#StandardOutput=append:/var/log/mycroft/phal.log -#StandardError=append:/var/log/mycroft/phal.error.log -TimeoutStartSec=1m -TimeoutStopSec=1m -Restart=on-failure -StartLimitInterval=5min -StartLimitBurst=4 -#StartLimitAction=reboot-force -#WatchdogSec=30s - -[Install] -WantedBy=mycroft.service diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/systemd/user/mycroft-skills.service b/buildroot-external/rootfs-overlay/base/usr/lib/systemd/user/mycroft-skills.service deleted file mode 100644 index f0a9d68e..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/systemd/user/mycroft-skills.service +++ /dev/null @@ -1,22 +0,0 @@ -[Unit] -Description=Mycroft Skills -PartOf=mycroft.service -After=mycroft.service -After=mycroft-messagebus.service -After=pulseaudio.service - -[Service] -Type=notify -ExecStart=/usr/libexec/mycroft-systemd-skills -#StandardOutput=append:/var/log/mycroft/skills.log -#StandardError=append:/var/log/mycroft/skills.error.log -TimeoutStartSec=10m -TimeoutStopSec=1m -Restart=on-failure -StartLimitInterval=5min -StartLimitBurst=4 -#StartLimitAction=reboot-force -#WatchdogSec=30s - -[Install] -WantedBy=mycroft.service diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/systemd/user/mycroft-voice.service b/buildroot-external/rootfs-overlay/base/usr/lib/systemd/user/mycroft-voice.service deleted file mode 100644 index 5f8ff050..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/systemd/user/mycroft-voice.service +++ /dev/null @@ -1,23 +0,0 @@ -[Unit] -Description=Mycroft Voice -PartOf=mycroft.service -After=mycroft.service -After=mycroft-messagebus.service -After=pulseaudio.service - -[Service] -Type=notify -ExecStart=/usr/libexec/mycroft-systemd-voice -#StandardOutput=append:/var/log/mycroft/voice.log -#StandardError=append:/var/log/mycroft/voice.error.log -TimeoutStartSec=1m -TimeoutStopSec=1m -Restart=on-failure -Restart=on-failure -StartLimitInterval=5min -StartLimitBurst=4 -#StartLimitAction=reboot-force -#WatchdogSec=30s - -[Install] -WantedBy=mycroft.service diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/systemd/user/mycroft.service b/buildroot-external/rootfs-overlay/base/usr/lib/systemd/user/mycroft.service deleted file mode 100644 index 05023c24..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/systemd/user/mycroft.service +++ /dev/null @@ -1,10 +0,0 @@ -[Unit] -Description=Mycroft A.I. Software stack. - -[Service] -Type=oneshot -ExecStart=/bin/true -RemainAfterExit=yes - -[Install] -WantedBy=default.target diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/systemd/user/pulseaudio.service b/buildroot-external/rootfs-overlay/base/usr/lib/systemd/user/pulseaudio.service deleted file mode 100644 index 8a6cf4eb..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/systemd/user/pulseaudio.service +++ /dev/null @@ -1,35 +0,0 @@ -[Unit] -Description=Sound Service - -# We require pulseaudio.socket to be active before starting the daemon, because -# while it is possible to use the service without the socket, it is not clear -# why it would be desirable. -# -# A user installing pulseaudio and doing `systemctl --user start pulseaudio` -# will not get the socket started, which might be confusing and problematic if -# the server is to be restarted later on, as the client autospawn feature -# might kick in. Also, a start of the socket unit will fail, adding to the -# confusion. -# -# After=pulseaudio.socket is not needed, as it is already implicit in the -# socket-service relationship, see systemd.socket(5). -Requires=pulseaudio.socket -ConditionUser=!root - -[Service] -ExecStart=/usr/bin/pulseaudio --daemonize=no --log-target=journal -LockPersonality=yes -MemoryDenyWriteExecute=yes -NoNewPrivileges=yes -RestartSec=5 -Restart=on-failure -RestrictNamespaces=yes -SystemCallArchitectures=native -SystemCallFilter=@system-service -# Note that notify will only work if --daemonize=no -Type=notify -UMask=0077 - -[Install] -Also=pulseaudio.socket -WantedBy=default.target diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/systemd/user/shairport-sync.service b/buildroot-external/rootfs-overlay/base/usr/lib/systemd/user/shairport-sync.service deleted file mode 100644 index 34410f3f..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/systemd/user/shairport-sync.service +++ /dev/null @@ -1,15 +0,0 @@ -[Unit] -Description=Shairport-sync -After=sound.target -Wants=network-online.target -After=network-online.target -After=pulseaudio.service -After=avahi-daemon.service - -[Service] -ExecStart=/usr/bin/shairport-sync -c %h/.config/shairport-sync/shairport-sync.conf -Restart=always -RestartSec=5 - -[Install] -WantedBy=default.target diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/systemd/user/spotifyd.service b/buildroot-external/rootfs-overlay/base/usr/lib/systemd/user/spotifyd.service deleted file mode 100644 index 75b8b684..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/systemd/user/spotifyd.service +++ /dev/null @@ -1,16 +0,0 @@ -[Unit] -Description=A Spotify connect daemon -Documentation=https://github.com/Spotifyd/spotifyd -Wants=sound.target -After=sound.target -Wants=network-online.target -After=network-online.target -After=pulseaudio.service - -[Service] -ExecStart=/usr/bin/spotifyd --no-daemon -Restart=always -RestartSec=5 - -[Install] -WantedBy=default.target diff --git a/buildroot-external/rootfs-overlay/base/usr/lib/udev/rules.d/usbmount.rules b/buildroot-external/rootfs-overlay/base/usr/lib/udev/rules.d/usbmount.rules deleted file mode 100644 index 8c16632c..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/lib/udev/rules.d/usbmount.rules +++ /dev/null @@ -1,19 +0,0 @@ -# Rules for USBmount -*- conf -*- - -# Do not auto mount our own system partitions -ENV{ID_PART_ENTRY_NAME}=="boot", GOTO="END" -ENV{ID_PART_ENTRY_UUID}=="9262aee5-2d23-4e09-baac-280591e2e834", GOTO="END" -ENV{ID_PART_ENTRY_NAME}=="rootfs", GOTO="END" -ENV{ID_PART_ENTRY_UUID}=="c0932a41-44cf-463b-8152-d43188553ed4", GOTO="END" -ENV{ID_PART_ENTRY_NAME}=="overlayfs", GOTO="END" -ENV{ID_PART_ENTRY_UUID}=="f1326040-5236-40eb-b683-aaa100a9afcf", GOTO="END" - -KERNEL=="sd*", DRIVERS=="sbp2", ACTION=="add", RUN+="/usr/share/usbmount/usbmount add" -KERNEL=="sd*", SUBSYSTEM=="block", ACTION=="add", RUN+="/usr/share/usbmount/usbmount add" -KERNEL=="ub*", SUBSYSTEM=="block", ACTION=="add", RUN+="/usr/share/usbmount/usbmount add" -KERNEL=="mmcblk*", SUBSYSTEM=="block", ACTION=="add", RUN+="/usr/share/usbmount/usbmount add" -KERNEL=="sd*", ACTION=="remove", RUN+="/usr/share/usbmount/usbmount remove" -KERNEL=="ub*", ACTION=="remove", RUN+="/usr/share/usbmount/usbmount remove" -KERNEL=="mmcblk*", ACTION=="remove", RUN+="/usr/share/usbmount/usbmount remove" - -LABEL="END" diff --git a/buildroot-external/rootfs-overlay/base/usr/libexec/mycroft-systemd-admin-phal b/buildroot-external/rootfs-overlay/base/usr/libexec/mycroft-systemd-admin-phal deleted file mode 100755 index a6513fd6..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/libexec/mycroft-systemd-admin-phal +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env python -########################################################################## -# mycroft-systemd_enclosure.py -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -########################################################################## -import sdnotify -from ovos_PHAL.admin import main - -n = sdnotify.SystemdNotifier() - -def notify_ready(): - n.notify('READY=1') - print('Startup of admin PHAL service complete') - -def notify_stopping(): - n.notify('STOPPING=1') - print('Stopping the admin PHAL service') - -main(ready_hook=notify_ready, stopping_hook=notify_stopping) diff --git a/buildroot-external/rootfs-overlay/base/usr/libexec/mycroft-systemd-audio b/buildroot-external/rootfs-overlay/base/usr/libexec/mycroft-systemd-audio deleted file mode 100755 index b4d6af64..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/libexec/mycroft-systemd-audio +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env python -########################################################################## -# mycroft-systemd_audio.py -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -########################################################################## -import sdnotify -from mycroft.audio.__main__ import main - -n = sdnotify.SystemdNotifier() - -def notify_ready(): - n.notify('READY=1') - print('Startup of Mycroft Audio service complete') - -def notify_stopping(): - n.notify('STOPPING=1') - print('Stopping the Mycroft Audio service') - -main(ready_hook=notify_ready, stopping_hook=notify_stopping) diff --git a/buildroot-external/rootfs-overlay/base/usr/libexec/mycroft-systemd-messagebus b/buildroot-external/rootfs-overlay/base/usr/libexec/mycroft-systemd-messagebus deleted file mode 100755 index 49278b27..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/libexec/mycroft-systemd-messagebus +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env python -########################################################################## -# mycroft-systemd_messagebus.py -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -########################################################################## -import sdnotify -from mycroft.messagebus.service.__main__ import main - -n = sdnotify.SystemdNotifier() - -def notify_ready(): - n.notify('READY=1') - print('Startup of Mycroft Messagebus service complete') - -def notify_stopping(): - n.notify('STOPPING=1') - print('Stopping the Mycroft Messagebus service') - -main(ready_hook=notify_ready, stopping_hook=notify_stopping) diff --git a/buildroot-external/rootfs-overlay/base/usr/libexec/mycroft-systemd-phal b/buildroot-external/rootfs-overlay/base/usr/libexec/mycroft-systemd-phal deleted file mode 100755 index 40ed4c37..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/libexec/mycroft-systemd-phal +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env python -########################################################################## -# mycroft-systemd_enclosure.py -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -########################################################################## -import sdnotify -from ovos_PHAL.__main__ import main - -n = sdnotify.SystemdNotifier() - -def notify_ready(): - n.notify('READY=1') - print('Startup of Mycroft Enclosure Client service complete') - -def notify_stopping(): - n.notify('STOPPING=1') - print('Stopping the Mycroft Enclosure Client service') - -main(ready_hook=notify_ready, stopping_hook=notify_stopping) diff --git a/buildroot-external/rootfs-overlay/base/usr/libexec/mycroft-systemd-skills b/buildroot-external/rootfs-overlay/base/usr/libexec/mycroft-systemd-skills deleted file mode 100755 index 02aab4e4..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/libexec/mycroft-systemd-skills +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env python -########################################################################## -# mycroft-systemd_skills.py -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -########################################################################## -import sdnotify -from mycroft.skills.__main__ import main - -n = sdnotify.SystemdNotifier() - -def notify_ready(): - n.notify('READY=1') - print('Startup of Mycroft Skills service complete') - -def notify_stopping(): - n.notify('STOPPING=1') - print('Stopping the Mycroft Skills service') - -main(ready_hook=notify_ready, stopping_hook=notify_stopping) diff --git a/buildroot-external/rootfs-overlay/base/usr/libexec/mycroft-systemd-voice b/buildroot-external/rootfs-overlay/base/usr/libexec/mycroft-systemd-voice deleted file mode 100755 index fd0b36ee..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/libexec/mycroft-systemd-voice +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env python -########################################################################## -# mycroft-systemd_voice.py -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -########################################################################## -import sdnotify -from mycroft.client.speech.__main__ import main - -n = sdnotify.SystemdNotifier() - -def notify_ready(): - n.notify('READY=1') - print('Startup of Mycroft Voice service complete') - -def notify_stopping(): - n.notify('STOPPING=1') - print('Stopping the Mycroft Voice service') - -main(ready_hook=notify_ready, stopping_hook=notify_stopping) diff --git a/buildroot-external/rootfs-overlay/base/usr/local/share/wifi-connect/ui/asset-manifest.json b/buildroot-external/rootfs-overlay/base/usr/local/share/wifi-connect/ui/asset-manifest.json deleted file mode 100644 index caf283dc..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/local/share/wifi-connect/ui/asset-manifest.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "files": { - "main.js": "/static/js/main.2b22a9e9.chunk.js", - "runtime-main.js": "/static/js/runtime-main.2a78626f.js", - "static/css/2.c38cd9da.chunk.css": "/static/css/2.c38cd9da.chunk.css", - "static/js/2.ef060f46.chunk.js": "/static/js/2.ef060f46.chunk.js", - "index.html": "/index.html", - "precache-manifest.96ed21ec05e3b25e96ee640119b0334b.js": "/precache-manifest.96ed21ec05e3b25e96ee640119b0334b.js", - "service-worker.js": "/service-worker.js", - "static/js/2.ef060f46.chunk.js.LICENSE.txt": "/static/js/2.ef060f46.chunk.js.LICENSE.txt", - "static/media/logo.svg": "/static/media/logo.34c0c94e.svg" - }, - "entrypoints": [ - "static/js/runtime-main.2a78626f.js", - "static/css/2.c38cd9da.chunk.css", - "static/js/2.ef060f46.chunk.js", - "static/js/main.2b22a9e9.chunk.js" - ] -} \ No newline at end of file diff --git a/buildroot-external/rootfs-overlay/base/usr/local/share/wifi-connect/ui/index.html b/buildroot-external/rootfs-overlay/base/usr/local/share/wifi-connect/ui/index.html deleted file mode 100644 index a91af653..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/local/share/wifi-connect/ui/index.html +++ /dev/null @@ -1 +0,0 @@ -<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="shortcut icon" href="/static/favicon.png"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><link rel="manifest" href="/static/manifest.json"/><title>WiFi Connect
\ No newline at end of file diff --git a/buildroot-external/rootfs-overlay/base/usr/local/share/wifi-connect/ui/precache-manifest.96ed21ec05e3b25e96ee640119b0334b.js b/buildroot-external/rootfs-overlay/base/usr/local/share/wifi-connect/ui/precache-manifest.96ed21ec05e3b25e96ee640119b0334b.js deleted file mode 100644 index 0d154b44..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/local/share/wifi-connect/ui/precache-manifest.96ed21ec05e3b25e96ee640119b0334b.js +++ /dev/null @@ -1,30 +0,0 @@ -self.__precacheManifest = (self.__precacheManifest || []).concat([ - { - "revision": "210cdfec75f8819cf88af6d7c1143fa7", - "url": "/index.html" - }, - { - "revision": "bef5f9e0837401d4a7df", - "url": "/static/css/2.c38cd9da.chunk.css" - }, - { - "revision": "bef5f9e0837401d4a7df", - "url": "/static/js/2.ef060f46.chunk.js" - }, - { - "revision": "28ce00ad444b69bea42850e06eec9da3", - "url": "/static/js/2.ef060f46.chunk.js.LICENSE.txt" - }, - { - "revision": "c0cd579ca18a0480cc24", - "url": "/static/js/main.2b22a9e9.chunk.js" - }, - { - "revision": "0e903404fe668039b1a7", - "url": "/static/js/runtime-main.2a78626f.js" - }, - { - "revision": "34c0c94e712ddb861346d68dfb00ab87", - "url": "/static/media/logo.34c0c94e.svg" - } -]); \ No newline at end of file diff --git a/buildroot-external/rootfs-overlay/base/usr/local/share/wifi-connect/ui/service-worker.js b/buildroot-external/rootfs-overlay/base/usr/local/share/wifi-connect/ui/service-worker.js deleted file mode 100644 index b796d4ba..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/local/share/wifi-connect/ui/service-worker.js +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Welcome to your Workbox-powered service worker! - * - * You'll need to register this file in your web app and you should - * disable HTTP caching for this file too. - * See https://goo.gl/nhQhGp - * - * The rest of the code is auto-generated. Please don't update this file - * directly; instead, make changes to your Workbox build configuration - * and re-run your build process. - * See https://goo.gl/2aRDsh - */ - -importScripts("https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js"); - -importScripts( - "/precache-manifest.96ed21ec05e3b25e96ee640119b0334b.js" -); - -self.addEventListener('message', (event) => { - if (event.data && event.data.type === 'SKIP_WAITING') { - self.skipWaiting(); - } -}); - -workbox.core.clientsClaim(); - -/** - * The workboxSW.precacheAndRoute() method efficiently caches and responds to - * requests for URLs in the manifest. - * See https://goo.gl/S9QRab - */ -self.__precacheManifest = [].concat(self.__precacheManifest || []); -workbox.precaching.precacheAndRoute(self.__precacheManifest, {}); - -workbox.routing.registerNavigationRoute(workbox.precaching.getCacheKeyForURL("/index.html"), { - - blacklist: [/^\/_/,/\/[^\/?]+\.[^\/]+$/], -}); diff --git a/buildroot-external/rootfs-overlay/base/usr/local/share/wifi-connect/ui/static/css/2.c38cd9da.chunk.css b/buildroot-external/rootfs-overlay/base/usr/local/share/wifi-connect/ui/static/css/2.c38cd9da.chunk.css deleted file mode 100644 index bf9fe198..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/local/share/wifi-connect/ui/static/css/2.c38cd9da.chunk.css +++ /dev/null @@ -1 +0,0 @@ -code[class*=language-],pre[class*=language-]{color:#000;background:none;text-shadow:0 1px #fff;font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-]::selection,code[class*=language-] ::selection,pre[class*=language-]::selection,pre[class*=language-] ::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help} \ No newline at end of file diff --git a/buildroot-external/rootfs-overlay/base/usr/local/share/wifi-connect/ui/static/favicon.png b/buildroot-external/rootfs-overlay/base/usr/local/share/wifi-connect/ui/static/favicon.png deleted file mode 100644 index fb14f11e..00000000 Binary files a/buildroot-external/rootfs-overlay/base/usr/local/share/wifi-connect/ui/static/favicon.png and /dev/null differ diff --git a/buildroot-external/rootfs-overlay/base/usr/local/share/wifi-connect/ui/static/js/2.ef060f46.chunk.js b/buildroot-external/rootfs-overlay/base/usr/local/share/wifi-connect/ui/static/js/2.ef060f46.chunk.js deleted file mode 100644 index d36d6a1c..00000000 --- a/buildroot-external/rootfs-overlay/base/usr/local/share/wifi-connect/ui/static/js/2.ef060f46.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see 2.ef060f46.chunk.js.LICENSE.txt */ -(this["webpackJsonpwifi-connect-ui"]=this["webpackJsonpwifi-connect-ui"]||[]).push([[2],[function(e,t,n){"use strict";e.exports=n(484)},function(e,t,n){"use strict";n.r(t),function(e){n.d(t,"ServerStyleSheet",(function(){return Fe})),n.d(t,"StyleSheetConsumer",(function(){return Q})),n.d(t,"StyleSheetContext",(function(){return X})),n.d(t,"StyleSheetManager",(function(){return re})),n.d(t,"ThemeConsumer",(function(){return Ce})),n.d(t,"ThemeContext",(function(){return ke})),n.d(t,"ThemeProvider",(function(){return xe})),n.d(t,"__PRIVATE__",(function(){return Be})),n.d(t,"createGlobalStyle",(function(){return Le})),n.d(t,"css",(function(){return de})),n.d(t,"isStyledComponent",(function(){return E})),n.d(t,"keyframes",(function(){return Me})),n.d(t,"useTheme",(function(){return Ue})),n.d(t,"version",(function(){return He})),n.d(t,"withTheme",(function(){return je}));var r=n(77),a=n(0),i=n.n(a),o=n(426),s=n.n(o),l=n(427),c=n(428),u=n(477),d=n(266),p=n.n(d);function f(){return(f=Object.assign||function(e){for(var t=1;t1?t-1:0),r=1;r0?" Additional arguments: "+n.join(", "):""))}var k=function(e){var t=document.head,n=e||t,r=document.createElement("style"),a=function(e){for(var t=e.childNodes,n=t.length;n>=0;n--){var r=t[n];if(r&&1===r.nodeType&&r.hasAttribute(T))return r}}(n),i=void 0!==a?a.nextSibling:null;r.setAttribute(T,"active"),r.setAttribute("data-styled-version","5.0.1");var o=A();return o&&r.setAttribute("nonce",o),n.insertBefore(r,i),r},C=function(){function e(e){var t=this.element=k(e);t.appendChild(document.createTextNode("")),this.sheet=function(e){if(e.sheet)return e.sheet;for(var t=document.styleSheets,n=0,r=t.length;n=0){var n=document.createTextNode(t),r=this.nodes[e];return this.element.insertBefore(n,r||null),this.length++,!0}return!1},t.deleteRule=function(e){this.element.removeChild(this.nodes[e]),this.length--},t.getRule=function(e){return e=this.groupSizes.length){for(var n=this.groupSizes,r=n.length,a=r;e>=a;)(a<<=1)<0&&w(16,""+e);this.groupSizes=new Uint32Array(a),this.groupSizes.set(n),this.length=a;for(var i=r;i=this.length||0===this.groupSizes[e])return t;for(var n=this.groupSizes[e],r=this.indexOfGroup(e),a=r+n,i=r;i=D&&(D=t+1),R.set(e,t),P.set(t,e)},j="style["+T+'][data-styled-version="5.0.1"]',U=/(?:\s*)?(.*?){((?:{[^}]*}|(?!{).*?)*)}/g,B=new RegExp("^"+T+'\\.g(\\d+)\\[id="([\\w\\d-]+)"\\]'),H=function(e,t,n){for(var r,a=n.split(","),i=0,o=a.length;i0&&(c+=e+",")})),r+=""+s+l+'{content:"'+c+'"}\n'}}}return r}(this)},e}(),W=function(e,t){for(var n=t.length;n;)e=33*e^t.charCodeAt(--n);return e},K=function(e){return W(5381,e)};var q=/^\s*\/\/.*$/gm;function Y(e){var t,n,r,a=void 0===e?b:e,i=a.options,o=void 0===i?b:i,s=a.plugins,c=void 0===s?g:s,u=new l.a(o),d=[],p=function(e){function t(t){if(t)try{e(t+"}")}catch(n){}}return function(n,r,a,i,o,s,l,c,u,d){switch(n){case 1:if(0===u&&64===r.charCodeAt(0))return e(r+";"),"";break;case 2:if(0===c)return r+"/*|*/";break;case 3:switch(c){case 102:case 112:return e(a[0]+r),"";default:return r+(0===d?"/*|*/":"")}case-2:r.split("/*|*/}").forEach(t)}}}((function(e){d.push(e)})),f=function(e,r,a){return r>0&&-1!==a.slice(0,r).indexOf(n)&&a.slice(r-n.length,r)!==n?"."+t:e};function m(e,a,i,o){void 0===o&&(o="&");var s=e.replace(q,""),l=a&&i?i+" "+a+" { "+s+" }":s;return t=o,n=a,r=new RegExp("\\"+n+"\\b","g"),u(i||!a?"":a,l)}return u.use([].concat(c,[function(e,t,a){2===e&&a.length&&a[0].lastIndexOf(n)>0&&(a[0]=a[0].replace(r,f))},p,function(e){if(-2===e){var t=d;return d=[],t}}])),m.hash=c.length?c.reduce((function(e,t){return t.name||w(15),W(e,t.name)}),5381).toString():"",m}var X=i.a.createContext(),Q=X.Consumer,Z=i.a.createContext(),J=(Z.Consumer,new V),ee=Y();function te(){return Object(a.useContext)(X)||J}function ne(){return Object(a.useContext)(Z)||ee}function re(e){var t=Object(a.useState)(e.stylisPlugins),n=t[0],r=t[1],o=te(),l=Object(a.useMemo)((function(){var t=o;return e.sheet?t=e.sheet:e.target&&(t=t.reconstructWithOptions({target:e.target})),e.disableCSSOMInjection&&(t=t.reconstructWithOptions({useCSSOMInjection:!1})),t}),[e.disableCSSOMInjection,e.sheet,e.target]),c=Object(a.useMemo)((function(){return Y({options:{prefix:!e.disableVendorPrefixes},plugins:n})}),[e.disableVendorPrefixes,n]);return Object(a.useEffect)((function(){s()(n,e.stylisPlugins)||r(e.stylisPlugins)}),[e.stylisPlugins]),i.a.createElement(X.Provider,{value:l},i.a.createElement(Z.Provider,{value:c},e.children))}var ae=function(){function e(e,t){var n=this;this.inject=function(e){e.hasNameForId(n.id,n.name)||e.insertRules(n.id,n.name,ee.apply(void 0,n.stringifyArgs))},this.toString=function(){return w(12,String(n.name))},this.name=e,this.id="sc-keyframes-"+e,this.stringifyArgs=t}return e.prototype.getName=function(){return this.name},e}(),ie=/([A-Z])/g,oe=/^ms-/;function se(e){return e.replace(ie,"-$1").toLowerCase().replace(oe,"-ms-")}var le=function(e){return void 0===e||null===e||!1===e||""===e},ce=function e(t,n){var r=[];return Object.keys(t).forEach((function(n){if(!le(t[n])){if(h(t[n]))return r.push.apply(r,e(t[n],n)),r;if(v(t[n]))return r.push(se(n)+":",t[n],";"),r;r.push(se(n)+": "+(a=n,null==(i=t[n])||"boolean"===typeof i||""===i?"":"number"!==typeof i||0===i||a in c.a?String(i).trim():i+"px")+";")}var a,i;return r})),n?[n+" {"].concat(r,["}"]):r};function ue(e,t,n){if(Array.isArray(e)){for(var r,a=[],i=0,o=e.length;i1?t-1:0),r=1;r1?t-1:0),r=1;r25?39:97))};function ve(e){var t,n="";for(t=Math.abs(e);t>52;t=t/52|0)n=be(t%52)+n;return(be(t%52)+n).replace(ge,"$1-$2")}function ye(e){for(var t=0;t>>0);if(!t.hasNameForId(r,i)){var o=n(a,"."+i,void 0,r);t.insertRules(r,i,o)}return this.staticRulesId=i,i}for(var s=this.rules.length,l=W(this.baseHash,n.hash),c="",u=0;u>>0);if(!t.hasNameForId(r,m)){var h=n(c,"."+m,void 0,r);t.insertRules(r,m,h)}return m},e}(),Te=(new Set,function(e,t,n){return void 0===n&&(n=b),e.theme!==n.theme&&e.theme||t||n.theme}),_e=/[[\].#*$><+~=|^:(),"'`-]+/g,Se=/(^-|-$)/g;function Oe(e){return e.replace(_e,"-").replace(Se,"")}function Ae(e){return"string"===typeof e&&!0}var we=function(e){return ve(K(e)>>>0)};var ke=i.a.createContext(),Ce=ke.Consumer;function xe(e){var t=Object(a.useContext)(ke),n=Object(a.useMemo)((function(){return function(e,t){return e?v(e)?e(t):Array.isArray(e)||"object"!==typeof e?w(8):t?f({},t,{},e):e:w(14)}(e.theme,t)}),[e.theme,t]);return e.children?i.a.createElement(ke.Provider,{value:n},e.children):null}var Ne={};function Ie(e,t,n){var r=e.attrs,i=e.componentStyle,o=e.defaultProps,s=e.foldedComponentIds,l=e.styledComponentId,c=e.target;Object(a.useDebugValue)(l);var d=function(e,t,n){void 0===e&&(e=b);var r=f({},t,{theme:e}),a={};return n.forEach((function(e){var t,n,i,o=e;for(t in v(o)&&(o=o(r)),o)r[t]=a[t]="className"===t?(n=a[t],i=o[t],n&&i?n+" "+i:n||i):o[t]})),[r,a]}(Te(t,Object(a.useContext)(ke),o)||b,t,r),p=d[0],m=d[1],h=function(e,t,n,r){var i=te(),o=ne(),s=e.isStatic&&!t?e.generateAndInjectStyles(b,i,o):e.generateAndInjectStyles(n,i,o);return Object(a.useDebugValue)(s),s}(i,r.length>0,p),g=n,y=m.as||t.as||c,E=Ae(y),T=m!==t?f({},t,{},m):t,_=E||"as"in T||"forwardedAs"in T,S=_?{}:f({},T);if(_)for(var O in T)"forwardedAs"===O?S.as=T[O]:"as"===O||"forwardedAs"===O||E&&!Object(u.a)(O)||(S[O]=T[O]);return t.style&&m.style!==t.style&&(S.style=f({},t.style,{},m.style)),S.className=Array.prototype.concat(s,l,h!==l?h:null,t.className,m.className).filter(Boolean).join(" "),S.ref=g,Object(a.createElement)(y,S)}function Re(e,t,n){var r,a=E(e),o=!Ae(e),s=t.displayName,l=void 0===s?function(e){return Ae(e)?"styled."+e:"Styled("+y(e)+")"}(e):s,c=t.componentId,u=void 0===c?function(e,t){var n="string"!==typeof e?"sc":Oe(e);Ne[n]=(Ne[n]||0)+1;var r=n+"-"+we(n+Ne[n]);return t?t+"-"+r:r}(t.displayName,t.parentComponentId):c,d=t.attrs,m=void 0===d?g:d,h=t.displayName&&t.componentId?Oe(t.displayName)+"-"+t.componentId:t.componentId||u,b=a&&e.attrs?Array.prototype.concat(e.attrs,m).filter(Boolean):m,v=new Ee(a?e.componentStyle.rules.concat(n):n,h),T=function(e,t){return Ie(r,e,t)};return T.displayName=l,(r=i.a.forwardRef(T)).attrs=b,r.componentStyle=v,r.displayName=l,r.foldedComponentIds=a?Array.prototype.concat(e.foldedComponentIds,e.styledComponentId):g,r.styledComponentId=h,r.target=a?e.target:e,r.withComponent=function(e){var r=t.componentId,a=function(e,t){if(null==e)return{};var n,r,a={},i=Object.keys(e);for(r=0;r=0||(a[n]=e[n]);return a}(t,["componentId"]),i=r&&r+"-"+(Ae(e)?e:Oe(y(e)));return Re(e,f({},a,{attrs:b,componentId:i}),n)},Object.defineProperty(r,"defaultProps",{get:function(){return this._foldedDefaultProps},set:function(t){this._foldedDefaultProps=a?he({},e.defaultProps,t):t}}),r.toString=function(){return"."+r.styledComponentId},o&&p()(r,e,{attrs:!0,componentStyle:!0,displayName:!0,foldedComponentIds:!0,self:!0,styledComponentId:!0,target:!0,withComponent:!0}),r}var Pe=function(e){return function e(t,n,a){if(void 0===a&&(a=b),!Object(r.isValidElementType)(n))return w(1,String(n));var i=function(){return t(n,a,de.apply(void 0,arguments))};return i.withConfig=function(r){return e(t,n,f({},a,{},r))},i.attrs=function(r){return e(t,n,f({},a,{attrs:Array.prototype.concat(a.attrs,r).filter(Boolean)}))},i}(Re,e)};["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","big","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","marquee","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr","circle","clipPath","defs","ellipse","foreignObject","g","image","line","linearGradient","marker","mask","path","pattern","polygon","polyline","radialGradient","rect","stop","svg","text","tspan"].forEach((function(e){Pe[e]=Pe(e)}));var De=function(){function e(e,t){this.rules=e,this.componentId=t,this.isStatic=ye(e)}var t=e.prototype;return t.createStyles=function(e,t,n,r){var a=r(ue(this.rules,t,n).join(""),""),i=this.componentId+e;n.insertRules(i,i,a)},t.removeStyles=function(e,t){t.clearRules(this.componentId+e)},t.renderStyles=function(e,t,n,r){V.registerId(this.componentId+e),this.removeStyles(e,n),this.createStyles(e,t,n,r)},e}();function Le(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r1?t-1:0),r=1;r"+t+""},this.getStyleTags=function(){return e.sealed?w(2):e._emitSheetCSS()},this.getStyleElement=function(){var t;if(e.sealed)return w(2);var n=((t={})[T]="",t["data-styled-version"]="5.0.1",t.dangerouslySetInnerHTML={__html:e.instance.toString()},t),r=A();return r&&(n.nonce=r),[i.a.createElement("style",f({},n,{key:"sc-0-0"}))]},this.seal=function(){e.sealed=!0},this.instance=new V({isServer:!0}),this.sealed=!1}var t=e.prototype;return t.collectStyles=function(e){return this.sealed?w(2):i.a.createElement(re,{sheet:this.instance},e)},t.interleaveWithNodeStream=function(e){return w(3)},e}(),je=function(e){var t=i.a.forwardRef((function(t,n){var r=Object(a.useContext)(ke),o=e.defaultProps,s=Te(t,r,o);return i.a.createElement(e,f({},t,{theme:s,ref:n}))}));return p()(t,e),t.displayName="WithTheme("+y(e)+")",t},Ue=function(){return Object(a.useContext)(ke)},Be={StyleSheet:V,masterSheet:J},He="5.0.1";t.default=Pe}.call(this,n(132))},function(e,t,n){e.exports=n(562)()},function(e,t,n){"use strict";n.d(t,"b",(function(){return a})),n.d(t,"a",(function(){return i})),n.d(t,"d",(function(){return o})),n.d(t,"e",(function(){return s})),n.d(t,"c",(function(){return l}));var r=function(e,t){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(e,t)};function a(e,t){function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var i=function(){return(i=Object.assign||function(e){for(var t,n=1,r=arguments.length;n2&&void 0!==arguments[2]?arguments[2]:{},r=F(e);function a(e){if(!e.MergedWidget){var t=e.defaultProps&&e.defaultProps.options||{};e.MergedWidget=function(n){var r=n.options,a=void 0===r?{}:r,i=Object(E.a)(n,["options"]);return _.a.createElement(e,Object(v.a)({options:Object(y.a)({},t,a)},i))}}return e.MergedWidget}if("function"===typeof t||S.isForwardRef(_.a.createElement(t))||S.isMemo(t))return a(t);if("string"!==typeof t)throw new Error("Unsupported widget definition: ".concat(Object(b.a)(t)));if(n.hasOwnProperty(t)){var i=n[t];return j(e,i,n)}if(!L.hasOwnProperty(r))throw new Error('No widget for type "'.concat(r,'"'));if(L[r].hasOwnProperty(t)){var o=n[L[r][t]];return j(e,o,n)}throw new Error('No widget "'.concat(t,'" for type "').concat(r,'"'))}function U(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};try{return j(e,t,n),!0}catch(r){if(r.message&&(r.message.startsWith("No widget")||r.message.startsWith("Unsupported widget")))return!1;throw r}}function B(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},a=arguments.length>4&&void 0!==arguments[4]&&arguments[4],i=V(e)?e:{},o=V(r)?r:{},s=t;if(V(s)&&V(i.default))s=W(s,i.default);else if("default"in i)s=i.default;else{if("$ref"in i){var l=ne(i.$ref,n);return B(l,s,n,o,a)}if("dependencies"in i){var c=le(i,n,o);return B(c,s,n,o,a)}J(i)?s=i.items.map((function(e,r){return B(e,g()(t)?t[r]:void 0,n,o,a)})):"oneOf"in i?i=i.oneOf[Oe(void 0,i.oneOf,n)]:"anyOf"in i&&(i=i.anyOf[Oe(void 0,i.anyOf,n)])}switch("undefined"===typeof s&&(s=i.default),F(i)){case"object":return m()(i.properties||{}).reduce((function(e,t){var r=B(i.properties[t],(s||{})[t],n,(o||{})[t],a);return(a||void 0!==r)&&(e[t]=r),e}),{});case"array":if(g()(s)&&(s=s.map((function(e,t){return B(i.items[t]||i.additionalItems||{},e,n)}))),g()(r)&&(s=r.map((function(e,t){return B(i.items,(s||{})[t],n,e)}))),i.minItems){if(Q(i,n))return s||[];var u=s?s.length:0;if(i.minItems>u){var d=s||[],p=g()(i.items)?i.additionalItems:i.items,f=k()(new Array(i.minItems-u),B(p,p.defaults,n));return d.concat(f)}}}return s}function H(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=arguments.length>3&&void 0!==arguments[3]&&arguments[3];if(!V(e))throw new Error("Invalid schema: "+e);var a=se(e,n,t),i=B(a,e.default,n,t,r);return"undefined"===typeof t?i:V(t)||g()(t)?z(i,t):0===t||!1===t||""===t?t:t||i}function z(e,t){if(g()(t))return g()(e)||(e=[]),t.map((function(t,n){return e[n]?z(e[n],t):t}));if(V(t)){var n=Object(v.a)({},e);return m()(t).reduce((function(n,r){return n[r]=z(e?e[r]:{},t[r]),n}),n)}return t}function G(e){return m()(e).filter((function(e){return 0===e.indexOf("ui:")})).reduce((function(t,n){var r=e[n];return"ui:widget"===n&&V(r)?(console.warn("Setting options via ui:widget object is deprecated, use ui:options instead"),Object(y.a)({},t,r.options||{},{widget:r.component})):"ui:options"===n&&V(r)?Object(y.a)({},t,r):Object(y.a)({},t,Object(p.a)({},n.substring(3),r))}),{})}function $(e,t,n){var r=G(t).label,a=void 0===r||r;return"array"===e.type&&(a=Q(e,n)||Z(e,t,n)),"object"===e.type&&(a=!1),"boolean"!==e.type||t["ui:widget"]||(a=!1),t["ui:field"]&&(a=!1),a}function V(e){return!("undefined"!==typeof File&&e instanceof File)&&("object"===Object(b.a)(e)&&null!==e&&!g()(e))}function W(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],r=Object(v.a)({},e);return m()(t).reduce((function(r,a){var i=e?e[a]:{},o=t[a];return e&&e.hasOwnProperty(a)&&V(o)?r[a]=W(i,o,n):n&&g()(i)&&g()(o)?r[a]=i.concat(o):r[a]=o,r}),r)}function K(e){if(""!==e){if(null===e)return null;if(/\.$/.test(e))return e;if(/\.0$/.test(e))return e;var t=Number(e),n="number"===typeof t&&!d()(t);return/\.\d*0$/.test(e)?e:n?t:e}}function q(e,t){if(!g()(t))return e;var n,r=function(e){return e.reduce((function(e,t){return e[t]=!0,e}),{})},a=r(e),i=t.filter((function(e){return"*"===e||a[e]})),o=r(i),s=e.filter((function(e){return!o[e]})),l=i.indexOf("*");if(-1===l){if(s.length)throw new Error("uiSchema order list does not contain ".concat((n=s).length>1?"properties '".concat(n.join("', '"),"'"):"property '".concat(n[0],"'")));return i}if(l!==i.lastIndexOf("*"))throw new Error("uiSchema order list contains more than one wildcard item");var u=Object(c.a)(i);return u.splice.apply(u,[l,1].concat(Object(c.a)(s))),u}function Y(e){return g()(e.enum)&&1===e.enum.length||e.hasOwnProperty("const")}function X(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=se(e,t),r=n.oneOf||n.anyOf;return!!g()(n.enum)||!!g()(r)&&r.every((function(e){return Y(e)}))}function Q(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return!(!e.uniqueItems||!e.items)&&X(e.items,t)}function Z(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if("files"===t["ui:widget"])return!0;if(e.items){var r=se(e.items,n);return"string"===r.type&&"data-url"===r.format}return!1}function J(e){return g()(e.items)&&e.items.length>0&&e.items.every((function(e){return V(e)}))}function ee(e){return!0===e.additionalItems&&console.warn("additionalItems=true is currently not supported"),V(e.additionalItems)}function te(e){return e.enum?e.enum.map((function(t,n){return{label:e.enumNames&&e.enumNames[n]||String(t),value:t}})):(e.oneOf||e.anyOf).map((function(e,t){var n=function(e){if(g()(e.enum)&&1===e.enum.length)return e.enum[0];if(e.hasOwnProperty("const"))return e.const;throw new Error("schema cannot be inferred as a constant")}(e);return{label:e.title||String(n),value:n}}))}function ne(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=e;if(!e.startsWith("#"))throw new Error("Could not find a definition for ".concat(n,"."));e=decodeURIComponent(e.substring(1));var r=R.a.get(t,e);if(void 0===r)throw new Error("Could not find a definition for ".concat(n,"."));return r.hasOwnProperty("$ref")?ne(r.$ref,t):r}var re=function(e){return g()(e)?"array":"string"===typeof e?"string":null==e?"null":"boolean"===typeof e?"boolean":isNaN(e)?"object"===Object(b.a)(e)?"object":"string":"number"};function ae(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return e=Object(y.a)({},e,{properties:Object(y.a)({},e.properties)}),m()(n).forEach((function(r){var a;e.properties.hasOwnProperty(r)||(a=e.additionalProperties.hasOwnProperty("$ref")?se({$ref:e.additionalProperties.$ref},t,n):e.additionalProperties.hasOwnProperty("type")?Object(y.a)({},e.additionalProperties):{type:re(n[r])},e.properties[r]=a,e.properties[r][D]=!0)})),e}function ie(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e.hasOwnProperty("$ref"))return oe(e,t,n);if(e.hasOwnProperty("dependencies")){var r=le(e,t,n);return se(r,t,n)}return e.hasOwnProperty("allOf")?Object(y.a)({},e,{allOf:e.allOf.map((function(e){return se(e,t,n)}))}):e}function oe(e,t,n){var r=ne(e.$ref,t),a=(e.$ref,Object(E.a)(e,["$ref"]));return se(Object(y.a)({},r,a),t,n)}function se(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(!V(e))return{};var r=ie(e,t,n);if("allOf"in e)try{r=A()(Object(y.a)({},r,{allOf:r.allOf}))}catch(s){console.warn("could not merge subschemas in allOf:\n"+s);var a=r,i=(a.allOf,Object(E.a)(a,["allOf"]));return i}var o=r.hasOwnProperty("additionalProperties")&&!1!==r.additionalProperties;return o?ae(r,t,n):r}function le(e,t,n){var r=e.dependencies,a=void 0===r?{}:r,i=Object(E.a)(e,["dependencies"]);return"oneOf"in i?i=i.oneOf[Oe(n,i.oneOf,t)]:"anyOf"in i&&(i=i.anyOf[Oe(n,i.anyOf,t)]),function e(t,n,r,a){for(var i in t)if(void 0!==a[i]&&(!n.properties||i in n.properties)){var o=t[i],s=Object(E.a)(t,[i].map(P));return g()(o)?n=ce(n,o):V(o)&&(n=ue(n,r,a,i,o)),e(s,n,r,a)}return n}(a,i,t,n)}function ce(e,t){if(!t)return e;var n=g()(e.required)?l()(new o.a([].concat(Object(c.a)(e.required),Object(c.a)(t)))):t;return Object(y.a)({},e,{required:n})}function ue(e,t,n,r,a){var i=se(a,t,n),o=i.oneOf;if(e=de(e,Object(E.a)(i,["oneOf"])),void 0===o)return e;if(!g()(o))throw new Error("invalid: it is some ".concat(Object(b.a)(o)," instead of an array"));var s=o.map((function(e){return e.hasOwnProperty("$ref")?oe(e,t,n):e}));return function(e,t,n,r,a){var i=a.filter((function(e){if(!e.properties)return!1;var t=e.properties[r];if(t){var a={type:"object",properties:Object(p.a)({},r,t)};return 0===Object(C.a)(n,a).errors.length}}));if(1!==i.length)return console.warn("ignoring oneOf in dependencies because there isn't exactly one subschema that is valid"),e;var o=i[0],s=o.properties,l=(s[r],Object(E.a)(s,[r].map(P))),c=Object(y.a)({},o,{properties:l});return de(e,se(c,t,n))}(e,t,n,r,s)}function de(e,t){var n=Object(v.a)({},e);return m()(t).reduce((function(n,r){var a=e?e[r]:{},i=t[r];return e&&e.hasOwnProperty(r)&&V(i)?n[r]=de(a,i):e&&t&&("object"===F(e)||"object"===F(t))&&"required"===r&&g()(a)&&g()(i)?n[r]=N()(a,i):n[r]=i,n}),n)}function pe(e){return"[object Arguments]"===Object.prototype.toString.call(e)}function fe(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[];if(e===t)return!0;if("function"===typeof e||"function"===typeof t)return!0;if("object"!==Object(b.a)(e)||"object"!==Object(b.a)(t))return!1;if(null===e||null===t)return!1;if(e instanceof Date&&t instanceof Date)return e.getTime()===t.getTime();if(e instanceof RegExp&&t instanceof RegExp)return e.source===t.source&&e.global===t.global&&e.multiline===t.multiline&&e.lastIndex===t.lastIndex&&e.ignoreCase===t.ignoreCase;if(pe(e)||pe(t)){if(!pe(e)||!pe(t))return!1;var a=Array.prototype.slice;return fe(a.call(e),a.call(t),n,r)}if(e.constructor!==t.constructor)return!1;var i=m()(e),o=m()(t);if(0===i.length&&0===o.length)return!0;if(i.length!==o.length)return!1;for(var s,l=n.length;l--;)if(n[l]===e)return r[l]===t;n.push(e),r.push(t),i.sort(),o.sort();for(var c=i.length-1;c>=0;c--)if(i[c]!==o[c])return!1;for(var u=i.length-1;u>=0;u--)if(!fe(e[s=i[u]],t[s],n,r))return!1;return n.pop(),r.pop(),!0}function me(e,t,n){var r=e.props,a=e.state;return!fe(r,t)||!fe(a,n)}function he(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"root",i={$id:t||a};if("$ref"in e||"dependencies"in e||"allOf"in e){var o=se(e,n,r);return he(o,t,n,r,a)}if("items"in e&&!e.items.$ref)return he(e.items,t,n,r,a);if("object"!==e.type)return i;for(var s in e.properties||{}){var l=e.properties[s],c=i.$id+"_"+s;i[s]=he(V(l)?l:{},c,n,(r||{})[s],a)}return i}function ge(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},a={$name:t.replace(/^\./,"")};if("$ref"in e||"dependencies"in e||"allOf"in e){var i=se(e,n,r);return ge(i,t,n,r)}if(e.hasOwnProperty("additionalProperties")&&(a.__rjsf_additionalProperties=!0),e.hasOwnProperty("items")&&g()(r))r.forEach((function(r,i){a[i]=ge(e.items,"".concat(t,".").concat(i),n,r)}));else if(e.hasOwnProperty("properties"))for(var o in e.properties)a[o]=ge(e.properties[o],"".concat(t,".").concat(o),n,(r||{})[o]);return a}function be(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(!e)return{year:-1,month:-1,day:-1,hour:t?-1:0,minute:t?-1:0,second:t?-1:0};var n=new Date(e);if(d()(n.getTime()))throw new Error("Unable to parse date "+e);return{year:n.getUTCFullYear(),month:n.getUTCMonth()+1,day:n.getUTCDate(),hour:t?n.getUTCHours():0,minute:t?n.getUTCMinutes():0,second:t?n.getUTCSeconds():0}}function ve(e){var t=e.year,n=e.month,r=e.day,a=e.hour,i=void 0===a?0:a,o=e.minute,s=void 0===o?0:o,l=e.second,c=void 0===l?0:l,u=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],d=Date.UTC(t,n-1,r,i,s,c),p=new Date(d).toJSON();return u?p:p.slice(0,10)}function ye(e){if(!e)return"";var t=new Date(e),n=Te(t.getFullYear(),4),r=Te(t.getMonth()+1,2),a=Te(t.getDate(),2),i=Te(t.getHours(),2),o=Te(t.getMinutes(),2),s=Te(t.getSeconds(),2),l=Te(t.getMilliseconds(),3);return"".concat(n,"-").concat(r,"-").concat(a,"T").concat(i,":").concat(o,":").concat(s,".").concat(l)}function Ee(e){if(e)return new Date(e).toJSON()}function Te(e,t){for(var n=String(e);n.lengtht?1:0},s=[40,52,64].map((function(e){return e+"em"})),l=i.a.oneOfType([i.a.number,i.a.string,i.a.array,i.a.object]),c=function(e){return function(){return e.apply(void 0,arguments)}},u=function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r1?f(e):100*e+"%"},F=v({prop:"width",key:"widths",transformValue:M}),j=function(e,t){return f(u(t,e))},U=v({prop:"fontSize",key:"fontSizes",transformValue:j,scale:[12,14,16,20,24,32,48,64,72]}),B=(v({prop:"fontFamily",key:"fonts"}),v({prop:"fontWeight",key:"fontWeights"}),v({prop:"lineHeight",key:"lineHeights"}),v({prop:"textAlign"})),H=(v({prop:"fontStyle"}),v({prop:"letterSpacing",key:"letterSpacings",transformValue:j}),v({prop:"display"})),z=v({prop:"maxWidth",key:"maxWidths",transformValue:j}),G=v({prop:"minWidth",key:"minWidths",transformValue:j}),$=v({prop:"height",key:"heights",transformValue:j}),V=v({prop:"maxHeight",key:"maxHeights",transformValue:j}),W=v({prop:"minHeight",key:"minHeights",transformValue:j}),K=(E((function(e){return r({},e,{width:e.size,height:e.size})}))(y(F,$)),v({prop:"verticalAlign"}),v({prop:"alignItems"})),q=(v({prop:"alignContent"}),v({prop:"justifyItems"}),v({prop:"justifyContent"})),Y=v({prop:"flexWrap"}),X=(v({prop:"flexBasis",transformValue:M}),v({prop:"flexDirection"})),Q=v({prop:"flex"}),Z=(v({prop:"justifySelf"}),v({prop:"alignSelf"})),J=v({prop:"order"}),ee=(v({prop:"gridGap",key:"space",transformValue:j,scale:_}),v({prop:"gridColumnGap",key:"space",transformValue:j,scale:_}),v({prop:"gridRowGap",key:"space",transformValue:j,scale:_}),v({prop:"gridColumn"}),v({prop:"gridRow"}),v({prop:"gridAutoFlow"}),v({prop:"gridAutoColumns"}),v({prop:"gridAutoRows"}),v({prop:"gridTemplateColumns"}),v({prop:"gridTemplateRows"}),v({prop:"gridTemplateAreas"}),v({prop:"gridArea"}),v({prop:"border",key:"borders"})),te=v({prop:"borderWidth",key:"borderWidths",transformValue:j}),ne=v({prop:"borderStyle",key:"borderStyles"}),re=v({prop:"borderColor",key:"colors"});y(ee,v({prop:"borderTop",key:"borders"}),v({prop:"borderRight",key:"borders"}),v({prop:"borderBottom",key:"borders"}),v({prop:"borderLeft",key:"borders"}),te,ne,re,v({prop:"borderRadius",key:"radii",transformValue:j})),v({prop:"boxShadow",key:"shadows"}),v({prop:"opacity"}),v({prop:"overflow"}),v({prop:"background"}),v({prop:"backgroundImage"}),v({prop:"backgroundSize"}),v({prop:"backgroundPosition"}),v({prop:"backgroundRepeat"}),v({prop:"position"}),v({prop:"zIndex",key:"zIndices"}),v({prop:"top",transformValue:j}),v({prop:"right",transformValue:j}),v({prop:"bottom",transformValue:j}),v({prop:"left",transformValue:j}),T({key:"buttons"}),T({key:"textStyles",prop:"textStyle"}),T({key:"colorStyles",prop:"colors"})},function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var r=n(102),a=n.n(r),i=n(11),o=n.n(i);function s(e,t){if(null==e)return{};var n,r,i=function(e,t){if(null==e)return{};var n,r,a={},i=o()(e);for(r=0;r=0||(a[n]=e[n]);return a}(e,t);if(a.a){var s=a()(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}},function(e,t){var n=e.exports={version:"2.6.11"};"number"==typeof __e&&(__e=n)},function(e,t,n){"use strict";n.d(t,"b",(function(){return a})),n.d(t,"a",(function(){return i}));var r=n(1),a=function(e){return"number"===typeof e?e:(e.match(/\s/),parseFloat(e.match(/\d+(\.\d+)?/),10))},i=function(e,t){return Object(r.css)(["@media only screen ","{",";}"],e.value&&"and (max-width: "+e.value+"px)",t)}},function(e,t,n){"use strict";n.d(t,"a",(function(){return z}));var r,a,i,o,s,l,c,u=n(3),d=n(429),p=n.n(d),f=n(97),m=n.n(f),h=n(2),g=n(0),b=n(44),v=n(1),y=n(12),E=n(177),T=n.n(E),_=n(128),S=n.n(_),O=n(432),A=n.n(O),w=n(54),k="\n\tposition: absolute;\n\twidth: 0;\n\theight: 0;\n\tborder-color: transparent;\n\tborder-style: solid;\n",C=v.default.div(r||(r=Object(u.c)(["\n\t"," bottom: 0;\n\tleft: 50%;\n\tmargin-left: -5px;\n\tborder-width: 5px 5px 0;\n\tborder-top-color: #000;\n"],["\n\t"," bottom: 0;\n\tleft: 50%;\n\tmargin-left: -5px;\n\tborder-width: 5px 5px 0;\n\tborder-top-color: #000;\n"])),k),x=v.default.div(a||(a=Object(u.c)(["\n\t"," top: 50%;\n\tleft: 0;\n\tmargin-top: -5px;\n\tborder-width: 5px 5px 5px 0;\n\tborder-right-color: #000;\n"],["\n\t"," top: 50%;\n\tleft: 0;\n\tmargin-top: -5px;\n\tborder-width: 5px 5px 5px 0;\n\tborder-right-color: #000;\n"])),k),N=v.default.div(i||(i=Object(u.c)(["\n\t"," top: 50%;\n\tright: 0;\n\tmargin-top: -5px;\n\tborder-width: 5px 0 5px 5px;\n\tborder-left-color: #000;\n"],["\n\t"," top: 50%;\n\tright: 0;\n\tmargin-top: -5px;\n\tborder-width: 5px 0 5px 5px;\n\tborder-left-color: #000;\n"])),k),I=v.default.div(o||(o=Object(u.c)(["\n\t"," top: 0;\n\tleft: 50%;\n\tmargin-left: -5px;\n\tborder-width: 0 5px 5px;\n\tborder-bottom-color: #000;\n"],["\n\t"," top: 0;\n\tleft: 50%;\n\tmargin-left: -5px;\n\tborder-width: 0 5px 5px;\n\tborder-bottom-color: #000;\n"])),k),R=v.default.div(s||(s=Object(u.c)(["\n\tdisplay: block;\n\tfont-size: 12px;\n\tfont-style: normal;\n\tfont-weight: 400;\n\tletter-spacing: normal;\n\tline-break: auto;\n\tline-height: 1.42857143;\n\tpadding: 5px;\n\tposition: absolute;\n\tmax-width: 300px;\n\ttext-align: left;\n\ttext-align: start;\n\ttext-decoration: none;\n\ttext-shadow: none;\n\ttext-transform: none;\n\tvisibility: hidden;\n\twhite-space: normal;\n\tword-break: normal;\n\tword-spacing: normal;\n\tword-wrap: normal;\n\tz-index: 10000;\n\tcolor: white;\n"],["\n\tdisplay: block;\n\tfont-size: 12px;\n\tfont-style: normal;\n\tfont-weight: 400;\n\tletter-spacing: normal;\n\tline-break: auto;\n\tline-height: 1.42857143;\n\tpadding: 5px;\n\tposition: absolute;\n\tmax-width: 300px;\n\ttext-align: left;\n\ttext-align: start;\n\ttext-decoration: none;\n\ttext-shadow: none;\n\ttext-transform: none;\n\tvisibility: hidden;\n\twhite-space: normal;\n\tword-break: normal;\n\tword-spacing: normal;\n\tword-wrap: normal;\n\tz-index: 10000;\n\tcolor: white;\n"]))),P=v.default.div(l||(l=Object(u.c)(["\n\tbackground: black;\n\tborder-radius: 4px;\n\tpadding: 3px 8px;\n\ttext-align: center;\n"],["\n\tbackground: black;\n\tborder-radius: 4px;\n\tpadding: 3px 8px;\n\ttext-align: center;\n"]))),D=function(e){function t(t){var n=e.call(this,t)||this;return n.state={show:!1,placement:"top",coordinates:{top:0,left:0}},n}return Object(u.b)(t,e),t.prototype.observe=function(e){var t=this;this.observer&&this.observer.disconnect(),this.observer=function(e,t){var n=new MutationObserver((function(){document.contains(e)||(n.disconnect(),t())}));return n.observe(document,{childList:!0,subtree:!0}),n}(e,(function(){t.hide()}))},t.prototype.show=function(e,t,n){void 0===n&&(n={});var r=0,a=0,i=e.target;this.observe(i);var o=i.getBoundingClientRect(),s=A()(o,["top","left","width","height"]);s.top+=window.scrollY,s.left+=window.scrollX;var l=n.placement,c=n.containerStyle,u=n.innerStyle,d=n.arrowStyle;this.tooltipElementInner&&(this.tooltipElementInner.innerText=t),l&&"top"!==l||(r=s.top-this.tooltipElement.clientHeight-3,a=s.left+s.width/2-this.tooltipElement.clientWidth/2),"right"===l&&(r=s.top+s.height/2-this.tooltipElement.clientHeight/2,a=s.left+s.width+3),"bottom"===l&&(r=s.top+s.height+3,a=s.left+s.width/2-this.tooltipElement.clientWidth/2),"left"===l&&(r=s.top+s.height/2-this.tooltipElement.clientHeight/2,a=s.left-this.tooltipElement.clientWidth-3),this.setState({coordinates:{top:r,left:a},show:!0,placement:l,containerStyle:c,innerStyle:u,arrowStyle:d})},t.prototype.hide=function(){this.observer&&(this.observer.disconnect(),this.observer=void 0),this.setState({show:!1,coordinates:{top:0,left:0}})},t.prototype.render=function(){var e=this,t=this.state,n=t.placement,r=t.containerStyle,a=t.innerStyle,i=t.arrowStyle,o=function(e){switch(e){case"right":return x;case"bottom":return I;case"left":return N;default:return C}}(n),s=T()({top:this.state.coordinates.top,left:this.state.coordinates.left,visibility:this.state.show?"visible":"hidden"},r);return g.createElement(R,{style:s,ref:function(t){return e.tooltipElement=t}},g.createElement(P,{ref:function(t){return e.tooltipElementInner=t},style:a}),g.createElement(o,{style:i}))},t}(g.Component),L=new(function(){function e(){this.initialised=!1,this.hideOnMouseOut=null}return e.prototype.initialiseElements=function(){var e=this;if(!this.initialised&&document&&document.body){var t=document.createElement("div");t.id="rendition-tooltip-root",document.body.appendChild(t),document.addEventListener("mouseover",(function(t){var n=t.target;e.hideOnMouseOut&&e.hideOnMouseOut!==n&&(e.hideOnMouseOut.firstElementChild&&e.hideOnMouseOut.contains&&e.hideOnMouseOut.contains(n)||(e.hide(),e.hideOnMouseOut=null))})),this.component=w.render(g.createElement(D,null),t),this.initialised=!0}},e.prototype.bindProps=function(e){var t=this;if(e.tooltip){var n,r={},a="hover";if("string"===typeof e.tooltip?n=e.tooltip:(n=e.tooltip.text,r.placement=e.tooltip.placement,r.containerStyle=e.tooltip.containerStyle,r.innerStyle=e.tooltip.innerStyle,r.arrowStyle=e.tooltip.arrowStyle,e.tooltip.trigger&&(a=e.tooltip.trigger)),n){var i=function(e){return t.show(e,n,r)};if("click"===a){var o=e.onClick||S.a;e.onClick=function(e){i(e),clearTimeout(t.hideTimeout),t.hideTimeout=window.setTimeout((function(){return t.hide()}),1e3),o(e)}}else{var s=e.onMouseEnter||S.a;e.onMouseEnter=function(e){i(e),s(e),e.target.disabled&&(t.hideOnMouseOut=e.target)};var l=e.onMouseLeave||S.a;e.onMouseLeave=function(e){t.hide(),l(e)}}}}return e},e.prototype.show=function(e,t,n){this.initialiseElements(),this.component.show(e,t,n)},e.prototype.hide=function(){this.initialiseElements(),this.component.hide()},e}()),M=Object(h.oneOfType)([h.number,h.string,Object(h.arrayOf)(Object(h.oneOfType)([h.number,h.string]))]),F={width:M,minWidth:M,maxWidth:M,height:M,minHeight:M,maxHeight:M,display:M,fontSize:M,color:M,bg:M,backgroundColor:M,m:M,mt:M,mr:M,mb:M,ml:M,mx:M,my:M,p:M,pt:M,pr:M,pb:M,pl:M,px:M,py:M},j=Object.keys(F),U=function(e){return function(t){return g.forwardRef((function(n,r){var a=m()(n,p()(j,e));return g.createElement(t,Object(u.a)({},a,{ref:r}))}))}},B=function(e){var t=Object(v.default)(e)(c||(c=Object(u.c)(["\n\t\t","\n ","\n ","\n ","\n ","\n ","\n ","\n ","\n\t\t","\n\t\t","\n\t"],["\n\t\t","\n ","\n ","\n ","\n ","\n ","\n ","\n ","\n\t\t","\n\t\t","\n\t"])),y.q,y.t,y.n,y.l,y.i,y.m,y.k,y.d,y.h,y.c);return t.displayName=Object(b.b)(e),t.propTypes=F,g.forwardRef((function(e,n){return g.createElement(t,Object(u.a)({},e,{ref:n}))}))},H=function(e){return g.forwardRef((function(t,n){var r=Object(u.d)(t,[]);return r.tooltip&&(r=L.bindProps(r)),delete r.tooltip,g.createElement(e,Object(u.a)({},r,{ref:n}))}))};function z(e,t,n){return void 0===t&&(t=[]),void 0===n&&(n=[]),b.a.apply(void 0,Object(u.e)([v.withTheme],t||[],[H,B,U(n)]))(e)}},function(e,t,n){"use strict";n.d(t,"c",(function(){return r})),n.d(t,"a",(function(){return u})),n.d(t,"b",(function(){return d}));var r=function e(t,n,r){var a=n.global&&void 0!==n.global.colors[t]?n.global.colors[t]:t,i=a;return a&&((!0===r||void 0===r&&n.dark)&&void 0!==a.dark?i=a.dark:!1!==r&&n.dark||void 0===a.light||(i=a.light)),i&&n.global&&void 0!==n.global.colors[i]&&(i=e(i,n,r)),i},a=/^#[A-Za-z0-9]{3,4}$|^#[A-Za-z0-9]{6,8}$/,i=/rgba?\(\s?([0-9]*)\s?,\s?([0-9]*)\s?,\s?([0-9]*)\s?\)/,o=/rgba?\(\s?([0-9]*)\s?,\s?([0-9]*)\s?,\s?([0-9]*)\s?,\s?([.0-9]*)\s?\)/,s=/hsla?\(\s?([0-9]*)\s?,\s?([0-9]*)%?\s?,\s?([0-9]*)%?\s?.*?\)/,l=function(e){return a.test(e)||i.test(e)||o.test(e)||s.test(e)},c=function(e){if(a.test(e)){var t=function(e){return e.length<7?e.match(/[A-Za-z0-9]{1}/g).map((function(e){return parseInt(""+e+e,16)})):e.match(/[A-Za-z0-9]{2}/g).map((function(e){return parseInt(e,16)}))}(e),n=t[0],r=t[1],l=t[2],c=t[3];return[n,r,l,void 0!==c?c/255:void 0]}var u=e.match(i);if(u)return u.splice(1).map((function(e){return parseInt(e,10)}));if(u=e.match(o))return u.splice(1).map((function(e){return parseFloat(e,10)}));if(u=e.match(s)){var d=u.splice(1).map((function(e){return parseInt(e,10)}));return function(e,t,n){var r,a,i;if(0===t||"0"===t)r=n,a=n,i=n;else{var o=function(e,t,n){var r=n;return r<0&&(r+=1),r>1&&(r-=1),r<.16666667?e+6*(t-e)*r:r<.5?t:r<.66666667?e+(t-e)*(.66666667-r)*6:e},s=n<.5?n*(1+t):n+t-n*t,l=2*n-s;r=o(l,s,e+.33333333),a=o(l,s,e),i=o(l,s,e-.33333333)}return[Math.round(255*r),Math.round(255*a),Math.round(255*i)]}(d[0]/360,d[1]/100,d[2]/100)}return e},u=function(e){if(e&&l(e)){var t=c(e),n=t[0],r=t[1],a=t[2];if(t[3]<.5)return;return(299*n+587*r+114*a)/1e3<125}},d=function(e,t){if(e&&l(e)){var n=c(e),r=n[0],a=n[1],i=n[2],o=n[3];return"rgba("+r+", "+a+", "+i+", "+(void 0!==t?t:void 0!==o?o:1)+")"}}},function(e,t,n){"use strict";n.d(t,"c",(function(){return m})),n.d(t,"b",(function(){return h})),n.d(t,"a",(function(){return g}));var r,a,i,o,s,l=n(3),c=n(0),u=n(1),d=n(12),p=n(16),f=n(276),m=function(e){return e.caps?Object(u.css)(a||(a=Object(l.c)(["\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tletter-spacing: 0.2em;\n\t\t "],["\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tletter-spacing: 0.2em;\n\t\t "]))):null},h=function(e){return e.bold?Object(u.css)(o||(o=Object(l.c)(["\n\t\t\t\tfont-weight: ",";\n\t\t "],["\n\t\t\t\tfont-weight: ",";\n\t\t "])),e.theme.weights[e.theme.weights.length-1]):null},g=Object(d.r)({key:"text-align",prop:"align",cssProperty:"text-align"}),b=u.default.div(s||(s=Object(l.c)(["\n\t","\n\t","\n\t","\n\n\t","\n\t","\n\t","\n"],["\n\t","\n\t","\n\t","\n\n\t","\n\t","\n\t","\n"])),g,f.b,(function(e){return e.whitespace?Object(u.css)(r||(r=Object(l.c)(["\n\t\t\t\twhite-space: ",";\n\t\t "],["\n\t\t\t\twhite-space: ",";\n\t\t "])),e.whitespace):null}),m,h,(function(e){return e.italic?Object(u.css)(i||(i=Object(l.c)(["\n\t\t\t\tfont-style: italic;\n\t\t "],["\n\t\t\t\tfont-style: italic;\n\t\t "]))):null})),v=function(e){return Object(p.a)((function(t){return c.createElement(b,Object(l.a)({as:e},t))}))},y=v();y.displayName="Txt",y.span=v("span"),y.p=v("p"),t.d=y},,function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getDefaultRegistry=function(){return{fields:n(1175).default,widgets:n(1187).default,definitions:{},rootSchema:{},formContext:{}}},t.getSchemaType=E,t.getWidget=T,t.hasWidget=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};try{return T(e,t,n),!0}catch(r){if(r.message&&(r.message.startsWith("No widget")||r.message.startsWith("Unsupported widget")))return!1;throw r}},t.getDefaultFormState=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=arguments.length>3&&void 0!==arguments[3]&&arguments[3];if(!A(e))throw new Error("Invalid schema: "+e);var a=j(e,n,t),i=_(a,e.default,n,t,r);if("undefined"===typeof t)return i;if(A(t)||Array.isArray(t))return S(i,t);if(0===t||!1===t||""===t)return t;return t||i},t.mergeDefaultsWithFormData=S,t.getUiOptions=O,t.getDisplayLabel=function(e,t,n){var r=O(t).label,a=void 0===r||r;"array"===e.type&&(a=N(e,n)||I(e,t,n));"object"===e.type&&(a=!1);"boolean"!==e.type||t["ui:widget"]||(a=!1);t["ui:field"]&&(a=!1);return a},t.isObject=A,t.mergeObjects=w,t.asNumber=function(e){if(""===e)return;if(null===e)return null;if(/\.$/.test(e))return e;if(/\.0$/.test(e))return e;var t=Number(e),n="number"===typeof t&&!Number.isNaN(t);if(/\.\d*0$/.test(e))return e;return n?t:e},t.orderProperties=function(e,t){if(!Array.isArray(t))return e;var n=function(e){return e.reduce((function(e,t){return e[t]=!0,e}),{})},r=n(e),a=t.filter((function(e){return"*"===e||r[e]})),i=n(a),o=e.filter((function(e){return!i[e]})),s=a.indexOf("*");if(-1===s){if(o.length)throw new Error("uiSchema order list does not contain ".concat((l=o).length>1?"properties '".concat(l.join("', '"),"'"):"property '".concat(l[0],"'")));return a}var l;if(s!==a.lastIndexOf("*"))throw new Error("uiSchema order list contains more than one wildcard item");var c=f(a);return c.splice.apply(c,[s,1].concat(f(o))),c},t.isConstant=k,t.toConstant=C,t.isSelect=x,t.isMultiSelect=N,t.isFilesArray=I,t.isFixedItems=R,t.allowAdditionalItems=function(e){!0===e.additionalItems&&console.warn("additionalItems=true is currently not supported");return A(e.additionalItems)},t.optionsList=function(e){return e.enum?e.enum.map((function(t,n){return{label:e.enumNames&&e.enumNames[n]||String(t),value:t}})):(e.oneOf||e.anyOf).map((function(e,t){var n=C(e);return{label:e.title||String(n),value:n}}))},t.findSchemaDefinition=P,t.stubExistingAdditionalProperties=L,t.resolveSchema=M,t.retrieveSchema=j,t.mergeSchemas=z,t.deepEquals=$,t.shouldRender=function(e,t,n){var r=e.props,a=e.state;return!$(r,t)||!$(a,n)},t.toIdSchema=function e(t,n,r){var a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"root",o={$id:n||i};if("$ref"in t||"dependencies"in t||"allOf"in t){var s=j(t,r,a);return e(s,n,r,a,i)}if("items"in t&&!t.items.$ref)return e(t.items,n,r,a,i);if("object"!==t.type)return o;for(var l in t.properties||{}){var c=t.properties[l],u=o.$id+"_"+l;o[l]=e(A(c)?c:{},u,r,(a||{})[l],i)}return o},t.toPathSchema=function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",r=arguments.length>2?arguments[2]:void 0,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},i={$name:n.replace(/^\./,"")};if("$ref"in t||"dependencies"in t||"allOf"in t){var o=j(t,r,a);return e(o,n,r,a)}t.hasOwnProperty("additionalProperties")&&(i.__rjsf_additionalProperties=!0);if(t.hasOwnProperty("items")&&Array.isArray(a))a.forEach((function(a,o){i[o]=e(t.items,"".concat(n,".").concat(o),r,a)}));else if(t.hasOwnProperty("properties"))for(var s in t.properties)i[s]=e(t.properties[s],"".concat(n,".").concat(s),r,(a||{})[s]);return i},t.parseDateString=function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(!e)return{year:-1,month:-1,day:-1,hour:t?-1:0,minute:t?-1:0,second:t?-1:0};var n=new Date(e);if(Number.isNaN(n.getTime()))throw new Error("Unable to parse date "+e);return{year:n.getUTCFullYear(),month:n.getUTCMonth()+1,day:n.getUTCDate(),hour:t?n.getUTCHours():0,minute:t?n.getUTCMinutes():0,second:t?n.getUTCSeconds():0}},t.toDateString=function(e){var t=e.year,n=e.month,r=e.day,a=e.hour,i=void 0===a?0:a,o=e.minute,s=void 0===o?0:o,l=e.second,c=void 0===l?0:l,u=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],d=Date.UTC(t,n-1,r,i,s,c),p=new Date(d).toJSON();return u?p:p.slice(0,10)},t.utcToLocal=function(e){if(!e)return"";var t=new Date(e),n=V(t.getFullYear(),4),r=V(t.getMonth()+1,2),a=V(t.getDate(),2),i=V(t.getHours(),2),o=V(t.getMinutes(),2),s=V(t.getSeconds(),2),l=V(t.getMilliseconds(),3);return"".concat(n,"-").concat(r,"-").concat(a,"T").concat(i,":").concat(o,":").concat(s,".").concat(l)},t.localToUTC=function(e){if(e)return new Date(e).toJSON()},t.pad=V,t.dataURItoBlob=function(e){var t,n=e.split(","),r=n[0].split(";"),a=r[0].replace("data:",""),i=r.filter((function(e){return"name"===e.split("=")[0]}));t=1!==i.length?"unknown":i[0].split("=")[1];for(var o=atob(n[1]),s=[],l=0;l=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}t.ADDITIONAL_PROPERTY_FLAG="__additional_property";var y={boolean:{checkbox:"CheckboxWidget",radio:"RadioWidget",select:"SelectWidget",hidden:"HiddenWidget"},string:{text:"TextWidget",password:"PasswordWidget",email:"EmailWidget",hostname:"TextWidget",ipv4:"TextWidget",ipv6:"TextWidget",uri:"URLWidget","data-url":"FileWidget",radio:"RadioWidget",select:"SelectWidget",textarea:"TextareaWidget",hidden:"HiddenWidget",date:"DateWidget",datetime:"DateTimeWidget","date-time":"DateTimeWidget","alt-date":"AltDateWidget","alt-datetime":"AltDateTimeWidget",color:"ColorWidget",file:"FileWidget"},number:{text:"TextWidget",select:"SelectWidget",updown:"UpDownWidget",range:"RangeWidget",radio:"RadioWidget",hidden:"HiddenWidget"},integer:{text:"TextWidget",select:"SelectWidget",updown:"UpDownWidget",range:"RangeWidget",radio:"RadioWidget",hidden:"HiddenWidget"},array:{select:"SelectWidget",checkboxes:"CheckboxesWidget",files:"FileWidget",hidden:"HiddenWidget"}};function E(e){var t=e.type;return!t&&e.const?D(e.const):!t&&e.enum?"string":t||!e.properties&&!e.additionalProperties?t instanceof Array&&2===t.length&&t.includes("null")?t.find((function(e){return"null"!==e})):t:"object"}function T(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},i=E(e);function o(e){if(!e.MergedWidget){var t=e.defaultProps&&e.defaultProps.options||{};e.MergedWidget=function(n){var a=n.options,i=void 0===a?{}:a,o=v(n,["options"]);return r.default.createElement(e,h({options:g({},t,i)},o))}}return e.MergedWidget}if("function"===typeof t||a.isForwardRef(r.default.createElement(t))||a.isMemo(t))return o(t);if("string"!==typeof t)throw new Error("Unsupported widget definition: ".concat(m(t)));if(n.hasOwnProperty(t)){var s=n[t];return T(e,s,n)}if(!y.hasOwnProperty(i))throw new Error('No widget for type "'.concat(i,'"'));if(y[i].hasOwnProperty(t)){var l=n[y[i][t]];return T(e,l,n)}throw new Error('No widget "'.concat(t,'" for type "').concat(i,'"'))}function _(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},a=arguments.length>4&&void 0!==arguments[4]&&arguments[4],i=A(e)?e:{},s=A(r)?r:{},l=t;if(A(l)&&A(i.default))l=w(l,i.default);else if("default"in i)l=i.default;else{if("$ref"in i){var c=P(i.$ref,n);return _(c,l,n,s,a)}if("dependencies"in i){var u=U(i,n,s);return _(u,l,n,s,a)}R(i)?l=i.items.map((function(e,r){return _(e,Array.isArray(t)?t[r]:void 0,n,s,a)})):"oneOf"in i?i=i.oneOf[W(void 0,i.oneOf,n)]:"anyOf"in i&&(i=i.anyOf[W(void 0,i.anyOf,n)])}switch("undefined"===typeof l&&(l=i.default),E(i)){case"object":return Object.keys(i.properties||{}).reduce((function(e,t){var r=_(i.properties[t],(l||{})[t],n,(s||{})[t],a);return(a||void 0!==r)&&(e[t]=r),e}),{});case"array":if(Array.isArray(l)&&(l=l.map((function(e,t){return _(i.items[t]||i.additionalItems||{},e,n)}))),Array.isArray(r)&&(l=r.map((function(e,t){return _(i.items,(l||{})[t],n,e)}))),i.minItems){if(N(i,n))return l||[];var d=l?l.length:0;if(i.minItems>d){var p=l||[],f=Array.isArray(i.items)?i.additionalItems:i.items,m=(0,o.default)(new Array(i.minItems-d),_(f,f.defaults,n));return p.concat(m)}}}return l}function S(e,t){if(Array.isArray(t))return Array.isArray(e)||(e=[]),t.map((function(t,n){return e[n]?S(e[n],t):t}));if(A(t)){var n=h({},e);return Object.keys(t).reduce((function(n,r){return n[r]=S(e?e[r]:{},t[r]),n}),n)}return t}function O(e){return Object.keys(e).filter((function(e){return 0===e.indexOf("ui:")})).reduce((function(t,n){var r=e[n];return"ui:widget"===n&&A(r)?(console.warn("Setting options via ui:widget object is deprecated, use ui:options instead"),g({},t,r.options||{},{widget:r.component})):"ui:options"===n&&A(r)?g({},t,r):g({},t,b({},n.substring(3),r))}),{})}function A(e){return!("undefined"!==typeof File&&e instanceof File)&&("object"===m(e)&&null!==e&&!Array.isArray(e))}function w(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],r=h({},e);return Object.keys(t).reduce((function(r,a){var i=e?e[a]:{},o=t[a];return e&&e.hasOwnProperty(a)&&A(o)?r[a]=w(i,o,n):n&&Array.isArray(i)&&Array.isArray(o)?r[a]=i.concat(o):r[a]=o,r}),r)}function k(e){return Array.isArray(e.enum)&&1===e.enum.length||e.hasOwnProperty("const")}function C(e){if(Array.isArray(e.enum)&&1===e.enum.length)return e.enum[0];if(e.hasOwnProperty("const"))return e.const;throw new Error("schema cannot be inferred as a constant")}function x(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=j(e,t),r=n.oneOf||n.anyOf;return!!Array.isArray(n.enum)||!!Array.isArray(r)&&r.every((function(e){return k(e)}))}function N(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return!(!e.uniqueItems||!e.items)&&x(e.items,t)}function I(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if("files"===t["ui:widget"])return!0;if(e.items){var r=j(e.items,n);return"string"===r.type&&"data-url"===r.format}return!1}function R(e){return Array.isArray(e.items)&&e.items.length>0&&e.items.every((function(e){return A(e)}))}function P(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=e;if(!e.startsWith("#"))throw new Error("Could not find a definition for ".concat(n,"."));e=decodeURIComponent(e.substring(1));var r=c.default.get(t,e);if(void 0===r)throw new Error("Could not find a definition for ".concat(n,"."));return r.hasOwnProperty("$ref")?P(r.$ref,t):r}var D=function(e){return Array.isArray(e)?"array":"string"===typeof e?"string":null==e?"null":"boolean"===typeof e?"boolean":isNaN(e)?"object"===m(e)?"object":"string":"number"};function L(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return e=g({},e,{properties:g({},e.properties)}),Object.keys(n).forEach((function(r){var a;e.properties.hasOwnProperty(r)||(a=e.additionalProperties.hasOwnProperty("$ref")?j({$ref:e.additionalProperties.$ref},t,n):e.additionalProperties.hasOwnProperty("type")?g({},e.additionalProperties):{type:D(n[r])},e.properties[r]=a,e.properties[r].__additional_property=!0)})),e}function M(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e.hasOwnProperty("$ref"))return F(e,t,n);if(e.hasOwnProperty("dependencies")){var r=U(e,t,n);return j(r,t,n)}return e.hasOwnProperty("allOf")?g({},e,{allOf:e.allOf.map((function(e){return j(e,t,n)}))}):e}function F(e,t,n){var r=P(e.$ref,t);e.$ref;return j(g({},r,v(e,["$ref"])),t,n)}function j(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(!A(e))return{};var r=M(e,t,n);if("allOf"in e)try{r=(0,i.default)(g({},r,{allOf:r.allOf}))}catch(l){console.warn("could not merge subschemas in allOf:\n"+l);var a=r,o=(a.allOf,v(a,["allOf"]));return o}var s=r.hasOwnProperty("additionalProperties")&&!1!==r.additionalProperties;return s?L(r,t,n):r}function U(e,t,n){var r=e.dependencies,a=void 0===r?{}:r,i=v(e,["dependencies"]);return"oneOf"in i?i=i.oneOf[W(n,i.oneOf,t)]:"anyOf"in i&&(i=i.anyOf[W(n,i.anyOf,t)]),function e(t,n,r,a){for(var i in t)if(void 0!==a[i]&&(!n.properties||i in n.properties)){var o=t[i],s=v(t,[i].map(p));return Array.isArray(o)?n=B(n,o):A(o)&&(n=H(n,r,a,i,o)),e(s,n,r,a)}return n}(a,i,t,n)}function B(e,t){return t?g({},e,{required:Array.isArray(e.required)?Array.from(new Set([].concat(f(e.required),f(t)))):t}):e}function H(e,t,n,r,a){var i=j(a,t,n),o=i.oneOf;if(e=z(e,v(i,["oneOf"])),void 0===o)return e;if(!Array.isArray(o))throw new Error("invalid: it is some ".concat(m(o)," instead of an array"));var l=o.map((function(e){return e.hasOwnProperty("$ref")?F(e,t,n):e}));return function(e,t,n,r,a){var i=a.filter((function(e){if(!e.properties)return!1;var t=e.properties[r];if(t){var a={type:"object",properties:b({},r,t)};return 0===(0,s.default)(n,a).errors.length}}));if(1!==i.length)return console.warn("ignoring oneOf in dependencies because there isn't exactly one subschema that is valid"),e;var o=i[0],l=o.properties,c=(l[r],v(l,[r].map(p))),u=g({},o,{properties:c});return z(e,j(u,t,n))}(e,t,n,r,l)}function z(e,t){var n=h({},e);return Object.keys(t).reduce((function(n,r){var a=e?e[r]:{},i=t[r];return e&&e.hasOwnProperty(r)&&A(i)?n[r]=z(a,i):e&&t&&("object"===E(e)||"object"===E(t))&&"required"===r&&Array.isArray(a)&&Array.isArray(i)?n[r]=(0,l.default)(a,i):n[r]=i,n}),n)}function G(e){return"[object Arguments]"===Object.prototype.toString.call(e)}function $(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[];if(e===t)return!0;if("function"===typeof e||"function"===typeof t)return!0;if("object"!==m(e)||"object"!==m(t))return!1;if(null===e||null===t)return!1;if(e instanceof Date&&t instanceof Date)return e.getTime()===t.getTime();if(e instanceof RegExp&&t instanceof RegExp)return e.source===t.source&&e.global===t.global&&e.multiline===t.multiline&&e.lastIndex===t.lastIndex&&e.ignoreCase===t.ignoreCase;if(G(e)||G(t)){if(!G(e)||!G(t))return!1;var a=Array.prototype.slice;return $(a.call(e),a.call(t),n,r)}if(e.constructor!==t.constructor)return!1;var i=Object.keys(e),o=Object.keys(t);if(0===i.length&&0===o.length)return!0;if(i.length!==o.length)return!1;for(var s,l=n.length;l--;)if(n[l]===e)return r[l]===t;n.push(e),r.push(t),i.sort(),o.sort();for(var c=i.length-1;c>=0;c--)if(i[c]!==o[c])return!1;for(var u=i.length-1;u>=0;u--)if(!$(e[s=i[u]],t[s],n,r))return!1;return n.pop(),r.pop(),!0}function V(e,t){for(var n=String(e);n.length=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}function f(e){return function(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t0||!Array.isArray(t)&&t?c({},e,t):{}}function y(e){var t=e.forwardedRef,n=p(e,["forwardedRef"]),a=n.icon,i=n.mask,o=n.symbol,s=n.className,l=n.title,u=b(a),m=v("classes",[].concat(f(function(e){var t,n=e.spin,r=e.pulse,a=e.fixedWidth,i=e.inverse,o=e.border,s=e.listItem,l=e.flip,u=e.size,d=e.rotation,p=e.pull,f=(c(t={"fa-spin":n,"fa-pulse":r,"fa-fw":a,"fa-inverse":i,"fa-border":o,"fa-li":s,"fa-flip-horizontal":"horizontal"===l||"both"===l,"fa-flip-vertical":"vertical"===l||"both"===l},"fa-".concat(u),"undefined"!==typeof u&&null!==u),c(t,"fa-rotate-".concat(d),"undefined"!==typeof d&&null!==d&&0!==d),c(t,"fa-pull-".concat(p),"undefined"!==typeof p&&null!==p),c(t,"fa-swap-opacity",e.swapOpacity),t);return Object.keys(f).map((function(e){return f[e]?e:null})).filter((function(e){return e}))}(n)),f(s.split(" ")))),h=v("transform","string"===typeof n.transform?r.b.transform(n.transform):n.transform),T=v("mask",b(i)),_=Object(r.a)(u,d({},m,{},h,{},T,{symbol:o,title:l}));if(!_)return function(){var e;!g&&console&&"function"===typeof console.error&&(e=console).error.apply(e,arguments)}("Could not find icon",u),null;var S=_.abstract,O={ref:t};return Object.keys(n).forEach((function(e){y.defaultProps.hasOwnProperty(e)||(O[e]=n[e])})),E(S[0],O)}y.displayName="FontAwesomeIcon",y.propTypes={border:i.a.bool,className:i.a.string,mask:i.a.oneOfType([i.a.object,i.a.array,i.a.string]),fixedWidth:i.a.bool,inverse:i.a.bool,flip:i.a.oneOf(["horizontal","vertical","both"]),icon:i.a.oneOfType([i.a.object,i.a.array,i.a.string]),listItem:i.a.bool,pull:i.a.oneOf(["right","left"]),pulse:i.a.bool,rotation:i.a.oneOf([0,90,180,270]),size:i.a.oneOf(["lg","xs","sm","1x","2x","3x","4x","5x","6x","7x","8x","9x","10x"]),spin:i.a.bool,symbol:i.a.oneOfType([i.a.bool,i.a.string]),title:i.a.string,transform:i.a.oneOfType([i.a.string,i.a.object]),swapOpacity:i.a.bool},y.defaultProps={border:!1,className:"",mask:null,fixedWidth:!1,inverse:!1,flip:null,icon:null,listItem:!1,pull:null,pulse:!1,rotation:null,size:null,spin:!1,symbol:!1,title:"",transform:null,swapOpacity:!1};var E=function e(t,n){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if("string"===typeof n)return n;var a=(n.children||[]).map((function(n){return e(t,n)})),i=Object.keys(n.attributes||{}).reduce((function(e,t){var r=n.attributes[t];switch(t){case"class":e.attrs.className=r,delete n.attributes.class;break;case"style":e.attrs.style=h(r);break;default:0===t.indexOf("aria-")||0===t.indexOf("data-")?e.attrs[t.toLowerCase()]=r:e.attrs[m(t)]=r}return e}),{attrs:{}}),o=r.style,s=void 0===o?{}:o,l=p(r,["style"]);return i.attrs.style=d({},i.attrs.style,{},s),t.apply(void 0,[n.tag,d({},i.attrs,{},l)].concat(f(a)))}.bind(null,s.a.createElement)},,function(e,t){var n=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var r=n(434),a=n.n(r),i=n(79),o=n.n(i);function s(e){return(s="function"===typeof o.a&&"symbol"===typeof a.a?function(e){return typeof e}:function(e){return e&&"function"===typeof o.a&&e.constructor===o.a&&e!==o.a.prototype?"symbol":typeof e})(e)}},function(e,t,n){var r=n(217)("wks"),a=n(150),i=n(30).Symbol,o="function"==typeof i;(e.exports=function(e){return r[e]||(r[e]=o&&i[e]||(o?i:a)("Symbol."+e))}).store=r},function(e,t,n){"use strict";n.d(t,"a",(function(){return l}));var r,a=n(3),i=n(1),o=n(12),s=n(21),l=Object(i.default)(s.a)(r||(r=Object(a.c)(["\n\tdisplay: flex;\n\t",";\n\t",";\n\t",";\n\t",";\n"],["\n\tdisplay: flex;\n\t",";\n\t",";\n\t",";\n\t",";\n"])),o.g,o.f,o.a,o.j);l.displayName="Flex"},function(e,t){var n=Array.isArray;e.exports=n},function(e,t,n){"use strict";t.__esModule=!0,t.StyledIcon=void 0;var r,a=(r=n(0))&&r.__esModule?r:{default:r},i=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var r=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,n):{};r.get||r.set?Object.defineProperty(t,n,r):t[n]=e[n]}return t.default=e,t}(n(1)),o=n(1211),s=n(810);function l(){return(l=Object.assign||function(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,["a11yTitle","color","size","theme"]));return a.default.createElement("svg",l({"aria-label":t},n))};u.displayName="Icon";var d=(0,i.default)(u).withConfig({displayName:"StyledIcon",componentId:"ofa7kd-0"})(["display:inline-block;flex:0 0 auto;"," "," ",""],(function(e){var t=e.size,n=void 0===t?"medium":t,r=e.theme;return"\n width: "+(r.icon.size[n]||n)+";\n height: "+(r.icon.size[n]||n)+";\n "}),(function(e){return"plain"!==e.color&&c}),(function(e){var t=e.theme;return t&&t.icon.extend}));t.StyledIcon=d,d.defaultProps={},Object.setPrototypeOf(d.defaultProps,s.defaultProps)},function(e,t,n){"use strict";e.exports=function(e,t){var n,a,i=t.children||[],o=i.length,s=[],l=-1;for(;++le.length)&&(t=e.length);for(var n=0,r=new Array(t);nv.a.length)throw new Error("There should be no more than "+v.a.length+" value entries");var t=m.useContext(b.a).currentBreakpoint,n=Array(v.a.length-e.length).fill(e[e.length-1]);return Object(p.e)(e,n)[t]}(l||[!1]),d=!!e.bg||!!Object(y.c)(e)&&!t&&!n&&!e.plain,f=e.bg||Object(y.b)(e,"bg","main");f=f||e.theme.colors.secondary.main,o&&(d=!d);var h=function(e,t){var n=e.outline,r=e.underline,a=e.plain,i=e.active,o=e.light;return a?k:o?n?w:A:r?x:n&&!i||!t?O:S}({underline:n,plain:i,active:o,light:s},d);return m.createElement(h,Object(p.a)({primary:d,color:f,active:o&&(n||i),gap:Object(E.c)(e.theme.space[2])},c,{plain:!!i||!!n,label:u?void 0:a||r}))}),[],["width","color","bg"])},function(e,t,n){"use strict";e.exports=function(e,t,n){var r;null!==n&&void 0!==n||"object"===typeof t&&!Array.isArray(t)||(n=t,t={});r=Object.assign({type:String(e)},t),Array.isArray(n)?r.children=n:null!==n&&void 0!==n&&(r.value=String(n));return r}},function(e,t,n){"use strict";function r(e){!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,i){if(n.language===r){var o=n.tokenStack=[];n.code=n.code.replace(a,(function(e){if("function"===typeof i&&!i(e))return e;for(var a,s=o.length;-1!==n.code.indexOf(a=t(r,s));)++s;return o[s]=e,a})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,i=Object.keys(n.tokenStack);!function o(s){for(var l=0;l=i.length);l++){var c=s[l];if("string"===typeof c||c.content&&"string"===typeof c.content){var u=i[a],d=n.tokenStack[u],p="string"===typeof c?c:c.content,f=t(r,u),m=p.indexOf(f);if(m>-1){++a;var h=p.substring(0,m),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=p.substring(m+f.length),v=[];h&&v.push.apply(v,o([h])),v.push(g),b&&v.push.apply(v,o([b])),"string"===typeof c?s.splice.apply(s,[l,1].concat(v)):c.content=v}}else c.content&&o(c.content)}return s}(n.tokens)}}}})}(e)}e.exports=r,r.displayName="markupTemplating",r.aliases=[]},function(e,t,n){"use strict";n.d(t,"c",(function(){return p})),n.d(t,"a",(function(){return f})),n.d(t,"b",(function(){return o}));var r=n(0),a=(n(101),n(430),n(267)),i=n(187),o=function(e){return"string"===typeof e?e:e?e.displayName||e.name||"Component":void 0},s=function(e){return function(t){var n=Object(r.createFactory)(t);return function(t){return n(e(t))}}},l=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},c=Object.assign||function(e){for(var t=1;t0&&""===a[0]&&a.splice(0,1);var o=!0,s=!1,l=void 0;try{for(var u,p=c()(a.slice(0));!(o=(u=p.next()).done);o=!0){var m=u.value;m in i||(i[m]={}),i=i[m]}}catch(h){s=!0,l=h}finally{try{o||null==p.return||p.return()}finally{if(s)throw l}}return d()(i.__errors)?i.__errors=i.__errors.concat(r):r&&(i.__errors=[r]),e}),{}):{}}function _(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"root",n=[];return"__errors"in e&&(n=n.concat(e.__errors.map((function(e){return{stack:"".concat(t,": ").concat(e)}})))),s()(e).reduce((function(t,n){return"__errors"!==n&&(t=t.concat(_(e[n],n))),t}),n)}function S(e){var t={__errors:[],addError:function(e){this.__errors.push(e)}};return Object(g.r)(e)?s()(e).reduce((function(t,n){return Object(i.a)({},t,Object(a.a)({},n,S(e[n])))}),t):d()(e)?e.reduce((function(e,t,n){return Object(i.a)({},e,Object(a.a)({},n,S(t)))}),t):t}function O(e){return s()(e).reduce((function(t,n){return"addError"===n?t:"__errors"===n?Object(i.a)({},t,Object(a.a)({},n,e[n])):Object(i.a)({},t,Object(a.a)({},n,O(e[n])))}),{})}function A(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return null===e?[]:e.map((function(e){var t=e.dataPath,n=e.keyword,r=e.message,a=e.params,i=e.schemaPath,o="".concat(t);return{name:n,property:o,message:r,params:a,stack:"".concat(o," ").concat(r).trim(),schemaPath:i}}))}function w(e,t,n,a){var o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:[],l=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{},c=t;e=Object(g.f)(t,e,c,!0);var u=!Object(g.e)(y,o),p=!Object(g.e)(v,l);(u||p)&&(b=E()),o&&u&&d()(o)&&(b.addMetaSchema(o),y=o),l&&p&&Object(g.r)(l)&&(s()(l).forEach((function(e){b.addFormat(e,l[e])})),v=l);var f=null;try{b.validate(t,e)}catch(I){f=I}var m=A(b.errors);b.errors=null;var h=f&&f.message&&"string"===typeof f.message&&f.message.includes("no schema with key or ref ");h&&(m=[].concat(Object(r.a)(m),[{stack:f.message}])),"function"===typeof a&&(m=a(m));var w=T(m);if(h&&(w=Object(i.a)({},w,{$schema:{__errors:[f.message]}})),"function"!==typeof n)return{errors:m,errorSchema:w};var k=n(e,S(e)),C=O(k),x=Object(g.u)(w,C,!0),N=_(x);return{errors:N,errorSchema:x}}function k(e,t){try{return b.validate(e,t)}catch(n){return!1}}},function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(r){"object"===typeof window&&(n=window)}e.exports=n},function(e,t){e.exports=function(e){return null!=e&&"object"==typeof e}},function(e,t,n){var r=n(46);e.exports=function(e){if(!r(e))throw TypeError(e+" is not an object!");return e}},function(e,t,n){"use strict";!function e(){if("undefined"!==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"===typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE){0;try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}}(),e.exports=n(485)},function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));var r=n(12),a={primary:{main:"#00AEEF",semilight:"#aedff9",light:"#08bcff",dark:"#009dd7"},secondary:{main:"#2A506F",semilight:"#abb9c5",light:"#2e587a",dark:"#23445e"},tertiary:{main:"#527699",light:"#5b82a7",semilight:"#bbc8d6",dark:"#456482"},quartenary:{main:"#DDE1f0",light:"#f8f9fd",dark:"#b7bed3"},danger:{main:"#FF423D",semilight:"#ffa1a1",light:"#feebeb",dark:"#eb0800"},warning:{main:"#FCA321",semilight:"#fdd190",light:"#fef3e5",dark:"#ad6800"},success:{main:"#1AC135",semilight:"#8ce09a",light:"#e8f8ea",dark:"#138b27"},info:{main:"#1496E1",semilight:"#90cbee",light:"#e8f5fc",dark:"#107dbc"},text:{main:"#2A506F",light:"#527699",dark:"#23445e"},statusIdle:{main:"#89c683"},statusConfiguring:{main:"#ffb25e"},statusUpdating:{main:"#75C5F5"},statusPostProvisioning:{main:"#aa96d5"},statusOffline:{main:"#fd7c7c"},statusInactive:{main:"#d3d6db"},gray:{main:"#c6c8c9",light:"#f4f4f4",dark:"#9f9f9f"}},i=[576,768,992,1200],o=[0,4,8,16,38,48,128],s=[10,12,14,16,18,24,34,58,72],l="'Source Sans Pro', Helvetica, sans-serif",c={breakpoints:i,space:o,fontSizes:s,weights:[400,600],font:l,monospace:"'Ubuntu Mono', 'Courier New', monospace",lineHeight:1.5,colors:a,radius:3,header:{height:"0"},global:{font:{family:l,size:Object(r.p)(s[2]),height:1.5},control:{disabled:{opacity:.4},border:{radius:"4px",color:a.quartenary.main}},colors:{focus:a.primary.main,placeholder:a.secondary.semilight},selected:{background:a.primary.main},hover:{background:{color:a.quartenary.main,opacity:1},color:{dark:"inherit",light:"inherit"}},active:{background:{color:a.quartenary.main,opacity:1},color:{dark:"inherit",light:"inherit"}},drop:{border:{radius:"4px"},zIndex:45,extend:"\n\t\t\t\tcolor: "+a.secondary.main+"; border: 1px solid "+a.quartenary.main+";\n\t\t\t\tanimation-duration: 0s;\n\t\t\t"},input:{weight:400}},button:{height:"38px",font:{weight:600,size:Object(r.p)(s[2])},border:{width:"1px",radius:"20px",color:a.text.main},padding:{horizontal:"30px"}},navBar:{font:{size:Object(r.p)(s[2])}},radioButton:{border:{width:"1px",color:{dark:a.quartenary.main,light:a.quartenary.main}},hover:{border:{color:{dark:a.tertiary.main,light:a.tertiary.main}}},check:{color:{dark:"white",light:"white"}},icon:{size:"12px"},gap:"10px",size:"20px"},select:{icons:{color:a.secondary.main},control:{extend:"color: "+a.secondary.main}},layer:{container:{zIndex:40},zIndex:30},text:{medium:{size:Object(r.p)(s[2]),height:1.5}},tab:{extend:"padding: "+Object(r.p)(o[1])+" "+Object(r.p)(o[3]),color:a.secondary.main,margin:"none",border:{size:"xsmall",color:a.quartenary.main,active:{color:a.primary.main},hover:{color:a.quartenary.main}},hover:{color:a.primary.dark},active:{color:a.primary.main}},checkBox:{size:"20px",color:a.primary.main,border:{color:{dark:a.quartenary.main,light:a.quartenary.main},width:"1px"},check:{radius:"4px",thickness:"2px"},hover:{border:{color:{dark:a.quartenary.main,light:a.quartenary.main}}},toggle:{color:{dark:a.primary.main,light:a.quartenary.main},radius:"20px",size:"40px",knob:{}}},accordion:{border:{side:"bottom"}}};t.b=c},function(e,t){e.exports=function(e,t){for(var n=-1,r=null==e?0:e.length,a=Array(r);++n>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/,number:/(?:\b0x(?:[\da-f]+\.?[\da-f]*|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?)[ful]*/i}),e.languages.insertBefore("c","string",{macro:{pattern:/(^\s*)#\s*[a-z]+(?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},e.languages.c.string],comment:e.languages.c.comment,directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:e.languages.c}}},constant:/\b(?:__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|stdin|stdout|stderr)\b/}),delete e.languages.c.boolean}e.exports=r,r.displayName="c",r.aliases=[]},function(e,t,n){"use strict";e.exports=n(491)},function(e,t,n){var r=n(146);e.exports=function(e,t,n){var a=null==e?void 0:r(e,t);return void 0===a?n:a}},function(e,t,n){e.exports=n(597)},function(e,t,n){"use strict";function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n>16&255,e>>8&255,255&e],this.valpha=1;else{this.valpha=1;var m=Object.keys(e);"alpha"in e&&(m.splice(m.indexOf("alpha"),1),this.valpha="number"===typeof e.alpha?e.alpha:0);var h=m.sort().join("");if(!(h in s))throw new Error("Unable to parse color from object: "+JSON.stringify(e));this.model=s[h];var g=a[this.model].labels,b=[];for(n=0;nn?(t+.05)/(n+.05):(n+.05)/(t+.05)},level:function(e){var t=this.contrast(e);return t>=7.1?"AAA":t>=4.5?"AA":""},isDark:function(){var e=this.rgb().color;return(299*e[0]+587*e[1]+114*e[2])/1e3<128},isLight:function(){return!this.isDark()},negate:function(){for(var e=this.rgb(),t=0;t<3;t++)e.color[t]=255-e.color[t];return e},lighten:function(e){var t=this.hsl();return t.color[2]+=t.color[2]*e,t},darken:function(e){var t=this.hsl();return t.color[2]-=t.color[2]*e,t},saturate:function(e){var t=this.hsl();return t.color[1]+=t.color[1]*e,t},desaturate:function(e){var t=this.hsl();return t.color[1]-=t.color[1]*e,t},whiten:function(e){var t=this.hwb();return t.color[1]+=t.color[1]*e,t},blacken:function(e){var t=this.hwb();return t.color[2]+=t.color[2]*e,t},grayscale:function(){var e=this.rgb().color,t=.3*e[0]+.59*e[1]+.11*e[2];return c.rgb(t,t,t)},fade:function(e){return this.alpha(this.valpha-this.valpha*e)},opaquer:function(e){return this.alpha(this.valpha+this.valpha*e)},rotate:function(e){var t=this.hsl(),n=t.color[0];return n=(n=(n+e)%360)<0?360+n:n,t.color[0]=n,t},mix:function(e,t){if(!e||!e.rgb)throw new Error('Argument to "mix" was not a Color instance, but rather an instance of '+typeof e);var n=e.rgb(),r=this.rgb(),a=void 0===t?.5:t,i=2*a-1,o=n.alpha()-r.alpha(),s=((i*o===-1?i:(i+o)/(1+i*o))+1)/2,l=1-s;return c.rgb(s*n.red()+l*r.red(),s*n.green()+l*r.green(),s*n.blue()+l*r.blue(),n.alpha()*a+r.alpha()*(1-a))}},Object.keys(a).forEach((function(e){if(-1===o.indexOf(e)){var t=a[e].channels;c.prototype[e]=function(){if(this.model===e)return new c(this);if(arguments.length)return new c(arguments,e);var n="number"===typeof arguments[t]?t:this.valpha;return new c(p(a[this.model][e].raw(this.color)).concat(n),e)},c[e]=function(n){return"number"===typeof n&&(n=f(i.call(arguments),t)),new c(n,e)}}})),e.exports=c},function(e,t,n){var r=n(45).Symbol;e.exports=r},function(e,t){e.exports=function(e,t){return e===t||e!==e&&t!==t}},function(e,t,n){var r=n(197),a=n(198);e.exports=function(e,t,n,i){var o=!n;n||(n={});for(var s=-1,l=t.length;++s=t.length?{value:void 0,done:!0}:(e=r(t,n),this._i+=e.length,{value:e,done:!1})}))},function(e,t){e.exports={}},function(e,t,n){"use strict";function r(e,t,n){var r=n?" !== ":" === ",a=n?" || ":" && ",i=n?"!":"",o=n?"":"!";switch(e){case"null":return t+r+"null";case"array":return i+"Array.isArray("+t+")";case"object":return"("+i+t+a+"typeof "+t+r+'"object"'+a+o+"Array.isArray("+t+"))";case"integer":return"(typeof "+t+r+'"number"'+a+o+"("+t+" % 1)"+a+t+r+t+")";default:return"typeof "+t+r+'"'+e+'"'}}e.exports={copy:function(e,t){for(var n in t=t||{},e)t[n]=e[n];return t},checkDataType:r,checkDataTypes:function(e,t){switch(e.length){case 1:return r(e[0],t,!0);default:var n="",a=i(e);for(var o in a.array&&a.object&&(n=a.null?"(":"(!"+t+" || ",n+="typeof "+t+' !== "object")',delete a.null,delete a.array,delete a.object),a.number&&delete a.integer,a)n+=(n?" && ":"")+r(o,t,!0);return n}},coerceToTypes:function(e,t){if(Array.isArray(t)){for(var n=[],r=0;r=t)throw new Error("Cannot access property/index "+r+" levels up, current level is "+t);return n[t-r]}if(r>t)throw new Error("Cannot access data "+r+" levels up, current level is "+t);if(i="data"+(t-r||""),!a)return i}for(var s=i,c=a.split("/"),u=0;u=48&&t<=57}},function(e,t){(t=e.exports=function(e){return e.replace(/^\s*|\s*$/g,"")}).left=function(e){return e.replace(/^\s*/,"")},t.right=function(e){return e.replace(/\s*$/,"")}},function(e,t,n){"use strict";e.exports=function(e,t){var n=[],a=-1,i=e.length;t&&n.push(r("text","\n"));for(;++a1),t})),s(e,u(e),n),c&&(n=a(n,7,l));for(var d=t.length;d--;)i(n,t[d]);return n}));e.exports=d},function(e,t,n){e.exports=n(666)},function(e,t,n){e.exports=n(680)},function(e,t,n){e.exports=n(802)},function(e,t,n){"use strict";var r=Object.prototype.hasOwnProperty;function a(e,t){return e===t?0!==e||0!==t||1/e===1/t:e!==e&&t!==t}e.exports=function(e,t){if(a(e,t))return!0;if("object"!==typeof e||null===e||"object"!==typeof t||null===t)return!1;var n=Object.keys(e),i=Object.keys(t);if(n.length!==i.length)return!1;for(var o=0;oy;y++)if((g=t?v(o(m=e[y])[0],m[1]):v(e[y]))===c||g===u)return g}else for(h=b.call(e);!(m=h.next()).done;)if((g=a(h,v,m.value,t))===c||g===u)return g}).BREAK=c,t.RETURN=u},function(e,t,n){var r=n(692),a=n(695),i=n(106),o=n(34),s=n(696);e.exports=function(e){return"function"==typeof e?e:null==e?i:"object"==typeof e?o(e)?a(e[0],e[1]):r(e):s(e)}},function(e,t,n){"use strict";var r=n(842),a=n(843),i=n(92),o=n(844),s=n(845),l=n(846);e.exports=function(e,t){var n,i,o={};t||(t={});for(i in p)n=t[i],o[i]=null===n||void 0===n?p[i]:n;(o.position.indent||o.position.start)&&(o.indent=o.position.indent||[],o.position=o.position.start);return function(e,t){var n,i,o,p,y,E,T,_,S,O,A,w,k,C,x,N,I,R,P,D=t.additional,L=t.nonTerminated,M=t.text,F=t.reference,j=t.warning,U=t.textContext,B=t.referenceContext,H=t.warningContext,z=t.position,G=t.indent||[],$=e.length,V=0,W=-1,K=z.column||1,q=z.line||1,Y="",X=[];"string"===typeof D&&(D=D.charCodeAt(0));N=Z(),_=j?function(e,t){var n=Z();n.column+=t,n.offset+=t,j.call(H,b[e],n,e)}:d,V--,$++;for(;++V<$;)if(10===y&&(K=G[W]||1),38===(y=e.charCodeAt(V))){if(9===(T=e.charCodeAt(V+1))||10===T||12===T||32===T||38===T||60===T||T!==T||D&&T===D){Y+=u(y),K++;continue}for(w=k=V+1,P=k,35===T?(P=++w,88===(T=e.charCodeAt(P))||120===T?(C=m,P=++w):C="decimal"):C=f,n="",A="",p="",x=g[C],P--;++P<$&&(T=e.charCodeAt(P),x(T));)p+=u(T),C===f&&c.call(r,p)&&(n=p,A=r[p]);(o=59===e.charCodeAt(P))&&(P++,(i=C===f&&l(p))&&(n=p,A=i)),R=1+P-k,(o||L)&&(p?C===f?(o&&!A?_(5,1):(n!==p&&(P=w+n.length,R=1+P-w,o=!1),o||(S=n?1:3,t.attribute?61===(T=e.charCodeAt(P))?(_(S,R),A=null):s(T)?A=null:_(S,R):_(S,R))),E=A):(o||_(2,R),E=parseInt(p,h[C]),(Q=E)>=55296&&Q<=57343||Q>1114111?(_(7,R),E=u(65533)):E in a?(_(6,R),E=a[E]):(O="",v(E)&&_(6,R),E>65535&&(O+=u((E-=65536)>>>10|55296),E=56320|1023&E),E=O+u(E))):C!==f&&_(4,R)),E?(J(),N=Z(),V=P-1,K+=P-k+1,X.push(E),(I=Z()).offset++,F&&F.call(B,E,{start:N,end:I},e.slice(k-1,P)),N=I):(p=e.slice(k-1,P),Y+=p,K+=p.length,V=P-1)}else 10===y&&(q++,W++,K=0),y===y?(Y+=u(y),K++):J();var Q;return X.join("");function Z(){return{line:q,column:K,offset:V+(z.offset||0)}}function J(){Y&&(X.push(Y),M&&M.call(U,Y,{start:N,end:Z()}),Y="")}}(e,o)};var c={}.hasOwnProperty,u=String.fromCharCode,d=Function.prototype,p={warning:null,reference:null,text:null,warningContext:null,referenceContext:null,textContext:null,position:{},additional:null,attribute:!1,nonTerminated:!0},f="named",m="hexadecimal",h={hexadecimal:16,decimal:10},g={};g[f]=s,g.decimal=i,g[m]=o;var b={};function v(e){return e>=1&&e<=8||11===e||e>=13&&e<=31||e>=127&&e<=159||e>=64976&&e<=65007||65535===(65535&e)||65534===(65535&e)}b[1]="Named character references must be terminated by a semicolon",b[2]="Numeric character references must be terminated by a semicolon",b[3]="Named character references cannot be empty",b[4]="Numeric character references cannot be empty",b[5]="Named character references must be known",b[6]="Numeric character references cannot be disallowed",b[7]="Numeric character references cannot be outside the permissible Unicode range"},function(e,t,n){"use strict";e.exports=function(e){var t="string"===typeof e?e.charCodeAt(0):e;return t>=97&&t<=122||t>=65&&t<=90}},function(e,t,n){"use strict";var r=n(396),a=n(398),i=n(401),o=n(402),s=n(405),l=n(918);e.exports=r([i,a,o,s,l])},function(e,t,n){"use strict";var r=n(396),a=n(398),i=n(401),o=n(402),s=n(405),l=n(919);e.exports=r([i,a,o,s,l])},function(e,t,n){"use strict";var r=n(243),a=n(399),i=n(400);e.exports=function(e,t){var n=r(t),d=t,p=i;if(n in e.normal)return e.property[e.normal[n]];n.length>4&&"data"===n.slice(0,4)&&o.test(t)&&("-"===t.charAt(4)?d=function(e){var t=e.slice(5).replace(s,u);return"data"+t.charAt(0).toUpperCase()+t.slice(1)}(t):t=function(e){var t=e.slice(4);if(s.test(t))return e;"-"!==(t=t.replace(l,c)).charAt(0)&&(t="-"+t);return"data"+t}(t),p=a);return new p(d,t)};var o=/^data[-\w.:]+$/i,s=/-[a-z]/g,l=/[A-Z]/g;function c(e){return"-"+e.toLowerCase()}function u(e){return e.charAt(1).toUpperCase()}},function(e){e.exports=JSON.parse('{"html":"http://www.w3.org/1999/xhtml","mathml":"http://www.w3.org/1998/Math/MathML","svg":"http://www.w3.org/2000/svg","xlink":"http://www.w3.org/1999/xlink","xml":"http://www.w3.org/XML/1998/namespace","xmlns":"http://www.w3.org/2000/xmlns/"}')},function(e,t,n){var r=n(209);e.exports=function(e,t){return r(e,t)}},function(e,t){e.exports=function(){}},function(e,t,n){e.exports=n(785)},function(e){e.exports=JSON.parse('{"strip":["script"],"clobberPrefix":"user-content-","clobber":["name","id"],"ancestors":{"tbody":["table"],"tfoot":["table"],"thead":["table"],"td":["table"],"th":["table"],"tr":["table"]},"protocols":{"href":["http","https","mailto","xmpp","irc","ircs"],"cite":["http","https"],"src":["http","https"],"longDesc":["http","https"]},"tagNames":["h1","h2","h3","h4","h5","h6","br","b","i","strong","em","a","pre","code","img","tt","div","ins","del","sup","sub","p","ol","ul","table","thead","tbody","tfoot","blockquote","dl","dt","dd","kbd","q","samp","var","hr","ruby","rt","rp","li","tr","td","th","s","strike","summary","details","caption","figure","figcaption","abbr","bdo","cite","dfn","mark","small","span","time","wbr","input"],"attributes":{"a":["href"],"img":["src","longDesc"],"input":[["type","checkbox"],["disabled",true]],"li":[["className","task-list-item"]],"div":["itemScope","itemType"],"blockquote":["cite"],"del":["cite"],"ins":["cite"],"q":["cite"],"*":["abbr","accept","acceptCharset","accessKey","action","align","alt","ariaDescribedBy","ariaHidden","ariaLabel","ariaLabelledBy","axis","border","cellPadding","cellSpacing","char","charOff","charSet","checked","clear","cols","colSpan","color","compact","coords","dateTime","dir","disabled","encType","htmlFor","frame","headers","height","hrefLang","hSpace","isMap","id","label","lang","maxLength","media","method","multiple","name","noHref","noShade","noWrap","open","prompt","readOnly","rel","rev","rows","rowSpan","rules","scope","selected","shape","size","span","start","summary","tabIndex","target","title","type","useMap","vAlign","value","vSpace","width","itemProp"]},"required":{"input":{"type":"checkbox","disabled":true}}}')},,function(e,t){var n,r,a=e.exports={};function i(){throw new Error("setTimeout has not been defined")}function o(){throw new Error("clearTimeout has not been defined")}function s(e){if(n===setTimeout)return setTimeout(e,0);if((n===i||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"===typeof setTimeout?setTimeout:i}catch(e){n=i}try{r="function"===typeof clearTimeout?clearTimeout:o}catch(e){r=o}}();var l,c=[],u=!1,d=-1;function p(){u&&l&&(u=!1,l.length?c=l.concat(c):d=-1,c.length&&f())}function f(){if(!u){var e=s(p);u=!0;for(var t=c.length;t;){for(l=c,c=[];++d1)for(var n=1;n0&&i(u)?n>1?e(u,n-1,i,o,s):r(s,u):o||(s[s.length]=u)}return s}},function(e,t,n){var r=n(520),a=n(52),i=Object.prototype,o=i.hasOwnProperty,s=i.propertyIsEnumerable,l=r(function(){return arguments}())?r:function(e){return a(e)&&o.call(e,"callee")&&!s.call(e,"callee")};e.exports=l},function(e,t,n){var r=n(70),a=n(52);e.exports=function(e){return a(e)&&r(e)}},function(e,t,n){var r=n(135),a=n(524),i=n(525),o=n(526),s=n(527),l=n(528);function c(e){var t=this.__data__=new r(e);this.size=t.size}c.prototype.clear=a,c.prototype.delete=i,c.prototype.get=o,c.prototype.has=s,c.prototype.set=l,e.exports=c},function(e,t,n){(function(e){var r=n(45),a=n(531),i=t&&!t.nodeType&&t,o=i&&"object"==typeof e&&e&&!e.nodeType&&e,s=o&&o.exports===i?r.Buffer:void 0,l=(s?s.isBuffer:void 0)||a;e.exports=l}).call(this,n(107)(e))},function(e,t){var n=/^(?:0|[1-9]\d*)$/;e.exports=function(e,t){var r=typeof e;return!!(t=null==t?9007199254740991:t)&&("number"==r||"symbol"!=r&&n.test(e))&&e>-1&&e%1==0&&e0?a(r(e),9007199254740991):0}},function(e,t,n){var r=n(53),a=n(584),i=n(221),o=n(220)("IE_PROTO"),s=function(){},l=function(){var e,t=n(214)("iframe"),r=i.length;for(t.style.display="none",n(315).appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write("