diff --git a/.github/workflows/issue-auto-reply.yml b/.github/workflows/issue-auto-reply.yml
new file mode 100644
index 00000000..8515b140
--- /dev/null
+++ b/.github/workflows/issue-auto-reply.yml
@@ -0,0 +1,28 @@
+name: Auto-Reply to New Issues
+
+on:
+ issues:
+ types: [opened]
+
+permissions:
+ issues: write
+
+jobs:
+ post-welcome-comment:
+ name: Post Welcome Comment
+ runs-on: ubuntu-latest
+ steps:
+ - name: Post welcome comment on new issue
+ uses: actions/github-script@v7
+ with:
+ script: |
+ const message = `Thank you for raising this issue! Our team will review it soon.
+
+ For more queries or discussions or approval of requests, please join the Discord server for further discussion: [Discord Link](https://discord.com/invite/Yn9g6KuWyA)`;
+
+ await github.rest.issues.createComment({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ issue_number: context.issue.number,
+ body: message
+ });
\ No newline at end of file
diff --git a/Auto WiFi Check/requirements.txt b/Auto WiFi Check/requirements.txt
index 7a7d08a2..4d227ca1 100644
--- a/Auto WiFi Check/requirements.txt
+++ b/Auto WiFi Check/requirements.txt
@@ -1 +1 @@
-schedule==1.1.0
+schedule==1.2.2
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 00000000..c278f136
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,31 @@
+# Contributing to This Repository
+
+Thank you for your interest in contributing! We welcome contributions of Python scripts and improvements to this repository.
+
+## How to Contribute
+
+1. **Discuss First**
+ Before making any changes, please open an issue to discuss your idea with the maintainers. This helps us coordinate and avoid duplication.
+
+2. **Make Your Contribution**
+ - Fork the repository.
+ - Create a new folder named after your script or its purpose (short and descriptive).
+ - Add your Python script(s) inside this folder.
+ - Include a `README.md` in that folder explaining what your script does and any prerequisites.
+ - Update the main `README.md` by adding your script to the **List of Scripts** with its name, a brief description, and a link to your script folder.
+
+3. **Open a Pull Request (PR)**
+ - Link your PR to the issue you created earlier.
+ - We will review your changes and provide feedback or merge it if everything looks good.
+
+4. **Clean Up**
+ Ensure any temporary install or build dependencies are removed before submitting your PR.
+
+## First-Time Contributors
+
+If this is your first time contributing to an open source project, check out this helpful guide:
+[How to Make Your First Contribution](https://opensource.guide/how-to-contribute/)
+
+## Code of Conduct
+
+We strive to maintain a welcoming and inclusive community. Please read and respect our [Code of Conduct](https://github.com/DhanushNehru/Python-Scripts/blob/main/CODE_OF_CONDUCT.md) in all your interactions.
diff --git a/CONTRIBUTIONS.md b/CONTRIBUTIONS.md
deleted file mode 100644
index 6cbcddf1..00000000
--- a/CONTRIBUTIONS.md
+++ /dev/null
@@ -1,90 +0,0 @@
-# Contributing
-
-When contributing to this repository, please first discuss the change you wish to make via issue, with the maintainers of this repository before making a change.
-
-First time contributers can refer to various resources on how
-to make their first contribution, one which we would refer is [this.][first]
-
-Please note we have a code of conduct, please follow it in all your interactions with the project.
-
-## Pull Request Process
-
-1. Create an issue and fork the repository, add a new folder with a name that describes your script in short. You'll place your Python script(s) in there.
-2. Add a `README.md` in that file which explains your script
-and any prerequisites it may have.
-3. Update the main `README.md`, adding your script to the List of Scripts in Repo, providing the script's name, a link to it, and a brief description.
-4. Mention the issue you made in 1) in your Pull Request, which will be then verified and merged accordingly.
-5. Ensure any install or build dependencies are removed before the end of the layer when doing a build.
-
----
-## Code of Conduct
-
-### Our Pledge
-
-In the interest of fostering an open and welcoming environment, we as
-contributors and maintainers pledge to making participation in our project and
-our community a harassment-free experience for everyone, regardless of age, body
-size, disability, ethnicity, gender identity and expression, level of experience,
-nationality, personal appearance, race, religion, or sexual identity and
-orientation.
-
-### Our Standards
-
-Examples of behavior that contributes to creating a positive environment
-include:
-
-* Using welcoming and inclusive language
-* Being respectful of differing viewpoints and experiences
-* Gracefully accepting constructive criticism
-* Focusing on what is best for the community
-* Showing empathy towards other community members
-
-Examples of unacceptable behavior by participants include:
-
-* The use of sexualized language or imagery and unwelcome sexual attention or
-advances
-* Trolling, insulting/derogatory comments, and personal or political attacks
-* Public or private harassment
-* Publishing others' private information, such as a physical or electronic
- address, without explicit permission
-* Other conduct which could reasonably be considered inappropriate in a
- professional setting
-
-### Our Responsibilities
-
-Project maintainers are responsible for clarifying the standards of acceptable
-behavior and are expected to take appropriate and fair corrective action in
-response to any instances of unacceptable behavior.
-
-Project maintainers have the right and responsibility to remove, edit, or
-reject comments, commits, code, wiki edits, issues, and other contributions
-that are not aligned to this Code of Conduct, or to ban temporarily or
-permanently any contributor for other behaviors that they deem inappropriate,
-threatening, offensive, or harmful.
-
-### Scope
-
-This Code of Conduct applies both within project spaces and in public spaces
-when an individual is representing the project or its community. Examples of
-representing a project or community include using an official project e-mail
-address, posting via an official social media account, or acting as an appointed
-representative at an online or offline event. Representation of a project may be
-further defined and clarified by project maintainers.
-
-### Enforcement
-
-Instances of abusive, harassing, or otherwise unacceptable behavior may be
-reported by contacting the project team at [INSERT EMAIL ADDRESS]. All
-complaints will be reviewed and investigated and will result in a response that
-is deemed necessary and appropriate to the circumstances. The project team is
-obligated to maintain confidentiality with regard to the reporter of an incident.
-Further details of specific enforcement policies may be posted separately.
-
-Project maintainers who do not follow or enforce the Code of Conduct in good
-faith may face temporary or permanent repercussions as determined by other
-members of the project's leadership.
-
-### Attribution
-
-This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
-available [here.][version]
diff --git a/CSV_TO_NDJSON/README.md b/CSV_TO_NDJSON/README.md
new file mode 100644
index 00000000..4aaebdbe
--- /dev/null
+++ b/CSV_TO_NDJSON/README.md
@@ -0,0 +1,38 @@
+# README.md
+
+# CSV to NDJSON Converter
+
+This Python script converts a CSV file located in this folder into an NDJSON file saved in the same folder.
+
+## What is NDJSON?
+
+NDJSON (Newline Delimited JSON) is a convenient format for streaming JSON objects, where each line is a valid JSON object.
+It’s widely used in data pipelines and tools such as **Google Cloud BigQuery**, **ElasticSearch**, and many other data processing platforms.
+
+## How to use
+
+1. Place your CSV file in this folder.
+2. Make sure you have Python 3 installed.
+3. Run the script from this folder with:
+
+ ```bash
+ python csv_to_ndjson.py input.csv output.ndjson
+
+
+#### Example
+If you have a CSV file like this:
+
+```csv
+name,age,city
+Alice,30,New York
+Bob,25,Los Angeles
+```
+
+The output NDJSON will be:
+
+```json
+{"name":"Alice","age":"30","city":"New York"}
+{"name":"Bob","age":"25","city":"Los Angeles"}
+```
+
+Feel free to modify or extend it as needed.
diff --git a/CSV_TO_NDJSON/csv_to_ndjson.py b/CSV_TO_NDJSON/csv_to_ndjson.py
new file mode 100644
index 00000000..100da9c8
--- /dev/null
+++ b/CSV_TO_NDJSON/csv_to_ndjson.py
@@ -0,0 +1,39 @@
+# csv_to_ndjson.py
+import csv
+import json
+import sys
+import os
+
+
+def csv_to_ndjson(csv_filename, ndjson_filename):
+ base_dir = os.path.dirname(os.path.abspath(__file__))
+
+ csv_path = os.path.join(base_dir, csv_filename)
+ ndjson_path = os.path.join(base_dir, ndjson_filename)
+
+ try:
+ with (
+ open(csv_path, mode="r", encoding="utf-8") as f_csv,
+ open(ndjson_path, mode="w", encoding="utf-8") as f_ndjson,
+ ):
+ reader = csv.DictReader(f_csv)
+ for row in reader:
+ f_ndjson.write(
+ json.dumps(row, ensure_ascii=False, separators=(",", ":")) + "\n"
+ )
+
+ print(f"Successfully converted '{csv_path}' to '{ndjson_path}'")
+
+ except FileNotFoundError:
+ print(f"Error: CSV file '{csv_path}' not found.")
+ except Exception as e:
+ print(f"An error occurred: {e}")
+
+
+if __name__ == "__main__":
+ if len(sys.argv) != 3:
+ print("Usage: python csv_to_ndjson.py input.csv output.ndjson")
+ else:
+ csv_file = sys.argv[1]
+ ndjson_file = sys.argv[2]
+ csv_to_ndjson(csv_file, ndjson_file)
diff --git a/Chess Board/ChessBoard.py b/Chess Board/ChessBoard.py
index 122080a2..2c64f25c 100644
--- a/Chess Board/ChessBoard.py
+++ b/Chess Board/ChessBoard.py
@@ -1,20 +1,63 @@
import matplotlib.pyplot as plt
import numpy as np
-from matplotlib.colors import LogNorm
+from matplotlib.patches import Rectangle
-dx, dy = 0.015, 0.05
-# numpy.arange returns evenly spaced values within a given interval
-x = np.arange(-4.0, 4.0, dx) # Corrected -04.0 to -4.0
-y = np.arange(-4.0, 4.0, dy) # Corrected -04.0 to -4.0
-# returns coordinate matrices from coordinate vectors
-X, Y = np.meshgrid(x, y)
+# Chess symbols for pieces (Unicode)
+chess_pieces = {
+ "rook_white": "\u2656",
+ "rook_black": "\u265C",
+ "pawn_white": "\u2659",
+ "pawn_black": "\u265F",
+}
-extent = np.min(x), np.max(x), np.min(y), np.max(y)
+# Initial piece positions for demonstration
+initial_pieces = [
+ (0, 0, chess_pieces["rook_black"]),
+ (0, 7, chess_pieces["rook_black"]),
+ (7, 0, chess_pieces["rook_white"]),
+ (7, 7, chess_pieces["rook_white"]),
+ (1, 0, chess_pieces["pawn_black"]),
+ (1, 7, chess_pieces["pawn_black"]),
+ (6, 0, chess_pieces["pawn_white"]),
+ (6, 7, chess_pieces["pawn_white"]),
+]
-Z1 = np.add.outer(range(8), range(8)) % 2
+# Function to draw the chessboard
+def draw_chessboard(highlight_squares=None):
+ board_size = 8
+ chessboard = np.add.outer(range(board_size), range(board_size)) % 2
-plt.imshow(Z1, cmap="binary_r", interpolation="nearest", extent=extent, alpha=1)
+ fig, ax = plt.subplots(figsize=(8, 8))
+ ax.imshow(chessboard, cmap="cividis", interpolation="nearest")
-plt.title("Chess Board", fontweight="bold")
+ # Remove axes for a cleaner look
+ ax.set_xticks([])
+ ax.set_yticks([])
-plt.show()
+ # Add grid lines to separate the squares
+ for i in range(board_size + 1):
+ ax.axhline(i - 0.5, color="black", linewidth=1, alpha=0.7)
+ ax.axvline(i - 0.5, color="black", linewidth=1, alpha=0.7)
+
+ # Highlight specific squares
+ if highlight_squares:
+ for (row, col) in highlight_squares:
+ ax.add_patch(Rectangle((col - 0.5, row - 0.5), 1, 1, color="yellow", alpha=0.4))
+
+ # Add chess pieces
+ for row, col, piece in initial_pieces:
+ ax.text(col, row, piece, fontsize=28, ha="center", va="center", color="black" if (row + col) % 2 == 0 else "white")
+
+ # Add coordinate labels
+ for i in range(board_size):
+ ax.text(-0.8, i, str(8 - i), fontsize=12, va="center") # Row labels
+ ax.text(i, 8 - 0.3, chr(65 + i), fontsize=12, ha="center") # Column labels
+
+ # Title
+ ax.set_title("Chess Board", fontweight="bold", fontsize=16)
+
+ plt.show()
+
+# Highlight squares (optional demo)
+highlight = [(0, 0), (7, 7), (3, 3)] # Example of squares to highlight
+draw_chessboard(highlight_squares=highlight)
diff --git a/Connect Four/README.md b/Connect Four/README.md
new file mode 100644
index 00000000..622a49d8
--- /dev/null
+++ b/Connect Four/README.md
@@ -0,0 +1,37 @@
+# Connect Four
+I have created the board game, "Connect Four", using the programming language Python. The entire project was created all on one file. This was a project I chose to develop during my spare time as this was not a common project constructed by other developers. The program follows all rules of the game, where players can win by either having 4 in a row horizontally, vertically, or diagonally. The dimensions for this particular game is a 6x7 board. In other words, the board is designed as 6 rows and 7 columns. Therefore, I initialized a nested list called board that contains the 7 columns as elements, and the 6 rows within each element.
+
+```
+board = [["-"] * 6, ["-"] * 6, ["-"] * 6, ["-"] * 6, ["-"] * 6, ["-"] * 6, ["-"] * 6]
+```
+
+
+Determining the logic for a player to have 4 in a row diagonally proved to be the most challenging in my opinion. The best solution was to view this as positive and negative slopes since these diagonals were
+either from the bottom left to top right, or the top left to bottom right. Afterwards, I created two separate boards to determine all possible coordinates that can be starting points to create 4 in a row as shown
+in the table below:
+
+Note: The coordinate is [col, row]
+
+### Positive Slope Possible Starting Points
+| | | | | | | |
+|------------|------------|------------|------------|------------|------------|------------|
+| 1.1 | 2.1 | 3.1 | 4.1 | 5.1 | 6.1 | 7.1 |
+| 1.2 | 2.2 | 3.2 | 4.2 | 5.2 | 6.2 | 7.2 |
+| 1.3 | 2.3 | 3.3 | 4.3 | 5.3 | 6.3 | 7.3 |
+| 1.4 | 2.4 | 3.4 | 4.4 | 5.4 | 6.4 | 7.4 |
+| 1.5 | 2.5 | 3.5 | 4.5 | 5.5 | 6.5 | 7.5 |
+| 1.6 | 2.6 | 3.6 | 4.6 | 5.6 | 6.6 | 7.6 |
+
+
+### Negative Slope Possible Starting Points
+| | | | | | | |
+|------------|------------|------------|------------|------------|------------|------------|
+| 1.1 | 2.1 | 3.1 | 4.1 | 5.1 | 6.1 | 7.1 |
+| 1.2 | 2.2 | 3.2 | 4.2 | 5.2 | 6.2 | 7.2 |
+| 1.3 | 2.3 | 3.3 | 4.3 | 5.3 | 6.3 | 7.3 |
+| 1.4 | 2.4 | 3.4 | 4.4 | 5.4 | 6.4 | 7.4 |
+| 1.5 | 2.5 | 3.5 | 4.5 | 5.5 | 6.5 | 7.5 |
+| 1.6 | 2.6 | 3.6 | 4.6 | 5.6 | 6.6 | 7.6 |
+
+What I noticed is the positive slope starting points are from rows 4-6 and columns 1-4, while the negatiive slope starting points are from rows 1-3 and columns 1-4. Therefore, each type of slope has its own
+function and nested for loop that iterates through only the possible starting points.
\ No newline at end of file
diff --git a/Connect Four/connectfour.py b/Connect Four/connectfour.py
new file mode 100644
index 00000000..c5fd146e
--- /dev/null
+++ b/Connect Four/connectfour.py
@@ -0,0 +1,242 @@
+import random
+
+board = [["-"] * 6, ["-"] * 6, ["-"] * 6, ["-"] * 6, ["-"] * 6, ["-"] * 6, ["-"] * 6]
+
+
+def gamePlayTwoPlayers(p1, p2):
+ win = ""
+ while win == "":
+ column = int(input("{}'s turn. Enter which column you would like to drop your piece into: ".format(p1)))
+ connectFourBoard(column, "X")
+
+ if check_vertical_win(p1, p2, column):
+ print()
+ print(check_vertical_win(p1, p2, column))
+ break
+ if check_horizontal_win(p1, p2):
+ print()
+ print(check_horizontal_win(p1, p2))
+ break
+ if check_positive_diagonal_win(p1, p2):
+ print()
+ print(check_positive_diagonal_win(p1, p2))
+ break
+ if check_negative_diagonal_win(p1, p2):
+ print()
+ print(check_negative_diagonal_win(p1, p2))
+ break
+
+ column = int(input("{}'s turn. Enter which column you would like to drop your piece into: ".format(p2)))
+ connectFourBoard(column, "O")
+
+ if check_vertical_win(p1, p2, column):
+ print()
+ print(check_vertical_win(p1, p2, column))
+ break
+ if check_horizontal_win(p1, p2):
+ print()
+ print(check_horizontal_win("x", "O"))
+ break
+ if check_positive_diagonal_win(p1, p2):
+ print()
+ print(check_positive_diagonal_win(p1, p2))
+ break
+ if check_negative_diagonal_win(p1, p2):
+ print()
+ print(check_negative_diagonal_win(p1, p2))
+ break
+
+
+def gamePlayOnePlayer(p1, p2):
+ win = ""
+ while win == "":
+ column = int(input("{}'s turn. Enter which column you would like to drop your piece into: ".format(p1)))
+ connectFourBoard(column, "X")
+
+ if check_vertical_win(p1, p2, column):
+ print()
+ print(check_vertical_win(p1, p2, column))
+ break
+ if check_horizontal_win(p1, p2):
+ print()
+ print(check_horizontal_win(p1, p2))
+ break
+ if check_positive_diagonal_win(p1, p2):
+ print()
+ print(check_positive_diagonal_win(p1, p2))
+ break
+ if check_negative_diagonal_win(p1, p2):
+ print()
+ print(check_negative_diagonal_win(p1, p2))
+ break
+
+ print()
+
+ column = random.randint(1, 7)
+ connectFourBoard(column, "O")
+
+ if check_vertical_win(p1, p2, column):
+ print()
+ print(check_vertical_win(p1, p2, column))
+ break
+ if check_horizontal_win(p1, p2):
+ print()
+ print(check_horizontal_win(p1, p2))
+ break
+ if check_positive_diagonal_win(p1, p2):
+ print()
+ print(check_positive_diagonal_win(p1, p2))
+ break
+ if check_negative_diagonal_win(p1, p2):
+ print()
+ print(check_negative_diagonal_win(p1, p2))
+ break
+
+
+def connectFourBoard(col, playerIcon):
+ col -= 1
+ coordinate = []
+
+ for row in range(len(board[col])-1, -1, -1):
+ if board[col][row] == "-":
+ board[col][row] = playerIcon
+ coordinate.append([row, col])
+ break
+ for row in range(len(board)):
+ for col in range(len(board[row])):
+ print("|", board[row][col], "|", board[row+1][col], "|", board[row+2][col], "|", board[row+3][col], "|",
+ board[row+4][col], "|", board[row+5][col], "|", board[row+6][col], "|")
+ break
+
+
+def check_vertical_win(p1, p2, col):
+ playerCount1 = 0
+ playerCount2 = 0
+ col -= 1
+
+ for row in range(len(board[col])-1, -1, -1):
+ if board[col][row] == "X":
+ playerCount1 += 1
+ playerCount2 = 0
+ elif board[col][row] == "O":
+ playerCount2 += 1
+ playerCount1 = 0
+
+ if playerCount1 == 4:
+ return "{} Wins".format(p1)
+ elif playerCount2 == 4:
+ return "{} Wins".format(p2)
+
+
+def check_horizontal_win(p1, p2):
+ for row in range(len(board[0])-1, -1, -1):
+ playerCount1 = 0
+ playerCount2 = 0
+ for col in range(len(board)):
+ if board[col][row] == "X":
+ playerCount1 += 1
+ playerCount2 = 0
+ elif board[col][row] == "O":
+ playerCount2 += 1
+ playerCount1 = 0
+ elif board[col][row] == "-":
+ playerCount1 = 0
+ playerCount2 = 0
+
+ if playerCount1 == 4:
+ return "{} Wins".format(p1)
+ elif playerCount2 == 4:
+ return "{} Wins".format(p2)
+
+
+def check_positive_diagonal_win(p1, p2):
+ playerCount1 = 0
+ playerCount2 = 0
+
+ for row in range(len(board[0])-1, -1, -1):
+ for col in range(len(board)-3):
+ if board[col][row] == "X":
+ playerCount1 += 1
+ while playerCount1 < 4:
+ col += 1
+ row -= 1
+ if board[col][row] == "X":
+ playerCount1 += 1
+ else:
+ playerCount1 = 0
+ break
+ elif board[col][row] == "O":
+ playerCount1 += 1
+ while playerCount1 < 4:
+ col += 1
+ row -= 1
+ if board[col][row] == "O":
+ playerCount1 += 1
+ else:
+ playerCount1 = 0
+ break
+
+ if playerCount1 == 4:
+ return "{} Wins".format(p1)
+ elif playerCount2 == 4:
+ return "{} Wins".format(p2)
+ else:
+ playerCount1 = 0
+ playerCount2 = 0
+
+
+def check_negative_diagonal_win(p1, p2):
+ playerCount1 = 0
+ playerCount2 = 0
+
+ for row in range(len(board[0])-3):
+ for col in range(len(board)-3):
+ if board[col][row] == "X":
+ playerCount1 += 1
+ while playerCount1 < 4:
+ col += 1
+ row -= 1
+ if board[col][row] == "X":
+ playerCount1 += 1
+ else:
+ playerCount1 = 0
+ break
+ elif board[col][row] == "O":
+ playerCount1 += 1
+ while playerCount1 < 4:
+ col += 1
+ row += 1
+ if board[col][row] == "O":
+ playerCount1 += 1
+ else:
+ playerCount1 = 0
+ break
+
+ if playerCount1 == 4:
+ return "{} Wins".format(p1)
+ elif playerCount2 == 4:
+ return "{} Wins".format(p2)
+ else:
+ playerCount1 = 0
+ playerCount2 = 0
+
+
+def main():
+ print("Welcome to Connect Four! Connect 4 of your pieces in either horizontal, vertical, or diagonal to win.")
+
+ numPlayers = int(input("Choose how many players: "))
+
+ while numPlayers not in [1,2]:
+ numPlayers = int(input("Sorry for the value you entered was invalid. Are you playing with 1 or 2 players: "))
+
+ if numPlayers == 1:
+ player1 = input("Player 1, please enter your name: ")
+ player2 = "CPU"
+ gamePlayTwoPlayers(player1, player2)
+ elif numPlayers == 2:
+ player1 = input("Player 1, please enter your name: ")
+ player2 = input("Player 2, please enter your name: ")
+ gamePlayTwoPlayers(player1, player2)
+
+
+main()
\ No newline at end of file
diff --git a/Currency Script/.idea/.gitignore b/Currency Script/.idea/.gitignore
new file mode 100644
index 00000000..13566b81
--- /dev/null
+++ b/Currency Script/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/Currency Script/.idea/Currency Script.iml b/Currency Script/.idea/Currency Script.iml
new file mode 100644
index 00000000..1d27ed66
--- /dev/null
+++ b/Currency Script/.idea/Currency Script.iml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Currency Script/.idea/inspectionProfiles/Project_Default.xml b/Currency Script/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 00000000..c48cec66
--- /dev/null
+++ b/Currency Script/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Currency Script/.idea/inspectionProfiles/profiles_settings.xml b/Currency Script/.idea/inspectionProfiles/profiles_settings.xml
new file mode 100644
index 00000000..105ce2da
--- /dev/null
+++ b/Currency Script/.idea/inspectionProfiles/profiles_settings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Currency Script/.idea/misc.xml b/Currency Script/.idea/misc.xml
new file mode 100644
index 00000000..e939a18e
--- /dev/null
+++ b/Currency Script/.idea/misc.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Currency Script/.idea/modules.xml b/Currency Script/.idea/modules.xml
new file mode 100644
index 00000000..ff381672
--- /dev/null
+++ b/Currency Script/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Currency Script/.idea/vcs.xml b/Currency Script/.idea/vcs.xml
new file mode 100644
index 00000000..6c0b8635
--- /dev/null
+++ b/Currency Script/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Currency Script/currency.py b/Currency Script/currency.py
deleted file mode 100644
index 062e1a3e..00000000
--- a/Currency Script/currency.py
+++ /dev/null
@@ -1,38 +0,0 @@
-# Python program to convert the currency
-# of one country to that of another country
-
-# Import the modules needed
-import requests
-
-class Currency_convertor:
- # empty dict to store the conversion rates
- rates = {}
-
- def __init__(self, url):
- data = requests.get(url).json()
- # Extracting only the rates from the json data
- self.rates = data["rates"]
-
- # function to do a simple cross multiplication between
- # the amount and the conversion rates
- def convert(self, from_currency, to_currency, amount):
- initial_amount = amount
- if from_currency != 'EUR':
- amount = amount / self.rates[from_currency]
-
- # limiting the precision to 2 decimal places
- amount = round(amount * self.rates[to_currency], 2)
- print('{} {} = {} {}'.format(initial_amount, from_currency, amount, to_currency))
-
-# Driver code
-if __name__ == "__main__":
-
- YOUR_ACCESS_KEY = 'YOUR_ACCESS_KEY_HERE' # Define your access key
- url = f'http://data.fixer.io/api/latest?access_key={YOUR_ACCESS_KEY}' # Use f-string for cleaner concatenation
- c = Currency_convertor(url)
-
- from_country = input("From Country (currency code): ")
- to_country = input("To Country (currency code): ")
- amount = float(input("Amount: ")) # Use float for decimal support
-
- c.convert(from_country, to_country, amount)
diff --git a/Currency Script/currency_calculator.py b/Currency Script/currency_calculator.py
deleted file mode 100644
index e0ae9585..00000000
--- a/Currency Script/currency_calculator.py
+++ /dev/null
@@ -1,55 +0,0 @@
-# Importing necessary modules for currency formatting and HTTP requests
-from locale import currency
-import requests
-import json
-
-# Get the base currency input from the user and convert it to lowercase
-currency = input("Enter the base currency (e.g., USD, EUR): ").lower()
-
-# Initialize an empty cache to store exchange rates
-cache = {}
-
-# Infinite loop to process exchange requests until the user exits
-while True:
-
- # Get the target currency input from the user and convert it to lowercase
- currency_exch = input("Enter the currency to exchange to (leave blank to exit): ").lower()
-
- # If the input is blank, break out of the loop (exit condition)
- if currency_exch == '':
- break
-
- # Get the amount to exchange from the user
- amount_to_exch = int(input("Enter the amount to exchange: "))
-
- # URL for getting exchange rates from floatrates.com
- URL = f'http://www.floatrates.com/daily/{currency}.json'
-
- # Fetch the exchange rates in JSON format
- exch = json.loads(requests.get(URL).text)
-
- # Update cache for USD and EUR based on the base currency
- if currency == 'usd':
- # If base currency is USD, cache EUR rate
- cache.update(eur=exch['eur']['rate'])
- elif currency == 'eur':
- # If base currency is EUR, cache USD rate
- cache.update(usd=exch['usd']['rate'])
- else:
- # For other base currencies, cache both USD and EUR rates
- cache.update(usd=exch['usd']['rate'], eur=exch['eur']['rate'])
-
- print("Checking the cache...")
-
- # Check if the target currency's rate is in the cache
- if currency_exch in cache:
- # If the rate is in the cache, calculate the exchanged amount
- rate = round(amount_to_exch * cache[currency_exch], 2)
- print("Oh! It is in the cache!")
- print(f"You received {rate} {currency_exch.upper()}.")
- else:
- # If the rate is not in the cache, fetch it from the exchange rates and store it in cache
- print("Sorry, but it is not in the cache!")
- cache[currency_exch] = exch[currency_exch]['rate']
- rate = round(amount_to_exch * cache[currency_exch], 2)
- print(f"You received {rate} {currency_exch.upper()}.")
diff --git a/Currency Script/main.py b/Currency Script/main.py
new file mode 100644
index 00000000..f3643030
--- /dev/null
+++ b/Currency Script/main.py
@@ -0,0 +1,38 @@
+"""
+main.py - Simple CLI interface for Currency Converter
+
+Prompts user for input currencies and amount, and displays the converted value.
+"""
+
+from converter import CurrencyConverter
+
+def main():
+ """
+ Run the interactive currency converter CLI loop.
+ Prompts user for source and target currencies and amount to convert.
+ Continues until the user types 'no' to exit.
+ """
+ print("Welcome to the Currency Converter\n")
+
+ converter = CurrencyConverter()
+
+ while True:
+ try:
+ from_currency = input("Enter source currency code (e.g., AUD): ").strip().upper()
+ to_currency = input("Enter target currency code (e.g., USD): ").strip().upper()
+ amount = float(input(f"Enter amount in {from_currency}: "))
+
+ converted = converter.convert(from_currency, to_currency, amount)
+ print(f"\n✅ {amount} {from_currency} = {converted} {to_currency}\n")
+
+ except ValueError as e:
+ print(f"❌ Error: {e}\n")
+
+ # Ask to convert another or exit
+ again = input("Do you want to convert another amount? (yes/no): ").strip().lower()
+ if again != "yes":
+ print("Thank you for using the Currency Converter. Goodbye!")
+ break
+
+if __name__ == "__main__":
+ main()
diff --git a/Currency Script/readme.md b/Currency Script/readme.md
new file mode 100644
index 00000000..8fed1611
--- /dev/null
+++ b/Currency Script/readme.md
@@ -0,0 +1,57 @@
+Currency Converter
+==================
+
+A simple Python CLI application that converts an amount from one currency to another
+using live exchange rates fetched from an open API.
+
+Modules:
+--------
+
+1. **api_handler.py**
+ - Handles fetching exchange rate data from the online API.
+
+2. **currencies.py**
+ - Provides utility functions to list supported currencies and validate currency codes.
+
+3. **converter.py**
+ - Contains the core logic to convert between currencies using the exchange rates.
+
+4. **main.py**
+ - CLI interface where users input the currencies and amount to convert.
+
+5. **test_*.py**
+ - Unit tests for each module to ensure functionality.
+
+Requirements:
+-------------
+- Python 3.7+
+- `requests` library
+
+Install dependencies:
+---------------------
+Run the following command to install dependencies:
+- pip install -r requirements.txt
+
+How to Use:
+-----------
+Run the main script from the terminal:
+
+Follow the prompts to enter:
+- Source currency code (e.g., USD)
+- Target currency code (e.g., AUD)
+- Amount to convert
+
+The app will display the converted amount and allow you to repeat or exit.
+
+Testing:
+--------
+To run tests:
+- python -m unittest discover
+
+Note:
+-----
+The conversion is based on live exchange rates retrieved from:
+https://open.er-api.com/v6/latest
+
+Make sure you are connected to the internet when running the app.
+
diff --git a/Currency Script/requirements.txt b/Currency Script/requirements.txt
new file mode 100644
index 00000000..663bd1f6
--- /dev/null
+++ b/Currency Script/requirements.txt
@@ -0,0 +1 @@
+requests
\ No newline at end of file
diff --git a/Currency Script/setup.py b/Currency Script/setup.py
new file mode 100644
index 00000000..de3a6108
--- /dev/null
+++ b/Currency Script/setup.py
@@ -0,0 +1,9 @@
+from setuptools import setup
+
+setup(
+ name="currency_converter",
+ version="0.1",
+ install_requires=[
+ "requests"
+ ],
+)
\ No newline at end of file
diff --git a/Currency Script/src/__init__.py b/Currency Script/src/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Currency Script/src/api_handler.py b/Currency Script/src/api_handler.py
new file mode 100644
index 00000000..8a8f192f
--- /dev/null
+++ b/Currency Script/src/api_handler.py
@@ -0,0 +1,29 @@
+import requests
+
+def get_exchange_data(api_url: str = "https://open.er-api.com/v6/latest") -> dict:
+ """
+ Retrieve the latest foreign exchange rates from the specified API.
+
+ Args:
+ api_url (str): Endpoint to fetch exchange data from. Defaults to the open.er-api URL.
+
+ Returns:
+ dict: A dictionary containing the base currency, timestamp, and exchange rates.
+
+ Raises:
+ Exception: If the API request fails or returns a non-200 status.
+ """
+ response = requests.get(api_url)
+ if response.status_code != 200:
+ raise Exception(f"API request failed with status {response.status_code}")
+
+ data = response.json()
+
+ return data # Includes 'base_code', 'time_last_update_utc', and 'rates'
+
+# NOTE - for logging & debugging
+if __name__ == "__main__":
+ exchange_data = get_exchange_data()
+ print("Base currency:", exchange_data["base_code"])
+ print("Date:", exchange_data["time_last_update_utc"])
+ print("Rates:", list(exchange_data["rates"].items())[:5])
diff --git a/Currency Script/src/converter.py b/Currency Script/src/converter.py
new file mode 100644
index 00000000..df03f702
--- /dev/null
+++ b/Currency Script/src/converter.py
@@ -0,0 +1,49 @@
+from api_handler import get_exchange_data
+
+class CurrencyConverter:
+ def __init__(self):
+ data = get_exchange_data()
+ self.rates = data["rates"]
+
+ def convert(self, from_currency: str, to_currency: str, amount: float) -> float:
+ """
+ Convert amount between two currencies.
+
+ Args:
+ from_currency: Source currency code (e.g., 'USD')
+ to_currency: Target currency code (e.g., 'AUD')
+ amount: Amount to convert
+
+ Returns:
+ Converted amount as float
+
+ Raises:
+ ValueError: If a currency code is invalid
+ """
+ from_currency = from_currency.upper()
+ to_currency = to_currency.upper()
+
+ if from_currency not in self.rates or to_currency not in self.rates:
+ raise ValueError("Invalid currency code.")
+
+ # Convert amount to base (EUR), then to target
+ amount_in_base = amount if from_currency == "EUR" else amount / self.rates[from_currency]
+ converted_amount = round(amount_in_base * self.rates[to_currency], 2)
+ return converted_amount
+
+# --- DEBUG / MANUAL TEST SECTION ---
+# This section runs only when you run this file directly (not when imported elsewhere)
+if __name__ == "__main__":
+ print("Running manual test for CurrencyConverter...\n")
+
+ converter = CurrencyConverter()
+ from_cur = "USD"
+ to_cur = "AUD"
+ amt = 100.0
+
+ print(f"Converting {amt} {from_cur} to {to_cur}...")
+ try:
+ result = converter.convert(from_cur, to_cur, amt)
+ print(f"{amt} {from_cur} = {result} {to_cur}")
+ except ValueError as e:
+ print("Error during conversion:", e)
\ No newline at end of file
diff --git a/Currency Script/src/currencies.py b/Currency Script/src/currencies.py
new file mode 100644
index 00000000..ba5be173
--- /dev/null
+++ b/Currency Script/src/currencies.py
@@ -0,0 +1,46 @@
+from api_handler import get_exchange_data
+
+def get_supported_currencies(rates):
+ """
+ Return a list of supported currency codes from the rates dictionary.
+
+ Args:
+ rates (dict): Dictionary of currency codes and their exchange rates.
+
+ Returns:
+ list: List of supported currency codes (e.g., ['USD', 'EUR']).
+ """
+ return list(rates.keys())
+
+def is_valid_currency(currency_code, rates):
+ """
+ Check if the given currency code is valid and supported.
+
+ Args:
+ currency_code (str): Currency code to validate (e.g., 'USD').
+ rates (dict): Dictionary of available exchange rates.
+
+ Returns:
+ bool: True if the currency code exists in the rates, False otherwise.
+ """
+ return currency_code.upper() in rates
+
+# --- DEBUG / MANUAL TEST SECTION ---
+# This section runs only when you run this file directly (not when imported elsewhere)
+if __name__ == "__main__":
+ # Fetch live exchange data from the API
+ exchange_data = get_exchange_data()
+
+ # Print the first 5 currencies for quick inspection
+ print("Sample of live rates from API:")
+ print(list(exchange_data["rates"].items())[:5])
+
+ # Sample rates dictionary for local testing
+ rates_example = {"USD": 1.12, "EUR": 1.0, "GBP": 0.87}
+
+ # Print supported currencies
+ print("\nSupported currencies:", get_supported_currencies(rates_example))
+
+ # Check a few currency codes
+ print("Is 'usd' valid?", is_valid_currency("usd", rates_example)) # True
+ print("Is 'AUD' valid?", is_valid_currency("AUD", rates_example)) # False
\ No newline at end of file
diff --git a/Currency Script/tests/__init__.py b/Currency Script/tests/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Currency Script/tests/__pycache__/__init__.cpython-313.pyc b/Currency Script/tests/__pycache__/__init__.cpython-313.pyc
new file mode 100644
index 00000000..52c26ecd
Binary files /dev/null and b/Currency Script/tests/__pycache__/__init__.cpython-313.pyc differ
diff --git a/Currency Script/tests/__pycache__/test_api_handler.cpython-313-pytest-8.3.5.pyc b/Currency Script/tests/__pycache__/test_api_handler.cpython-313-pytest-8.3.5.pyc
new file mode 100644
index 00000000..adca8b35
Binary files /dev/null and b/Currency Script/tests/__pycache__/test_api_handler.cpython-313-pytest-8.3.5.pyc differ
diff --git a/Currency Script/tests/__pycache__/test_converter.cpython-313-pytest-8.3.5.pyc b/Currency Script/tests/__pycache__/test_converter.cpython-313-pytest-8.3.5.pyc
new file mode 100644
index 00000000..020a50ff
Binary files /dev/null and b/Currency Script/tests/__pycache__/test_converter.cpython-313-pytest-8.3.5.pyc differ
diff --git a/Currency Script/tests/__pycache__/test_currencies.cpython-313-pytest-8.3.5.pyc b/Currency Script/tests/__pycache__/test_currencies.cpython-313-pytest-8.3.5.pyc
new file mode 100644
index 00000000..adf1456a
Binary files /dev/null and b/Currency Script/tests/__pycache__/test_currencies.cpython-313-pytest-8.3.5.pyc differ
diff --git a/Currency Script/tests/test_api_handler.py b/Currency Script/tests/test_api_handler.py
new file mode 100644
index 00000000..50faa775
--- /dev/null
+++ b/Currency Script/tests/test_api_handler.py
@@ -0,0 +1,37 @@
+import sys
+import os
+sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../src')))
+
+import unittest
+from unittest.mock import patch
+from src.api_handler import get_exchange_data
+
+class TestAPIHandler(unittest.TestCase):
+ """
+ Unit tests for the get_exchange_data function in api_handler.py.
+ """
+ @patch("api_handler.requests.get")
+ def test_get_exchange_data_success(self, mock_get):
+ mock_get.return_value.status_code = 200
+ mock_get.return_value.json.return_value = {
+ "base": "EUR",
+ "date": "2025-06-02",
+ "rates": {"USD": 1.14, "GBP": 0.84}
+ }
+
+ data = get_exchange_data()
+ self.assertEqual(data["base"], "EUR")
+ self.assertIn("USD", data["rates"])
+
+ @patch("api_handler.requests.get")
+ def test_get_exchange_data_failure(self, mock_get):
+ """
+ Test that get_exchange_data raises an exception when API response fails.
+ """
+ mock_get.return_value.status_code = 404
+ with self.assertRaises(Exception):
+ get_exchange_data()
+
+if __name__ == "__main__":
+ unittest.main()
+
diff --git a/Currency Script/tests/test_converter.py b/Currency Script/tests/test_converter.py
new file mode 100644
index 00000000..c6c4707f
--- /dev/null
+++ b/Currency Script/tests/test_converter.py
@@ -0,0 +1,33 @@
+import unittest
+from converter import CurrencyConverter
+
+class TestCurrencyConverter(unittest.TestCase):
+ """Unit tests for CurrencyConverter class."""
+
+ @classmethod
+ def setUpClass(cls):
+ """Initialize converter once for all tests."""
+ cls.converter = CurrencyConverter()
+
+ def test_valid_conversion(self):
+ """Test converting from USD to EUR returns a float value."""
+ result = self.converter.convert("USD", "EUR", 100)
+ self.assertIsInstance(result, float)
+ self.assertGreater(result, 0)
+
+ def test_same_currency(self):
+ """Test converting a currency to itself returns the same amount."""
+ amount = 50
+ result = self.converter.convert("USD", "USD", amount)
+ self.assertAlmostEqual(result, amount, places=2)
+
+ def test_invalid_currency(self):
+ """Test invalid currency codes raise ValueError."""
+ with self.assertRaises(ValueError):
+ self.converter.convert("XXX", "EUR", 100)
+
+ with self.assertRaises(ValueError):
+ self.converter.convert("USD", "YYY", 100)
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/Currency Script/tests/test_currencies.py b/Currency Script/tests/test_currencies.py
new file mode 100644
index 00000000..f79a1164
--- /dev/null
+++ b/Currency Script/tests/test_currencies.py
@@ -0,0 +1,33 @@
+import unittest
+from currencies import get_supported_currencies, is_valid_currency
+
+class TestCurrencies(unittest.TestCase):
+ """Unit tests for currency helper functions."""
+
+ def setUp(self):
+ """Set up sample rates dictionary for use in tests."""
+ self.sample_rates = {
+ "USD": 1.1,
+ "EUR": 1.0,
+ "GBP": 0.85,
+ "JPY": 150.0
+ }
+
+ def test_get_supported_currencies(self):
+ """Test that all currency codes are returned correctly."""
+ expected = ["USD", "EUR", "GBP", "JPY"]
+ result = get_supported_currencies(self.sample_rates)
+ self.assertListEqual(sorted(result), sorted(expected))
+
+ def test_is_valid_currency_true(self):
+ """Test that valid currency codes return True."""
+ self.assertTrue(is_valid_currency("usd", self.sample_rates))
+ self.assertTrue(is_valid_currency("EUR", self.sample_rates))
+
+ def test_is_valid_currency_false(self):
+ """Test that unsupported currency codes return False."""
+ self.assertFalse(is_valid_currency("ABC", self.sample_rates))
+ self.assertFalse(is_valid_currency("xyz", self.sample_rates))
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/Disk Usage Visualizer/README.md b/Disk Usage Visualizer/README.md
new file mode 100644
index 00000000..a2c80bc5
--- /dev/null
+++ b/Disk Usage Visualizer/README.md
@@ -0,0 +1,28 @@
+# Disk Usage Visualizer (CLI)
+
+A simple Python script that scans directories and displays the largest folders or files by disk usage — right from your terminal.
+Lightweight, fast, and cross-platform (works on Linux, macOS, and Windows).
+
+## Features
+
+- Recursively analyzes disk usage in a directory
+
+- Displays top N largest folders (default: 10)
+
+- Handles long file paths and permission errors gracefully
+
+- Works seamlessly on Windows, Linux, and macOS
+
+## Usage
+
+```bash
+# Analyze current directory
+python disk_visualizer.py
+
+# Analyze a specific path
+python disk_visualizer.py D:\Projects # Windows
+python disk_visualizer.py /home/user/docs # Linux/macOS
+
+# Show top 20 largest folders
+python disk_visualizer.py . -n 20
+```
diff --git a/Disk Usage Visualizer/disk_visualizer.py b/Disk Usage Visualizer/disk_visualizer.py
new file mode 100644
index 00000000..053e170f
--- /dev/null
+++ b/Disk Usage Visualizer/disk_visualizer.py
@@ -0,0 +1,52 @@
+import os
+
+def get_dir_sizes(path="."):
+ dir_sizes = {}
+ for root, dirs, files in os.walk(path):
+ for name in files:
+ try:
+ full_path = os.path.join(root, name)
+
+ # Handle long paths in Windows
+ if os.name == "nt":
+ full_path = r"\\?\\" + os.path.abspath(full_path)
+
+ size = os.path.getsize(full_path)
+ dir_path = os.path.relpath(root, path)
+ dir_sizes[dir_path] = dir_sizes.get(dir_path, 0) + size
+ except (FileNotFoundError, PermissionError, OSError):
+ continue
+ return dir_sizes
+
+
+def main():
+ import argparse
+ parser = argparse.ArgumentParser(description="Disk Usage Visualizer (CLI)")
+ parser.add_argument("path", nargs="?", default=".", help="Path to analyze")
+ parser.add_argument(
+ "-n", "--top", type=int, default=10, help="Show top N largest directories"
+ )
+ args = parser.parse_args()
+
+ print(f"Analyzing disk usage in: {args.path}\n")
+
+ dir_sizes = get_dir_sizes(args.path)
+
+ # Sort by size (descending)
+ sorted_dirs = sorted(dir_sizes.items(), key=lambda x: x[1], reverse=True)
+
+ print(f"Top {args.top} largest directories:")
+ print("-" * 60)
+ print(f"{'Directory':40s} | {'Size (MB)':>10s}")
+ print("-" * 60)
+
+ for dir_path, size in sorted_dirs[: args.top]:
+ size_mb = size / (1024 * 1024)
+ print(f"{dir_path:40s} | {size_mb:10.2f}")
+
+ print("-" * 60)
+ print("✅ Disk usage analysis complete.")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/FileOrganizer/FileOrganizer.py b/FileOrganizer/FileOrganizer.py
index 834db468..0ca91093 100644
--- a/FileOrganizer/FileOrganizer.py
+++ b/FileOrganizer/FileOrganizer.py
@@ -4,23 +4,40 @@
# Prompt the user for the directory path to organize files
path = input("Enter path: ")
-# List all files in the specified directory
-files = os.listdir(path)
+# Check if the directory exists
+if not os.path.exists(path):
+ print("Error: The specified directory does not exist.")
+else:
+ # List all items in the specified directory
+ files = os.listdir(path)
# Iterate through each file in the directory
-for file in files:
- # Split the filename and extension
- filename, extension = os.path.splitext(file)
-
- # Remove the leading dot from the extension for folder naming
- extension = extension[1:]
-
- # Check if a directory for the file extension already exists
- if os.path.exists(path + '/' + extension):
- # Move the file to the corresponding extension folder
- shutil.move(path + '/' + file, path + '/' + extension + '/' + file)
- else:
- # If the directory does not exist, create it
- os.makedirs(path + '/' + extension)
- # Move the file to the newly created extension folder
- shutil.move(path + '/' + file, path + '/' + extension + '/' + file)
+ for file in files:
+ file_path = os.path.join(path, file)
+
+ # Skip directories
+ if os.path.isdir(file_path):
+ continue
+
+ # Split the filename and extension
+ filename, extension = os.path.splitext(file)
+ extension = extension[1:] if extension else "NoExtension" # Handle files without extensions
+
+ # Destination folder for the extension
+ dest_folder = os.path.join(path, extension)
+
+ # Create the directory if it does not exist
+ if not os.path.exists(dest_folder):
+ os.makedirs(dest_folder)
+
+ # Handle duplicate files by renaming them
+ dest_file_path = os.path.join(dest_folder, file)
+ counter = 1
+ while os.path.exists(dest_file_path):
+ newfilename = f"{filename}{counter}.{extension}" if extension != "NoExtension" else f"{filename}_{counter}"
+ dest_file_path = os.path.join(dest_folder, new_filename)
+ counter += 1
+
+ # Move the file
+ shutil.move(file_path, dest_file_path)
+ print(f"Moved: {file} → {dest_file_path}")
\ No newline at end of file
diff --git a/Hardware Detector/README.md b/Hardware Detector/README.md
new file mode 100644
index 00000000..cf63726d
--- /dev/null
+++ b/Hardware Detector/README.md
@@ -0,0 +1,54 @@
+# Hardware Resource Monitor in Python
+
+## Description
+
+This project is a Python-based hardware resource monitoring tool that provides real-time information about the system's hardware specifications and resource usage. It uses the `psutil` and `pynvml` libraries to gather data about the CPU, RAM, disk space, and GPU.
+
+## Features
+
+- Detects and displays GPU specifications, including:
+ - GPU name
+ - Total memory (in GB)
+ - Used memory (in GB)
+- Detects and displays system specifications, including:
+ - Total and used RAM (in GB)
+ - Available disk space (in GB)
+ - Number of CPU cores
+ - CPU usage percentage
+- Continuously monitors hardware resources with a customizable update interval.
+- Displays data in a clean and user-friendly format in the console.
+
+## Requirements
+
+The following Python libraries are required to run the project:
+
+- `psutil`
+- `pynvml`
+- `typing` (built-in for Python 3.5+)
+
+You can install the required dependencies using the following command:
+
+```bash
+pip install -r requirements.txt
+```
+
+## Usage
+
+1. Clone the repository or download the project files.
+2. Install the required dependencies using the `requirements.txt` file.
+3. Run the `hardware_detector.py` script to start monitoring hardware resources:
+
+```bash
+python hardware_detector.py
+```
+
+4. Press `Ctrl+C` to stop the monitoring process.
+
+## Notes
+
+- Ensure that your system has a CUDA-enabled GPU with the correct drivers installed to retrieve GPU information.
+- The script clears the console output on each update for a clean display. This behavior may vary depending on the operating system.
+
+## License
+
+This project is licensed under the MIT License. See the `LICENSE` file for more details.
diff --git a/Hardware Detector/hardware_detector.py b/Hardware Detector/hardware_detector.py
new file mode 100644
index 00000000..3086f962
--- /dev/null
+++ b/Hardware Detector/hardware_detector.py
@@ -0,0 +1,76 @@
+import psutil
+import pynvml
+import time
+import os
+
+
+class HardwareDetector:
+ """
+ This class detects the hardware specifications of the computer and monitors them continuously.
+ """
+
+ def __init__(self):
+ self.hardware_profile = {}
+
+ def get_gpu_specs(self) -> None:
+ """
+ Detects the GPU specifications of the computer.
+ :return: None
+ """
+ pynvml.nvmlInit()
+ device_count = pynvml.nvmlDeviceGetCount()
+ if device_count == 0:
+ self.hardware_profile['gpu_name'] = "None available"
+ self.hardware_profile['gpu_total_memory_gb'] = 0
+ self.hardware_profile['gpu_used_memory_gb'] = 0
+ return
+ gpu_handle = pynvml.nvmlDeviceGetHandleByIndex(0)
+ gpu_name = pynvml.nvmlDeviceGetName(gpu_handle)
+ gpu_mem_info = pynvml.nvmlDeviceGetMemoryInfo(gpu_handle)
+ gpu_total_mem = gpu_mem_info.total / (1024 ** 3)
+ gpu_used_mem = gpu_mem_info.used / (1024 ** 3)
+ pynvml.nvmlShutdown()
+ self.hardware_profile['gpu_name'] = gpu_name
+ self.hardware_profile['gpu_total_memory_gb'] = round(gpu_total_mem, 2)
+ self.hardware_profile['gpu_used_memory_gb'] = round(gpu_used_mem, 2)
+
+ def get_computer_specs(self) -> None:
+ """
+ Detects the computer specifications including RAM, available disk space, and CPU cores.
+ :return: None
+ """
+ memory = psutil.virtual_memory()
+ ram_total = memory.total
+ ram_used = memory.used
+ available_diskspace = psutil.disk_usage('/').free / (1024 ** 3)
+ cpu_cores = psutil.cpu_count(logical=True)
+ cpu_usage = psutil.cpu_percent(interval=0.1)
+ self.hardware_profile['ram_total_gb'] = round(ram_total / (1024 ** 3), 2)
+ self.hardware_profile['ram_used_gb'] = round(ram_used / (1024 ** 3), 2)
+ self.hardware_profile['available_diskspace_gb'] = round(available_diskspace, 2)
+ self.hardware_profile['cpu_cores'] = cpu_cores
+ self.hardware_profile['cpu_usage_percent'] = cpu_usage
+
+ def monitor_resources(self, interval: int = 1) -> None:
+ """
+ Continuously monitors and displays hardware resources.
+ :param interval: Time in seconds between updates.
+ :return: None
+ """
+ try:
+ while True:
+ self.get_computer_specs()
+ self.get_gpu_specs()
+ os.system('cls' if os.name == 'nt' else 'clear') # Clear the console for a clean display
+ print("Hardware Resource Monitor")
+ print("==========================")
+ for key, value in self.hardware_profile.items():
+ print(f"{key}: {value}")
+ time.sleep(interval)
+ except KeyboardInterrupt:
+ print("\nMonitoring stopped.")
+
+
+# Run the continuous monitor
+hardware = HardwareDetector()
+hardware.monitor_resources(interval=0.5)
\ No newline at end of file
diff --git a/Hardware Detector/requirements.txt b/Hardware Detector/requirements.txt
new file mode 100644
index 00000000..f767002e
--- /dev/null
+++ b/Hardware Detector/requirements.txt
@@ -0,0 +1,3 @@
+psutil
+pynvml
+typing
\ No newline at end of file
diff --git a/Multi-Platform Icon Generator/README.md b/Multi-Platform Icon Generator/README.md
new file mode 100644
index 00000000..ce9c225f
--- /dev/null
+++ b/Multi-Platform Icon Generator/README.md
@@ -0,0 +1,44 @@
+# Multi-Platform Icon Generator
+
+**Automates the tedious task of manually resizing a single logo/icon into 35+ different sizes required by modern app stores and platforms.**
+
+## 📦 Dependencies
+
+- **Pillow (PIL)** - Python Imaging Library for high-quality image processing
+
+```bash
+pip install Pillow
+```
+
+## How to Run
+
+```bash
+python icon_generator.py
+```
+
+## 📋 Available Options
+
+1. **Generate all platform icons** - Creates icons for all platforms
+2. **Generate specific platform** - Choose Android/iOS/Web/Windows/macOS
+3. **Generate rounded icons only** - Modern rounded corner versions
+4. **Generate favicon.ico only** - Website favicon file
+5. **Exit**
+
+## 📸 Input
+
+**Formats**: PNG, JPG, BMP, TIFF, GIF, WebP
+**Recommended**: PNG, 1024x1024px, square
+
+## 📁 Output
+
+```
+your_image_icons/
+├── android/ # 36px to 192px (6 sizes)
+├── ios/ # 29px to 1024px (13 sizes)
+├── web/ # 16px to 512px (5 sizes)
+├── windows/ # 16px to 256px (5 sizes)
+├── macos/ # 16px to 1024px (6 sizes)
+├── rounded/ # Various rounded sizes
+├── favicon.ico
+└── icon_preview.html
+```
\ No newline at end of file
diff --git a/Multi-Platform Icon Generator/icon_generator.py b/Multi-Platform Icon Generator/icon_generator.py
new file mode 100644
index 00000000..dd2afa4c
--- /dev/null
+++ b/Multi-Platform Icon Generator/icon_generator.py
@@ -0,0 +1,387 @@
+import subprocess
+from pathlib import Path
+
+def try_install_package(package_name):
+ """Try to install a package using pip"""
+ try:
+ subprocess.check_call(["pip", "install", package_name],
+ stdout=subprocess.DEVNULL,
+ stderr=subprocess.DEVNULL)
+ return True
+ except:
+ return False
+
+# Standard icon sizes for different platforms
+ICON_SIZES = {
+ 'android': [
+ (36, 'ldpi'),
+ (48, 'mdpi'),
+ (72, 'hdpi'),
+ (96, 'xhdpi'),
+ (144, 'xxhdpi'),
+ (192, 'xxxhdpi')
+ ],
+ 'ios': [
+ (20, 'iPhone-Notification'),
+ (29, 'iPhone-Settings'),
+ (40, 'iPhone-Spotlight'),
+ (58, 'iPhone-Settings@2x'),
+ (60, 'iPhone-App'),
+ (76, 'iPad-App'),
+ (80, 'iPhone-Spotlight@2x'),
+ (87, 'iPhone-Settings@3x'),
+ (120, 'iPhone-App@2x'),
+ (152, 'iPad-App@2x'),
+ (167, 'iPad-Pro'),
+ (180, 'iPhone-App@3x'),
+ (1024, 'App-Store')
+ ],
+ 'web': [
+ (16, 'favicon-16x16'),
+ (32, 'favicon-32x32'),
+ (96, 'favicon-96x96'),
+ (192, 'android-chrome-192x192'),
+ (512, 'android-chrome-512x512')
+ ],
+ 'windows': [
+ (16, 'small'),
+ (32, 'medium'),
+ (48, 'large'),
+ (64, 'extra-large'),
+ (256, 'jumbo')
+ ],
+ 'macos': [
+ (16, 'icon_16x16'),
+ (32, 'icon_32x32'),
+ (128, 'icon_128x128'),
+ (256, 'icon_256x256'),
+ (512, 'icon_512x512'),
+ (1024, 'icon_1024x1024')
+ ]
+}
+
+def generate_icons_with_pillow(input_image, output_dir, platform='all'):
+ """Generate icons using Pillow (PIL)"""
+ try:
+ from PIL import Image
+
+ # Open and validate input image
+ with Image.open(input_image) as img:
+ # Convert to RGBA for transparency support
+ if img.mode != 'RGBA':
+ img = img.convert('RGBA')
+
+ # Get original size
+ original_size = img.size
+ print(f"Original image size: {original_size[0]}x{original_size[1]}")
+
+ output_path = Path(output_dir)
+
+ # To Determine which platforms to generate
+ platforms_to_generate = [platform] if platform != 'all' else ICON_SIZES.keys()
+
+ total_generated = 0
+
+ for plat in platforms_to_generate:
+ if plat not in ICON_SIZES:
+ continue
+
+ # Create platform directory
+ platform_dir = output_path / plat
+ platform_dir.mkdir(parents=True, exist_ok=True)
+
+ print(f"\n📱 Generating {plat.upper()} icons...")
+
+ for size, name in ICON_SIZES[plat]:
+ try:
+ # Resize image with high quality
+ resized_img = img.resize((size, size), Image.Resampling.LANCZOS)
+
+ # Save icon
+ icon_path = platform_dir / f"{name}.png"
+ resized_img.save(icon_path, "PNG", optimize=True)
+
+ print(f" ✅ {size}x{size} - {icon_path.name}")
+ total_generated += 1
+
+ except Exception as e:
+ print(f" ❌ Failed to create {size}x{size}: {e}")
+
+ return total_generated
+
+ except ImportError:
+ print("Installing Pillow...")
+ if try_install_package("Pillow"):
+ return generate_icons_with_pillow(input_image, output_dir, platform)
+ return 0
+ except Exception as e:
+ print(f"❌ Error generating icons: {e}")
+ return 0
+
+def generate_rounded_icons(input_image, output_dir, corner_radius=0.2):
+ """Generate rounded corner icons"""
+ try:
+ from PIL import Image, ImageDraw
+
+ with Image.open(input_image) as img:
+ if img.mode != 'RGBA':
+ img = img.convert('RGBA')
+
+ output_path = Path(output_dir) / "rounded"
+ output_path.mkdir(parents=True, exist_ok=True)
+
+ print(f"\n🔄 Generating rounded icons...")
+
+ # Common sizes for rounded icons
+ sizes = [48, 96, 144, 192, 256, 512]
+ generated = 0
+
+ for size in sizes:
+ try:
+ # Resize image
+ resized_img = img.resize((size, size), Image.Resampling.LANCZOS)
+
+ # Create rounded mask
+ mask = Image.new('L', (size, size), 0)
+ draw = ImageDraw.Draw(mask)
+
+ # To calculate corner radius
+ radius = int(size * corner_radius)
+
+ # Rounded rectangle
+ draw.rounded_rectangle([(0, 0), (size-1, size-1)], radius=radius, fill=255)
+
+ # Apply mask
+ rounded_img = Image.new('RGBA', (size, size), (0, 0, 0, 0))
+ rounded_img.paste(resized_img, (0, 0))
+ rounded_img.putalpha(mask)
+
+ # Rounded icon
+ icon_path = output_path / f"rounded_icon_{size}x{size}.png"
+ rounded_img.save(icon_path, "PNG")
+
+ print(f" ✅ {size}x{size} rounded - {icon_path.name}")
+ generated += 1
+
+ except Exception as e:
+ print(f" ❌ Failed to create rounded {size}x{size}: {e}")
+
+ return generated
+
+ except Exception as e:
+ print(f"❌ Error generating rounded icons: {e}")
+ return 0
+
+def generate_favicon_ico(input_image, output_dir):
+ """Generate Windows ICO format favicon"""
+ try:
+ from PIL import Image
+
+ with Image.open(input_image) as img:
+ if img.mode != 'RGBA':
+ img = img.convert('RGBA')
+
+ output_path = Path(output_dir)
+ output_path.mkdir(parents=True, exist_ok=True)
+
+ print(f"\n🌐 Generating favicon.ico...")
+
+ # Create multiple sizes for ICO
+ sizes = [(16, 16), (32, 32), (48, 48), (64, 64)]
+ images = []
+
+ for size in sizes:
+ resized = img.resize(size, Image.Resampling.LANCZOS)
+ images.append(resized)
+
+ # Save as ICO
+ ico_path = output_path / "favicon.ico"
+ images[0].save(ico_path, format='ICO', sizes=sizes)
+
+ print(f" ✅ favicon.ico created - {ico_path.name}")
+ return 1
+
+ except Exception as e:
+ print(f"❌ Error generating ICO: {e}")
+ return 0
+
+def create_icon_preview(output_dir):
+ """Create HTML preview of generated icons"""
+ try:
+ output_path = Path(output_dir)
+
+ html_content = """
+
+
+
+ Icon Preview
+
+
+
+
Generated Icons Preview
+"""
+
+ # Find all generated icons
+ for platform_dir in output_path.iterdir():
+ if platform_dir.is_dir():
+ icons = list(platform_dir.glob("*.png"))
+ if icons:
+ html_content += f"""
+
+
{platform_dir.name.upper()} Icons
+
+"""
+
+ for icon in sorted(icons):
+ try:
+ from PIL import Image
+ with Image.open(icon) as img:
+ size = img.size
+
+ relative_path = icon.relative_to(output_path)
+ html_content += f"""
+
+"""
+
+ html_content += """
+
+
+"""
+
+ # Save HTML preview
+ preview_path = output_path / "icon_preview.html"
+ preview_path.write_text(html_content, encoding='utf-8')
+
+ print(f"\n📄 HTML preview created: {preview_path.name}")
+ return True
+
+ except Exception as e:
+ print(f"❌ Error creating preview: {e}")
+ return False
+
+def main():
+ print("🎨 Icon Generator")
+ print("Create app icons in multiple sizes for different platforms!")
+ print("="*60)
+
+ while True:
+ print("\nChoose an option:")
+ print("1. Generate icons from single image")
+ print("2. Generate specific platform icons")
+ print("3. Generate rounded icons only")
+ print("4. Generate favicon.ico only")
+ print("5. Exit")
+
+ choice = input("\nEnter choice (1-5): ").strip()
+
+ if choice == "1":
+ input_image = input("\nEnter image file path: ").strip().strip('"')
+ if input_image and Path(input_image).exists():
+ output_dir = input("Enter output directory (or press Enter for auto): ").strip().strip('"')
+ if not output_dir:
+ output_dir = Path(input_image).stem + "_icons"
+
+ print(f"\n🎨 Generating icons from: {Path(input_image).name}")
+
+ total = 0
+ total += generate_icons_with_pillow(input_image, output_dir, 'all')
+ total += generate_rounded_icons(input_image, output_dir)
+ total += generate_favicon_ico(input_image, output_dir)
+
+ if total > 0:
+ create_icon_preview(output_dir)
+ print(f"\n🎉 Generated {total} icons in: {output_dir}")
+
+ else:
+ print("❌ Invalid file path")
+
+ elif choice == "2":
+ input_image = input("\nEnter image file path: ").strip().strip('"')
+ if input_image and Path(input_image).exists():
+ print("\nAvailable platforms:")
+ for i, platform in enumerate(ICON_SIZES.keys(), 1):
+ print(f"{i}. {platform}")
+
+ platform_choice = input("\nEnter platform number: ").strip()
+ try:
+ platform_idx = int(platform_choice) - 1
+ platform = list(ICON_SIZES.keys())[platform_idx]
+
+ output_dir = input("Enter output directory (or press Enter for auto): ").strip().strip('"')
+ if not output_dir:
+ output_dir = f"{Path(input_image).stem}_{platform}_icons"
+
+ generated = generate_icons_with_pillow(input_image, output_dir, platform)
+
+ if generated > 0:
+ create_icon_preview(output_dir)
+ print(f"\n🎉 Generated {generated} {platform} icons")
+
+ except (ValueError, IndexError):
+ print("❌ Invalid platform choice")
+ else:
+ print("❌ Invalid file path")
+
+ elif choice == "3":
+ input_image = input("\nEnter image file path: ").strip().strip('"')
+ if input_image and Path(input_image).exists():
+ output_dir = input("Enter output directory (or press Enter for auto): ").strip().strip('"')
+ if not output_dir:
+ output_dir = Path(input_image).stem + "_rounded_icons"
+
+ corner_radius = input("Enter corner radius (0.1-0.5, default 0.2): ").strip()
+ try:
+ corner_radius = float(corner_radius) if corner_radius else 0.2
+ except ValueError:
+ corner_radius = 0.2
+
+ generated = generate_rounded_icons(input_image, output_dir, corner_radius)
+
+ if generated > 0:
+ create_icon_preview(output_dir)
+ print(f"\n🎉 Generated {generated} rounded icons")
+ else:
+ print("❌ Invalid file path")
+
+ elif choice == "4":
+ input_image = input("\nEnter image file path: ").strip().strip('"')
+ if input_image and Path(input_image).exists():
+ output_dir = input("Enter output directory (or press Enter for auto): ").strip().strip('"')
+ if not output_dir:
+ output_dir = Path(input_image).parent
+
+ generated = generate_favicon_ico(input_image, output_dir)
+
+ if generated > 0:
+ print(f"\n🎉 Generated favicon.ico")
+ else:
+ print("❌ Invalid file path")
+
+ elif choice == "5":
+ print("👋 Goodbye!")
+ break
+
+ else:
+ print("❌ Invalid choice, please try again")
+
+if __name__ == "__main__":
+ main()
\ No newline at end of file
diff --git a/Multi-Platform Icon Generator/sample_icons/android/hdpi.png b/Multi-Platform Icon Generator/sample_icons/android/hdpi.png
new file mode 100644
index 00000000..50b43b60
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/android/hdpi.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/android/ldpi.png b/Multi-Platform Icon Generator/sample_icons/android/ldpi.png
new file mode 100644
index 00000000..e411719f
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/android/ldpi.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/android/mdpi.png b/Multi-Platform Icon Generator/sample_icons/android/mdpi.png
new file mode 100644
index 00000000..c1c7fc9b
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/android/mdpi.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/android/xhdpi.png b/Multi-Platform Icon Generator/sample_icons/android/xhdpi.png
new file mode 100644
index 00000000..b9f6d373
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/android/xhdpi.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/android/xxhdpi.png b/Multi-Platform Icon Generator/sample_icons/android/xxhdpi.png
new file mode 100644
index 00000000..a251d2e0
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/android/xxhdpi.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/android/xxxhdpi.png b/Multi-Platform Icon Generator/sample_icons/android/xxxhdpi.png
new file mode 100644
index 00000000..d1fc847e
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/android/xxxhdpi.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/favicon.ico b/Multi-Platform Icon Generator/sample_icons/favicon.ico
new file mode 100644
index 00000000..7ced5122
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/favicon.ico differ
diff --git a/Multi-Platform Icon Generator/sample_icons/icon_preview.html b/Multi-Platform Icon Generator/sample_icons/icon_preview.html
new file mode 100644
index 00000000..7265f8b8
--- /dev/null
+++ b/Multi-Platform Icon Generator/sample_icons/icon_preview.html
@@ -0,0 +1,268 @@
+
+
+
+
+ Icon Preview
+
+
+
+
Generated Icons Preview
+
+
+
ANDROID Icons
+
+
+
+
+
hdpi 72x72
+
+
+
+
+
ldpi 36x36
+
+
+
+
+
mdpi 48x48
+
+
+
+
+
xhdpi 96x96
+
+
+
+
+
xxhdpi 144x144
+
+
+
+
+
xxxhdpi 192x192
+
+
+
+
+
+
+
IOS Icons
+
+
+
+
+
App-Store 1024x1024
+
+
+
+
+
iPad-App 76x76
+
+
+
+
+
iPad-App@2x 152x152
+
+
+
+
+
iPad-Pro 167x167
+
+
+
+
+
iPhone-App 60x60
+
+
+
+
+
iPhone-App@2x 120x120
+
+
+
+
+
iPhone-App@3x 180x180
+
+
+
+
+
iPhone-Notification 20x20
+
+
+
+
+
iPhone-Settings 29x29
+
+
+
+
+
iPhone-Settings@2x 58x58
+
+
+
+
+
iPhone-Settings@3x 87x87
+
+
+
+
+
iPhone-Spotlight 40x40
+
+
+
+
+
iPhone-Spotlight@2x 80x80
+
+
+
+
+
+
+
MACOS Icons
+
+
+
+
+
icon_1024x1024 1024x1024
+
+
+
+
+
icon_128x128 128x128
+
+
+
+
+
icon_16x16 16x16
+
+
+
+
+
icon_256x256 256x256
+
+
+
+
+
icon_32x32 32x32
+
+
+
+
+
icon_512x512 512x512
+
+
+
+
+
+
+
ROUNDED Icons
+
+
+
+
+
rounded_icon_144x144 144x144
+
+
+
+
+
rounded_icon_192x192 192x192
+
+
+
+
+
rounded_icon_256x256 256x256
+
+
+
+
+
rounded_icon_48x48 48x48
+
+
+
+
+
rounded_icon_512x512 512x512
+
+
+
+
+
rounded_icon_96x96 96x96
+
+
+
+
+
+
+
WEB Icons
+
+
+
+
+
android-chrome-192x192 192x192
+
+
+
+
+
android-chrome-512x512 512x512
+
+
+
+
+
favicon-16x16 16x16
+
+
+
+
+
favicon-32x32 32x32
+
+
+
+
+
favicon-96x96 96x96
+
+
+
+
+
+
+
WINDOWS Icons
+
+
+
+
+
extra-large 64x64
+
+
+
+
+
jumbo 256x256
+
+
+
+
+
large 48x48
+
+
+
+
+
medium 32x32
+
+
+
+
+
small 16x16
+
+
+
+
+
+
+
diff --git a/Multi-Platform Icon Generator/sample_icons/ios/App-Store.png b/Multi-Platform Icon Generator/sample_icons/ios/App-Store.png
new file mode 100644
index 00000000..6e9d2dec
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/ios/App-Store.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/ios/iPad-App.png b/Multi-Platform Icon Generator/sample_icons/ios/iPad-App.png
new file mode 100644
index 00000000..3b176db2
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/ios/iPad-App.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/ios/iPad-App@2x.png b/Multi-Platform Icon Generator/sample_icons/ios/iPad-App@2x.png
new file mode 100644
index 00000000..61357a59
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/ios/iPad-App@2x.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/ios/iPad-Pro.png b/Multi-Platform Icon Generator/sample_icons/ios/iPad-Pro.png
new file mode 100644
index 00000000..910f473f
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/ios/iPad-Pro.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/ios/iPhone-App.png b/Multi-Platform Icon Generator/sample_icons/ios/iPhone-App.png
new file mode 100644
index 00000000..5663a664
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/ios/iPhone-App.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/ios/iPhone-App@2x.png b/Multi-Platform Icon Generator/sample_icons/ios/iPhone-App@2x.png
new file mode 100644
index 00000000..9c89bb48
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/ios/iPhone-App@2x.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/ios/iPhone-App@3x.png b/Multi-Platform Icon Generator/sample_icons/ios/iPhone-App@3x.png
new file mode 100644
index 00000000..63c4928e
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/ios/iPhone-App@3x.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/ios/iPhone-Notification.png b/Multi-Platform Icon Generator/sample_icons/ios/iPhone-Notification.png
new file mode 100644
index 00000000..e43c9122
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/ios/iPhone-Notification.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/ios/iPhone-Settings.png b/Multi-Platform Icon Generator/sample_icons/ios/iPhone-Settings.png
new file mode 100644
index 00000000..0898a3c1
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/ios/iPhone-Settings.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/ios/iPhone-Settings@2x.png b/Multi-Platform Icon Generator/sample_icons/ios/iPhone-Settings@2x.png
new file mode 100644
index 00000000..3d6fa023
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/ios/iPhone-Settings@2x.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/ios/iPhone-Settings@3x.png b/Multi-Platform Icon Generator/sample_icons/ios/iPhone-Settings@3x.png
new file mode 100644
index 00000000..8e3beb9c
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/ios/iPhone-Settings@3x.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/ios/iPhone-Spotlight.png b/Multi-Platform Icon Generator/sample_icons/ios/iPhone-Spotlight.png
new file mode 100644
index 00000000..002a243a
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/ios/iPhone-Spotlight.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/ios/iPhone-Spotlight@2x.png b/Multi-Platform Icon Generator/sample_icons/ios/iPhone-Spotlight@2x.png
new file mode 100644
index 00000000..e32a5508
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/ios/iPhone-Spotlight@2x.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/macos/icon_1024x1024.png b/Multi-Platform Icon Generator/sample_icons/macos/icon_1024x1024.png
new file mode 100644
index 00000000..6e9d2dec
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/macos/icon_1024x1024.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/macos/icon_128x128.png b/Multi-Platform Icon Generator/sample_icons/macos/icon_128x128.png
new file mode 100644
index 00000000..e47c24a4
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/macos/icon_128x128.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/macos/icon_16x16.png b/Multi-Platform Icon Generator/sample_icons/macos/icon_16x16.png
new file mode 100644
index 00000000..7f805a95
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/macos/icon_16x16.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/macos/icon_256x256.png b/Multi-Platform Icon Generator/sample_icons/macos/icon_256x256.png
new file mode 100644
index 00000000..fc0e8d40
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/macos/icon_256x256.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/macos/icon_32x32.png b/Multi-Platform Icon Generator/sample_icons/macos/icon_32x32.png
new file mode 100644
index 00000000..87b20467
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/macos/icon_32x32.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/macos/icon_512x512.png b/Multi-Platform Icon Generator/sample_icons/macos/icon_512x512.png
new file mode 100644
index 00000000..27ee28a3
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/macos/icon_512x512.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/rounded/rounded_icon_144x144.png b/Multi-Platform Icon Generator/sample_icons/rounded/rounded_icon_144x144.png
new file mode 100644
index 00000000..d3374414
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/rounded/rounded_icon_144x144.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/rounded/rounded_icon_192x192.png b/Multi-Platform Icon Generator/sample_icons/rounded/rounded_icon_192x192.png
new file mode 100644
index 00000000..1e99a355
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/rounded/rounded_icon_192x192.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/rounded/rounded_icon_256x256.png b/Multi-Platform Icon Generator/sample_icons/rounded/rounded_icon_256x256.png
new file mode 100644
index 00000000..b3904fcb
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/rounded/rounded_icon_256x256.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/rounded/rounded_icon_48x48.png b/Multi-Platform Icon Generator/sample_icons/rounded/rounded_icon_48x48.png
new file mode 100644
index 00000000..18464fbf
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/rounded/rounded_icon_48x48.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/rounded/rounded_icon_512x512.png b/Multi-Platform Icon Generator/sample_icons/rounded/rounded_icon_512x512.png
new file mode 100644
index 00000000..42932e1c
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/rounded/rounded_icon_512x512.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/rounded/rounded_icon_96x96.png b/Multi-Platform Icon Generator/sample_icons/rounded/rounded_icon_96x96.png
new file mode 100644
index 00000000..43b5bd1a
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/rounded/rounded_icon_96x96.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/web/android-chrome-192x192.png b/Multi-Platform Icon Generator/sample_icons/web/android-chrome-192x192.png
new file mode 100644
index 00000000..d1fc847e
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/web/android-chrome-192x192.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/web/android-chrome-512x512.png b/Multi-Platform Icon Generator/sample_icons/web/android-chrome-512x512.png
new file mode 100644
index 00000000..27ee28a3
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/web/android-chrome-512x512.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/web/favicon-16x16.png b/Multi-Platform Icon Generator/sample_icons/web/favicon-16x16.png
new file mode 100644
index 00000000..7f805a95
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/web/favicon-16x16.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/web/favicon-32x32.png b/Multi-Platform Icon Generator/sample_icons/web/favicon-32x32.png
new file mode 100644
index 00000000..87b20467
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/web/favicon-32x32.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/web/favicon-96x96.png b/Multi-Platform Icon Generator/sample_icons/web/favicon-96x96.png
new file mode 100644
index 00000000..b9f6d373
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/web/favicon-96x96.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/windows/extra-large.png b/Multi-Platform Icon Generator/sample_icons/windows/extra-large.png
new file mode 100644
index 00000000..dc048fcd
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/windows/extra-large.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/windows/jumbo.png b/Multi-Platform Icon Generator/sample_icons/windows/jumbo.png
new file mode 100644
index 00000000..fc0e8d40
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/windows/jumbo.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/windows/large.png b/Multi-Platform Icon Generator/sample_icons/windows/large.png
new file mode 100644
index 00000000..c1c7fc9b
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/windows/large.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/windows/medium.png b/Multi-Platform Icon Generator/sample_icons/windows/medium.png
new file mode 100644
index 00000000..87b20467
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/windows/medium.png differ
diff --git a/Multi-Platform Icon Generator/sample_icons/windows/small.png b/Multi-Platform Icon Generator/sample_icons/windows/small.png
new file mode 100644
index 00000000..7f805a95
Binary files /dev/null and b/Multi-Platform Icon Generator/sample_icons/windows/small.png differ
diff --git a/Password Strength Checker/requirements.txt b/Password Strength Checker/requirements.txt
index ff91e11f..e2b7e64a 100644
--- a/Password Strength Checker/requirements.txt
+++ b/Password Strength Checker/requirements.txt
@@ -30,7 +30,7 @@ requests==2.32.3
rich==13.9.2
scikit-learn==1.5.2
scipy==1.14.1
-setuptools==75.2.0
+setuptools==78.1.1
silence_tensorflow==1.2.2
six==1.16.0
tensorboard==2.17.1
diff --git a/README.md b/README.md
index 007b2e87..5333ecbf 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,6 @@
- [Gitpod](#gitpod)
- [Wall of Contributors](#wall-of-contributors)
-
[](https://discord.com/invite/Yn9g6KuWyA)
[](https://www.youtube.com/@dhanushnehru?sub_confirmation=1)
@@ -34,137 +33,140 @@ _**Note: Please follow the maintainer of the repository for quick approval of th
**NOTE:** Remember to close your issues once your PR has been merged! They can be reopened if needed.
-More information on contributing and the general code of conduct for discussion and feedback in this repo can be found here: [CONTRIBUTIONS.md](https://github.com/DhanushNehru/Python-Scripts/blob/master/CONTRIBUTIONS.md)
+More information on contributing and the general code of conduct for discussion and feedback in this repo can be found here: [CONTRIBUTIONS.md](https://github.com/DhanushNehru/Python-Scripts/blob/main/CONTRIBUTIONS.md)
## List of Scripts in Repo
| Script | Link | Description |
-| ---------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| Arrange It | [Arrange It](https://github.com/DhanushNehru/Python-Scripts/tree/master/Arrange%20It) | A Python script that can automatically move files into corresponding folders based on their extensions. |
-| Auto WiFi Check | [Auto WiFi Check](https://github.com/DhanushNehru/Python-Scripts/tree/master/Auto%20WiFi%20Check) | A Python script to monitor if the WiFi connection is active or not |
-| AutoCert | [AutoCert](https://github.com/DhanushNehru/Python-Scripts/tree/master/AutoCert) | A Python script to auto-generate e-certificates in bulk. |
-| Autocomplete Notes App | [AutoCert](https://github.com/DhanushNehru/Python-Scripts/tree/master/Autocomplete%20Notes%20App) | A Python script to auto-generate e-certificates in bulk. |
-| Automated Emails | [Automated Emails](https://github.com/DhanushNehru/Python-Scripts/tree/master/Automate%20Emails%20Daily) | A Python script to send out personalized emails by reading a CSV file. |
-| Black Hat Python | [Black Hat Python](https://github.com/DhanushNehru/Python-Scripts/tree/master/Black%20Hat%20Python) | Source code from the book Black Hat Python |
-| Blackjack | [Blackjack](https://github.com/DhanushNehru/Python-Scripts/tree/master/Blackjack) | A game of Blackjack - let's get a 21. |
-| Chessboard | [Chessboard](https://github.com/DhanushNehru/Python-Scripts/tree/master/Chess%20Board) | Creates a chessboard using matplotlib. |
-| Compound Interest Calculator | [Compound Interest Calculator](https://github.com/DhanushNehru/Python-Scripts/tree/master/Calculate%20Compound%20Interest) | A Python script to calculate compound interest. |
-| Countdown Timer | [Countdown Timer](https://github.com/DhanushNehru/Python-Scripts/tree/master/Countdown%20Timer) | Displays a message when the Input time elapses. |
-| Convert Temperature | [Convert Temperature](https://github.com/DhanushNehru/Python-Scripts/tree/master/Convert%20Temperature) | A python script to convert temperature between Fahreheit, Celsius and Kelvin |
-| Crop Images | [Crop Images](https://github.com/DhanushNehru/Python-Scripts/tree/master/Crop%20Images) | A Python script to crop a given image. |
-| CSV to Excel | [CSV to Excel](https://github.com/DhanushNehru/Python-Scripts/tree/master/CSV%20to%20Excel) | A Python script to convert a CSV to an Excel file. |
-| Currency Script | [Currency Script](https://github.com/DhanushNehru/Python-Scripts/tree/master/Currency%20Script) | A Python script to convert the currency of one country to that of another. |
-| Digital Clock | [Digital Clock](https://github.com/DhanushNehru/Python-Scripts/tree/master/Digital%20Clock) | A Python script to preview a digital clock in the terminal. |
-| Display Popup Window | [Display Popup Window](https://github.com/DhanushNehru/Python-Scripts/tree/master/Display%20Popup%20Window) | A Python script to preview a GUI interface to the user. |
-| Distance Calculator | [Distance Calculator](https://github.com/Mathdallas-code/Python-Scripts/tree/master/Distance%20Calculator) | A Python script to calculate the distance between two points.
-| Duplicate Finder | [Duplicate Finder](https://github.com/DhanushNehru/Python-Scripts/tree/master/Duplicate%Fnder) | The script identifies duplicate files by MD5 hash and allows deletion or relocation. |
-| Emoji | [Emoji](https://github.com/DhanushNehru/Python-Scripts/tree/master/Emoji) | The script generates a PDF with an emoji using a custom TrueType font. |
-| Emoji to PDF | [Emoji to PDF](https://github.com/DhanushNehru/Python-Scripts/tree/master/Emoji%20To%20Pdf) | A Python Script to view Emoji in PDF. |
-| Expense Tracker | [Expense Tracker](https://github.com/DhanushNehru/Python-Scripts/tree/master/Expense%20Tracker) | A Python script which can track expenses. |
-| Face Reaction | [Face Reaction](https://github.com/DhanushNehru/Python-Scripts/tree/master/Face%20Reaction) | A script which attempts to detect facial expressions. |
-| Fake Profiles | [Fake Profiles](https://github.com/DhanushNehru/Python-Scripts/tree/master/Fake%20Profile) | Creates fake profiles. |
-| File Encryption Decryption | [File Encryption Decryption](https://github.com/DhanushNehru/Python-Scripts/tree/master/File%20Encryption%20Decryption) | Encrypts and Decrypts files using AES Algorithms for Security purposes. |
-| File Search | [File_search](https://github.com/debojit11/Python-Scripts/tree/master/File_Search) | A python script that searches a specified folder for all files, regardless of file type, within its directory and subdirectories. |
-| Font Art | [Font Art](https://github.com/DhanushNehru/Python-Scripts/tree/master/Font%20Art) | Displays a font art using Python. |
-| File Organizer | [FileOrganizer](https://github.com/DhanushNehru/Python-Scripts/tree/master/FileOrganizer) | Organizes files into different folders according to their file type |
-| File Renamer | [FileRenamer](https://github.com/DhanushNehru/Python-Scripts/tree/master/FileRenamer) | Bulk renames files with the same start/end |
-| File Text Search | [FileTextSearch](https://github.com/DhanushNehru/Python-Scripts/tree/master/FileTextSearch) | Searches for a keyword/phrase accross different files |
-| Freelance Helper Program | [freelance-helper](https://github.com/DhanushNehru/Python-Scripts/tree/master/freelance-help-program) | Takes an Excel file with working hours and calculates the payment. |
-| Get Hexcodes From Websites | [Get Hexcodes From Websites](https://github.com/DhanushNehru/Python-Scripts/tree/master/Get%20Hexcodes%20From%20Websites) | Generates a Python list containing Hexcodes from a website. |
-| Hand_Volume | [Hand_Volume](https://github.com/DhanushNehru/Python-Scripts/tree/master/Hand%20Volume) | Detects and tracks hand movements to control volume. |
-| Hangman Game | [Hangman](https://github.com/DhanushNehru/Python-Scripts/tree/master/Hangman%20Game) | A classic word-guessing game where players guess letters to find the hidden word |
-| Harvest Predictor | [Harvest Predictor](https://github.com/DhanushNehru/Python-Scripts/tree/master/Harvest%20Predictor) | Takes some necessary input parameters and predicts harvest according to it. |
-| Html-to-images | [html-to-images](https://github.com/DhanushNehru/Python-Scripts/tree/master/HTML%20to%20Images) | Converts HTML documents to image files. |
-| Image Capture | [Image Capture](https://github.com/DhanushNehru/Python-Scripts/tree/master/Image%20Capture) | Captures image from your webcam and saves it on your local device. |
-| Image Compress | [Image Compress](https://github.com/DhanushNehru/Python-Scripts/tree/master/Image%20Compress) | Takes an image and compresses it. |
-| Image Manipulation without libraries | [Image Manipulation without libraries](https://github.com/DhanushNehru/Python-Scripts/tree/master/Image%20Manipulation%20without%20libraries) | Manipulates images without using any external libraries. |
-| Image Text | [Image Text](https://github.com/DhanushNehru/Python-Scripts/tree/master/Image%20Text) | Extracts text from the image. |
-| Image Text to PDF | [Image Text to PDF](https://github.com/DhanushNehru/Python-Scripts/tree/master/Image%20Text%20to%20PDF) | Adds an image and text to a PDF. |
-| Image Uploader | [Image Uploader](https://github.com/DhanushNehru/Python-Scripts/tree/master/Image%20Uploader) | Uploads images to Imgur using a keyboard shortcut. |
-| Image Watermarker | [Image Watermarker](https://github.com/DhanushNehru/Python-Scripts/tree/master/Image%20Watermarker) | Adds a watermark to an image. |
-| Image to ASCII | [Image to ASCII](https://github.com/DhanushNehru/Python-Scripts/tree/master/Image%20to%20ASCII) | Converts an image into ASCII art. |
-| Image to Gif | [Image to Gif](https://github.com/DhanushNehru/Python-Scripts/tree/master/Image%20to%20GIF) | Generate gif from images. |
-| Images to WebP Converter | [Images to WebP Converter] (https://github.com/DhanushNehru/Python-Scripts/tree/master/Images%20to%20WebP%20Converter) | Converts images to WebP vie cmd or GUI |
-| Interactive Dictionary | [Interactive Dictionary](https://github.com/DhanushNehru/Python-Scripts/tree/master/Image%20InteractiveDictionary) | finding out meanings of words |
-| IP Geolocator | [IP Geolocator](https://github.com/DhanushNehru/Python-Scripts/tree/master/IP%20Geolocator) | Uses an IP address to geolocate a location on Earth. |
-| Jokes Generator | [Jokes generator](https://github.com/DhanushNehru/Python-Scripts/tree/master/Jokes%20Generator) | Generates jokes. |
-| JSON to CSV 1 | [JSON to CSV 1](https://github.com/DhanushNehru/Python-Scripts/tree/master/JSON%20to%20CSV) | Converts JSON to CSV files. |
-| JSON to CSV 2 | [JSON to CSV 2](https://github.com/DhanushNehru/Python-Scripts/tree/master/JSON%20to%20CSV%202) | Converts a JSON file to a CSV file. |
-| JSON to CSV converter | [JSON to CSV converter](https://github.com/DhanushNehru/Python-Scripts/tree/master/Json%20to%20CSV%20Convertor) | Converts JSON file to CSV files. It can convert nested JSON files as well. A sample JSON is included for testing. |
-| JSON to YAML converter | [JSON to YAML converter](https://github.com/DhanushNehru/Python-Scripts/tree/master/JSON%20to%20YAML) | Converts JSON file to YAML files. A sample JSON is included for testing. |
-| Keylogger | [Keylogger](https://github.com/DhanushNehru/Python-Scripts/tree/master/Keylogger) | Keylogger that can track your keystrokes, clipboard text, take screenshots at regular intervals, and records audio. |
-| Keyword - Retweeting | [Keyword - Retweeting](https://github.com/DhanushNehru/Python-Scripts/tree/master/Keyword%20Retweet%20Twitter%20Bot) | Find the latest tweets containing given keywords and then retweet them. |
-| LinkedIn Bot | [LinkedIn Bot](https://github.com/DhanushNehru/Python-Scripts/tree/master/LinkedIn%20Bot) | Automates the process of searching for public profiles on LinkedIn and exporting the data to an Excel sheet. |
+| ---------------------------------------- |----------------------------------------------------------------------------------------------------------------------------------------------------------| ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Arrange It | [Arrange It](https://github.com/DhanushNehru/Python-Scripts/tree/main/Arrange%20It) | A Python script that can automatically move files into corresponding folders based on their extensions. |
+| Auto WiFi Check | [Auto WiFi Check](https://github.com/DhanushNehru/Python-Scripts/tree/main/Auto%20WiFi%20Check) | A Python script to monitor if the WiFi connection is active or not |
+| AutoCert | [AutoCert](https://github.com/DhanushNehru/Python-Scripts/tree/main/AutoCert) | A Python script to auto-generate e-certificates in bulk. |
+| Autocomplete Notes App | [Autocomplete Notes App](https://github.com/DhanushNehru/Python-Scripts/tree/main/Autocomplete%20Notes%20App) | A Python script that provides a notes application with autocomplete features. |
+| Automated Emails | [Automated Emails](https://github.com/DhanushNehru/Python-Scripts/tree/main/Automate%20Emails%20Daily) | A Python script to send out personalized emails by reading a CSV file. |
+| Black Hat Python | [Black Hat Python](https://github.com/DhanushNehru/Python-Scripts/tree/main/Black%20Hat%20Python) | Source code from the book Black Hat Python |
+| Blackjack | [Blackjack](https://github.com/DhanushNehru/Python-Scripts/tree/main/Blackjack) | A game of Blackjack - let's get a 21. |
+| Chessboard | [Chessboard](https://github.com/DhanushNehru/Python-Scripts/tree/main/Chess%20Board) | Creates a chessboard using matplotlib. |
+| Compound Interest Calculator | [Compound Interest Calculator](https://github.com/DhanushNehru/Python-Scripts/tree/main/Calculate%20Compound%20Interest) | A Python script to calculate compound interest. |
+| Convert Temperature | [Convert Temperature](https://github.com/DhanushNehru/Python-Scripts/tree/main/Convert%20Temperature) | A python script to convert temperature between Fahreheit, Celsius and Kelvin |
+| Connect Four | [Connect Four](https://github.com/DhanushNehru/Python-Scripts/tree/main/Connect%20Four) | A Python script for the board game Connect Four, which can be played by 1-2 players |
+| Countdown Timer | [Countdown Timer](https://github.com/DhanushNehru/Python-Scripts/tree/main/Countdown%20Timer) | Displays a message when the Input time elapses. |
+| Crop Images | [Crop Images](https://github.com/DhanushNehru/Python-Scripts/tree/main/Crop%20Images) | A Python script to crop a given image. |
+| CSV to Excel | [CSV to Excel](https://github.com/DhanushNehru/Python-Scripts/tree/main/CSV%20to%20Excel) | A Python script to convert a CSV to an Excel file. |
+| CSV_TO_NDJSON | [CSV to Excel](https://github.com/DhanushNehru/Python-Scripts/tree/main/CSV_TO_NDJSON) | A Python script to convert a CSV to an NDJSON files file. |
+| Currency Script | [Currency Script](https://github.com/DhanushNehru/Python-Scripts/tree/main/Currency%20Script) | A Python script to convert the currency of one country to that of another. |
+| Digital Clock | [Digital Clock](https://github.com/DhanushNehru/Python-Scripts/tree/main/Digital%20Clock) | A Python script to preview a digital clock in the terminal. |
+| Disk Usage Visualizer | [Disk Usage Visualizer](https://github.com/DhanushNehru/Python-Scripts/tree/main/Disk%20Usage%20Visualizer) | A Python script to display the top N directories taking up space in your disk.
+| Display Popup Window | [Display Popup Window](https://github.com/DhanushNehru/Python-Scripts/tree/main/Display%20Popup%20Window) | A Python script to preview a GUI interface to the user. |
+| Distance Calculator | [Distance Calculator](https://github.com/Mathdallas-code/Python-Scripts/tree/main/Distance%20Calculator) | A Python script to calculate the distance between two points.
+| Duplicate Finder | [Duplicate Finder](https://github.com/DhanushNehru/Python-Scripts/tree/main/Duplicate%Fnder) | The script identifies duplicate files by MD5 hash and allows deletion or relocation. |
+| Emoji | [Emoji](https://github.com/DhanushNehru/Python-Scripts/tree/main/Emoji) | The script generates a PDF with an emoji using a custom TrueType font. |
+| Emoji to PDF | [Emoji to PDF](https://github.com/DhanushNehru/Python-Scripts/tree/main/Emoji%20To%20Pdf) | A Python Script to view Emoji in PDF. |
+| Expense Tracker | [Expense Tracker](https://github.com/DhanushNehru/Python-Scripts/tree/main/Expense%20Tracker) | A Python script which can track expenses. |
+| Face Reaction | [Face Reaction](https://github.com/DhanushNehru/Python-Scripts/tree/main/Face%20Reaction) | A script which attempts to detect facial expressions. |
+| Fake Profiles | [Fake Profiles](https://github.com/DhanushNehru/Python-Scripts/tree/main/Fake%20Profile) | Creates fake profiles. |
+| File Encryption Decryption | [File Encryption Decryption](https://github.com/DhanushNehru/Python-Scripts/tree/main/File%20Encryption%20Decryption) | Encrypts and Decrypts files using AES Algorithms for Security purposes. |
+| File Search | [File_search](https://github.com/debojit11/Python-Scripts/tree/main/File_Search) | A python script that searches a specified folder for all files, regardless of file type, within its directory and subdirectories. |
+| Font Art | [Font Art](https://github.com/DhanushNehru/Python-Scripts/tree/main/Font%20Art) | Displays a font art using Python. |
+| File Organizer | [FileOrganizer](https://github.com/DhanushNehru/Python-Scripts/tree/main/FileOrganizer) | Organizes files into different folders according to their file type |
+| File Renamer | [FileRenamer](https://github.com/DhanushNehru/Python-Scripts/tree/main/FileRenamer) | Bulk renames files with the same start/end |
+| File Text Search | [FileTextSearch](https://github.com/DhanushNehru/Python-Scripts/tree/main/FileTextSearch) | Searches for a keyword/phrase accross different files |
+| Freelance Helper Program | [freelance-helper](https://github.com/DhanushNehru/Python-Scripts/tree/main/freelance-help-program) | Takes an Excel file with working hours and calculates the payment. |
+| Get Hexcodes From Websites | [Get Hexcodes From Websites](https://github.com/DhanushNehru/Python-Scripts/tree/main/Get%20Hexcodes%20From%20Websites) | Generates a Python list containing Hexcodes from a website. |
+| Hand_Volume | [Hand_Volume](https://github.com/DhanushNehru/Python-Scripts/tree/main/Hand%20Volume) | Detects and tracks hand movements to control volume. |
+| Hangman Game | [Hangman](https://github.com/DhanushNehru/Python-Scripts/tree/main/Hangman%20Game) | A classic word-guessing game where players guess letters to find the hidden word |
+| Hardware Detector | [Hardware Detector](https://github.com/DhanushNehru/Python-Scripts/tree/main/Hardware%20Detector) | A Python script that detects and displays hardware specifications and resource usage, including CPU, RAM, disk space, and GPU information. |
+| Harvest Predictor | [Harvest Predictor](https://github.com/DhanushNehru/Python-Scripts/tree/main/Harvest%20Predictor) | Takes some necessary input parameters and predicts harvest according to it. |
+| Html-to-images | [html-to-images](https://github.com/DhanushNehru/Python-Scripts/tree/main/HTML%20to%20Images) | Converts HTML documents to image files. |
+| Image Capture | [Image Capture](https://github.com/DhanushNehru/Python-Scripts/tree/main/Image%20Capture) | Captures image from your webcam and saves it on your local device. |
+| Image Compress | [Image Compress](https://github.com/DhanushNehru/Python-Scripts/tree/main/Image%20Compress) | Takes an image and compresses it. |
+| Image Manipulation without libraries | [Image Manipulation without libraries](https://github.com/DhanushNehru/Python-Scripts/tree/main/Image%20Manipulation%20without%20libraries) | Manipulates images without using any external libraries. |
+| Image Text | [Image Text](https://github.com/DhanushNehru/Python-Scripts/tree/main/Image%20Text) | Extracts text from the image. |
+| Image Text to PDF | [Image Text to PDF](https://github.com/DhanushNehru/Python-Scripts/tree/main/Image%20Text%20to%20PDF) | Adds an image and text to a PDF. |
+| Image Uploader | [Image Uploader](https://github.com/DhanushNehru/Python-Scripts/tree/main/Image%20Uploader) | Uploads images to Imgur using a keyboard shortcut. |
+| Image Watermarker | [Image Watermarker](https://github.com/DhanushNehru/Python-Scripts/tree/main/Image%20Watermarker) | Adds a watermark to an image. |
+| Image to ASCII | [Image to ASCII](https://github.com/DhanushNehru/Python-Scripts/tree/main/Image%20to%20ASCII) | Converts an image into ASCII art. |
+| Image to Gif | [Image to Gif](https://github.com/DhanushNehru/Python-Scripts/tree/main/Image%20to%20GIF) | Generate gif from images. |
+| Images to WebP Converter | [Images to WebP Converter](https://github.com/DhanushNehru/Python-Scripts/tree/main/Images%20to%20WebP%20Converter) | Converts images to WebP via cmd or GUI |
+| Interactive Dictionary | [Interactive Dictionary](https://github.com/DhanushNehru/Python-Scripts/tree/main/Image%20InteractiveDictionary) | finding out meanings of words |
+| IP Geolocator | [IP Geolocator](https://github.com/DhanushNehru/Python-Scripts/tree/main/IP%20Geolocator) | Uses an IP address to geolocate a location on Earth. |
+| Jokes Generator | [Jokes generator](https://github.com/DhanushNehru/Python-Scripts/tree/main/Jokes%20Generator) | Generates jokes. |
+| JSON to CSV 1 | [JSON to CSV 1](https://github.com/DhanushNehru/Python-Scripts/tree/main/JSON%20to%20CSV) | Converts JSON to CSV files. |
+| JSON to CSV 2 | [JSON to CSV 2](https://github.com/DhanushNehru/Python-Scripts/tree/main/JSON%20to%20CSV%202) | Converts a JSON file to a CSV file. |
+| JSON to CSV converter | [JSON to CSV converter](https://github.com/DhanushNehru/Python-Scripts/tree/main/Json%20to%20CSV%20Convertor) | Converts JSON file to CSV files. It can convert nested JSON files as well. A sample JSON is included for testing. |
+| JSON to YAML converter | [JSON to YAML converter](https://github.com/DhanushNehru/Python-Scripts/tree/main/JSON%20to%20YAML) | Converts JSON file to YAML files. A sample JSON is included for testing. |
+| Keylogger | [Keylogger](https://github.com/DhanushNehru/Python-Scripts/tree/main/Keylogger) | Keylogger that can track your keystrokes, clipboard text, take screenshots at regular intervals, and records audio. |
+| Keyword - Retweeting | [Keyword - Retweeting](https://github.com/DhanushNehru/Python-Scripts/tree/main/Keyword%20Retweet%20Twitter%20Bot) | Find the latest tweets containing given keywords and then retweet them. |
+| LinkedIn Bot | [LinkedIn Bot](https://github.com/DhanushNehru/Python-Scripts/tree/main/LinkedIn%20Bot) | Automates the process of searching for public profiles on LinkedIn and exporting the data to an Excel sheet. |
| Longitude & Latitude to conical coverter | [Longitude Latitude conical converter](master/Longitude%20Latitude%20conical%20converter) | Converts Longitude and Latitude to Lambert conformal conic projection. |
-| Mail Sender | [Mail Sender](https://github.com/DhanushNehru/Python-Scripts/tree/master/Mail%20Sender) | Sends an email. |
-| Merge Two Images | [Merge Two Images](https://github.com/DhanushNehru/Python-Scripts/tree/master/Merge%20Two%20Images) | Merges two images horizontally or vertically. |
-| Mood based youtube song generator | [Mood based youtube song generator](https://github.com/DhanushNehru/Python-Scripts/tree/master/Mood%20based%20youtube%20song%20generator) | This Python script fetches a random song from YouTube based on your mood input and opens it in your default web browser. |
-| Mouse mover | [Mouse mover](https://github.com/DhanushNehru/Python-Scripts/tree/master/Mouse%20Mover) | Moves your mouse every 15 seconds. |
-| Morse Code | [Mose Code](https://github.com/DhanushNehru/Python-Scripts/tree/master/Morse%20Code) | Encodes and decodes Morse code. |
-| No Screensaver | [No Screensaver](https://github.com/DhanushNehru/Python-Scripts/tree/master/No%20Screensaver) | Prevents screensaver from turning on. |
-| OTP Verification | [OTP Verification](https://github.com/DhanushNehru/Python-Scripts/tree/master/OTP%20%20Verify) | An OTP Verification Checker. |
-| Password Generator | [Password Generator](https://github.com/DhanushNehru/Python-Scripts/tree/master/Password%20Generator) | Generates a random password. |
-| Password Manager | [Password Manager](https://github.com/nem5345/Python-Scripts/tree/master/Password%20Manager) | Generate and interact with a password manager. |
-| Password Strength Checker | [Password Strength Checker](https://github.com/nem5345/Python-Scripts/tree/master/Password%20Strength%20Checker) | Evaluates how strong a given password is. |
-| PDF Merger | [PDF Merger](https://github.com/DhanushNehru/Python-Scripts/tree/master/PDF%20Merger) | Merges multiple PDF files into a single PDF, with options for output location and custom order. |
-| PDF to Audio | [PDF to Audio](https://github.com/DhanushNehru/Python-Scripts/tree/master/PDF%20to%20Audio) | Converts PDF to audio. |
-| PDF to Text | [PDF to text](https://github.com/DhanushNehru/Python-Scripts/tree/master/PDF%20to%20text) | Converts PDF to text. |
-| PDF merger and splitter | [PDF Merger and Splitter](https://github.com/AbhijitMotekar99/Python-Scripts/blob/master/PDF%20Merger%20and%20Splitter/PDF%20Merger%20and%20Splitter.py) | Create a tool that can merge multiple PDF files into one or split a single PDF into separate pages. |
-| Pizza Order | [Pizza Order](https://github.com/DhanushNehru/Python-Scripts/tree/master/Pizza%20Order) | An algorithm designed to handle pizza orders from customers with accurate receipts and calculations. |
-| Planet Simulation | [Planet Simulation](https://github.com/DhanushNehru/Python-Scripts/tree/master/Planet%20Simulation) | A simulation of several planets rotating around the sun. |
-| Playlist Exchange | [Playlist Exchange](https://github.com/DhanushNehru/Python-Scripts/tree/master/Playlist%20Exchange) | A Python script to exchange songs and playlists between Spotify and Python. |
-| Pigeonhole Sort | [Algorithm](https://github.com/DhanushNehru/Python-Scripts/tree/master/PigeonHole) | The pigeonhole sort algorithm to sort your arrays efficiently! |
-| PNG TO JPG CONVERTOR | [PNG-To-JPG](https://github.com/DhanushNehru/Python-Scripts/tree/master/PNG%20To%20JPG) | A PNG TO JPG IMAGE CONVERTOR. |
-| Pomodoro Timer | [Pomodoro Timer](https://github.com/DhanushNehru/Python-Scripts/tree/master/Pomodoro%20Timer) | A Pomodoro timer |
-| Python GUI Notepad | [Python GUI Notepad](https://github.com/DhanushNehru/Python-Scripts/blob/master/PDF%20Merger%20and%20Splitter/PDF%20Merger%20and%20Splitter.py) | A Python-based GUI Notepad with essential features like saving, opening, editing text files, basic formatting, and a simple user interface for quick note-taking. |
-| QR Code Generator | [QR Code Generator](https://github.com/DhanushNehru/Python-Scripts/tree/master/QR%20Code%20Generator) | This is generate a QR code from the provided link |
-| QR Code Scanner | [QR Code Scanner](https://github.com/DhanushNehru/Python-Scripts/tree/master/QR%20Code%20Scanner) | Helps in Sacanning the QR code in form of PNG or JPG just by running the python script. |
-| QR Code with logo | [QR code with Logo](https://github.com/DhanushNehru/Python-Scripts/tree/master/QR%20with%20Logo) | QR Code Customization Feature |
-| Random Color Generator | [Random Color Generator](https://github.com/DhanushNehru/Python-Scripts/tree/master/Random%20Color%20Generator) | A random color generator that will show you the color and values! |
-| Remove Background | [Remove Background](https://github.com/DhanushNehru/Python-Scripts/tree/master/Remove%20Background) | Removes the background of images. |
-| Road-Lane-Detection | [Road-Lane-Detection](https://github.com/NotIncorecc/Python-Scripts/tree/master/Road-Lane-Detection) | Detects the lanes of the road |
-| Rock Paper Scissor 1 | [Rock Paper Scissor 1](https://github.com/DhanushNehru/Python-Scripts/tree/master/Rock%20Paper%20Scissor%201) | A game of Rock Paper Scissors. |
-| Rock Paper Scissor 2 | [Rock Paper Scissor 2](https://github.com/DhanushNehru/Python-Scripts/tree/master/Rock%20Paper%20Scissor%202) | A new version game of Rock Paper Scissors. |
-| Run Then Notify | [Run Then Notify](https://github.com/DhanushNehru/Python-Scripts/tree/master/Run%20Then%20Notify) | Runs a slow command and emails you when it completes execution. |
-| Selfie with Python | [Selfie with Python](https://github.com/DhanushNehru/Python-Scripts/tree/master/Selfie%20with%20Python) | Take your selfie with python . |
-| Simple DDOS | [Simple DDOS](https://github.com/VanshajR/Python-Scripts/tree/master/Simple%20DDOS) | The code allows you to send multiple HTTP requests concurrently for a specified duration. |
-| Simple TCP Chat Server | [Simple TCP Chat Server](https://github.com/DhanushNehru/Python-Scripts/tree/master/TCP%20Chat%20Server) | Creates a local server on your LAN for receiving and sending messages! |
-| Smart Attendance System | [Smart Attendance System](https://github.com/DhanushNehru/Python-Scripts/tree/master/Smart%20Attendance%20System) | This OpenCV framework is for Smart Attendance by actively decoding a student's QR Code. |
-| Snake Game | [Snake Game](https://github.com/DhanushNehru/Python-Scripts/tree/master/Snake%20Game) | Classic snake game using python. |
-| Snake Water Gun | [Snake Water Gun](https://github.com/DhanushNehru/Python-Scripts/tree/master/Snake%20Water%20Gun) | A game similar to Rock Paper Scissors. |
-| Sorting | [Sorting](https://github.com/DhanushNehru/Python-Scripts/tree/master/Sorting) | Algorithm for bubble sorting. |
-| Star Pattern | [Star Pattern](https://github.com/DhanushNehru/Python-Scripts/tree/master/Star%20Pattern) | Creates a star pattern pyramid. |
-| Subnetting Calculator | [Subnetting Calculator](https://github.com/DhanushNehru/Python-Scripts/tree/master/Subnetting%20Calculator) | Calculates network information based on a given IP address and subnet mask. |
-| Take a break | [Take a break](https://github.com/DhanushNehru/Python-Scripts/tree/master/Take%20A%20Break) | Python code to take a break while working long hours. |
+| Mail Sender | [Mail Sender](https://github.com/DhanushNehru/Python-Scripts/tree/main/Mail%20Sender) | Sends an email. |
+| Merge Two Images | [Merge Two Images](https://github.com/DhanushNehru/Python-Scripts/tree/main/Merge%20Two%20Images) | Merges two images horizontally or vertically. |
+| Mood based youtube song generator | [Mood based youtube song generator](https://github.com/DhanushNehru/Python-Scripts/tree/main/Mood%20based%20youtube%20song%20generator) | This Python script fetches a random song from YouTube based on your mood input and opens it in your default web browser. |
+| Mouse mover | [Mouse mover](https://github.com/DhanushNehru/Python-Scripts/tree/main/Mouse%20Mover) | Moves your mouse every 15 seconds. |
+| Multi-Platform Icon Generator | [Multi-Platform Icon Generator](https://github.com/DhanushNehru/Python-Scripts/tree/main/Multi-Platform%20Icon%20Generator) | Automates creation of 35+ platform-specific icon sizes from one source image for app stores and web deployment.
+| Morse Code | [Morse Code](https://github.com/DhanushNehru/Python-Scripts/tree/main/Morse%20Code) | Encodes and decodes Morse code. |
+| No Screensaver | [No Screensaver](https://github.com/DhanushNehru/Python-Scripts/tree/main/No%20Screensaver) | Prevents screensaver from turning on. |
+| OTP Verification | [OTP Verification](https://github.com/DhanushNehru/Python-Scripts/tree/main/OTP%20%20Verify) | An OTP Verification Checker. |
+| Password Generator | [Password Generator](https://github.com/DhanushNehru/Python-Scripts/tree/main/Password%20Generator) | Generates a random password. |
+| Password Manager | [Password Manager](https://github.com/nem5345/Python-Scripts/tree/main/Password%20Manager) | Generate and interact with a password manager. |
+| Password Strength Checker | [Password Strength Checker](https://github.com/nem5345/Python-Scripts/tree/main/Password%20Strength%20Checker) | Evaluates how strong a given password is. |
+| PDF Merger | [PDF Merger](https://github.com/DhanushNehru/Python-Scripts/tree/main/PDF%20Merger) | Merges multiple PDF files into a single PDF, with options for output location and custom order. |
+| PDF to Audio | [PDF to Audio](https://github.com/DhanushNehru/Python-Scripts/tree/main/PDF%20to%20Audio) | Converts PDF to audio. |
+| PDF to Text | [PDF to text](https://github.com/DhanushNehru/Python-Scripts/tree/main/PDF%20to%20text) | Converts PDF to text. |
+| PDF merger and splitter | [PDF Merger and Splitter](https://github.com/AbhijitMotekar99/Python-Scripts/blob/main/PDF%20Merger%20and%20Splitter/PDF%20Merger%20and%20Splitter.py) | Create a tool that can merge multiple PDF files into one or split a single PDF into separate pages. |
+| Pizza Order | [Pizza Order](https://github.com/DhanushNehru/Python-Scripts/tree/main/Pizza%20Order) | An algorithm designed to handle pizza orders from customers with accurate receipts and calculations. |
+| Planet Simulation | [Planet Simulation](https://github.com/DhanushNehru/Python-Scripts/tree/main/Planet%20Simulation) | A simulation of several planets rotating around the sun. |
+| Playlist Exchange | [Playlist Exchange](https://github.com/DhanushNehru/Python-Scripts/tree/main/Playlist%20Exchange) | A Python script to exchange songs and playlists between Spotify and Python. |
+| Pigeonhole Sort | [Algorithm](https://github.com/DhanushNehru/Python-Scripts/tree/main/PigeonHole) | The pigeonhole sort algorithm to sort your arrays efficiently! |
+| PNG TO JPG CONVERTOR | [PNG-To-JPG](https://github.com/DhanushNehru/Python-Scripts/tree/main/PNG%20To%20JPG) | A PNG TO JPG IMAGE CONVERTOR. |
+| Pomodoro Timer | [Pomodoro Timer](https://github.com/DhanushNehru/Python-Scripts/tree/main/Pomodoro%20Timer) | A Pomodoro timer |
+| Python GUI Notepad | [Python GUI Notepad](https://github.com/DhanushNehru/Python-Scripts/tree/main/Python%20GUI%20Notepad) | A Python-based GUI Notepad with essential features like saving, opening, editing text files, basic formatting, and a simple user interface for quick note-taking. |
+| Profanity Checker | [Profanity Checker](https://github.com/DhanushNehru/Python-Scripts/tree/main/Profanity%20Checker) | A Python script to detect and optionally censor profanity in text. |
+| QR Code Generator | [QR Code Generator](https://github.com/DhanushNehru/Python-Scripts/tree/main/QR%20Code%20Generator) | This is generate a QR code from the provided link |
+| QR Code Scanner | [QR Code Scanner](https://github.com/DhanushNehru/Python-Scripts/tree/main/QR%20Code%20Scanner) | Helps in Sacanning the QR code in form of PNG or JPG just by running the python script. |
+| QR Code with logo | [QR code with Logo](https://github.com/DhanushNehru/Python-Scripts/tree/main/QR%20with%20Logo) | QR Code Customization Feature |
+| Random Color Generator | [Random Color Generator](https://github.com/DhanushNehru/Python-Scripts/tree/main/Random%20Color%20Generator) | A random color generator that will show you the color and values! |
+| Remove Background | [Remove Background](https://github.com/DhanushNehru/Python-Scripts/tree/main/Remove%20Background) | Removes the background of images. |
+| Road-Lane-Detection | [Road-Lane-Detection](https://github.com/NotIncorecc/Python-Scripts/tree/main/Road-Lane-Detection) | Detects the lanes of the road |
+| Rock Paper Scissor 1 | [Rock Paper Scissor 1](https://github.com/DhanushNehru/Python-Scripts/tree/main/Rock%20Paper%20Scissor%201) | A game of Rock Paper Scissors. |
+| Rock Paper Scissor 2 | [Rock Paper Scissor 2](https://github.com/DhanushNehru/Python-Scripts/tree/main/Rock%20Paper%20Scissor%202) | A new version game of Rock Paper Scissors. |
+| Run Then Notify | [Run Then Notify](https://github.com/DhanushNehru/Python-Scripts/tree/main/Run%20Then%20Notify) | Runs a slow command and emails you when it completes execution. |
+| Save File To Drive | [Save File To Drive](https://github.com/DhanushNehru/Python-Scripts/tree/master/Save%20file%20to%20Drive) | Saves all files and folder with proper structure from a folder to drive easily through a python script . |
+| Selfie with Python | [Selfie with Python](https://github.com/DhanushNehru/Python-Scripts/tree/main/Selfie%20with%20Python) | Take your selfie with python . |
+| Simple DDOS | [Simple DDOS](https://github.com/DhanushNehru/Python-Scripts/tree/main/Simple%20DDOS) | The code allows you to send multiple HTTP requests concurrently for a specified duration. |
+| Simple TCP Chat Server | [Simple TCP Chat Server](https://github.com/DhanushNehru/Python-Scripts/tree/main/TCP%20Chat%20Server) | Creates a local server on your LAN for receiving and sending messages! |
+| Smart Attendance System | [Smart Attendance System](https://github.com/DhanushNehru/Python-Scripts/tree/main/Smart%20Attendance%20System) | This OpenCV framework is for Smart Attendance by actively decoding a student's QR Code. |
+| Snake Game | [Snake Game](https://github.com/DhanushNehru/Python-Scripts/tree/main/Snake%20Game) | Classic snake game using python. |
+| Snake Water Gun | [Snake Water Gun](https://github.com/DhanushNehru/Python-Scripts/tree/main/Snake%20Water%20Gun) | A game similar to Rock Paper Scissors. |
+| Sorting | [Sorting](https://github.com/DhanushNehru/Python-Scripts/tree/main/Sorting) | Algorithm for bubble sorting. |
+| Star Pattern | [Star Pattern](https://github.com/DhanushNehru/Python-Scripts/tree/main/Star%20Pattern) | Creates a star pattern pyramid. |
+| Subnetting Calculator | [Subnetting Calculator](https://github.com/DhanushNehru/Python-Scripts/tree/main/Subnetting%20Calculator) | Calculates network information based on a given IP address and subnet mask. |
+| Take a break | [Take a break](https://github.com/DhanushNehru/Python-Scripts/tree/main/Take%20A%20Break) | Python code to take a break while working long hours. |
| Text Recognition | [Text Recognition](https://github.com/DhanushNehru/Python-Scripts/tree/Text-Recognition/Text%20Recognition) | A Image Text Recognition ML Model to extract text from Images |
-| Text to Image | [Text to Image](https://github.com/DhanushNehru/Python-Scripts/tree/master/Text%20to%20Image) | A Python script that will take your text and convert it to a JPEG. |
-| Tic Tac Toe 1 | [Tic Tac Toe 1](https://github.com/DhanushNehru/Python-Scripts/tree/master/Tic-Tac-Toe%201) | A game of Tic Tac Toe. |
-| Tik Tac Toe 2 | [Tik Tac Toe 2](https://github.com/DhanushNehru/Python-Scripts/tree/master/Tic-Tac-Toe%202) | A game of Tik Tac Toe. |
-| Turtle Art & Patterns | [Turtle Art](https://github.com/DhanushNehru/Python-Scripts/tree/master/Turtle%20Art) | Scripts to view turtle art also have prompt-based ones. |
-| Turtle Graphics | [Turtle Graphics](https://github.com/DhanushNehru/Python-Scripts/tree/master/Turtle%20Graphics) | Code using turtle graphics. |
-| Twitter Selenium Bot | [Twitter Selenium Bot](https://github.com/DhanushNehru/Python-Scripts/tree/master/Twitter%20Selenium%20Bot) | A bot that can interact with Twitter in a variety of ways. |
-| Umbrella Reminder | [Umbrella Reminder](https://github.com/DhanushNehru/Python-Scripts/tree/master/Umbrella%20Reminder) | A reminder for umbrellas. |
-| University Rankings | [University Rankings](https://github.com/DhanushNehru/Python-Scripts/tree/master/University%20Rankings) | Ranks Universities across the globes using the Country, Continent, and Captial |
-| URL Shortener | [URL Shortener](https://github.com/DhanushNehru/Python-Scripts/tree/master/URL%20Shortener) | A URL shortener code compresses long URLs into shorter, more manageable links |
-| Video Downloader | [Video Downloader](https://github.com/DhanushNehru/Python-Scripts/tree/master/Video%20Downloader) | Download Videos from youtube to your local system. |
-| Video Watermarker | [Video Watermarker](https://github.com/DhanushNehru/Python-Scripts/tree/master/Video%20Watermarker) | Adds watermark to any video of your choice. |
-| Virtual Painter | [Virtual Painter](https://github.com/DhanushNehru/Python-Scripts/tree/master/Virtual%20Painter) | Virtual painting application. |
-| Wallpaper Changer | [Wallpaper Changer](https://github.com/DhanushNehru/Python-Scripts/tree/master/Wallpaper%20Changer) | Automatically changes home wallpaper, adding a random quote and stock tickers on it. |
-| Weather GUI | [Weather GUI](https://github.com/DhanushNehru/Python-Scripts/tree/master/Weather%20GUI) | Displays information on the weather. |
-| Website Blocker | [Website Blocker](https://github.com/DhanushNehru/Python-Scripts/tree/master/Website%20Blocker) | Downloads the website and loads it on your homepage in your local IP. |
-| Website Cloner | [Website Cloner](https://github.com/DhanushNehru/Python-Scripts/tree/master/Website%20Cloner) | Clones any website and opens the site in your local IP. |
-| Web Scraper | [Web Scraper](https://github.com/Charul00/Python-Scripts/tree/main/Web%20Scraper) | A Python script that scrapes blog titles from Python.org and saves them to a file. |
-| Weight Converter | [Weight Converter](https://github.com/WatashiwaSid/Python-Scripts/tree/master/Weight%20Converter) | Simple GUI script to convert weight in different measurement units. |
-| Wikipedia Data Extractor | [Wikipedia Data Extractor](https://github.com/DhanushNehru/Python-Scripts/tree/master/Wikipedia%20Data%20Extractor) | A simple Wikipedia data extractor script to get output in your IDE. |
-| Word to PDF | [Word to PDF](https://github.com/DhanushNehru/Python-Scripts/tree/master/Word%20to%20PDF%20converter) | A Python script to convert an MS Word file to a PDF file. |
-| Youtube Downloader | [Youtube Downloader](https://github.com/DhanushNehru/Python-Scripts/tree/master/Youtube%20Downloader) | Downloads any video from [YouTube](https://youtube.com) in video or audio format! |
-| Youtube Playlist Info Scraper | [Youtube Playlist Info Scraper](https://github.com/DhanushNehru/Python-Scripts/tree/master/Youtube%20Playlist%20Info%20Scraper) | This python module retrieve information about a YouTube playlist in json format using playlist link. |
-
-## Gitpod
-
-Use the cloud-free development environment where you can directly start coding.
-
-You can use Gitpod in the cloud [](https://gitpod.io/#https://github.com/DhanushNehru/Python-Scripts/)
+| Text to Image | [Text to Image](https://github.com/DhanushNehru/Python-Scripts/tree/main/Text%20to%20Image) | A Python script that will take your text and convert it to a JPEG. |
+| Thread Progress | [Thread Progress](https://github.com/DhanushNehru/Python-Scripts/tree/main/Thread%20Progress) | A Python script demonstrating safe multithreading by using a lock to update a shared progress variable concurrently. |
+| Tic Tac Toe 1 | [Tic Tac Toe 1](https://github.com/DhanushNehru/Python-Scripts/tree/main/Tic-Tac-Toe%201) | A game of Tic Tac Toe. |
+| Tik Tac Toe 2 | [Tik Tac Toe 2](https://github.com/DhanushNehru/Python-Scripts/tree/main/Tic-Tac-Toe%202) | A game of Tik Tac Toe. |
+| Turtle Art & Patterns | [Turtle Art](https://github.com/DhanushNehru/Python-Scripts/tree/main/Turtle%20Art) | Scripts to view turtle art also have prompt-based ones. |
+| Turtle Graphics | [Turtle Graphics](https://github.com/DhanushNehru/Python-Scripts/tree/main/Turtle%20Graphics) | Code using turtle graphics. |
+| Twitter Selenium Bot | [Twitter Selenium Bot](https://github.com/DhanushNehru/Python-Scripts/tree/main/Twitter%20Selenium%20Bot) | A bot that can interact with Twitter in a variety of ways. |
+| Umbrella Reminder | [Umbrella Reminder](https://github.com/DhanushNehru/Python-Scripts/tree/main/Umbrella%20Reminder) | A reminder for umbrellas. |
+| University Rankings | [University Rankings](https://github.com/DhanushNehru/Python-Scripts/tree/main/University%20Rankings) | Ranks Universities across the globes using the Country, Continent, and Captial |
+| URL Shortener | [URL Shortener](https://github.com/DhanushNehru/Python-Scripts/tree/main/URL%20Shortener) | A URL shortener code compresses long URLs into shorter, more manageable links |
+| Video Downloader | [Video Downloader](https://github.com/DhanushNehru/Python-Scripts/tree/main/Video%20Downloader) | Download Videos from youtube to your local system. |
+| Video Watermarker | [Video Watermarker](https://github.com/DhanushNehru/Python-Scripts/tree/main/Video%20Watermarker) | Adds watermark to any video of your choice. |
+| Virtual Painter | [Virtual Painter](https://github.com/DhanushNehru/Python-Scripts/tree/main/Virtual%20Painter) | Virtual painting application. |
+| Wallpaper Changer | [Wallpaper Changer](https://github.com/DhanushNehru/Python-Scripts/tree/main/Wallpaper%20Changer) | Automatically changes home wallpaper, adding a random quote and stock tickers on it. |
+| Weather GUI | [Weather GUI](https://github.com/DhanushNehru/Python-Scripts/tree/main/Weather%20GUI) | Displays information on the weather. |
+| Website Blocker | [Website Blocker](https://github.com/DhanushNehru/Python-Scripts/tree/main/Website%20Blocker) | Downloads the website and loads it on your homepage in your local IP. |
+| Website Cloner | [Website Cloner](https://github.com/DhanushNehru/Python-Scripts/tree/main/Website%20Cloner) | Clones any website and opens the site in your local IP. |
+| Web Scraper | [Web Scraper](https://github.com/DhanushNehru/Python-Scripts/tree/main/Web%20Scraper) | A Python script that scrapes blog titles from [Python.org](https://www.python.org/) and saves them to a file. |
+| Weight Converter | [Weight Converter](https://github.com/DhanushNehru/Python-Scripts/tree/main/Weight%20Converter) | Simple GUI script to convert weight in different measurement units. |
+| Wikipedia Data Extractor | [Wikipedia Data Extractor](https://github.com/DhanushNehru/Python-Scripts/tree/main/Wikipedia%20Data%20Extractor) | A simple Wikipedia data extractor script to get output in your IDE. |
+| Word to PDF | [Word to PDF](https://github.com/DhanushNehru/Python-Scripts/tree/main/Word%20to%20PDF%20converter) | A Python script to convert an MS Word file to a PDF file. |
+| Youtube Downloader | [Youtube Downloader](https://github.com/DhanushNehru/Python-Scripts/tree/main/Youtube%20Downloader) | Downloads any video from [YouTube](https://youtube.com) in video or audio format! |
+| Youtube Playlist Info Scraper | [Youtube Playlist Info Scraper](https://github.com/DhanushNehru/Python-Scripts/tree/main/Youtube%20Playlist%20Info%20Scraper) | This python module retrieve information about a YouTube playlist in json format using playlist link. |
+
## Wall of Contributors
@@ -172,7 +174,6 @@ You can use Gitpod in the cloud [
+gauth.LocalWebserverAuth()
+drive = GoogleDrive(gauth)
+
+# === Prompt for target folder ===
+target_folder_name = input("Enter the name of the target folder in Google Drive: ").strip()
+
+def get_or_create_drive_folder(folder_name, parent_id='root'):
+ """Get Drive folder ID by name or create it under given parent"""
+ query = (
+ f"title='{folder_name}' and "
+ f"mimeType='application/vnd.google-apps.folder' and "
+ f"'{parent_id}' in parents and trashed=false"
+ )
+ file_list = drive.ListFile({'q': query}).GetList()
+ if file_list:
+ print(f"Folder '{folder_name}' found in Google Drive.")
+ return file_list[0]['id']
+ else:
+ print(f"Folder '{folder_name}' not found. Creating it...")
+ folder_metadata = {
+ 'title': folder_name,
+ 'parents': [{'id': parent_id}],
+ 'mimeType': 'application/vnd.google-apps.folder'
+ }
+ folder = drive.CreateFile(folder_metadata)
+ folder.Upload()
+ return folder['id']
+
+# === Configuration ===
+local_root = r"drive" # Your local folder name
+drive_root_id = get_or_create_drive_folder(target_folder_name)
+
+# Folder mapping cache
+folder_mapping = {local_root: drive_root_id}
+
+# Recursively walk and upload
+for root, dirs, files in os.walk(local_root):
+ rel_path = os.path.relpath(root, local_root)
+
+ if rel_path == '.':
+ parent_id = drive_root_id
+ else:
+ parent_local = os.path.dirname(root)
+ parent_id = folder_mapping.get(parent_local, drive_root_id)
+
+ folder_name = os.path.basename(root)
+ folder_id = get_or_create_drive_folder(folder_name, parent_id)
+ folder_mapping[root] = folder_id
+
+ for file_name in files:
+ file_path = os.path.join(root, file_name)
+
+ # === Check if file already exists in this Drive folder ===
+ query = (
+ f"title='{file_name}' and "
+ f"'{folder_mapping[root]}' in parents and "
+ f"trashed=false"
+ )
+ existing_files = drive.ListFile({'q': query}).GetList()
+ if existing_files:
+ print(f"⏩ File '{file_name}' already exists in '{rel_path}', skipping.")
+ continue
+
+ print(f"⬆️ Uploading '{file_name}' to '{rel_path}'...")
+ file_drive = drive.CreateFile({
+ 'title': file_name,
+ 'parents': [{'id': folder_mapping[root]}]
+ })
+ file_drive.SetContentFile(file_path)
+ file_drive.Upload()
+ file_drive = None
diff --git a/Save file to Drive/readme.md b/Save file to Drive/readme.md
new file mode 100644
index 00000000..2b0872f4
--- /dev/null
+++ b/Save file to Drive/readme.md
@@ -0,0 +1,69 @@
+
+
+# 📁 Save File and Folder to Drive
+
+A simple utility to interact with Google Drive. This project uses the Google Drive API and requires authentication via `client_secret.json` file.
+
+## 🚀 Features
+
+* Upload files and folders to Google Drive.
+* Doesn't change folder structure
+* Easy setup for Google Drive API.
+
+---
+
+## 🛠️ Setup Instructions
+
+### 1. Install Dependencies
+
+Make sure you have Python 3 installed.
+
+```bash
+pip install -r requirements.txt
+```
+
+### 2. Generate `client_secret.json` (Google OAuth Credentials)
+
+To access Google Drive, you’ll need OAuth 2.0 credentials:
+
+1. Go to the **Google Cloud Console**:
+ 👉 [Create OAuth Credentials](https://console.cloud.google.com/apis/credentials)
+
+2. Steps:
+ * Don't forget to check project name, create new project.
+ * Search **Google Drive API**, don't get confused with Google Drive Analytics API
+ * Click Enable
+ * Go to **Credentials** on left sidebar, click **Create Credential** on top and select **OAuth client ID**
+ * You might be asked to **configure consent screen**
+ * Click on it and click Get Started
+ * Add necessary details like app name and emails, Name example: test123
+ * Click **Create**
+ * Now select **Create OAuth Client**
+ * Choose application type as **Desktop app** and leave name as it is
+ * Download the JSON file and **rename it to `client_secret.json`**
+ * Place the file in the project directory
+ * Now you would have to create test user for using this API.
+ * Select **Audience** from left Sidebar
+ * Add all necessary emails under test email and save it
+
+📝 Official Guide:
+[Using OAuth 2.0 for Installed Applications](https://developers.google.com/identity/protocols/oauth2)
+
+---
+
+## ▶️ Running the Script
+
+Once everything is set up:
+
+```bash
+python main.py
+```
+
+---
+
+## 📎 Notes
+
+* Make sure to enable the **Google Drive API** in your Google Cloud Console.
+
+---
+
diff --git a/Save file to Drive/requirements.txt b/Save file to Drive/requirements.txt
new file mode 100644
index 00000000..7524380f
Binary files /dev/null and b/Save file to Drive/requirements.txt differ
diff --git a/Thread Progress/README.md b/Thread Progress/README.md
new file mode 100644
index 00000000..1430bf2c
--- /dev/null
+++ b/Thread Progress/README.md
@@ -0,0 +1,19 @@
+## Thread Progress
+
+This script demonstrates the use of **Python threads** to simulate parallel progress updates using a shared variable and a `Lock` to avoid race conditions.
+
+### 🧠 Concepts Covered
+
+- Python `threading.Thread`
+- Synchronization with `threading.Lock`
+- Global variables and shared state
+- Simulated concurrent work using `time.sleep`
+
+### 📝 Description
+
+Two threads increment a shared `progress` variable by `10` in a loop. A `Lock` ensures only one thread can modify the shared variable at a time, preventing race conditions.
+
+### 👉 Run
+```
+python3 thread_progress.py
+```
diff --git a/Thread Progress/thread_progress.py b/Thread Progress/thread_progress.py
new file mode 100644
index 00000000..4b272e89
--- /dev/null
+++ b/Thread Progress/thread_progress.py
@@ -0,0 +1,28 @@
+import threading
+import time
+
+# Shared variable
+progress = 0
+lock = threading.Lock()
+
+def increase_by_10():
+ global progress
+ for _ in range(10):
+ time.sleep(0.01) # Simulate work
+ with lock: # Only one thread can change `progress` at a time
+ progress += 10
+ print(f"{threading.current_thread().name}: progress = {progress}%")
+
+# Create two threads
+thread1 = threading.Thread(target=increase_by_10, name="Thread-1")
+thread2 = threading.Thread(target=increase_by_10, name="Thread-2")
+
+# Start the threads
+thread1.start()
+thread2.start()
+
+# Wait for both threads to finish
+thread1.join()
+thread2.join()
+
+print(f"Final progress: {progress}%")
diff --git a/Website Cloner/index.html b/Website Cloner/index.html
index 26c2f4ee..357d9e74 100644
--- a/Website Cloner/index.html
+++ b/Website Cloner/index.html
@@ -1,40 +1,32 @@
- PROXY SERVER
-
-
-
-
+ PROXY SERVER
+
+
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/Website Cloner/server.py b/Website Cloner/server.py
index 3816e4ba..446f8bc6 100644
--- a/Website Cloner/server.py
+++ b/Website Cloner/server.py
@@ -8,31 +8,52 @@ class RequestHandler(http.server.SimpleHTTPRequestHandler):
def do_GET(self):
if self.path == "/":
self.path = "index.html"
- return http.server.SimpleHTTPRequestHandler.do_GET(self)
+ try:
+ return http.server.SimpleHTTPRequestHandler.do_GET(self)
+ except FileNotFoundError:
+ self.send_error(404, "File not found")
+
def do_POST(self):
- form = cgi.FieldStorage(
- fp=self.rfile,
- headers=self.headers,
- environ={
- 'REQUEST_METHOD': 'POST',
- 'CONTENT_TYPE': self.headers['Content-Type'],
- })
- url = form.getvalue('submitButton')
- urlN = 'https://' + str(url) +'/'
- isdir = os.path.isdir(url)
- if not isdir:
- kwargs = {'project_name': url}
- save_webpage(
- url=urlN,
- project_folder='./',
- **kwargs
- )
- path = url + "/" + url + "/index.html"
+ content_length = int(self.headers.get('Content-Length', 0))
+ post_data = self.rfile.read(content_length).decode("utf-8")
+
+ # Parse the URL from the form submission
+ form = cgi.parse_qs(post_data)
+ url = form.get("submitButton", [""])[0]
+
+ if not url:
+ self.send_error(400, "Bad Request: URL is missing")
+ return
+
+ urlN = "https://" + url.strip("/")
+ project_folder = os.path.join('./cloned_sites', url.replace("https://", "").replace("http://", ""))
+
+ if not os.path.isdir(project_folder):
+ os.makedirs(project_folder, exist_ok=True)
+ try:
+ save_webpage(
+ url=urlN,
+ project_folder=project_folder,
+ project_name=url.replace("https://", "").replace("http://", "")
+ )
+ except Exception as e:
+ self.send_error(500, f"Error cloning website: {e}")
+ return
+
+ path = os.path.join(project_folder, "index.html")
+ if not os.path.isfile(path):
+ self.send_error(404, "Cloned page not found")
+ return
+
self.send_response(301)
- self.send_header('Location', path)
+ self.send_header("Location", "/" + path)
self.end_headers()
- return http.server.SimpleHTTPRequestHandler.do_GET(self)
+
PORT = 7000
-s = socketserver.TCPServer(("127.0.0.1", PORT), RequestHandler)
-s.serve_forever()
\ No newline at end of file
+os.chdir(os.path.dirname(os.path.abspath(__file__)))
+
+with socketserver.TCPServer(("127.0.0.1", PORT), RequestHandler) as s:
+ s.allow_reuse_address = True
+ print(f"Server running on http://127.0.0.1:{PORT}")
+ s.serve_forever()
diff --git a/update_master_to_main.py b/update_master_to_main.py
new file mode 100644
index 00000000..20f91fad
--- /dev/null
+++ b/update_master_to_main.py
@@ -0,0 +1,25 @@
+import os
+
+def update_readme():
+ if not os.path.exists('README.md'):
+ print("README.md not found")
+ return
+
+ with open('README.md', 'r', encoding='utf-8') as f:
+ content = f.read()
+
+ with open('README.md.backup', 'w', encoding='utf-8') as f:
+ f.write(content)
+
+ updated = content.replace('/master/', '/main/')
+ updated = updated.replace('/blob/master/', '/blob/main/')
+ updated = updated.replace('/tree/master/', '/tree/main/')
+
+ with open('README.md', 'w', encoding='utf-8') as f:
+ f.write(updated)
+
+ changes = content.count('/master/') - updated.count('/master/')
+ print(f"Updated {changes} references")
+
+if __name__ == "__main__":
+ update_readme()
\ No newline at end of file