{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":615831293,"defaultBranch":"master","name":"aicomedy","ownerLogin":"younesbram","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2023-03-18T20:00:08.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/43382860?v=4","public":true,"private":false,"isOrgOwned":false},"refInfo":{"name":"","listCacheKey":"v0:1679169773.0","currentOid":""},"activityList":{"items":[{"before":"21085ff84307d506a4f800ec267955c57c295e16","after":"9eaac8e931fae9c6e00882265c8277204217796c","ref":"refs/heads/master","pushedAt":"2024-08-30T22:55:09.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"younesbram","name":"Younes Brahimi","path":"/younesbram","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43382860?s=80&v=4"},"commit":{"message":"Update app.py","shortMessageHtmlLink":"Update app.py"}},{"before":"385205745254003b24de87feb2edd4f50a9e87b1","after":"21085ff84307d506a4f800ec267955c57c295e16","ref":"refs/heads/master","pushedAt":"2024-08-30T22:52:16.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"younesbram","name":"Younes Brahimi","path":"/younesbram","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43382860?s=80&v=4"},"commit":{"message":"Update app.py","shortMessageHtmlLink":"Update app.py"}},{"before":"cc5561ac470d9dd7ef005a586c2756f639d0bd31","after":"385205745254003b24de87feb2edd4f50a9e87b1","ref":"refs/heads/master","pushedAt":"2024-08-30T22:48:22.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"younesbram","name":"Younes Brahimi","path":"/younesbram","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43382860?s=80&v=4"},"commit":{"message":"Update app.py","shortMessageHtmlLink":"Update app.py"}},{"before":"4dac168e97bfa2a9ed2aa87d792026fa865a2731","after":"cc5561ac470d9dd7ef005a586c2756f639d0bd31","ref":"refs/heads/master","pushedAt":"2024-08-30T22:39:59.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"younesbram","name":"Younes Brahimi","path":"/younesbram","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43382860?s=80&v=4"},"commit":{"message":"Update requirements.txt","shortMessageHtmlLink":"Update requirements.txt"}},{"before":"5bcb8ba0e95aa114a53de1bb9cdb25169399aac0","after":"4dac168e97bfa2a9ed2aa87d792026fa865a2731","ref":"refs/heads/master","pushedAt":"2024-08-30T22:38:49.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"younesbram","name":"Younes Brahimi","path":"/younesbram","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43382860?s=80&v=4"},"commit":{"message":"Update app.py","shortMessageHtmlLink":"Update app.py"}},{"before":"910da833fb900756828b271229f21d0cd8cd860f","after":"5bcb8ba0e95aa114a53de1bb9cdb25169399aac0","ref":"refs/heads/master","pushedAt":"2024-07-01T17:57:09.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"younesbram","name":"Younes Brahimi","path":"/younesbram","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43382860?s=80&v=4"},"commit":{"message":"Update README.md","shortMessageHtmlLink":"Update README.md"}},{"before":"d7dcbb68c9121bddacfed18b0aa863961793e4db","after":"910da833fb900756828b271229f21d0cd8cd860f","ref":"refs/heads/master","pushedAt":"2024-05-24T20:38:58.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"younesbram","name":"Younes Brahimi","path":"/younesbram","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43382860?s=80&v=4"},"commit":{"message":"fix","shortMessageHtmlLink":"fix"}},{"before":"55e9f1b81fc7b4b322e894eb42277c902c56529a","after":"d7dcbb68c9121bddacfed18b0aa863961793e4db","ref":"refs/heads/master","pushedAt":"2024-05-24T20:15:04.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"younesbram","name":"Younes Brahimi","path":"/younesbram","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43382860?s=80&v=4"},"commit":{"message":"import os\nfrom dotenv import load_dotenv\nimport streamlit as st\nimport openai\nfrom PIL import Image\nimport requests\nfrom io import BytesIO\nimport base64\nfrom groq import Groq\n\nload_dotenv()\n\nopenai_api_key = st.secrets[\"OPENAI_API_KEY\"]\nelevenlabs_api_key = st.secrets[\"EV_API_KEY\"]\ngroq_api_key = st.secrets[\"GROQ_API_KEY\"]\njerry_voice = st.secrets[\"JERRY_VOICE\"]\nkramer_voice = st.secrets[\"KRAMER_VOICE\"]\ngeorge_voice = st.secrets[\"GEORGE_VOICE\"]\nlarry_david_voice = st.secrets[\"LARRY_DAVID_VOICE\"]\nelaine_voice = st.secrets[\"ELAINE_VOICE\"]\nnewman_voice = st.secrets[\"NEWMAN_VOICE\"]\nleon_voice = st.secrets[\"LEON_VOICE\"]\njeff_voice = st.secrets[\"JEFF_VOICE\"]\n\nif not groq_api_key:\n raise ValueError(\"GROQ_API_KEY environment variable not set\")\n\nst.set_page_config(\n page_title=\"AI Skit Generator\",\n page_icon=\"๐Ÿ˜‚\",\n initial_sidebar_state=\"expanded\",\n menu_items={\n \"Get Help\": \"https://www.github.com/younesbram/aicomedy\",\n \"Report a bug\": \"https://www.younes.ca/contact\",\n \"About\": \"# AI Skit Generator\\nAn app that uses AI to generate hilarious skits!\",\n },\n)\n\nclient = Groq(api_key=groq_api_key)\n\nif 'script' not in st.session_state:\n st.session_state['script'] = None\nif 'intro_audio' not in st.session_state:\n st.session_state['intro_audio'] = None\nif 'outro_audio' not in st.session_state:\n st.session_state['outro_audio'] = None\n\ndef generate_joke_with_groq(topic, characters):\n messages = [\n {\"role\": \"system\",\n \"content\": f\"You never give emotions in the script or pauses or descriptors or laughs. NO (pauses) NO (smirks) NO (laughs) NO ANY OF THAT ONLY THE TEXT!!!! You are an extremely funny and sarcastic comedian writer that knows Larry David and Jerry Seinfeld's writing styles, tasked with preserving {', '.join(characters)} jokes and delivering the same style punchlines in your short skits. You will respond in a script that includes {', '.join(characters)}.\"},\n {\"role\": \"user\",\n \"content\": f\"The topic is: {topic}. Please obey newlines and DONT give ANY descriptors only Character: speech for the ENTIRE script only with the characters selected. Nothing else or else the system bugs. Only respond as previous instructions and be extremely funny, like genius comedy. Do not add any extra characters. Do not add any descriptors like (pauses) or (excitedly) NO MATTER WHAT! because I will be programmatically generating voice clips from the script. So anything like (sarcastically) or ANYTHING like that will destroy our whole moat and program. Take this seriously. INCLUDE EVERY CHARACTER SELECTED . {', '.join(characters)}\"},\n ]\n\n stream = client.chat.completions.create(\n messages=messages,\n model=\"llama3-8b-8192\",\n temperature=0.420,\n max_tokens=1024,\n top_p=1,\n stop=None,\n stream=True,\n )\n\n generated_text = \"\"\n for chunk in stream:\n if chunk.choices[0].delta.content:\n generated_text += chunk.choices[0].delta.content\n st.session_state['script'] = generated_text\n return generated_text\n\ndef generate_joke(topic, characters, use_gpt4=False, image_data=None):\n if use_gpt4 and image_data:\n st.info(\"Generating script with GPT-4 Vision. This might take a few moments... API costs aren't free, you know! Consider following my [@didntdrinkwater](https://twitter.com/didntdrinkwater) and GitHub: [@younesbram](https://www.github.com/younesbram) as a form of compensation. ๐Ÿ˜‚ \")\n img_str = base64.b64encode(image_data).decode('utf-8')\n messages = [\n {\"role\": \"system\",\n \"content\": f\"You are an extremely funny and sarcastic comedian writer that knows Larry David and Jerry Seinfeld's writing styles, tasked with preserving {', '.join(characters)} jokes and delivering the same style punchlines in your short skits. You will respond in a script that includes {', '.join(characters)}.\"},\n {\"role\": \"user\",\n \"content\": f\"The topic is: {topic}. Only respond as previous instructions and be extremely funny, like genius comedy. Reply only with character names that I gave you followed by their script (make the responses deeply affected by the character's portrayed personality on their respective shows). Do not add any extra characters or descriptors or anything like sarcastically or laughs or whatever, ONLY the text to be voiced..\"},\n {\"role\": \"user\",\n \"content\": [\n {\"type\": \"text\", \"text\": \"Please use the following image as context.\"},\n {\"type\": \"image_url\", \"image_url\": {\"url\": f\"data:image/jpeg;base64,{img_str}\"}}\n ]}\n ]\n\n data = {\n \"model\": \"gpt-4o\",\n \"messages\": messages,\n \"temperature\": 0.66666666666666666666666420,\n }\n\n api_url = \"https://api.openai.com/v1/chat/completions\"\n headers = {\n \"Content-Type\": \"application/json\",\n \"Authorization\": f\"Bearer {openai_api_key}\"\n }\n response = requests.post(api_url, headers=headers, json=data)\n\n try:\n response_data = response.json()\n generated_text = response_data['choices'][0]['message']['content']\n st.session_state['script'] = generated_text\n st.write(\"Generated script with image context:\")\n st.write(generated_text)\n return generated_text\n except KeyError as e:\n st.error(f\"Failed to generate script: {response_data}\")\n return \"\"\n else:\n return generate_joke_with_groq(topic, characters)\n\ndef create_video_html(video_path_webm, video_path_mp4, width=None, height=None):\n width_attribute = f'width=\"{width}\"' if width else \"\"\n height_attribute = f'height=\"{height}\"' if height else \"\"\n return f\"\"\"\n \n
\n \n
\n \"\"\"\n\ndef load_image(url=None, path=None):\n if url:\n response = requests.get(url)\n img = Image.open(BytesIO(response.content))\n elif path:\n img = Image.open(path)\n return img\n\ndef generate_voice(character_name, text):\n voice_id = {\n \"jerry\": jerry_voice,\n \"kramer\": kramer_voice,\n \"george\": george_voice,\n \"elaine\": elaine_voice,\n \"newman\": newman_voice,\n \"larry_david\": larry_david_voice,\n \"leon\": leon_voice,\n \"jeff\": jeff_voice\n }.get(character_name.lower())\n\n if not voice_id:\n return None\n\n headers = {\n \"Accept\": \"audio/mpeg\",\n \"Content-Type\": \"application/json\",\n \"xi-api-key\": elevenlabs_api_key\n }\n data = {\n \"text\": text,\n \"model_id\": \"eleven_multilingual_v2\",\n \"voice_settings\": {\n \"stability\": 0.4,\n \"similarity_boost\": 0.7\n }\n }\n url = f\"https://api.elevenlabs.io/v1/text-to-speech/{voice_id}\"\n\n response = requests.post(url, json=data, headers=headers)\n if response.status_code == 200:\n return response.content\n else:\n st.error(f\"Failed to generate audio for {character_name}: {response.text}\")\n return None\n\ndef stitch_audio_segments(audio_segments):\n combined_audio = b\"\"\n for segment in audio_segments:\n combined_audio += segment\n with open(\"combined_audio.mp3\", \"wb\") as f:\n f.write(combined_audio)\n return \"combined_audio.mp3\"\n\ndef generate_audio_script(script):\n lines = script.split(\"\\n\")\n audio_segments = []\n\n st.info(\"API costs aren't free, you know! Consider following my [@didntdrinkwater](https://twitter.com/didntdrinkwater) and GitHub: [@younesbram](https://www.github.com/younesbram) as a form of compensation. ๐Ÿ˜‚\")\n progress_bar = st.progress(0)\n\n for i, line in enumerate(lines):\n st.write(f\"Processing line: {line}\")\n if \":\" in line:\n character, text = line.split(\":\", 1)\n st.write(f\"Generating voice for {character.strip()} with text: {text.strip()}\")\n audio_segment = generate_voice(character.strip(), text.strip())\n if audio_segment:\n audio_segments.append(audio_segment)\n else:\n st.write(f\"Failed to generate audio segment for {character.strip()}\")\n progress_bar.progress((i + 1) / len(lines))\n\n if audio_segments:\n audio_file_path = stitch_audio_segments(audio_segments)\n return audio_file_path\n return None\n\nst.title(\"AI Skit Generator\")\n\ntopic = st.text_input(\"Enter a topic:\")\nuploaded_image = st.file_uploader(\"Upload an image (optional - you can do only image or image + topic)\", type=[\"jpg\", \"jpeg\", \"png\"])\n\nseinfeld_characters = [\"jerry\", \"kramer\", \"george\", \"elaine\", \"newman\"]\ncurb_characters = [\"larry_david\", \"leon\", \"jeff\"]\ncharacters = {\n \"jerry\": {\n \"name\": \"Jerry\",\n \"videopath_webm\": \"https://raw.githubusercontent.com/younesbram/aicomedy/master/loadables/jerry.webm\",\n \"videopath_mp4\": \"https://raw.githubusercontent.com/younesbram/aicomedy/master/loadables/jerry.mp4\",\n \"selected\": False,\n },\n \"kramer\": {\n \"name\": \"Kramer\",\n \"videopath_webm\": \"https://raw.githubusercontent.com/younesbram/aicomedy/master/loadables/kramer.webm\",\n \"videopath_mp4\": \"https://raw.githubusercontent.com/younesbram/aicomedy/master/loadables/kramer.mp4\",\n \"laugh_video_webm\": \"https://raw.githubusercontent.com/younesbram/aicomedy/master/loadables/kramerlaugh.webm\",\n \"laugh_video_mp4\": \"https://raw.githubusercontent.com/younesbram/aicomedy/master/loadables/kramerlaugh.mp4\",\n \"selected\": False,\n },\n \"george\": {\n \"name\": \"George\",\n \"videopath_webm\": \"https://raw.githubusercontent.com/younesbram/aicomedy/master/loadables/george.webm\",\n \"videopath_mp4\": \"https://raw.githubusercontent.com/younesbram/aicomedy/master/loadables/george.mp4\",\n \"laugh_video_mp4\": \"https://raw.githubusercontent.com/younesbram/aicomedy/master/loadables/georgelaugh.mp4\",\n \"laugh_video_webm\": \"https://raw.githubusercontent.com/younesbram/aicomedy/master/loadables/georgelaugh.webm\",\n \"selected\": False,\n },\n \"larry_david\": {\n \"name\": \"Larry David\",\n \"videopath_webm\": \"https://raw.githubusercontent.com/younesbram/aicomedy/master/loadables/larry.webm\",\n \"videopath_mp4\": \"https://raw.githubusercontent.com/younesbram/aicomedy/master/loadables/larry.mp4\",\n \"laugh_video_mp4\": \"https://raw.githubusercontent.com/younesbram/aicomedy/master/loadables/larrylaugh.mp4\",\n \"laugh_video_webm\": \"https://raw.githubusercontent.com/younesbram/aicomedy/master/loadables/larrylaugh.webm\",\n \"selected\": False,\n },\n \"elaine\": {\n \"name\": \"Elaine\",\n \"videopath_webm\": \"https://raw.githubusercontent.com/younesbram/aicomedy/master/loadables/elaine.webm\",\n \"videopath_mp4\": \"https://raw.githubusercontent.com/younesbram/aicomedy/master/loadables/elaine.mp4\",\n \"selected\": False,\n },\n \"newman\": {\n \"name\": \"Newman\",\n \"videopath_webm\": \"https://raw.githubusercontent.com/younesbram/aicomedy/master/loadables/newman.webm\",\n \"videopath_mp4\": \"https://raw.githubusercontent.com/younesbram/aicomedy/master/loadables/newman.mp4\",\n \"selected\": False,\n },\n \"leon\": {\n \"name\": \"Leon\",\n \"videopath_webm\": \"https://raw.githubusercontent.com/younesbram/aicomedy/master/loadables/leon.webm\",\n \"videopath_mp4\": \"https://raw.githubusercontent.com/younesbram/aicomedy/master/loadables/leon.mp4\",\n \"selected\": False,\n },\n \"jeff\": {\n \"name\": \"Jeff\",\n \"videopath_webm\": \"https://raw.githubusercontent.com/younesbram/aicomedy/master/loadables/jeff.webm\",\n \"videopath_mp4\": \"https://raw.githubusercontent.com/younesbram/aicomedy/master/loadables/jeff.mp4\",\n \"selected\": False,\n },\n}\n\ncharacter_selection_container = st.container()\n\ncharacters_per_row = 4\n\nnum_rows = (len(characters) + characters_per_row - 1) // characters_per_row\n\nfor row in range(num_rows):\n row_container = character_selection_container.container()\n cols = row_container.columns(characters_per_row)\n\n for col in range(characters_per_row):\n idx = row * characters_per_row + col\n\n # If there are no more characters to display, break the loop\n if idx >= len(characters):\n break\n\n char_key, char_info = list(characters.items())[idx]\n\n video_height = 120 # Set the desired height in pixels\n with cols[col]:\n video_html = create_video_html(\n char_info[\"videopath_webm\"], char_info[\"videopath_mp4\"], height=video_height)\n st.markdown(video_html, unsafe_allow_html=True)\n char_info[\"selected\"] = st.checkbox(char_info[\"name\"])\n\nselected_characters = [char_info[\"name\"]\n for char_info in characters.values() if char_info[\"selected\"]]\nif st.button(\"Generate script\"):\n num_seinfeld_chars = sum(char_key in seinfeld_characters for char_key,\n char_info in characters.items() if char_info[\"selected\"])\n num_curb_chars = sum(char_key in curb_characters for char_key,\n char_info in characters.items() if char_info[\"selected\"])\n\n if (topic or uploaded_image) and len(selected_characters) > 1:\n\n # Determine which show's intro and outro to play based on the counts of selected characters\n if num_seinfeld_chars > num_curb_chars:\n intro_audio = open('sounds/introseinfeld.mp3', 'rb').read()\n outro_audio = open('sounds/outroseinfeld.mp3', 'rb').read()\n else:\n intro_audio = open('sounds/introcurb.mp3', 'rb').read()\n outro_audio = open('sounds/outrocurb.mp3', 'rb').read()\n\n # Store intro and outro audio in session state\n st.session_state['intro_audio'] = intro_audio\n st.session_state['outro_audio'] = outro_audio\n\n # Play the intro audio while the user waits\n st.audio(intro_audio, format=\"audio/mp3\")\n\n # Add a spinner with a message while generating the script\n with st.spinner(\"Generating script... This might take a few moments... might as well follow my twitter and github..\"):\n image_data = None\n use_gpt4 = False\n if uploaded_image:\n image_data = uploaded_image.read()\n use_gpt4 = True\n generated_script = generate_joke(topic, selected_characters, use_gpt4, image_data)\n\n st.session_state['script'] = generated_script\n st.write(generated_script)\n\nif st.session_state.get('script'):\n if st.button(\"Generate Audio\"):\n with st.spinner(\"Generating audio...\"):\n audio_file_path = generate_audio_script(st.session_state['script'])\n if audio_file_path:\n st.audio(audio_file_path, format=\"audio/mp3\")\n else:\n st.error(\"Failed to generate audio.\")\n\n st.info(\"Follow me on my Twitter: [@didntdrinkwater](https://twitter.com/didntdrinkwater) and GitHub: [@younesbram](https://www.github.com/younesbram)\")\n\n # Display the laugh videos after generating the audio\n laugh_videos_container = st.container()\n laugh_video_height = 166.67\n num_laugh_videos = 3\n laugh_videos_cols = laugh_videos_container.columns(num_laugh_videos)\n col_index = 0\n laugh_video_characters = [\"kramer\", \"george\", \"larry_david\"]\n for char_key in laugh_video_characters:\n char_info = characters[char_key]\n if \"laugh_video_webm\" in char_info and \"laugh_video_mp4\" in char_info:\n laugh_video_webm = char_info[\"laugh_video_webm\"]\n laugh_video_mp4 = char_info[\"laugh_video_mp4\"]\n\n with laugh_videos_cols[col_index]:\n laugh_video_html = create_video_html(\n laugh_video_webm, laugh_video_mp4, width=220, height=laugh_video_height)\n st.markdown(laugh_video_html, unsafe_allow_html=True)\n\n col_index += 1\n\nst.markdown(\n \"Follow me on my Twitter: [@didntdrinkwater](https://twitter.com/didntdrinkwater) and GitHub: [@younesbram](https://www.github.com/younesbram)\")\nif st.session_state.get('outro_audio'):\n st.audio(st.session_state['outro_audio'], format=\"audio/mp3\")\nelse:\n st.write(\"Please provide a topic or upload an image and select at least two characters. Not all voices are supported. Currently supported voices are: Jerry, Kramer, George, Elaine.\")\nammendments","shortMessageHtmlLink":"import os"}},{"before":"4947629ebb9f6997835984741beae379299df62e","after":"55e9f1b81fc7b4b322e894eb42277c902c56529a","ref":"refs/heads/master","pushedAt":"2024-05-24T20:10:01.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"younesbram","name":"Younes Brahimi","path":"/younesbram","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43382860?s=80&v=4"},"commit":{"message":"ammendments","shortMessageHtmlLink":"ammendments"}},{"before":"1bd11fdcd6e742dbc565cd85e3dacfc562fc97e3","after":"4947629ebb9f6997835984741beae379299df62e","ref":"refs/heads/master","pushedAt":"2024-05-24T20:07:52.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"younesbram","name":"Younes Brahimi","path":"/younesbram","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43382860?s=80&v=4"},"commit":{"message":"ammendments","shortMessageHtmlLink":"ammendments"}},{"before":"1092e2b21698a2ae7921738011478f5ec22003b2","after":"1bd11fdcd6e742dbc565cd85e3dacfc562fc97e3","ref":"refs/heads/master","pushedAt":"2024-05-24T20:02:42.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"younesbram","name":"Younes Brahimi","path":"/younesbram","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43382860?s=80&v=4"},"commit":{"message":"Added Dev Container Folder","shortMessageHtmlLink":"Added Dev Container Folder"}},{"before":"3c42da5888df6ad5e82ef487e64f191beef45e61","after":"1092e2b21698a2ae7921738011478f5ec22003b2","ref":"refs/heads/master","pushedAt":"2024-05-24T20:02:32.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"younesbram","name":"Younes Brahimi","path":"/younesbram","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43382860?s=80&v=4"},"commit":{"message":"Big updates","shortMessageHtmlLink":"Big updates"}},{"before":"642921213b2055744f881b197ae1b2d7c98cba5f","after":"3c42da5888df6ad5e82ef487e64f191beef45e61","ref":"refs/heads/master","pushedAt":"2023-03-19T22:49:59.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"younesbram","name":"Younes Brahimi","path":"/younesbram","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43382860?s=80&v=4"},"commit":{"message":"bugfix'","shortMessageHtmlLink":"bugfix'"}},{"before":"cd813b929e42221c2179756e0d33936fb40aea9a","after":"642921213b2055744f881b197ae1b2d7c98cba5f","ref":"refs/heads/master","pushedAt":"2023-03-19T22:47:49.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"younesbram","name":"Younes Brahimi","path":"/younesbram","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43382860?s=80&v=4"},"commit":{"message":"Test","shortMessageHtmlLink":"Test"}},{"before":"f9d01739fa6129661cf0b65026ad97045cdceb2b","after":"cd813b929e42221c2179756e0d33936fb40aea9a","ref":"refs/heads/master","pushedAt":"2023-03-19T21:55:14.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"younesbram","name":"Younes Brahimi","path":"/younesbram","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43382860?s=80&v=4"},"commit":{"message":"loading spinner","shortMessageHtmlLink":"loading spinner"}},{"before":"d1387846409cbf768c13937453d5149490c039a1","after":"f9d01739fa6129661cf0b65026ad97045cdceb2b","ref":"refs/heads/master","pushedAt":"2023-03-19T21:52:35.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"younesbram","name":"Younes Brahimi","path":"/younesbram","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43382860?s=80&v=4"},"commit":{"message":"Update requirements.tx","shortMessageHtmlLink":"Update requirements.tx"}},{"before":"cd813b929e42221c2179756e0d33936fb40aea9a","after":"d1387846409cbf768c13937453d5149490c039a1","ref":"refs/heads/master","pushedAt":"2023-03-19T21:51:11.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"younesbram","name":"Younes Brahimi","path":"/younesbram","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43382860?s=80&v=4"},"commit":{"message":"Adding more scripting","shortMessageHtmlLink":"Adding more scripting"}},{"before":"98a46b24adae675910124ab6dafd43e00fd18718","after":"cd813b929e42221c2179756e0d33936fb40aea9a","ref":"refs/heads/master","pushedAt":"2023-03-19T21:41:18.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"younesbram","name":"Younes Brahimi","path":"/younesbram","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43382860?s=80&v=4"},"commit":{"message":"loading spinner","shortMessageHtmlLink":"loading spinner"}},{"before":"ff85751b42ac073a312b8ef11a38d2980844afc7","after":"98a46b24adae675910124ab6dafd43e00fd18718","ref":"refs/heads/master","pushedAt":"2023-03-19T21:16:50.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"younesbram","name":"Younes Brahimi","path":"/younesbram","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43382860?s=80&v=4"},"commit":{"message":"Bugfix","shortMessageHtmlLink":"Bugfix"}},{"before":"e0aa2f148b3f88e64881933a85561173aa339a72","after":"ff85751b42ac073a312b8ef11a38d2980844afc7","ref":"refs/heads/master","pushedAt":"2023-03-19T21:12:37.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"younesbram","name":"Younes Brahimi","path":"/younesbram","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43382860?s=80&v=4"},"commit":{"message":"new emoji","shortMessageHtmlLink":"new emoji"}},{"before":"ca976c9eb1d8df3091f83abc50a67ceca7a2bd58","after":"e0aa2f148b3f88e64881933a85561173aa339a72","ref":"refs/heads/master","pushedAt":"2023-03-19T20:47:01.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"younesbram","name":"Younes Brahimi","path":"/younesbram","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43382860?s=80&v=4"},"commit":{"message":"set page config:","shortMessageHtmlLink":"set page config:"}},{"before":"42f24c04a475d24201fa81a8abc1c3e95b899ba6","after":"ca976c9eb1d8df3091f83abc50a67ceca7a2bd58","ref":"refs/heads/master","pushedAt":"2023-03-19T18:30:37.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"younesbram","name":"Younes Brahimi","path":"/younesbram","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43382860?s=80&v=4"},"commit":{"message":"reverting","shortMessageHtmlLink":"reverting"}},{"before":"5ed33c0cad785676a20ff364d8caddfef515c511","after":"42f24c04a475d24201fa81a8abc1c3e95b899ba6","ref":"refs/heads/master","pushedAt":"2023-03-19T18:30:09.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"younesbram","name":"Younes Brahimi","path":"/younesbram","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43382860?s=80&v=4"},"commit":{"message":"Fixing percentages","shortMessageHtmlLink":"Fixing percentages"}},{"before":"40a131f9f0198a1e9d5ba36c1543a709f3a98b6b","after":"5ed33c0cad785676a20ff364d8caddfef515c511","ref":"refs/heads/master","pushedAt":"2023-03-19T18:26:33.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"younesbram","name":"Younes Brahimi","path":"/younesbram","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43382860?s=80&v=4"},"commit":{"message":"Fixing percentages","shortMessageHtmlLink":"Fixing percentages"}},{"before":"f866236ce5e2949d5ad6e9abc3ef40fb85e41d58","after":"40a131f9f0198a1e9d5ba36c1543a709f3a98b6b","ref":"refs/heads/master","pushedAt":"2023-03-19T18:14:57.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"younesbram","name":"Younes Brahimi","path":"/younesbram","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43382860?s=80&v=4"},"commit":{"message":"Fixing percentages","shortMessageHtmlLink":"Fixing percentages"}},{"before":"b506d5843ad45388210adfc4875270fa93c22b30","after":"f866236ce5e2949d5ad6e9abc3ef40fb85e41d58","ref":"refs/heads/master","pushedAt":"2023-03-19T18:13:20.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"younesbram","name":"Younes Brahimi","path":"/younesbram","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43382860?s=80&v=4"},"commit":{"message":"Fixing percentages","shortMessageHtmlLink":"Fixing percentages"}},{"before":"9533ce975c9234d5675da05af613fd10eabf374c","after":"b506d5843ad45388210adfc4875270fa93c22b30","ref":"refs/heads/master","pushedAt":"2023-03-19T18:11:52.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"younesbram","name":"Younes Brahimi","path":"/younesbram","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43382860?s=80&v=4"},"commit":{"message":"Fixing percentages","shortMessageHtmlLink":"Fixing percentages"}},{"before":"99969c7c1c0acd2130f80c5c6b1efec94a8a2f02","after":"9533ce975c9234d5675da05af613fd10eabf374c","ref":"refs/heads/master","pushedAt":"2023-03-19T18:09:55.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"younesbram","name":"Younes Brahimi","path":"/younesbram","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43382860?s=80&v=4"},"commit":{"message":"Fixing percentages","shortMessageHtmlLink":"Fixing percentages"}},{"before":"b7788ebc489d3a3ba4e363bd3f71110c003e10e9","after":"99969c7c1c0acd2130f80c5c6b1efec94a8a2f02","ref":"refs/heads/master","pushedAt":"2023-03-19T08:10:20.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"younesbram","name":"Younes Brahimi","path":"/younesbram","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43382860?s=80&v=4"},"commit":{"message":"one more","shortMessageHtmlLink":"one more"}},{"before":"d41f81e790fddec5770b2e0266273ccd511a2302","after":"b7788ebc489d3a3ba4e363bd3f71110c003e10e9","ref":"refs/heads/master","pushedAt":"2023-03-19T08:06:31.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"younesbram","name":"Younes Brahimi","path":"/younesbram","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43382860?s=80&v=4"},"commit":{"message":"last try","shortMessageHtmlLink":"last try"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"Y3Vyc29yOnYyOpK7MjAyNC0wOC0zMFQyMjo1NTowOS4wMDAwMDBazwAAAASpGFgu","startCursor":"Y3Vyc29yOnYyOpK7MjAyNC0wOC0zMFQyMjo1NTowOS4wMDAwMDBazwAAAASpGFgu","endCursor":"Y3Vyc29yOnYyOpK7MjAyMy0wMy0xOVQwODowNjozMS4wMDAwMDBazwAAAAMGgBNd"}},"title":"Activity ยท younesbram/aicomedy"}